brotli-3.4.0/.cargo_vcs_info.json0000644000000001360000000000100123330ustar { "git": { "sha1": "c0c36218b2cbf7a24d23acd165fb18b9e9fb6242" }, "path_in_vcs": "" }brotli-3.4.0/.gitignore000064400000000000000000000000071046102023000131100ustar 00000000000000target brotli-3.4.0/.travis.yml000064400000000000000000000007631046102023000132420ustar 00000000000000language: rust rust: - nightly - stable - 1.12.0 os: - linux - osx script: - rustc --version | grep nightly && cargo test --features=simd || ( echo skip && rustc --version | grep -v nightly ) - cargo test --no-default-features - cargo test --no-default-features --features=std - cargo test --no-default-features --features=std --release - rustc --version | grep 1[.][89][.] || rustc --version | grep -v 1[.]2[789][.] | grep 1[.][12][0-9][.]||cargo build --features=validation brotli-3.4.0/Cargo.lock0000644000000061060000000000100103110ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "alloc-no-stdlib" version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ "alloc-no-stdlib", ] [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "brotli" version = "3.4.0" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", "brotli-decompressor", "sha2", ] [[package]] name = "brotli-decompressor" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cpufeatures" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", ] [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "libc" version = "0.2.148" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" brotli-3.4.0/Cargo.toml0000644000000040010000000000100103240ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] name = "brotli" version = "3.4.0" authors = [ "Daniel Reiter Horn ", "The Brotli Authors", ] autobins = false description = "A brotli compressor and decompressor that with an interface avoiding the rust stdlib. This makes it suitable for embedded devices and kernels. It is designed with a pluggable allocator so that the standard lib's allocator may be employed. The default build also includes a stdlib allocator and stream interface. Disable this with --features=no-stdlib. All included code is safe." homepage = "https://github.com/dropbox/rust-brotli" documentation = "https://docs.rs/brotli/" readme = "README.md" keywords = [ "brotli", "decompression", "lz77", "huffman", "nostd", ] license = "BSD-3-Clause/MIT" repository = "https://github.com/dropbox/rust-brotli" [profile.release] lto = true incremental = false [[bin]] name = "brotli" doc = false [[bin]] name = "catbrotli" doc = false [dependencies.alloc-no-stdlib] version = "2.0" [dependencies.alloc-stdlib] version = "~0.2" optional = true [dependencies.brotli-decompressor] version = "~2.5" default-features = false [dependencies.sha2] version = "~0.10" optional = true [features] benchmark = ["brotli-decompressor/benchmark"] default = [ "std", "ffi-api", ] disable-timer = ["brotli-decompressor/disable-timer"] external-literal-probability = [] ffi-api = [] pass-through-ffi-panics = [] seccomp = ["brotli-decompressor/seccomp"] std = [ "alloc-stdlib", "brotli-decompressor/std", ] validation = ["sha2"] vector_scratch_space = [] brotli-3.4.0/Cargo.toml.orig000064400000000000000000000031041046102023000140100ustar 00000000000000[package] name = "brotli" version = "3.4.0" authors = ["Daniel Reiter Horn ", "The Brotli Authors"] description = "A brotli compressor and decompressor that with an interface avoiding the rust stdlib. This makes it suitable for embedded devices and kernels. It is designed with a pluggable allocator so that the standard lib's allocator may be employed. The default build also includes a stdlib allocator and stream interface. Disable this with --features=no-stdlib. All included code is safe." license = "BSD-3-Clause/MIT" documentation = "https://docs.rs/brotli/" homepage = "https://github.com/dropbox/rust-brotli" repository = "https://github.com/dropbox/rust-brotli" keywords = ["brotli", "decompression", "lz77", "huffman", "nostd"] readme = "README.md" autobins = false [[bin]] doc = false name = "brotli" [[bin]] doc = false name = "catbrotli" [profile.release] lto=true incremental=false [dependencies] "alloc-no-stdlib" = {version="2.0"} "brotli-decompressor" = {version="~2.5", default-features=false} "alloc-stdlib" = {version="~0.2", optional=true} # Uncomment once this packed_simd "packed_simd_2" = {version="0.3", optional=true} "sha2" = {version="~0.10", optional=true} [features] default=["std", "ffi-api"] validation=["sha2"] seccomp = ["brotli-decompressor/seccomp"] std = ["alloc-stdlib", "brotli-decompressor/std"] external-literal-probability = [] disable-timer = ["brotli-decompressor/disable-timer"] benchmark = ["brotli-decompressor/benchmark"] vector_scratch_space = [] #simd = ["packed_simd_2/into_bits"] pass-through-ffi-panics = [] ffi-api = [] brotli-3.4.0/LICENSE000064400000000000000000000027131046102023000121330ustar 00000000000000Copyright (c) 2016 Dropbox, 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: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. Neither the name of the copyright holder 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 HOLDER 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. brotli-3.4.0/README.md000064400000000000000000000170131046102023000124040ustar 00000000000000# rust-brotli [![crates.io](https://img.shields.io/crates/v/brotli.svg)](https://crates.io/crates/brotli) [![Build Status](https://travis-ci.org/dropbox/rust-brotli.svg?branch=master)](https://travis-ci.org/dropbox/rust-brotli) ## What's new in 3.4 Brotli decompressor's reader and writer has better behavior when operating upon brotli streams with extra bits at the end. Optional features like stdsimd are now tested or disabled for now. ## What's new in 3.2 * into_inner conversions for both Reader and Writer classes ## What's new in 3.0 * A fully compatible FFI for drop-in compatibiltiy with the https://github.com/google/brotli binaries * custom allocators fully supported * Multithreaded compression so multiple threads can operate in unison on a single file * Concatenatability mode to add the feature requested in https://github.com/google/brotli/issues/628 * binary tool catbrotli can accomplish this if the first file was specified with -apendable and the second with -catable * validation mode where a file is double-checked to be able to be decompressed with the same settings; useful for benchmarking or fuzzing * Magic Number: where the brotli file can have a useful header with a few magic bytes, concatability info and a final output size for pre-allocating memory ## What's new in 2.5 * In 2.5 The callback also passes down an allocator to make new StaticCommands and PDFs and 256 bit floating point vectors. * In 2.4 The callback with the compression intermediate representation now passes a full metablock at a time. Also these items are mutable in case futher optimization is desired ## What's new in 2.3 * Flush now produces output instead of calling finish on the stream. This allows you to use the writer abstraction to get immediate output without having to resort to the CompressStream internal abstraction ## Project Requirements Direct no-stdlib port of the C brotli compressor to Rust no dependency on the Rust stdlib: this library would be ideal for decompressing within a rust kernel among other things. This is useful to see how C and Rust compare in an apples-to-apples comparison where the same algorithms and data structures and optimizations are employed. ## Compression Usage Rust brotli currently supports compression levels 0 - 11 They should be bitwise identical to the brotli C compression engine at compression levels 0-9 Recommended lg_window_size is between 20 and 22 ### With the io::Read abstraction ```rust let mut input = brotli::CompressorReader::new(&mut io::stdin(), 4096 /* buffer size */, quality as u32, lg_window_size as u32); ``` then you can simply read input as you would any other io::Read class ### With the io::Write abstraction ```rust let mut writer = brotli::Compressor::new(&mut io::stdout(), 4096 /* buffer size */, quality as u32, lg_window_size as u32); ``` There are also methods to build Compressor Readers or Writers using the with_params static function eg: ```rust let params = BrotliEncoderParams::default(); // modify params to fit the application needs let mut writer = brotli::Compressor::with_params(&mut io::stdout(), 4096 /* buffer size */, params); ``` or for the reader ```rust let params = BrotliEncoderParams::default(); // modify params to fit the application needs let mut writer = brotli::CompressorReader::with_params(&mut io::stdin(), 4096 /* buffer size */, params); ``` ### With the Stream Copy abstraction ```rust match brotli::BrotliCompress(&mut io::stdin(), &mut io::stdout(), &brotli_encoder_params) { Ok(_) => {}, Err(e) => panic!("Error {:?}", e), } ``` ## Decompression Usage ### With the io::Read abstraction ```rust let mut input = brotli::Decompressor::new(&mut io::stdin(), 4096 /* buffer size */); ``` then you can simply read input as you would any other io::Read class ### With the io::Write abstraction ```rust let mut writer = brotli::DecompressorWriter::new(&mut io::stdout(), 4096 /* buffer size */); ``` ### With the Stream Copy abstraction ```rust match brotli::BrotliDecompress(&mut io::stdin(), &mut io::stdout()) { Ok(_) => {}, Err(e) => panic!("Error {:?}", e), } ``` ### With manual memory management There are 3 steps to using brotli without stdlib 1. setup the memory manager 2. setup the BrotliState 3. in a loop, call BrotliDecompressStream in Detail ```rust // at global scope declare a MemPool type -- in this case we'll choose the heap to // avoid unsafe code, and avoid restrictions of the stack size declare_stack_allocator_struct!(MemPool, heap); // at local scope, make a heap allocated buffers to hold uint8's uint32's and huffman codes let mut u8_buffer = define_allocator_memory_pool!(4096, u8, [0; 32 * 1024 * 1024], heap); let mut u32_buffer = define_allocator_memory_pool!(4096, u32, [0; 1024 * 1024], heap); let mut hc_buffer = define_allocator_memory_pool!(4096, HuffmanCode, [0; 4 * 1024 * 1024], heap); let heap_u8_allocator = HeapPrealloc::::new_allocator(4096, &mut u8_buffer, bzero); let heap_u32_allocator = HeapPrealloc::::new_allocator(4096, &mut u32_buffer, bzero); let heap_hc_allocator = HeapPrealloc::::new_allocator(4096, &mut hc_buffer, bzero); // At this point no more syscalls are going to be needed since everything can come from the allocators. // Feel free to activate SECCOMP jailing or other mechanisms to secure your application if you wish. // Now it's possible to setup the decompressor state let mut brotli_state = BrotliState::new(heap_u8_allocator, heap_u32_allocator, heap_hc_allocator); // at this point the decompressor simply needs an input and output buffer and the ability to track // the available data left in each buffer loop { result = BrotliDecompressStream(&mut available_in, &mut input_offset, &input.slice(), &mut available_out, &mut output_offset, &mut output.slice_mut(), &mut written, &mut brotli_state); // just end the decompression if result is BrotliResult::ResultSuccess or BrotliResult::ResultFailure } ``` This interface is the same interface that the C brotli decompressor uses Also feel free to use custom allocators that invoke Box directly. This example illustrates a mechanism to avoid subsequent syscalls after the initial allocation ## Using the C interface rust-brotli is a drop-in replacement for the official https://github.com/google/brotli C implementation. That means you can use it from any place that supports that library. To build rust-brotli in this manner enter the c subdirectory and run make there cd c && make this should build c/target/release/libbrotli.so and should build the vanilla command line tool in C for compressing and decompressing any brotli file. the libbrotli.so in c/target/release should be able to replace any other libbrotli.so file, but with all the advantages of using safe rust (except in the FFI bindings) The code also allows a wider range of options, including forcing the prediction mode (eg UTF8 vs signed vs MSB vs LSB) and changing the weight of the literal cost from 540 to other values. Additionally the CATABLE and APPENDABLE options are exposed and allow concatenation of files created in this manner. Specifically CATABLE files can be concatenated in any order using the catbrotli tool and APPENDABLE files can be the first file in a sequence of catable files... eg you can combine appendable.br catable1.br catable2.br catable3.br or simply catable0.br catable1.br catable2.br catable3.br brotli-3.4.0/appveyor.yml000064400000000000000000000023741046102023000135210ustar 00000000000000environment: RUST_VERSION: stable CRATE_NAME: brotli matrix: - TARGET: x86_64-pc-windows-gnu BITS: 64 MSYS2: 1 - TARGET: x86_64-pc-windows-msvc BITS: 64 - TARGET: i686-pc-windows-gnu BITS: 32 MSYS2: 1 - TARGET: i686-pc-windows-msvc BITS: 32 install: - curl -sSf -o rustup-init.exe https://win.rustup.rs/ - rustup-init.exe -y --default-host %TARGET% --default-toolchain %RUST_VERSION% - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin - if defined MSYS2 set PATH=C:\msys64\mingw%BITS%\bin;%PATH% - rustc -V - cargo -V build: false test_script: - cargo test --verbose - set RUSTFLAGS=-C panic=abort - set CARGO_PROFILE_RELEASE=panic=abort - cargo build --verbose --release --features=validation before_deploy: - set CARGO_PROFILE_RELEASE=panic=abort - set RUSTFLAGS=-C panic=abort - cargo build --verbose --release --features=validation - ps: ci\before_deploy.ps1 deploy: artifact: /.*\.zip/ auth_token: secure: jKP3OCU0ukoMKenkxB/lhG9/tOXppd8ZWxCm9dS1VLzbkUoIUKt3+18pG3S54VdL descriprion: 'windows rust-brotli build' on: RUST_VERSION: stable provider: GitHub cache: - C:\Users\appveyor\.cargo\registry - target branches: only: # Release tags - /^v\d+\.\d+\.\d+.*$/ - master brotli-3.4.0/ci/before_deploy.ps1000064400000000000000000000010001046102023000147500ustar 00000000000000# This script takes care of packaging the build artifacts that will go in the # release zipfile $SRC_DIR = $PWD.Path $STAGE = [System.Guid]::NewGuid().ToString() Set-Location $ENV:Temp New-Item -Type Directory -Name $STAGE Set-Location $STAGE $ZIP = "$SRC_DIR\$($Env:CRATE_NAME)-$($Env:APPVEYOR_REPO_TAG_NAME)-$($Env:TARGET).zip" Copy-Item "$SRC_DIR\target\release\brotli.exe" '.\' 7z a "$ZIP" * Push-AppveyorArtifact "$ZIP" Remove-Item *.* -Force Set-Location .. Remove-Item $STAGE Set-Location $SRC_DIR brotli-3.4.0/ci/before_deploy.sh000064400000000000000000000012361046102023000146720ustar 00000000000000# This script takes care of building your crate and packaging it for release set -ex main() { local src=$(pwd) \ stage= case $TRAVIS_OS_NAME in linux) stage=$(mktemp -d) ;; osx) stage=$(mktemp -d -t tmp) ;; esac test -f Cargo.lock || cargo generate-lockfile # TODO Update this to build the artifacts that matter to you cross rustc --release --features=validation # TODO Update this to package the right artifacts cp target/$TARGET/brotli $stage/ cd $stage tar czf $src/$CRATE_NAME-$TRAVIS_TAG-$TARGET.tar.gz * cd $src rm -rf $stage } main brotli-3.4.0/ci/install.sh000064400000000000000000000024741046102023000135270ustar 00000000000000set -ex main() { local target= if [ $TRAVIS_OS_NAME = linux ]; then target=x86_64-unknown-linux-musl sort=sort else target=x86_64-apple-darwin sort=gsort # for `sort --sort-version`, from brew's coreutils. fi # Builds for iOS are done on OSX, but require the specific target to be # installed. case $TARGET in aarch64-apple-ios) rustup target install aarch64-apple-ios ;; armv7-apple-ios) rustup target install armv7-apple-ios ;; armv7s-apple-ios) rustup target install armv7s-apple-ios ;; i386-apple-ios) rustup target install i386-apple-ios ;; x86_64-apple-ios) rustup target install x86_64-apple-ios ;; esac # This fetches latest stable release local tag=$(git ls-remote --tags --refs --exit-code https://github.com/japaric/cross \ | cut -d/ -f3 \ | grep -E '^v[0.1.0-9.]+$' \ | $sort --version-sort \ | tail -n1) curl -LSfs https://japaric.github.io/trust/install.sh | \ sh -s -- \ --force \ --git japaric/cross \ --tag $tag \ --target $target } main brotli-3.4.0/ci/script.sh000064400000000000000000000007541046102023000133640ustar 00000000000000# This script takes care of testing your crate set -ex # TODO This is the "test phase", tweak it as you see fit main() { cross build --target $TARGET cross build --target $TARGET --release if [ ! -z $DISABLE_TESTS ]; then return fi cross test --target $TARGET cross test --target $TARGET --release cross test --target $TARGET --release --features=no-stdlib } # we don't run the "test phase" when doing deploys if [ -z $TRAVIS_TAG ]; then main fi brotli-3.4.0/corrosion/backward_references_hq.rs000064400000000000000000002737571046102023000202020ustar 00000000000000extern { fn BrotliAllocate( m : *mut MemoryManager, n : usize ) -> *mut std::os::raw::c_void; fn BrotliEstimateBitCostsForLiterals( pos : usize, len : usize, mask : usize, data : *const u8, cost : *mut f32 ); fn BrotliFindAllStaticDictionaryMatches( dictionary : *const BrotliEncoderDictionary, data : *const u8, min_length : usize, max_length : usize, matches : *mut u32 ) -> i32; fn BrotliFree( m : *mut MemoryManager, p : *mut std::os::raw::c_void ); fn log2(__x : f64) -> f64; fn memcpy( __dest : *mut std::os::raw::c_void, __src : *const std::os::raw::c_void, __n : usize ) -> *mut std::os::raw::c_void; fn memset( __s : *mut std::os::raw::c_void, __c : i32, __n : usize ) -> *mut std::os::raw::c_void; } static mut kLog2Table : *const f32 = 0.0000000000000000f32 as (*const f32); static kDictNumBits : i32 = 15i32; static kDictHashMul32 : u32 = 0x1e35a7bdi32 as (u32); static mut kStaticDictionaryBuckets : *const u16 = 1i32 as (*const u16); #[derive(Clone, Copy)] #[repr(C)] pub struct DictWord { pub len : u8, pub transform : u8, pub idx : u16, } static mut kStaticDictionaryWords : *const DictWord = 0i32 as (*const DictWord); static mut kInsBase : *mut u32 = 0i32 as (*mut u32); static mut kInsExtra : *mut u32 = 0i32 as (*mut u32); static mut kCopyBase : *mut u32 = 2i32 as (*mut u32); static mut kCopyExtra : *mut u32 = 0i32 as (*mut u32); #[no_mangle] pub unsafe extern fn ctzll(mut x : usize) -> usize { let mut count : u8 = 0i32 as (u8); while x & 0i32 as (usize) != 0 { count = (count as (i32) + 1i32) as (u8); x = x >> 1i32; } count as (usize) } static kInvalidMatch : u32 = 0xfffffffi32 as (u32); static kCutoffTransformsCount : u32 = 10i32 as (u32); static kCutoffTransforms : usize = 0x71b520ai32 as (usize) << 32i32 | 0xda2d3200u32 as (usize); static kHashMul32 : u32 = 0x1e35a7bdi32 as (u32); static kHashMul64 : usize = 0x1e35a7bdi32 as (usize) << 32i32 | 0x1e35a7bdi32 as (usize); static kHashMul64Long : usize = 0x1fe35a7bu32 as (usize) << 32i32 | 0xd3579bd3u32 as (usize); static kInfinity : f32 = 1.7e38f32; static mut kDistanceCacheIndex : *const u32 = 0i32 as (*const u32); static mut kDistanceCacheOffset : *const i32 = 0i32 as (*const i32); #[derive(Clone, Copy)] #[repr(C)] pub struct Struct1 { pub cost : f32, pub next : u32, pub shortcut : u32, } #[derive(Clone, Copy)] #[repr(C)] pub struct ZopfliNode { pub length : u32, pub distance : u32, pub dcode_insert_length : u32, pub u : Struct1, } #[no_mangle] pub unsafe extern fn BrotliInitZopfliNodes( mut array : *mut ZopfliNode, mut length : usize ) { let mut stub : ZopfliNode; let mut i : usize; stub.length = 1i32 as (u32); stub.distance = 0i32 as (u32); stub.dcode_insert_length = 0i32 as (u32); stub.u.cost = kInfinity; i = 0i32 as (usize); while i < length { *array.offset(i as (isize)) = stub; i = i.wrapping_add(1 as (usize)); } } #[derive(Clone, Copy)] #[repr(i32)] pub enum BrotliEncoderMode { BROTLI_MODE_GENERIC = 0i32, BROTLI_MODE_TEXT = 1i32, BROTLI_MODE_FONT = 2i32, } #[derive(Clone, Copy)] #[repr(C)] pub struct BrotliHasherParams { pub type_ : i32, pub bucket_bits : i32, pub block_bits : i32, pub hash_len : i32, pub num_last_distances_to_check : i32, } #[derive(Clone, Copy)] #[repr(C)] pub struct BrotliDistanceParams { pub distance_postfix_bits : u32, pub num_direct_distance_codes : u32, pub alphabet_size : u32, pub max_distance : usize, } #[derive(Clone, Copy)] #[repr(C)] pub struct BrotliDictionary { pub size_bits_by_length : *mut u8, pub offsets_by_length : *mut u32, pub data_size : usize, pub data : *const u8, } #[derive(Clone, Copy)] #[repr(C)] pub struct BrotliEncoderDictionary { pub words : *const BrotliDictionary, pub cutoffTransformsCount : u32, pub cutoffTransforms : usize, pub hash_table : *const u16, pub buckets : *const u16, pub dict_words : *const DictWord, } #[derive(Clone, Copy)] #[repr(C)] pub struct BrotliEncoderParams { pub mode : BrotliEncoderMode, pub quality : i32, pub lgwin : i32, pub lgblock : i32, pub size_hint : usize, pub disable_literal_context_modeling : i32, pub large_window : i32, pub hasher : BrotliHasherParams, pub dist : BrotliDistanceParams, pub dictionary : BrotliEncoderDictionary, } #[derive(Clone, Copy)] #[repr(C)] pub struct Command { pub insert_len_ : u32, pub copy_len_ : u32, pub dist_extra_ : u32, pub cmd_prefix_ : u16, pub dist_prefix_ : u16, } unsafe extern fn ZopfliNodeCopyLength( mut self : *const ZopfliNode ) -> u32 { (*self).length & 0x1ffffffi32 as (u32) } unsafe extern fn ZopfliNodeCopyDistance( mut self : *const ZopfliNode ) -> u32 { (*self).distance } unsafe extern fn ZopfliNodeLengthCode( mut self : *const ZopfliNode ) -> u32 { let modifier : u32 = (*self).length >> 25i32; ZopfliNodeCopyLength(self).wrapping_add(9u32).wrapping_sub( modifier ) } unsafe extern fn brotli_min_size_t( mut a : usize, mut b : usize ) -> usize { if a < b { a } else { b } } unsafe extern fn ZopfliNodeDistanceCode( mut self : *const ZopfliNode ) -> u32 { let short_code : u32 = (*self).dcode_insert_length >> 27i32; if short_code == 0i32 as (u32) { ZopfliNodeCopyDistance(self).wrapping_add( 16i32 as (u32) ).wrapping_sub( 1i32 as (u32) ) } else { short_code.wrapping_sub(1i32 as (u32)) } } unsafe extern fn Log2FloorNonZero(mut n : usize) -> u32 { let mut result : u32 = 0i32 as (u32); while { n = n >> 1i32; n } != 0 { result = result.wrapping_add(1 as (u32)); } result } unsafe extern fn PrefixEncodeCopyDistance( mut distance_code : usize, mut num_direct_codes : usize, mut postfix_bits : usize, mut code : *mut u16, mut extra_bits : *mut u32 ) { if distance_code < (16i32 as (usize)).wrapping_add( num_direct_codes ) { *code = distance_code as (u16); *extra_bits = 0i32 as (u32); } else { let mut dist : usize = (1i32 as (usize) << postfix_bits.wrapping_add( 2u32 as (usize) )).wrapping_add( distance_code.wrapping_sub(16i32 as (usize)).wrapping_sub( num_direct_codes ) ); let mut bucket : usize = Log2FloorNonZero(dist).wrapping_sub(1i32 as (u32)) as (usize); let mut postfix_mask : usize = (1u32 << postfix_bits).wrapping_sub(1i32 as (u32)) as (usize); let mut postfix : usize = dist & postfix_mask; let mut prefix : usize = dist >> bucket & 1i32 as (usize); let mut offset : usize = (2i32 as (usize)).wrapping_add(prefix) << bucket; let mut nbits : usize = bucket.wrapping_sub(postfix_bits); *code = (nbits << 10i32 | (16i32 as (usize)).wrapping_add( num_direct_codes ).wrapping_add( (2i32 as (usize)).wrapping_mul( nbits.wrapping_sub(1i32 as (usize)) ).wrapping_add( prefix ) << postfix_bits ).wrapping_add( postfix )) as (u16); *extra_bits = (dist.wrapping_sub(offset) >> postfix_bits) as (u32); } } unsafe extern fn GetInsertLengthCode( mut insertlen : usize ) -> u16 { if insertlen < 6i32 as (usize) { insertlen as (u16) } else if insertlen < 130i32 as (usize) { let mut nbits : u32 = Log2FloorNonZero( insertlen.wrapping_sub(2i32 as (usize)) ).wrapping_sub( 1u32 ); ((nbits << 1i32) as (usize)).wrapping_add( insertlen.wrapping_sub(2i32 as (usize)) >> nbits ).wrapping_add( 2i32 as (usize) ) as (u16) } else if insertlen < 2114i32 as (usize) { Log2FloorNonZero( insertlen.wrapping_sub(66i32 as (usize)) ).wrapping_add( 10i32 as (u32) ) as (u16) } else if insertlen < 6210i32 as (usize) { 21u32 as (u16) } else if insertlen < 22594i32 as (usize) { 22u32 as (u16) } else { 23u32 as (u16) } } unsafe extern fn GetCopyLengthCode(mut copylen : usize) -> u16 { if copylen < 10i32 as (usize) { copylen.wrapping_sub(2i32 as (usize)) as (u16) } else if copylen < 134i32 as (usize) { let mut nbits : u32 = Log2FloorNonZero( copylen.wrapping_sub(6i32 as (usize)) ).wrapping_sub( 1u32 ); ((nbits << 1i32) as (usize)).wrapping_add( copylen.wrapping_sub(6i32 as (usize)) >> nbits ).wrapping_add( 4i32 as (usize) ) as (u16) } else if copylen < 2118i32 as (usize) { Log2FloorNonZero( copylen.wrapping_sub(70i32 as (usize)) ).wrapping_add( 12i32 as (u32) ) as (u16) } else { 23u32 as (u16) } } unsafe extern fn CombineLengthCodes( mut inscode : u16, mut copycode : u16, mut use_last_distance : i32 ) -> u16 { let mut bits64 : u16 = (copycode as (u32) & 0x7u32 | (inscode as (u32) & 0x7u32) << 3i32) as (u16); if use_last_distance != 0 && (inscode as (i32) < 8i32) && (copycode as (i32) < 16i32) { if copycode as (i32) < 8i32 { bits64 as (i32) } else { bits64 as (i32) | 64i32 } as (u16) } else { let mut offset : i32 = 2i32 * ((copycode as (i32) >> 3i32) + 3i32 * (inscode as (i32) >> 3i32)); offset = (offset << 5i32) + 0x40i32 + (0x520d40i32 >> offset & 0xc0i32); (offset as (u16) as (i32) | bits64 as (i32)) as (u16) } } unsafe extern fn GetLengthCode( mut insertlen : usize, mut copylen : usize, mut use_last_distance : i32, mut code : *mut u16 ) { let mut inscode : u16 = GetInsertLengthCode(insertlen); let mut copycode : u16 = GetCopyLengthCode(copylen); *code = CombineLengthCodes(inscode,copycode,use_last_distance); } unsafe extern fn InitCommand( mut self : *mut Command, mut dist : *const BrotliDistanceParams, mut insertlen : usize, mut copylen : usize, mut copylen_code_delta : i32, mut distance_code : usize ) { let mut delta : u32 = copylen_code_delta as (i8) as (u8) as (u32); (*self).insert_len_ = insertlen as (u32); (*self).copy_len_ = (copylen | (delta << 25i32) as (usize)) as (u32); PrefixEncodeCopyDistance( distance_code, (*dist).num_direct_distance_codes as (usize), (*dist).distance_postfix_bits as (usize), &mut (*self).dist_prefix_ as (*mut u16), &mut (*self).dist_extra_ as (*mut u32) ); GetLengthCode( insertlen, (copylen as (i32) + copylen_code_delta) as (usize), if !!((*self).dist_prefix_ as (i32) & 0x3ffi32 == 0i32) { 1i32 } else { 0i32 }, &mut (*self).cmd_prefix_ as (*mut u16) ); } #[no_mangle] pub unsafe extern fn BrotliZopfliCreateCommands( num_bytes : usize, block_start : usize, max_backward_limit : usize, mut nodes : *const ZopfliNode, mut dist_cache : *mut i32, mut last_insert_len : *mut usize, mut params : *const BrotliEncoderParams, mut commands : *mut Command, mut num_literals : *mut usize ) { let mut pos : usize = 0i32 as (usize); let mut offset : u32 = (*nodes.offset(0i32 as (isize))).u.next; let mut i : usize; let mut gap : usize = 0i32 as (usize); i = 0i32 as (usize); while offset != !(0i32 as (u32)) { { let mut next : *const ZopfliNode = &*nodes.offset( pos.wrapping_add(offset as (usize)) as (isize) ) as (*const ZopfliNode); let mut copy_length : usize = ZopfliNodeCopyLength(next) as (usize); let mut insert_length : usize = ((*next).dcode_insert_length & 0x7ffffffi32 as (u32)) as (usize); pos = pos.wrapping_add(insert_length); offset = (*next).u.next; if i == 0i32 as (usize) { insert_length = insert_length.wrapping_add(*last_insert_len); *last_insert_len = 0i32 as (usize); } { let mut distance : usize = ZopfliNodeCopyDistance(next) as (usize); let mut len_code : usize = ZopfliNodeLengthCode(next) as (usize); let mut max_distance : usize = brotli_min_size_t( block_start.wrapping_add(pos), max_backward_limit ); let mut is_dictionary : i32 = if !!(distance > max_distance.wrapping_add(gap)) { 1i32 } else { 0i32 }; let mut dist_code : usize = ZopfliNodeDistanceCode(next) as (usize); InitCommand( &mut *commands.offset(i as (isize)) as (*mut Command), &(*params).dist as (*const BrotliDistanceParams), insert_length, copy_length, len_code as (i32) - copy_length as (i32), dist_code ); if is_dictionary == 0 && (dist_code > 0i32 as (usize)) { *dist_cache.offset(3i32 as (isize)) = *dist_cache.offset( 2i32 as (isize) ); *dist_cache.offset(2i32 as (isize)) = *dist_cache.offset( 1i32 as (isize) ); *dist_cache.offset(1i32 as (isize)) = *dist_cache.offset( 0i32 as (isize) ); *dist_cache.offset(0i32 as (isize)) = distance as (i32); } } *num_literals = (*num_literals).wrapping_add(insert_length); pos = pos.wrapping_add(copy_length); } i = i.wrapping_add(1 as (usize)); } *last_insert_len = (*last_insert_len).wrapping_add( num_bytes.wrapping_sub(pos) ); } #[derive(Clone, Copy)] #[repr(C)] pub struct MemoryManager { pub alloc_func : unsafe extern fn(*mut std::os::raw::c_void, usize) -> *mut std::os::raw::c_void, pub free_func : unsafe extern fn(*mut std::os::raw::c_void, *mut std::os::raw::c_void), pub opaque : *mut std::os::raw::c_void, } unsafe extern fn MaxZopfliLen( mut params : *const BrotliEncoderParams ) -> usize { (if (*params).quality <= 10i32 { 150i32 } else { 325i32 }) as (usize) } #[derive(Clone, Copy)] #[repr(C)] pub struct ZopfliCostModel { pub cost_cmd_ : *mut f32, pub cost_dist_ : *mut f32, pub distance_histogram_size : u32, pub literal_costs_ : *mut f32, pub min_cost_cmd_ : f32, pub num_bytes_ : usize, } #[derive(Clone, Copy)] #[repr(C)] pub struct PosData { pub pos : usize, pub distance_cache : *mut i32, pub costdiff : f32, pub cost : f32, } #[derive(Clone, Copy)] #[repr(C)] pub struct StartPosQueue { pub q_ : *mut PosData, pub idx_ : usize, } #[derive(Clone, Copy)] #[repr(C)] pub struct BackwardMatch { pub distance : u32, pub length_and_code : u32, } unsafe extern fn StoreLookaheadH10() -> usize { 128i32 as (usize) } unsafe extern fn InitZopfliCostModel( mut m : *mut MemoryManager, mut self : *mut ZopfliCostModel, mut dist : *const BrotliDistanceParams, mut num_bytes : usize ) { let mut distance_histogram_size : u32 = (*dist).alphabet_size; if distance_histogram_size > 544i32 as (u32) { distance_histogram_size = 544i32 as (u32); } (*self).num_bytes_ = num_bytes; (*self).literal_costs_ = if num_bytes.wrapping_add( 2i32 as (usize) ) > 0i32 as (usize) { BrotliAllocate( m, num_bytes.wrapping_add(2i32 as (usize)).wrapping_mul( std::mem::size_of::() ) ) as (*mut f32) } else { 0i32 as (*mut std::os::raw::c_void) as (*mut f32) }; (*self).cost_dist_ = if (*dist).alphabet_size > 0i32 as (u32) { BrotliAllocate( m, ((*dist).alphabet_size as (usize)).wrapping_mul( std::mem::size_of::() ) ) as (*mut f32) } else { 0i32 as (*mut std::os::raw::c_void) as (*mut f32) }; (*self).distance_histogram_size = distance_histogram_size; if !(0i32 == 0) { } } unsafe extern fn FastLog2(mut v : usize) -> f64 { if v < std::mem::size_of::<*const f32>().wrapping_div( std::mem::size_of::() ) { return *kLog2Table.offset(v as (isize)) as (f64); } log2(v as (f64)) } unsafe extern fn ZopfliCostModelSetFromLiteralCosts( mut self : *mut ZopfliCostModel, mut position : usize, mut ringbuffer : *const u8, mut ringbuffer_mask : usize ) { let mut literal_costs : *mut f32 = (*self).literal_costs_; let mut literal_carry : f32 = 0.0f64 as (f32); let mut cost_dist : *mut f32 = (*self).cost_dist_; let mut cost_cmd : *mut f32 = (*self).cost_cmd_; let mut num_bytes : usize = (*self).num_bytes_; let mut i : usize; BrotliEstimateBitCostsForLiterals( position, num_bytes, ringbuffer_mask, ringbuffer, &mut *literal_costs.offset(1i32 as (isize)) as (*mut f32) ); *literal_costs.offset(0i32 as (isize)) = 0.0f64 as (f32); i = 0i32 as (usize); while i < num_bytes { { literal_carry = literal_carry + *literal_costs.offset( i.wrapping_add(1i32 as (usize)) as (isize) ); *literal_costs.offset( i.wrapping_add(1i32 as (usize)) as (isize) ) = *literal_costs.offset(i as (isize)) + literal_carry; literal_carry = literal_carry - (*literal_costs.offset( i.wrapping_add(1i32 as (usize)) as (isize) ) - *literal_costs.offset(i as (isize))); } i = i.wrapping_add(1 as (usize)); } i = 0i32 as (usize); while i < 704i32 as (usize) { { *cost_cmd.offset(i as (isize)) = FastLog2( (11i32 as (u32)).wrapping_add( i as (u32) ) as (usize) ) as (f32); } i = i.wrapping_add(1 as (usize)); } i = 0i32 as (usize); while i < (*self).distance_histogram_size as (usize) { { *cost_dist.offset(i as (isize)) = FastLog2( (20i32 as (u32)).wrapping_add( i as (u32) ) as (usize) ) as (f32); } i = i.wrapping_add(1 as (usize)); } (*self).min_cost_cmd_ = FastLog2(11i32 as (usize)) as (f32); } unsafe extern fn InitStartPosQueue(mut self : *mut StartPosQueue) { (*self).idx_ = 0i32 as (usize); } unsafe extern fn BrotliUnalignedRead64( mut p : *const std::os::raw::c_void ) -> usize { *(p as (*const usize)) } unsafe extern fn FindMatchLengthWithLimit( mut s1 : *const u8, mut s2 : *const u8, mut limit : usize ) -> usize { let mut matched : usize = 0i32 as (usize); let mut limit2 : usize = (limit >> 3i32).wrapping_add(1i32 as (usize)); while { limit2 = limit2.wrapping_sub(1 as (usize)); limit2 } != 0 { if BrotliUnalignedRead64( s2 as (*const std::os::raw::c_void) ) == BrotliUnalignedRead64( s1.offset(matched as (isize)) as (*const std::os::raw::c_void) ) { s2 = s2.offset(8i32 as (isize)); matched = matched.wrapping_add(8i32 as (usize)); } else { let mut x : usize = BrotliUnalignedRead64( s2 as (*const std::os::raw::c_void) ) ^ BrotliUnalignedRead64( s1.offset(matched as (isize)) as (*const std::os::raw::c_void) ); let mut matching_bits : usize = ctzll(x) as (usize); matched = matched.wrapping_add(matching_bits >> 3i32); return matched; } } limit = (limit & 7i32 as (usize)).wrapping_add(1i32 as (usize)); while { limit = limit.wrapping_sub(1 as (usize)); limit } != 0 { if *s1.offset(matched as (isize)) as (i32) == *s2 as (i32) { s2 = s2.offset(1 as (isize)); matched = matched.wrapping_add(1 as (usize)); } else { return matched; } } matched } unsafe extern fn InitBackwardMatch( mut self : *mut BackwardMatch, mut dist : usize, mut len : usize ) { (*self).distance = dist as (u32); (*self).length_and_code = (len << 5i32) as (u32); } #[derive(Clone, Copy)] #[repr(C)] pub struct H10 { pub window_mask_ : usize, pub buckets_ : *mut u32, pub invalid_pos_ : u32, } unsafe extern fn BrotliUnalignedRead32( mut p : *const std::os::raw::c_void ) -> u32 { *(p as (*const u32)) } unsafe extern fn HashBytesH10(mut data : *const u8) -> u32 { let mut h : u32 = BrotliUnalignedRead32( data as (*const std::os::raw::c_void) ).wrapping_mul( kHashMul32 ); h >> 32i32 - 17i32 } unsafe extern fn ForestH10(mut self : *mut H10) -> *mut u32 { &mut *self.offset(1i32 as (isize)) as (*mut H10) as (*mut u32) } unsafe extern fn LeftChildIndexH10( mut self : *mut H10, pos : usize ) -> usize { (2i32 as (usize)).wrapping_mul(pos & (*self).window_mask_) } unsafe extern fn RightChildIndexH10( mut self : *mut H10, pos : usize ) -> usize { (2i32 as (usize)).wrapping_mul( pos & (*self).window_mask_ ).wrapping_add( 1i32 as (usize) ) } unsafe extern fn StoreAndFindMatchesH10( mut self : *mut H10, data : *const u8, cur_ix : usize, ring_buffer_mask : usize, max_length : usize, max_backward : usize, best_len : *mut usize, mut matches : *mut BackwardMatch ) -> *mut BackwardMatch { let cur_ix_masked : usize = cur_ix & ring_buffer_mask; let max_comp_len : usize = brotli_min_size_t(max_length,128i32 as (usize)); let should_reroot_tree : i32 = if !!(max_length >= 128i32 as (usize)) { 1i32 } else { 0i32 }; let key : u32 = HashBytesH10( &*data.offset(cur_ix_masked as (isize)) as (*const u8) ); let mut forest : *mut u32 = ForestH10(self); let mut prev_ix : usize = *(*self).buckets_.offset(key as (isize)) as (usize); let mut node_left : usize = LeftChildIndexH10(self,cur_ix); let mut node_right : usize = RightChildIndexH10(self,cur_ix); let mut best_len_left : usize = 0i32 as (usize); let mut best_len_right : usize = 0i32 as (usize); let mut depth_remaining : usize; if should_reroot_tree != 0 { *(*self).buckets_.offset(key as (isize)) = cur_ix as (u32); } depth_remaining = 64i32 as (usize); 'break16: loop { { let backward : usize = cur_ix.wrapping_sub(prev_ix); let prev_ix_masked : usize = prev_ix & ring_buffer_mask; if backward == 0i32 as (usize) || backward > max_backward || depth_remaining == 0i32 as (usize) { if should_reroot_tree != 0 { *forest.offset(node_left as (isize)) = (*self).invalid_pos_; *forest.offset(node_right as (isize)) = (*self).invalid_pos_; } break 'break16; } { let cur_len : usize = brotli_min_size_t(best_len_left,best_len_right); let mut len : usize; len = cur_len.wrapping_add( FindMatchLengthWithLimit( &*data.offset( cur_ix_masked.wrapping_add(cur_len) as (isize) ) as (*const u8), &*data.offset( prev_ix_masked.wrapping_add(cur_len) as (isize) ) as (*const u8), max_length.wrapping_sub(cur_len) ) ); if !matches.is_null() && (len > *best_len) { *best_len = len; InitBackwardMatch( { let _old = matches; matches = matches.offset(1 as (isize)); _old }, backward, len ); } if len >= max_comp_len { if should_reroot_tree != 0 { *forest.offset(node_left as (isize)) = *forest.offset( LeftChildIndexH10( self, prev_ix ) as (isize) ); *forest.offset(node_right as (isize)) = *forest.offset( RightChildIndexH10( self, prev_ix ) as (isize) ); } break 'break16; } if *data.offset( cur_ix_masked.wrapping_add(len) as (isize) ) as (i32) > *data.offset( prev_ix_masked.wrapping_add(len) as (isize) ) as (i32) { best_len_left = len; if should_reroot_tree != 0 { *forest.offset(node_left as (isize)) = prev_ix as (u32); } node_left = RightChildIndexH10(self,prev_ix); prev_ix = *forest.offset(node_left as (isize)) as (usize); } else { best_len_right = len; if should_reroot_tree != 0 { *forest.offset(node_right as (isize)) = prev_ix as (u32); } node_right = LeftChildIndexH10(self,prev_ix); prev_ix = *forest.offset(node_right as (isize)) as (usize); } } } depth_remaining = depth_remaining.wrapping_sub(1 as (usize)); } matches } #[derive(Clone, Copy)] #[repr(C)] pub struct Struct18 { pub params : BrotliHasherParams, pub is_prepared_ : i32, pub dict_num_lookups : usize, pub dict_num_matches : usize, } unsafe extern fn GetHasherCommon( mut handle : *mut u8 ) -> *mut Struct18 { handle as (*mut Struct18) } unsafe extern fn SelfH10(mut handle : *mut u8) -> *mut H10 { &mut *GetHasherCommon(handle).offset( 1i32 as (isize) ) as (*mut Struct18) as (*mut H10) } unsafe extern fn brotli_max_size_t( mut a : usize, mut b : usize ) -> usize { if a > b { a } else { b } } unsafe extern fn InitDictionaryBackwardMatch( mut self : *mut BackwardMatch, mut dist : usize, mut len : usize, mut len_code : usize ) { (*self).distance = dist as (u32); (*self).length_and_code = (len << 5i32 | if len == len_code { 0i32 as (usize) } else { len_code }) as (u32); } unsafe extern fn FindAllMatchesH10( mut handle : *mut u8, mut dictionary : *const BrotliEncoderDictionary, mut data : *const u8, ring_buffer_mask : usize, cur_ix : usize, max_length : usize, max_backward : usize, gap : usize, mut params : *const BrotliEncoderParams, mut matches : *mut BackwardMatch ) -> usize { let orig_matches : *mut BackwardMatch = matches; let cur_ix_masked : usize = cur_ix & ring_buffer_mask; let mut best_len : usize = 1i32 as (usize); let short_match_max_backward : usize = (if (*params).quality != 11i32 { 16i32 } else { 64i32 }) as (usize); let mut stop : usize = cur_ix.wrapping_sub(short_match_max_backward); let mut dict_matches : *mut u32; let mut i : usize; if cur_ix < short_match_max_backward { stop = 0i32 as (usize); } i = cur_ix.wrapping_sub(1i32 as (usize)); 'break14: while i > stop && (best_len <= 2i32 as (usize)) { 'continue15: loop { { let mut prev_ix : usize = i; let backward : usize = cur_ix.wrapping_sub(prev_ix); if backward > max_backward { break 'break14; } prev_ix = prev_ix & ring_buffer_mask; if *data.offset(cur_ix_masked as (isize)) as (i32) != *data.offset( prev_ix as (isize) ) as (i32) || *data.offset( cur_ix_masked.wrapping_add( 1i32 as (usize) ) as (isize) ) as (i32) != *data.offset( prev_ix.wrapping_add( 1i32 as (usize) ) as (isize) ) as (i32) { break 'continue15; } { let len : usize = FindMatchLengthWithLimit( &*data.offset(prev_ix as (isize)) as (*const u8), &*data.offset(cur_ix_masked as (isize)) as (*const u8), max_length ); if len > best_len { best_len = len; InitBackwardMatch( { let _old = matches; matches = matches.offset(1 as (isize)); _old }, backward, len ); } } } break; } i = i.wrapping_sub(1 as (usize)); } if best_len < max_length { matches = StoreAndFindMatchesH10( SelfH10(handle), data, cur_ix, ring_buffer_mask, max_length, max_backward, &mut best_len as (*mut usize), matches ); } i = 0i32 as (usize); while i <= 37i32 as (usize) { { *dict_matches.offset(i as (isize)) = kInvalidMatch; } i = i.wrapping_add(1 as (usize)); } { let mut minlen : usize = brotli_max_size_t( 4i32 as (usize), best_len.wrapping_add(1i32 as (usize)) ); if BrotliFindAllStaticDictionaryMatches( dictionary, &*data.offset(cur_ix_masked as (isize)) as (*const u8), minlen, max_length, &mut *dict_matches.offset(0i32 as (isize)) as (*mut u32) ) != 0 { let mut maxlen : usize = brotli_min_size_t(37i32 as (usize),max_length); let mut l : usize; l = minlen; while l <= maxlen { { let mut dict_id : u32 = *dict_matches.offset(l as (isize)); if dict_id < kInvalidMatch { let mut distance : usize = max_backward.wrapping_add(gap).wrapping_add( (dict_id >> 5i32) as (usize) ).wrapping_add( 1i32 as (usize) ); if distance <= (*params).dist.max_distance { InitDictionaryBackwardMatch( { let _old = matches; matches = matches.offset(1 as (isize)); _old }, distance, l, (dict_id & 31i32 as (u32)) as (usize) ); } } } l = l.wrapping_add(1 as (usize)); } } } ((matches as (isize)).wrapping_sub( orig_matches as (isize) ) / std::mem::size_of::<*mut BackwardMatch>( ) as (isize)) as (usize) } unsafe extern fn BackwardMatchLength( mut self : *const BackwardMatch ) -> usize { ((*self).length_and_code >> 5i32) as (usize) } unsafe extern fn MaxZopfliCandidates( mut params : *const BrotliEncoderParams ) -> usize { (if (*params).quality <= 10i32 { 1i32 } else { 5i32 }) as (usize) } unsafe extern fn ComputeDistanceShortcut( block_start : usize, pos : usize, max_backward : usize, gap : usize, mut nodes : *const ZopfliNode ) -> u32 { let clen : usize = ZopfliNodeCopyLength( &*nodes.offset(pos as (isize)) as (*const ZopfliNode) ) as (usize); let ilen : usize = ((*nodes.offset( pos as (isize) )).dcode_insert_length & 0x7ffffffi32 as (u32)) as (usize); let dist : usize = ZopfliNodeCopyDistance( &*nodes.offset(pos as (isize)) as (*const ZopfliNode) ) as (usize); if pos == 0i32 as (usize) { 0i32 as (u32) } else if dist.wrapping_add(clen) <= block_start.wrapping_add( pos ).wrapping_add( gap ) && (dist <= max_backward.wrapping_add( gap )) && (ZopfliNodeDistanceCode( &*nodes.offset( pos as (isize) ) as (*const ZopfliNode) ) > 0i32 as (u32)) { pos as (u32) } else { (*nodes.offset( pos.wrapping_sub(clen).wrapping_sub(ilen) as (isize) )).u.shortcut } } unsafe extern fn ZopfliCostModelGetLiteralCosts( mut self : *const ZopfliCostModel, mut from : usize, mut to : usize ) -> f32 { *(*self).literal_costs_.offset( to as (isize) ) - *(*self).literal_costs_.offset(from as (isize)) } unsafe extern fn ComputeDistanceCache( pos : usize, mut starting_dist_cache : *const i32, mut nodes : *const ZopfliNode, mut dist_cache : *mut i32 ) { let mut idx : i32 = 0i32; let mut p : usize = (*nodes.offset(pos as (isize))).u.shortcut as (usize); while idx < 4i32 && (p > 0i32 as (usize)) { let ilen : usize = ((*nodes.offset( p as (isize) )).dcode_insert_length & 0x7ffffffi32 as (u32)) as (usize); let clen : usize = ZopfliNodeCopyLength( &*nodes.offset(p as (isize)) as (*const ZopfliNode) ) as (usize); let dist : usize = ZopfliNodeCopyDistance( &*nodes.offset(p as (isize)) as (*const ZopfliNode) ) as (usize); *dist_cache.offset( { let _old = idx; idx = idx + 1; _old } as (isize) ) = dist as (i32); p = (*nodes.offset( p.wrapping_sub(clen).wrapping_sub(ilen) as (isize) )).u.shortcut as (usize); } while idx < 4i32 { { *dist_cache.offset(idx as (isize)) = *{ let _old = starting_dist_cache; starting_dist_cache = starting_dist_cache.offset( 1 as (isize) ); _old }; } idx = idx + 1; } } unsafe extern fn StartPosQueueSize( mut self : *const StartPosQueue ) -> usize { brotli_min_size_t((*self).idx_,8i32 as (usize)) } unsafe extern fn StartPosQueuePush( mut self : *mut StartPosQueue, mut posdata : *const PosData ) { let mut offset : usize = !{ let _old = (*self).idx_; (*self).idx_ = (*self).idx_.wrapping_add(1 as (usize)); _old } & 7i32 as (usize); let mut len : usize = StartPosQueueSize(self as (*const StartPosQueue)); let mut i : usize; let mut q : *mut PosData = (*self).q_; *q.offset(offset as (isize)) = *posdata; i = 1i32 as (usize); while i < len { { if (*q.offset( (offset & 7i32 as (usize)) as (isize) )).costdiff > (*q.offset( (offset.wrapping_add( 1i32 as (usize) ) & 7i32 as (usize)) as (isize) )).costdiff { let mut __brotli_swap_tmp : PosData = *q.offset((offset & 7i32 as (usize)) as (isize)); *q.offset((offset & 7i32 as (usize)) as (isize)) = *q.offset( (offset.wrapping_add( 1i32 as (usize) ) & 7i32 as (usize)) as (isize) ); *q.offset( (offset.wrapping_add(1i32 as (usize)) & 7i32 as (usize)) as (isize) ) = __brotli_swap_tmp; } offset = offset.wrapping_add(1 as (usize)); } i = i.wrapping_add(1 as (usize)); } } unsafe extern fn EvaluateNode( block_start : usize, pos : usize, max_backward_limit : usize, gap : usize, mut starting_dist_cache : *const i32, mut model : *const ZopfliCostModel, mut queue : *mut StartPosQueue, mut nodes : *mut ZopfliNode ) { let mut node_cost : f32 = (*nodes.offset(pos as (isize))).u.cost; (*nodes.offset( pos as (isize) )).u.shortcut = ComputeDistanceShortcut( block_start, pos, max_backward_limit, gap, nodes as (*const ZopfliNode) ); if node_cost <= ZopfliCostModelGetLiteralCosts( model, 0i32 as (usize), pos ) { let mut posdata : PosData; posdata.pos = pos; posdata.cost = node_cost; posdata.costdiff = node_cost - ZopfliCostModelGetLiteralCosts( model, 0i32 as (usize), pos ); ComputeDistanceCache( pos, starting_dist_cache, nodes as (*const ZopfliNode), posdata.distance_cache ); StartPosQueuePush( queue, &mut posdata as (*mut PosData) as (*const PosData) ); } } unsafe extern fn StartPosQueueAt( mut self : *const StartPosQueue, mut k : usize ) -> *const PosData { &mut *(*self).q_.offset( (k.wrapping_sub((*self).idx_) & 7i32 as (usize)) as (isize) ) as (*mut PosData) as (*const PosData) } unsafe extern fn ZopfliCostModelGetMinCostCmd( mut self : *const ZopfliCostModel ) -> f32 { (*self).min_cost_cmd_ } unsafe extern fn ComputeMinimumCopyLength( start_cost : f32, mut nodes : *const ZopfliNode, num_bytes : usize, pos : usize ) -> usize { let mut min_cost : f32 = start_cost; let mut len : usize = 2i32 as (usize); let mut next_len_bucket : usize = 4i32 as (usize); let mut next_len_offset : usize = 10i32 as (usize); while pos.wrapping_add(len) <= num_bytes && ((*nodes.offset( pos.wrapping_add(len) as (isize) )).u.cost <= min_cost) { len = len.wrapping_add(1 as (usize)); if len == next_len_offset { min_cost = min_cost + 1.0f32; next_len_offset = next_len_offset.wrapping_add(next_len_bucket); next_len_bucket = next_len_bucket.wrapping_mul(2i32 as (usize)); } } len } unsafe extern fn GetInsertExtra(mut inscode : u16) -> u32 { *kInsExtra.offset(inscode as (isize)) } unsafe extern fn ZopfliCostModelGetDistanceCost( mut self : *const ZopfliCostModel, mut distcode : usize ) -> f32 { *(*self).cost_dist_.offset(distcode as (isize)) } unsafe extern fn GetCopyExtra(mut copycode : u16) -> u32 { *kCopyExtra.offset(copycode as (isize)) } unsafe extern fn ZopfliCostModelGetCommandCost( mut self : *const ZopfliCostModel, mut cmdcode : u16 ) -> f32 { *(*self).cost_cmd_.offset(cmdcode as (isize)) } unsafe extern fn UpdateZopfliNode( mut nodes : *mut ZopfliNode, mut pos : usize, mut start_pos : usize, mut len : usize, mut len_code : usize, mut dist : usize, mut short_code : usize, mut cost : f32 ) { let mut next : *mut ZopfliNode = &mut *nodes.offset( pos.wrapping_add(len) as (isize) ) as (*mut ZopfliNode); (*next).length = (len | len.wrapping_add( 9u32 as (usize) ).wrapping_sub( len_code ) << 25i32) as (u32); (*next).distance = dist as (u32); (*next).dcode_insert_length = (short_code << 27i32 | pos.wrapping_sub( start_pos )) as (u32); (*next).u.cost = cost; } unsafe extern fn BackwardMatchLengthCode( mut self : *const BackwardMatch ) -> usize { let mut code : usize = ((*self).length_and_code & 31i32 as (u32)) as (usize); if code != 0 { code } else { BackwardMatchLength(self) } } unsafe extern fn UpdateNodes( num_bytes : usize, block_start : usize, pos : usize, mut ringbuffer : *const u8, ringbuffer_mask : usize, mut params : *const BrotliEncoderParams, max_backward_limit : usize, mut starting_dist_cache : *const i32, num_matches : usize, mut matches : *const BackwardMatch, mut model : *const ZopfliCostModel, mut queue : *mut StartPosQueue, mut nodes : *mut ZopfliNode ) -> usize { let cur_ix : usize = block_start.wrapping_add(pos); let cur_ix_masked : usize = cur_ix & ringbuffer_mask; let max_distance : usize = brotli_min_size_t(cur_ix,max_backward_limit); let max_len : usize = num_bytes.wrapping_sub(pos); let max_zopfli_len : usize = MaxZopfliLen(params); let max_iters : usize = MaxZopfliCandidates(params); let mut min_len : usize; let mut result : usize = 0i32 as (usize); let mut k : usize; let mut gap : usize = 0i32 as (usize); EvaluateNode( block_start, pos, max_backward_limit, gap, starting_dist_cache, model, queue, nodes ); { let mut posdata : *const PosData = StartPosQueueAt(queue as (*const StartPosQueue),0i32 as (usize)); let mut min_cost : f32 = (*posdata).cost + ZopfliCostModelGetMinCostCmd( model ) + ZopfliCostModelGetLiteralCosts(model,(*posdata).pos,pos); min_len = ComputeMinimumCopyLength( min_cost, nodes as (*const ZopfliNode), num_bytes, pos ); } k = 0i32 as (usize); while k < max_iters && (k < StartPosQueueSize( queue as (*const StartPosQueue) )) { 'continue28: loop { { let mut posdata : *const PosData = StartPosQueueAt(queue as (*const StartPosQueue),k); let start : usize = (*posdata).pos; let inscode : u16 = GetInsertLengthCode(pos.wrapping_sub(start)); let start_costdiff : f32 = (*posdata).costdiff; let base_cost : f32 = start_costdiff + GetInsertExtra( inscode ) as (f32) + ZopfliCostModelGetLiteralCosts( model, 0i32 as (usize), pos ); let mut best_len : usize = min_len.wrapping_sub(1i32 as (usize)); let mut j : usize = 0i32 as (usize); 'break29: while j < 16i32 as (usize) && (best_len < max_len) { 'continue30: loop { { let idx : usize = *kDistanceCacheIndex.offset(j as (isize)) as (usize); let backward : usize = (*(*posdata).distance_cache.offset( idx as (isize) ) + *kDistanceCacheOffset.offset(j as (isize))) as (usize); let mut prev_ix : usize = cur_ix.wrapping_sub(backward); let mut len : usize = 0i32 as (usize); let mut continuation : u8 = *ringbuffer.offset( cur_ix_masked.wrapping_add(best_len) as (isize) ); if cur_ix_masked.wrapping_add(best_len) > ringbuffer_mask { break 'break29; } if backward > max_distance.wrapping_add(gap) { break 'continue30; } if backward <= max_distance { if prev_ix >= cur_ix { break 'continue30; } prev_ix = prev_ix & ringbuffer_mask; if prev_ix.wrapping_add( best_len ) > ringbuffer_mask || continuation as (i32) != *ringbuffer.offset( prev_ix.wrapping_add( best_len ) as (isize) ) as (i32) { break 'continue30; } len = FindMatchLengthWithLimit( &*ringbuffer.offset(prev_ix as (isize)) as (*const u8), &*ringbuffer.offset( cur_ix_masked as (isize) ) as (*const u8), max_len ); } else { break 'continue30; } { let dist_cost : f32 = base_cost + ZopfliCostModelGetDistanceCost(model,j); let mut l : usize; l = best_len.wrapping_add(1i32 as (usize)); while l <= len { { let copycode : u16 = GetCopyLengthCode(l); let cmdcode : u16 = CombineLengthCodes( inscode, copycode, (j == 0i32 as (usize)) as (i32) ); let cost : f32 = (if cmdcode as (i32) < 128i32 { base_cost } else { dist_cost }) + GetCopyExtra( copycode ) as (f32) + ZopfliCostModelGetCommandCost( model, cmdcode ); if cost < (*nodes.offset( pos.wrapping_add(l) as (isize) )).u.cost { UpdateZopfliNode( nodes, pos, start, l, l, backward, j.wrapping_add(1i32 as (usize)), cost ); result = brotli_max_size_t(result,l); } best_len = l; } l = l.wrapping_add(1 as (usize)); } } } break; } j = j.wrapping_add(1 as (usize)); } if k >= 2i32 as (usize) { break 'continue28; } { let mut len : usize = min_len; j = 0i32 as (usize); while j < num_matches { { let mut match_ : BackwardMatch = *matches.offset(j as (isize)); let mut dist : usize = match_.distance as (usize); let mut is_dictionary_match : i32 = if !!(dist > max_distance.wrapping_add(gap)) { 1i32 } else { 0i32 }; let mut dist_code : usize = dist.wrapping_add(16i32 as (usize)).wrapping_sub( 1i32 as (usize) ); let mut dist_symbol : u16; let mut distextra : u32; let mut distnumextra : u32; let mut dist_cost : f32; let mut max_match_len : usize; PrefixEncodeCopyDistance( dist_code, (*params).dist.num_direct_distance_codes as (usize), (*params).dist.distance_postfix_bits as (usize), &mut dist_symbol as (*mut u16), &mut distextra as (*mut u32) ); distnumextra = (dist_symbol as (i32) >> 10i32) as (u32); dist_cost = base_cost + distnumextra as (f32) + ZopfliCostModelGetDistanceCost( model, (dist_symbol as (i32) & 0x3ffi32) as (usize) ); max_match_len = BackwardMatchLength( &mut match_ as (*mut BackwardMatch) as (*const BackwardMatch) ); if len < max_match_len && (is_dictionary_match != 0 || max_match_len > max_zopfli_len) { len = max_match_len; } while len <= max_match_len { { let len_code : usize = if is_dictionary_match != 0 { BackwardMatchLengthCode( &mut match_ as (*mut BackwardMatch) as (*const BackwardMatch) ) } else { len }; let copycode : u16 = GetCopyLengthCode(len_code); let cmdcode : u16 = CombineLengthCodes(inscode,copycode,0i32); let cost : f32 = dist_cost + GetCopyExtra( copycode ) as (f32) + ZopfliCostModelGetCommandCost( model, cmdcode ); if cost < (*nodes.offset( pos.wrapping_add(len) as (isize) )).u.cost { UpdateZopfliNode( nodes, pos, start, len, len_code, dist, 0i32 as (usize), cost ); result = brotli_max_size_t(result,len); } } len = len.wrapping_add(1 as (usize)); } } j = j.wrapping_add(1 as (usize)); } } } break; } k = k.wrapping_add(1 as (usize)); } result } unsafe extern fn StoreH10( mut handle : *mut u8, mut data : *const u8, mask : usize, ix : usize ) { let mut self : *mut H10 = SelfH10(handle); let max_backward : usize = (*self).window_mask_.wrapping_sub(16i32 as (usize)).wrapping_add( 1i32 as (usize) ); StoreAndFindMatchesH10( self, data, ix, mask, 128i32 as (usize), max_backward, 0i32 as (*mut std::os::raw::c_void) as (*mut usize), 0i32 as (*mut std::os::raw::c_void) as (*mut BackwardMatch) ); } unsafe extern fn StoreRangeH10( mut handle : *mut u8, mut data : *const u8, mask : usize, ix_start : usize, ix_end : usize ) { let mut i : usize = ix_start; let mut j : usize = ix_start; if ix_start.wrapping_add(63i32 as (usize)) <= ix_end { i = ix_end.wrapping_sub(63i32 as (usize)); } if ix_start.wrapping_add(512i32 as (usize)) <= i { while j < i { { StoreH10(handle,data,mask,j); } j = j.wrapping_add(8i32 as (usize)); } } while i < ix_end { { StoreH10(handle,data,mask,i); } i = i.wrapping_add(1 as (usize)); } } unsafe extern fn HashTypeLengthH10() -> usize { 4i32 as (usize) } unsafe extern fn CleanupZopfliCostModel( mut m : *mut MemoryManager, mut self : *mut ZopfliCostModel ) { { BrotliFree( m, (*self).literal_costs_ as (*mut std::os::raw::c_void) ); (*self).literal_costs_ = 0i32 as (*mut std::os::raw::c_void) as (*mut f32); } { BrotliFree(m,(*self).cost_dist_ as (*mut std::os::raw::c_void)); (*self).cost_dist_ = 0i32 as (*mut std::os::raw::c_void) as (*mut f32); } } unsafe extern fn ZopfliNodeCommandLength( mut self : *const ZopfliNode ) -> u32 { ZopfliNodeCopyLength(self).wrapping_add( (*self).dcode_insert_length & 0x7ffffffi32 as (u32) ) } unsafe extern fn ComputeShortestPathFromNodes( mut num_bytes : usize, mut nodes : *mut ZopfliNode ) -> usize { let mut index : usize = num_bytes; let mut num_commands : usize = 0i32 as (usize); while (*nodes.offset( index as (isize) )).dcode_insert_length & 0x7ffffffi32 as (u32) == 0i32 as (u32) && ((*nodes.offset( index as (isize) )).length == 1i32 as (u32)) { index = index.wrapping_sub(1 as (usize)); } (*nodes.offset(index as (isize))).u.next = !(0i32 as (u32)); while index != 0i32 as (usize) { let mut len : usize = ZopfliNodeCommandLength( &mut *nodes.offset( index as (isize) ) as (*mut ZopfliNode) as (*const ZopfliNode) ) as (usize); index = index.wrapping_sub(len); (*nodes.offset(index as (isize))).u.next = len as (u32); num_commands = num_commands.wrapping_add(1 as (usize)); } num_commands } #[no_mangle] pub unsafe extern fn BrotliZopfliComputeShortestPath( mut m : *mut MemoryManager, mut num_bytes : usize, mut position : usize, mut ringbuffer : *const u8, mut ringbuffer_mask : usize, mut params : *const BrotliEncoderParams, max_backward_limit : usize, mut dist_cache : *const i32, mut hasher : *mut u8, mut nodes : *mut ZopfliNode ) -> usize { let max_zopfli_len : usize = MaxZopfliLen(params); let mut model : ZopfliCostModel; let mut queue : StartPosQueue; let mut matches : *mut BackwardMatch; let store_end : usize = if num_bytes >= StoreLookaheadH10() { position.wrapping_add(num_bytes).wrapping_sub( StoreLookaheadH10() ).wrapping_add( 1i32 as (usize) ) } else { position }; let mut i : usize; let mut gap : usize = 0i32 as (usize); let mut lz_matches_offset : usize = 0i32 as (usize); (*nodes.offset(0i32 as (isize))).length = 0i32 as (u32); (*nodes.offset(0i32 as (isize))).u.cost = 0i32 as (f32); InitZopfliCostModel( m, &mut model as (*mut ZopfliCostModel), &(*params).dist as (*const BrotliDistanceParams), num_bytes ); if !(0i32 == 0) { return 0i32 as (usize); } ZopfliCostModelSetFromLiteralCosts( &mut model as (*mut ZopfliCostModel), position, ringbuffer, ringbuffer_mask ); InitStartPosQueue(&mut queue as (*mut StartPosQueue)); i = 0i32 as (usize); while i.wrapping_add(HashTypeLengthH10()).wrapping_sub( 1i32 as (usize) ) < num_bytes { { let pos : usize = position.wrapping_add(i); let max_distance : usize = brotli_min_size_t(pos,max_backward_limit); let mut skip : usize; let mut num_matches : usize = FindAllMatchesH10( hasher, &(*params).dictionary as (*const BrotliEncoderDictionary), ringbuffer, ringbuffer_mask, pos, num_bytes.wrapping_sub(i), max_distance, gap, params, &mut *matches.offset( lz_matches_offset as (isize) ) as (*mut BackwardMatch) ); if num_matches > 0i32 as (usize) && (BackwardMatchLength( &mut *matches.offset( num_matches.wrapping_sub( 1i32 as (usize) ) as (isize) ) as (*mut BackwardMatch) as (*const BackwardMatch) ) > max_zopfli_len) { *matches.offset(0i32 as (isize)) = *matches.offset( num_matches.wrapping_sub( 1i32 as (usize) ) as (isize) ); num_matches = 1i32 as (usize); } skip = UpdateNodes( num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches, matches as (*const BackwardMatch), &mut model as (*mut ZopfliCostModel) as (*const ZopfliCostModel), &mut queue as (*mut StartPosQueue), nodes ); if skip < 16384i32 as (usize) { skip = 0i32 as (usize); } if num_matches == 1i32 as (usize) && (BackwardMatchLength( &mut *matches.offset( 0i32 as (isize) ) as (*mut BackwardMatch) as (*const BackwardMatch) ) > max_zopfli_len) { skip = brotli_max_size_t( BackwardMatchLength( &mut *matches.offset( 0i32 as (isize) ) as (*mut BackwardMatch) as (*const BackwardMatch) ), skip ); } if skip > 1i32 as (usize) { StoreRangeH10( hasher, ringbuffer, ringbuffer_mask, pos.wrapping_add(1i32 as (usize)), brotli_min_size_t(pos.wrapping_add(skip),store_end) ); skip = skip.wrapping_sub(1 as (usize)); while skip != 0 { i = i.wrapping_add(1 as (usize)); if i.wrapping_add(HashTypeLengthH10()).wrapping_sub( 1i32 as (usize) ) >= num_bytes { break; } EvaluateNode( position, i, max_backward_limit, gap, dist_cache, &mut model as (*mut ZopfliCostModel) as (*const ZopfliCostModel), &mut queue as (*mut StartPosQueue), nodes ); skip = skip.wrapping_sub(1 as (usize)); } } } i = i.wrapping_add(1 as (usize)); } CleanupZopfliCostModel(m,&mut model as (*mut ZopfliCostModel)); ComputeShortestPathFromNodes(num_bytes,nodes) } #[no_mangle] pub unsafe extern fn BrotliCreateZopfliBackwardReferences( mut m : *mut MemoryManager, mut num_bytes : usize, mut position : usize, mut ringbuffer : *const u8, mut ringbuffer_mask : usize, mut params : *const BrotliEncoderParams, mut hasher : *mut u8, mut dist_cache : *mut i32, mut last_insert_len : *mut usize, mut commands : *mut Command, mut num_commands : *mut usize, mut num_literals : *mut usize ) { let max_backward_limit : usize = (1i32 as (usize) << (*params).lgwin).wrapping_sub( 16i32 as (usize) ); let mut nodes : *mut ZopfliNode; nodes = if num_bytes.wrapping_add( 1i32 as (usize) ) > 0i32 as (usize) { BrotliAllocate( m, num_bytes.wrapping_add(1i32 as (usize)).wrapping_mul( std::mem::size_of::() ) ) as (*mut ZopfliNode) } else { 0i32 as (*mut std::os::raw::c_void) as (*mut ZopfliNode) }; if !(0i32 == 0) { return; } BrotliInitZopfliNodes( nodes, num_bytes.wrapping_add(1i32 as (usize)) ); *num_commands = (*num_commands).wrapping_add( BrotliZopfliComputeShortestPath( m, num_bytes, position, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache as (*const i32), hasher, nodes ) ); if !(0i32 == 0) { return; } BrotliZopfliCreateCommands( num_bytes, position, max_backward_limit, nodes as (*const ZopfliNode), dist_cache, last_insert_len, params, commands, num_literals ); { BrotliFree(m,nodes as (*mut std::os::raw::c_void)); nodes = 0i32 as (*mut std::os::raw::c_void) as (*mut ZopfliNode); } } unsafe extern fn CommandCopyLen(mut self : *const Command) -> u32 { (*self).copy_len_ & 0x1ffffffi32 as (u32) } unsafe extern fn SetCost( mut histogram : *const u32, mut histogram_size : usize, mut literal_histogram : i32, mut cost : *mut f32 ) { let mut sum : usize = 0i32 as (usize); let mut missing_symbol_sum : usize; let mut log2sum : f32; let mut missing_symbol_cost : f32; let mut i : usize; i = 0i32 as (usize); while i < histogram_size { { sum = sum.wrapping_add(*histogram.offset(i as (isize)) as (usize)); } i = i.wrapping_add(1 as (usize)); } log2sum = FastLog2(sum) as (f32); missing_symbol_sum = sum; if literal_histogram == 0 { i = 0i32 as (usize); while i < histogram_size { { if *histogram.offset(i as (isize)) == 0i32 as (u32) { missing_symbol_sum = missing_symbol_sum.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } } missing_symbol_cost = FastLog2( missing_symbol_sum ) as (f32) + 2i32 as (f32); i = 0i32 as (usize); while i < histogram_size { 'continue56: loop { { if *histogram.offset(i as (isize)) == 0i32 as (u32) { *cost.offset(i as (isize)) = missing_symbol_cost; break 'continue56; } *cost.offset(i as (isize)) = log2sum - FastLog2( *histogram.offset( i as (isize) ) as (usize) ) as (f32); if *cost.offset(i as (isize)) < 1i32 as (f32) { *cost.offset(i as (isize)) = 1i32 as (f32); } } break; } i = i.wrapping_add(1 as (usize)); } } unsafe extern fn brotli_min_float( mut a : f32, mut b : f32 ) -> f32 { if a < b { a } else { b } } unsafe extern fn ZopfliCostModelSetFromCommands( mut self : *mut ZopfliCostModel, mut position : usize, mut ringbuffer : *const u8, mut ringbuffer_mask : usize, mut commands : *const Command, mut num_commands : usize, mut last_insert_len : usize ) { let mut histogram_literal : *mut u32; let mut histogram_cmd : *mut u32; let mut histogram_dist : *mut u32; let mut cost_literal : *mut f32; let mut pos : usize = position.wrapping_sub(last_insert_len); let mut min_cost_cmd : f32 = kInfinity; let mut i : usize; let mut cost_cmd : *mut f32 = (*self).cost_cmd_; memset( histogram_literal as (*mut std::os::raw::c_void), 0i32, std::mem::size_of::<*mut u32>() ); memset( histogram_cmd as (*mut std::os::raw::c_void), 0i32, std::mem::size_of::<*mut u32>() ); memset( histogram_dist as (*mut std::os::raw::c_void), 0i32, std::mem::size_of::<*mut u32>() ); i = 0i32 as (usize); while i < num_commands { { let mut inslength : usize = (*commands.offset(i as (isize))).insert_len_ as (usize); let mut copylength : usize = CommandCopyLen( &*commands.offset(i as (isize)) as (*const Command) ) as (usize); let mut distcode : usize = ((*commands.offset( i as (isize) )).dist_prefix_ as (i32) & 0x3ffi32) as (usize); let mut cmdcode : usize = (*commands.offset(i as (isize))).cmd_prefix_ as (usize); let mut j : usize; { let _rhs = 1; let _lhs = &mut *histogram_cmd.offset(cmdcode as (isize)); *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } if cmdcode >= 128i32 as (usize) { let _rhs = 1; let _lhs = &mut *histogram_dist.offset(distcode as (isize)); *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } j = 0i32 as (usize); while j < inslength { { let _rhs = 1; let _lhs = &mut *histogram_literal.offset( *ringbuffer.offset( (pos.wrapping_add(j) & ringbuffer_mask) as (isize) ) as (isize) ); *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } j = j.wrapping_add(1 as (usize)); } pos = pos.wrapping_add(inslength.wrapping_add(copylength)); } i = i.wrapping_add(1 as (usize)); } SetCost( histogram_literal as (*const u32), 256i32 as (usize), 1i32, cost_literal ); SetCost( histogram_cmd as (*const u32), 704i32 as (usize), 0i32, cost_cmd ); SetCost( histogram_dist as (*const u32), (*self).distance_histogram_size as (usize), 0i32, (*self).cost_dist_ ); i = 0i32 as (usize); while i < 704i32 as (usize) { { min_cost_cmd = brotli_min_float( min_cost_cmd, *cost_cmd.offset(i as (isize)) ); } i = i.wrapping_add(1 as (usize)); } (*self).min_cost_cmd_ = min_cost_cmd; { let mut literal_costs : *mut f32 = (*self).literal_costs_; let mut literal_carry : f32 = 0.0f64 as (f32); let mut num_bytes : usize = (*self).num_bytes_; *literal_costs.offset(0i32 as (isize)) = 0.0f64 as (f32); i = 0i32 as (usize); while i < num_bytes { { literal_carry = literal_carry + *cost_literal.offset( *ringbuffer.offset( (position.wrapping_add( i ) & ringbuffer_mask) as (isize) ) as (isize) ); *literal_costs.offset( i.wrapping_add(1i32 as (usize)) as (isize) ) = *literal_costs.offset(i as (isize)) + literal_carry; literal_carry = literal_carry - (*literal_costs.offset( i.wrapping_add(1i32 as (usize)) as (isize) ) - *literal_costs.offset(i as (isize))); } i = i.wrapping_add(1 as (usize)); } } } unsafe extern fn ZopfliIterate( mut num_bytes : usize, mut position : usize, mut ringbuffer : *const u8, mut ringbuffer_mask : usize, mut params : *const BrotliEncoderParams, max_backward_limit : usize, gap : usize, mut dist_cache : *const i32, mut model : *const ZopfliCostModel, mut num_matches : *const u32, mut matches : *const BackwardMatch, mut nodes : *mut ZopfliNode ) -> usize { let max_zopfli_len : usize = MaxZopfliLen(params); let mut queue : StartPosQueue; let mut cur_match_pos : usize = 0i32 as (usize); let mut i : usize; (*nodes.offset(0i32 as (isize))).length = 0i32 as (u32); (*nodes.offset(0i32 as (isize))).u.cost = 0i32 as (f32); InitStartPosQueue(&mut queue as (*mut StartPosQueue)); i = 0i32 as (usize); while i.wrapping_add(3i32 as (usize)) < num_bytes { { let mut skip : usize = UpdateNodes( num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, *num_matches.offset(i as (isize)) as (usize), &*matches.offset( cur_match_pos as (isize) ) as (*const BackwardMatch), model, &mut queue as (*mut StartPosQueue), nodes ); if skip < 16384i32 as (usize) { skip = 0i32 as (usize); } cur_match_pos = cur_match_pos.wrapping_add( *num_matches.offset(i as (isize)) as (usize) ); if *num_matches.offset( i as (isize) ) == 1i32 as (u32) && (BackwardMatchLength( &*matches.offset( cur_match_pos.wrapping_sub( 1i32 as (usize) ) as (isize) ) as (*const BackwardMatch) ) > max_zopfli_len) { skip = brotli_max_size_t( BackwardMatchLength( &*matches.offset( cur_match_pos.wrapping_sub(1i32 as (usize)) as (isize) ) as (*const BackwardMatch) ), skip ); } if skip > 1i32 as (usize) { skip = skip.wrapping_sub(1 as (usize)); while skip != 0 { i = i.wrapping_add(1 as (usize)); if i.wrapping_add(3i32 as (usize)) >= num_bytes { break; } EvaluateNode( position, i, max_backward_limit, gap, dist_cache, model, &mut queue as (*mut StartPosQueue), nodes ); cur_match_pos = cur_match_pos.wrapping_add( *num_matches.offset(i as (isize)) as (usize) ); skip = skip.wrapping_sub(1 as (usize)); } } } i = i.wrapping_add(1 as (usize)); } ComputeShortestPathFromNodes(num_bytes,nodes) } #[no_mangle] pub unsafe extern fn BrotliCreateHqZopfliBackwardReferences( mut m : *mut MemoryManager, mut num_bytes : usize, mut position : usize, mut ringbuffer : *const u8, mut ringbuffer_mask : usize, mut params : *const BrotliEncoderParams, mut hasher : *mut u8, mut dist_cache : *mut i32, mut last_insert_len : *mut usize, mut commands : *mut Command, mut num_commands : *mut usize, mut num_literals : *mut usize ) { let max_backward_limit : usize = (1i32 as (usize) << (*params).lgwin).wrapping_sub( 16i32 as (usize) ); let mut num_matches : *mut u32 = if num_bytes > 0i32 as (usize) { BrotliAllocate( m, num_bytes.wrapping_mul(std::mem::size_of::()) ) as (*mut u32) } else { 0i32 as (*mut std::os::raw::c_void) as (*mut u32) }; let mut matches_size : usize = (4i32 as (usize)).wrapping_mul(num_bytes); let store_end : usize = if num_bytes >= StoreLookaheadH10() { position.wrapping_add(num_bytes).wrapping_sub( StoreLookaheadH10() ).wrapping_add( 1i32 as (usize) ) } else { position }; let mut cur_match_pos : usize = 0i32 as (usize); let mut i : usize; let mut orig_num_literals : usize; let mut orig_last_insert_len : usize; let mut orig_dist_cache : *mut i32; let mut orig_num_commands : usize; let mut model : ZopfliCostModel; let mut nodes : *mut ZopfliNode; let mut matches : *mut BackwardMatch = if matches_size > 0i32 as (usize) { BrotliAllocate( m, matches_size.wrapping_mul(std::mem::size_of::()) ) as (*mut BackwardMatch) } else { 0i32 as (*mut std::os::raw::c_void) as (*mut BackwardMatch) }; let mut gap : usize = 0i32 as (usize); let mut shadow_matches : usize = 0i32 as (usize); if !(0i32 == 0) { return; } i = 0i32 as (usize); while i.wrapping_add(HashTypeLengthH10()).wrapping_sub( 1i32 as (usize) ) < num_bytes { { let pos : usize = position.wrapping_add(i); let mut max_distance : usize = brotli_min_size_t(pos,max_backward_limit); let mut max_length : usize = num_bytes.wrapping_sub(i); let mut num_found_matches : usize; let mut cur_match_end : usize; let mut j : usize; { if matches_size < cur_match_pos.wrapping_add( 128i32 as (usize) ).wrapping_add( shadow_matches ) { let mut _new_size : usize = if matches_size == 0i32 as (usize) { cur_match_pos.wrapping_add(128i32 as (usize)).wrapping_add( shadow_matches ) } else { matches_size }; let mut new_array : *mut BackwardMatch; while _new_size < cur_match_pos.wrapping_add( 128i32 as (usize) ).wrapping_add( shadow_matches ) { _new_size = _new_size.wrapping_mul(2i32 as (usize)); } new_array = if _new_size > 0i32 as (usize) { BrotliAllocate( m, _new_size.wrapping_mul(std::mem::size_of::()) ) as (*mut BackwardMatch) } else { 0i32 as (*mut std::os::raw::c_void) as (*mut BackwardMatch) }; if !!(0i32 == 0) && (matches_size != 0i32 as (usize)) { memcpy( new_array as (*mut std::os::raw::c_void), matches as (*const std::os::raw::c_void), matches_size.wrapping_mul(std::mem::size_of::()) ); } { BrotliFree(m,matches as (*mut std::os::raw::c_void)); matches = 0i32 as (*mut std::os::raw::c_void) as (*mut BackwardMatch); } matches = new_array; matches_size = _new_size; } } if !(0i32 == 0) { return; } num_found_matches = FindAllMatchesH10( hasher, &(*params).dictionary as (*const BrotliEncoderDictionary), ringbuffer, ringbuffer_mask, pos, max_length, max_distance, gap, params, &mut *matches.offset( cur_match_pos.wrapping_add(shadow_matches) as (isize) ) as (*mut BackwardMatch) ); cur_match_end = cur_match_pos.wrapping_add(num_found_matches); j = cur_match_pos; while j.wrapping_add(1i32 as (usize)) < cur_match_end { { } j = j.wrapping_add(1 as (usize)); } *num_matches.offset(i as (isize)) = num_found_matches as (u32); if num_found_matches > 0i32 as (usize) { let match_len : usize = BackwardMatchLength( &mut *matches.offset( cur_match_end.wrapping_sub(1i32 as (usize)) as (isize) ) as (*mut BackwardMatch) as (*const BackwardMatch) ); if match_len > 325i32 as (usize) { let skip : usize = match_len.wrapping_sub(1i32 as (usize)); *matches.offset( { let _old = cur_match_pos; cur_match_pos = cur_match_pos.wrapping_add(1 as (usize)); _old } as (isize) ) = *matches.offset( cur_match_end.wrapping_sub(1i32 as (usize)) as (isize) ); *num_matches.offset(i as (isize)) = 1i32 as (u32); StoreRangeH10( hasher, ringbuffer, ringbuffer_mask, pos.wrapping_add(1i32 as (usize)), brotli_min_size_t(pos.wrapping_add(match_len),store_end) ); memset( &mut *num_matches.offset( i.wrapping_add(1i32 as (usize)) as (isize) ) as (*mut u32) as (*mut std::os::raw::c_void), 0i32, skip.wrapping_mul(std::mem::size_of::()) ); i = i.wrapping_add(skip); } else { cur_match_pos = cur_match_end; } } } i = i.wrapping_add(1 as (usize)); } orig_num_literals = *num_literals; orig_last_insert_len = *last_insert_len; memcpy( orig_dist_cache as (*mut std::os::raw::c_void), dist_cache as (*const std::os::raw::c_void), (4i32 as (usize)).wrapping_mul(std::mem::size_of::()) ); orig_num_commands = *num_commands; nodes = if num_bytes.wrapping_add( 1i32 as (usize) ) > 0i32 as (usize) { BrotliAllocate( m, num_bytes.wrapping_add(1i32 as (usize)).wrapping_mul( std::mem::size_of::() ) ) as (*mut ZopfliNode) } else { 0i32 as (*mut std::os::raw::c_void) as (*mut ZopfliNode) }; if !(0i32 == 0) { return; } InitZopfliCostModel( m, &mut model as (*mut ZopfliCostModel), &(*params).dist as (*const BrotliDistanceParams), num_bytes ); if !(0i32 == 0) { return; } i = 0i32 as (usize); while i < 2i32 as (usize) { { BrotliInitZopfliNodes( nodes, num_bytes.wrapping_add(1i32 as (usize)) ); if i == 0i32 as (usize) { ZopfliCostModelSetFromLiteralCosts( &mut model as (*mut ZopfliCostModel), position, ringbuffer, ringbuffer_mask ); } else { ZopfliCostModelSetFromCommands( &mut model as (*mut ZopfliCostModel), position, ringbuffer, ringbuffer_mask, commands as (*const Command), (*num_commands).wrapping_sub(orig_num_commands), orig_last_insert_len ); } *num_commands = orig_num_commands; *num_literals = orig_num_literals; *last_insert_len = orig_last_insert_len; memcpy( dist_cache as (*mut std::os::raw::c_void), orig_dist_cache as (*const std::os::raw::c_void), (4i32 as (usize)).wrapping_mul(std::mem::size_of::()) ); *num_commands = (*num_commands).wrapping_add( ZopfliIterate( num_bytes, position, ringbuffer, ringbuffer_mask, params, max_backward_limit, gap, dist_cache as (*const i32), &mut model as (*mut ZopfliCostModel) as (*const ZopfliCostModel), num_matches as (*const u32), matches as (*const BackwardMatch), nodes ) ); BrotliZopfliCreateCommands( num_bytes, position, max_backward_limit, nodes as (*const ZopfliNode), dist_cache, last_insert_len, params, commands, num_literals ); } i = i.wrapping_add(1 as (usize)); } CleanupZopfliCostModel(m,&mut model as (*mut ZopfliCostModel)); { BrotliFree(m,nodes as (*mut std::os::raw::c_void)); nodes = 0i32 as (*mut std::os::raw::c_void) as (*mut ZopfliNode); } { BrotliFree(m,matches as (*mut std::os::raw::c_void)); matches = 0i32 as (*mut std::os::raw::c_void) as (*mut BackwardMatch); } { BrotliFree(m,num_matches as (*mut std::os::raw::c_void)); num_matches = 0i32 as (*mut std::os::raw::c_void) as (*mut u32); } } brotli-3.4.0/corrosion/backward_references_hq_safe.rs000064400000000000000000002530371046102023000211650ustar 00000000000000extern { fn BrotliAllocate( m : &mut [MemoryManager], n : usize ) -> *mut std::os::raw::c_void; fn BrotliEstimateBitCostsForLiterals( pos : usize, len : usize, mask : usize, data : & [u8], cost : &mut [f32 ]); fn BrotliFindAllStaticDictionaryMatches( dictionary : & [BrotliEncoderDictionary], data : & [u8], min_length : usize, max_length : usize, matches : &mut [u32 ]) -> i32; fn BrotliFree( m : &mut [MemoryManager], p : &mut [std::os::raw::c_void ]); fn log2(__x : f64) -> f64; fn memcpy( __dest : &mut [std::os::raw::c_void], __src : & [std::os::raw::c_void], __n : usize ) -> *mut std::os::raw::c_void; fn memset( __s : &mut [std::os::raw::c_void], __c : i32, __n : usize ) -> *mut std::os::raw::c_void; } static mut kLog2Table : *const f32 = 0.0000000000000000f32 ; static kDictNumBits : i32 = 15i32; static kDictHashMul32 : u32 = 0x1e35a7bdu32; static mut kStaticDictionaryBuckets : *const u16 = 1i32 ; pub struct DictWord { pub len : u8, pub transform : u8, pub idx : u16, } static mut kStaticDictionaryWords : *const DictWord = 0i32 ; static mut kInsBase : *mut u32 = 0i32 ; static mut kInsExtra : *mut u32 = 0i32 ; static mut kCopyBase : *mut u32 = 2i32 ; static mut kCopyExtra : *mut u32 = 0i32 ; pub fn ctzll(mut x : usize) -> usize { let mut count : u8 = 0i32 as (u8); while x & 0usize != 0 { count = (count as (i32) + 1i32) as (u8); x = x >> 1i32; } count as (usize) } static kInvalidMatch : u32 = 0xfffffffu32; static kCutoffTransformsCount : u32 = 10u32; static kCutoffTransforms : usize = 0x71b520ausize << 32i32 | 0xda2d3200u32 as (usize); static kHashMul32 : u32 = 0x1e35a7bdu32; static kHashMul64 : usize = 0x1e35a7bdusize << 32i32 | 0x1e35a7bdusize; static kHashMul64Long : usize = 0x1fe35a7bu32 as (usize) << 32i32 | 0xd3579bd3u32 as (usize); static kInfinity : f32 = 1.7e38f32; static mut kDistanceCacheIndex : *const u32 = 0i32 ; static mut kDistanceCacheOffset : *const i32 = 0i32 ; pub struct Struct1 { pub cost : f32, pub next : u32, pub shortcut : u32, } pub struct ZopfliNode { pub length : u32, pub distance : u32, pub dcode_insert_length : u32, pub u : Struct1, } pub fn BrotliInitZopfliNodes( mut array : &mut [ZopfliNode], mut length : usize ) { let mut stub : ZopfliNode; let mut i : usize; stub.length = 1u32; stub.distance = 0u32; stub.dcode_insert_length = 0u32; stub.u.cost = kInfinity; i = 0usize; while i < length { array[(i as (usize)) ]= stub; i = i.wrapping_add(1 as (usize)); } } #[repr(i32)] pub enum BrotliEncoderMode { BROTLI_MODE_GENERIC = 0i32, BROTLI_MODE_TEXT = 1i32, BROTLI_MODE_FONT = 2i32, } pub struct BrotliHasherParams { pub type_ : i32, pub bucket_bits : i32, pub block_bits : i32, pub hash_len : i32, pub num_last_distances_to_check : i32, } pub struct BrotliDistanceParams { pub distance_postfix_bits : u32, pub num_direct_distance_codes : u32, pub alphabet_size : u32, pub max_distance : usize, } pub struct BrotliDictionary { pub size_bits_by_length : *mut u8, pub offsets_by_length : *mut u32, pub data_size : usize, pub data : *const u8, } pub struct BrotliEncoderDictionary { pub words : *const BrotliDictionary, pub cutoffTransformsCount : u32, pub cutoffTransforms : usize, pub hash_table : *const u16, pub buckets : *const u16, pub dict_words : *const DictWord, } pub struct BrotliEncoderParams { pub mode : BrotliEncoderMode, pub quality : i32, pub lgwin : i32, pub lgblock : i32, pub size_hint : usize, pub disable_literal_context_modeling : i32, pub large_window : i32, pub hasher : BrotliHasherParams, pub dist : BrotliDistanceParams, pub dictionary : BrotliEncoderDictionary, } pub struct Command { pub insert_len_ : u32, pub copy_len_ : u32, pub dist_extra_ : u32, pub cmd_prefix_ : u16, pub dist_prefix_ : u16, } fn ZopfliNodeCopyLength( mut xself : & ZopfliNode ) -> u32 { (*xself).length & 0x1ffffffu32 } fn ZopfliNodeCopyDistance( mut xself : & ZopfliNode ) -> u32 { (*xself).distance } fn ZopfliNodeLengthCode( mut xself : & ZopfliNode ) -> u32 { let modifier : u32 = (*xself).length >> 25i32; ZopfliNodeCopyLength(xself).wrapping_add(9u32).wrapping_sub( modifier ) } fn brotli_min_size_t( mut a : usize, mut b : usize ) -> usize { if a < b { a } else { b } } fn ZopfliNodeDistanceCode( mut xself : & ZopfliNode ) -> u32 { let short_code : u32 = (*xself).dcode_insert_length >> 27i32; if short_code == 0u32 { ZopfliNodeCopyDistance(xself).wrapping_add( 16u32 ).wrapping_sub( 1u32 ) } else { short_code.wrapping_sub(1u32) } } fn Log2FloorNonZero(mut n : usize) -> u32 { let mut result : u32 = 0u32; while { n = n >> 1i32; n } != 0 { result = result.wrapping_add(1 as (u32)); } result } fn PrefixEncodeCopyDistance( mut distance_code : usize, mut num_direct_codes : usize, mut postfix_bits : usize, mut code : &mut [u16], mut extra_bits : &mut [u32 ]) { if distance_code < (16usize).wrapping_add( num_direct_codes ) { *code = distance_code as (u16); *extra_bits = 0u32; } else { let mut dist : usize = (1usize << postfix_bits.wrapping_add( 2u32 as (usize) )).wrapping_add( distance_code.wrapping_sub(16usize).wrapping_sub( num_direct_codes ) ); let mut bucket : usize = Log2FloorNonZero(dist).wrapping_sub(1u32) as (usize); let mut postfix_mask : usize = (1u32 << postfix_bits).wrapping_sub(1u32) as (usize); let mut postfix : usize = dist & postfix_mask; let mut prefix : usize = dist >> bucket & 1usize; let mut offset : usize = (2usize).wrapping_add(prefix) << bucket; let mut nbits : usize = bucket.wrapping_sub(postfix_bits); *code = (nbits << 10i32 | (16usize).wrapping_add( num_direct_codes ).wrapping_add( (2usize).wrapping_mul( nbits.wrapping_sub(1usize) ).wrapping_add( prefix ) << postfix_bits ).wrapping_add( postfix )) as (u16); *extra_bits = (dist.wrapping_sub(offset) >> postfix_bits) as (u32); } } fn GetInsertLengthCode( mut insertlen : usize ) -> u16 { if insertlen < 6usize { insertlen as (u16) } else if insertlen < 130usize { let mut nbits : u32 = Log2FloorNonZero( insertlen.wrapping_sub(2usize) ).wrapping_sub( 1u32 ); ((nbits << 1i32) as (usize)).wrapping_add( insertlen.wrapping_sub(2usize) >> nbits ).wrapping_add( 2usize ) as (u16) } else if insertlen < 2114usize { Log2FloorNonZero( insertlen.wrapping_sub(66usize) ).wrapping_add( 10u32 ) as (u16) } else if insertlen < 6210usize { 21u32 as (u16) } else if insertlen < 22594usize { 22u32 as (u16) } else { 23u32 as (u16) } } fn GetCopyLengthCode(mut copylen : usize) -> u16 { if copylen < 10usize { copylen.wrapping_sub(2usize) as (u16) } else if copylen < 134usize { let mut nbits : u32 = Log2FloorNonZero( copylen.wrapping_sub(6usize) ).wrapping_sub( 1u32 ); ((nbits << 1i32) as (usize)).wrapping_add( copylen.wrapping_sub(6usize) >> nbits ).wrapping_add( 4usize ) as (u16) } else if copylen < 2118usize { Log2FloorNonZero( copylen.wrapping_sub(70usize) ).wrapping_add( 12u32 ) as (u16) } else { 23u32 as (u16) } } fn CombineLengthCodes( mut inscode : u16, mut copycode : u16, mut use_last_distance : i32 ) -> u16 { let mut bits64 : u16 = (copycode as (u32) & 0x7u32 | (inscode as (u32) & 0x7u32) << 3i32) as (u16); if use_last_distance != 0 && (inscode as (i32) < 8i32) && (copycode as (i32) < 16i32) { if copycode as (i32) < 8i32 { bits64 as (i32) } else { bits64 as (i32) | 64i32 } as (u16) } else { let mut offset : i32 = 2i32 * ((copycode as (i32) >> 3i32) + 3i32 * (inscode as (i32) >> 3i32)); offset = (offset << 5i32) + 0x40i32 + (0x520d40i32 >> offset & 0xc0i32); (offset as (u16) as (i32) | bits64 as (i32)) as (u16) } } fn GetLengthCode( mut insertlen : usize, mut copylen : usize, mut use_last_distance : i32, mut code : &mut [u16 ]) { let mut inscode : u16 = GetInsertLengthCode(insertlen); let mut copycode : u16 = GetCopyLengthCode(copylen); *code = CombineLengthCodes(inscode,copycode,use_last_distance); } fn InitCommand( mut xself : &mut Command, mut dist : & [BrotliDistanceParams], mut insertlen : usize, mut copylen : usize, mut copylen_code_delta : i32, mut distance_code : usize ) { let mut delta : u32 = copylen_code_delta as (i8) as (u8) as (u32); (*xself).insert_len_ = insertlen as (u32); (*xself).copy_len_ = (copylen | (delta << 25i32) as (usize)) as (u32); PrefixEncodeCopyDistance( distance_code, (*dist).num_direct_distance_codes as (usize), (*dist).distance_postfix_bits as (usize), &mut (*xself).dist_prefix_ , &mut (*xself).dist_extra_ ); GetLengthCode( insertlen, (copylen as (i32) + copylen_code_delta) as (usize), if !!((*xself).dist_prefix_ as (i32) & 0x3ffi32 == 0i32) { 1i32 } else { 0i32 }, &mut (*xself).cmd_prefix_ ); } pub fn BrotliZopfliCreateCommands( num_bytes : usize, block_start : usize, max_backward_limit : usize, mut nodes : & [ZopfliNode], mut dist_cache : &mut [i32], mut last_insert_len : &mut [usize], mut params : & [BrotliEncoderParams], mut commands : &mut [Command], mut num_literals : &mut [usize ]) { let mut pos : usize = 0usize; let mut offset : u32 = (nodes[(0usize)]).u.next; let mut i : usize; let mut gap : usize = 0usize; i = 0usize; while offset != !(0u32) { { let mut next : *const ZopfliNode = &nodes[( pos.wrapping_add(offset as (usize)) as (usize) ) ]; let mut copy_length : usize = ZopfliNodeCopyLength(next) as (usize); let mut insert_length : usize = ((*next).dcode_insert_length & 0x7ffffffu32) as (usize); pos = pos.wrapping_add(insert_length); offset = (*next).u.next; if i == 0usize { insert_length = insert_length.wrapping_add(*last_insert_len); *last_insert_len = 0usize; } { let mut distance : usize = ZopfliNodeCopyDistance(next) as (usize); let mut len_code : usize = ZopfliNodeLengthCode(next) as (usize); let mut max_distance : usize = brotli_min_size_t( block_start.wrapping_add(pos), max_backward_limit ); let mut is_dictionary : i32 = if !!(distance > max_distance.wrapping_add(gap)) { 1i32 } else { 0i32 }; let mut dist_code : usize = ZopfliNodeDistanceCode(next) as (usize); InitCommand( &mut commands[(i as (usize)) ], &(*params).dist , insert_length, copy_length, len_code as (i32) - copy_length as (i32), dist_code ); if is_dictionary == 0 && (dist_code > 0usize) { dist_cache[(3usize) ]= dist_cache[( 2usize )]; dist_cache[(2usize) ]= dist_cache[( 1usize )]; dist_cache[(1usize) ]= dist_cache[( 0usize )]; dist_cache[(0usize) ]= distance as (i32); } } *num_literals = (*num_literals).wrapping_add(insert_length); pos = pos.wrapping_add(copy_length); } i = i.wrapping_add(1 as (usize)); } *last_insert_len = (*last_insert_len).wrapping_add( num_bytes.wrapping_sub(pos) ); } pub struct MemoryManager { pub alloc_func : fn(*mut std::os::raw::c_void, usize) -> *mut std::os::raw::c_void, pub free_func : fn(*mut std::os::raw::c_void, *mut std::os::raw::c_void), pub opaque : *mut std::os::raw::c_void, } fn MaxZopfliLen( mut params : & [BrotliEncoderParams ]) -> usize { (if (*params).quality <= 10i32 { 150i32 } else { 325i32 }) as (usize) } pub struct ZopfliCostModel { pub cost_cmd_ : *mut f32, pub cost_dist_ : *mut f32, pub distance_histogram_size : u32, pub literal_costs_ : *mut f32, pub min_cost_cmd_ : f32, pub num_bytes_ : usize, } pub struct PosData { pub pos : usize, pub distance_cache : *mut i32, pub costdiff : f32, pub cost : f32, } pub struct StartPosQueue { pub q_ : *mut PosData, pub idx_ : usize, } pub struct BackwardMatch { pub distance : u32, pub length_and_code : u32, } fn StoreLookaheadH10() -> usize { 128usize } fn InitZopfliCostModel( mut m : &mut [MemoryManager], mut xself : &mut ZopfliCostModel, mut dist : & [BrotliDistanceParams], mut num_bytes : usize ) { let mut distance_histogram_size : u32 = (*dist).alphabet_size; if distance_histogram_size > 544u32 { distance_histogram_size = 544u32; } (*xself).num_bytes_ = num_bytes; (*xself).literal_costs_ = if num_bytes.wrapping_add( 2usize ) > 0usize { BrotliAllocate( m, num_bytes.wrapping_add(2usize).wrapping_mul( std::mem::size_of::() ) ) } else { 0i32 }; (*xself).cost_dist_ = if (*dist).alphabet_size > 0u32 { BrotliAllocate( m, ((*dist).alphabet_size as (usize)).wrapping_mul( std::mem::size_of::() ) ) } else { 0i32 }; (*xself).distance_histogram_size = distance_histogram_size; if !(0i32 == 0) { } } fn FastLog2(mut v : usize) -> f64 { if v < std::mem::size_of::<*const f32>().wrapping_div( std::mem::size_of::() ) { return kLog2Table[(v as (usize)) ]as (f64); } log2(v as (f64)) } fn ZopfliCostModelSetFromLiteralCosts( mut xself : &mut ZopfliCostModel, mut position : usize, mut ringbuffer : & [u8], mut ringbuffer_mask : usize ) { let mut literal_costs : *mut f32 = (*xself).literal_costs_; let mut literal_carry : f32 = 0.0f64 as (f32); let mut cost_dist : *mut f32 = (*xself).cost_dist_; let mut cost_cmd : *mut f32 = (*xself).cost_cmd_; let mut num_bytes : usize = (*xself).num_bytes_; let mut i : usize; BrotliEstimateBitCostsForLiterals( position, num_bytes, ringbuffer_mask, ringbuffer, &mut literal_costs[(1usize) ] ); literal_costs[(0usize) ]= 0.0f64 as (f32); i = 0usize; while i < num_bytes { { literal_carry = literal_carry + literal_costs[( i.wrapping_add(1usize) as (usize) )]; literal_costs[( i.wrapping_add(1usize) as (usize) ) ]= literal_costs[(i as (usize)) ]+ literal_carry; literal_carry = literal_carry - (literal_costs[( i.wrapping_add(1usize) as (usize) ) ]- literal_costs[(i as (usize))]); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < 704usize { { cost_cmd[(i as (usize)) ]= FastLog2( (11u32).wrapping_add( i as (u32) ) as (usize) ) as (f32); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < (*xself).distance_histogram_size as (usize) { { cost_dist[(i as (usize)) ]= FastLog2( (20u32).wrapping_add( i as (u32) ) as (usize) ) as (f32); } i = i.wrapping_add(1 as (usize)); } (*xself).min_cost_cmd_ = FastLog2(11usize) as (f32); } fn InitStartPosQueue(mut xself : &mut StartPosQueue) { (*xself).idx_ = 0usize; } fn BrotliUnalignedRead64( mut p : & [std::os::raw::c_void ]) -> usize { *(p ) } fn FindMatchLengthWithLimit( mut s1 : & [u8], mut s2 : & [u8], mut limit : usize ) -> usize { let mut matched : usize = 0usize; let mut limit2 : usize = (limit >> 3i32).wrapping_add(1usize); while { limit2 = limit2.wrapping_sub(1 as (usize)); limit2 } != 0 { if BrotliUnalignedRead64( s2 ) == BrotliUnalignedRead64( s1[(matched as (usize)) ..] ) { s2 = s2[(8usize)..]; matched = matched.wrapping_add(8usize); } else { let mut x : usize = BrotliUnalignedRead64( s2 ) ^ BrotliUnalignedRead64( s1[(matched as (usize)) ..] ); let mut matching_bits : usize = ctzll(x) as (usize); matched = matched.wrapping_add(matching_bits >> 3i32); return matched; } } limit = (limit & 7usize).wrapping_add(1usize); while { limit = limit.wrapping_sub(1 as (usize)); limit } != 0 { if s1[(matched as (usize)) ]as (i32) == *s2 as (i32) { s2 = s2[(1 as (usize))..]; matched = matched.wrapping_add(1 as (usize)); } else { return matched; } } matched } fn InitBackwardMatch( mut xself : &mut BackwardMatch, mut dist : usize, mut len : usize ) { (*xself).distance = dist as (u32); (*xself).length_and_code = (len << 5i32) as (u32); } pub struct H10 { pub window_mask_ : usize, pub buckets_ : *mut u32, pub invalid_pos_ : u32, } fn BrotliUnalignedRead32( mut p : & [std::os::raw::c_void ]) -> u32 { *(p ) } fn HashBytesH10(mut data : & [u8]) -> u32 { let mut h : u32 = BrotliUnalignedRead32( data ).wrapping_mul( kHashMul32 ); h >> 32i32 - 17i32 } fn ForestH10(mut xself : &mut H10) -> *mut u32 { &mut xself[(1usize) ] } fn LeftChildIndexH10( mut xself : &mut H10, pos : usize ) -> usize { (2usize).wrapping_mul(pos & (*xself).window_mask_) } fn RightChildIndexH10( mut xself : &mut H10, pos : usize ) -> usize { (2usize).wrapping_mul( pos & (*xself).window_mask_ ).wrapping_add( 1usize ) } fn StoreAndFindMatchesH10( mut xself : &mut H10, data : & [u8], cur_ix : usize, ring_buffer_mask : usize, max_length : usize, max_backward : usize, best_len : &mut [usize], mut matches : &mut [BackwardMatch ]) -> *mut BackwardMatch { let cur_ix_masked : usize = cur_ix & ring_buffer_mask; let max_comp_len : usize = brotli_min_size_t(max_length,128usize); let should_reroot_tree : i32 = if !!(max_length >= 128usize) { 1i32 } else { 0i32 }; let key : u32 = HashBytesH10( &data[(cur_ix_masked as (usize)) ] ); let mut forest : *mut u32 = ForestH10(xself); let mut prev_ix : usize = *(*xself).buckets_[(key as (usize)) ..]as (usize); let mut node_left : usize = LeftChildIndexH10(xself,cur_ix); let mut node_right : usize = RightChildIndexH10(xself,cur_ix); let mut best_len_left : usize = 0usize; let mut best_len_right : usize = 0usize; let mut depth_remaining : usize; if should_reroot_tree != 0 { *(*xself).buckets_[(key as (usize)) ..]= cur_ix as (u32); } depth_remaining = 64usize; 'break16: loop { { let backward : usize = cur_ix.wrapping_sub(prev_ix); let prev_ix_masked : usize = prev_ix & ring_buffer_mask; if backward == 0usize || backward > max_backward || depth_remaining == 0usize { if should_reroot_tree != 0 { forest[(node_left as (usize)) ]= (*xself).invalid_pos_; forest[(node_right as (usize)) ]= (*xself).invalid_pos_; } break 'break16; } { let cur_len : usize = brotli_min_size_t(best_len_left,best_len_right); let mut len : usize; len = cur_len.wrapping_add( FindMatchLengthWithLimit( &data[( cur_ix_masked.wrapping_add(cur_len) as (usize) ) ], &data[( prev_ix_masked.wrapping_add(cur_len) as (usize) ) ], max_length.wrapping_sub(cur_len) ) ); if !matches.is_null() && (len > *best_len) { *best_len = len; InitBackwardMatch( { let _old = matches; matches = matches[(1 as (usize))..]; _old }, backward, len ); } if len >= max_comp_len { if should_reroot_tree != 0 { forest[(node_left as (usize)) ]= forest[( LeftChildIndexH10( xself, prev_ix ) as (usize) )]; forest[(node_right as (usize)) ]= forest[( RightChildIndexH10( xself, prev_ix ) as (usize) )]; } break 'break16; } if data[( cur_ix_masked.wrapping_add(len) as (usize) ) ]as (i32) > data[( prev_ix_masked.wrapping_add(len) as (usize) ) ]as (i32) { best_len_left = len; if should_reroot_tree != 0 { forest[(node_left as (usize)) ]= prev_ix as (u32); } node_left = RightChildIndexH10(xself,prev_ix); prev_ix = forest[(node_left as (usize)) ]as (usize); } else { best_len_right = len; if should_reroot_tree != 0 { forest[(node_right as (usize)) ]= prev_ix as (u32); } node_right = LeftChildIndexH10(xself,prev_ix); prev_ix = forest[(node_right as (usize)) ]as (usize); } } } depth_remaining = depth_remaining.wrapping_sub(1 as (usize)); } matches } pub struct Struct18 { pub params : BrotliHasherParams, pub is_prepared_ : i32, pub dict_num_lookups : usize, pub dict_num_matches : usize, } fn GetHasherCommon( mut handle : &mut [u8 ]) -> *mut Struct18 { handle } fn SelfH10(mut handle : &mut [u8]) -> *mut H10 { &mut *GetHasherCommon(handle).offset( 1i32 as (isize) ) } fn brotli_max_size_t( mut a : usize, mut b : usize ) -> usize { if a > b { a } else { b } } fn InitDictionaryBackwardMatch( mut xself : &mut BackwardMatch, mut dist : usize, mut len : usize, mut len_code : usize ) { (*xself).distance = dist as (u32); (*xself).length_and_code = (len << 5i32 | if len == len_code { 0usize } else { len_code }) as (u32); } fn FindAllMatchesH10( mut handle : &mut [u8], mut dictionary : & [BrotliEncoderDictionary], mut data : & [u8], ring_buffer_mask : usize, cur_ix : usize, max_length : usize, max_backward : usize, gap : usize, mut params : & [BrotliEncoderParams], mut matches : &mut [BackwardMatch ]) -> usize { let orig_matches : *mut BackwardMatch = matches; let cur_ix_masked : usize = cur_ix & ring_buffer_mask; let mut best_len : usize = 1usize; let short_match_max_backward : usize = (if (*params).quality != 11i32 { 16i32 } else { 64i32 }) as (usize); let mut stop : usize = cur_ix.wrapping_sub(short_match_max_backward); let mut dict_matches : *mut u32; let mut i : usize; if cur_ix < short_match_max_backward { stop = 0usize; } i = cur_ix.wrapping_sub(1usize); 'break14: while i > stop && (best_len <= 2usize) { 'continue15: loop { { let mut prev_ix : usize = i; let backward : usize = cur_ix.wrapping_sub(prev_ix); if backward > max_backward { break 'break14; } prev_ix = prev_ix & ring_buffer_mask; if data[(cur_ix_masked as (usize)) ]as (i32) != data[( prev_ix as (usize) ) ]as (i32) || data[( cur_ix_masked.wrapping_add( 1usize ) as (usize) ) ]as (i32) != data[( prev_ix.wrapping_add( 1usize ) as (usize) ) ]as (i32) { break 'continue15; } { let len : usize = FindMatchLengthWithLimit( &data[(prev_ix as (usize)) ], &data[(cur_ix_masked as (usize)) ], max_length ); if len > best_len { best_len = len; InitBackwardMatch( { let _old = matches; matches = matches[(1 as (usize))..]; _old }, backward, len ); } } } break; } i = i.wrapping_sub(1 as (usize)); } if best_len < max_length { matches = StoreAndFindMatchesH10( SelfH10(handle), data, cur_ix, ring_buffer_mask, max_length, max_backward, &mut best_len , matches ); } i = 0usize; while i <= 37usize { { dict_matches[(i as (usize)) ]= kInvalidMatch; } i = i.wrapping_add(1 as (usize)); } { let mut minlen : usize = brotli_max_size_t( 4usize, best_len.wrapping_add(1usize) ); if BrotliFindAllStaticDictionaryMatches( dictionary, &data[(cur_ix_masked as (usize)) ], minlen, max_length, &mut dict_matches[(0usize) ] ) != 0 { let mut maxlen : usize = brotli_min_size_t(37usize,max_length); let mut l : usize; l = minlen; while l <= maxlen { { let mut dict_id : u32 = dict_matches[(l as (usize))]; if dict_id < kInvalidMatch { let mut distance : usize = max_backward.wrapping_add(gap).wrapping_add( (dict_id >> 5i32) as (usize) ).wrapping_add( 1usize ); if distance <= (*params).dist.max_distance { InitDictionaryBackwardMatch( { let _old = matches; matches = matches[(1 as (usize))..]; _old }, distance, l, (dict_id & 31u32) as (usize) ); } } } l = l.wrapping_add(1 as (usize)); } } } ((matches as (isize)).wrapping_sub( orig_matches as (isize) ) / std::mem::size_of::<*mut BackwardMatch>( ) as (isize)) as (usize) } fn BackwardMatchLength( mut xself : & BackwardMatch ) -> usize { ((*xself).length_and_code >> 5i32) as (usize) } fn MaxZopfliCandidates( mut params : & [BrotliEncoderParams ]) -> usize { (if (*params).quality <= 10i32 { 1i32 } else { 5i32 }) as (usize) } fn ComputeDistanceShortcut( block_start : usize, pos : usize, max_backward : usize, gap : usize, mut nodes : & [ZopfliNode ]) -> u32 { let clen : usize = ZopfliNodeCopyLength( &nodes[(pos as (usize)) ] ) as (usize); let ilen : usize = ((nodes[( pos as (usize) )]).dcode_insert_length & 0x7ffffffu32) as (usize); let dist : usize = ZopfliNodeCopyDistance( &nodes[(pos as (usize)) ] ) as (usize); if pos == 0usize { 0u32 } else if dist.wrapping_add(clen) <= block_start.wrapping_add( pos ).wrapping_add( gap ) && (dist <= max_backward.wrapping_add( gap )) && (ZopfliNodeDistanceCode( &nodes[( pos as (usize) ) ] ) > 0u32) { pos as (u32) } else { (nodes[( pos.wrapping_sub(clen).wrapping_sub(ilen) as (usize) )]).u.shortcut } } fn ZopfliCostModelGetLiteralCosts( mut xself : & ZopfliCostModel, mut from : usize, mut to : usize ) -> f32 { *(*xself).literal_costs_[( to as (usize) ) ..]- *(*xself).literal_costs_[(from as (usize)) ..]}fn ComputeDistanceCache( pos : usize, mut starting_dist_cache : & [i32], mut nodes : & [ZopfliNode], mut dist_cache : &mut [i32 ]) { let mut idx : i32 = 0i32; let mut p : usize = (nodes[(pos as (usize))]).u.shortcut as (usize); while idx < 4i32 && (p > 0usize) { let ilen : usize = ((nodes[( p as (usize) )]).dcode_insert_length & 0x7ffffffu32) as (usize); let clen : usize = ZopfliNodeCopyLength( &nodes[(p as (usize)) ] ) as (usize); let dist : usize = ZopfliNodeCopyDistance( &nodes[(p as (usize)) ] ) as (usize); dist_cache[( { let _old = idx; idx = idx + 1; _old } as (usize) ) ]= dist as (i32); p = (nodes[( p.wrapping_sub(clen).wrapping_sub(ilen) as (usize) )]).u.shortcut as (usize); } while idx < 4i32 { { dist_cache[(idx as (usize)) ]= *{ let _old = starting_dist_cache; starting_dist_cache = starting_dist_cache[( 1 as (usize) )..]; _old }; } idx = idx + 1; } } fn StartPosQueueSize( mut xself : & StartPosQueue ) -> usize { brotli_min_size_t((*xself).idx_,8usize) } fn StartPosQueuePush( mut xself : &mut StartPosQueue, mut posdata : & [PosData ]) { let mut offset : usize = !{ let _old = (*xself).idx_; (*xself).idx_ = (*xself).idx_.wrapping_add(1 as (usize)); _old } & 7usize; let mut len : usize = StartPosQueueSize(xself ); let mut i : usize; let mut q : *mut PosData = (*xself).q_; q[(offset as (usize)) ]= *posdata; i = 1usize; while i < len { { if (q[( (offset & 7usize) as (usize) )]).costdiff > (q[( (offset.wrapping_add( 1usize ) & 7usize) as (usize) )]).costdiff { let mut __brotli_swap_tmp : PosData = q[((offset & 7usize) as (usize))]; q[((offset & 7usize) as (usize)) ]= q[( (offset.wrapping_add( 1usize ) & 7usize) as (usize) )]; q[( (offset.wrapping_add(1usize) & 7usize) as (usize) ) ]= __brotli_swap_tmp; } offset = offset.wrapping_add(1 as (usize)); } i = i.wrapping_add(1 as (usize)); } } fn EvaluateNode( block_start : usize, pos : usize, max_backward_limit : usize, gap : usize, mut starting_dist_cache : & [i32], mut model : & [ZopfliCostModel], mut queue : &mut [StartPosQueue], mut nodes : &mut [ZopfliNode ]) { let mut node_cost : f32 = (nodes[(pos as (usize))]).u.cost; (nodes[( pos as (usize) )]).u.shortcut = ComputeDistanceShortcut( block_start, pos, max_backward_limit, gap, nodes ); if node_cost <= ZopfliCostModelGetLiteralCosts( model, 0usize, pos ) { let mut posdata : PosData; posdata.pos = pos; posdata.cost = node_cost; posdata.costdiff = node_cost - ZopfliCostModelGetLiteralCosts( model, 0usize, pos ); ComputeDistanceCache( pos, starting_dist_cache, nodes , posdata.distance_cache ); StartPosQueuePush( queue, &mut posdata ); } } fn StartPosQueueAt( mut xself : & StartPosQueue, mut k : usize ) -> *const PosData { &mut *(*xself).q_[( (k.wrapping_sub((*xself).idx_) & 7usize) as (usize) ) ..] } fn ZopfliCostModelGetMinCostCmd( mut xself : & ZopfliCostModel ) -> f32 { (*xself).min_cost_cmd_ } fn ComputeMinimumCopyLength( start_cost : f32, mut nodes : & [ZopfliNode], num_bytes : usize, pos : usize ) -> usize { let mut min_cost : f32 = start_cost; let mut len : usize = 2usize; let mut next_len_bucket : usize = 4usize; let mut next_len_offset : usize = 10usize; while pos.wrapping_add(len) <= num_bytes && ((nodes[( pos.wrapping_add(len) as (usize) )]).u.cost <= min_cost) { len = len.wrapping_add(1 as (usize)); if len == next_len_offset { min_cost = min_cost + 1.0f32; next_len_offset = next_len_offset.wrapping_add(next_len_bucket); next_len_bucket = next_len_bucket.wrapping_mul(2usize); } } len } fn GetInsertExtra(mut inscode : u16) -> u32 { kInsExtra[(inscode as (usize)) ]}fn ZopfliCostModelGetDistanceCost( mut xself : & ZopfliCostModel, mut distcode : usize ) -> f32 { *(*xself).cost_dist_[(distcode as (usize)) ..]}fn GetCopyExtra(mut copycode : u16) -> u32 { kCopyExtra[(copycode as (usize)) ]}fn ZopfliCostModelGetCommandCost( mut xself : & ZopfliCostModel, mut cmdcode : u16 ) -> f32 { *(*xself).cost_cmd_[(cmdcode as (usize)) ..]}fn UpdateZopfliNode( mut nodes : &mut [ZopfliNode], mut pos : usize, mut start_pos : usize, mut len : usize, mut len_code : usize, mut dist : usize, mut short_code : usize, mut cost : f32 ) { let mut next : *mut ZopfliNode = &mut nodes[( pos.wrapping_add(len) as (usize) ) ]; (*next).length = (len | len.wrapping_add( 9u32 as (usize) ).wrapping_sub( len_code ) << 25i32) as (u32); (*next).distance = dist as (u32); (*next).dcode_insert_length = (short_code << 27i32 | pos.wrapping_sub( start_pos )) as (u32); (*next).u.cost = cost; } fn BackwardMatchLengthCode( mut xself : & BackwardMatch ) -> usize { let mut code : usize = ((*xself).length_and_code & 31u32) as (usize); if code != 0 { code } else { BackwardMatchLength(xself) } } fn UpdateNodes( num_bytes : usize, block_start : usize, pos : usize, mut ringbuffer : & [u8], ringbuffer_mask : usize, mut params : & [BrotliEncoderParams], max_backward_limit : usize, mut starting_dist_cache : & [i32], num_matches : usize, mut matches : & [BackwardMatch], mut model : & [ZopfliCostModel], mut queue : &mut [StartPosQueue], mut nodes : &mut [ZopfliNode ]) -> usize { let cur_ix : usize = block_start.wrapping_add(pos); let cur_ix_masked : usize = cur_ix & ringbuffer_mask; let max_distance : usize = brotli_min_size_t(cur_ix,max_backward_limit); let max_len : usize = num_bytes.wrapping_sub(pos); let max_zopfli_len : usize = MaxZopfliLen(params); let max_iters : usize = MaxZopfliCandidates(params); let mut min_len : usize; let mut result : usize = 0usize; let mut k : usize; let mut gap : usize = 0usize; EvaluateNode( block_start, pos, max_backward_limit, gap, starting_dist_cache, model, queue, nodes ); { let mut posdata : *const PosData = StartPosQueueAt(queue ,0usize); let mut min_cost : f32 = (*posdata).cost + ZopfliCostModelGetMinCostCmd( model ) + ZopfliCostModelGetLiteralCosts(model,(*posdata).pos,pos); min_len = ComputeMinimumCopyLength( min_cost, nodes , num_bytes, pos ); } k = 0usize; while k < max_iters && (k < StartPosQueueSize( queue )) { 'continue28: loop { { let mut posdata : *const PosData = StartPosQueueAt(queue ,k); let start : usize = (*posdata).pos; let inscode : u16 = GetInsertLengthCode(pos.wrapping_sub(start)); let start_costdiff : f32 = (*posdata).costdiff; let base_cost : f32 = start_costdiff + GetInsertExtra( inscode ) as (f32) + ZopfliCostModelGetLiteralCosts( model, 0usize, pos ); let mut best_len : usize = min_len.wrapping_sub(1usize); let mut j : usize = 0usize; 'break29: while j < 16usize && (best_len < max_len) { 'continue30: loop { { let idx : usize = kDistanceCacheIndex[(j as (usize)) ]as (usize); let backward : usize = (*(*posdata).distance_cache[( idx as (usize) ) ..]+ kDistanceCacheOffset[(j as (usize)) ])as (usize); let mut prev_ix : usize = cur_ix.wrapping_sub(backward); let mut len : usize = 0usize; let mut continuation : u8 = ringbuffer[( cur_ix_masked.wrapping_add(best_len) as (usize) )]; if cur_ix_masked.wrapping_add(best_len) > ringbuffer_mask { break 'break29; } if backward > max_distance.wrapping_add(gap) { break 'continue30; } if backward <= max_distance { if prev_ix >= cur_ix { break 'continue30; } prev_ix = prev_ix & ringbuffer_mask; if prev_ix.wrapping_add( best_len ) > ringbuffer_mask || continuation as (i32) != ringbuffer[( prev_ix.wrapping_add( best_len ) as (usize) ) ]as (i32) { break 'continue30; } len = FindMatchLengthWithLimit( &ringbuffer[(prev_ix as (usize)) ], &ringbuffer[( cur_ix_masked as (usize) ) ], max_len ); } else { break 'continue30; } { let dist_cost : f32 = base_cost + ZopfliCostModelGetDistanceCost(model,j); let mut l : usize; l = best_len.wrapping_add(1usize); while l <= len { { let copycode : u16 = GetCopyLengthCode(l); let cmdcode : u16 = CombineLengthCodes( inscode, copycode, (j == 0usize) as (i32) ); let cost : f32 = (if cmdcode as (i32) < 128i32 { base_cost } else { dist_cost }) + GetCopyExtra( copycode ) as (f32) + ZopfliCostModelGetCommandCost( model, cmdcode ); if cost < (nodes[( pos.wrapping_add(l) as (usize) )]).u.cost { UpdateZopfliNode( nodes, pos, start, l, l, backward, j.wrapping_add(1usize), cost ); result = brotli_max_size_t(result,l); } best_len = l; } l = l.wrapping_add(1 as (usize)); } } } break; } j = j.wrapping_add(1 as (usize)); } if k >= 2usize { break 'continue28; } { let mut len : usize = min_len; j = 0usize; while j < num_matches { { let mut match_ : BackwardMatch = matches[(j as (usize))]; let mut dist : usize = match_.distance as (usize); let mut is_dictionary_match : i32 = if !!(dist > max_distance.wrapping_add(gap)) { 1i32 } else { 0i32 }; let mut dist_code : usize = dist.wrapping_add(16usize).wrapping_sub( 1usize ); let mut dist_symbol : u16; let mut distextra : u32; let mut distnumextra : u32; let mut dist_cost : f32; let mut max_match_len : usize; PrefixEncodeCopyDistance( dist_code, (*params).dist.num_direct_distance_codes as (usize), (*params).dist.distance_postfix_bits as (usize), &mut dist_symbol , &mut distextra ); distnumextra = (dist_symbol as (i32) >> 10i32) as (u32); dist_cost = base_cost + distnumextra as (f32) + ZopfliCostModelGetDistanceCost( model, (dist_symbol as (i32) & 0x3ffi32) as (usize) ); max_match_len = BackwardMatchLength( &mut match_ ); if len < max_match_len && (is_dictionary_match != 0 || max_match_len > max_zopfli_len) { len = max_match_len; } while len <= max_match_len { { let len_code : usize = if is_dictionary_match != 0 { BackwardMatchLengthCode( &mut match_ ) } else { len }; let copycode : u16 = GetCopyLengthCode(len_code); let cmdcode : u16 = CombineLengthCodes(inscode,copycode,0i32); let cost : f32 = dist_cost + GetCopyExtra( copycode ) as (f32) + ZopfliCostModelGetCommandCost( model, cmdcode ); if cost < (nodes[( pos.wrapping_add(len) as (usize) )]).u.cost { UpdateZopfliNode( nodes, pos, start, len, len_code, dist, 0usize, cost ); result = brotli_max_size_t(result,len); } } len = len.wrapping_add(1 as (usize)); } } j = j.wrapping_add(1 as (usize)); } } } break; } k = k.wrapping_add(1 as (usize)); } result } fn StoreH10( mut handle : &mut [u8], mut data : & [u8], mask : usize, ix : usize ) { let mut xself : *mut H10 = SelfH10(handle); let max_backward : usize = (*xself).window_mask_.wrapping_sub(16usize).wrapping_add( 1usize ); StoreAndFindMatchesH10( xself, data, ix, mask, 128usize, max_backward, 0i32 , 0i32 ); } fn StoreRangeH10( mut handle : &mut [u8], mut data : & [u8], mask : usize, ix_start : usize, ix_end : usize ) { let mut i : usize = ix_start; let mut j : usize = ix_start; if ix_start.wrapping_add(63usize) <= ix_end { i = ix_end.wrapping_sub(63usize); } if ix_start.wrapping_add(512usize) <= i { while j < i { { StoreH10(handle,data,mask,j); } j = j.wrapping_add(8usize); } } while i < ix_end { { StoreH10(handle,data,mask,i); } i = i.wrapping_add(1 as (usize)); } } fn HashTypeLengthH10() -> usize { 4usize } fn CleanupZopfliCostModel( mut m : &mut [MemoryManager], mut xself : &mut ZopfliCostModel ) { { BrotliFree( m, (*xself).literal_costs_ ); (*xself).literal_costs_ = 0i32 ; } { BrotliFree(m,(*xself).cost_dist_ ); (*xself).cost_dist_ = 0i32 ; } } fn ZopfliNodeCommandLength( mut xself : & ZopfliNode ) -> u32 { ZopfliNodeCopyLength(xself).wrapping_add( (*xself).dcode_insert_length & 0x7ffffffu32 ) } fn ComputeShortestPathFromNodes( mut num_bytes : usize, mut nodes : &mut [ZopfliNode ]) -> usize { let mut index : usize = num_bytes; let mut num_commands : usize = 0usize; while (nodes[( index as (usize) )]).dcode_insert_length & 0x7ffffffu32 == 0u32 && ((nodes[( index as (usize) )]).length == 1u32) { index = index.wrapping_sub(1 as (usize)); } (nodes[(index as (usize))]).u.next = !(0u32); while index != 0usize { let mut len : usize = ZopfliNodeCommandLength( &mut nodes[( index as (usize) ) ] ) as (usize); index = index.wrapping_sub(len); (nodes[(index as (usize))]).u.next = len as (u32); num_commands = num_commands.wrapping_add(1 as (usize)); } num_commands } pub fn BrotliZopfliComputeShortestPath( mut m : &mut [MemoryManager], mut num_bytes : usize, mut position : usize, mut ringbuffer : & [u8], mut ringbuffer_mask : usize, mut params : & [BrotliEncoderParams], max_backward_limit : usize, mut dist_cache : & [i32], mut hasher : &mut [u8], mut nodes : &mut [ZopfliNode ]) -> usize { let max_zopfli_len : usize = MaxZopfliLen(params); let mut model : ZopfliCostModel; let mut queue : StartPosQueue; let mut matches : *mut BackwardMatch; let store_end : usize = if num_bytes >= StoreLookaheadH10() { position.wrapping_add(num_bytes).wrapping_sub( StoreLookaheadH10() ).wrapping_add( 1usize ) } else { position }; let mut i : usize; let mut gap : usize = 0usize; let mut lz_matches_offset : usize = 0usize; (nodes[(0usize)]).length = 0u32; (nodes[(0usize)]).u.cost = 0i32 as (f32); InitZopfliCostModel( m, &mut model , &(*params).dist , num_bytes ); if !(0i32 == 0) { return 0usize; } ZopfliCostModelSetFromLiteralCosts( &mut model , position, ringbuffer, ringbuffer_mask ); InitStartPosQueue(&mut queue ); i = 0usize; while i.wrapping_add(HashTypeLengthH10()).wrapping_sub( 1usize ) < num_bytes { { let pos : usize = position.wrapping_add(i); let max_distance : usize = brotli_min_size_t(pos,max_backward_limit); let mut skip : usize; let mut num_matches : usize = FindAllMatchesH10( hasher, &(*params).dictionary , ringbuffer, ringbuffer_mask, pos, num_bytes.wrapping_sub(i), max_distance, gap, params, &mut matches[( lz_matches_offset as (usize) ) ] ); if num_matches > 0usize && (BackwardMatchLength( &mut matches[( num_matches.wrapping_sub( 1usize ) as (usize) ) ] ) > max_zopfli_len) { matches[(0usize) ]= matches[( num_matches.wrapping_sub( 1usize ) as (usize) )]; num_matches = 1usize; } skip = UpdateNodes( num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches, matches , &mut model , &mut queue , nodes ); if skip < 16384usize { skip = 0usize; } if num_matches == 1usize && (BackwardMatchLength( &mut matches[( 0usize ) ] ) > max_zopfli_len) { skip = brotli_max_size_t( BackwardMatchLength( &mut matches[( 0usize ) ] ), skip ); } if skip > 1usize { StoreRangeH10( hasher, ringbuffer, ringbuffer_mask, pos.wrapping_add(1usize), brotli_min_size_t(pos.wrapping_add(skip),store_end) ); skip = skip.wrapping_sub(1 as (usize)); while skip != 0 { i = i.wrapping_add(1 as (usize)); if i.wrapping_add(HashTypeLengthH10()).wrapping_sub( 1usize ) >= num_bytes { break; } EvaluateNode( position, i, max_backward_limit, gap, dist_cache, &mut model , &mut queue , nodes ); skip = skip.wrapping_sub(1 as (usize)); } } } i = i.wrapping_add(1 as (usize)); } CleanupZopfliCostModel(m,&mut model ); ComputeShortestPathFromNodes(num_bytes,nodes) } pub fn BrotliCreateZopfliBackwardReferences( mut m : &mut [MemoryManager], mut num_bytes : usize, mut position : usize, mut ringbuffer : & [u8], mut ringbuffer_mask : usize, mut params : & [BrotliEncoderParams], mut hasher : &mut [u8], mut dist_cache : &mut [i32], mut last_insert_len : &mut [usize], mut commands : &mut [Command], mut num_commands : &mut [usize], mut num_literals : &mut [usize ]) { let max_backward_limit : usize = (1usize << (*params).lgwin).wrapping_sub( 16usize ); let mut nodes : *mut ZopfliNode; nodes = if num_bytes.wrapping_add( 1usize ) > 0usize { BrotliAllocate( m, num_bytes.wrapping_add(1usize).wrapping_mul( std::mem::size_of::() ) ) } else { 0i32 }; if !(0i32 == 0) { return; } BrotliInitZopfliNodes( nodes, num_bytes.wrapping_add(1usize) ); *num_commands = (*num_commands).wrapping_add( BrotliZopfliComputeShortestPath( m, num_bytes, position, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache , hasher, nodes ) ); if !(0i32 == 0) { return; } BrotliZopfliCreateCommands( num_bytes, position, max_backward_limit, nodes , dist_cache, last_insert_len, params, commands, num_literals ); { BrotliFree(m,nodes ); nodes = 0i32 ; } } fn CommandCopyLen(mut xself : & Command) -> u32 { (*xself).copy_len_ & 0x1ffffffu32 } fn SetCost( mut histogram : & [u32], mut histogram_size : usize, mut literal_histogram : i32, mut cost : &mut [f32 ]) { let mut sum : usize = 0usize; let mut missing_symbol_sum : usize; let mut log2sum : f32; let mut missing_symbol_cost : f32; let mut i : usize; i = 0usize; while i < histogram_size { { sum = sum.wrapping_add(histogram[(i as (usize)) ]as (usize)); } i = i.wrapping_add(1 as (usize)); } log2sum = FastLog2(sum) as (f32); missing_symbol_sum = sum; if literal_histogram == 0 { i = 0usize; while i < histogram_size { { if histogram[(i as (usize)) ]== 0u32 { missing_symbol_sum = missing_symbol_sum.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } } missing_symbol_cost = FastLog2( missing_symbol_sum ) as (f32) + 2i32 as (f32); i = 0usize; while i < histogram_size { 'continue56: loop { { if histogram[(i as (usize)) ]== 0u32 { cost[(i as (usize)) ]= missing_symbol_cost; break 'continue56; } cost[(i as (usize)) ]= log2sum - FastLog2( histogram[( i as (usize) ) ]as (usize) ) as (f32); if cost[(i as (usize)) ]< 1i32 as (f32) { cost[(i as (usize)) ]= 1i32 as (f32); } } break; } i = i.wrapping_add(1 as (usize)); } } fn brotli_min_float( mut a : f32, mut b : f32 ) -> f32 { if a < b { a } else { b } } fn ZopfliCostModelSetFromCommands( mut xself : &mut ZopfliCostModel, mut position : usize, mut ringbuffer : & [u8], mut ringbuffer_mask : usize, mut commands : & [Command], mut num_commands : usize, mut last_insert_len : usize ) { let mut histogram_literal : *mut u32; let mut histogram_cmd : *mut u32; let mut histogram_dist : *mut u32; let mut cost_literal : *mut f32; let mut pos : usize = position.wrapping_sub(last_insert_len); let mut min_cost_cmd : f32 = kInfinity; let mut i : usize; let mut cost_cmd : *mut f32 = (*xself).cost_cmd_; memset( histogram_literal , 0i32, std::mem::size_of::<*mut u32>() ); memset( histogram_cmd , 0i32, std::mem::size_of::<*mut u32>() ); memset( histogram_dist , 0i32, std::mem::size_of::<*mut u32>() ); i = 0usize; while i < num_commands { { let mut inslength : usize = (commands[(i as (usize))]).insert_len_ as (usize); let mut copylength : usize = CommandCopyLen( &commands[(i as (usize)) ] ) as (usize); let mut distcode : usize = ((commands[( i as (usize) )]).dist_prefix_ as (i32) & 0x3ffi32) as (usize); let mut cmdcode : usize = (commands[(i as (usize))]).cmd_prefix_ as (usize); let mut j : usize; { let _rhs = 1; let _lhs = &mut histogram_cmd[(cmdcode as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } if cmdcode >= 128usize { let _rhs = 1; let _lhs = &mut histogram_dist[(distcode as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } j = 0usize; while j < inslength { { let _rhs = 1; let _lhs = &mut histogram_literal[( ringbuffer[( (pos.wrapping_add(j) & ringbuffer_mask) as (usize) ) ]as (usize) )]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } j = j.wrapping_add(1 as (usize)); } pos = pos.wrapping_add(inslength.wrapping_add(copylength)); } i = i.wrapping_add(1 as (usize)); } SetCost( histogram_literal , 256usize, 1i32, cost_literal ); SetCost( histogram_cmd , 704usize, 0i32, cost_cmd ); SetCost( histogram_dist , (*xself).distance_histogram_size as (usize), 0i32, (*xself).cost_dist_ ); i = 0usize; while i < 704usize { { min_cost_cmd = brotli_min_float( min_cost_cmd, cost_cmd[(i as (usize))]); } i = i.wrapping_add(1 as (usize)); } (*xself).min_cost_cmd_ = min_cost_cmd; { let mut literal_costs : *mut f32 = (*xself).literal_costs_; let mut literal_carry : f32 = 0.0f64 as (f32); let mut num_bytes : usize = (*xself).num_bytes_; literal_costs[(0usize) ]= 0.0f64 as (f32); i = 0usize; while i < num_bytes { { literal_carry = literal_carry + cost_literal[( ringbuffer[( (position.wrapping_add( i ) & ringbuffer_mask) as (usize) ) ]as (usize) )]; literal_costs[( i.wrapping_add(1usize) as (usize) ) ]= literal_costs[(i as (usize)) ]+ literal_carry; literal_carry = literal_carry - (literal_costs[( i.wrapping_add(1usize) as (usize) ) ]- literal_costs[(i as (usize))]); } i = i.wrapping_add(1 as (usize)); } } } fn ZopfliIterate( mut num_bytes : usize, mut position : usize, mut ringbuffer : & [u8], mut ringbuffer_mask : usize, mut params : & [BrotliEncoderParams], max_backward_limit : usize, gap : usize, mut dist_cache : & [i32], mut model : & [ZopfliCostModel], mut num_matches : & [u32], mut matches : & [BackwardMatch], mut nodes : &mut [ZopfliNode ]) -> usize { let max_zopfli_len : usize = MaxZopfliLen(params); let mut queue : StartPosQueue; let mut cur_match_pos : usize = 0usize; let mut i : usize; (nodes[(0usize)]).length = 0u32; (nodes[(0usize)]).u.cost = 0i32 as (f32); InitStartPosQueue(&mut queue ); i = 0usize; while i.wrapping_add(3usize) < num_bytes { { let mut skip : usize = UpdateNodes( num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches[(i as (usize)) ]as (usize), &matches[( cur_match_pos as (usize) ) ], model, &mut queue , nodes ); if skip < 16384usize { skip = 0usize; } cur_match_pos = cur_match_pos.wrapping_add( num_matches[(i as (usize)) ]as (usize) ); if num_matches[( i as (usize) ) ]== 1u32 && (BackwardMatchLength( &matches[( cur_match_pos.wrapping_sub( 1usize ) as (usize) ) ] ) > max_zopfli_len) { skip = brotli_max_size_t( BackwardMatchLength( &matches[( cur_match_pos.wrapping_sub(1usize) as (usize) ) ] ), skip ); } if skip > 1usize { skip = skip.wrapping_sub(1 as (usize)); while skip != 0 { i = i.wrapping_add(1 as (usize)); if i.wrapping_add(3usize) >= num_bytes { break; } EvaluateNode( position, i, max_backward_limit, gap, dist_cache, model, &mut queue , nodes ); cur_match_pos = cur_match_pos.wrapping_add( num_matches[(i as (usize)) ]as (usize) ); skip = skip.wrapping_sub(1 as (usize)); } } } i = i.wrapping_add(1 as (usize)); } ComputeShortestPathFromNodes(num_bytes,nodes) } pub fn BrotliCreateHqZopfliBackwardReferences( mut m : &mut [MemoryManager], mut num_bytes : usize, mut position : usize, mut ringbuffer : & [u8], mut ringbuffer_mask : usize, mut params : & [BrotliEncoderParams], mut hasher : &mut [u8], mut dist_cache : &mut [i32], mut last_insert_len : &mut [usize], mut commands : &mut [Command], mut num_commands : &mut [usize], mut num_literals : &mut [usize ]) { let max_backward_limit : usize = (1usize << (*params).lgwin).wrapping_sub( 16usize ); let mut num_matches : *mut u32 = if num_bytes > 0usize { BrotliAllocate( m, num_bytes.wrapping_mul(std::mem::size_of::()) ) } else { 0i32 }; let mut matches_size : usize = (4usize).wrapping_mul(num_bytes); let store_end : usize = if num_bytes >= StoreLookaheadH10() { position.wrapping_add(num_bytes).wrapping_sub( StoreLookaheadH10() ).wrapping_add( 1usize ) } else { position }; let mut cur_match_pos : usize = 0usize; let mut i : usize; let mut orig_num_literals : usize; let mut orig_last_insert_len : usize; let mut orig_dist_cache : *mut i32; let mut orig_num_commands : usize; let mut model : ZopfliCostModel; let mut nodes : *mut ZopfliNode; let mut matches : *mut BackwardMatch = if matches_size > 0usize { BrotliAllocate( m, matches_size.wrapping_mul(std::mem::size_of::()) ) } else { 0i32 }; let mut gap : usize = 0usize; let mut shadow_matches : usize = 0usize; if !(0i32 == 0) { return; } i = 0usize; while i.wrapping_add(HashTypeLengthH10()).wrapping_sub( 1usize ) < num_bytes { { let pos : usize = position.wrapping_add(i); let mut max_distance : usize = brotli_min_size_t(pos,max_backward_limit); let mut max_length : usize = num_bytes.wrapping_sub(i); let mut num_found_matches : usize; let mut cur_match_end : usize; let mut j : usize; { if matches_size < cur_match_pos.wrapping_add( 128usize ).wrapping_add( shadow_matches ) { let mut _new_size : usize = if matches_size == 0usize { cur_match_pos.wrapping_add(128usize).wrapping_add( shadow_matches ) } else { matches_size }; let mut new_array : *mut BackwardMatch; while _new_size < cur_match_pos.wrapping_add( 128usize ).wrapping_add( shadow_matches ) { _new_size = _new_size.wrapping_mul(2usize); } new_array = if _new_size > 0usize { BrotliAllocate( m, _new_size.wrapping_mul(std::mem::size_of::()) ) } else { 0i32 }; if !!(0i32 == 0) && (matches_size != 0usize) { memcpy( new_array , matches , matches_size.wrapping_mul(std::mem::size_of::()) ); } { BrotliFree(m,matches ); matches = 0i32 ; } matches = new_array; matches_size = _new_size; } } if !(0i32 == 0) { return; } num_found_matches = FindAllMatchesH10( hasher, &(*params).dictionary , ringbuffer, ringbuffer_mask, pos, max_length, max_distance, gap, params, &mut matches[( cur_match_pos.wrapping_add(shadow_matches) as (usize) ) ] ); cur_match_end = cur_match_pos.wrapping_add(num_found_matches); j = cur_match_pos; while j.wrapping_add(1usize) < cur_match_end { { } j = j.wrapping_add(1 as (usize)); } num_matches[(i as (usize)) ]= num_found_matches as (u32); if num_found_matches > 0usize { let match_len : usize = BackwardMatchLength( &mut matches[( cur_match_end.wrapping_sub(1usize) as (usize) ) ] ); if match_len > 325usize { let skip : usize = match_len.wrapping_sub(1usize); matches[( { let _old = cur_match_pos; cur_match_pos = cur_match_pos.wrapping_add(1 as (usize)); _old } as (usize) ) ]= matches[( cur_match_end.wrapping_sub(1usize) as (usize) )]; num_matches[(i as (usize)) ]= 1u32; StoreRangeH10( hasher, ringbuffer, ringbuffer_mask, pos.wrapping_add(1usize), brotli_min_size_t(pos.wrapping_add(match_len),store_end) ); memset( &mut num_matches[( i.wrapping_add(1usize) as (usize) ) ] , 0i32, skip.wrapping_mul(std::mem::size_of::()) ); i = i.wrapping_add(skip); } else { cur_match_pos = cur_match_end; } } } i = i.wrapping_add(1 as (usize)); } orig_num_literals = *num_literals; orig_last_insert_len = *last_insert_len; memcpy( orig_dist_cache , dist_cache , (4usize).wrapping_mul(std::mem::size_of::()) ); orig_num_commands = *num_commands; nodes = if num_bytes.wrapping_add( 1usize ) > 0usize { BrotliAllocate( m, num_bytes.wrapping_add(1usize).wrapping_mul( std::mem::size_of::() ) ) } else { 0i32 }; if !(0i32 == 0) { return; } InitZopfliCostModel( m, &mut model , &(*params).dist , num_bytes ); if !(0i32 == 0) { return; } i = 0usize; while i < 2usize { { BrotliInitZopfliNodes( nodes, num_bytes.wrapping_add(1usize) ); if i == 0usize { ZopfliCostModelSetFromLiteralCosts( &mut model , position, ringbuffer, ringbuffer_mask ); } else { ZopfliCostModelSetFromCommands( &mut model , position, ringbuffer, ringbuffer_mask, commands , (*num_commands).wrapping_sub(orig_num_commands), orig_last_insert_len ); } *num_commands = orig_num_commands; *num_literals = orig_num_literals; *last_insert_len = orig_last_insert_len; memcpy( dist_cache , orig_dist_cache , (4usize).wrapping_mul(std::mem::size_of::()) ); *num_commands = (*num_commands).wrapping_add( ZopfliIterate( num_bytes, position, ringbuffer, ringbuffer_mask, params, max_backward_limit, gap, dist_cache , &mut model , num_matches , matches , nodes ) ); BrotliZopfliCreateCommands( num_bytes, position, max_backward_limit, nodes , dist_cache, last_insert_len, params, commands, num_literals ); } i = i.wrapping_add(1 as (usize)); } CleanupZopfliCostModel(m,&mut model ); { BrotliFree(m,nodes ); nodes = 0i32 ; } { BrotliFree(m,matches ); matches = 0i32 ; } { BrotliFree(m,num_matches ); num_matches = 0i32 ; } } brotli-3.4.0/examples/compress.rs000064400000000000000000000025431046102023000151460ustar 00000000000000extern crate brotli; #[cfg(not(feature="std"))] fn main() { panic!("For no-stdlib examples please see the tests") } #[cfg(feature="std")] fn main() { use std::io; use std::io::{Read, Write}; let stdout = &mut io::stdout(); { let mut writer = brotli::CompressorWriter::new( stdout, 4096, 11, 22); let mut buf = [0u8; 4096]; loop { match io::stdin().read(&mut buf[..]) { Err(e) => { if let io::ErrorKind::Interrupted = e.kind() { continue; } panic!("{}", e); } Ok(size) => { if size == 0 { match writer.flush() { Err(e) => { if let io::ErrorKind::Interrupted = e.kind() { continue; } panic!("{}", e) } Ok(_) => break, } } match writer.write_all(&buf[..size]) { Err(e) => panic!("{}", e), Ok(_) => {}, } } } } } } brotli-3.4.0/examples/decompress.rs000064400000000000000000000017621046102023000154610ustar 00000000000000extern crate brotli; #[cfg(not(feature="std"))] fn main() { panic!("For no-stdlib examples please see the tests") } #[cfg(feature="std")] fn main() { use std::io; let stdin = &mut io::stdin(); { use std::io::{Read, Write}; let mut reader = brotli::Decompressor::new( stdin, 4096, // buffer size ); let mut buf = [0u8; 4096]; loop { match reader.read(&mut buf[..]) { Err(e) => { if let io::ErrorKind::Interrupted = e.kind() { continue; } panic!("{}", e); } Ok(size) => { if size == 0 { break; } match io::stdout().write_all(&buf[..size]) { Err(e) => panic!("{}", e), Ok(_) => {}, } } } } } } brotli-3.4.0/research/concatenate_some.py000064400000000000000000000111161046102023000166000ustar 00000000000000import sys import os import random as insecure_random import subprocess import hashlib import traceback def get_goal(): ret = insecure_random.randrange(1,16) if ret == 15: ret = insecure_random.randrange(15,64) return ret def shasum(work): sha = hashlib.sha256() for file in work: with open(file) as ff: while True: r = ff.read(65536) if r: sha.update(r) else: break return sha.digest() def file_size(filename): return os.stat(filename).st_size uncatable_stats = 0 catable_stats = 0 def process(work, brotli, cat, prefix): sys.stdout.flush() global uncatable_stats global catable_stats work = [filename for filename in work if filename.find(".jpg") != -1 or filename.find(".avi") != -1 or filename.find(".mp4") != -1 or filename.find(".mov") != -1 or insecure_random.randrange(1,17) == 16] if len(work) == 0: return try: fullsum = shasum(work) except Exception: traceback.print_exc() print 'ok early exit' return quality = "-q" + str(insecure_random.randrange(2,12 if len(work) < 8 else 10)) if insecure_random.randrange(0,16) == 0: quality = '-q9.5' append = insecure_random.randrange(0,2) == 0 frivolous_procs = [] procs = [] print 'processing',work,'at',quality,append for index, filename in enumerate(work): thread_count = insecure_random.randrange(1,17) if quality > 8 and thread_count == 1: thread_count = 2 magic = insecure_random.randrange(0,2) == 0 buffer_size = insecure_random.randrange(1,18) if buffer_size == 17: buffer_size = 65536 elif buffer_size > 3: buffer_size *= 1024 bs = "-bs" + str(buffer_size) args = [brotli, "-c", bs, quality] if magic: args.append("-magic") frivolous_procs.append(subprocess.Popen(args + [filename, prefix + quality+"-" + str(index)+".compressed"])) if append and index == 0: args.append("-appendable") else: args.append("-catable") args.append('-j' + str(thread_count)) args.append(filename) args.append(prefix + quality+"-" + str(index)+".br") procs.append(subprocess.Popen(args)) for index, proc in enumerate(procs): ret = proc.wait() if ret: print 'failure at ' + work[index],quality,append, bs assert not ret buffer_size = insecure_random.randrange(1,18) if buffer_size == 17: buffer_size = 65536 elif buffer_size > 3: buffer_size *= 1024 bs = "-bs" + str(buffer_size) args = [cat, bs] for index, filename in enumerate(work): args.append(prefix + quality+"-" + str(index)+".br") stdout, _stderr = subprocess.Popen(args, stdout=subprocess.PIPE).communicate() with open(prefix+".br", 'w') as f: f.write(stdout) procs[0] = subprocess.Popen([brotli, prefix +'.br', prefix]) ret = procs[0].wait() if ret: print 'failure at ',work,quality,append assert not ret rtsum = shasum([prefix]) if rtsum != fullsum: print 'failure at ',work,quality,append assert rtsum == fullsum print 'ok',rtsum.encode('hex') for (index,proc) in enumerate(frivolous_procs): ret = proc.wait() assert not ret uncatable_stats += file_size(prefix + quality+"-" + str(index)+".compressed") catable_stats += len(stdout) print uncatable_stats,'/',catable_stats,(10000*uncatable_stats/catable_stats)/100.0 try: for index, filename in enumerate(work): os.remove(prefix + quality+"-" + str(index)+".br") os.remove(prefix + quality+"-" + str(index)+".compressed") os.remove(prefix + ".br") os.remove(prefix) except Exception: traceback.print_exc() def main(): start = sys.argv[1] brotli = sys.argv[2] catbrotli = sys.argv[3] goal = get_goal() work =[] prefix="/tmp/cat-" + os.urandom(16).encode('hex') for root, dirnames, filenames in os.walk(start): for filename in filenames: try: if file_size(os.path.join(root,filename)): work.append(os.path.join(root,filename)) except Exception: continue if len(work) >= goal: goal = get_goal() process(work, brotli, catbrotli, prefix) work = [] if len(work): process(work, brotli, catbrotli, prefix) if __name__=="__main__": main() brotli-3.4.0/research/frombase2.py000064400000000000000000000005671046102023000151610ustar 00000000000000import sys result = [] cur_count = 0 cur_val = 0 for byte in sys.stdin.read(): if byte == '1': cur_val |= (1< { b: Box<[T]>, } impl From> for Rebox { fn from(data: Vec) -> Self { Rebox:: { b:data.into_boxed_slice(), } } } impl core::default::Default for Rebox { fn default() -> Self { let v: Vec = Vec::new(); let b = v.into_boxed_slice(); Rebox:: { b: b } } } impl ops::Index for Rebox { type Output = T; fn index(&self, index: usize) -> &T { &(*self.b)[index] } } impl ops::IndexMut for Rebox { fn index_mut(&mut self, index: usize) -> &mut T { &mut (*self.b)[index] } } impl alloc_no_stdlib::SliceWrapper for Rebox { fn slice(&self) -> &[T] { &*self.b } } impl alloc_no_stdlib::SliceWrapperMut for Rebox { fn slice_mut(&mut self) -> &mut [T] { &mut *self.b } } #[derive(Clone, Copy, Default)] pub struct HeapAllocator { } impl alloc_no_stdlib::Allocator for HeapAllocator { type AllocatedMemory = Rebox; fn alloc_cell(self: &mut HeapAllocator, len: usize) -> Rebox { let v: Vec = vec![T::default();len]; let b = v.into_boxed_slice(); Rebox:: { b: b } } fn free_cell(self: &mut HeapAllocator, _data: Rebox) {} } /* type HeapBrotliAlloc = brotli::CombiningAllocator< HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, HeapAllocator, >; */ macro_rules! println_stderr( ($($val:tt)*) => { { writeln!(&mut ::std::io::stderr(), $($val)*).unwrap(); } } ); use std::path::Path; // declare_stack_allocator_struct!(MemPool, 4096, global); pub struct IoWriterWrapper<'a, OutputType: Write + 'a>(&'a mut OutputType); pub struct IoReaderWrapper<'a, OutputType: Read + 'a>(&'a mut OutputType); impl<'a, OutputType: Write> brotli::CustomWrite for IoWriterWrapper<'a, OutputType> { fn flush(self: &mut Self) -> Result<(), io::Error> { loop { match self.0.flush() { Err(e) => { match e.kind() { ErrorKind::Interrupted => continue, _ => return Err(e), } } Ok(_) => return Ok(()), } } } fn write(self: &mut Self, buf: &[u8]) -> Result { loop { match self.0.write(buf) { Err(e) => { match e.kind() { ErrorKind::Interrupted => continue, _ => return Err(e), } } Ok(cur_written) => return Ok(cur_written), } } } } impl<'a, InputType: Read> brotli::CustomRead for IoReaderWrapper<'a, InputType> { fn read(self: &mut Self, buf: &mut [u8]) -> Result { loop { match self.0.read(buf) { Err(e) => { match e.kind() { ErrorKind::Interrupted => continue, _ => return Err(e), } } Ok(cur_read) => return Ok(cur_read), } } } } struct IntoIoReader(OutputType); impl brotli::CustomRead for IntoIoReader { fn read(self: &mut Self, buf: &mut [u8]) -> Result { loop { match self.0.read(buf) { Err(e) => { match e.kind() { ErrorKind::Interrupted => continue, _ => return Err(e), } } Ok(cur_read) => return Ok(cur_read), } } } } #[cfg(not(feature="seccomp"))] pub fn decompress(r: &mut InputType, w: &mut OutputType, buffer_size: usize, custom_dictionary:Rebox) -> Result<(), io::Error> where InputType: Read, OutputType: Write { let mut alloc_u8 = HeapAllocator::default(); let mut input_buffer = alloc_u8.alloc_cell(buffer_size); let mut output_buffer = alloc_u8.alloc_cell(buffer_size); brotli::BrotliDecompressCustomIoCustomDict( &mut IoReaderWrapper::(r), &mut IoWriterWrapper::(w), input_buffer.slice_mut(), output_buffer.slice_mut(), alloc_u8, HeapAllocator::default(), HeapAllocator::default(), custom_dictionary, Error::new(ErrorKind::UnexpectedEof, "Unexpected EOF")) } #[cfg(feature="seccomp")] extern "C" { fn calloc(n_elem: usize, el_size: usize) -> *mut u8; fn free(ptr: *mut u8); fn syscall(value: i32) -> i32; fn prctl(operation: i32, flags: u32) -> i32; } #[cfg(feature="seccomp")] const PR_SET_SECCOMP: i32 = 22; #[cfg(feature="seccomp")] const SECCOMP_MODE_STRICT: u32 = 1; #[cfg(feature="seccomp")] declare_stack_allocator_struct!(CallocAllocatedFreelist, 8192, calloc); #[cfg(feature="seccomp")] pub fn decompress(r: &mut InputType, w: &mut OutputType, buffer_size: usize, custom_dictionary:Rebox) -> Result<(), io::Error> where InputType: Read, OutputType: Write { if custom_dictionary.len() != 0 { return Err(io::Error::new(ErrorKind::InvalidData, "Not allowed to have a custom_dictionary with SECCOMP")) } core::mem::drop(custom_dictionary); let u8_buffer = unsafe { define_allocator_memory_pool!(4, u8, [0; 1024 * 1024 * 200], calloc) }; let u32_buffer = unsafe { define_allocator_memory_pool!(4, u32, [0; 16384], calloc) }; let hc_buffer = unsafe { define_allocator_memory_pool!(4, HuffmanCode, [0; 1024 * 1024 * 16], calloc) }; let mut alloc_u8 = CallocAllocatedFreelist::::new_allocator(u8_buffer.data, bzero); let alloc_u32 = CallocAllocatedFreelist::::new_allocator(u32_buffer.data, bzero); let alloc_hc = CallocAllocatedFreelist::::new_allocator(hc_buffer.data, bzero); let ret = unsafe { prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT) }; if ret != 0 { panic!("Unable to activate seccomp"); } match brotli::BrotliDecompressCustomIo(&mut IoReaderWrapper::(r), &mut IoWriterWrapper::(w), &mut alloc_u8.alloc_cell(buffer_size).slice_mut(), &mut alloc_u8.alloc_cell(buffer_size).slice_mut(), alloc_u8, alloc_u32, alloc_hc, Error::new(ErrorKind::UnexpectedEof, "Unexpected EOF")) { Err(e) => Err(e), Ok(()) => { unsafe{syscall(60);}; unreachable!() } } } pub fn new_brotli_heap_alloc() -> HeapAllocator { HeapAllocator::default() } impl brotli::enc::BrotliAlloc for HeapAllocator { } pub fn compress_multi_nostd( input: Vec, output: &mut [u8], params:&BrotliEncoderParams, mut num_threads: usize, ) -> Result { let mut alloc_array = [ SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), ]; if num_threads > alloc_array.len() { num_threads = alloc_array.len(); } CompressMulti(params, &mut Owned::new(Rebox::from(input)), output, &mut alloc_array[..num_threads], &mut util::MTSpawner::default()) } pub fn compress_multi( r: &mut InputType, w: &mut OutputType, params:&BrotliEncoderParams, mut num_threads: usize, work_pool: Option<&mut WorkerPool, UnionHasher, HeapAllocator, (Rebox, BrotliEncoderParams)>>, ) -> Result { let mut input: Vec = Vec::::new(); if let Err(err) = r.read_to_end(&mut input) { return Err(err); } let mut output = Rebox::from(vec![0u8;BrotliEncoderMaxCompressedSizeMulti(input.len(), num_threads)]); let res = if let Some(worker_pool) = work_pool { let mut alloc_array = [ SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), SendAlloc::new(HeapAllocator::default(), UnionHasher::Uninit), ]; if num_threads > alloc_array.len() { num_threads = alloc_array.len(); } compress_worker_pool( params, &mut Owned::new(Rebox::from(input)), output.slice_mut(), &mut alloc_array[..num_threads], worker_pool, ) } else { compress_multi_nostd(input, output.slice_mut(), params, num_threads) }; match res { Ok(size) => { if let Err(err) = w.write_all(&output.slice()[..size]) { Err(err) } else { Ok(size) } }, Err(err) => Err(io::Error::new(ErrorKind::Other, format!("{:?}", err))), } } pub fn compress(r: &mut InputType, w: &mut OutputType, buffer_size: usize, params:&brotli::enc::BrotliEncoderParams, custom_dictionary: &[u8], num_threads: usize) -> Result where InputType: Read, OutputType: Write { if num_threads > 1 && custom_dictionary.len() ==0 && !params.log_meta_block { if has_stdlib() { return compress_multi(r, w, params, num_threads, Some(&mut new_work_pool(num_threads - 1))); } else { return compress_multi(r, w, params, num_threads, None); } } let mut alloc_u8 = HeapAllocator::default(); let mut input_buffer = alloc_u8.alloc_cell(buffer_size); let mut output_buffer = alloc_u8.alloc_cell(buffer_size); let mut log = |pm:&mut brotli::interface::PredictionModeContextMap, data:&mut [brotli::interface::Command], mb:brotli::InputPair, _mfv: &mut HeapAllocator| { let tmp = brotli::interface::Command::PredictionMode( brotli::interface::PredictionModeContextMap::{ literal_context_map:brotli::InputReference::from(&pm.literal_context_map), predmode_speed_and_distance_context_map:brotli::InputReference::from(&pm.predmode_speed_and_distance_context_map), }); util::write_one(&tmp); for cmd in data.iter() { util::write_one(&brotli::thaw_pair(cmd, &mb)); } }; if params.log_meta_block { println_stderr!("window {} 0 0 0", params.lgwin); } brotli::BrotliCompressCustomIoCustomDict(&mut IoReaderWrapper::(r), &mut IoWriterWrapper::(w), &mut input_buffer.slice_mut(), &mut output_buffer.slice_mut(), params, new_brotli_heap_alloc(), &mut log, custom_dictionary, Error::new(ErrorKind::UnexpectedEof, "Unexpected EOF")) } // This decompressor is defined unconditionally on whether std is defined // so we can exercise the code in any case pub struct BrotliDecompressor(brotli::DecompressorCustomIo, Rebox, HeapAllocator, HeapAllocator, HeapAllocator>); impl BrotliDecompressor { pub fn new(r: R, buffer_size: usize) -> Self { let mut alloc_u8 = HeapAllocator::default(); let buffer = alloc_u8.alloc_cell(buffer_size); let alloc_u32 = HeapAllocator::default(); let alloc_hc = HeapAllocator::default(); BrotliDecompressor::( brotli::DecompressorCustomIo::, Rebox, HeapAllocator, HeapAllocator, HeapAllocator> ::new(IntoIoReader::(r), buffer, alloc_u8, alloc_u32, alloc_hc, io::Error::new(ErrorKind::InvalidData, "Invalid Data"))) } } impl Read for BrotliDecompressor { fn read(&mut self, buf: &mut [u8]) -> Result { self.0.read(buf) } } #[cfg(test)] fn writeln0(strm: &mut OutputType, data: &str) -> core::result::Result<(), io::Error> { writeln!(strm, "{:}", data) } #[cfg(test)] fn writeln_time(strm: &mut OutputType, data: &str, v0: u64, v1: u64, v2: u32) -> core::result::Result<(), io::Error> { writeln!(strm, "{:} {:} {:}.{:09}", v0, data, v1, v2) } fn read_custom_dictionary(filename :&str) -> Vec { let mut dict = match File::open(&Path::new(&filename)) { Err(why) => panic!("couldn't open custom dictionary {:}\n{:}", filename, why), Ok(file) => file, }; let mut ret = Vec::::new(); dict.read_to_end(&mut ret).unwrap(); ret } #[cfg(feature="std")] fn has_stdlib() -> bool { true } #[cfg(not(feature="std"))] fn has_stdlib() -> bool { false } fn main() { let mut buffer_size = 65536; let mut do_compress = false; let mut do_validate = false; let mut params = brotli::enc::BrotliEncoderInitParams(); let mut custom_dictionary = Vec::::new(); let mut use_work_pool = has_stdlib(); params.quality = 11; // default let mut filenames = [std::string::String::new(), std::string::String::new()]; let mut num_benchmarks = 1; let mut double_dash = false; let mut num_threads = 1; if env::args_os().len() > 1 { let mut first = true; for argument in env::args() { if first { first = false; continue; } if argument == "--" { double_dash = true; continue; } if (argument == "-catable" || argument == "--catable") && !double_dash { params.catable = true; params.use_dictionary = false; params.appendable = true; continue; } if (argument == "-nothreadpool" || argument == "--nothreadpool") && !double_dash { use_work_pool = false; continue; } if (argument == "-appendable" || argument == "--appendable") && !double_dash { params.appendable = true; continue; } if (argument.starts_with("-magic") || argument.starts_with("--magic")) && !double_dash { params.magic_number = true; continue; } if argument.starts_with("-customdictionary=") && !double_dash { for item in argument.splitn(2, |c| c== '=').skip(1) { custom_dictionary = read_custom_dictionary(item); } continue; } if argument == "--dump-dictionary" && !double_dash { util::print_dictionary(util::permute_dictionary()); return } if argument == "-utf8" && !double_dash { params.mode = BrotliEncoderMode::BROTLI_FORCE_UTF8_PRIOR; continue; } if argument == "-msb" && !double_dash { params.mode = BrotliEncoderMode::BROTLI_FORCE_MSB_PRIOR; continue; } if argument == "-lsb" && !double_dash { params.mode = BrotliEncoderMode::BROTLI_FORCE_LSB_PRIOR; continue; } if argument == "-signed" && !double_dash { params.mode = BrotliEncoderMode::BROTLI_FORCE_SIGNED_PRIOR; continue; } if argument == "-efficient" && !double_dash { params.favor_cpu_efficiency = true; continue; } if argument == "-lowlatency" && !double_dash { params.favor_cpu_efficiency = false; continue; } if argument == "-i" && !double_dash { // display the intermediate representation of metablocks params.log_meta_block = true; continue; } if (argument == "-0" || argument == "-q0") && !double_dash { params.quality = 0; continue; } if (argument == "-1" || argument == "-q1") && !double_dash { params.quality = 1; continue; } if (argument == "-2" || argument == "-q2") && !double_dash { params.quality = 2; continue; } if (argument == "-3" || argument == "-q3") && !double_dash { params.quality = 3; continue; } if (argument == "-4" || argument == "-q4") && !double_dash { params.quality = 4; continue; } if (argument == "-5" || argument == "-q5") && !double_dash { params.quality = 5; continue; } if (argument == "-6" || argument == "-q6") && !double_dash { params.quality = 6; continue; } if (argument == "-7" || argument == "-q7") && !double_dash { params.quality = 7; continue; } if (argument == "-8" || argument == "-q8") && !double_dash { params.quality = 8; continue; } if (argument == "-9" || argument == "-q9") && !double_dash { params.quality = 9; continue; } if (argument == "-9.5" || argument == "-q9.5") && !double_dash { params.quality = 10; params.q9_5 = true; continue; } if (argument == "-9.5x" || argument == "-q9.5x") && !double_dash { params.quality = 11; params.q9_5 = true; continue; } if (argument == "-10" || argument == "-q10") && !double_dash { params.quality = 10; continue; } if (argument == "-11" || argument == "-q11") && !double_dash { params.quality = 11; continue; } if (argument == "-q9.5y") && !double_dash { params.quality = 12; params.q9_5 = true; continue; } if argument.starts_with("-l") && !double_dash { params.lgblock = argument.trim_matches('-').trim_matches('l').parse::().unwrap(); continue; } if argument.starts_with("-j") && !double_dash { num_threads = core::cmp::min( core::cmp::max( 1, argument.trim_matches('-').trim_matches('j').parse::().unwrap() as usize), MAX_THREADS); continue; } if argument.starts_with("-bytescore=") && !double_dash { params.hasher.literal_byte_score = argument.trim_matches('-').trim_matches('b').trim_matches('y').trim_matches('t').trim_matches('e').trim_matches('s').trim_matches('c').trim_matches('o').trim_matches('r').trim_matches('e').trim_matches('=').parse::().unwrap(); continue; } if argument.starts_with("-w") && !double_dash { params.lgwin = argument.trim_matches('-').trim_matches('w').parse::().unwrap(); continue; } if (argument == "-validate" || argument == "--validate") && !double_dash { do_validate = true; continue; } if argument.starts_with("-bs") && !double_dash { buffer_size = argument.trim_matches('-').trim_matches('b').trim_matches('s').trim_matches('=').parse::().unwrap(); continue; } if argument.starts_with("-findprior") && !double_dash { params.prior_bitmask_detection = 1; continue; } if argument.starts_with("-findspeed=") && !double_dash { params.cdf_adaptation_detection = argument.trim_matches('-').trim_matches('f').trim_matches('i').trim_matches('n').trim_matches('d').trim_matches('r').trim_matches('a').trim_matches('n').trim_matches('d').trim_matches('o').trim_matches('m').trim_matches('=').parse::().unwrap() as u8; continue; } else if argument == "-findspeed" && !double_dash { params.cdf_adaptation_detection = 1; continue; } if argument == "-basicstride" && !double_dash { params.stride_detection_quality = 1; continue; } else if argument == "-advstride" && !double_dash { params.stride_detection_quality = 3; continue; } else { if argument == "-stride" && !double_dash { params.stride_detection_quality = 2; continue; } else { if (argument.starts_with("-s") && !argument.starts_with("-speed=")) && !double_dash { params.size_hint = argument.trim_matches('-').trim_matches('s').parse::().unwrap(); continue; } } } if argument.starts_with("-speed=") && !double_dash { let comma_string = argument.trim_matches('-').trim_matches('s').trim_matches('p').trim_matches('e').trim_matches('e').trim_matches('d').trim_matches('='); let split = comma_string.split(","); for (index, s) in split.enumerate() { let data = s.parse::().unwrap(); if data > 16384 { println_stderr!("Speed must be <= 16384, not {}", data); } if index == 0 { for item in params.literal_adaptation.iter_mut() { item.0 = data; } } else if index == 1 { for item in params.literal_adaptation.iter_mut() { item.1 = data; } } else { if (index & 1) == 0 { params.literal_adaptation[index / 2].0 = data; }else { params.literal_adaptation[index / 2].1 = data; } } } continue; } if argument == "-avoiddistanceprefixsearch" && !double_dash { params.avoid_distance_prefix_search = true; } if argument.starts_with("-b") && !double_dash { num_benchmarks = argument.trim_matches('-').trim_matches('b').parse::().unwrap(); continue; } if argument == "-c" && !double_dash { do_compress = true; continue; } if argument == "-h" || argument == "-help" || argument == "--help" && !double_dash { println_stderr!("Decompression:\nbrotli [input_file] [output_file]\nCompression:brotli -c -q9.5 -w22 [input_file] [output_file]\nQuality may be one of -q9.5 -q9.5x -q9.5y or -q[0-11] for standard brotli settings.\nOptional size hint -s to direct better compression\n\nThe -i parameter produces a cross human readdable IR representation of the file.\nThis can be ingested by other compressors.\nIR-specific options include:\n-findprior\n-speed="); return; } if filenames[0] == "" { filenames[0] = argument.clone(); continue; } if filenames[1] == "" { filenames[1] = argument.clone(); continue; } panic!("Unknown Argument {:}", argument); } if filenames[0] != "" { let mut input = match File::open(&Path::new(&filenames[0])) { Err(why) => panic!("couldn't open {:}\n{:}", filenames[0], why), Ok(file) => file, }; if filenames[1] != "" { let mut output = match File::create(&Path::new(&filenames[1])) { Err(why) => panic!("couldn't open file for writing: {:}\n{:}", filenames[1], why), Ok(file) => file, }; let mut worker_pool = if num_threads != 1 && do_compress && use_work_pool && !do_validate { Some(new_work_pool(num_threads - 1)) } else { None }; for i in 0..num_benchmarks { if do_validate { let dict = core::mem::replace(&mut custom_dictionary, Vec::new()); if num_benchmarks > 0 { custom_dictionary = dict.clone(); } match validate::compress_validate(&mut input, &mut output, buffer_size, ¶ms, dict.into(), num_threads) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } else if do_compress { if let Some(ref mut work_pool) = worker_pool { match compress_multi(&mut input, &mut output, ¶ms, num_threads, Some(work_pool)) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } else { if num_threads != 1 { match compress_multi(&mut input, &mut output, ¶ms, num_threads, None) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } else { match compress(&mut input, &mut output, buffer_size, ¶ms, &custom_dictionary[..], num_threads) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } } } else { let dict = core::mem::replace(&mut custom_dictionary, Vec::new()); if num_benchmarks > 0 { custom_dictionary = dict.clone(); } match decompress(&mut input, &mut output, buffer_size, dict.into()) { Ok(_) => {} Err(e) => panic!("Error: {:} during brotli decompress\nTo compress with Brotli, specify the -c flag.", e), } } if i + 1 != num_benchmarks { input.seek(SeekFrom::Start(0)).unwrap(); output.seek(SeekFrom::Start(0)).unwrap(); } } drop(output); } else { assert_eq!(num_benchmarks, 1); if do_validate { if do_compress { match validate::compress_validate(&mut input, &mut io::stdout(), buffer_size, ¶ms, custom_dictionary.into(), num_threads) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } else { match validate::compress_validate(&mut input, &mut io::sink(), buffer_size, ¶ms, custom_dictionary.into(), num_threads) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } } else if do_compress { match compress(&mut input, &mut io::stdout(), buffer_size, ¶ms, &custom_dictionary[..], num_threads) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } else { match decompress(&mut input, &mut io::stdout(), buffer_size, custom_dictionary.into()) { Ok(_) => {} Err(e) => panic!("Error: {:} during brotli decompress\nTo compress with Brotli, specify the -c flag.", e), } } } drop(input); } else { assert_eq!(num_benchmarks, 1); if do_validate { if do_compress { match validate::compress_validate(&mut io::stdin(), &mut io::stdout(), buffer_size, ¶ms, custom_dictionary.into(), num_threads) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } else { match validate::compress_validate(&mut io::stdin(), &mut io::sink(), buffer_size, ¶ms, custom_dictionary.into(), num_threads) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } } else if do_compress { match compress(&mut io::stdin(), &mut io::stdout(), buffer_size, ¶ms, &custom_dictionary[..], num_threads) { Ok(_) => return, Err(e) => panic!("Error {:?}", e), } } else { match decompress(&mut io::stdin(), &mut io::stdout(), buffer_size, custom_dictionary.into()) { Ok(_) => return, Err(e) => panic!("Error: {:} during brotli decompress\nTo compress with Brotli, specify the -c flag.", e), } } } } else { assert_eq!(num_benchmarks, 1); match decompress(&mut io::stdin(), &mut io::stdout(), buffer_size, custom_dictionary.into()) { Ok(_) => return, Err(e) => panic!("Error: {:} during brotli decompress\nTo compress with Brotli, specify the -c flag.", e), } } } brotli-3.4.0/src/bin/catbrotli.rs000064400000000000000000000121611046102023000150140ustar 00000000000000extern crate brotli; extern crate core; use std::env; use std::io; use std::io::{Read, Write}; use std::path::Path; use std::fs::File; use brotli::concat::{BroCatli, BroCatliResult}; fn usage() { writeln!(&mut ::std::io::stderr(), "Usage: [-w] filename0 filename1 filename2...").unwrap(); } fn read_no_interrupt(r: &mut R, buf: &mut [u8]) -> Result { loop { match r.read(buf) { Err(e) => { match e.kind() { io::ErrorKind::Interrupted => continue, _ => return Err(e), } } Ok(cur_read) => return Ok(cur_read), } } } fn write_no_interrupt(w: &mut W, mut buf: &[u8]) -> Result { let mut total_read = 0usize; loop { match w.write(buf) { Err(e) => { match e.kind() { io::ErrorKind::Interrupted => continue, _ => return Err(e), } }, Ok(cur_read) => { buf = &buf[cur_read..]; total_read += cur_read; if buf.len() == 0 { return Ok(total_read); } }, } } } fn main() { let mut window_size: Option = None; let mut double_dash = false; let mut buffer_size = 4096usize; let mut filenames = Vec::::new(); let mut ostream = io::stdout(); if env::args_os().len() > 1 { for argument in env::args().skip(1) { if argument.starts_with("-w") && !double_dash { window_size = Some(argument.trim_matches('-').trim_matches('w').parse::().unwrap() as u8); continue; } if argument.starts_with("-bs") && !double_dash { buffer_size = argument.trim_matches('-').trim_matches('b').trim_matches('s').parse::().unwrap(); continue; } if argument == "--" { double_dash = true; continue; } filenames.push(argument); } } else { usage(); return; } let mut ibuffer = vec![0u8; buffer_size]; let mut obuffer = vec![0u8; buffer_size]; let mut ooffset = 0; let mut ioffset; let mut bro_cat_li = match window_size { Some(ws) => BroCatli::new_with_window_size(ws), None => BroCatli::new(), }; for filename in filenames { bro_cat_li.new_brotli_file(); let mut input_file = match File::open(&Path::new(&filename)) { Err(why) => panic!("couldn't open {:}\n{:}", filename, why), Ok(file) => file, }; loop { ioffset = 0; match read_no_interrupt(&mut input_file, &mut ibuffer[..]) { Err(e) => panic!("{}", e), Ok(cur_read) => { if cur_read == 0 { break; } loop { match bro_cat_li.stream(&ibuffer[..cur_read], &mut ioffset, &mut obuffer[..], &mut ooffset) { BroCatliResult::NeedsMoreOutput => { match write_no_interrupt(&mut ostream, &obuffer[..ooffset]) { Err(why) => panic!("couldn't write: {:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } ooffset = 0; }, BroCatliResult::NeedsMoreInput => { break; }, BroCatliResult::Success => { panic!("Unexpected state: Success when streaming before finish"); } failure => { panic!("Failed to concatenate files on {:} {:?}", filename, failure); }, } } } } } } loop { match bro_cat_li.finish(&mut obuffer[..], &mut ooffset) { BroCatliResult::NeedsMoreOutput => { match write_no_interrupt(&mut ostream, &obuffer[..ooffset]) { Err(why) => panic!("couldn't write: {:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } ooffset = 0; }, BroCatliResult::NeedsMoreInput => { panic!("Unexpected EOF"); }, BroCatliResult::Success => { if ooffset != 0 { match write_no_interrupt(&mut ostream, &obuffer[..ooffset]) { Err(why) => panic!("couldn't write: {:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } } break; } failure => { panic!("{:?}", failure) } } } } brotli-3.4.0/src/bin/integration_tests.rs000075500000000000000000001207201046102023000166020ustar 00000000000000#![cfg(test)] #![allow(non_upper_case_globals)] #![allow(dead_code)] extern crate core; extern crate brotli_decompressor; use super::HeapAllocator; #[allow(unused_imports)] use super::alloc_no_stdlib::{Allocator, SliceWrapper, SliceWrapperMut}; use super::brotli::BrotliResult; use super::brotli::BrotliState; use super::Rebox; #[cfg(feature="std")] use super::brotli::{CompressorReader, CompressorWriter}; #[cfg(feature="std")] use super::brotli_decompressor::{Decompressor, DecompressorWriter}; use core::cmp; use std::io; #[cfg(feature="std")] use std::io::{Read, Write}; use std::time::Duration; #[cfg(not(feature="disable-timer"))] use std::time::SystemTime; use brotli::BrotliDecompressStream; #[cfg(feature="benchmark")] extern crate test; #[cfg(feature="benchmark")] use self::test::Bencher; pub struct Buffer { data: Vec, read_offset: usize, } pub struct UnlimitedBuffer { data: Vec, read_offset: usize, } #[cfg(feature="disable-timer")] fn now() -> Duration { return Duration::new(0, 0); } #[cfg(not(feature="disable-timer"))] fn now() -> SystemTime { return SystemTime::now(); } #[cfg(not(feature="disable-timer"))] fn elapsed(start: SystemTime) -> (Duration, bool) { match start.elapsed() { Ok(delta) => return (delta, false), _ => return (Duration::new(0, 0), true), } } #[cfg(feature="disable-timer")] fn elapsed(_start: Duration) -> (Duration, bool) { return (Duration::new(0, 0), true); } fn _write_all(w: &mut OutputType, buf: &[u8]) -> Result<(), io::Error> where OutputType: io::Write { let mut total_written: usize = 0; while total_written < buf.len() { match w.write(&buf[total_written..]) { Err(e) => { match e.kind() { io::ErrorKind::Interrupted => continue, _ => return Err(e), } } Ok(cur_written) => { if cur_written == 0 { return Err(io::Error::new(io::ErrorKind::UnexpectedEof, "Write EOF")); } total_written += cur_written; } } } Ok(()) } trait Runner { fn iter (&mut self, cb: &mut Fn); } struct Passthrough { } impl Runner for Passthrough { fn iter (&mut self, cb: &mut Fn) { cb() } } #[cfg(feature="benchmark")] struct BenchmarkPassthrough<'a> (pub &'a mut Bencher); #[cfg(feature="benchmark")] impl<'a> Runner for BenchmarkPassthrough<'a>{ fn iter (&mut self, cb: &mut Fn) { self.0.iter(cb) } } // option_env!("BENCHMARK_MODE").is_some() fn decompress_internal(r: &mut InputType, mut w: &mut OutputType, input_buffer_limit: usize, output_buffer_limit: usize, runner: &mut Run) -> Result<(), io::Error> where InputType: io::Read, OutputType: io::Write { let mut total = Duration::new(0, 0); let mut range: usize = 0; let mut timing_error: bool = false; runner.iter(&mut || { range += 1; let mut brotli_state = BrotliState::new(HeapAllocator::default(), HeapAllocator::default(), HeapAllocator::default()); let mut input = brotli_state.alloc_u8.alloc_cell(input_buffer_limit); let mut output = brotli_state.alloc_u8.alloc_cell(output_buffer_limit); let mut available_out: usize = output.slice().len(); // let amount = try!(r.read(&mut buf)); let mut available_in: usize = 0; let mut input_offset: usize = 0; let mut output_offset: usize = 0; let mut result: BrotliResult = BrotliResult::NeedsMoreInput; loop { match result { BrotliResult::NeedsMoreInput => { input_offset = 0; match r.read(input.slice_mut()) { Err(e) => { match e.kind() { io::ErrorKind::Interrupted => continue, _ => panic!("{}", e), } } Ok(size) => { if size == 0 { panic!("{:?}", io::Error::new(io::ErrorKind::UnexpectedEof, "Read EOF")); } available_in = size; } } } BrotliResult::NeedsMoreOutput => { _write_all(&mut w, &output.slice()[..output_offset]).unwrap(); output_offset = 0; } BrotliResult::ResultSuccess => break, BrotliResult::ResultFailure => panic!("FAILURE"), } let mut written: usize = 0; let start = now(); result = BrotliDecompressStream(&mut available_in, &mut input_offset, &input.slice(), &mut available_out, &mut output_offset, &mut output.slice_mut(), &mut written, &mut brotli_state); let (delta, err) = elapsed(start); if err { timing_error = true; } total = total + delta; if output_offset != 0 { _write_all(&mut w, &output.slice()[..output_offset]).unwrap(); output_offset = 0; available_out = output.slice().len() } } }); if timing_error { let _r = super::writeln0(&mut io::stderr(), "Timing error"); } else { let _r = super::writeln_time(&mut io::stderr(), "Iterations; Time", range as u64, total.as_secs(), total.subsec_nanos()); } Ok(()) } impl Buffer { pub fn new(buf: &[u8]) -> Buffer { let mut ret = Buffer { data: Vec::::new(), read_offset: 0, }; ret.data.extend(buf); return ret; } } impl UnlimitedBuffer { pub fn new(buf: &[u8]) -> Self { let mut ret = UnlimitedBuffer { data: Vec::::new(), read_offset: 0, }; ret.data.extend(buf); return ret; } pub fn reset_read(&mut self) { self.read_offset = 0; } pub fn data(&self) -> &[u8] { &self.data[..] } } impl io::Read for Buffer { fn read(self: &mut Self, buf: &mut [u8]) -> io::Result { if self.read_offset == self.data.len() { self.read_offset = 0; } let bytes_to_read = cmp::min(buf.len(), self.data.len() - self.read_offset); if bytes_to_read > 0 { buf[0..bytes_to_read].clone_from_slice(&self.data[self.read_offset.. self.read_offset + bytes_to_read]); } self.read_offset += bytes_to_read; return Ok(bytes_to_read); } } impl io::Write for Buffer { fn write(self: &mut Self, buf: &[u8]) -> io::Result { if self.read_offset == self.data.len() { return Ok(buf.len()); } self.data.extend(buf); return Ok(buf.len()); } fn flush(self: &mut Self) -> io::Result<()> { return Ok(()); } } impl io::Read for UnlimitedBuffer { fn read(self: &mut Self, buf: &mut [u8]) -> io::Result { let bytes_to_read = cmp::min(buf.len(), self.data.len() - self.read_offset); if bytes_to_read > 0 { buf[0..bytes_to_read].clone_from_slice(&self.data[self.read_offset.. self.read_offset + bytes_to_read]); } self.read_offset += bytes_to_read; return Ok(bytes_to_read); } } impl io::Write for UnlimitedBuffer { fn write(self: &mut Self, buf: &[u8]) -> io::Result { self.data.extend(buf); return Ok(buf.len()); } fn flush(self: &mut Self) -> io::Result<()> { return Ok(()); } } #[allow(non_snake_case)] #[test] fn test_roundtrip_64x() { let X = 'X' as u8; let in_buf: [u8; 64] = [X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X]; let mut input = UnlimitedBuffer::new(&in_buf); let mut compressed = UnlimitedBuffer::new(&[]); let mut output = UnlimitedBuffer::new(&[]); let q: i32 = 9; let lgwin: i32 = 16; let mut params = super::brotli::enc::BrotliEncoderInitParams(); params.quality = q; params.lgwin = lgwin; match super::compress(&mut input, &mut compressed, 65536, ¶ms, &[], 1) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } let mut compressed_in = UnlimitedBuffer::new(&compressed.data[..]); match super::decompress(&mut compressed_in, &mut output, 65536, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } for i in 0..input.data.len() { assert_eq!(output.data[i], input.data[i]); } assert_eq!(output.data.len(), input.data.len()); assert_eq!(input.read_offset, in_buf.len()); } fn roundtrip_helper(in_buf: &[u8], q: i32, lgwin: i32, q9_5: bool) -> usize { let mut params = super::brotli::enc::BrotliEncoderInitParams(); params.quality = q; params.q9_5 = q9_5; params.lgwin = lgwin; params.size_hint = if in_buf.len() > 100000 { 2048 * 1024} else {in_buf.len()}; let mut input = UnlimitedBuffer::new(&in_buf); let mut compressed = UnlimitedBuffer::new(&[]); let mut output = UnlimitedBuffer::new(&[]); match super::compress(&mut input, &mut compressed, 4096, ¶ms, &[], 1) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } let mut compressed_in = UnlimitedBuffer::new(&compressed.data[..]); match super::decompress(&mut compressed_in, &mut output, 4096, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } for i in 0..input.data.len() { assert_eq!(output.data[i], input.data[i]); } assert_eq!(output.data.len(), input.data.len()); assert_eq!(input.read_offset, in_buf.len()); return compressed.data[..].len() } fn total_roundtrip_helper(data: &[u8]) { for q in 0..10 { roundtrip_helper(data, q as i32, (q + 13) as i32, false); } roundtrip_helper(data, 10, 23, true); } static RANDOM_THEN_UNICODE : &'static [u8] = include_bytes!("../../testdata/random_then_unicode"); #[test] fn test_random_then_unicode_0() { roundtrip_helper(RANDOM_THEN_UNICODE, 0, 13, false); } #[test] fn test_random_then_unicode_1() { roundtrip_helper(RANDOM_THEN_UNICODE, 1, 14, false); } #[test] fn test_random_then_unicode_2() { roundtrip_helper(RANDOM_THEN_UNICODE, 2, 15, false); } #[test] fn test_random_then_unicode_3() { roundtrip_helper(RANDOM_THEN_UNICODE, 3, 16, false); } #[test] fn test_random_then_unicode_4() { roundtrip_helper(RANDOM_THEN_UNICODE, 4, 17, false); } #[test] fn test_random_then_unicode_5() { roundtrip_helper(RANDOM_THEN_UNICODE, 5, 18, false); } #[test] fn test_random_then_unicode_6() { roundtrip_helper(RANDOM_THEN_UNICODE, 6, 19, false); } #[test] fn test_random_then_unicode_7() { roundtrip_helper(RANDOM_THEN_UNICODE, 7, 20, false); } #[test] fn test_random_then_unicode_8() { roundtrip_helper(RANDOM_THEN_UNICODE, 8, 21, false); } #[test] fn test_random_then_unicode_9() { roundtrip_helper(RANDOM_THEN_UNICODE, 9, 22, false); } #[cfg(feature="std")] const random_then_unicode_compressed_size_9_5 : usize = 130036; #[cfg(feature="std")] const random_then_unicode_compressed_size_9_5x : usize = 129715; #[cfg(not(feature="std"))] const alice_compressed_size_10 : usize = 47490; #[cfg(not(feature="std"))] const alice_compressed_size_11 : usize = 46496; #[cfg(feature="std")] #[cfg(not(feature="float64"))] const alice_compressed_size_10 : usize = 47488; #[cfg(feature="std")] #[cfg(not(feature="float64"))] const alice_compressed_size_11 : usize = 46493; #[cfg(feature="std")] #[cfg(feature="float64")] const alice_compressed_size_10 : usize = 47515; #[cfg(feature="std")] #[cfg(feature="float64")] const alice_compressed_size_11 : usize = 46510; #[cfg(not(feature="std"))] // approx log const random_then_unicode_compressed_size_9_5 : usize = 136699; #[cfg(not(feature="std"))] // approx log const random_then_unicode_compressed_size_9_5x : usize = 136095; #[test] fn test_random_then_unicode_9_5() { let c_size = roundtrip_helper(RANDOM_THEN_UNICODE, 10, 28, true); assert_eq!(c_size, random_then_unicode_compressed_size_9_5); } #[test] fn test_random_then_unicode_9x5() { let c_size = roundtrip_helper(RANDOM_THEN_UNICODE, 11, 22, true); assert_eq!(c_size, random_then_unicode_compressed_size_9_5x); } #[test] fn test_alice29_11() { let c_size = roundtrip_helper(include_bytes!("../../testdata/alice29.txt"), 11, 22, false); if c_size != 46492 { // depends on log2 impl assert_eq!(c_size, alice_compressed_size_11); } } #[test] fn test_alice29_10() { let c_size = roundtrip_helper(include_bytes!("../../testdata/alice29.txt"), 10, 22, false); assert_eq!(c_size, alice_compressed_size_10); } #[test] fn test_roundtrip_quickfox_repeated() { total_roundtrip_helper(include_bytes!("../../testdata/quickfox_repeated")); } #[test] fn test_roundtrip_alice29() { total_roundtrip_helper(include_bytes!("../../testdata/alice29.txt")); } #[test] fn test_roundtrip_as_you_lik() { total_roundtrip_helper(include_bytes!("../../testdata/asyoulik.txt")); } #[cfg(feature="std")] fn reader_helper(mut in_buf: &[u8], q: u32, lgwin: u32) { let original_buf = in_buf; let mut cmp = [0u8; 259]; let mut input = UnlimitedBuffer::new(&in_buf); { let renc = CompressorReader::new(&mut input, 255, q, lgwin); let mut rdec = Decompressor::new(renc, 257); loop { match rdec.read(&mut cmp[..]) { Ok(size) => { if size == 0 { break; } assert_eq!(cmp[..size], in_buf[..size]); in_buf = &in_buf[size..]; } Err(e) => panic!("Error {:?}", e), } } let inner_item = rdec.into_inner(); let _inner_inner_item = inner_item.into_inner(); } in_buf = original_buf; input = UnlimitedBuffer::new(&in_buf); let mut r2enc = CompressorReader::new(&mut input, 255, q, lgwin); let mut compressed_size = 0usize; loop { match r2enc.read(&mut cmp[..]) { Ok(size) => { if size == 0 { break; } compressed_size += size; } Err(e) => panic!("Error {:?}", e), } } let pct_ratio = 90usize; assert!(compressed_size < original_buf.len() * pct_ratio / 100); } /* #[cfg(feature="std")] fn simple_reader_helper(mut in_buf: &[u8], q: u32, lgwin: u32) { let mut xinput = UnlimitedBuffer::new(&in_buf); let xenc; let mut buf = HeapAllocator::default().alloc_cell(1024); xenc = SimpleReader::new(xinput, buf, 1, 16); return; let original_buf = in_buf; let mut cmp = [0u8; 259]; let mut buf = HeapAllocator::default().alloc_cell(1024); let mut input = UnlimitedBuffer::new(&in_buf); { let renc = SimpleReader::new(&mut input, buf, q, lgwin).unwrap(); let mut rdec = Decompressor::new(renc, 257); loop { match rdec.read(&mut cmp[..]) { Ok(size) => { if size == 0 { break; } assert_eq!(cmp[..size], in_buf[..size]); in_buf = &in_buf[size..]; } Err(e) => panic!("Error {:?}", e), } } } in_buf = original_buf; input = UnlimitedBuffer::new(&in_buf); let mut r2enc = CompressorReader::new(&mut input, 255, q, lgwin); let mut compressed_size = 0usize; loop { match r2enc.read(&mut cmp[..]) { Ok(size) => { if size == 0 { break; } compressed_size += size; } Err(e) => panic!("Error {:?}", e), } } let pct_ratio = 90usize; assert!(compressed_size < original_buf.len() * pct_ratio / 100); } */ #[cfg(feature="std")] #[test] fn test_reader_64x() { reader_helper(include_bytes!("../../testdata/64x"), 9, 20); } /* #[cfg(feature="std")] #[test] fn test_simple_64x() { bogus_reader_helper(include_bytes!("../../testdata/64x"), 9, 20); }*/ #[cfg(feature="std")] #[test] fn test_reader_as_you_lik() { reader_helper(include_bytes!("../../testdata/asyoulik.txt"), 9, 20); } #[cfg(feature="std")] #[test] fn test_reader_quickfox_repeated() { reader_helper(include_bytes!("../../testdata/quickfox_repeated"), 9, 20); } #[cfg(feature="std")] #[test] fn test_reader_random_then_unicode() { reader_helper(include_bytes!("../../testdata/random_then_unicode"), 9, 20); } #[cfg(feature="std")] #[test] fn test_reader_alice() { reader_helper(include_bytes!("../../testdata/alice29.txt"), 9, 22); } #[cfg(feature="std")] fn writer_helper(mut in_buf: &[u8], buf_size: usize, q: u32, lgwin: u32, do_flush: bool) { let original_buf = in_buf; let mut output = UnlimitedBuffer::new(&[]); { {let wdec = DecompressorWriter::new(&mut output, 257); {let mut wenc = CompressorWriter::new(wdec, 255, q, lgwin); while in_buf.len() > 0 { match wenc.write(&in_buf[..cmp::min(in_buf.len(), buf_size)]) { Ok(size) => { if size == 0 { break; } in_buf = &in_buf[size..]; } Err(e) => panic!("Error {:?}", e), } if do_flush { if let Err(e) = wenc.flush() { panic!("Error {:?}", e); } } } } } assert_eq!(output.data.len(), original_buf.len()); for i in 0..cmp::min(original_buf.len(), output.data.len()) { assert_eq!(output.data[i], original_buf[i]); } in_buf = original_buf; let mut compressed = UnlimitedBuffer::new(&[]); { let mut wenc = CompressorWriter::new(&mut compressed, 255, q, lgwin); while in_buf.len() > 0 { match wenc.write(&in_buf[..cmp::min(in_buf.len(), buf_size)]) { Ok(size) => { if size == 0 { break; } in_buf = &in_buf[size..]; } Err(e) => panic!("Error {:?}", e), } } } let pct_ratio = 90usize; assert!(compressed.data.len() < original_buf.len() * pct_ratio / 100); } } #[cfg(feature="std")] fn into_inner_writer_helper(mut in_buf: &[u8], buf_size: usize, q: u32, lgwin: u32) { let orig_buf = in_buf; let mut compressed = UnlimitedBuffer::new(&[]); let mut wenc = CompressorWriter::new(&mut compressed, 255, q, lgwin); while in_buf.len() > 0 { match wenc.write(&in_buf[..cmp::min(in_buf.len(), buf_size)]) { Ok(size) => { if size == 0 { break; } in_buf = &in_buf[size..]; } Err(e) => panic!("Error {:?}", e), } } let c2 = wenc.into_inner(); let pct_ratio = 95usize; assert!(c2.data.len() > 0); assert!(c2.data.len() < orig_buf.len() * pct_ratio / 100); let mut compressed_in = UnlimitedBuffer::new(&c2.data[..]); let mut output = UnlimitedBuffer::new(&[]); match super::decompress(&mut compressed_in, &mut output, 65536, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } for i in 0..orig_buf.len() { assert_eq!(output.data[i], orig_buf[i]); } assert_eq!(output.data.len(), orig_buf.len()); } #[cfg(feature="std")] #[test] fn test_writer_as_you_lik() { writer_helper(include_bytes!("../../testdata/asyoulik.txt"), 17, 9, 20, false); } #[cfg(feature="std")] #[test] fn test_writer_as_you_lik_into_inner() { into_inner_writer_helper(include_bytes!("../../testdata/asyoulik.txt"), 256, 4, 16); } #[cfg(feature="std")] #[test] fn test_writer_64x() { writer_helper(include_bytes!("../../testdata/64x"), 17, 9, 20, false); } #[cfg(feature="std")] #[test] fn test_writer_quickfox_repeated() { writer_helper(include_bytes!("../../testdata/quickfox_repeated"), 251, 9, 20, false); } #[cfg(feature="std")] #[test] fn test_writer_random_then_unicode() { writer_helper(include_bytes!("../../testdata/random_then_unicode"), 277, 9, 20, false); } #[cfg(feature="std")] #[test] fn test_writer_alice() { writer_helper(include_bytes!("../../testdata/alice29.txt"), 299, 9, 22, true); } #[test] fn test_10x_10y() { let in_buf: [u8; 12] = [0x1b, 0x13, 0x00, 0x00, 0xa4, 0xb0, 0xb2, 0xea, 0x81, 0x47, 0x02, 0x8a]; let mut input = Buffer::new(&in_buf); let mut output = Buffer::new(&[]); output.read_offset = 20; match super::decompress(&mut input, &mut output, 65536, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } let mut i: usize = 0; while i < 10 { assert_eq!(output.data[i], 'X' as u8); assert_eq!(output.data[i + 10], 'Y' as u8); i += 1; } assert_eq!(output.data.len(), 20); assert_eq!(input.read_offset, in_buf.len()); } #[test] fn test_10x_10y_one_out_byte() { let in_buf: [u8; 12] = [0x1b, 0x13, 0x00, 0x00, 0xa4, 0xb0, 0xb2, 0xea, 0x81, 0x47, 0x02, 0x8a]; let mut input = Buffer::new(&in_buf); let mut output = Buffer::new(&[]); output.read_offset = 20; match decompress_internal(&mut input, &mut output, 12, 1, &mut Passthrough{}) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } let mut i: usize = 0; while i < 10 { assert_eq!(output.data[i], 'X' as u8); assert_eq!(output.data[i + 10], 'Y' as u8); i += 1; } assert_eq!(output.data.len(), 20); assert_eq!(input.read_offset, in_buf.len()); } #[test] fn test_10x_10y_byte_by_byte() { let in_buf: [u8; 12] = [0x1b, 0x13, 0x00, 0x00, 0xa4, 0xb0, 0xb2, 0xea, 0x81, 0x47, 0x02, 0x8a]; let mut input = Buffer::new(&in_buf); let mut output = Buffer::new(&[]); output.read_offset = 20; match decompress_internal(&mut input, &mut output, 1, 1, &mut Passthrough{}) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } let mut i: usize = 0; while i < 10 { assert_eq!(output.data[i], 'X' as u8); assert_eq!(output.data[i + 10], 'Y' as u8); i += 1; } assert_eq!(output.data.len(), 20); assert_eq!(input.read_offset, in_buf.len()); } fn assert_decompressed_input_matches_output(input_slice: &[u8], output_slice: &[u8], input_buffer_size: usize, output_buffer_size: usize) { let mut input = Buffer::new(input_slice); let mut output = Buffer::new(&[]); output.read_offset = output_slice.len(); if input_buffer_size == output_buffer_size { match super::decompress(&mut input, &mut output, input_buffer_size, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } else { match decompress_internal(&mut input, &mut output, input_buffer_size, output_buffer_size, &mut Passthrough{}) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } assert_eq!(output.data.len(), output_slice.len()); assert_eq!(output.data, output_slice) } #[cfg(feature="benchmark")] fn benchmark_decompressed_input(input_slice: &[u8], output_slice: &[u8], input_buffer_size: usize, output_buffer_size: usize, bench: &mut Bencher) { let mut input = Buffer::new(input_slice); let mut output = Buffer::new(&[]); output.read_offset = output_slice.len(); match decompress_internal(&mut input, &mut output, input_buffer_size, output_buffer_size, &mut BenchmarkPassthrough(bench), ) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } assert_eq!(output.data.len(), output_slice.len()); assert_eq!(output.data, output_slice) } pub struct LimitedBuffer<'a> { pub data: &'a mut [u8], pub write_offset: usize, pub read_offset: usize, } impl<'a> LimitedBuffer<'a> { pub fn new(buf: &'a mut [u8]) -> Self { LimitedBuffer { data: buf, write_offset: 0, read_offset: 0, } } } impl<'a> LimitedBuffer<'a> { fn reset(&mut self) { self.write_offset = 0; self.read_offset = 0; self.data.split_at_mut(32).0.clone_from_slice(&[0u8;32]); // clear the first 256 bits } fn reset_read(&mut self) { self.read_offset = 0; } fn written(&self) -> &[u8] { &self.data[..self.write_offset] } } impl<'a> io::Read for LimitedBuffer<'a> { fn read(self: &mut Self, buf: &mut [u8]) -> io::Result { let bytes_to_read = cmp::min(buf.len(), self.data.len() - self.read_offset); if bytes_to_read > 0 { buf[0..bytes_to_read].clone_from_slice(&self.data[self.read_offset.. self.read_offset + bytes_to_read]); } self.read_offset += bytes_to_read; return Ok(bytes_to_read); } } impl<'a> io::Write for LimitedBuffer<'a> { fn write(self: &mut Self, buf: &[u8]) -> io::Result { let bytes_to_write = cmp::min(buf.len(), self.data.len() - self.write_offset); if bytes_to_write > 0 { self.data[self.write_offset..self.write_offset + bytes_to_write].clone_from_slice( &buf[..bytes_to_write]); } else { return Err(io::Error::new(io::ErrorKind::WriteZero, "OutOfBufferSpace")); } self.write_offset += bytes_to_write; Ok(bytes_to_write) } fn flush(self: &mut Self) -> io::Result<()> { return Ok(()); } } fn benchmark_helper(input_slice: &[u8], compress_buffer_size: usize, decompress_buffer_size: usize, bench_compress: bool, bench_decompress: bool, bench: &mut Run, quality: i32, q9_5: bool, ) { let mut params = super::brotli::enc::BrotliEncoderInitParams(); params.quality = quality; params.q9_5 = q9_5; params.large_window= true; let mut input = UnlimitedBuffer::new(&input_slice[..]); let mut compressed_array = vec![0;input_slice.len() * 100/99]; let mut rt_array = vec![0;input_slice.len() + 1]; let mut compressed = LimitedBuffer::new(&mut compressed_array[..]); let mut rt = LimitedBuffer::new(&mut rt_array[..]); if !bench_compress { match super::compress(&mut input, &mut compressed, compress_buffer_size, ¶ms, &[], 1) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } bench.iter(&mut || { input.reset_read(); if bench_compress { compressed.reset(); match super::compress(&mut input, &mut compressed, compress_buffer_size, ¶ms, &[], 1) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } if bench_decompress { compressed.reset_read(); rt.reset(); match super::decompress(&mut compressed, &mut rt, decompress_buffer_size, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } }); if !bench_decompress { compressed.reset_read(); rt.reset(); match super::decompress(&mut compressed, &mut rt, decompress_buffer_size, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } } assert_eq!(rt.write_offset, input_slice.len()); assert_eq!(&rt.data[..input_slice.len()], input_slice); } fn expand_test_data(size: usize) -> Vec { let mut ret = vec![0u8; size]; let original_data = include_bytes!("../../testdata/random_then_unicode"); let mut count = 0; let mut iter = 0usize; while count < size { let to_copy = core::cmp::min(size - count, original_data.len()); let target = &mut ret[count..(count + to_copy)]; for (dst, src) in target.iter_mut().zip(original_data[..to_copy].iter()) { *dst = src.wrapping_add(iter as u8); } count += to_copy; iter += 1; } ret } #[test] fn test_1024k() { let td = expand_test_data(1024 * 1024); benchmark_helper(&td[..], 65536, 65536, true, true, &mut Passthrough{}, 2, false); } static UKKONOOA: &'static[u8] = include_bytes!("../../testdata/ukkonooa"); #[test] fn test_ukkonooa() { let td = UKKONOOA; benchmark_helper(&td[..], 65536, 65536, true, true, &mut Passthrough{}, 11, false); } #[cfg(feature="benchmark")] #[bench] fn bench_e2e_decode_q9_5_1024k(bench: &mut Bencher) { let td = expand_test_data(1024 * 1024); benchmark_helper(&td[..], 65536, 65536, false, true, &mut BenchmarkPassthrough(bench), 11, true); } #[cfg(feature="benchmark")] #[bench] fn bench_e2e_decode_q11_1024k(bench: &mut Bencher) { let td = expand_test_data(1024 * 1024); benchmark_helper(&td[..], 65536, 65536, false, true, &mut BenchmarkPassthrough(bench), 11, false); } #[cfg(feature="benchmark")] #[bench] fn bench_e2e_decode_q5_1024k(bench: &mut Bencher) { let td = expand_test_data(1024 * 1024); benchmark_helper(&td[..], 65536, 65536, false, true, &mut BenchmarkPassthrough(bench), 5, false); } #[cfg(feature="benchmark")] #[bench] fn bench_e2e_rt_q9_5_1024k(bench: &mut Bencher) { let td = expand_test_data(1024 * 1024); benchmark_helper(&td[..], 65536, 65536, true, true, &mut BenchmarkPassthrough(bench), 11, true); } #[cfg(feature="benchmark")] #[bench] fn bench_e2e_rt_q11_1024k(bench: &mut Bencher) { let td = expand_test_data(1024 * 1024); benchmark_helper(&td[..], 65536, 65536, true, true, &mut BenchmarkPassthrough(bench), 11, false); } #[cfg(feature="benchmark")] #[bench] fn bench_e2e_rt_q9_1024k(bench: &mut Bencher) { let td = expand_test_data(1024 * 1024); benchmark_helper(&td[..], 65536, 65536, true, true, &mut BenchmarkPassthrough(bench), 9, false); } #[cfg(feature="benchmark")] #[bench] fn bench_e2e_rt_q5_1024k(bench: &mut Bencher) { let td = expand_test_data(1024 * 1024); benchmark_helper(&td[..], 65536, 65536, true, true, &mut BenchmarkPassthrough(bench), 5, false); } #[test] fn test_64x() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/64x.compressed"), include_bytes!("../../testdata/64x"), 3, 3); } #[test] fn test_as_you_like_it() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/asyoulik.txt.compressed"), include_bytes!("../../testdata/asyoulik.txt"), 65536, 65536); } #[test] #[should_panic] fn test_negative_hypothesis() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/64x"), include_bytes!("../../testdata/64x"), 3, 3); } static ALICE29_BR: &'static [u8] = include_bytes!("../../testdata/alice29.txt.compressed"); static ALICE29: &'static [u8] = include_bytes!("../../testdata/alice29.txt"); #[test] fn test_alice29() { assert_decompressed_input_matches_output(ALICE29_BR, ALICE29, 65536, 65536); } #[cfg(feature="benchmark")] #[bench] fn benchmark_alice29(bench: &mut Bencher) { benchmark_decompressed_input(ALICE29_BR, ALICE29, 65536, 65536, bench); } #[test] fn test_alice1() { assert_decompressed_input_matches_output(ALICE29_BR, ALICE29, 1, 65536); } #[test] fn test_backward65536() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/backward65536.compressed"), include_bytes!("../../testdata/backward65536"), 65536, 65536); } #[test] fn test_compressed_file() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/compressed_file.compressed"), include_bytes!("../../testdata/compressed_file"), 65536, 65536); } #[test] fn test_compressed_repeated() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/compressed_repeated.\ compressed"), include_bytes!("../../testdata/compressed_repeated"), 65536, 65536); } #[test] fn test_empty() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty0() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.00"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty1() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.01"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty2() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.02"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty3() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.03"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty4() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.04"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty5() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.05"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty6() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.06"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty7() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.07"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty8() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.08"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty9() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.09"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty10() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.10"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty11() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.11"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty12() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.12"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty13() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.13"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty14() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.14"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty15() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.15"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty16() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.16"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty17() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.17"), include_bytes!("../../testdata/empty"), 65536, 65536); } #[test] fn test_empty18() { assert_decompressed_input_matches_output(include_bytes!("../../testdata/empty.compressed.18"), include_bytes!("../../testdata/empty"), 65536, 65536); } pub struct SoonErrorReader(&'static[u8], bool); impl io::Read for SoonErrorReader { fn read(&mut self, data:&mut [u8]) -> io::Result { let first = self.1; self.1 = false; if first { let len = core::cmp::min(self.0.len(),data.len()); data[..len].clone_from_slice(&self.0[..len]); return Ok(len); } Err(io::Error::new(io::ErrorKind::PermissionDenied, "err")) } } #[test] fn test_error_returned() { static onetwothreefourfive: [u8;5] = [1,2,3,4,5]; let params = super::brotli::enc::BrotliEncoderParams::default(); let mut erroring = SoonErrorReader(&onetwothreefourfive[..], true); let mut br = UnlimitedBuffer::new(&[]); let dict = &[]; let err = super::compress(&mut erroring, &mut br, 4096, ¶ms, dict, 1); if let Ok(_x) = err { panic!("Should have errored {:?}\n", err); } let mut output = UnlimitedBuffer::new(&[]); let mut br_copy = Buffer::new(&br.data[..]); assert_eq!(br.data.len(),9); match decompress_internal(&mut br_copy, &mut output, 1, 1, &mut Passthrough{}) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } assert_eq!(output.data, &onetwothreefourfive[..]); } brotli-3.4.0/src/bin/test_broccoli.rs000075500000000000000000000327501046102023000156750ustar 00000000000000#![cfg(test)] #![allow(non_upper_case_globals)] #![allow(dead_code)] extern crate core; extern crate brotli_decompressor; use brotli_decompressor::{CustomRead, CustomWrite}; use super::brotli::enc::BrotliEncoderParams; use super::brotli::concat::{BroCatli, BroCatliResult}; use super::integration_tests::UnlimitedBuffer; static RANDOM_THEN_UNICODE : &'static [u8] = include_bytes!("../../testdata/random_then_unicode"); static ALICE: &'static[u8] = include_bytes!("../../testdata/alice29.txt"); static UKKONOOA: &'static[u8] = include_bytes!("../../testdata/ukkonooa"); static ASYOULIKE: &'static[u8] = include_bytes!("../../testdata/asyoulik.txt"); static BACKWARD65536: &'static [u8] = include_bytes!("../../testdata/backward65536"); static DICTWORD: &'static [u8] = include_bytes!("../../testdata/ends_with_truncated_dictionary"); static RANDOM10K: &'static [u8] = include_bytes!("../../testdata/random_org_10k.bin"); static RANDOMTHENUNICODE: &'static [u8] = include_bytes!("../../testdata/random_then_unicode"); static QUICKFOX: &'static [u8] = include_bytes!("../../testdata/quickfox_repeated"); static EMPTY: &'static [u8] = &[]; use super::Rebox; fn concat(files:&mut [UnlimitedBuffer], brotli_files:&mut [UnlimitedBuffer], window_override:Option, bs: usize) { let mut obuffer = vec![0u8; bs]; let mut ibuffer = vec![0u8; bs]; let mut ooffset = 0usize; let mut ioffset; let mut uboutput = UnlimitedBuffer::new(&[]); { let mut output = super::IoWriterWrapper(&mut uboutput); let mut bro_cat_li = match window_override { Some(ws) => BroCatli::new_with_window_size(ws), None => BroCatli::new(), }; for brotli in brotli_files.iter_mut() { bro_cat_li.new_brotli_file(); { let mut input = super::IoReaderWrapper(brotli); loop { ioffset = 0; match input.read(&mut ibuffer[..]) { Err(e) => panic!("{}", e), Ok(cur_read) => { if cur_read == 0 { break; } loop { match bro_cat_li.stream(&ibuffer[..cur_read], &mut ioffset, &mut obuffer[..], &mut ooffset) { BroCatliResult::NeedsMoreOutput => { match output.write(&obuffer[..ooffset]) { Err(why) => panic!("couldn't write: {:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } ooffset = 0; }, BroCatliResult::NeedsMoreInput => { break; }, BroCatliResult::Success => { panic!("Unexpected state: Success when streaming before finish"); }, failure => { panic!("{:?}", failure); }, } } } } } } brotli.reset_read(); } loop { match bro_cat_li.finish(&mut obuffer[..], &mut ooffset) { BroCatliResult::NeedsMoreOutput => { match output.write(&obuffer[..ooffset]) { Err(why) => panic!("couldn't write\n{:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } ooffset = 0; }, BroCatliResult::NeedsMoreInput => { panic!("Unexpected EOF"); }, BroCatliResult::Success => { if ooffset != 0 { match output.write(&obuffer[..ooffset]) { Err(why) => panic!("couldn't write\n{:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } } break; } failure => { panic!("{:?}", failure) } } } } let mut rt = UnlimitedBuffer::new(&[]); match super::decompress(&mut uboutput, &mut rt, 65536, Rebox::default()) { Ok(_) => {}, Err(e) => panic!("Error {:?}", e), } let mut offset = 0; for file in files { assert_eq!(&rt.data()[offset..offset+file.data().len()], file.data()); offset += file.data().len(); } assert_eq!(offset, rt.data().len()); } fn concat_many_subsets(files:&mut [UnlimitedBuffer], brotli_files:&mut [UnlimitedBuffer], window_override:Option) { let test_plans:[(usize,usize);4] = [(brotli_files.len(), 4096 * 1024), (4, 1), (3, 3), (2, 4096)]; for plan_bs in test_plans.iter() { let files_len = files.len(); for index in 0..(brotli_files.len() - core::cmp::min(plan_bs.0 - 1, files_len)) { let file_subset = &mut files[index..core::cmp::min(index+plan_bs.0, files_len)]; let brotli_subset = &mut brotli_files[index..core::cmp::min(index+plan_bs.0, files_len)]; concat(file_subset, brotli_subset, window_override, plan_bs.1); } } } #[cfg(debug_assertions)] fn light_debug_test(params: &mut BrotliEncoderParams) { params.quality = 5; } #[cfg(not(debug_assertions))] fn light_debug_test(_params: &mut BrotliEncoderParams) { } #[cfg(debug_assertions)] fn medium_debug_test(params: &mut BrotliEncoderParams) { params.quality = 9; params.q9_5 = false; } #[cfg(not(debug_assertions))] fn medium_debug_test(_params: &mut BrotliEncoderParams) { } #[test] #[should_panic] fn test_appendonly_twice_fails() { let mut files = [ UnlimitedBuffer::new(UKKONOOA), UnlimitedBuffer::new(QUICKFOX), ]; let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { let mut params0 = BrotliEncoderParams::default(); params0.appendable = true; super::compress(src, dst, 4096, ¶ms0, &[], 1).unwrap(); } concat(&mut files[..], &mut ufiles[..], None, 2); } #[test] fn test_append_then_empty_works() { let mut files = [ UnlimitedBuffer::new(UKKONOOA), UnlimitedBuffer::new(&[]), ]; let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut first = true; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { let mut params0 = BrotliEncoderParams::default(); params0.appendable = first; params0.catable = !first; params0.use_dictionary = first; super::compress(src, dst, 4096, ¶ms0, &[], 1).unwrap(); first = false; } concat(&mut files[..], &mut ufiles[..], None, 2); } #[test] fn test_append_then_cat_works() { let mut files = [ UnlimitedBuffer::new(UKKONOOA), UnlimitedBuffer::new(QUICKFOX), ]; let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut first = true; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { let mut params0 = BrotliEncoderParams::default(); params0.appendable = first; params0.catable = !first; params0.use_dictionary = first; super::compress(src, dst, 4096, ¶ms0, &[], 1).unwrap(); first = false; } concat(&mut files[..], &mut ufiles[..], None, 2); } #[test] fn test_one_byte_works() { let mut files = [ UnlimitedBuffer::new(UKKONOOA), UnlimitedBuffer::new(&[8]), ]; let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut first = true; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { let mut params0 = BrotliEncoderParams::default(); params0.appendable = first; params0.catable = !first; params0.use_dictionary = first; super::compress(src, dst, 4096, ¶ms0, &[], 1).unwrap(); first = false; } concat(&mut files[..], &mut ufiles[..], None, 2); } #[test] fn test_one_byte_before_works() { let mut files = [ UnlimitedBuffer::new(&[8]), UnlimitedBuffer::new(UKKONOOA), ]; let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut first = true; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { let mut params0 = BrotliEncoderParams::default(); params0.appendable = first; params0.catable = !first; params0.use_dictionary = first; super::compress(src, dst, 4096, ¶ms0, &[], 1).unwrap(); first = false; } concat(&mut files[..], &mut ufiles[..], None, 2); } #[test] fn test_two_byte_works() { let mut files = [ UnlimitedBuffer::new(UKKONOOA), UnlimitedBuffer::new(&[8, 9]), ]; let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut first = true; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { let mut params0 = BrotliEncoderParams::default(); params0.appendable = first; params0.catable = !first; params0.use_dictionary = first; super::compress(src, dst, 4096, ¶ms0, &[], 1).unwrap(); first = false; } concat(&mut files[..], &mut ufiles[..], None, 2); } #[test] fn test_two_byte_before_works() { let mut files = [ UnlimitedBuffer::new(&[8, 9]), UnlimitedBuffer::new(UKKONOOA), ]; let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut first = true; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { let mut params0 = BrotliEncoderParams::default(); params0.appendable = first; params0.catable = !first; params0.use_dictionary = first; super::compress(src, dst, 4096, ¶ms0, &[], 1).unwrap(); first = false; } concat(&mut files[..], &mut ufiles[..], None, 2); } #[test] fn test_empty_then_cat_works() { let mut files = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(QUICKFOX), ]; let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut first = true; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { let mut params0 = BrotliEncoderParams::default(); params0.appendable = first; params0.catable = !first; params0.use_dictionary = first; super::compress(src, dst, 4096, ¶ms0, &[], 1).unwrap(); first = false; } concat(&mut files[..], &mut ufiles[..], None, 2); } #[test] fn test_concat() { let mut files = [ UnlimitedBuffer::new(ALICE), UnlimitedBuffer::new(RANDOMTHENUNICODE), UnlimitedBuffer::new(UKKONOOA), UnlimitedBuffer::new(ASYOULIKE), UnlimitedBuffer::new(BACKWARD65536), UnlimitedBuffer::new(EMPTY), UnlimitedBuffer::new(DICTWORD), UnlimitedBuffer::new(RANDOM10K), UnlimitedBuffer::new(QUICKFOX), ]; let mut params0 = BrotliEncoderParams::default(); light_debug_test(&mut params0); let mut params1 = params0.clone(); params1.quality = 9; params1.q9_5 = true; params1.lgwin=22; params1.magic_number = true; medium_debug_test(&mut params1); let mut params2 = params0.clone(); params2.quality = if params1.q9_5 || params1.quality > 9 {9} else {8}; params2.lgwin=19; let mut params3 = params0.clone(); params3.quality = 8; params3.lgwin = 16; params3.magic_number = true; let mut params4 = params0.clone(); params4.quality = 7; params4.lgwin = 14; let mut params4 = params0.clone(); params4.quality = 1; params4.lgwin = 10; let mut params5 = params0.clone(); params5.quality = 0; params5.lgwin = 10; params5.magic_number = true; params0.lgwin = 26; params0.large_window = true; let mut options = [ params0, params1, params2, params3, params4, params5, ]; for option in options.iter_mut().skip(3) { let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut first = true; for (src, dst) in files.iter_mut().zip(ufiles.iter_mut()) { if first { option.appendable = true; } else { option.appendable = false; option.catable = true; option.use_dictionary = false; } super::compress(src, dst, 4096, option, &[], 1).unwrap(); src.reset_read(); first = false; } concat_many_subsets(&mut files[..], &mut ufiles[..], None); return; } let mut ufiles = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let options_len = options.len(); for (index, (src, dst)) in files.iter_mut().zip(ufiles.iter_mut()).enumerate() { options[core::cmp::min(index, options_len - 1)].catable = true; options[core::cmp::min(index, options_len - 1)].use_dictionary = false; options[core::cmp::min(index, options_len - 1)].appendable = false; options[core::cmp::min(index, options_len - 1)].quality = core::cmp::max( 2, options[core::cmp::min(index, options_len - 1)].quality); // ^^^ there's an artificial limitation of using 18 as the minimum window size for quality 0,1 // since this test depends on different window sizes for each stream, exclude q={0,1} super::compress(src, dst, 4096, &options[core::cmp::min(index, options_len - 1)], &[], 1).unwrap(); src.reset_read(); } concat_many_subsets(&mut files[..], &mut ufiles[..], None); concat_many_subsets(&mut files[..], &mut ufiles[..], Some(28)); // FIXME: make this 28 } brotli-3.4.0/src/bin/test_custom_dict.rs000075500000000000000000000154351046102023000164170ustar 00000000000000#![cfg(test)] #![allow(non_upper_case_globals)] #![allow(dead_code)] extern crate core; extern crate brotli_decompressor; use super::brotli::enc::BrotliEncoderParams; use super::brotli::concat::{BroCatli, BroCatliResult}; use std::io::{Read, Write}; use super::integration_tests::UnlimitedBuffer; static RANDOM_THEN_UNICODE : &'static [u8] = include_bytes!("../../testdata/random_then_unicode"); static ALICE: &'static[u8] = include_bytes!("../../testdata/alice29.txt"); use super::Rebox; #[test] fn test_custom_dict() { let mut raw = UnlimitedBuffer::new(ALICE); let mut params = BrotliEncoderParams::default(); params.quality = 10; let mut br = UnlimitedBuffer::new(&[]); let mut rt = UnlimitedBuffer::new(&[]); let dict = &ALICE[12515..23411]; super::compress(&mut raw, &mut br, 4096, ¶ms, dict, 1).unwrap(); raw.reset_read(); let mut vec = Vec::::new(); vec.extend(dict); super::decompress(&mut br, &mut rt, 4096, Rebox::from(vec)).unwrap(); assert_eq!(rt.data(), raw.data()); if br.data().len() != 43654 { assert_eq!(br.data().len(), 43636); } } #[test] fn test_custom_wrong_dict_fails() { let mut raw = UnlimitedBuffer::new(ALICE); let mut params = BrotliEncoderParams::default(); params.quality = 10; let mut br = UnlimitedBuffer::new(&[]); let mut rt = UnlimitedBuffer::new(&[]); let dict = &ALICE[12515..19515]; super::compress(&mut raw, &mut br, 4096, ¶ms, dict, 1).unwrap(); raw.reset_read(); let mut vec = Vec::::new(); vec.extend(&dict[1..]); // slightly offset dictionary to be wrong, and ensure the dict was being used above match super::decompress(&mut br, &mut rt, 4096, Rebox::from(vec)) { Ok(_) => panic!("Decompression should have failed"), Err(_) => {}, } if rt.data() == raw.data() { panic!("they should be unequal"); } } #[test] fn test_custom_wrong_dict_fails_but_doesnt_disrupt_compression_strategy() { let mut raw = UnlimitedBuffer::new(ALICE); let mut params = BrotliEncoderParams::default(); params.quality = 6; let mut br = UnlimitedBuffer::new(&[]); let mut rt = UnlimitedBuffer::new(&[]); let dict = &ALICE[12515..19515]; super::compress(&mut raw, &mut br, 4096, ¶ms, dict, 1).unwrap(); raw.reset_read(); let mut vec = Vec::::new(); vec.extend(&dict[1..]); // slightly offset dictionary to be wrong, and ensure the dict was being used above super::decompress(&mut br, &mut rt, 4096, Rebox::from(vec)).unwrap(); if rt.data() == raw.data() { panic!("they should be unequal"); } } #[test] fn test_custom_dict_for_multithreading() { let mut raws = [UnlimitedBuffer::new(&ALICE[..ALICE.len()/3]), UnlimitedBuffer::new(&ALICE[ALICE.len()/3..2*ALICE.len()/3]), UnlimitedBuffer::new(&ALICE[2 * ALICE.len()/3..]), ]; let mut params = BrotliEncoderParams::default(); params.quality = 10; params.appendable = true; let mut brs = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let mut rts = [ UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), UnlimitedBuffer::new(&[]), ]; let dicts = [ &ALICE[..0], &ALICE[..ALICE.len()/3], &ALICE[..2*ALICE.len()/3], ]; for (raw, (br, (rt, dict))) in raws.iter_mut().zip(brs.iter_mut().zip(rts.iter_mut().zip(dicts.iter()))) { super::compress(raw, br, 4096, ¶ms, dict, 1).unwrap(); raw.reset_read(); let mut vec = Vec::::new(); vec.extend(*dict); super::decompress(br, rt, 4096, Rebox::from(vec)).unwrap(); assert_eq!(rt.data(), raw.data()); params.catable = true; params.use_dictionary = false; } let mut bro_cat_li = BroCatli::new(); let mut output = UnlimitedBuffer::new(&[]); let mut ibuffer = vec![0u8; 1]; let mut obuffer = vec![0u8; 1]; let mut ooffset = 0usize; for brotli in brs.iter_mut() { brotli.reset_read(); bro_cat_li.new_brotli_file(); let input = brotli; loop { let mut ioffset = 0usize; match input.read(&mut ibuffer[..]) { Err(e) => panic!("{:?}", e), Ok(cur_read) => { if cur_read == 0 { break; } loop { match bro_cat_li.stream(&ibuffer[..cur_read], &mut ioffset, &mut obuffer[..], &mut ooffset) { BroCatliResult::NeedsMoreOutput => { match output.write(&obuffer[..ooffset]) { Err(why) => panic!("couldn't write: {:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } ooffset = 0; }, BroCatliResult::NeedsMoreInput => { break; }, BroCatliResult::Success => { panic!("Unexpected state: Success when streaming before finish"); }, failure => { panic!("{:?}", failure); }, } } } } } } loop { match bro_cat_li.finish(&mut obuffer[..], &mut ooffset) { BroCatliResult::NeedsMoreOutput => { match output.write(&obuffer[..ooffset]) { Err(why) => panic!("couldn't write\n{:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } ooffset = 0; }, BroCatliResult::NeedsMoreInput => { panic!("Unexpected EOF"); }, BroCatliResult::Success => { if ooffset != 0 { match output.write(&obuffer[..ooffset]) { Err(why) => panic!("couldn't write\n{:}", why), Ok(count) => {assert_eq!(count, ooffset);}, } } break; } failure => { panic!("{}", failure as i32) } } } let mut rt = UnlimitedBuffer::new(&[]); output.reset_read(); super::decompress(&mut output, &mut rt, 4096, Rebox::default()).unwrap(); assert_eq!(rt.data(), ALICE); // without setting std flag: approximation make it 4 bytes bigger if output.data().len() != 48568 { assert_eq!(output.data().len(), 48563); // as opposed to 46487 with standard settings } } brotli-3.4.0/src/bin/test_threading.rs000075500000000000000000000167451046102023000160540ustar 00000000000000#![cfg(test)] #![allow(non_upper_case_globals)] #![allow(dead_code)] extern crate core; extern crate brotli_decompressor; use super::new_brotli_heap_alloc; use brotli_decompressor::{SliceWrapperMut, SliceWrapper}; use super::brotli::enc::{UnionHasher, BrotliEncoderParams, BrotliEncoderMaxCompressedSizeMulti, compress_multi, compress_multi_no_threadpool}; use brotli::enc::threading::{SendAlloc,Owned}; use super::integration_tests::UnlimitedBuffer; static RANDOM_THEN_UNICODE : &'static [u8] = include_bytes!("../../testdata/random_then_unicode"); static ALICE: &'static[u8] = include_bytes!("../../testdata/alice29.txt"); use super::Rebox; struct SliceRef<'a> (&'a [u8]); impl<'a> SliceWrapper for SliceRef<'a> { fn slice(&self) -> &[u8] { self.0 } } fn multi_threaded_split_compression_test(input_data: &'static[u8], num_threads: usize, quality: i32, catable: bool, expected_size: usize) { let mut params = BrotliEncoderParams::default(); params.quality = quality; params.magic_number = true; if catable { params.catable = true; params.use_dictionary = false; } let mut output = Rebox::from(vec![0u8;BrotliEncoderMaxCompressedSizeMulti(input_data.len(), num_threads)]); let mut alloc_per_thread = [ SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), ]; if num_threads > alloc_per_thread.len() { panic!("Too many threads requested {} > {}", num_threads, alloc_per_thread.len()); } let res = compress_multi( ¶ms, &mut Owned::new(SliceRef(input_data)), output.slice_mut(), &mut alloc_per_thread[..num_threads], ); let observed_size = res.unwrap(); if observed_size > expected_size { assert_eq!(observed_size, expected_size); } assert!(observed_size != 0); let mut compressed_version = UnlimitedBuffer::new(&output.slice()[..observed_size]); let mut rt = UnlimitedBuffer::new(&[]); match super::decompress(&mut compressed_version, &mut rt, 65536, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } assert_eq!(rt.data(), input_data); } #[test] fn multi_threaded_split_compression_test_1() { multi_threaded_split_compression_test(&RANDOM_THEN_UNICODE[..], 1, 3, false, 155808) } #[test] fn multi_threaded_split_compression_test_2() { multi_threaded_split_compression_test(&RANDOM_THEN_UNICODE[..], 2, 4, false, 151857) } #[test] fn multi_threaded_split_compression_test_3() { multi_threaded_split_compression_test(&RANDOM_THEN_UNICODE[..], 3, 5, false, 144325) } #[test] fn multi_threaded_split_compression_test_4() { multi_threaded_split_compression_test(&RANDOM_THEN_UNICODE[..], 4, 10, true, 136812) } #[test] fn multi_threaded_split_compression_test_5() { multi_threaded_split_compression_test(&RANDOM_THEN_UNICODE[..], 5, 9, false, 139126) } #[test] fn multi_threaded_split_compression_test_1b1() { multi_threaded_split_compression_test(&RANDOM_THEN_UNICODE[..1], 5, 9, false, 139126) } #[test] fn multi_threaded_split_compression_test_1b5() { multi_threaded_split_compression_test(&RANDOM_THEN_UNICODE[..1], 5, 9, false, 139125) } #[test] fn multi_threaded_split_compression_test_0b1() { multi_threaded_split_compression_test(&[], 5, 9, false, 139125) } #[test] fn multi_threaded_split_compression_test_0b5() { multi_threaded_split_compression_test(&[], 5, 9, false, 139125) } fn thread_spawn_per_job_split_compression_test(input_data: &'static[u8], num_threads: usize, quality: i32, catable: bool, expected_size: usize) { let mut params = BrotliEncoderParams::default(); params.quality = quality; params.magic_number = true; if catable { params.catable = true; params.use_dictionary = false; } params.favor_cpu_efficiency = true; // this should test both paths let mut output = Rebox::from(vec![0u8;BrotliEncoderMaxCompressedSizeMulti(input_data.len(), num_threads)]); let mut alloc_per_thread = [ SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), SendAlloc::new(new_brotli_heap_alloc(), UnionHasher::Uninit), ]; if num_threads > alloc_per_thread.len() { panic!("Too many threads requested {} > {}", num_threads, alloc_per_thread.len()); } let res = compress_multi_no_threadpool( ¶ms, &mut Owned::new(SliceRef(input_data)), output.slice_mut(), &mut alloc_per_thread[..num_threads], ); let observed_size = res.unwrap(); if observed_size > expected_size { assert_eq!(observed_size, expected_size); } assert!(observed_size != 0); let mut compressed_version = UnlimitedBuffer::new(&output.slice()[..observed_size]); let mut rt = UnlimitedBuffer::new(&[]); match super::decompress(&mut compressed_version, &mut rt, 65536, Rebox::default()) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } assert_eq!(rt.data(), input_data); } #[test] fn thread_spawn_per_job_split_compression_test_1() { thread_spawn_per_job_split_compression_test(&RANDOM_THEN_UNICODE[..], 1, 3, false, 155808) } #[test] fn thread_spawn_per_job_split_compression_test_3() { thread_spawn_per_job_split_compression_test(&RANDOM_THEN_UNICODE[..], 3, 5, false, 144325) } #[test] fn thread_spawn_per_job_split_compression_test_1b1() { thread_spawn_per_job_split_compression_test(&RANDOM_THEN_UNICODE[..1], 1, 3, false, 155808) } #[test] fn thread_spawn_per_job_split_compression_test_1b3() { thread_spawn_per_job_split_compression_test(&RANDOM_THEN_UNICODE[..1], 3, 5, false, 144325) } #[test] fn thread_spawn_per_job_split_compression_test_0b1() { thread_spawn_per_job_split_compression_test(&[], 1, 3, false, 155808) } #[test] fn thread_spawn_per_job_split_compression_test_0b3() { thread_spawn_per_job_split_compression_test(&[], 3, 5, false, 144325) } brotli-3.4.0/src/bin/tests.rs000075500000000000000000000054041046102023000142000ustar 00000000000000#![cfg(test)] extern crate core; use core::cmp; use std::io; struct Buffer { data: Vec, read_offset: usize, } impl Buffer { pub fn new(buf: &[u8]) -> Buffer { let mut ret = Buffer { data: Vec::::new(), read_offset: 0, }; ret.data.extend(buf); return ret; } } impl io::Read for Buffer { fn read(self: &mut Self, buf: &mut [u8]) -> io::Result { let bytes_to_read = cmp::min(buf.len(), self.data.len() - self.read_offset); if bytes_to_read > 0 { buf[0..bytes_to_read].clone_from_slice(&self.data[self.read_offset.. self.read_offset + bytes_to_read]); } self.read_offset += bytes_to_read; return Ok(bytes_to_read); } } impl io::Write for Buffer { fn write(self: &mut Self, buf: &[u8]) -> io::Result { self.data.extend(buf); return Ok(buf.len()); } fn flush(self: &mut Self) -> io::Result<()> { return Ok(()); } } fn copy_from_to(mut r: R, mut w: W) -> io::Result { let mut buffer: [u8; 65536] = [0; 65536]; let mut out_size: usize = 0; loop { match r.read(&mut buffer[..]) { Err(e) => { match e.kind() { io::ErrorKind::Interrupted => continue, _ => {} } return Err(e); } Ok(size) => { if size == 0 { break; } else { match w.write_all(&buffer[..size]) { Err(e) => { match e.kind() { io::ErrorKind::Interrupted => continue, _ => {} } return Err(e); } Ok(_) => out_size += size, } } } } } return Ok(out_size); } #[test] fn test_10x_10y() { let in_buf: [u8; 12] = [0x1b, 0x13, 0x00, 0x00, 0xa4, 0xb0, 0xb2, 0xea, 0x81, 0x47, 0x02, 0x8a]; let mut output = Buffer::new(&[]); let mut input = super::BrotliDecompressor::new(Buffer::new(&in_buf), 4096); match copy_from_to(&mut input, &mut output) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } let mut i: usize = 0; while i < 10 { assert_eq!(output.data[i], 'X' as u8); assert_eq!(output.data[i + 10], 'Y' as u8); i += 1; } assert_eq!(output.data.len(), 20); } #[test] fn test_alice() { let in_buf = include_bytes!("../../testdata/alice29.txt.compressed"); let mut output = Buffer::new(&[]); let mut input = super::BrotliDecompressor::new(Buffer::new(in_buf), 1); match copy_from_to(&mut input, &mut output) { Ok(_) => {} Err(e) => panic!("Error {:?}", e), } let mut i: usize = 0; let truth = include_bytes!("../../testdata/alice29.txt"); while i < truth.len() { assert_eq!(output.data[i], truth[i]); i += 1; } assert_eq!(truth.len(), output.data.len()); } brotli-3.4.0/src/bin/util.rs000064400000000000000000000267021046102023000140140ustar 00000000000000use core::mem; use std; use core::marker::PhantomData; use std::thread::{ JoinHandle, }; use brotli::dictionary::{kBrotliDictionary, kBrotliDictionarySizeBitsByLength, kBrotliDictionaryOffsetsByLength}; use brotli::transform::{TransformDictionaryWord}; use brotli::interface; use std::collections::BTreeMap; use std::fmt; use alloc_no_stdlib::{SliceWrapper, Allocator}; use brotli::enc::BrotliAlloc; use brotli::enc::threading::{ SendAlloc, InternalSendAlloc, BatchSpawnable, BatchSpawnableLite, Joinable, Owned, OwnedRetriever, InternalOwned, BrotliEncoderThreadError, AnyBoxConstructor, PoisonedThreadError, }; struct HexSlice<'a>(&'a [u8]); impl<'a> fmt::Display for HexSlice<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { for byte in self.0 { if let Err(e) = write!(f, "{:02X}", byte) { return Err(e); } } Ok(()) } } pub fn permute_dictionary() -> BTreeMap, ()> { let mut ret = BTreeMap::, ()>::new(); let mut transformed = [0u8;38]; for wordlen in 4..kBrotliDictionaryOffsetsByLength.len() { let offset = kBrotliDictionaryOffsetsByLength[wordlen] as usize; for index in 0..(1 << kBrotliDictionarySizeBitsByLength[wordlen]) { let word = &kBrotliDictionary[offset + index..offset + index + wordlen]; for transform in 0..121 { let final_size = TransformDictionaryWord(&mut transformed[..], word, wordlen as i32, transform as i32) as usize; let vec : Vec = transformed[..final_size].to_vec(); ret.insert(vec, ()); } } } ret } pub fn print_dictionary(dict :BTreeMap, ()>) { for (key, _) in dict { println!("{}", HexSlice(&key[..])); } } macro_rules! println_stderr( ($($val:tt)*) => { { writeln!(&mut ::std::io::stderr(), $($val)*).unwrap(); } } ); fn prediction_mode_str(prediction_mode_nibble:interface::LiteralPredictionModeNibble) -> &'static str { match prediction_mode_nibble.prediction_mode() { interface::LITERAL_PREDICTION_MODE_SIGN => "sign", interface::LITERAL_PREDICTION_MODE_LSB6 => "lsb6", interface::LITERAL_PREDICTION_MODE_MSB6 => "msb6", interface::LITERAL_PREDICTION_MODE_UTF8 => "utf8", _ => "unknown", } } struct SliceU8Ref<'a>(pub &'a[u8]); impl<'a> fmt::LowerHex for SliceU8Ref<'a> { fn fmt(&self, fmtr: &mut fmt::Formatter) -> Result<(), fmt::Error> { for item in self.0 { if let Err(e) = fmtr.write_fmt(format_args!("{:02x}", item)) { return Err(e); } } Ok(()) } } pub fn write_one>(cmd: &interface::Command) { use std::io::Write; match cmd { &interface::Command::BlockSwitchLiteral(ref bsl) => { println_stderr!("ltype {} {}", bsl.0.block_type(), bsl.1); }, &interface::Command::BlockSwitchCommand(ref bsc) => { println_stderr!("ctype {}", bsc.0); }, &interface::Command::BlockSwitchDistance(ref bsd) => { println_stderr!("dtype {}", bsd.0); }, &interface::Command::PredictionMode(ref prediction) => { let prediction_mode = prediction_mode_str(prediction.literal_prediction_mode()); let lit_cm = prediction.literal_context_map.slice().iter().fold(::std::string::String::new(), |res, &val| res + " " + &val.to_string()); let dist_cm = prediction.distance_context_map().iter().fold(::std::string::String::new(), |res, &val| res + " " + &val.to_string()); let mixing_values = prediction.get_mixing_values().iter().fold(::std::string::String::new(), |res, &val| res + " " + &val.to_string()); if prediction.has_context_speeds() { println_stderr!("prediction {} lcontextmap{} dcontextmap{} mixingvalues{} cmspeedinc {} {} cmspeedmax {} {} stspeedinc {} {} stspeedmax {} {} mxspeedinc {} {} mxspeedmax {} {}", prediction_mode, lit_cm, dist_cm, mixing_values, prediction.context_map_speed()[0].0, prediction.context_map_speed()[1].0, prediction.context_map_speed()[0].1, prediction.context_map_speed()[1].1, prediction.stride_context_speed()[0].0, prediction.stride_context_speed()[1].0, prediction.stride_context_speed()[0].1, prediction.stride_context_speed()[1].1, prediction.combined_stride_context_speed()[0].0, prediction.combined_stride_context_speed()[1].0, prediction.combined_stride_context_speed()[0].1, prediction.combined_stride_context_speed()[0].1, ); }else { println_stderr!("prediction {} lcontextmap{} dcontextmap{} mixingvalues{}", prediction_mode, lit_cm, dist_cm, mixing_values, ); } }, &interface::Command::Copy(ref copy) => { println_stderr!("copy {} from {}", copy.num_bytes, copy.distance); }, &interface::Command::Dict(ref dict) => { let mut transformed_word = [0u8;38]; let word_index = dict.word_id as usize * dict.word_size as usize + kBrotliDictionaryOffsetsByLength[dict.word_size as usize] as usize; let raw_word = &kBrotliDictionary[word_index..(word_index + dict.word_size as usize)]; let actual_copy_len = TransformDictionaryWord(&mut transformed_word[..], raw_word, dict.word_size as i32, dict.transform as i32) as usize; transformed_word.split_at(actual_copy_len).0; assert_eq!(dict.final_size as usize, actual_copy_len); println_stderr!("dict {} word {},{} {:x} func {} {:x}", actual_copy_len, dict.word_size, dict.word_id, SliceU8Ref(raw_word), dict.transform, SliceU8Ref(transformed_word.split_at(actual_copy_len).0)); }, &interface::Command::Literal(ref lit) => { println_stderr!("{} {} {:x}", if lit.high_entropy {"rndins"} else {"insert"}, lit.data.slice().len(), SliceU8Ref(lit.data.slice())); }, } } // in-place thread create use std::sync::RwLock; pub struct MTJoinable(JoinHandle, PhantomData); #[cfg(not(feature="std"))] impl Joinable for MTJoinable { fn join(self) -> Result { match self.0.join() { Ok(t) => Ok(t), Err(_e) => Err(::new(())), } } } #[cfg(feature="std")] impl Joinable for MTJoinable { fn join(self) -> Result { match self.0.join() { Ok(t) => Ok(t), Err(e) => Err(::new(e)), } } } pub struct MTOwnedRetriever(std::sync::Arc>); impl Clone for MTOwnedRetriever { fn clone(&self) -> Self { MTOwnedRetriever(self.0.clone()) } } impl OwnedRetriever for MTOwnedRetriever { fn view T>(&self, f:F) -> Result { match self.0.read() { Ok(u) => Ok(f(&*u)), Err(_) => Err(PoisonedThreadError::default()), } } fn unwrap(self) -> Result { match std::sync::Arc::try_unwrap(self.0) { Ok(rwlock) => match rwlock.into_inner() { Ok(u) => Ok(u), Err(_) => Err(PoisonedThreadError::default()), }, Err(_) => Err(PoisonedThreadError::default()), } } } #[derive(Default)] pub struct MTSpawner{} fn spawn_work T+Send+'static, Alloc:BrotliAlloc+Send+'static, U:Send+'static+Sync>( extra_input: ExtraInput, index: usize, num_threads: usize, locked_input:MTOwnedRetriever, alloc:Alloc, f:F) -> std::thread::JoinHandle where >::AllocatedMemory:Send+'static { std::thread::spawn(move || { locked_input.view(move |guard:&U|->T { f(extra_input, index, num_threads, guard, alloc) }).unwrap() }) } impl BatchSpawnable for MTSpawner where >::AllocatedMemory:Send+'static { type JoinHandle = MTJoinable; type FinalJoinHandle = MTOwnedRetriever; fn make_spawner( &mut self, input: &mut Owned, ) -> Self::FinalJoinHandle { MTOwnedRetriever(std::sync::Arc::>::new(RwLock::new(mem::replace(input, Owned(InternalOwned::Borrowed)).unwrap()))) } fn spawn T+Send+'static+Copy>( &mut self, locked_input: &mut Self::FinalJoinHandle, work:&mut SendAlloc, index: usize, num_threads: usize, f: F, ) { let (alloc, extra_input) = work.replace_with_default(); let ret = spawn_work(extra_input, index, num_threads, locked_input.clone(), alloc, f); *work = SendAlloc(InternalSendAlloc::Join(MTJoinable(ret, PhantomData::default()))); } } impl BatchSpawnableLite for MTSpawner where >::AllocatedMemory:Send+'static { type JoinHandle = >::JoinHandle; type FinalJoinHandle = >::FinalJoinHandle; fn make_spawner( &mut self, input: &mut Owned, ) -> Self::FinalJoinHandle { >::make_spawner(self, input) } fn spawn( &mut self, handle:&mut Self::FinalJoinHandle, alloc_per_thread:&mut SendAlloc, index: usize, num_threads: usize, f: fn(ExtraInput, usize, usize, &U, Alloc) -> T, ) { >::spawn(self, handle, alloc_per_thread, index, num_threads, f) } } brotli-3.4.0/src/bin/validate.rs000064400000000000000000000135621046102023000146300ustar 00000000000000#[cfg(feature="validation")] use core; use std::io::{self, Error, ErrorKind, Read, Write}; use super::{Rebox, HeapAllocator, IoWriterWrapper}; use brotli::{DecompressorWriterCustomIo, CustomWrite}; use alloc_no_stdlib::{Allocator, SliceWrapper}; use brotli::enc::BrotliEncoderParams; #[cfg(feature="validation")] use sha2::{Sha256, Digest}; #[cfg(feature="validation")] type Checksum = Sha256; struct Tee(OutputA, OutputB); impl Write for Tee { fn write(&mut self, data:&[u8]) -> Result { match self.0.write(data) { Err(err) => return Err(err), Ok(size) => match self.1.write_all(&data[..size]) { Ok(_) => Ok(size), Err(err) => Err(err), } } } fn flush(&mut self) -> Result<(), io::Error> { match self.0.flush() { Err(err) => return Err(err), Ok(_) => { loop { match self.1.flush() { Err(e) => match e.kind() { ErrorKind::Interrupted => continue, _ => return Err(e), }, Ok(e) => return Ok(e), } } }, } } } struct DecompressAndValidate<'a, OutputType:Write+'a>( DecompressorWriterCustomIo, Rebox, // buffer type HeapAllocator, HeapAllocator, HeapAllocator> ); impl<'a, OutputType:Write> Write for DecompressAndValidate<'a, OutputType> { fn write(&mut self, data:&[u8]) -> Result { self.0.write(data) } fn flush(&mut self) -> Result<(), io::Error> { self.0.flush() } } #[cfg(not(feature="validation"))] fn make_sha_writer() -> io::Sink { io::sink() } #[cfg(not(feature="validation"))] fn make_sha_reader(r:&mut InputType) -> &mut InputType { r } #[cfg(not(feature="validation"))] fn sha_ok(_writer: &mut io::Sink, _reader: &mut InputType) -> bool { false } #[cfg(feature="validation")] struct ShaReader<'a, InputType:Read+'a> { reader:&'a mut InputType, checksum:Checksum, } #[cfg(feature="validation")] impl<'a, InputType:Read+'a> Read for ShaReader<'a, InputType> { fn read(&mut self, data: &mut [u8]) -> Result { match self.reader.read(data) { Err(e) => Err(e), Ok(size) => { self.checksum.update(&data[..size]); Ok(size) }, } } } #[cfg(feature="validation")] fn make_sha_reader(r:&mut InputType) -> ShaReader { ShaReader{ reader:r, checksum:Checksum::default(), } } #[cfg(feature="validation")] fn sha_ok(writer: &mut ShaWriter, reader: &mut ShaReader) -> bool { core::mem::replace(&mut writer.0, Checksum::default()).finalize() == core::mem::replace(&mut reader.checksum, Checksum::default()).finalize() } #[cfg(feature="validation")] #[derive(Default)] struct ShaWriter(Checksum); #[cfg(feature="validation")] impl Write for ShaWriter { fn write(&mut self, data:&[u8]) -> Result { self.0.update(data); Ok(data.len()) } fn flush(&mut self) -> Result<(), io::Error> { Ok(()) } } #[cfg(feature="validation")] fn make_sha_writer() -> ShaWriter { ShaWriter::default() } #[cfg(feature="validation")] const VALIDATION_FAILED: &'static str = "Validation failed"; #[cfg(not(feature="validation"))] const VALIDATION_FAILED: &'static str = "Validation module not enabled: build with cargo build --features=validation"; pub fn compress_validate(r: &mut InputType, w: &mut OutputType, buffer_size: usize, params: &BrotliEncoderParams, custom_dictionary:Rebox, num_threads: usize) -> Result<(), io::Error> { let mut m8 = HeapAllocator::default(); let buffer = >::alloc_cell(&mut m8, buffer_size); // FIXME: could reuse the dictionary to seed the compressor, but that violates the abstraction right now // also dictionaries are not very popular since they are mostly an internal concept, given their deprecation in // the standard brotli spec let mut dict = Vec::::new(); dict.extend_from_slice(custom_dictionary.slice()); let mut sha_writer = make_sha_writer(); let mut sha_reader = make_sha_reader(r); let ret; { let validate_writer = DecompressAndValidate(DecompressorWriterCustomIo::new_with_custom_dictionary( IoWriterWrapper(&mut sha_writer), buffer, m8, HeapAllocator::default(), HeapAllocator::default(), custom_dictionary, Error::new(ErrorKind::InvalidData, "Invalid Data"))); let mut overarching_writer = Tee(validate_writer, w); ret = super::compress(&mut sha_reader, &mut overarching_writer, buffer_size, params, &dict[..], num_threads); } match ret { Ok(_ret) => { if sha_ok(&mut sha_writer, &mut sha_reader) { return Ok(()); } else { return Err(Error::new(ErrorKind::InvalidData, VALIDATION_FAILED)); } }, Err(e) => Err(e), } } brotli-3.4.0/src/concat/mod.rs000064400000000000000000000604361046102023000143170ustar 00000000000000use core; #[repr(C)] #[derive(Debug,Clone,Copy, PartialEq)] pub enum BroCatliResult { Success = 0, NeedsMoreInput = 1, NeedsMoreOutput = 2, BrotliFileNotCraftedForAppend = 124, InvalidWindowSize = 125, WindowSizeLargerThanPreviousFile = 126, BrotliFileNotCraftedForConcatenation = 127, } const NUM_STREAM_HEADER_BYTES: usize = 5; #[derive(Clone,Copy)] struct NewStreamData { bytes_so_far: [u8;NUM_STREAM_HEADER_BYTES], num_bytes_read: u8, num_bytes_written: Option, } impl NewStreamData { pub fn new() -> NewStreamData{ NewStreamData{ bytes_so_far:[0,0,0,0,0], num_bytes_read:0, num_bytes_written:None, } } fn sufficient(&self) -> bool { if self.num_bytes_read == 4 && (127&self.bytes_so_far[0]) != 17 { return true; } self.num_bytes_read == 5 } } fn parse_window_size(bytes_so_far:&[u8]) -> Result<(u8, usize), ()> { // returns window_size and offset in stream in bits if bytes_so_far[0] & 1 == 0 { return Ok((16, 1)); } match bytes_so_far[0] & 15 { 0x3 => return Ok((18, 4)), 0x5 => return Ok((19, 4)), 0x7 => return Ok((20, 4)), 0x9 => return Ok((21, 4)), 0xb => return Ok((22, 4)), 0xd => return Ok((23, 4)), 0xf => return Ok((24, 4)), _ => match bytes_so_far[0] & 127 { 0x71 => return Ok((15, 7)), 0x61 => return Ok((14, 7)), 0x51 => return Ok((13, 7)), 0x41 => return Ok((12, 7)), 0x31 => return Ok((11, 7)), 0x21 => return Ok((10, 7)), 0x1 => return Ok((17, 7)), _ => {}, } } if (bytes_so_far[0] & 0x80) != 0 { return Err(()); } let ret = bytes_so_far[1] & 0x3f; if ret < 10 || ret > 30 { return Err(()); } Ok((ret, 14)) } fn detect_varlen_offset(bytes_so_far:&[u8]) -> Result<(usize), ()> { // returns offfset in bits let (_, mut offset) = match parse_window_size(bytes_so_far) { Ok(x) => x, Err(_) => return Err(()), }; let mut bytes = 0u64; for (index, item) in bytes_so_far.iter().enumerate() { bytes |= u64::from(*item) << (index * 8); } bytes >>= offset; offset += 1; if (bytes & 1) != 0 { // ISLAST bytes >>= 1; offset += 1; if (bytes & 1) != 0 { // ISLASTEMPTY return Ok(offset); } } bytes >>= 1; let mut mnibbles = bytes & 3; bytes >>= 2; offset += 2; if mnibbles == 3 { // metadata block if (bytes & 1) != 0 { return Err(()); // reserved, must be zero } bytes >>= 1; offset += 1; let mskipbytes = bytes & ((1 << 2) - 1); offset += 2; offset += usize::from(mskipbytes as usize) * 8; // next item is byte aligned return Ok(offset); } mnibbles += 4; offset += usize::from(mnibbles as usize) * 4; bytes >>= mnibbles * 4; offset += 1; if (bytes & 1) == 0 { // not UNCOMPRESSED Err(()) // not valid bitstream for concatenation } else { // UNCOMPRESSED: now things are aligend Ok(offset) } } // eat your vegetables pub struct BroCatli { last_bytes: [u8; 2], last_bytes_len: u8, last_byte_sanitized: bool, any_bytes_emitted: bool, last_byte_bit_offset: u8, // need to make sure that window sizes stay similar or get smaller window_size: u8, new_stream_pending: Option, } impl Default for BroCatli { fn default() -> BroCatli { BroCatli::new() } } impl BroCatli { pub fn new() -> BroCatli { BroCatli { last_bytes: [0,0], last_bytes_len: 0, last_byte_bit_offset: 0, last_byte_sanitized: false, any_bytes_emitted: false, new_stream_pending: None, window_size:0, } } pub fn deserialize_from_buffer(buffer: &[u8]) -> Result { if 16+NUM_STREAM_HEADER_BYTES > buffer.len() { return Err(()); } let mut possible_new_stream_pending = NewStreamData{ num_bytes_read: buffer[12], num_bytes_written: if (buffer[9] & (1<<7)) != 0 {Some(buffer[13])} else {None}, bytes_so_far: [0;NUM_STREAM_HEADER_BYTES], }; let xlen = possible_new_stream_pending.bytes_so_far.len(); possible_new_stream_pending.bytes_so_far.clone_from_slice( &buffer[16..16+xlen]); let new_stream_pending: Option = if (buffer[9] & (1 << 6)) != 0 { Some(possible_new_stream_pending) } else { None }; let mut ret = BroCatli { last_bytes: [0,0], last_bytes_len: buffer[8], last_byte_sanitized: (buffer[9] & 0x1) != 0, last_byte_bit_offset: buffer[10], any_bytes_emitted: (buffer[9] & (1 << 5)) != 0, window_size: buffer[11], new_stream_pending:new_stream_pending, }; if ret.last_bytes.len() > 8 { return Err(()); } let xlen = ret.last_bytes.len(); ret.last_bytes.clone_from_slice(&buffer[..xlen]); Ok(ret) } #[inline(always)] pub fn serialize_to_buffer(&self, buffer: &mut [u8]) -> Result<(), ()> { if 16+NUM_STREAM_HEADER_BYTES > buffer.len() { return Err(()); } buffer[..self.last_bytes.len()].clone_from_slice( &self.last_bytes[..]); buffer[8] = self.last_bytes_len; buffer[9] = (self.last_byte_sanitized as u8) | ((self.new_stream_pending.is_some() as u8) << 6) | ((self.any_bytes_emitted as u8) << 5); buffer[10] = self.last_byte_bit_offset; buffer[11] = self.window_size; if let Some(new_stream_pending) = self.new_stream_pending { if new_stream_pending.num_bytes_written.is_some() { buffer[9] |= (1<<7); } buffer[12] = new_stream_pending.num_bytes_read; buffer[13] = new_stream_pending.num_bytes_written.unwrap_or(0); // 14, 15 reserved buffer[16..16+new_stream_pending.bytes_so_far.len()].clone_from_slice( &new_stream_pending.bytes_so_far[..]); } Ok(()) } pub fn new_with_window_size(log_window_size: u8) -> BroCatli { // in this case setup the last_bytes of the stream to perfectly mimic what would // appear in an empty stream with the selected window size... // this means the window size followed by 2 sequential 1 bits (LAST_METABLOCK, EMPTY) // the new_stream code should naturally find the sequential 1 bits and mask them // out and then prepend the window size... then the following window sizes should // be checked to be shorter let last_bytes_len; let last_bytes; if log_window_size > 24 { last_bytes = [17u8, log_window_size | 64 | 128]; last_bytes_len = 2; } else if log_window_size == 16 { last_bytes = [1 | 2 | 4, 0]; last_bytes_len = 1; } else if log_window_size > 17 { last_bytes = [(3 + (log_window_size - 18) * 2) | (16 | 32), 0]; last_bytes_len = 1; } else { match log_window_size { 15 => last_bytes = [0x71 | 0x80, 1], 14 => last_bytes = [0x61 | 0x80, 1], 13 => last_bytes = [0x51 | 0x80, 1], 12 => last_bytes = [0x41 | 0x80, 1], 11 => last_bytes = [0x31 | 0x80, 1], 10 => last_bytes = [0x21 | 0x80, 1], _ => {assert_eq!(log_window_size, 17); last_bytes = [0x1 | 0x80, 1];} // 17 } last_bytes_len = 2; } BroCatli { last_bytes: last_bytes, last_bytes_len: last_bytes_len, last_byte_bit_offset: 0, last_byte_sanitized: false, any_bytes_emitted: false, new_stream_pending: None, window_size:log_window_size, } } pub fn new_brotli_file(&mut self) { self.new_stream_pending = Some(NewStreamData::new()); } fn flush_previous_stream(&mut self, out_bytes: &mut [u8], out_offset: &mut usize) -> BroCatliResult { if !self.last_byte_sanitized { // if the previous stream hasn't had the last metablock (bit 1,1) sanitized if self.last_bytes_len == 0 { // first stream or otherwise sanitized self.last_byte_sanitized = true; return BroCatliResult::Success; } // create a 16 bit integer with the last 2 bytes of data let mut last_bytes = self.last_bytes[0] as u16 + ((self.last_bytes[1] as u16) << 8); let max = self.last_bytes_len * 8; let mut index = max - 1; for i in 0..max { index = max - 1 - i; if ((1<> (index - 1)) != 3 { // last two bits need to be set for the final metablock return BroCatliResult::BrotliFileNotCraftedForAppend; } index -= 1; // discard the final two bits last_bytes &= (1 << index) - 1; // mask them out self.last_bytes[0] = last_bytes as u8 & 0xff; // reset the last_bytes pair self.last_bytes[1] = (last_bytes >> 8) as u8 & 0xff; if index >= 8 { // if both bits and one useful bit were in the second block, then write that if out_bytes.len() > *out_offset { out_bytes[*out_offset] = self.last_bytes[0]; self.last_bytes[0] = self.last_bytes[1]; *out_offset += 1; self.any_bytes_emitted = true; index -= 8; self.last_bytes_len -= 1; } else { return BroCatliResult::NeedsMoreOutput; } } self.last_byte_bit_offset = index; assert!(index < 8); self.last_byte_sanitized = true; } BroCatliResult::Success } fn shift_and_check_new_stream_header(&mut self, mut new_stream_pending: NewStreamData, out_bytes: &mut [u8], out_offset: &mut usize) -> BroCatliResult { if new_stream_pending.num_bytes_written.is_none() { let (window_size, window_offset) = if let Ok(results) = parse_window_size( &new_stream_pending.bytes_so_far[..usize::from(new_stream_pending.num_bytes_read)], ) { results } else { return BroCatliResult::InvalidWindowSize; }; if self.window_size == 0 { // parse window size and just copy everything self.window_size = window_size; assert_eq!(self.last_byte_bit_offset, 0); // we are first stream out_bytes[*out_offset] = new_stream_pending.bytes_so_far[0]; new_stream_pending.num_bytes_written = Some(1); self.any_bytes_emitted = true; *out_offset += 1; } else { if window_size > self.window_size { return BroCatliResult::WindowSizeLargerThanPreviousFile; } let mut realigned_header:[u8;NUM_STREAM_HEADER_BYTES + 1] = [self.last_bytes[0], 0,0,0,0,0, ]; let varlen_offset = if let Ok(voffset) = detect_varlen_offset( &new_stream_pending.bytes_so_far[..usize::from(new_stream_pending.num_bytes_read)], ) { voffset } else { return BroCatliResult::BrotliFileNotCraftedForConcatenation; }; let mut bytes_so_far = 0u64; for index in 0..usize::from(new_stream_pending.num_bytes_read) { bytes_so_far |= u64::from(new_stream_pending.bytes_so_far[index]) << (index * 8); } bytes_so_far >>= window_offset; // mask out the window size bytes_so_far &= (1u64 << (varlen_offset - window_offset)) - 1; let var_len_bytes = ((usize::from(varlen_offset - window_offset) + 7) / 8); for byte_index in 0..var_len_bytes { let cur_byte = (bytes_so_far >> (byte_index *8)); realigned_header[byte_index] |= ((cur_byte & ((1 << (8 - self.last_byte_bit_offset)) - 1)) << self.last_byte_bit_offset) as u8; realigned_header[byte_index + 1] = (cur_byte >> (8 - self.last_byte_bit_offset)) as u8; } let whole_byte_destination = ((usize::from(self.last_byte_bit_offset) + varlen_offset - window_offset) + 7) / 8; let whole_byte_source = (varlen_offset + 7) / 8; let num_whole_bytes_to_copy = usize::from(new_stream_pending.num_bytes_read) - whole_byte_source; for aligned_index in 0..num_whole_bytes_to_copy { realigned_header[whole_byte_destination + aligned_index] = new_stream_pending.bytes_so_far[whole_byte_source + aligned_index]; } out_bytes[*out_offset] = realigned_header[0]; self.any_bytes_emitted = true; *out_offset += 1; // subtract one since that has just been written out and we're only copying realigned_header[1..] new_stream_pending.num_bytes_read = (whole_byte_destination + num_whole_bytes_to_copy) as u8 - 1; new_stream_pending.num_bytes_written = Some(0); new_stream_pending.bytes_so_far.clone_from_slice(&realigned_header[1..]); } } else { assert!(self.window_size != 0); } let to_copy = core::cmp::min(out_bytes.len() - *out_offset, usize::from(new_stream_pending.num_bytes_read - new_stream_pending.num_bytes_written.unwrap())); out_bytes.split_at_mut(*out_offset).1.split_at_mut(to_copy).0.clone_from_slice( &new_stream_pending.bytes_so_far.split_at(usize::from(new_stream_pending.num_bytes_written.unwrap())).1.split_at(to_copy).0); *out_offset += to_copy; if to_copy != 0 { self.any_bytes_emitted = true; } new_stream_pending.num_bytes_written = Some((new_stream_pending.num_bytes_written.unwrap() + to_copy as u8)); if new_stream_pending.num_bytes_written.unwrap() != new_stream_pending.num_bytes_read { self.new_stream_pending = Some(new_stream_pending); return BroCatliResult::NeedsMoreOutput; } self.new_stream_pending = None; self.last_byte_sanitized = false; self.last_byte_bit_offset = 0; self.last_bytes_len = 0; self.last_bytes = [0,0]; //now unwrite from the stream, since the last byte may need to be adjusted to be EOF *out_offset -= 1; self.last_bytes[0] = out_bytes[*out_offset]; self.last_bytes_len = 1; BroCatliResult::Success } pub fn stream(&mut self, in_bytes: &[u8], in_offset: &mut usize, out_bytes: &mut [u8], out_offset: &mut usize) -> BroCatliResult { if let Some(mut new_stream_pending) = self.new_stream_pending.clone() { let flush_result = self.flush_previous_stream(out_bytes, out_offset); if let BroCatliResult::Success = flush_result { if usize::from(new_stream_pending.num_bytes_read) < new_stream_pending.bytes_so_far.len() { { let dst = &mut new_stream_pending.bytes_so_far[usize::from(new_stream_pending.num_bytes_read)..]; let to_copy = core::cmp::min(dst.len(), in_bytes.len() - *in_offset); dst[..to_copy].clone_from_slice(in_bytes.split_at(*in_offset).1.split_at(to_copy).0); *in_offset += to_copy; new_stream_pending.num_bytes_read += to_copy as u8; } self.new_stream_pending = Some(new_stream_pending); // write back changes } if !new_stream_pending.sufficient() { return BroCatliResult::NeedsMoreInput; } if out_bytes.len() == *out_offset { return BroCatliResult::NeedsMoreOutput; } let shift_result = self.shift_and_check_new_stream_header(new_stream_pending, out_bytes, out_offset); if let BroCatliResult::Success = shift_result { } else { return shift_result; } } else { return flush_result; } if *out_offset == out_bytes.len() { return BroCatliResult::NeedsMoreOutput; // need to be able to write at least one byte of data to make progress } } assert!(self.new_stream_pending.is_none());// this should have been handled above if self.last_bytes_len != 2 { if out_bytes.len() == *out_offset{ return BroCatliResult::NeedsMoreOutput; } if in_bytes.len() == *in_offset { return BroCatliResult::NeedsMoreInput; } self.last_bytes[usize::from(self.last_bytes_len)] = in_bytes[*in_offset]; *in_offset += 1; self.last_bytes_len += 1; if self.last_bytes_len != 2 { if out_bytes.len() == *out_offset{ return BroCatliResult::NeedsMoreOutput; } if in_bytes.len() == *in_offset { return BroCatliResult::NeedsMoreInput; } self.last_bytes[usize::from(self.last_bytes_len)] = in_bytes[*in_offset]; self.last_bytes_len += 1; *in_offset += 1; } } if out_bytes.len() == *out_offset{ return BroCatliResult::NeedsMoreOutput; } if in_bytes.len() == *in_offset{ return BroCatliResult::NeedsMoreInput; } let mut to_copy = core::cmp::min(out_bytes.len() - *out_offset, in_bytes.len() - *in_offset); assert!(to_copy != 0); if to_copy == 1 { out_bytes[*out_offset] = self.last_bytes[0]; self.last_bytes[0] = self.last_bytes[1]; self.last_bytes[1] = in_bytes[*in_offset]; *in_offset += 1; *out_offset += 1; if *out_offset == out_bytes.len() { return BroCatliResult::NeedsMoreOutput; } return BroCatliResult::NeedsMoreInput; } out_bytes.split_at_mut(*out_offset).1.split_at_mut(2).0.clone_from_slice(&self.last_bytes[..]); *out_offset += 2; let (new_in_offset, last_two) = in_bytes.split_at(*in_offset).1.split_at(to_copy).0.split_at(to_copy-2); self.last_bytes.clone_from_slice(last_two); *in_offset += 2; // add this after the clone since we grab the last 2 bytes, not the first to_copy -= 2; out_bytes.split_at_mut(*out_offset).1.split_at_mut(to_copy).0.clone_from_slice( new_in_offset); *out_offset += to_copy; *in_offset += to_copy; if *out_offset == out_bytes.len() { return BroCatliResult::NeedsMoreOutput; } return BroCatliResult::NeedsMoreInput; } fn append_eof_metablock_to_last_bytes(&mut self) { assert!(self.last_byte_sanitized); let mut last_bytes = self.last_bytes[0] as u16 | ((self.last_bytes[1] as u16) << 8); let bit_end = (self.last_bytes_len - 1) * 8 + self.last_byte_bit_offset; last_bytes |= 3 << bit_end; self.last_bytes[0] = last_bytes as u8 & 0xff; self.last_bytes[1] = (last_bytes >> 8) as u8 & 0xff; self.last_byte_sanitized = false; self.last_byte_bit_offset += 2; if self.last_byte_bit_offset >= 8 { self.last_byte_bit_offset -= 8; self.last_bytes_len += 1; } } pub fn finish(&mut self, out_bytes: &mut [u8], out_offset: &mut usize) -> BroCatliResult { if self.last_byte_sanitized && self.last_bytes_len != 0 { self.append_eof_metablock_to_last_bytes(); } while self.last_bytes_len != 0 { if *out_offset == out_bytes.len() { return BroCatliResult::NeedsMoreOutput; } out_bytes[*out_offset] = self.last_bytes[0]; *out_offset += 1; self.last_bytes_len -= 1; self.last_bytes[0] = self.last_bytes[1]; self.any_bytes_emitted = true; } if !self.any_bytes_emitted { if out_bytes.len() == *out_offset{ return BroCatliResult::NeedsMoreOutput; } self.any_bytes_emitted = true; out_bytes[*out_offset] = b';'; *out_offset += 1; } BroCatliResult::Success } } mod test { #[cfg(test)] use super::{BroCatli}; #[test] fn test_deserialization() { let broccoli = BroCatli{ new_stream_pending:Some(super::NewStreamData { bytes_so_far: [0x33; super::NUM_STREAM_HEADER_BYTES], num_bytes_read: 16, num_bytes_written: Some(3), }), last_bytes: [0x45, 0x46], last_bytes_len: 1, last_byte_sanitized: true, any_bytes_emitted: false, last_byte_bit_offset: 7, window_size:22, }; let mut buffer = [0u8;248]; broccoli.serialize_to_buffer(&mut buffer[..]).unwrap(); let bc = BroCatli::deserialize_from_buffer(&buffer[..]).unwrap(); assert_eq!(broccoli.last_bytes, bc.last_bytes); assert_eq!(broccoli.last_bytes_len, bc.last_bytes_len); assert_eq!(broccoli.last_byte_sanitized, bc.last_byte_sanitized); assert_eq!(broccoli.last_byte_bit_offset, bc.last_byte_bit_offset); assert_eq!(broccoli.window_size, bc.window_size); assert_eq!(broccoli.new_stream_pending.unwrap().bytes_so_far, bc.new_stream_pending.unwrap().bytes_so_far); assert_eq!(broccoli.new_stream_pending.unwrap().num_bytes_read, bc.new_stream_pending.unwrap().num_bytes_read); assert_eq!(broccoli.new_stream_pending.unwrap().num_bytes_written, bc.new_stream_pending.unwrap().num_bytes_written); } #[test] fn test_deserialization_any_written() { let broccoli = BroCatli{ new_stream_pending:Some(super::NewStreamData { bytes_so_far: [0x33; super::NUM_STREAM_HEADER_BYTES], num_bytes_read: 16, num_bytes_written: Some(3), }), last_bytes: [0x45, 0x46], last_bytes_len: 1, last_byte_sanitized: true, any_bytes_emitted: true, last_byte_bit_offset: 7, window_size:22, }; let mut buffer = [0u8;248]; broccoli.serialize_to_buffer(&mut buffer[..]).unwrap(); let bc = BroCatli::deserialize_from_buffer(&buffer[..]).unwrap(); assert_eq!(broccoli.last_bytes, bc.last_bytes); assert_eq!(broccoli.last_bytes_len, bc.last_bytes_len); assert_eq!(broccoli.last_byte_sanitized, bc.last_byte_sanitized); assert_eq!(broccoli.last_byte_bit_offset, bc.last_byte_bit_offset); assert_eq!(broccoli.window_size, bc.window_size); assert_eq!(broccoli.new_stream_pending.unwrap().bytes_so_far, bc.new_stream_pending.unwrap().bytes_so_far); assert_eq!(broccoli.new_stream_pending.unwrap().num_bytes_read, bc.new_stream_pending.unwrap().num_bytes_read); assert_eq!(broccoli.new_stream_pending.unwrap().num_bytes_written, bc.new_stream_pending.unwrap().num_bytes_written); } #[test] fn test_serialization() { let mut buffer = [0u8;248]; let mut broccoli = BroCatli::deserialize_from_buffer(&buffer).unwrap(); let mut buffer2 = [0u8;248]; broccoli.serialize_to_buffer(&mut buffer2[..]).unwrap(); assert_eq!(&buffer[..], &buffer2[..]); for (index, item) in buffer.iter_mut().enumerate() { *item = index as u8; } broccoli = BroCatli::deserialize_from_buffer(&buffer).unwrap(); broccoli.serialize_to_buffer(&mut buffer2[..]).unwrap(); broccoli = BroCatli::deserialize_from_buffer(&buffer2).unwrap(); for (_index, item) in buffer.iter_mut().enumerate() { *item = 0; } broccoli.serialize_to_buffer(&mut buffer[..]).unwrap(); assert_eq!(&buffer[..], &buffer2[..]); for (index, item) in buffer.iter_mut().enumerate() { *item = 0xff ^ index as u8; } broccoli = BroCatli::deserialize_from_buffer(&buffer).unwrap(); broccoli.serialize_to_buffer(&mut buffer2[..]).unwrap(); broccoli = BroCatli::deserialize_from_buffer(&buffer2).unwrap(); for (_index, item) in buffer.iter_mut().enumerate() { *item = 0; } broccoli.serialize_to_buffer(&mut buffer[..]).unwrap(); assert_eq!(&buffer[..], &buffer2[..]); } #[test] fn test_cat_empty_stream() { let empty_catable = [b';']; let mut bcat = super::BroCatli::default(); let mut in_offset = 0usize; let mut out_bytes = [0u8;32]; let mut out_offset = 0usize; bcat.new_brotli_file(); let mut res = bcat.stream(&empty_catable[..], &mut in_offset, &mut out_bytes[..], &mut out_offset); assert_eq!(res, super::BroCatliResult::NeedsMoreInput); bcat.new_brotli_file(); in_offset = 0; res = bcat.stream(&empty_catable[..], &mut in_offset, &mut out_bytes[..], &mut out_offset); assert_eq!(res, super::BroCatliResult::NeedsMoreInput); res = bcat.finish(&mut out_bytes[..], &mut out_offset); assert_eq!(res, super::BroCatliResult::Success); assert!(out_offset != 0); assert_eq!(&out_bytes[..out_offset], &[b';']); } } brotli-3.4.0/src/enc/backward_references/benchmark.rs000075500000000000000000000275761046102023000207620ustar 00000000000000#![cfg(feature="benchmark")] #![cfg(feature="std")] extern crate test; use super::*; use alloc_stdlib::StandardAlloc; static RANDOM_THEN_UNICODE: &'static [u8] = include_bytes!("../../../testdata/random_then_unicode"); static FINALIZE_DATA: &'static [u8] = &[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,20, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,20, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,20]; const TEST_LEN:usize = 256 * 1024; const DISTANCE_CACHE: &'static [i32] = &[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]; // distance cache fn make_generic_hasher() -> AdvHasher { let params_hasher = BrotliHasherParams { type_: 5, block_bits: 6, bucket_bits: 15, num_last_distances_to_check:10, hash_len: 4, literal_byte_score: 540, }; let block_size = 1u64 << params_hasher.block_bits; let bucket_size = 1u64 << params_hasher.bucket_bits; let mut alloc = StandardAlloc::default(); let buckets = >::alloc_cell(&mut alloc, (bucket_size * block_size) as usize); let num = >::alloc_cell(&mut alloc, bucket_size as usize); AdvHasher::{ buckets: buckets, h9_opts: H9Opts::new(¶ms_hasher), num: num, GetHasherCommon: Struct1 { params: params_hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: H5Sub { hash_shift_: 32i32 - params_hasher.bucket_bits, bucket_size_: bucket_size as u32, block_bits_: params_hasher.block_bits as i32, block_mask_: block_size.wrapping_sub(1u64) as u32, } } } fn make_specialized_hasher() -> AdvHasher { let params_hasher = BrotliHasherParams { type_: 5, block_bits: 6, bucket_bits: 15, num_last_distances_to_check:10, hash_len: 4, literal_byte_score: 540, }; let block_size = 1u64 << params_hasher.block_bits; let bucket_size = 1u64 << params_hasher.bucket_bits; let mut alloc = StandardAlloc::default(); let buckets = >::alloc_cell(&mut alloc, (bucket_size * block_size) as usize); let num = >::alloc_cell(&mut alloc, bucket_size as usize); AdvHasher::{ buckets: buckets, h9_opts: H9Opts::new(¶ms_hasher), num: num, GetHasherCommon: Struct1 { params: params_hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: HQ7Sub {} } } #[bench] fn bench_256k_basic_generic(bench: &mut test::Bencher) { let mut hasher = make_generic_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); for i in 0..TEST_LEN { hasher.Store(testdata, !0usize, i); } let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_basic_specialized(bench: &mut test::Bencher) { let mut hasher = make_specialized_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); for i in 0..TEST_LEN { hasher.Store(testdata, !0usize, i); } let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_opt_generic(bench: &mut test::Bencher) { let mut hasher = make_generic_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRangeOptBatch(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_opt_specialized(bench: &mut test::Bencher) { let mut hasher = make_specialized_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRangeOptBatch(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_mem_fetch_generic(bench: &mut test::Bencher) { let mut hasher = make_generic_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRangeOptMemFetch(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_mem_fetch_specialized(bench: &mut test::Bencher) { let mut hasher = make_specialized_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRangeOptMemFetch(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_mem_lazy_dupe_generic(bench: &mut test::Bencher) { let mut hasher = make_generic_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRangeOptMemFetchLazyDupeUpdate(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_mem_lazy_dupe_specialized(bench: &mut test::Bencher) { let mut hasher = make_specialized_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRangeOptMemFetchLazyDupeUpdate(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_mem_random_dupe_generic(bench: &mut test::Bencher) { let mut hasher = make_generic_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRangeOptRandomDupeUpdate(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_mem_random_dupe_specialized(bench: &mut test::Bencher) { let mut hasher = make_specialized_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRangeOptRandomDupeUpdate(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_cur_generic(bench: &mut test::Bencher) { let mut hasher = make_generic_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRange(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } #[bench] fn bench_256k_cur_specialized(bench: &mut test::Bencher) { let mut hasher = make_specialized_hasher(); bench.iter(|| { let testdata = test::black_box(RANDOM_THEN_UNICODE.split_at(TEST_LEN + 8).0); hasher.BulkStoreRange(testdata, !0usize, 0, TEST_LEN); let mut output = super::HasherSearchResult{len:0,len_x_code:0,distance:0,score:0}; hasher.FindLongestMatch(None, &[], test::black_box(FINALIZE_DATA), // data 15,// ring mask DISTANCE_CACHE, 8, // cur_x 8, 4, 4, 4, &mut output); }); } brotli-3.4.0/src/enc/backward_references/hash_to_binary_tree.rs000075500000000000000000000424171046102023000230270ustar 00000000000000#![allow(dead_code, unused_imports)] use enc::command::{Command, ComputeDistanceCode, InitCommand, GetInsertLengthCode, GetCopyLengthCode, CombineLengthCodes, PrefixEncodeCopyDistance, CommandCopyLen}; use super::{BrotliEncoderParams, kHashMul32,kHashMul64, kHashMul64Long, BrotliHasherParams, kInvalidMatch, kDistanceCacheIndex, kDistanceCacheOffset, Struct1, H9Opts, HowPrepared, AnyHasher, CloneWithAlloc, HasherSearchResult}; use enc::dictionary_hash::kStaticDictionaryHash; use enc::static_dict::{BROTLI_UNALIGNED_LOAD32, BROTLI_UNALIGNED_LOAD64, FindMatchLengthWithLimit}; use enc::static_dict::{BrotliDictionary, kBrotliEncDictionary, BrotliFindAllStaticDictionaryMatches}; use enc::literal_cost::BrotliEstimateBitCostsForLiterals; use enc::constants::{kInsExtra, kCopyExtra}; use alloc; use alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use enc::util::{Log2FloorNonZero, brotli_max_size_t,FastLog2, floatX}; use core; pub const kInfinity: floatX = 1.7e38 as floatX; #[derive(Clone,Copy,Debug)] pub enum Union1 { cost(floatX), next(u32), shortcut(u32), } #[derive(Clone,Copy,Debug)] pub struct ZopfliNode { //highest 7 bit is used to reconstruct the length code pub length : u32, // distance associated with the length pub distance : u32, // number of literal inserts before the copy; highest 5 bits contain distance short code + 1 (or zero if no short code) pub dcode_insert_length : u32, pub u : Union1, } impl Default for ZopfliNode { fn default() -> Self { ZopfliNode{ length: 1, distance: 0, dcode_insert_length: 0, u: Union1::cost(kInfinity), } } } pub trait Allocable> { fn new(m: &mut AllocT, init:T) -> Self; fn new_uninit(m: &mut AllocT) -> Self; fn free(&mut self, m: &mut AllocT); } pub trait H10Params { fn max_tree_search_depth() -> u32; fn max_tree_comp_length() -> u32; } pub struct H10DefaultParams{} impl H10Params for H10DefaultParams { #[inline(always)] fn max_tree_search_depth() -> u32 { 64 } #[inline(always)] fn max_tree_comp_length() -> u32 { 128 } } const BUCKET_BITS:usize = 17; pub struct H10Buckets>(AllocU32::AllocatedMemory); impl> Allocable for H10Buckets { fn new(m:&mut AllocU32, initializer: u32) -> H10Buckets { let mut ret = m.alloc_cell(1 <(ret) } fn new_uninit(m:&mut AllocU32) -> H10Buckets { H10Buckets::(m.alloc_cell(1 <> PartialEq> for H10Buckets { fn eq(&self, other: &H10Buckets) -> bool { return self.0.slice() == other.0.slice() } } impl> SliceWrapper for H10Buckets { #[inline(always)] fn slice(&self) -> &[u32] { self.0.slice() } } impl> SliceWrapperMut for H10Buckets { #[inline(always)] fn slice_mut(&mut self) -> &mut [u32] { self.0.slice_mut() } } pub struct H10, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params> where Buckets:PartialEq { pub window_mask_: usize, pub common: Struct1, pub buckets_: Buckets, pub invalid_pos_:u32, pub forest: AllocU32::AllocatedMemory, pub _params: core::marker::PhantomData, } impl , Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params> PartialEq> for H10 where Buckets:PartialEq { fn eq(&self, other: &H10) -> bool { self.window_mask_ == other.window_mask_ && self.common == other.common && self.buckets_ == other.buckets_ && self.invalid_pos_ == other.invalid_pos_ && self.forest.slice() == other.forest.slice() && self._params == other._params } } pub fn InitializeH10>( m32: &mut AllocU32, one_shot: bool, params: &BrotliEncoderParams, input_size: usize ) -> H10, H10DefaultParams> { initialize_h10::>(m32, one_shot, params, input_size) } fn initialize_h10, Buckets:SliceWrapperMut+SliceWrapper+Allocable >( m32: &mut AllocU32, one_shot: bool, params: &BrotliEncoderParams, input_size: usize ) -> H10 where Buckets:PartialEq { let mut num_nodes = 1 << params.lgwin; if one_shot && input_size < num_nodes { num_nodes = input_size; } let window_mask = (1<>::new(m32, invalid_pos); H10:: { common:Struct1{ params:params.hasher, is_prepared_:1, dict_num_lookups:0, dict_num_matches:0, }, _params: core::marker::PhantomData::::default(), window_mask_: window_mask as usize, invalid_pos_: invalid_pos, buckets_: buckets, forest: m32.alloc_cell(num_nodes * 2), } } impl, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params> H10 where Buckets:PartialEq { pub fn free(&mut self, m32: &mut AllocU32) { m32.free_cell(core::mem::replace(&mut self.forest, AllocU32::AllocatedMemory::default())); self.buckets_.free(m32); } } impl + alloc::Allocator, Buckets:Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params, > CloneWithAlloc for H10 where Buckets:PartialEq { fn clone_with_alloc(&self, m: &mut Alloc) -> Self { let mut ret = H10:: { window_mask_: self.window_mask_, common: self.common.clone(), buckets_:Buckets::new_uninit(m), invalid_pos_:self.invalid_pos_, forest:>::alloc_cell(m, self.forest.len()), _params: core::marker::PhantomData::::default(), }; ret.buckets_.slice_mut().clone_from_slice(self.buckets_.slice()); ret.forest.slice_mut().clone_from_slice(self.forest.slice()); ret } } impl, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params> AnyHasher for H10 where Buckets:PartialEq { /* fn GetH10Tree(&mut self) -> Option<&mut H10> { Some(self) }*/ #[inline(always)] fn Opts(&self) -> H9Opts { H9Opts{literal_byte_score:340} } #[inline(always)] fn PrepareDistanceCache(&self, _distance_cache: &mut [i32]) {} #[inline(always)] fn HashTypeLength(&self) -> usize { 4 } #[inline(always)] fn StoreLookahead(&self) -> usize { Params::max_tree_comp_length() as usize } fn StitchToPreviousBlock(&mut self, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize) { super::hq::StitchToPreviousBlockH10(self, num_bytes, position, ringbuffer, ringbuffer_mask) } #[inline(always)] fn GetHasherCommon(&mut self) -> &mut Struct1 { &mut self.common } #[inline(always)] fn HashBytes(&self, data: &[u8]) -> usize { let h = BROTLI_UNALIGNED_LOAD32( data ).wrapping_mul( kHashMul32 ); (h >> 32i32 - BUCKET_BITS as i32) as usize } #[inline(always)] fn Store(&mut self, data: &[u8], mask: usize, ix: usize) { let max_backward : usize = (*self).window_mask_.wrapping_sub(16usize).wrapping_add( 1usize ); StoreAndFindMatchesH10( self, data, ix, mask, Params::max_tree_comp_length() as usize, max_backward, &mut 0, &mut[], ); } fn StoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { let mut i : usize = ix_start; let mut j : usize = ix_start; if ix_start.wrapping_add(63usize) <= ix_end { i = ix_end.wrapping_sub(63usize); } if ix_start.wrapping_add(512usize) <= i { while j < i { { self.Store(data,mask,j); } j = j.wrapping_add(8usize); } } while i < ix_end { { self.Store(data,mask,i); } i = i.wrapping_add(1 as (usize)); } } fn BulkStoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { for i in ix_start..ix_end { self.Store(data, mask, i); } } fn Prepare(&mut self, _one_shot: bool, _input_size: usize, _data: &[u8]) -> HowPrepared { if self.common.is_prepared_ != 0 { return HowPrepared::ALREADY_PREPARED; } let invalid_pos = self.invalid_pos_; for bucket in self.buckets_.slice_mut().iter_mut() { *bucket = invalid_pos; } self.common.is_prepared_ = 1; HowPrepared::NEWLY_PREPARED } fn FindLongestMatch(&mut self, _dictionary: Option<&BrotliDictionary>, _dictionary_hash: &[u16], _data: &[u8], _ring_buffer_mask: usize, _distance_cache: &[i32], _cur_ix: usize, _max_length: usize, _max_backward: usize, _gap: usize, _max_distance: usize, _out: &mut HasherSearchResult) -> bool { unimplemented!(); } } pub struct BackwardMatch(pub u64); // pub distance : u32, // pub length_and_code : u32, impl BackwardMatch { #[inline(always)] pub fn distance(&self) -> u32 { self.0 as u32 } #[inline(always)] pub fn length_and_code(&self) -> u32 { (self.0 >> 32) as u32 } } pub struct BackwardMatchMut<'a>(pub &'a mut u64); // pub distance : u32, // pub length_and_code : u32, impl<'a> BackwardMatchMut<'a> { #[inline(always)] pub fn distance(&self) -> u32 { *self.0 as u32 } #[inline(always)] pub fn length_and_code(&self) -> u32 { (*self.0 >> 32) as u32 } #[inline(always)] pub fn set_distance(&mut self, data: u32) { *self.0 &= 0xffffffff00000000; *self.0 |= u64::from(data) } #[inline(always)] pub fn set_length_and_code(&mut self, data: u32) { *self.0 = u64::from((*self.0) as u32) | (u64::from(data) << 32); } } #[inline(always)] pub fn InitBackwardMatch( xself : &mut BackwardMatchMut, dist : usize, len : usize ) { (*xself).set_distance(dist as (u32)); (*xself).set_length_and_code((len << 5i32) as (u32)); } macro_rules! LeftChildIndexH10 { ($xself: expr, $pos: expr) => { (2usize).wrapping_mul($pos & (*$xself).window_mask_) }; } macro_rules! RightChildIndexH10 { ($xself: expr, $pos: expr) => { (2usize).wrapping_mul( $pos & (*$xself).window_mask_ ).wrapping_add( 1usize ) } } /* fn LeftChildIndexH10, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params>( mut xself : &mut H10, pos : usize ) -> usize { (2usize).wrapping_mul(pos & (*xself).window_mask_) } fn RightChildIndexH10, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params>( mut xself : &mut H10, pos : usize ) -> usize { (2usize).wrapping_mul( pos & (*xself).window_mask_ ).wrapping_add( 1usize ) } */ pub fn StoreAndFindMatchesH10, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params>( xself : &mut H10, data : & [u8], cur_ix : usize, ring_buffer_mask : usize, max_length : usize, max_backward : usize, best_len : &mut usize, matches : &mut [u64]) -> usize where Buckets:PartialEq { let mut matches_offset = 0usize; let cur_ix_masked : usize = cur_ix & ring_buffer_mask; let max_comp_len : usize = core::cmp::min(max_length,128usize); let should_reroot_tree : i32 = if !!(max_length >= 128usize) { 1i32 } else { 0i32 }; let key = xself.HashBytes( &data[(cur_ix_masked as (usize)).. ] ); let forest : &mut [u32] = xself.forest.slice_mut(); let mut prev_ix : usize = (*xself).buckets_.slice()[key] as (usize); let mut node_left : usize = LeftChildIndexH10!(xself,cur_ix); let mut node_right : usize = RightChildIndexH10!(xself,cur_ix); let mut best_len_left : usize = 0usize; let mut best_len_right : usize = 0usize; let mut depth_remaining : usize; if should_reroot_tree != 0 { (*xself).buckets_.slice_mut()[(key as (usize))]= cur_ix as (u32); } depth_remaining = 64usize; 'break16: loop { { let backward : usize = cur_ix.wrapping_sub(prev_ix); let prev_ix_masked : usize = prev_ix & ring_buffer_mask; if backward == 0usize || backward > max_backward || depth_remaining == 0usize { if should_reroot_tree != 0 { forest[(node_left as (usize)) ]= (*xself).invalid_pos_; forest[(node_right as (usize)) ]= (*xself).invalid_pos_; } break 'break16; } { let cur_len : usize = core::cmp::min(best_len_left,best_len_right); let len : usize; len = cur_len.wrapping_add( FindMatchLengthWithLimit( &data[( cur_ix_masked.wrapping_add(cur_len) as (usize) )..], &data[( prev_ix_masked.wrapping_add(cur_len) as (usize) )..], max_length.wrapping_sub(cur_len) ) ); if matches_offset != matches.len() && (len > *best_len) { *best_len = len; InitBackwardMatch( &mut BackwardMatchMut(&mut matches[matches_offset]), backward, len ); matches_offset += 1; } if len >= max_comp_len { if should_reroot_tree != 0 { forest[(node_left as (usize)) ]= forest[( LeftChildIndexH10!( xself, prev_ix ) as (usize) )]; forest[(node_right as (usize)) ]= forest[( RightChildIndexH10!( xself, prev_ix ) as (usize) )]; } break 'break16; } if data[( cur_ix_masked.wrapping_add(len) as (usize) ) ]as (i32) > data[( prev_ix_masked.wrapping_add(len) as (usize) ) ]as (i32) { best_len_left = len; if should_reroot_tree != 0 { forest[(node_left as (usize)) ]= prev_ix as (u32); } node_left = RightChildIndexH10!(xself,prev_ix); prev_ix = forest[(node_left as (usize)) ]as (usize); } else { best_len_right = len; if should_reroot_tree != 0 { forest[(node_right as (usize)) ]= prev_ix as (u32); } node_right = LeftChildIndexH10!(xself,prev_ix); prev_ix = forest[(node_right as (usize)) ]as (usize); } } } depth_remaining = depth_remaining.wrapping_sub(1 as (usize)); } matches_offset } brotli-3.4.0/src/enc/backward_references/hq.rs000075500000000000000000002173421046102023000174300ustar 00000000000000#![allow(dead_code, unused_imports)] use enc::command::{Command, ComputeDistanceCode, InitCommand, GetInsertLengthCode, GetCopyLengthCode, CombineLengthCodes, PrefixEncodeCopyDistance, CommandCopyLen, BrotliDistanceParams}; use super::{BrotliEncoderParams, kHashMul32,kHashMul64, kHashMul64Long, BrotliHasherParams, kInvalidMatch, kDistanceCacheIndex, kDistanceCacheOffset, AnyHasher}; use enc::dictionary_hash::kStaticDictionaryHash; use enc::static_dict::{BROTLI_UNALIGNED_LOAD32, BROTLI_UNALIGNED_LOAD64, FindMatchLengthWithLimit}; use enc::static_dict::{BrotliDictionary, kBrotliEncDictionary, BrotliFindAllStaticDictionaryMatches}; use enc::literal_cost::BrotliEstimateBitCostsForLiterals; use enc::constants::{kInsExtra, kCopyExtra}; use ::alloc; use alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use enc::util::{Log2FloorNonZero, brotli_max_size_t,FastLog2, FastLog2f64, floatX}; use super::hash_to_binary_tree::{InitBackwardMatch, BackwardMatch, BackwardMatchMut, StoreAndFindMatchesH10, Allocable, H10Params, H10, ZopfliNode, Union1, kInfinity}; use core; use enc::encode; const BROTLI_WINDOW_GAP:usize = 16; const BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN:usize = 37; /* static kBrotliMinWindowBits: i32 = 10i32; static kBrotliMaxWindowBits: i32 = 24i32; static kInvalidMatch: u32 = 0xfffffffu32; static kCutoffTransformsCount: u32 = 10u32; static kCutoffTransforms: u64 = 0x71b520au64 << 32i32 | 0xda2d3200u32 as (u64); pub static kHashMul32: u32 = 0x1e35a7bdu32; pub static kHashMul64: u64 = 0x1e35a7bdu64 << 32i32 | 0x1e35a7bdu64; pub static kHashMul64Long: u64 = 0x1fe35a7bu32 as (u64) << 32i32 | 0xd3579bd3u32 as (u64); */ pub const BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE:usize = 544; pub const BROTLI_NUM_LITERAL_SYMBOLS:usize = 256; pub const BROTLI_NUM_COMMAND_SYMBOLS:usize = 704; pub const BROTLI_SIMPLE_DISTANCE_ALPHABET_SIZE: usize = encode::BROTLI_NUM_DISTANCE_SHORT_CODES as usize + (2 * encode::BROTLI_LARGE_MAX_DISTANCE_BITS as usize); #[inline(always)] pub fn BrotliInitZopfliNodes( array : &mut [ZopfliNode], length : usize ) { let stub = ZopfliNode::default(); let mut i : usize; i = 0usize; while i < length { array[(i as (usize)) ]= stub; i = i.wrapping_add(1 as (usize)); } } #[inline(always)] fn ZopfliNodeCopyLength( xself : & ZopfliNode ) -> u32 { (*xself).length & 0x1ffffffu32 } #[inline(always)] fn ZopfliNodeCopyDistance( xself : & ZopfliNode ) -> u32 { (*xself).distance } #[inline(always)] fn ZopfliNodeLengthCode( xself : & ZopfliNode ) -> u32 { let modifier : u32 = (*xself).length >> 25i32; ZopfliNodeCopyLength(xself).wrapping_add(9u32).wrapping_sub( modifier ) } #[inline(always)] fn brotli_min_size_t( a : usize, b : usize ) -> usize { core::cmp::min(a, b) } #[inline(always)] fn ZopfliNodeDistanceCode( xself : & ZopfliNode ) -> u32 { let short_code : u32 = (*xself).dcode_insert_length >> 27i32; if short_code == 0u32 { ZopfliNodeCopyDistance(xself).wrapping_add( 16u32 ).wrapping_sub( 1u32 ) } else { short_code.wrapping_sub(1u32) } } pub fn BrotliZopfliCreateCommands( num_bytes : usize, block_start : usize, max_backward_limit : usize, nodes : & [ZopfliNode], dist_cache : &mut [i32], last_insert_len : &mut usize, params : &BrotliEncoderParams, commands : &mut [Command], num_literals : &mut usize) { let mut pos : usize = 0usize; let mut offset : u32 = match (nodes[(0usize)]).u { Union1::next(off) => off, _ => 0}; let mut i : usize; let gap : usize = 0usize; i = 0usize; while offset != !(0u32) { { let next : &ZopfliNode = &nodes[( pos.wrapping_add(offset as (usize)) as (usize) ) ]; let copy_length : usize = ZopfliNodeCopyLength(next) as (usize); let mut insert_length : usize = ((*next).dcode_insert_length & 0x7ffffff) as (usize); pos = pos.wrapping_add(insert_length); offset = match (*next).u { Union1::next(off) => off, _ => 0}; if i == 0usize { insert_length = insert_length.wrapping_add(*last_insert_len); *last_insert_len = 0usize; } { let distance : usize = ZopfliNodeCopyDistance(next) as (usize); let len_code : usize = ZopfliNodeLengthCode(next) as (usize); let max_distance : usize = brotli_min_size_t( block_start.wrapping_add(pos), max_backward_limit ); let is_dictionary : i32 = if !!(distance > max_distance.wrapping_add(gap)) { 1i32 } else { 0i32 }; let dist_code : usize = ZopfliNodeDistanceCode(next) as (usize); InitCommand( &mut commands[(i as (usize)) ], &(*params).dist , insert_length, copy_length, len_code, dist_code ); if is_dictionary == 0 && (dist_code > 0usize) { dist_cache[(3usize) ]= dist_cache[( 2usize )]; dist_cache[(2usize) ]= dist_cache[( 1usize )]; dist_cache[(1usize) ]= dist_cache[( 0usize )]; dist_cache[(0usize) ]= distance as (i32); } } *num_literals = (*num_literals).wrapping_add(insert_length); pos = pos.wrapping_add(copy_length); } i = i.wrapping_add(1 as (usize)); } *last_insert_len = (*last_insert_len).wrapping_add( num_bytes.wrapping_sub(pos) ); } #[inline(always)] fn MaxZopfliLen( params : &BrotliEncoderParams, ) -> usize { (if (*params).quality <= 10i32 { 150i32 } else { 325i32 }) as (usize) } pub struct ZopfliCostModel> { pub cost_cmd_ : [floatX; BROTLI_NUM_COMMAND_SYMBOLS], pub cost_dist_ : AllocF::AllocatedMemory, pub distance_histogram_size : u32, pub literal_costs_ : AllocF::AllocatedMemory, pub min_cost_cmd_ : floatX, pub num_bytes_ : usize, } #[derive(Copy,Clone,Debug)] pub struct PosData { pub pos : usize, pub distance_cache : [i32;4], pub costdiff : floatX, pub cost : floatX, } #[derive(Copy,Clone,Debug)] pub struct StartPosQueue { pub q_ : [PosData;8], pub idx_ : usize, } impl Default for StartPosQueue { #[inline(always)] fn default() -> Self { StartPosQueue { q_: [PosData{pos:0,distance_cache:[0;4],costdiff:0.0, cost:0.0};8], idx_: 0, } } } #[inline(always)] fn StoreLookaheadH10() -> usize { 128usize } fn InitZopfliCostModel> ( m : &mut AllocF, dist : & BrotliDistanceParams, num_bytes : usize ) -> ZopfliCostModel { ZopfliCostModel::{ num_bytes_: num_bytes, cost_cmd_: [0.0;704], min_cost_cmd_: 0.0, literal_costs_: if num_bytes.wrapping_add( 2usize ) > 0usize { m.alloc_cell(num_bytes.wrapping_add(2usize)) } else { AllocF::AllocatedMemory::default() }, cost_dist_: if (*dist).alphabet_size > 0u32 { m.alloc_cell(num_bytes.wrapping_add(dist.alphabet_size as usize)) } else { AllocF::AllocatedMemory::default() }, distance_histogram_size: core::cmp::min((*dist).alphabet_size, 544), } } fn ZopfliCostModelSetFromLiteralCosts>( xself : &mut ZopfliCostModel, position : usize, ringbuffer : & [u8], ringbuffer_mask : usize ) { let literal_costs = (*xself).literal_costs_.slice_mut(); let mut literal_carry : floatX = 0.0; let cost_dist = (*xself).cost_dist_.slice_mut(); let cost_cmd = &mut (*xself).cost_cmd_[..]; let num_bytes : usize = (*xself).num_bytes_; let mut i : usize; BrotliEstimateBitCostsForLiterals( position, num_bytes, ringbuffer_mask, ringbuffer, &mut literal_costs[(1usize)..] ); literal_costs[(0usize) ]= 0.0 as (floatX); i = 0usize; while i < num_bytes { { literal_carry = literal_carry as floatX + literal_costs[( i.wrapping_add(1usize) as (usize) )] as floatX; literal_costs[( i.wrapping_add(1usize) as (usize) ) ]= (literal_costs[(i as (usize)) ] as floatX + literal_carry) as floatX; literal_carry = literal_carry - (literal_costs[( i.wrapping_add(1usize) as (usize) ) ] as floatX - literal_costs[(i as (usize))] as floatX); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < BROTLI_NUM_COMMAND_SYMBOLS { { cost_cmd[(i as (usize)) ]= FastLog2( (11u64).wrapping_add( i as (u64)) ) as (floatX); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < (*xself).distance_histogram_size as (usize) { { cost_dist[(i as (usize)) ]= FastLog2( (20u64).wrapping_add( i as (u64)) ) as (floatX); } i = i.wrapping_add(1 as (usize)); } (*xself).min_cost_cmd_ = FastLog2(11) as (floatX); } #[inline(always)] fn InitStartPosQueue() -> StartPosQueue { StartPosQueue::default() } #[inline(always)] fn HashBytesH10(data : & [u8]) -> u32 { let h : u32 = BROTLI_UNALIGNED_LOAD32( data ).wrapping_mul( kHashMul32 ); h >> 32i32 - 17i32 } #[inline(always)] fn InitDictionaryBackwardMatch( xself : &mut BackwardMatchMut, dist : usize, len : usize, len_code : usize ) { (*xself).set_distance(dist as (u32)); (*xself).set_length_and_code((len << 5i32 | if len == len_code { 0usize } else { len_code }) as (u32)); } pub fn StitchToPreviousBlockH10, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params>(handle: &mut H10, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize) where Buckets:PartialEq { if (num_bytes >= handle.HashTypeLength() - 1 && position >= Params::max_tree_comp_length() as usize) { /* Store the last `MAX_TREE_COMP_LENGTH - 1` positions in the hasher. These could not be calculated before, since they require knowledge of both the previous and the current block. */ let i_start = position - Params::max_tree_comp_length() as usize; let i_end = core::cmp::min(position, i_start.wrapping_add(num_bytes)); for i in i_start..i_end { /* Maximum distance is window size - 16, see section 9.1. of the spec. Furthermore, we have to make sure that we don't look further back from the start of the next block than the window size, otherwise we could access already overwritten areas of the ring-buffer. */ let max_backward = handle.window_mask_ - core::cmp::max( BROTLI_WINDOW_GAP - 1, position - i); let mut _best_len = 0; /* We know that i + MAX_TREE_COMP_LENGTH <= position + num_bytes, i.e. the end of the current block and that we have at least MAX_TREE_COMP_LENGTH tail in the ring-buffer. */ StoreAndFindMatchesH10(handle, ringbuffer, i, ringbuffer_mask, ::max_tree_comp_length() as usize, max_backward, &mut _best_len, &mut []); } } } fn FindAllMatchesH10, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params>( handle : &mut H10, dictionary : Option<&BrotliDictionary>, data : & [u8], ring_buffer_mask : usize, cur_ix : usize, max_length : usize, max_backward : usize, gap : usize, params : & BrotliEncoderParams, matches : &mut [u64]) -> usize where Buckets:PartialEq { let mut matches_offset = 0usize; let cur_ix_masked : usize = cur_ix & ring_buffer_mask; let mut best_len : usize = 1usize; let short_match_max_backward : usize = (if (*params).quality != 11i32 { 16i32 } else { 64i32 }) as (usize); let mut stop : usize = cur_ix.wrapping_sub(short_match_max_backward); let mut dict_matches = [kInvalidMatch;BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN + 1]; let mut i : usize; if cur_ix < short_match_max_backward { stop = 0usize; } i = cur_ix.wrapping_sub(1usize); 'break14: while i > stop && (best_len <= 2usize) { 'continue15: loop { { let mut prev_ix : usize = i; let backward : usize = cur_ix.wrapping_sub(prev_ix); if backward > max_backward { break 'break14; } prev_ix = prev_ix & ring_buffer_mask; if data[(cur_ix_masked as (usize)) ]as (i32) != data[( prev_ix as (usize) ) ]as (i32) || data[( cur_ix_masked.wrapping_add( 1usize ) as (usize) ) ]as (i32) != data[( prev_ix.wrapping_add( 1usize ) as (usize) ) ]as (i32) { break 'continue15; } { let len : usize = FindMatchLengthWithLimit( &data[(prev_ix as (usize))..], &data[(cur_ix_masked as (usize))..], max_length ); if len > best_len { best_len = len; InitBackwardMatch( &mut BackwardMatchMut(&mut matches[matches_offset]), backward, len ); matches_offset += 1; } } } break; } i = i.wrapping_sub(1 as (usize)); } if best_len < max_length { let loc_offset = StoreAndFindMatchesH10( handle, data, cur_ix, ring_buffer_mask, max_length, max_backward, &mut best_len , matches.split_at_mut(matches_offset).1 ); matches_offset += loc_offset; } i = 0usize; while i <= 37usize { { dict_matches[(i as (usize)) ]= kInvalidMatch; } i = i.wrapping_add(1 as (usize)); } { let minlen : usize = brotli_max_size_t( 4usize, best_len.wrapping_add(1usize) ); if dictionary.is_some() && BrotliFindAllStaticDictionaryMatches( dictionary.unwrap(), &data[(cur_ix_masked as (usize))..], minlen, max_length, &mut dict_matches[..], ) != 0 { assert_eq!(params.use_dictionary, true); let maxlen : usize = brotli_min_size_t(37usize,max_length); let mut l : usize; l = minlen; while l <= maxlen { { let dict_id : u32 = dict_matches[(l as (usize))]; if dict_id < kInvalidMatch { let distance : usize = max_backward.wrapping_add(gap).wrapping_add( (dict_id >> 5i32) as (usize) ).wrapping_add( 1usize ); if distance <= (*params).dist.max_distance { InitDictionaryBackwardMatch( &mut BackwardMatchMut(&mut matches[matches_offset]), distance, l, (dict_id & 31u32) as (usize) ); matches_offset += 1; } } } l = l.wrapping_add(1 as (usize)); } } } matches_offset } #[inline(always)] fn BackwardMatchLength( xself : & BackwardMatch ) -> usize { ((*xself).length_and_code() >> 5i32) as (usize) } #[inline(always)] fn MaxZopfliCandidates( params : & BrotliEncoderParams) -> usize { (if (*params).quality <= 10i32 { 1i32 } else { 5i32 }) as (usize) } #[inline(always)] fn ComputeDistanceShortcut( block_start : usize, pos : usize, max_backward : usize, gap : usize, nodes : & [ZopfliNode ]) -> u32 { let clen : usize = ZopfliNodeCopyLength( &nodes[(pos as (usize)) ] ) as (usize); let ilen : usize = ((nodes[( pos as (usize) )]).dcode_insert_length) as (usize) & 0x7ffffff; let dist : usize = ZopfliNodeCopyDistance( &nodes[(pos as (usize)) ] ) as (usize); if pos == 0usize { 0u32 } else if dist.wrapping_add(clen) <= block_start.wrapping_add( pos ).wrapping_add( gap ) && (dist <= max_backward.wrapping_add( gap )) && (ZopfliNodeDistanceCode( &nodes[( pos as (usize) ) ] ) > 0u32) { pos as (u32) } else { match (nodes[( pos.wrapping_sub(clen).wrapping_sub(ilen) as (usize) )]).u { Union1::shortcut(shrt) => shrt, _ => 0 } } } #[inline(always)] fn ZopfliCostModelGetLiteralCosts>( xself : & ZopfliCostModel, from : usize, to : usize ) -> floatX { (*xself).literal_costs_.slice()[( to as (usize) )]- (*xself).literal_costs_.slice()[(from as (usize))]} fn ComputeDistanceCache( pos : usize, mut starting_dist_cache : & [i32], nodes : & [ZopfliNode], dist_cache : &mut [i32 ]) { let mut idx : i32 = 0i32; let mut p : usize = match (nodes[(pos as (usize))]).u{Union1::shortcut(shrt) => shrt, _ => 0} as (usize); while idx < 4i32 && (p > 0usize) { let ilen : usize = ((nodes[( p as (usize) )]).dcode_insert_length) as (usize) & 0x7ffffff; let clen : usize = ZopfliNodeCopyLength( &nodes[(p as (usize)) ] ) as (usize); let dist : usize = ZopfliNodeCopyDistance( &nodes[(p as (usize)) ] ) as (usize); dist_cache[( { let _old = idx; idx = idx + 1; _old } as (usize) ) ]= dist as (i32); p = match (nodes[( p.wrapping_sub(clen).wrapping_sub(ilen) as (usize) )]).u { Union1::shortcut(shrt) => shrt, _ => 0} as (usize); } while idx < 4i32 { { dist_cache[(idx as (usize)) ]= { let (_old, _upper) = starting_dist_cache.split_at(1); starting_dist_cache = _upper; _old[0] }; } idx = idx + 1; } } #[inline(always)] fn StartPosQueueSize( xself : & StartPosQueue ) -> usize { brotli_min_size_t((*xself).idx_,8usize) } fn StartPosQueuePush( xself : &mut StartPosQueue, posdata : &PosData) { let mut offset : usize = !{ let _old = (*xself).idx_; (*xself).idx_ = (*xself).idx_.wrapping_add(1 as (usize)); _old } & 7usize; let len : usize = StartPosQueueSize(xself ); let mut i : usize; let q : &mut [PosData;8] = &mut (*xself).q_; q[(offset as (usize)) ]= *posdata; i = 1usize; while i < len { { if (q[( (offset & 7usize) as (usize) )]).costdiff > (q[( (offset.wrapping_add( 1usize ) & 7usize) as (usize) )]).costdiff { let mut __brotli_swap_tmp : PosData = q[((offset & 7usize) as (usize))]; q[((offset & 7usize) as (usize)) ]= q[( (offset.wrapping_add( 1usize ) & 7usize) as (usize) )]; q[( (offset.wrapping_add(1usize) & 7usize) as (usize) ) ]= __brotli_swap_tmp; } offset = offset.wrapping_add(1 as (usize)); } i = i.wrapping_add(1 as (usize)); } } fn EvaluateNode>( block_start : usize, pos : usize, max_backward_limit : usize, gap : usize, starting_dist_cache : & [i32], model : &ZopfliCostModel, queue : &mut StartPosQueue, nodes : &mut [ZopfliNode]) { let node_cost : floatX = match (nodes[(pos as (usize))]).u {Union1::cost(cst) => cst, _ => 0.0}; (nodes[( pos as (usize) )]).u = Union1::shortcut(ComputeDistanceShortcut( block_start, pos, max_backward_limit, gap, nodes )); if node_cost <= ZopfliCostModelGetLiteralCosts( model, 0usize, pos ) { let mut posdata = PosData { pos:pos, cost:node_cost, costdiff:node_cost - ZopfliCostModelGetLiteralCosts( model, 0usize, pos ), distance_cache:[0;4], }; ComputeDistanceCache( pos, starting_dist_cache, nodes , &mut posdata.distance_cache[..] ); StartPosQueuePush( queue, &mut posdata ); } } #[inline(always)] fn StartPosQueueAt( xself : & StartPosQueue, k : usize ) -> &PosData { &(*xself).q_[( (k.wrapping_sub((*xself).idx_) & 7usize) as (usize) )] } #[inline(always)] fn ZopfliCostModelGetMinCostCmd>( xself : & ZopfliCostModel ) -> floatX { (*xself).min_cost_cmd_ } #[inline(always)] fn ComputeMinimumCopyLength( start_cost : floatX, nodes : & [ZopfliNode], num_bytes : usize, pos : usize ) -> usize { let mut min_cost : floatX = start_cost; let mut len : usize = 2usize; let mut next_len_bucket : usize = 4usize; let mut next_len_offset : usize = 10usize; while pos.wrapping_add(len) <= num_bytes && (match (nodes[( pos.wrapping_add(len) as (usize) )]).u{Union1::cost(cst) => cst, _ => 0.0} <= min_cost) { len = len.wrapping_add(1 as (usize)); if len == next_len_offset { min_cost = min_cost + 1.0 as floatX; next_len_offset = next_len_offset.wrapping_add(next_len_bucket); next_len_bucket = next_len_bucket.wrapping_mul(2usize); } } len } #[inline(always)] fn GetInsertExtra(inscode : u16) -> u32 { kInsExtra[(inscode as (usize))] } #[inline(always)] fn ZopfliCostModelGetDistanceCost>( xself : & ZopfliCostModel, distcode : usize ) -> floatX { (*xself).cost_dist_.slice()[(distcode as (usize))] } #[inline(always)] fn GetCopyExtra(copycode : u16) -> u32 { kCopyExtra[(copycode as (usize))] } #[inline(always)] fn ZopfliCostModelGetCommandCost>( xself : & ZopfliCostModel, cmdcode : u16 ) -> floatX { (*xself).cost_cmd_[(cmdcode as (usize))] } #[inline(always)] fn UpdateZopfliNode( nodes : &mut [ZopfliNode], pos : usize, start_pos : usize, len : usize, len_code : usize, dist : usize, short_code : usize, cost : floatX ) { let next = &mut nodes[( pos.wrapping_add(len) as (usize) ) ]; (*next).length = (len | len.wrapping_add( 9u32 as (usize) ).wrapping_sub( len_code ) << 25i32) as (u32); (*next).distance = dist as (u32); (*next).dcode_insert_length = pos.wrapping_sub(start_pos) as (u32) | (short_code << 27) as u32; (*next).u = Union1::cost(cost); } #[inline(always)] fn BackwardMatchLengthCode( xself : & BackwardMatch ) -> usize { let code : usize = ((*xself).length_and_code() & 31u32) as (usize); if code != 0 { code } else { BackwardMatchLength(xself) } } fn UpdateNodes>( num_bytes : usize, block_start : usize, pos : usize, ringbuffer : & [u8], ringbuffer_mask : usize, params : & BrotliEncoderParams, max_backward_limit : usize, starting_dist_cache : & [i32], num_matches : usize, matches : & [u64], model : & ZopfliCostModel, queue : &mut StartPosQueue, nodes : &mut [ZopfliNode ]) -> usize { let cur_ix : usize = block_start.wrapping_add(pos); let cur_ix_masked : usize = cur_ix & ringbuffer_mask; let max_distance : usize = brotli_min_size_t(cur_ix,max_backward_limit); let max_len : usize = num_bytes.wrapping_sub(pos); let max_zopfli_len : usize = MaxZopfliLen(params); let max_iters : usize = MaxZopfliCandidates(params); let min_len : usize; let mut result : usize = 0usize; let mut k : usize; let gap : usize = 0usize; EvaluateNode( block_start, pos, max_backward_limit, gap, starting_dist_cache, model, queue, nodes ); { let posdata = StartPosQueueAt(queue ,0usize); let min_cost : floatX = (*posdata).cost + ZopfliCostModelGetMinCostCmd( model ) + ZopfliCostModelGetLiteralCosts(model,(*posdata).pos,pos); min_len = ComputeMinimumCopyLength( min_cost, nodes , num_bytes, pos ); } k = 0usize; while k < max_iters && (k < StartPosQueueSize( queue )) { 'continue28: loop { { let posdata = StartPosQueueAt(queue ,k); let start : usize = (*posdata).pos; let inscode : u16 = GetInsertLengthCode(pos.wrapping_sub(start)); let start_costdiff : floatX = (*posdata).costdiff; let base_cost : floatX = start_costdiff + GetInsertExtra( inscode ) as (floatX) + ZopfliCostModelGetLiteralCosts( model, 0usize, pos ); let mut best_len : usize = min_len.wrapping_sub(1usize); let mut j : usize = 0usize; 'break29: while j < 16usize && (best_len < max_len) { 'continue30: loop { { let idx : usize = kDistanceCacheIndex[(j as (usize)) ]as (usize); let distance_cache_len_minus_1 = 3; debug_assert_eq!(distance_cache_len_minus_1 + 1, posdata.distance_cache.len()); let backward : usize = ((*posdata).distance_cache[( idx as (usize) & distance_cache_len_minus_1 )]+ i32::from(kDistanceCacheOffset[(j as (usize)) ]))as (usize); let mut prev_ix : usize = cur_ix.wrapping_sub(backward); let len : usize; let continuation : u8 = ringbuffer[( cur_ix_masked.wrapping_add(best_len) as (usize) )]; if cur_ix_masked.wrapping_add(best_len) > ringbuffer_mask { break 'break29; } if backward > max_distance.wrapping_add(gap) { break 'continue30; } if backward <= max_distance { if prev_ix >= cur_ix { break 'continue30; } prev_ix = prev_ix & ringbuffer_mask; if prev_ix.wrapping_add( best_len ) > ringbuffer_mask || continuation as (i32) != ringbuffer[( prev_ix.wrapping_add( best_len ) as (usize) ) ]as (i32) { break 'continue30; } len = FindMatchLengthWithLimit( &ringbuffer[(prev_ix as (usize))..], &ringbuffer[( cur_ix_masked as (usize) ).. ], max_len ); } else { break 'continue30; } { let dist_cost : floatX = base_cost + ZopfliCostModelGetDistanceCost(model,j); let mut l : usize; l = best_len.wrapping_add(1usize); while l <= len { { let copycode : u16 = GetCopyLengthCode(l); let cmdcode : u16 = CombineLengthCodes( inscode, copycode, (j == 0usize) as (i32) ); let cost : floatX = (if cmdcode as (i32) < 128i32 { base_cost } else { dist_cost }) + GetCopyExtra( copycode ) as (floatX) + ZopfliCostModelGetCommandCost( model, cmdcode ); if cost < match (nodes[( pos.wrapping_add(l) as (usize) )]).u { Union1::cost(cost) => cost, _ => 0.0} { UpdateZopfliNode( nodes, pos, start, l, l, backward, j.wrapping_add(1usize), cost ); result = brotli_max_size_t(result,l); } best_len = l; } l = l.wrapping_add(1 as (usize)); } } } break; } j = j.wrapping_add(1 as (usize)); } if k >= 2usize { break 'continue28; } { let mut len : usize = min_len; j = 0usize; while j < num_matches { { let mut match_ : BackwardMatch = BackwardMatch(matches[(j as (usize))]); let dist : usize = match_.distance() as (usize); let is_dictionary_match : i32 = if !!(dist > max_distance.wrapping_add(gap)) { 1i32 } else { 0i32 }; let dist_code : usize = dist.wrapping_add(16usize).wrapping_sub( 1usize ); let mut dist_symbol : u16 = 0; let mut distextra : u32 = 0; let distnumextra : u32; let dist_cost : floatX; let max_match_len : usize; PrefixEncodeCopyDistance( dist_code, (*params).dist.num_direct_distance_codes as (usize), u64::from((*params).dist.distance_postfix_bits), &mut dist_symbol , &mut distextra ); distnumextra = u32::from(dist_symbol) >> 10; dist_cost = base_cost + distnumextra as (floatX) + ZopfliCostModelGetDistanceCost( model, (dist_symbol as (i32) & 0x3ff) as (usize) ); max_match_len = BackwardMatchLength( &mut match_ ); if len < max_match_len && (is_dictionary_match != 0 || max_match_len > max_zopfli_len) { len = max_match_len; } while len <= max_match_len { { let len_code : usize = if is_dictionary_match != 0 { BackwardMatchLengthCode( &mut match_ ) } else { len }; let copycode : u16 = GetCopyLengthCode(len_code); let cmdcode : u16 = CombineLengthCodes(inscode,copycode,0i32); let cost : floatX = dist_cost + GetCopyExtra( copycode ) as (floatX) + ZopfliCostModelGetCommandCost( model, cmdcode ); if let Union1::cost(nodeCost) = (nodes[( pos.wrapping_add(len) as (usize))]).u { if cost < nodeCost { UpdateZopfliNode( nodes, pos, start, len, len_code, dist, 0usize, cost ); result = brotli_max_size_t(result,len); } } } len = len.wrapping_add(1 as (usize)); } } j = j.wrapping_add(1 as (usize)); } } } break; } k = k.wrapping_add(1 as (usize)); } result } #[inline(always)] fn CleanupZopfliCostModel> ( m : &mut AllocF, xself : &mut ZopfliCostModel ) { { m.free_cell(core::mem::replace(&mut xself.literal_costs_, AllocF::AllocatedMemory::default())); } { m.free_cell(core::mem::replace(&mut xself.cost_dist_, AllocF::AllocatedMemory::default())); } } #[inline(always)] fn ZopfliNodeCommandLength( xself : & ZopfliNode ) -> u32 { ZopfliNodeCopyLength(xself).wrapping_add( (*xself).dcode_insert_length & 0x7ffffff ) } #[inline(always)] fn ComputeShortestPathFromNodes( num_bytes : usize, nodes : &mut [ZopfliNode]) -> usize { let mut index : usize = num_bytes; let mut num_commands : usize = 0usize; while ((nodes[( index as (usize) )]).dcode_insert_length & 0x7ffffff) == 0 && ((nodes[( index as (usize) )]).length == 1u32) { index = index.wrapping_sub(1 as (usize)); } nodes[(index as (usize))].u = Union1::next(!(0u32)); while index != 0usize { let len : usize = ZopfliNodeCommandLength( &mut nodes[( index as (usize) ) ] ) as (usize); index = index.wrapping_sub(len); (nodes[(index as (usize))]).u = Union1::next(len as (u32)); num_commands = num_commands.wrapping_add(1 as (usize)); } num_commands } const MAX_NUM_MATCHES_H10:usize = 128; pub fn BrotliZopfliComputeShortestPath, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params, AllocF:Allocator>( m : &mut AllocF, dictionary: Option<&BrotliDictionary>, num_bytes : usize, position : usize, ringbuffer : & [u8], ringbuffer_mask : usize, params : &BrotliEncoderParams, max_backward_limit : usize, dist_cache : & [i32], handle : &mut H10, nodes : &mut [ZopfliNode ]) -> usize where Buckets:PartialEq { let max_zopfli_len : usize = MaxZopfliLen(params); let mut model : ZopfliCostModel; let mut queue : StartPosQueue; let mut matches = [0;MAX_NUM_MATCHES_H10]; let store_end : usize = if num_bytes >= StoreLookaheadH10() { position.wrapping_add(num_bytes).wrapping_sub( StoreLookaheadH10() ).wrapping_add( 1usize ) } else { position }; let mut i : usize; let gap : usize = 0usize; let lz_matches_offset : usize = 0usize; (nodes[(0usize)]).length = 0u32; (nodes[(0usize)]).u = Union1::cost(0.0); model = InitZopfliCostModel( m, &(*params).dist , num_bytes ); if !(0i32 == 0) { return 0usize; } ZopfliCostModelSetFromLiteralCosts( &mut model , position, ringbuffer, ringbuffer_mask ); queue = InitStartPosQueue(); i = 0usize; while i.wrapping_add(handle.HashTypeLength()).wrapping_sub( 1usize ) < num_bytes { { let pos : usize = position.wrapping_add(i); let max_distance : usize = brotli_min_size_t(pos,max_backward_limit); let mut skip : usize; let mut num_matches : usize = FindAllMatchesH10( handle, dictionary, ringbuffer, ringbuffer_mask, pos, num_bytes.wrapping_sub(i), max_distance, gap, params, &mut matches[( lz_matches_offset as (usize) ).. ] ); if num_matches > 0usize && (BackwardMatchLength( &BackwardMatch(matches[( num_matches.wrapping_sub( 1usize ) as (usize) ) ]) ) > max_zopfli_len) { matches[(0usize) ]= matches[( num_matches.wrapping_sub( 1usize ) as (usize) )]; num_matches = 1usize; } skip = UpdateNodes( num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches, &matches[..], &mut model , &mut queue , nodes ); if skip < 16384usize { skip = 0usize; } if num_matches == 1usize && (BackwardMatchLength( &BackwardMatch(matches[( 0usize ) ]) ) > max_zopfli_len) { skip = brotli_max_size_t( BackwardMatchLength( &BackwardMatch(matches[( 0usize ) ]) ), skip ); } if skip > 1usize { handle.StoreRange( ringbuffer, ringbuffer_mask, pos.wrapping_add(1usize), brotli_min_size_t(pos.wrapping_add(skip),store_end) ); skip = skip.wrapping_sub(1 as (usize)); while skip != 0 { i = i.wrapping_add(1 as (usize)); if i.wrapping_add(handle.HashTypeLength()).wrapping_sub( 1usize ) >= num_bytes { break; } EvaluateNode( position, i, max_backward_limit, gap, dist_cache, &mut model , &mut queue , nodes ); skip = skip.wrapping_sub(1 as (usize)); } } } i = i.wrapping_add(1 as (usize)); } CleanupZopfliCostModel(m,&mut model ); ComputeShortestPathFromNodes(num_bytes,nodes) } pub fn BrotliCreateZopfliBackwardReferences + Allocator + Allocator, Buckets: Allocable+SliceWrapperMut+SliceWrapper, Params:H10Params>( alloc : &mut Alloc, dictionary: Option<&BrotliDictionary>, num_bytes : usize, position : usize, ringbuffer : & [u8], ringbuffer_mask : usize, params : &BrotliEncoderParams, hasher : &mut H10, dist_cache : &mut [i32], last_insert_len : &mut usize, commands : &mut [Command], num_commands : &mut usize, num_literals : &mut usize) where Buckets:PartialEq { let max_backward_limit : usize = (1usize << (*params).lgwin).wrapping_sub( 16usize ); let mut nodes : >::AllocatedMemory; nodes = if num_bytes.wrapping_add( 1usize ) > 0usize { >::alloc_cell(alloc, num_bytes.wrapping_add(1)) } else { >::AllocatedMemory::default() }; if !(0i32 == 0) { return; } BrotliInitZopfliNodes( nodes.slice_mut(), num_bytes.wrapping_add(1usize) ); *num_commands = (*num_commands).wrapping_add( BrotliZopfliComputeShortestPath( alloc, dictionary, num_bytes, position, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache , hasher, nodes.slice_mut() ) ); if !(0i32 == 0) { return; } BrotliZopfliCreateCommands( num_bytes, position, max_backward_limit, nodes.slice(), dist_cache, last_insert_len, params, commands, num_literals ); { >::free_cell(alloc, core::mem::replace(&mut nodes, >::AllocatedMemory::default())); } } fn SetCost( histogram : & [u32], histogram_size : usize, literal_histogram : i32, cost : &mut [floatX]) { let mut sum : u64 = 0; let mut missing_symbol_sum : u64; let log2sum : floatX; let missing_symbol_cost : floatX; let mut i : usize; i = 0usize; while i < histogram_size { { sum = sum.wrapping_add(u64::from(histogram[(i as (usize)) ])); } i = i.wrapping_add(1 as (usize)); } log2sum = FastLog2(sum) as (floatX); missing_symbol_sum = sum; if literal_histogram == 0 { i = 0usize; while i < histogram_size { { if histogram[(i as (usize)) ]== 0u32 { missing_symbol_sum = missing_symbol_sum.wrapping_add(1); } } i = i.wrapping_add(1 as (usize)); } } missing_symbol_cost = FastLog2f64( missing_symbol_sum ) as (floatX) + 2i32 as (floatX); i = 0usize; while i < histogram_size { 'continue56: loop { { if histogram[(i as (usize)) ]== 0u32 { cost[(i as (usize)) ]= missing_symbol_cost; break 'continue56; } cost[(i as (usize)) ]= log2sum - FastLog2( u64::from(histogram[( i as (usize) ) ]) ) as (floatX); if cost[(i as (usize)) ]< 1i32 as (floatX) { cost[(i as (usize)) ]= 1i32 as (floatX); } } break; } i = i.wrapping_add(1 as (usize)); } } #[inline(always)] fn brotli_min_float( a : floatX, b : floatX ) -> floatX { if a < b { a } else { b } } fn ZopfliCostModelSetFromCommands>( xself : &mut ZopfliCostModel, position : usize, ringbuffer : & [u8], ringbuffer_mask : usize, commands : & [Command], num_commands : usize, last_insert_len : usize ) { let mut histogram_literal = [0u32; BROTLI_NUM_LITERAL_SYMBOLS]; let mut histogram_cmd = [0u32; BROTLI_NUM_COMMAND_SYMBOLS]; let mut histogram_dist = [0u32; BROTLI_SIMPLE_DISTANCE_ALPHABET_SIZE]; let mut cost_literal = [0.0 as floatX; BROTLI_NUM_LITERAL_SYMBOLS]; let mut pos : usize = position.wrapping_sub(last_insert_len); let mut min_cost_cmd : floatX = kInfinity; let mut i : usize; let cost_cmd :&mut [floatX] = &mut (*xself).cost_cmd_[..]; i = 0usize; while i < num_commands { { let inslength : usize = (commands[(i as (usize))]).insert_len_ as (usize); let copylength : usize = CommandCopyLen( &commands[(i as (usize)) ] ) as (usize); let distcode : usize = ((commands[( i as (usize) )]).dist_prefix_ as (i32) & 0x3ff) as (usize); let cmdcode : usize = (commands[(i as (usize))]).cmd_prefix_ as (usize); let mut j : usize; { let _rhs = 1; let _lhs = &mut histogram_cmd[(cmdcode as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } if cmdcode >= 128usize { let _rhs = 1; let _lhs = &mut histogram_dist[(distcode as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } j = 0usize; while j < inslength { { let _rhs = 1; let _lhs = &mut histogram_literal[( ringbuffer[( (pos.wrapping_add(j) & ringbuffer_mask) as (usize) ) ]as (usize) )]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } j = j.wrapping_add(1 as (usize)); } pos = pos.wrapping_add(inslength.wrapping_add(copylength)); } i = i.wrapping_add(1 as (usize)); } SetCost( &histogram_literal[..], BROTLI_NUM_LITERAL_SYMBOLS, 1i32, &mut cost_literal ); SetCost( &histogram_cmd[..], BROTLI_NUM_COMMAND_SYMBOLS, 0i32, &mut cost_cmd[..] ); SetCost( &histogram_dist[..], (*xself).distance_histogram_size as (usize), 0i32, (*xself).cost_dist_.slice_mut() ); i = 0usize; while i < 704usize { { min_cost_cmd = brotli_min_float( min_cost_cmd, cost_cmd[(i as (usize))]); } i = i.wrapping_add(1 as (usize)); } (*xself).min_cost_cmd_ = min_cost_cmd; { let literal_costs : &mut [floatX] = (*xself).literal_costs_.slice_mut(); let mut literal_carry : floatX = 0.0; let num_bytes : usize = (*xself).num_bytes_; literal_costs[(0usize) ]= 0.0 as (floatX); i = 0usize; while i < num_bytes { { literal_carry = literal_carry + cost_literal[( ringbuffer[( (position.wrapping_add( i ) & ringbuffer_mask) as (usize) ) ]as (usize) )] as floatX; literal_costs[( i.wrapping_add(1usize) as (usize) ) ]= (literal_costs[(i as (usize)) ] as floatX + literal_carry) as floatX; literal_carry = literal_carry - (literal_costs[( i.wrapping_add(1usize) as (usize) ) ] as floatX - literal_costs[(i as (usize))] as floatX); } i = i.wrapping_add(1 as (usize)); } } } fn ZopfliIterate>( num_bytes : usize, position : usize, ringbuffer : & [u8], ringbuffer_mask : usize, params : & BrotliEncoderParams, max_backward_limit : usize, gap : usize, dist_cache : & [i32], model : &ZopfliCostModel, num_matches : & [u32], matches : &[u64], nodes : &mut [ZopfliNode] ) -> usize { let max_zopfli_len : usize = MaxZopfliLen(params); let mut queue : StartPosQueue; let mut cur_match_pos : usize = 0usize; let mut i : usize; (nodes[(0usize)]).length = 0u32; (nodes[(0usize)]).u = Union1::cost(0.0); queue = InitStartPosQueue(); i = 0usize; while i.wrapping_add(3usize) < num_bytes { { let mut skip : usize = UpdateNodes( num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches[(i as (usize)) ]as (usize), &matches[( cur_match_pos as (usize) )..], model, &mut queue , nodes ); if skip < 16384usize { skip = 0usize; } cur_match_pos = cur_match_pos.wrapping_add( num_matches[(i as (usize)) ]as (usize) ); if num_matches[( i as (usize) ) ]== 1u32 && (BackwardMatchLength( &BackwardMatch(matches[( cur_match_pos.wrapping_sub( 1usize ) as (usize) )]) ) > max_zopfli_len) { skip = brotli_max_size_t( BackwardMatchLength( &BackwardMatch(matches[( cur_match_pos.wrapping_sub(1usize) as (usize) )]) ), skip ); } if skip > 1usize { skip = skip.wrapping_sub(1 as (usize)); while skip != 0 { i = i.wrapping_add(1 as (usize)); if i.wrapping_add(3usize) >= num_bytes { break; } EvaluateNode( position, i, max_backward_limit, gap, dist_cache, model, &mut queue , nodes ); cur_match_pos = cur_match_pos.wrapping_add( num_matches[(i as (usize)) ]as (usize) ); skip = skip.wrapping_sub(1 as (usize)); } } } i = i.wrapping_add(1 as (usize)); } ComputeShortestPathFromNodes(num_bytes,nodes) } pub fn BrotliCreateHqZopfliBackwardReferences + Allocator + Allocator + Allocator, Buckets:Allocable+SliceWrapperMut+SliceWrapper, Params: H10Params>( alloc : &mut Alloc, dictionary: Option<&BrotliDictionary>, num_bytes : usize, position : usize, ringbuffer : & [u8], ringbuffer_mask : usize, params : &BrotliEncoderParams, hasher : &mut H10, dist_cache : &mut [i32], last_insert_len : &mut usize, commands : &mut [Command], num_commands : &mut usize, num_literals : &mut usize, ) where Buckets:PartialEq { let max_backward_limit : usize = (1usize << (*params).lgwin).wrapping_sub( 16usize ); let mut num_matches : >::AllocatedMemory = if num_bytes > 0usize { >::alloc_cell(alloc, num_bytes) } else { >::AllocatedMemory::default() }; let mut matches_size : usize = (4usize).wrapping_mul(num_bytes); let store_end : usize = if num_bytes >= StoreLookaheadH10() { position.wrapping_add(num_bytes).wrapping_sub( StoreLookaheadH10() ).wrapping_add( 1usize ) } else { position }; let mut cur_match_pos : usize = 0usize; let mut i : usize; let orig_num_literals : usize; let orig_last_insert_len : usize; let mut orig_dist_cache = [0i32;4]; let orig_num_commands : usize; let mut model : ZopfliCostModel; let mut nodes : >::AllocatedMemory; let mut matches : >::AllocatedMemory = if matches_size > 0usize { >::alloc_cell(alloc, matches_size) } else { >::AllocatedMemory::default() }; let gap : usize = 0usize; let shadow_matches : usize = 0usize; i = 0usize; while i.wrapping_add(hasher.HashTypeLength()).wrapping_sub( 1usize ) < num_bytes { { let pos : usize = position.wrapping_add(i); let max_distance : usize = brotli_min_size_t(pos,max_backward_limit); let max_length : usize = num_bytes.wrapping_sub(i); let num_found_matches : usize; let cur_match_end : usize; let mut j : usize; { if matches_size < cur_match_pos.wrapping_add( 128usize ).wrapping_add( shadow_matches ) { let mut new_size : usize = if matches_size == 0usize { cur_match_pos.wrapping_add(128usize).wrapping_add( shadow_matches ) } else { matches_size }; let mut new_array : >::AllocatedMemory; while new_size < cur_match_pos.wrapping_add( 128usize ).wrapping_add( shadow_matches ) { new_size = new_size.wrapping_mul(2usize); } new_array = if new_size > 0usize { >::alloc_cell(alloc, new_size) } else { >::AllocatedMemory::default() }; if !!(0i32 == 0) && (matches_size != 0usize) { for (dst, src) in new_array.slice_mut().split_at_mut(matches_size).0.iter_mut().zip( matches.slice().split_at(matches_size).0.iter()) { *dst = *src; } } { >::free_cell(alloc, core::mem::replace(&mut matches, >::AllocatedMemory::default())); } matches = new_array; matches_size = new_size; } } if !(0i32 == 0) { return; } num_found_matches = FindAllMatchesH10( hasher, dictionary,//&(*params).dictionary , ringbuffer, ringbuffer_mask, pos, max_length, max_distance, gap, params, &mut matches.slice_mut()[( cur_match_pos.wrapping_add(shadow_matches) as (usize) )..] ); cur_match_end = cur_match_pos.wrapping_add(num_found_matches); j = cur_match_pos; while j.wrapping_add(1usize) < cur_match_end { { } j = j.wrapping_add(1 as (usize)); } num_matches.slice_mut()[(i as (usize)) ]= num_found_matches as (u32); if num_found_matches > 0usize { let match_len : usize = BackwardMatchLength( &BackwardMatch(matches.slice()[( cur_match_end.wrapping_sub(1usize) as (usize) ) ]) ); if match_len > 325usize { let skip : usize = match_len.wrapping_sub(1usize); let tmp = matches.slice()[( cur_match_end.wrapping_sub(1usize) as (usize) )]; matches.slice_mut()[( { let _old = cur_match_pos; cur_match_pos = cur_match_pos.wrapping_add(1 as (usize)); _old } as (usize) ) ]= tmp; num_matches.slice_mut()[(i as (usize)) ]= 1u32; hasher.StoreRange( ringbuffer, ringbuffer_mask, pos.wrapping_add(1usize), brotli_min_size_t(pos.wrapping_add(match_len),store_end) ); for item in num_matches.slice_mut().split_at_mut(i.wrapping_add(1)).1.split_at_mut(skip).0.iter_mut() { *item = 0; } i = i.wrapping_add(skip); } else { cur_match_pos = cur_match_end; } } } i = i.wrapping_add(1 as (usize)); } orig_num_literals = *num_literals; orig_last_insert_len = *last_insert_len; for (i, j) in orig_dist_cache.split_at_mut(4).0.iter_mut().zip(dist_cache.split_at(4).0) { *i = *j; } orig_num_commands = *num_commands; nodes = if num_bytes.wrapping_add( 1usize ) > 0usize { >::alloc_cell(alloc, num_bytes.wrapping_add(1)) } else { >::AllocatedMemory::default() }; if !(0i32 == 0) { return; } model = InitZopfliCostModel( alloc, &(*params).dist , num_bytes ); if !(0i32 == 0) { return; } i = 0usize; while i < 2usize { { BrotliInitZopfliNodes( nodes.slice_mut(), num_bytes.wrapping_add(1usize) ); if i == 0usize { ZopfliCostModelSetFromLiteralCosts( &mut model , position, ringbuffer, ringbuffer_mask ); } else { ZopfliCostModelSetFromCommands( &mut model , position, ringbuffer, ringbuffer_mask, commands , (*num_commands).wrapping_sub(orig_num_commands), orig_last_insert_len ); } *num_commands = orig_num_commands; *num_literals = orig_num_literals; *last_insert_len = orig_last_insert_len; for (i, j) in dist_cache.split_at_mut(4).0.iter_mut().zip(orig_dist_cache.split_at(4).0) { *i = *j; } *num_commands = (*num_commands).wrapping_add( ZopfliIterate( num_bytes, position, ringbuffer, ringbuffer_mask, params, max_backward_limit, gap, dist_cache , &mut model , num_matches.slice() , matches.slice(), nodes.slice_mut() ) ); BrotliZopfliCreateCommands( num_bytes, position, max_backward_limit, nodes.slice(), dist_cache, last_insert_len, params, commands, num_literals ); } i = i.wrapping_add(1 as (usize)); } CleanupZopfliCostModel(alloc,&mut model ); { >::free_cell(alloc, nodes); } { >::free_cell(alloc, matches); } { >::free_cell(alloc, num_matches); } } brotli-3.4.0/src/enc/backward_references/mod.rs000075500000000000000000003105111046102023000175670ustar 00000000000000#![allow(dead_code)] pub mod hq; pub mod hash_to_binary_tree; mod test; mod benchmark; use super::command::{Command, ComputeDistanceCode, InitCommand, BrotliDistanceParams}; use super::hash_to_binary_tree::{H10, H10Buckets, H10DefaultParams, ZopfliNode}; use super::dictionary_hash::kStaticDictionaryHash; use super::static_dict::{BROTLI_UNALIGNED_LOAD32, BROTLI_UNALIGNED_LOAD64, FindMatchLengthWithLimit, FindMatchLengthWithLimitMin4}; use super::static_dict::BrotliDictionary; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use super::util::{Log2FloorNonZero, brotli_max_size_t, floatX}; use core; static kBrotliMinWindowBits: i32 = 10i32; static kBrotliMaxWindowBits: i32 = 24i32; pub static kInvalidMatch: u32 = 0xfffffffu32; static kCutoffTransformsCount: u32 = 10u32; static kCutoffTransforms: u64 = 0x71b520au64 << 32i32 | 0xda2d3200u32 as (u64); pub static kHashMul32: u32 = 0x1e35a7bdu32; pub static kHashMul64: u64 = 0x1e35a7bdu64 << 32i32 | 0x1e35a7bdu64; pub static kHashMul64Long: u64 = 0x1fe35a7bu32 as (u64) << 32i32 | 0xd3579bd3u32 as (u64); #[derive(PartialEq, Eq, Copy, Clone, Debug)] #[repr(C)] pub enum BrotliEncoderMode { BROTLI_MODE_GENERIC = 0, BROTLI_MODE_TEXT = 1, BROTLI_MODE_FONT = 2, BROTLI_FORCE_LSB_PRIOR = 3, BROTLI_FORCE_MSB_PRIOR = 4, BROTLI_FORCE_UTF8_PRIOR = 5, BROTLI_FORCE_SIGNED_PRIOR = 6, } #[derive(Clone,Copy, Debug, PartialEq)] pub struct BrotliHasherParams { /// type of hasher to use (default: type 6, but others have tradeoffs of speed/memory) pub type_: i32, /// number of the number of buckets to have in the hash table (defaults to quality - 1) pub bucket_bits: i32, /// number of potential matches to hold per bucket (hash collisions) pub block_bits: i32, /// number of bytes of a potential match to hash pub hash_len: i32, /// number of previous distance matches to check for future matches (defaults to 16) pub num_last_distances_to_check: i32, /// how much to weigh distance vs an extra byte of copy match when comparing possible copy srcs pub literal_byte_score: i32, } #[derive(Clone, Debug)] pub struct BrotliEncoderParams { pub dist: BrotliDistanceParams, /// if this brotli file is generic, font or specifically text pub mode: BrotliEncoderMode, /// quality param between 0 and 11 (11 is smallest but takes longest to encode) pub quality: i32, pub q9_5: bool, /// log of how big the ring buffer should be for copying prior data pub lgwin: i32, /// log of how often metablocks should be serialized pub lgblock: i32, /// how big the source file is (or 0 if no hint is provided) pub size_hint: usize, /// avoid serializing out priors for literal sections in the favor of decode speed pub disable_literal_context_modeling: i32, pub hasher: BrotliHasherParams, /// produce an IR of the compression file pub log_meta_block: bool, /// attempt to detect how many bytes before the current byte generates the best prediction of it /// * 0 = off (stride 1 always) /// * 1 = on per 16th of a file /// * 2 = on per block type switch pub stride_detection_quality: u8, /// if nonzero, will search for high entropy strings and log them differently to the IR pub high_entropy_detection_quality: u8, /// if nonzero it will search for the temporal locality and effectiveness of the priors /// for literals. The best adaptation and forgetfulness will be logged per metablock to the IR pub cdf_adaptation_detection: u8, /// whether to search for whether the previous byte or the context_map are better predictors on a per-context-map basis pub prior_bitmask_detection: u8, /// for prior bitmask detection: stride_low, stride_speed, cm_low, cm_speed pub literal_adaptation:[(u16, u16); 4], pub large_window: bool, /// avoid search for the best ndirect vs npostfix parameters for distance pub avoid_distance_prefix_search: bool, /// construct brotli in such a way that it may be concatenated with another brotli file using appropriate bit ops pub catable: bool, /// can use the dictionary (default yes unless catable is set) pub use_dictionary: bool, /// construct brotli in such a way that another concatable brotli file may be appended pub appendable: bool, /// include a magic number and version number and size_hint at the beginning pub magic_number: bool, /// prefer to compute the map of previously seen strings /// just once for all the threads at the beginning, since they overlap significantly pub favor_cpu_efficiency: bool, } impl Default for BrotliEncoderParams { fn default() -> BrotliEncoderParams { super::encode::BrotliEncoderInitParams() } } #[derive(Clone,Copy,Default,PartialEq)] pub struct H9Opts{ pub literal_byte_score: u32, } pub enum HowPrepared { ALREADY_PREPARED, NEWLY_PREPARED, } #[derive(Clone, PartialEq)] pub struct Struct1 { pub params: BrotliHasherParams, pub is_prepared_: i32, pub dict_num_lookups: usize, pub dict_num_matches: usize, } fn LiteralSpreeLengthForSparseSearch(params: &BrotliEncoderParams) -> usize { (if (*params).quality < 9 { 64i32 } else { 512i32 }) as (usize) } fn brotli_min_size_t(a: usize, b: usize) -> usize { if a < b { a } else { b } } pub struct HasherSearchResult { pub len: usize, pub len_x_code: usize, pub distance: usize, pub score: u64, } pub trait CloneWithAlloc + alloc::Allocator> { fn clone_with_alloc(&self, m: &mut Alloc) -> Self; } pub trait AnyHasher { fn Opts(&self) -> H9Opts; fn GetHasherCommon(&mut self) -> &mut Struct1; fn HashBytes(&self, data: &[u8]) -> usize; fn HashTypeLength(&self) -> usize; fn StoreLookahead(&self) -> usize; fn PrepareDistanceCache(&self, distance_cache: &mut [i32]); fn FindLongestMatch(&mut self, dictionary: Option<&BrotliDictionary>, dictionary_hash: &[u16], data: &[u8], ring_buffer_mask: usize, distance_cache: &[i32], cur_ix: usize, max_length: usize, max_backward: usize, gap: usize, max_distance: usize, out: &mut HasherSearchResult) -> bool; fn Store(&mut self, data: &[u8], mask: usize, ix: usize); fn Store4Vec4(&mut self, data: &[u8], mask: usize, ix: usize) { for i in 0..4 { self.Store(data, mask, ix + i * 4); } } fn StoreEvenVec4(&mut self, data: &[u8], mask: usize, ix: usize) { for i in 0..4 { self.Store(data, mask, ix + i * 2); } } fn StoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize); fn BulkStoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize); fn Prepare(&mut self, one_shot: bool, input_size: usize, data: &[u8]) -> HowPrepared; fn StitchToPreviousBlock(&mut self, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize); } pub fn StitchToPreviousBlockInternal(handle: &mut T, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize) { if num_bytes >= handle.HashTypeLength().wrapping_sub(1) && (position >= 3) { handle.Store(ringbuffer, ringbuffer_mask, position.wrapping_sub(3)); handle.Store(ringbuffer, ringbuffer_mask, position.wrapping_sub(2)); handle.Store(ringbuffer, ringbuffer_mask, position.wrapping_sub(1)); } } pub fn StoreLookaheadThenStore(hasher: &mut T, size: usize, dict: &[u8]) { let overlap = hasher.StoreLookahead().wrapping_sub(1usize); if size > overlap { hasher.BulkStoreRange(dict, !(0usize), 0, size - overlap); } } pub trait BasicHashComputer { fn HashBytes(&self, data: &[u8]) -> u32; fn BUCKET_BITS(&self) -> i32; fn USE_DICTIONARY(&self) -> i32; fn BUCKET_SWEEP(&self) -> i32; } pub struct BasicHasher + SliceWrapper + BasicHashComputer> { pub GetHasherCommon: Struct1, pub buckets_: Buckets, pub h9_opts: H9Opts, } impl + SliceWrapper + BasicHashComputer> PartialEq> for BasicHasher { fn eq(&self, other: &BasicHasher) -> bool { self.GetHasherCommon == other.GetHasherCommon && self.h9_opts == other.h9_opts && self.buckets_.slice() == other.buckets_.slice() } } impl + SliceWrapper + BasicHashComputer> BasicHasher { fn StoreRangeOptBasic(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) -> usize { let lookahead = 8; if ix_end >= ix_start + lookahead * 2{ let chunk_count = (ix_end - ix_start) / 4; for chunk_id in 0..chunk_count { let i = (ix_start + chunk_id * 4) & mask; let word11 = data.split_at(i).1.split_at(11).0; let mixed0 = self.HashBytes(word11); let mixed1 = self.HashBytes(word11.split_at(1).1); let mixed2 = self.HashBytes(word11.split_at(2).1); let mixed3 = self.HashBytes(word11.split_at(3).1); let off: u32 = (i >> 3i32).wrapping_rem(self.buckets_.BUCKET_SWEEP() as usize) as (u32); let offset0: usize = mixed0 + off as usize; let offset1: usize = mixed1 + off as usize; let offset2: usize = mixed2 + off as usize; let offset3: usize = mixed3 + off as usize; self.buckets_.slice_mut()[offset0] = i as u32; self.buckets_.slice_mut()[offset1] = i as u32 + 1; self.buckets_.slice_mut()[offset2] = i as u32 + 2; self.buckets_.slice_mut()[offset3] = i as u32 + 3; } return ix_start + chunk_count * 4; } ix_start } } pub struct H2Sub> { pub buckets_: AllocU32::AllocatedMemory, // 65537 } impl + SliceWrapper + BasicHashComputer> AnyHasher for BasicHasher { #[inline(always)] fn Opts(&self) -> H9Opts { self.h9_opts } #[allow(unused_variables)] fn PrepareDistanceCache(&self, distance_cache: &mut [i32]) {} #[inline(always)] fn HashTypeLength(&self) -> usize { 8 } #[inline(always)] fn StoreLookahead(&self) -> usize { 8 } fn StitchToPreviousBlock(&mut self, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize) { StitchToPreviousBlockInternal(self, num_bytes, position, ringbuffer, ringbuffer_mask); } #[inline(always)] fn GetHasherCommon(&mut self) -> &mut Struct1 { return &mut self.GetHasherCommon; } #[inline(always)] fn HashBytes(&self, data: &[u8]) -> usize { self.buckets_.HashBytes(data) as usize } fn Store(&mut self, data: &[u8], mask: usize, ix: usize) { let (_, data_window) = data.split_at((ix & mask) as (usize)); let key: u32 = self.HashBytes(data_window) as u32; let off: u32 = (ix >> 3i32).wrapping_rem(self.buckets_.BUCKET_SWEEP() as usize) as (u32); self.buckets_.slice_mut()[key.wrapping_add(off) as (usize)] = ix as (u32); } fn StoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { for i in self.StoreRangeOptBasic(data, mask, ix_start, ix_end)..ix_end { self.Store(data, mask, i); } } fn BulkStoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { self.StoreRange(data, mask, ix_start, ix_end); } fn Prepare(&mut self, one_shot: bool, input_size: usize, data: &[u8]) -> HowPrepared { if self.GetHasherCommon.is_prepared_ != 0 { return HowPrepared::ALREADY_PREPARED; } let partial_prepare_threshold = (4 << self.buckets_.BUCKET_BITS()) >> 7; if one_shot && input_size <= partial_prepare_threshold { for i in 0..input_size { let key = self.HashBytes(&data[i..]) as usize; let bs = self.buckets_.BUCKET_SWEEP() as usize; for item in self.buckets_.slice_mut()[key..(key + bs)].iter_mut() { *item = 0; } } } else { for item in self.buckets_.slice_mut().iter_mut() { *item = 0; } } self.GetHasherCommon.is_prepared_ = 1; HowPrepared::NEWLY_PREPARED } fn FindLongestMatch(&mut self, dictionary: Option<&BrotliDictionary>, dictionary_hash: &[u16], data: &[u8], ring_buffer_mask: usize, distance_cache: &[i32], cur_ix: usize, max_length: usize, max_backward: usize, gap: usize, max_distance: usize, out: &mut HasherSearchResult) -> bool { let opts = self.Opts(); let best_len_in: usize = (*out).len; let cur_ix_masked: usize = cur_ix & ring_buffer_mask; let key: u32 = self.HashBytes(&data[(cur_ix_masked as (usize))..]) as u32; let mut compare_char: i32 = data[(cur_ix_masked.wrapping_add(best_len_in) as (usize))] as (i32); let mut best_score: u64 = (*out).score; let mut best_len: usize = best_len_in; let cached_backward: usize = distance_cache[(0usize)] as (usize); let mut prev_ix: usize = cur_ix.wrapping_sub(cached_backward); let mut is_match_found: i32 = 0i32; (*out).len_x_code = 0usize; if prev_ix < cur_ix { prev_ix = prev_ix & ring_buffer_mask as (u32) as (usize); if compare_char == data[(prev_ix.wrapping_add(best_len) as (usize))] as (i32) { let len: usize = FindMatchLengthWithLimitMin4(&data[(prev_ix as (usize))..], &data[(cur_ix_masked as (usize))..], max_length); if len != 0 { best_score = BackwardReferenceScoreUsingLastDistance(len, opts); best_len = len; (*out).len = len; (*out).distance = cached_backward; (*out).score = best_score; compare_char = data[(cur_ix_masked.wrapping_add(best_len) as (usize))] as (i32); if self.buckets_.BUCKET_SWEEP() == 1i32 { (*self).buckets_.slice_mut()[key as (usize)] = cur_ix as (u32); return true; } else { is_match_found = 1i32; } } } } let bucket_sweep = self.buckets_.BUCKET_SWEEP(); if bucket_sweep == 1i32 { let backward: usize; let len: usize; prev_ix = (*self).buckets_.slice()[key as (usize)] as (usize); (*self).buckets_.slice_mut()[key as (usize)] = cur_ix as (u32); backward = cur_ix.wrapping_sub(prev_ix); prev_ix = prev_ix & ring_buffer_mask as (u32) as (usize); if compare_char != data[(prev_ix.wrapping_add(best_len_in) as (usize))] as (i32) { return false; } if backward == 0usize || backward > max_backward { return false; } len = FindMatchLengthWithLimitMin4(&data[(prev_ix as (usize))..], &data[(cur_ix_masked as (usize))..], max_length); if len != 0 { (*out).len = len; (*out).distance = backward; (*out).score = BackwardReferenceScore(len, backward, opts); return true; } } else { for prev_ix_ref in self.buckets_.slice().split_at(key as usize).1[..bucket_sweep as usize].iter() { let mut prev_ix = *prev_ix_ref as usize; let backward: usize = cur_ix.wrapping_sub(prev_ix); prev_ix = prev_ix & ring_buffer_mask as (u32) as (usize); if compare_char != data[(prev_ix.wrapping_add(best_len) as (usize))] as (i32) { continue; } if backward == 0usize || backward > max_backward { continue; } let len = FindMatchLengthWithLimitMin4(&data[(prev_ix as (usize))..], &data[(cur_ix_masked as (usize))..], max_length); if len != 0 { let score: u64 = BackwardReferenceScore(len, backward, opts); if best_score < score { best_score = score; best_len = len; (*out).len = best_len; (*out).distance = backward; (*out).score = score; compare_char = data[(cur_ix_masked.wrapping_add(best_len) as (usize))] as (i32); is_match_found = 1i32; } } } } if dictionary.is_some() && self.buckets_.USE_DICTIONARY() != 0 && (is_match_found == 0) { is_match_found = SearchInStaticDictionary(dictionary.unwrap(), dictionary_hash, self, &data[(cur_ix_masked as (usize))..], max_length, max_backward.wrapping_add(gap), max_distance, out, 1i32); } (*self).buckets_.slice_mut()[(key as (usize)).wrapping_add((cur_ix >> 3) .wrapping_rem(bucket_sweep as usize))] = cur_ix as (u32); is_match_found != 0 } } impl> BasicHashComputer for H2Sub { fn HashBytes(&self, data: &[u8]) -> u32 { let h: u64 = (BROTLI_UNALIGNED_LOAD64(data) << 64i32 - 8i32 * 5i32).wrapping_mul(kHashMul64); (h >> 64i32 - 16i32) as (u32) } fn BUCKET_BITS(&self) -> i32 { 16 } fn BUCKET_SWEEP(&self) -> i32 { 1 } fn USE_DICTIONARY(&self) -> i32 { 1 } } impl> SliceWrapperMut for H2Sub { fn slice_mut(&mut self) -> &mut [u32] { return self.buckets_.slice_mut(); } } impl> SliceWrapper for H2Sub { fn slice(&self) -> &[u32] { return self.buckets_.slice(); } } pub struct H3Sub> { pub buckets_: AllocU32::AllocatedMemory, // 65538 } impl> SliceWrapperMut for H3Sub { fn slice_mut(&mut self) -> &mut [u32] { return self.buckets_.slice_mut(); } } impl> SliceWrapper for H3Sub { fn slice(&self) -> &[u32] { return self.buckets_.slice(); } } impl> BasicHashComputer for H3Sub { fn BUCKET_BITS(&self) -> i32 { 16 } fn BUCKET_SWEEP(&self) -> i32 { 2 } fn USE_DICTIONARY(&self) -> i32 { 0 } fn HashBytes(&self, data: &[u8]) -> u32 { let h: u64 = (BROTLI_UNALIGNED_LOAD64(data) << 64i32 - 8i32 * 5i32).wrapping_mul(kHashMul64); (h >> 64i32 - 16i32) as (u32) } } pub struct H4Sub> { pub buckets_: AllocU32::AllocatedMemory, // 131076 } impl> BasicHashComputer for H4Sub { fn BUCKET_BITS(&self) -> i32 { 17 } fn BUCKET_SWEEP(&self) -> i32 { 4 } fn USE_DICTIONARY(&self) -> i32 { 1 } fn HashBytes(&self, data: &[u8]) -> u32 { let h: u64 = (BROTLI_UNALIGNED_LOAD64(data) << 64i32 - 8i32 * 5i32).wrapping_mul(kHashMul64); (h >> 64i32 - 17i32) as (u32) } } impl> SliceWrapperMut for H4Sub { fn slice_mut(&mut self) -> &mut [u32] { return self.buckets_.slice_mut(); } } impl> SliceWrapper for H4Sub { fn slice(&self) -> &[u32] { return self.buckets_.slice(); } } pub struct H54Sub> { pub buckets_: AllocU32::AllocatedMemory, } impl> BasicHashComputer for H54Sub { fn BUCKET_BITS(&self) -> i32 { 20 } fn BUCKET_SWEEP(&self) -> i32 { 4 } fn USE_DICTIONARY(&self) -> i32 { 0 } fn HashBytes(&self, data: &[u8]) -> u32 { let h: u64 = (BROTLI_UNALIGNED_LOAD64(data) << 64i32 - 8i32 * 7i32).wrapping_mul(kHashMul64); (h >> 64i32 - 20i32) as (u32) } } impl> SliceWrapperMut for H54Sub { fn slice_mut(&mut self) -> &mut [u32] { return self.buckets_.slice_mut(); } } impl> SliceWrapper for H54Sub { fn slice(&self) -> &[u32] { return self.buckets_.slice(); } } pub const H9_BUCKET_BITS :usize = 15; pub const H9_BLOCK_BITS :usize =8; pub const H9_NUM_LAST_DISTANCES_TO_CHECK:usize = 16; pub const H9_BLOCK_SIZE :usize= 1 << H9_BLOCK_BITS; const H9_BLOCK_MASK :usize= (1 << H9_BLOCK_BITS) - 1; impl H9Opts { pub fn new(params:&BrotliHasherParams) -> H9Opts { H9Opts { literal_byte_score: if params.literal_byte_score != 0 { params.literal_byte_score as u32} else {540}, } } } pub struct H9 + alloc::Allocator> { pub num_:>::AllocatedMemory,//[u16;1 << H9_BUCKET_BITS], pub buckets_:>::AllocatedMemory,//[u32; H9_BLOCK_SIZE << H9_BUCKET_BITS], pub dict_search_stats_:Struct1, pub h9_opts: H9Opts, } impl + alloc::Allocator> PartialEq> for H9 { fn eq(&self, other: &H9) -> bool { self.dict_search_stats_ == other.dict_search_stats_ && self.num_.slice() == other.num_.slice() && self.buckets_.slice() == other.buckets_.slice() && self.h9_opts == other.h9_opts } } fn adv_prepare_distance_cache(distance_cache: &mut [i32], num_distances: i32) { if num_distances > 4i32 { let last_distance: i32 = distance_cache[(0usize)]; distance_cache[(4usize)] = last_distance - 1i32; distance_cache[(5usize)] = last_distance + 1i32; distance_cache[(6usize)] = last_distance - 2i32; distance_cache[(7usize)] = last_distance + 2i32; distance_cache[(8usize)] = last_distance - 3i32; distance_cache[(9usize)] = last_distance + 3i32; if num_distances > 10i32 { let next_last_distance: i32 = distance_cache[(1usize)]; distance_cache[(10usize)] = next_last_distance - 1i32; distance_cache[(11usize)] = next_last_distance + 1i32; distance_cache[(12usize)] = next_last_distance - 2i32; distance_cache[(13usize)] = next_last_distance + 2i32; distance_cache[(14usize)] = next_last_distance - 3i32; distance_cache[(15usize)] = next_last_distance + 3i32; } } } pub const kDistanceCacheIndex : [u8;16] = [ 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, ]; pub const kDistanceCacheOffset : [i8;16]= [ 0i8, 0i8, 0i8, 0i8, -1i8, 1i8, -2i8, 2i8, -3i8, 3i8, -1i8, 1i8, -2i8, 2i8, -3i8, 3i8]; //const BROTLI_LITERAL_BYTE_SCORE: u64 = 540; const BROTLI_DISTANCE_BIT_PENALTY: u32 = 120; // Score must be positive after applying maximal penalty. const BROTLI_SCORE_BASE : u32 = (BROTLI_DISTANCE_BIT_PENALTY * 8 * 8/* sizeof usize*/); const kDistanceShortCodeCost : [u32;16] = [ /* Repeat last */ BROTLI_SCORE_BASE + 60, /* 2nd, 3rd, 4th last */ BROTLI_SCORE_BASE - 95, BROTLI_SCORE_BASE - 117, BROTLI_SCORE_BASE - 127, /* Last with offset */ BROTLI_SCORE_BASE - 93, BROTLI_SCORE_BASE - 93, BROTLI_SCORE_BASE - 96, BROTLI_SCORE_BASE - 96, BROTLI_SCORE_BASE - 99, BROTLI_SCORE_BASE - 99, /* 2nd last with offset */ BROTLI_SCORE_BASE - 105, BROTLI_SCORE_BASE - 105, BROTLI_SCORE_BASE - 115, BROTLI_SCORE_BASE - 115, BROTLI_SCORE_BASE - 125, BROTLI_SCORE_BASE - 125 ]; fn BackwardReferenceScoreH9(copy_length: usize, backward_reference_offset: usize, h9_opts: H9Opts) -> u64 { (u64::from(BROTLI_SCORE_BASE).wrapping_add((h9_opts.literal_byte_score as u64).wrapping_mul(copy_length as u64)).wrapping_sub( (BROTLI_DISTANCE_BIT_PENALTY as u64).wrapping_mul(Log2FloorNonZero(backward_reference_offset as u64) as u64))) >> 2 } fn BackwardReferenceScoreUsingLastDistanceH9( copy_length : usize, distance_short_code : usize, h9_opts: H9Opts) -> u64 { ((h9_opts.literal_byte_score as u64).wrapping_mul(copy_length as u64).wrapping_add( u64::from(kDistanceShortCodeCost[distance_short_code]))) >> 2 } impl + alloc::Allocator> AnyHasher for H9 { #[inline(always)] fn Opts(&self) -> H9Opts { self.h9_opts } #[inline(always)] fn GetHasherCommon(&mut self) -> &mut Struct1 { return &mut self.dict_search_stats_; } #[inline(always)] fn HashBytes(&self, data: &[u8]) -> usize { let h: u32 = BROTLI_UNALIGNED_LOAD32(data).wrapping_mul(kHashMul32); let thirty_two : usize = 32; (h >> (thirty_two.wrapping_sub(H9_BUCKET_BITS))) as usize } #[inline(always)] fn HashTypeLength(&self) -> usize { 4 } #[inline(always)] fn StoreLookahead(&self) -> usize { 4 } fn PrepareDistanceCache(&self, distance_cache: &mut [i32]) { let num_distances = H9_NUM_LAST_DISTANCES_TO_CHECK as i32; adv_prepare_distance_cache(distance_cache, num_distances); } fn FindLongestMatch(&mut self, dictionary: Option<&BrotliDictionary>, dictionary_hash: &[u16], data: &[u8], ring_buffer_mask: usize, distance_cache: &[i32], cur_ix: usize, max_length: usize, max_backward: usize, gap: usize, max_distance: usize, out: &mut HasherSearchResult) -> bool { let best_len_in: usize = (*out).len; let cur_ix_masked: usize = cur_ix & ring_buffer_mask; let mut best_score: u64 = (*out).score; let mut best_len: usize = best_len_in; let mut is_match_found: i32 = 0i32; (*out).len_x_code = 0usize; for i in 0..H9_NUM_LAST_DISTANCES_TO_CHECK { let idx = kDistanceCacheIndex[i] as usize; let backward = (distance_cache[idx] as usize).wrapping_add(kDistanceCacheOffset[i] as usize); let mut prev_ix = cur_ix.wrapping_sub(backward); if prev_ix >= cur_ix { continue; } if backward > max_backward { continue; } prev_ix &= ring_buffer_mask; if cur_ix_masked.wrapping_add(best_len) > ring_buffer_mask || prev_ix.wrapping_add(best_len) > ring_buffer_mask || data[cur_ix_masked.wrapping_add(best_len)] != data[prev_ix.wrapping_add(best_len)] { continue; } { let len: usize = FindMatchLengthWithLimit(&data[(prev_ix as (usize))..], &data[(cur_ix_masked as (usize))..], max_length); if len >= 3 || (len == 2 && i < 2) { let score = BackwardReferenceScoreUsingLastDistanceH9(len, i, self.h9_opts); if best_score < score { best_score = score; best_len = len; out.len = best_len; out.distance = backward; out.score = best_score; is_match_found = 1i32; } } } } if max_length >= 4 && cur_ix_masked.wrapping_add(best_len) <= ring_buffer_mask { let key = self.HashBytes(&data.split_at(cur_ix_masked).1); let bucket = &mut self.buckets_.slice_mut().split_at_mut(key << H9_BLOCK_BITS).1.split_at_mut(H9_BLOCK_SIZE).0; assert!(bucket.len() > H9_BLOCK_MASK); assert_eq!(bucket.len(), H9_BLOCK_MASK + 1); let self_num_key = &mut self.num_.slice_mut()[key]; let down = if *self_num_key > H9_BLOCK_SIZE as u16 { (*self_num_key as usize) - H9_BLOCK_SIZE } else {0usize}; let mut i: usize = *self_num_key as usize; let mut prev_best_val = data[cur_ix_masked.wrapping_add(best_len)]; while i > down { i -= 1; let mut prev_ix = bucket[i & H9_BLOCK_MASK] as usize; let backward = cur_ix.wrapping_sub(prev_ix) as usize; if (backward > max_backward) { break; } prev_ix &= ring_buffer_mask; if (prev_ix.wrapping_add(best_len) > ring_buffer_mask || prev_best_val != data[prev_ix.wrapping_add(best_len) as usize]) { continue; } { let len = FindMatchLengthWithLimit(&data.split_at(prev_ix).1, &data.split_at((cur_ix_masked as usize)).1, max_length); if (len >= 4) { /* Comparing for >= 3 does not change the semantics, but just saves for a few unnecessary binary logarithms in backward reference score, since we are not interested in such short matches. */ let score = BackwardReferenceScoreH9(len, backward, self.h9_opts); if (best_score < score) { best_score = score; best_len = len; out.len = best_len; out.distance = backward; out.score = best_score; is_match_found = 1; if cur_ix_masked.wrapping_add(best_len) > ring_buffer_mask { break } prev_best_val = data[cur_ix_masked.wrapping_add(best_len) as usize]; } } } } bucket[*self_num_key as usize & H9_BLOCK_MASK] = cur_ix as u32; *self_num_key = self_num_key.wrapping_add(1); } if is_match_found == 0 && dictionary.is_some() { let (_, cur_data) = data.split_at(cur_ix_masked as usize); is_match_found = SearchInStaticDictionary(dictionary.unwrap(), dictionary_hash, self, cur_data, max_length, max_backward.wrapping_add(gap), max_distance, out, 0i32); } is_match_found != 0 } fn Store(&mut self, data: &[u8], mask: usize, ix: usize) { let (_, data_window) = data.split_at((ix & mask) as (usize)); let key: u32 = self.HashBytes(data_window) as u32; let self_num_key = &mut self.num_.slice_mut()[key as usize]; let minor_ix: usize = (*self_num_key as usize & H9_BLOCK_MASK); self.buckets_.slice_mut()[minor_ix.wrapping_add((key as usize) << H9_BLOCK_BITS)] = ix as u32; *self_num_key = self_num_key.wrapping_add(1); } fn StoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { for i in ix_start..ix_end { self.Store(data, mask, i); } } fn BulkStoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { for i in ix_start..ix_end { self.Store(data, mask, i); } } fn Prepare(&mut self, _one_shot: bool, _input_size:usize, _data:&[u8]) ->HowPrepared { if self.GetHasherCommon().is_prepared_ != 0 { return HowPrepared::ALREADY_PREPARED; } for item in self.num_.slice_mut().iter_mut() { *item =0; } self.GetHasherCommon().is_prepared_ = 1; HowPrepared::NEWLY_PREPARED } fn StitchToPreviousBlock(&mut self, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize) { StitchToPreviousBlockInternal(self, num_bytes, position, ringbuffer, ringbuffer_mask) } } pub trait AdvHashSpecialization : PartialEq{ fn get_hash_mask(&self) -> u64; fn set_hash_mask(&mut self, params_hash_len: i32); fn get_k_hash_mul(&self) -> u64; fn HashTypeLength(&self) -> usize; fn StoreLookahead(&self) -> usize; fn load_and_mix_word(&self, data: &[u8]) -> u64; fn hash_shift(&self) -> i32; fn bucket_size(&self) -> u32; fn block_mask(&self) -> u32; fn block_size(&self) -> u32; fn block_bits(&self) -> i32; } pub struct AdvHasher + alloc::Allocator> { pub GetHasherCommon: Struct1, pub specialization: Specialization, // contains hash_mask_ pub num: >::AllocatedMemory, pub buckets: >::AllocatedMemory, pub h9_opts: H9Opts, } impl + alloc::Allocator> PartialEq> for AdvHasher { fn eq(&self, other: &Self) -> bool { self.GetHasherCommon == other.GetHasherCommon && self.specialization == other.specialization && self.num.slice() == other.num.slice() && self.buckets.slice() == other.buckets.slice() && self.h9_opts == other.h9_opts } } #[derive(Clone, PartialEq)] pub struct HQ5Sub {} impl AdvHashSpecialization for HQ5Sub { #[inline(always)] fn hash_shift(&self) -> i32 { 32i32 - 14 // 32 - bucket_bits } #[inline(always)] fn bucket_size(&self) -> u32 { 1 << 14 } #[inline(always)] fn block_bits(&self) -> i32 { 4 } #[inline(always)] fn block_size(&self) -> u32 { 1 << 4 } #[inline(always)] fn block_mask(&self) -> u32 { (1 << 4) - 1 } #[inline(always)] fn get_hash_mask(&self) -> u64 { //return 0xffffffffffffffffu64; return 0xffffffffu64; // make it 32 bit } #[inline(always)] fn get_k_hash_mul(&self) -> u64 { return kHashMul32 as u64; } #[inline(always)] fn load_and_mix_word(&self, data: &[u8]) -> u64 { return (BROTLI_UNALIGNED_LOAD32(data) as u64 * self.get_k_hash_mul()) & self.get_hash_mask(); } #[inline(always)] fn set_hash_mask(&mut self, _params_hash_len: i32) {} fn HashTypeLength(&self) -> usize { 4 } #[inline(always)] fn StoreLookahead(&self) -> usize { 4 } } #[derive(Clone, PartialEq)] pub struct HQ7Sub {} impl AdvHashSpecialization for HQ7Sub { #[inline(always)] fn hash_shift(&self) -> i32 { 32i32 - 15 // 32 - bucket_bits } #[inline(always)] fn bucket_size(&self) -> u32 { 1 << 15 } #[inline(always)] fn block_bits(&self) -> i32 { 6 } #[inline(always)] fn block_size(&self) -> u32 { 1 << 6 } #[inline(always)] fn block_mask(&self) -> u32 { (1 << 6) - 1 } #[inline(always)] fn get_hash_mask(&self) -> u64 { //return 0xffffffffffffffffu64; return 0xffffffffu64; // make it 32 bit } #[inline(always)] fn get_k_hash_mul(&self) -> u64 { return kHashMul32 as u64; } #[inline(always)] fn load_and_mix_word(&self, data: &[u8]) -> u64 { return (BROTLI_UNALIGNED_LOAD32(data) as u64 * self.get_k_hash_mul()) & self.get_hash_mask(); } #[inline(always)] fn set_hash_mask(&mut self, _params_hash_len: i32) {} fn HashTypeLength(&self) -> usize { 4 } #[inline(always)] fn StoreLookahead(&self) -> usize { 4 } } #[derive(Clone, PartialEq)] pub struct H5Sub { pub hash_shift_: i32, pub bucket_size_: u32, pub block_mask_:u32, pub block_bits_: i32, } impl AdvHashSpecialization for H5Sub { #[inline(always)] fn hash_shift(&self) -> i32 { return self.hash_shift_ } fn bucket_size(&self) -> u32 { return self.bucket_size_ } fn block_bits(&self) -> i32 { self.block_bits_ } fn block_size(&self) -> u32 { 1 << self.block_bits_ } fn block_mask(&self) -> u32 { return self.block_mask_ } fn get_hash_mask(&self) -> u64 { //return 0xffffffffffffffffu64; return 0xffffffffu64; // make it 32 bit } fn get_k_hash_mul(&self) -> u64 { return kHashMul32 as u64; } fn load_and_mix_word(&self, data: &[u8]) -> u64 { return (BROTLI_UNALIGNED_LOAD32(data) as u64 * self.get_k_hash_mul()) & self.get_hash_mask(); } #[allow(unused_variables)] fn set_hash_mask(&mut self, params_hash_len: i32) {} fn HashTypeLength(&self) -> usize { 4 } fn StoreLookahead(&self) -> usize { 4 } } #[derive(Clone, PartialEq)] pub struct H6Sub { pub hash_mask: u64, pub hash_shift_: i32, pub bucket_size_: u32, pub block_mask_:u32, pub block_bits_: i32, } impl AdvHashSpecialization for H6Sub { #[inline(always)] fn hash_shift(&self) -> i32 { return self.hash_shift_ } #[inline(always)] fn bucket_size(&self) -> u32 { return self.bucket_size_ } fn block_bits(&self) -> i32 { self.block_bits_ } fn block_size(&self) -> u32 { 1 << self.block_bits_ } #[inline(always)] fn block_mask(&self) -> u32 { return self.block_mask_ } #[inline(always)] fn get_hash_mask(&self) -> u64 { self.hash_mask } #[inline(always)] fn set_hash_mask(&mut self, params_hash_len: i32) { self.hash_mask = !(0u32 as (u64)) >> 64i32 - 8i32 * params_hash_len; } #[inline(always)] fn get_k_hash_mul(&self) -> u64 { kHashMul64Long } #[inline(always)] fn load_and_mix_word(&self, data: &[u8]) -> u64 { return (BROTLI_UNALIGNED_LOAD64(data) & self.get_hash_mask()) .wrapping_mul(self.get_k_hash_mul()); } #[inline(always)] fn HashTypeLength(&self) -> usize { 8 } #[inline(always)] fn StoreLookahead(&self) -> usize { 8 } } fn BackwardReferencePenaltyUsingLastDistance(distance_short_code: usize) -> u64 { (39u64).wrapping_add((0x1ca10u64 >> (distance_short_code & 0xeusize) & 0xeu64)) } impl + alloc::Allocator> AdvHasher { // 7 opt // returns a new ix_start fn StoreRangeOptBatch(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) -> usize { let lookahead = self.specialization.StoreLookahead(); if ix_end >= ix_start + lookahead * 2 && lookahead == 4{ let num = self.num.slice_mut(); let buckets = self.buckets.slice_mut(); assert_eq!(num.len(), self.specialization.bucket_size() as usize); assert_eq!(buckets.len(), self.specialization.bucket_size() as usize * self.specialization.block_size() as usize); let shift = self.specialization.hash_shift(); let chunk_count = (ix_end - ix_start) / 4; for chunk_id in 0..chunk_count { let i = (ix_start + chunk_id * 4) & mask; let ffffffff = 0xffffffff; let word = u64::from(data[i]) | (u64::from(data[i + 1]) << 8) | (u64::from(data[i + 2]) << 16) | (u64::from(data[i + 3]) << 24) | (u64::from(data[i + 4]) << 32) | (u64::from(data[i + 5]) << 40) | (u64::from(data[i + 6]) << 48); let mixed0 = ((((word & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed1 = (((((word >> 8) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed2 = (((((word >> 16) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed3 = (((((word >> 24) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mut num_ref0 = u32::from(num[mixed0]); num[mixed0] = num_ref0.wrapping_add(1) as u16; num_ref0 &= (*self).specialization.block_mask(); let mut num_ref1 = u32::from(num[mixed1]); num[mixed1] = num_ref1.wrapping_add(1) as u16; num_ref1 &= (*self).specialization.block_mask(); let mut num_ref2 = u32::from(num[mixed2]); num[mixed2] = num_ref2.wrapping_add(1) as u16; num_ref2 &= (*self).specialization.block_mask(); let mut num_ref3 = u32::from(num[mixed3]); num[mixed3] = num_ref3.wrapping_add(1) as u16; num_ref3 &= (*self).specialization.block_mask(); let offset0: usize = (mixed0 << self.specialization.block_bits()) + num_ref0 as usize; let offset1: usize = (mixed1 << self.specialization.block_bits()) + num_ref1 as usize; let offset2: usize = (mixed2 << self.specialization.block_bits()) + num_ref2 as usize; let offset3: usize = (mixed3 << self.specialization.block_bits()) + num_ref3 as usize; buckets[offset0] = (i) as u32; buckets[offset1] = (i + 1) as u32; buckets[offset2] = (i + 2) as u32; buckets[offset3] = (i + 3) as u32; } return ix_start + chunk_count * 4; } ix_start } fn BulkStoreRangeOptMemFetch(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) -> usize { const REG_SIZE : usize = 32usize; let lookahead = self.specialization.StoreLookahead(); if mask == !0 && ix_end > ix_start + REG_SIZE && lookahead == 4{ const lookahead4: usize = 4; assert_eq!(lookahead4, lookahead); let mut data64 = [0u8;REG_SIZE + lookahead4 - 1]; let del = (ix_end - ix_start) / REG_SIZE; let num = self.num.slice_mut(); let buckets = self.buckets.slice_mut(); assert_eq!(num.len(), self.specialization.bucket_size() as usize); assert_eq!(buckets.len(), self.specialization.bucket_size() as usize * self.specialization.block_size() as usize); let shift = self.specialization.hash_shift(); for chunk_id in 0..del { let ix_offset = ix_start + chunk_id * REG_SIZE; data64[..REG_SIZE + lookahead4 - 1].clone_from_slice(data.split_at(ix_offset).1.split_at(REG_SIZE + lookahead4 - 1).0); for quad_index in 0..(REG_SIZE>>2) { let i = quad_index<<2; let ffffffff = 0xffffffff; let word = u64::from(data64[i]) | (u64::from(data64[i + 1]) << 8) | (u64::from(data64[i + 2]) << 16) | (u64::from(data64[i + 3]) << 24) | (u64::from(data64[i + 4]) << 32) | (u64::from(data64[i + 5]) << 40) | (u64::from(data64[i + 6]) << 48); let mixed0 = ((((word & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed1 = (((((word >> 8) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed2 = (((((word >> 16) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed3 = (((((word >> 24) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mut num_ref0 = u32::from(num[mixed0]); num[mixed0] = num_ref0.wrapping_add(1) as u16; num_ref0 &= (*self).specialization.block_mask(); let mut num_ref1 = u32::from(num[mixed1]); num[mixed1] = num_ref1.wrapping_add(1) as u16; num_ref1 &= (*self).specialization.block_mask(); let mut num_ref2 = u32::from(num[mixed2]); num[mixed2] = num_ref2.wrapping_add(1) as u16; num_ref2 &= (*self).specialization.block_mask(); let mut num_ref3 = u32::from(num[mixed3]); num[mixed3] = num_ref3.wrapping_add(1) as u16; num_ref3 &= (*self).specialization.block_mask(); let offset0: usize = (mixed0 << self.specialization.block_bits()) + num_ref0 as usize; let offset1: usize = (mixed1 << self.specialization.block_bits()) + num_ref1 as usize; let offset2: usize = (mixed2 << self.specialization.block_bits()) + num_ref2 as usize; let offset3: usize = (mixed3 << self.specialization.block_bits()) + num_ref3 as usize; buckets[offset0] = (ix_offset + i) as u32; buckets[offset1] = (ix_offset + i + 1) as u32; buckets[offset2] = (ix_offset + i + 2) as u32; buckets[offset3] = (ix_offset + i + 3) as u32; } } return ix_start + del * REG_SIZE; } ix_start } fn BulkStoreRangeOptMemFetchLazyDupeUpdate(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) -> usize { const REG_SIZE : usize = 32usize; let lookahead = self.specialization.StoreLookahead(); if mask == !0 && ix_end > ix_start + REG_SIZE && lookahead == 4{ const lookahead4: usize = 4; assert_eq!(lookahead4, lookahead); let mut data64 = [0u8;REG_SIZE + lookahead4]; let del = (ix_end - ix_start) / REG_SIZE; let num = self.num.slice_mut(); let buckets = self.buckets.slice_mut(); assert_eq!(num.len(), self.specialization.bucket_size() as usize); assert_eq!(buckets.len(), self.specialization.bucket_size() as usize * self.specialization.block_size() as usize); let shift = self.specialization.hash_shift(); for chunk_id in 0..del { let ix_offset = ix_start + chunk_id * REG_SIZE; data64[..REG_SIZE + lookahead4].clone_from_slice(data.split_at(ix_offset).1.split_at(REG_SIZE + lookahead4).0); for quad_index in 0..(REG_SIZE>>2) { let i = quad_index<<2; let ffffffff = 0xffffffff; let word = u64::from(data64[i]) | (u64::from(data64[i + 1]) << 8) | (u64::from(data64[i + 2]) << 16) | (u64::from(data64[i + 3]) << 24) | (u64::from(data64[i + 4]) << 32) | (u64::from(data64[i + 5]) << 40) | (u64::from(data64[i + 6]) << 48); let mixed0 = ((((word & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed1 = (((((word >> 8) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed2 = (((((word >> 16) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed3 = (((((word >> 24) & ffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mut num_ref0 = u32::from(num[mixed0]); let mut num_ref1 = u32::from(num[mixed1]); let mut num_ref2 = u32::from(num[mixed2]); let mut num_ref3 = u32::from(num[mixed3]); num[mixed0] = num_ref0.wrapping_add(1) as u16; num[mixed1] = num_ref1.wrapping_add(1) as u16; num[mixed2] = num_ref2.wrapping_add(1) as u16; num[mixed3] = num_ref3.wrapping_add(1) as u16; num_ref0 &= (*self).specialization.block_mask(); num_ref1 &= (*self).specialization.block_mask(); num_ref2 &= (*self).specialization.block_mask(); num_ref3 &= (*self).specialization.block_mask(); let offset0: usize = (mixed0 << self.specialization.block_bits()) + num_ref0 as usize; let offset1: usize = (mixed1 << self.specialization.block_bits()) + num_ref1 as usize; let offset2: usize = (mixed2 << self.specialization.block_bits()) + num_ref2 as usize; let offset3: usize = (mixed3 << self.specialization.block_bits()) + num_ref3 as usize; buckets[offset0] = (ix_offset + i) as u32; buckets[offset1] = (ix_offset + i + 1) as u32; buckets[offset2] = (ix_offset + i + 2) as u32; buckets[offset3] = (ix_offset + i + 3) as u32; } } return ix_start + del * REG_SIZE; } ix_start } fn BulkStoreRangeOptRandomDupeUpdate(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) -> usize { const REG_SIZE : usize = 32usize; let lookahead = self.specialization.StoreLookahead(); if mask == !0 && ix_end > ix_start + REG_SIZE && lookahead == 4{ const lookahead4: usize = 4; assert_eq!(lookahead4, lookahead); let mut data64 = [0u8;REG_SIZE + lookahead4]; let del = (ix_end - ix_start) / REG_SIZE; let num = self.num.slice_mut(); let buckets = self.buckets.slice_mut(); assert_eq!(num.len(), self.specialization.bucket_size() as usize); assert_eq!(buckets.len(), self.specialization.bucket_size() as usize * self.specialization.block_size() as usize); let shift = self.specialization.hash_shift(); for chunk_id in 0..del { let ix_offset = ix_start + chunk_id * REG_SIZE; data64[..REG_SIZE + lookahead4].clone_from_slice(data.split_at(ix_offset).1.split_at(REG_SIZE + lookahead4).0); for i in 0..REG_SIZE { let mixed_word = ((u32::from(data64[i]) | (u32::from(data64[i + 1]) << 8) | (u32::from(data64[i + 2]) << 16) | (u32::from(data64[i + 3]) << 24)) as u64 * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask(); let key = mixed_word >> shift; let minor_ix: usize = chunk_id&(*self).specialization.block_mask() as usize;// *num_ref as usize & (*self).specialization.block_mask() as usize; //GIGANTIC HAX: overwrite firsst option let offset: usize = minor_ix + (key << self.specialization.block_bits()) as usize; buckets[offset] = (ix_offset + i) as u32; } } for (bucket_index, num_ref) in num.iter_mut().enumerate() { let region = buckets.split_at_mut(bucket_index << self.specialization.block_bits()).1.split_at_mut( self.specialization.block_size() as usize).0; let mut lnum = 0usize; for block_index in 0..self.specialization.block_size() as usize{ if region[block_index] != 0 { let byte_addr = region[block_index]; region[lnum] = byte_addr; lnum += 1; } } *num_ref = lnum as u16; } return ix_start + del * REG_SIZE; } ix_start } } impl + alloc::Allocator> AnyHasher for AdvHasher { fn Opts(&self) -> H9Opts { self.h9_opts } fn PrepareDistanceCache(&self, distance_cache: &mut [i32]){ let num_distances = self.GetHasherCommon.params.num_last_distances_to_check; adv_prepare_distance_cache(distance_cache, num_distances); } fn StitchToPreviousBlock(&mut self, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize) { StitchToPreviousBlockInternal(self, num_bytes, position, ringbuffer, ringbuffer_mask); } fn Prepare(&mut self, one_shot: bool, input_size:usize, data:&[u8]) ->HowPrepared { if self.GetHasherCommon.is_prepared_ != 0 { return HowPrepared::ALREADY_PREPARED; } let partial_prepare_threshold = self.specialization.bucket_size() as usize >> 6; if one_shot && input_size <= partial_prepare_threshold { for i in 0..input_size { let key = self.HashBytes(&data[i..]); self.num.slice_mut()[key] = 0; } } else { for item in self.num.slice_mut()[..(self.specialization.bucket_size() as usize)].iter_mut() { *item =0; } } self.GetHasherCommon.is_prepared_ = 1; HowPrepared::NEWLY_PREPARED } fn GetHasherCommon(&mut self) -> &mut Struct1 { &mut self.GetHasherCommon } fn HashTypeLength(&self) -> usize { self.specialization.HashTypeLength() } fn StoreLookahead(&self) -> usize { self.specialization.StoreLookahead() } fn HashBytes(&self, data: &[u8]) -> usize { let shift = self.specialization.hash_shift(); let h: u64 = self.specialization.load_and_mix_word(data); (h >> shift) as (u32) as usize } fn StoreEvenVec4(&mut self, data: &[u8], mask: usize, ix: usize) { if self.specialization.StoreLookahead() != 4 { for i in 0..4 { self.Store(data, mask, ix + i * 2); } return; } let shift = self.specialization.hash_shift(); let num = self.num.slice_mut(); let buckets = self.buckets.slice_mut(); let li = ix & mask; let lword = u64::from(data[li]) | (u64::from(data[li + 1]) << 8) | (u64::from(data[li + 2]) << 16) | (u64::from(data[li + 3]) << 24) | (u64::from(data[li + 4]) << 32) | (u64::from(data[li + 5]) << 40) | (u64::from(data[li + 6]) << 48) | (u64::from(data[li + 7]) << 56); let hi = (ix + 8) & mask; let hword = u64::from(data[hi]) | (u64::from(data[hi + 1]) << 8); let mixed0 = ((((lword & 0xffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed1 = (((((lword >> 16) & 0xffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed2 = (((((lword >> 32) & 0xffffffff) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed3 = ((((((hword & 0xffff) << 16) | ((lword >> 48) & 0xffff)) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mut num_ref0 = u32::from(num[mixed0]); num[mixed0] = num_ref0.wrapping_add(1) as u16; num_ref0 &= (*self).specialization.block_mask(); let mut num_ref1 = u32::from(num[mixed1]); num[mixed1] = num_ref1.wrapping_add(1) as u16; num_ref1 &= (*self).specialization.block_mask(); let mut num_ref2 = u32::from(num[mixed2]); num[mixed2] = num_ref2.wrapping_add(1) as u16; num_ref2 &= (*self).specialization.block_mask(); let mut num_ref3 = u32::from(num[mixed3]); num[mixed3] = num_ref3.wrapping_add(1) as u16; num_ref3 &= (*self).specialization.block_mask(); let offset0: usize = (mixed0 << self.specialization.block_bits()) + num_ref0 as usize; let offset1: usize = (mixed1 << self.specialization.block_bits()) + num_ref1 as usize; let offset2: usize = (mixed2 << self.specialization.block_bits()) + num_ref2 as usize; let offset3: usize = (mixed3 << self.specialization.block_bits()) + num_ref3 as usize; buckets[offset0] = ix as u32; buckets[offset1] = (ix + 2) as u32; buckets[offset2] = (ix + 4) as u32; buckets[offset3] = (ix + 6) as u32; } fn Store4Vec4(&mut self, data: &[u8], mask: usize, ix: usize) { if self.specialization.StoreLookahead() != 4 { for i in 0..4 { self.Store(data, mask, ix + i * 4); } return; } let shift = self.specialization.hash_shift(); let num = self.num.slice_mut(); let buckets = self.buckets.slice_mut(); let li = ix & mask; let llword = u32::from(data[li]) | (u32::from(data[li + 1]) << 8) | (u32::from(data[li + 2]) << 16) | (u32::from(data[li + 3]) << 24); let luword = u32::from(data[li + 4]) | (u32::from(data[li + 5]) << 8) | (u32::from(data[li + 6]) << 16) | (u32::from(data[li + 7]) << 24); let ui = (ix + 8) & mask; let ulword = u32::from(data[ui]) | (u32::from(data[ui + 1]) << 8) | (u32::from(data[ui + 2]) << 16) | (u32::from(data[ui + 3]) << 24); let uuword = u32::from(data[ui + 4]) | (u32::from(data[ui + 5]) << 8) | (u32::from(data[ui + 6]) << 16) | (u32::from(data[ui + 7]) << 24); let mixed0 = (((u64::from(llword) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed1 = (((u64::from(luword) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed2 = (((u64::from(ulword) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mixed3 = (((u64::from(uuword) * self.specialization.get_k_hash_mul()) & self.specialization.get_hash_mask()) >> shift) as usize; let mut num_ref0 = u32::from(num[mixed0]); num[mixed0] = num_ref0.wrapping_add(1) as u16; num_ref0 &= (*self).specialization.block_mask(); let mut num_ref1 = u32::from(num[mixed1]); num[mixed1] = num_ref1.wrapping_add(1) as u16; num_ref1 &= (*self).specialization.block_mask(); let mut num_ref2 = u32::from(num[mixed2]); num[mixed2] = num_ref2.wrapping_add(1) as u16; num_ref2 &= (*self).specialization.block_mask(); let mut num_ref3 = u32::from(num[mixed3]); num[mixed3] = num_ref3.wrapping_add(1) as u16; num_ref3 &= (*self).specialization.block_mask(); let offset0: usize = (mixed0 << self.specialization.block_bits()) + num_ref0 as usize; let offset1: usize = (mixed1 << self.specialization.block_bits()) + num_ref1 as usize; let offset2: usize = (mixed2 << self.specialization.block_bits()) + num_ref2 as usize; let offset3: usize = (mixed3 << self.specialization.block_bits()) + num_ref3 as usize; buckets[offset0] = ix as u32; buckets[offset1] = (ix + 4) as u32; buckets[offset2] = (ix + 8) as u32; buckets[offset3] = (ix + 12) as u32; } fn Store(&mut self, data: &[u8], mask: usize, ix: usize) { let (_, data_window) = data.split_at((ix & mask) as (usize)); let key: u32 = self.HashBytes(data_window) as u32; let minor_ix: usize = (self.num.slice()[(key as (usize))] as (u32) & (*self).specialization.block_mask() as u32) as (usize); let offset: usize = minor_ix.wrapping_add((key << (*self).specialization.block_bits()) as (usize)); self.buckets.slice_mut()[offset] = ix as (u32); { let _lhs = &mut self.num.slice_mut()[(key as (usize))]; *_lhs = (*_lhs as (i32) + 1) as (u16); } } fn StoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { for i in self.StoreRangeOptBatch(data, mask, ix_start, ix_end)..ix_end { self.Store(data, mask, i); } } fn BulkStoreRange(&mut self, data: &[u8], mask: usize, mut ix_start: usize, ix_end: usize) { /* if ix_start + 4096 < ix_end { for vec_offset in 0..(ix_end - ix_start - 4096) / 16 { self.Store4Vec4(data, mask, ix_start + vec_offset * 16); } ix_start += 16 * ((ix_end - ix_start - 4096) / 16); } if ix_start + 512 < ix_end { for vec_offset in 0..(ix_end - ix_start - 512) / 8 { self.StoreEvenVec4(data, mask, ix_start + vec_offset * 8); //self.StoreRange(data, mask, ix_start + vec_offset * 8, ix_start + (1+ vec_offset) * 8); } ix_start += 8 * ((ix_end - ix_start - 512) / 8); } */ ix_start = self.BulkStoreRangeOptMemFetch(data, mask, ix_start, ix_end); for i in ix_start..ix_end { self.Store(data, mask, i); } } fn FindLongestMatch(&mut self, dictionary: Option<&BrotliDictionary>, dictionary_hash: &[u16], data: &[u8], ring_buffer_mask: usize, distance_cache: &[i32], cur_ix: usize, max_length: usize, max_backward: usize, gap: usize, max_distance: usize, out: &mut HasherSearchResult) -> bool { let opts = self.Opts(); let cur_ix_masked: usize = cur_ix & ring_buffer_mask; let mut is_match_found: i32 = 0i32; let mut best_score: u64 = (*out).score; let mut best_len: usize = (*out).len; let mut i: usize; (*out).len = 0usize; (*out).len_x_code = 0usize; i = 0usize; let cur_data = data.split_at(cur_ix_masked).1; while i < self.GetHasherCommon.params.num_last_distances_to_check as (usize) { 'continue45: loop { { let backward: usize = distance_cache[(i as (usize))] as (usize); let mut prev_ix: usize = cur_ix.wrapping_sub(backward); if prev_ix >= cur_ix { break 'continue45; } if backward > max_backward { break 'continue45; } prev_ix = prev_ix & ring_buffer_mask; if (cur_ix_masked.wrapping_add(best_len) > ring_buffer_mask || prev_ix.wrapping_add(best_len) > ring_buffer_mask || cur_data[best_len] != data[prev_ix.wrapping_add(best_len)]) { break 'continue45; } let prev_data = data.split_at(prev_ix).1; let len: usize = FindMatchLengthWithLimit(&prev_data, &cur_data, max_length); if len >= 3usize || len == 2usize && (i < 2usize) { let mut score: u64 = BackwardReferenceScoreUsingLastDistance(len, opts); if best_score < score { if i != 0usize { score = score.wrapping_sub(BackwardReferencePenaltyUsingLastDistance(i)); } if best_score < score { best_score = score; best_len = len; (*out).len = best_len; (*out).distance = backward; (*out).score = best_score; is_match_found = 1i32; } } } } break; } i = i.wrapping_add(1 as (usize)); } { let key: u32 = self.HashBytes(cur_data) as u32; let common_block_bits = self.specialization.block_bits(); let num_ref_mut = &mut self.num.slice_mut()[key as usize]; let num_copy = *num_ref_mut; let bucket: &mut [u32] = self.buckets.slice_mut().split_at_mut((key << common_block_bits) as (usize)).1.split_at_mut( (*self).specialization.block_size() as usize).0; assert!(bucket.len() > (*self).specialization.block_mask() as usize); if num_copy != 0 { let down: usize = core::cmp::max(i32::from(num_copy) - (*self).specialization.block_size() as i32, 0) as usize; i = num_copy as (usize); while i > down { i -= 1; let mut prev_ix = bucket[i & (*self).specialization.block_mask() as usize] as usize; let backward = cur_ix.wrapping_sub(prev_ix); prev_ix &= ring_buffer_mask; if (cur_ix_masked.wrapping_add(best_len) > ring_buffer_mask || prev_ix.wrapping_add(best_len) > ring_buffer_mask || cur_data[best_len] != data[prev_ix.wrapping_add(best_len)]) { if backward > max_backward { break; } continue; } if backward > max_backward { break; } let prev_data = data.split_at(prev_ix as usize).1; let len = FindMatchLengthWithLimitMin4(&prev_data, &cur_data, max_length); if len != 0 { let score: u64 = BackwardReferenceScore(len, backward, opts); if best_score < score { best_score = score; best_len = len; (*out).len = best_len; (*out).distance = backward; (*out).score = best_score; is_match_found = 1i32; } } } } bucket[((num_copy as (u32) & (self).specialization.block_mask() as u32) as (usize))] = cur_ix as (u32); *num_ref_mut = num_ref_mut.wrapping_add(1); } if is_match_found == 0 && dictionary.is_some() { let (_, cur_data) = data.split_at(cur_ix_masked as usize); is_match_found = SearchInStaticDictionary(dictionary.unwrap(), dictionary_hash, self, cur_data, max_length, max_backward.wrapping_add(gap), max_distance, out, 0i32); } is_match_found != 0 } } pub struct BankH40 { pub slots: [SlotH40; 65536], } pub struct BankH41 { pub slots: [SlotH41; 65536], } pub struct BankH42 { pub slots: [SlotH42; 512], } pub struct SlotH40 { pub delta: u16, pub next: u16, } pub struct SlotH41 { pub delta: u16, pub next: u16, } pub struct SlotH42 { pub delta: u16, pub next: u16, } // UNSUPPORTED, for now. pub struct H40 { pub common: Struct1, pub addr: [u32; 32768], pub head: [u16; 32768], pub tiny_hash: [u8; 65536], pub banks: [BankH40; 1], pub free_slot_idx: [u16; 1], pub max_hops: usize, } pub struct H41 { pub common: Struct1, pub addr: [u32; 32768], pub head: [u16; 32768], pub tiny_hash: [u8; 65536], pub banks: [BankH41; 1], pub free_slot_idx: [u16; 1], pub max_hops: usize, } pub struct H42 { pub common: Struct1, pub addr: [u32; 32768], pub head: [u16; 32768], pub tiny_hash: [u8; 65536], pub banks: [BankH42; 512], free_slot_idx: [u16; 512], pub max_hops: usize, } fn unopt_ctzll(mut val: usize) -> u8 { let mut cnt: u8 = 0i32 as (u8); while val & 1usize == 0usize { val = val >> 1i32; cnt = (cnt as (i32) + 1) as (u8); } cnt } fn BackwardReferenceScoreUsingLastDistance(copy_length: usize, h9_opts: H9Opts) -> u64 { ((h9_opts.literal_byte_score as u64) >> 2) .wrapping_mul(copy_length as u64) .wrapping_add((30u64 * 8u64).wrapping_mul(::core::mem::size_of::() as u64)) .wrapping_add(15u64) } fn BackwardReferenceScore(copy_length: usize, backward_reference_offset: usize, h9_opts: H9Opts) -> u64 { (30u64 * 8u64) .wrapping_mul(::core::mem::size_of::() as u64) .wrapping_add(((h9_opts.literal_byte_score as usize) >> 2).wrapping_mul(copy_length) as u64) .wrapping_sub((30u64).wrapping_mul(Log2FloorNonZero(backward_reference_offset as u64) as u64)) } fn Hash14(data: &[u8]) -> u32 { let h: u32 = BROTLI_UNALIGNED_LOAD32(data).wrapping_mul(kHashMul32); h >> 32i32 - 14i32 } fn TestStaticDictionaryItem(dictionary: &BrotliDictionary, item: usize, data: &[u8], max_length: usize, max_backward: usize, max_distance: usize, h9_opts: H9Opts, out: &mut HasherSearchResult) -> i32 { let len: usize; let dist: usize; let offset: usize; let matchlen: usize; let backward: usize; let score: u64; len = item & 0x1fusize; dist = item >> 5i32; offset = ((*dictionary).offsets_by_length[len] as (usize)).wrapping_add(len.wrapping_mul(dist)); if len > max_length { return 0i32; } matchlen = FindMatchLengthWithLimit(data, &(*dictionary).data[offset..], len); if matchlen.wrapping_add(kCutoffTransformsCount as usize) <= len || matchlen == 0usize { return 0i32; } { let cut: u64 = len.wrapping_sub(matchlen) as u64; let transform_id: usize = (cut << 2i32).wrapping_add(kCutoffTransforms as u64 >> cut.wrapping_mul(6) & 0x3f) as usize; backward = max_backward.wrapping_add(dist) .wrapping_add(1usize) .wrapping_add(transform_id << (*dictionary).size_bits_by_length[len] as (i32)); } if backward > max_distance { return 0i32; } score = BackwardReferenceScore(matchlen, backward, h9_opts); if score < (*out).score { return 0i32; } (*out).len = matchlen; (*out).len_x_code = len ^ matchlen; (*out).distance = backward; (*out).score = score; 1i32 } fn SearchInStaticDictionary(dictionary: &BrotliDictionary, dictionary_hash: &[u16], handle: &mut HasherType, data: &[u8], max_length: usize, max_backward: usize, max_distance: usize, out: &mut HasherSearchResult, shallow: i32) -> i32 { let mut key: usize; let mut i: usize; let mut is_match_found: i32 = 0i32; let opts = handle.Opts(); let xself: &mut Struct1 = handle.GetHasherCommon(); if (*xself).dict_num_matches < (*xself).dict_num_lookups >> 7i32 { return 0i32; } key = (Hash14(data) << 1i32) as (usize); //FIXME: works for any kind of hasher?? i = 0usize; while i < if shallow != 0 { 1u32 } else { 2u32 } as (usize) { { let item: usize = dictionary_hash[(key as (usize))] as (usize); (*xself).dict_num_lookups = (*xself).dict_num_lookups.wrapping_add(1 as (usize)); if item != 0usize { let item_matches: i32 = TestStaticDictionaryItem(dictionary, item, data, max_length, max_backward, max_distance, opts, out); if item_matches != 0 { (*xself).dict_num_matches = (*xself).dict_num_matches.wrapping_add(1 as (usize)); is_match_found = 1i32; } } } i = i.wrapping_add(1 as (usize)); key = key.wrapping_add(1 as (usize)); } is_match_found } impl + alloc::Allocator> CloneWithAlloc for BasicHasher> { fn clone_with_alloc(&self, m: &mut Alloc) -> Self { let mut ret = BasicHasher::> { GetHasherCommon: self.GetHasherCommon.clone(), buckets_: H2Sub::{ buckets_:>::alloc_cell(m, self.buckets_.buckets_.len()), }, h9_opts: self.h9_opts.clone(), }; ret.buckets_.buckets_.slice_mut().clone_from_slice(self.buckets_.buckets_.slice()); ret } } impl + alloc::Allocator> CloneWithAlloc for BasicHasher> { fn clone_with_alloc(&self, m: &mut Alloc) -> Self { let mut ret = BasicHasher::> { GetHasherCommon: self.GetHasherCommon.clone(), buckets_: H3Sub::{ buckets_:>::alloc_cell(m, self.buckets_.buckets_.len()), }, h9_opts: self.h9_opts.clone(), }; ret.buckets_.buckets_.slice_mut().clone_from_slice(self.buckets_.buckets_.slice()); ret } } impl + alloc::Allocator> CloneWithAlloc for BasicHasher> { fn clone_with_alloc(&self, m: &mut Alloc) -> Self { let mut ret = BasicHasher::> { GetHasherCommon: self.GetHasherCommon.clone(), buckets_: H4Sub::{ buckets_:>::alloc_cell(m, self.buckets_.buckets_.len()), }, h9_opts: self.h9_opts.clone(), }; ret.buckets_.buckets_.slice_mut().clone_from_slice(self.buckets_.buckets_.slice()); ret } } impl + alloc::Allocator> CloneWithAlloc for BasicHasher> { fn clone_with_alloc(&self, m: &mut Alloc) -> Self { let mut ret = BasicHasher::> { GetHasherCommon: self.GetHasherCommon.clone(), buckets_: H54Sub::{ buckets_:>::alloc_cell(m, self.buckets_.len()), }, h9_opts: self.h9_opts.clone(), }; ret.buckets_.buckets_.slice_mut().clone_from_slice(self.buckets_.buckets_.slice()); ret } } impl + alloc::Allocator> CloneWithAlloc for H9 { fn clone_with_alloc(&self, m: &mut Alloc) -> Self { let mut num = >::alloc_cell(m, self.num_.len()); num.slice_mut().clone_from_slice(self.num_.slice()); let mut buckets = >::alloc_cell(m, self.buckets_.len()); buckets.slice_mut().clone_from_slice(self.buckets_.slice()); H9:: { num_:num, buckets_:buckets, dict_search_stats_: self.dict_search_stats_.clone(), h9_opts: self.h9_opts.clone(), } } } impl + alloc::Allocator, Special: AdvHashSpecialization+Sized+Clone,> CloneWithAlloc for AdvHasher { fn clone_with_alloc(&self, m: &mut Alloc) -> Self { let mut num = >::alloc_cell(m, self.num.len()); num.slice_mut().clone_from_slice(self.num.slice()); let mut buckets = >::alloc_cell(m, self.buckets.len()); buckets.slice_mut().clone_from_slice(self.buckets.slice()); AdvHasher:: { GetHasherCommon: self.GetHasherCommon.clone(), specialization:self.specialization.clone(), num:num, buckets:buckets, h9_opts: self.h9_opts.clone(), } } } pub enum UnionHasher + alloc::Allocator> { Uninit, H2(BasicHasher>), H3(BasicHasher>), H4(BasicHasher>), H54(BasicHasher>), H5(AdvHasher), H5q7(AdvHasher), H5q5(AdvHasher), H6(AdvHasher), H9(H9), H10(H10, H10DefaultParams>), } impl + alloc::Allocator> PartialEq> for UnionHasher { fn eq(&self, other: &UnionHasher) -> bool { match *self { UnionHasher::H2(ref hasher) => match *other { UnionHasher::H2(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H3(ref hasher) => match *other { UnionHasher::H3(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H4(ref hasher) => match *other { UnionHasher::H4(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H54(ref hasher) => match *other { UnionHasher::H54(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H5(ref hasher) => match *other { UnionHasher::H5(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H5q7(ref hasher) => match *other { UnionHasher::H5q7(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H5q5(ref hasher) => match *other { UnionHasher::H5q5(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H6(ref hasher) => match *other { UnionHasher::H6(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H9(ref hasher) => match *other { UnionHasher::H9(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::H10(ref hasher) => match *other { UnionHasher::H10(ref otherh) => *hasher == *otherh, _ => false, }, UnionHasher::Uninit => match *other { UnionHasher::Uninit => true, _ => false, }, } } } impl + alloc::Allocator> CloneWithAlloc for UnionHasher { fn clone_with_alloc(&self, m: &mut Alloc) -> Self { match *self { UnionHasher::H2(ref hasher) => UnionHasher::H2(hasher.clone_with_alloc(m)), UnionHasher::H3(ref hasher) => UnionHasher::H3(hasher.clone_with_alloc(m)), UnionHasher::H4(ref hasher) => UnionHasher::H4(hasher.clone_with_alloc(m)), UnionHasher::H5(ref hasher) => UnionHasher::H5(hasher.clone_with_alloc(m)), UnionHasher::H5q7(ref hasher) => UnionHasher::H5q7(hasher.clone_with_alloc(m)), UnionHasher::H5q5(ref hasher) => UnionHasher::H5q5(hasher.clone_with_alloc(m)), UnionHasher::H6(ref hasher) => UnionHasher::H6(hasher.clone_with_alloc(m)), UnionHasher::H54(ref hasher) => UnionHasher::H54(hasher.clone_with_alloc(m)), UnionHasher::H9(ref hasher) => UnionHasher::H9(hasher.clone_with_alloc(m)), UnionHasher::H10(ref hasher) => UnionHasher::H10(hasher.clone_with_alloc(m)), UnionHasher::Uninit => UnionHasher::Uninit, } } } macro_rules! match_all_hashers_mut { ($xself : expr, $func_call : ident, $( $args:expr),*) => { match $xself { &mut UnionHasher::H2(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H3(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H4(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H5(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H5q7(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H5q5(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H6(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H54(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H9(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::H10(ref mut hasher) => hasher.$func_call($($args),*), &mut UnionHasher::Uninit => panic!("UNINTIALIZED"), } }; } macro_rules! match_all_hashers { ($xself : expr, $func_call : ident, $( $args:expr),*) => { match $xself { &UnionHasher::H2(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H3(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H4(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H5(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H5q7(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H5q5(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H6(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H54(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H9(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::H10(ref hasher) => hasher.$func_call($($args),*), &UnionHasher::Uninit => panic!("UNINTIALIZED"), } }; } impl + alloc::Allocator> AnyHasher for UnionHasher { fn Opts(&self) -> H9Opts { return match_all_hashers!(self, Opts,); } fn GetHasherCommon(&mut self) -> &mut Struct1 { return match_all_hashers_mut!(self, GetHasherCommon,); }/* fn GetH10Tree(&mut self) -> Option<&mut H10> { return match_all_hashers_mut!(self, GetH10Tree,); }*/ fn Prepare(&mut self, one_shot: bool, input_size: usize, data: &[u8]) -> HowPrepared { return match_all_hashers_mut!(self, Prepare, one_shot, input_size, data); } fn HashBytes(&self, data: &[u8]) -> usize { return match_all_hashers!(self, HashBytes, data); } fn HashTypeLength(&self) -> usize { return match_all_hashers!(self, HashTypeLength,); } fn StoreLookahead(&self) -> usize { return match_all_hashers!(self, StoreLookahead,); } fn PrepareDistanceCache(&self, distance_cache: &mut [i32]) { return match_all_hashers!(self, PrepareDistanceCache, distance_cache); } fn StitchToPreviousBlock(&mut self, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize) { return match_all_hashers_mut!(self, StitchToPreviousBlock, num_bytes, position, ringbuffer, ringbuffer_mask); } fn FindLongestMatch(&mut self, dictionary: Option<&BrotliDictionary>, dictionary_hash: &[u16], data: &[u8], ring_buffer_mask: usize, distance_cache: &[i32], cur_ix: usize, max_length: usize, max_backward: usize, gap: usize, max_distance: usize, out: &mut HasherSearchResult) -> bool { return match_all_hashers_mut!(self, FindLongestMatch, dictionary, dictionary_hash, data, ring_buffer_mask, distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out); } fn Store(&mut self, data: &[u8], mask: usize, ix: usize) { return match_all_hashers_mut!(self, Store, data, mask, ix); } fn StoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { return match_all_hashers_mut!(self, StoreRange, data, mask, ix_start, ix_end); } fn BulkStoreRange(&mut self, data: &[u8], mask: usize, ix_start: usize, ix_end: usize) { return match_all_hashers_mut!(self, BulkStoreRange, data, mask, ix_start, ix_end); } } impl + alloc::Allocator> UnionHasher { pub fn free (&mut self, alloc: &mut Alloc) { match self { &mut UnionHasher::H2(ref mut hasher) => { >::free_cell(alloc, core::mem::replace(&mut hasher.buckets_.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H3(ref mut hasher) => { >::free_cell(alloc, core::mem::replace(&mut hasher.buckets_.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H4(ref mut hasher) => { >::free_cell(alloc, core::mem::replace(&mut hasher.buckets_.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H54(ref mut hasher) => { >::free_cell(alloc, core::mem::replace(&mut hasher.buckets_.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H5q7(ref mut hasher) => { >::free_cell(alloc, core::mem::replace(&mut hasher.num, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut hasher.buckets, >::AllocatedMemory::default())); } &mut UnionHasher::H5q5(ref mut hasher) => { >::free_cell(alloc, core::mem::replace(&mut hasher.num, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut hasher.buckets, >::AllocatedMemory::default())); } &mut UnionHasher::H5(ref mut hasher) => { >::free_cell(alloc, core::mem::replace(&mut hasher.num, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut hasher.buckets, >::AllocatedMemory::default())); } &mut UnionHasher::H6(ref mut hasher) => { >::free_cell(alloc, core::mem::replace(&mut hasher.num, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut hasher.buckets, >::AllocatedMemory::default())); } &mut UnionHasher::H9(ref mut hasher) => { >::free_cell(alloc,core::mem::replace(&mut hasher.num_, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut hasher.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H10(ref mut hasher) => { hasher.free(alloc); } &mut UnionHasher::Uninit => {} } *self = UnionHasher::::default(); } } impl + alloc::Allocator> Default for UnionHasher { fn default() -> Self { UnionHasher::Uninit } } /*UnionHasher::H2(BasicHasher { GetHasherCommon:Struct1{params:BrotliHasherParams{ type_:2, block_bits: 8, bucket_bits:16, hash_len: 4, num_last_distances_to_check:0}, is_prepared_:0, dict_num_lookups:0, dict_num_matches:0, }, buckets_:H2Sub{ buckets_:[0;65537], }, }) */ fn CreateBackwardReferences(dictionary: Option<&BrotliDictionary>, dictionary_hash: &[u16], num_bytes: usize, mut position: usize, ringbuffer: &[u8], ringbuffer_mask: usize, params: &BrotliEncoderParams, hasher: &mut AH, dist_cache: &mut [i32], last_insert_len: &mut usize, mut commands: &mut [Command], num_commands: &mut usize, num_literals: &mut usize) { let gap = 0usize; let max_backward_limit: usize = (1usize << (*params).lgwin).wrapping_sub(16usize); let mut new_commands_count: usize = 0; let mut insert_length: usize = *last_insert_len; let pos_end: usize = position.wrapping_add(num_bytes); let store_end: usize = if num_bytes >= hasher.StoreLookahead() { position.wrapping_add(num_bytes).wrapping_sub(hasher.StoreLookahead()).wrapping_add(1usize) } else { position }; let random_heuristics_window_size: usize = LiteralSpreeLengthForSparseSearch(params); let mut apply_random_heuristics: usize = position.wrapping_add(random_heuristics_window_size); let kMinScore: u64 = (30u64 * 8) .wrapping_mul(::core::mem::size_of::() as u64) .wrapping_add(100u64); hasher.PrepareDistanceCache(dist_cache); while position.wrapping_add(hasher.HashTypeLength()) < pos_end { let mut max_length: usize = pos_end.wrapping_sub(position); let mut max_distance: usize = brotli_min_size_t(position, max_backward_limit); let mut sr = HasherSearchResult { len: 0, len_x_code: 0, distance: 0, score: 0, }; sr.len = 0usize; sr.len_x_code = 0usize; sr.distance = 0usize; sr.score = kMinScore; if hasher.FindLongestMatch(dictionary, dictionary_hash, ringbuffer, ringbuffer_mask, dist_cache, position, max_length, max_distance, gap, params.dist.max_distance, &mut sr) { let mut delayed_backward_references_in_row: i32 = 0i32; max_length = max_length.wrapping_sub(1 as (usize)); 'break6: loop { 'continue7: loop { let cost_diff_lazy: u64 = 175; let is_match_found: bool; let mut sr2 = HasherSearchResult { len: 0, len_x_code: 0, distance: 0, score: 0, }; sr2.len = if (*params).quality < 5 { brotli_min_size_t(sr.len.wrapping_sub(1usize), max_length) } else { 0usize }; sr2.len_x_code = 0usize; sr2.distance = 0usize; sr2.score = kMinScore; max_distance = brotli_min_size_t(position.wrapping_add(1usize), max_backward_limit); is_match_found = hasher.FindLongestMatch(dictionary, dictionary_hash, ringbuffer, ringbuffer_mask, dist_cache, position.wrapping_add(1usize), max_length, max_distance, gap, params.dist.max_distance, &mut sr2); if is_match_found && (sr2.score >= sr.score.wrapping_add(cost_diff_lazy)) { position = position.wrapping_add(1 as (usize)); insert_length = insert_length.wrapping_add(1 as (usize)); sr = sr2; if { delayed_backward_references_in_row = delayed_backward_references_in_row + 1; delayed_backward_references_in_row } < 4i32 && (position.wrapping_add(hasher.HashTypeLength()) < pos_end) { { break 'continue7; } } } break 'break6; } max_length = max_length.wrapping_sub(1 as (usize)); } apply_random_heuristics = position.wrapping_add((2usize).wrapping_mul(sr.len)) .wrapping_add(random_heuristics_window_size); max_distance = brotli_min_size_t(position, max_backward_limit); { let distance_code: usize = ComputeDistanceCode(sr.distance, max_distance, dist_cache); if sr.distance <= max_distance && (distance_code > 0usize) { dist_cache[(3usize)] = dist_cache[(2usize)]; dist_cache[(2usize)] = dist_cache[(1usize)]; dist_cache[(1usize)] = dist_cache[(0usize)]; dist_cache[(0usize)] = sr.distance as (i32); hasher.PrepareDistanceCache(dist_cache); } new_commands_count += 1; InitCommand({ let (mut _old, new_commands) = core::mem::replace(&mut commands, &mut []).split_at_mut(1); commands = new_commands; &mut _old[0] }, ¶ms.dist, insert_length, sr.len, sr.len ^ sr.len_x_code, distance_code); } *num_literals = (*num_literals).wrapping_add(insert_length); insert_length = 0usize; hasher.StoreRange(ringbuffer, ringbuffer_mask, position.wrapping_add(2usize), brotli_min_size_t(position.wrapping_add(sr.len), store_end)); position = position.wrapping_add(sr.len); } else { insert_length = insert_length.wrapping_add(1 as (usize)); position = position.wrapping_add(1 as (usize)); if position > apply_random_heuristics { let kMargin: usize = brotli_max_size_t(hasher.StoreLookahead().wrapping_sub(1usize), 4usize); if position.wrapping_add(16usize) >= pos_end.wrapping_sub(kMargin) { insert_length = insert_length.wrapping_add(pos_end - position); position = pos_end; } else if position > apply_random_heuristics.wrapping_add((4usize) .wrapping_mul(random_heuristics_window_size)) { hasher.Store4Vec4(ringbuffer, ringbuffer_mask, position); insert_length = insert_length.wrapping_add(16usize); position = position.wrapping_add(16usize); } else { hasher.StoreEvenVec4(ringbuffer, ringbuffer_mask, position); insert_length = insert_length.wrapping_add(8usize); position = position.wrapping_add(8usize); } } } } insert_length = insert_length.wrapping_add(pos_end.wrapping_sub(position)); *last_insert_len = insert_length; *num_commands = (*num_commands).wrapping_add(new_commands_count); } pub fn BrotliCreateBackwardReferences + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator> (alloc : &mut Alloc, dictionary: &BrotliDictionary, num_bytes: usize, position: usize, ringbuffer: &[u8], ringbuffer_mask: usize, params: &BrotliEncoderParams, hasher_union: &mut UnionHasher, dist_cache: &mut [i32], last_insert_len: &mut usize, commands: &mut [Command], num_commands: &mut usize, num_literals: &mut usize) { match (hasher_union) { &mut UnionHasher::Uninit => panic!("working with uninitialized hash map"), &mut UnionHasher::H10(ref mut hasher) => { if params.quality >= 11 { super::backward_references_hq::BrotliCreateHqZopfliBackwardReferences( alloc, if params.use_dictionary {Some(dictionary)} else {None}, num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } else { super::backward_references_hq::BrotliCreateZopfliBackwardReferences( alloc, if params.use_dictionary {Some(dictionary)} else {None}, num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } } &mut UnionHasher::H2(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } &mut UnionHasher::H3(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } &mut UnionHasher::H4(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } &mut UnionHasher::H5(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } &mut UnionHasher::H5q7(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } &mut UnionHasher::H5q5(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } &mut UnionHasher::H6(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } &mut UnionHasher::H9(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } &mut UnionHasher::H54(ref mut hasher) => { CreateBackwardReferences(if params.use_dictionary {Some(dictionary)} else {None}, &kStaticDictionaryHash[..], num_bytes, position, ringbuffer, ringbuffer_mask, params, hasher, dist_cache, last_insert_len, commands, num_commands, num_literals) } } } brotli-3.4.0/src/enc/backward_references/test.rs000075500000000000000000000224161046102023000177730ustar 00000000000000#![cfg(feature="std")] #![cfg(test)] use enc::{Allocator, SliceWrapper}; use super::{AdvHasher, H5Sub, HQ7Sub, Struct1, BrotliHasherParams, H9Opts, CloneWithAlloc, AnyHasher, }; use ::alloc_stdlib::StandardAlloc; static RANDOM_THEN_UNICODE: &'static [u8] = include_bytes!("../../../testdata/random_then_unicode");//&[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55]; #[cfg(feature="std")] #[test] fn test_bulk_store_range() { let params_hasher = BrotliHasherParams { type_: 5, block_bits: 6, bucket_bits: 15, num_last_distances_to_check:10, hash_len: 4, literal_byte_score: 540, }; let block_size = 1u64 << params_hasher.block_bits; let bucket_size = 1u64 << params_hasher.bucket_bits; let mut alloc = StandardAlloc::default(); let mut buckets = >::alloc_cell(&mut alloc, (bucket_size * block_size) as usize); let mut num = >::alloc_cell(&mut alloc, bucket_size as usize); let mut hasher_a = AdvHasher::{ buckets: buckets, h9_opts: H9Opts::new(¶ms_hasher), num: num, GetHasherCommon: Struct1 { params: params_hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: H5Sub { hash_shift_: 32i32 - params_hasher.bucket_bits, bucket_size_: bucket_size as u32, block_bits_: params_hasher.block_bits as i32, block_mask_: block_size.wrapping_sub(1u64) as u32, } }; buckets = >::alloc_cell(&mut alloc, (bucket_size * block_size) as usize); num = >::alloc_cell(&mut alloc, bucket_size as usize); let mut hasher_b = hasher_a.clone_with_alloc(&mut alloc); assert!(hasher_a == hasher_b); let mut hasher_e = hasher_a.clone_with_alloc(&mut alloc); let mut hasher_c = AdvHasher::{ buckets: buckets, h9_opts: H9Opts::new(¶ms_hasher), num: num, GetHasherCommon: Struct1 { params: params_hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: HQ7Sub {}, }; let mut hasher_d = hasher_c.clone_with_alloc(&mut alloc); assert!(hasher_d == hasher_c); hasher_a.BulkStoreRange(RANDOM_THEN_UNICODE, !0usize, 15, RANDOM_THEN_UNICODE.len() - 8); hasher_c.BulkStoreRange(RANDOM_THEN_UNICODE, !0usize, 15, RANDOM_THEN_UNICODE.len() - 8); for i in 15..RANDOM_THEN_UNICODE.len() - 8 { hasher_b.Store(RANDOM_THEN_UNICODE, !0usize, i); } hasher_d.StoreRange(RANDOM_THEN_UNICODE, !0usize, 15, RANDOM_THEN_UNICODE.len() - 8); let ret_start = hasher_e.StoreRangeOptBatch(RANDOM_THEN_UNICODE, !0, 15, RANDOM_THEN_UNICODE.len() - 8); assert!(ret_start > 15); hasher_e.BulkStoreRange(RANDOM_THEN_UNICODE, !0, ret_start, RANDOM_THEN_UNICODE.len() - 8); assert_eq!(hasher_a.buckets.slice(), hasher_c.buckets.slice()); assert_eq!(hasher_b.buckets.slice(), hasher_d.buckets.slice()); assert_eq!(hasher_a.num.slice(), hasher_c.num.slice()); assert_eq!(hasher_b.num.slice(), hasher_d.num.slice()); assert_eq!(hasher_a.buckets.slice(), hasher_b.buckets.slice()); assert_eq!(hasher_c.buckets.slice(), hasher_d.buckets.slice()); assert_eq!(hasher_a.num.slice(), hasher_b.num.slice()); assert_eq!(hasher_c.num.slice(), hasher_d.num.slice()); assert!(hasher_a == hasher_b); assert!(hasher_d == hasher_c); assert!(hasher_a == hasher_e); } #[cfg(feature="std")] #[test] // does not use the fancy optimizations for q7 fn test_bulk_store_range_off_spec() { let params_hasher = BrotliHasherParams { type_: 5, block_bits: 6, bucket_bits: 15, num_last_distances_to_check:10, hash_len: 4, literal_byte_score: 540, }; let block_size = 1u64 << params_hasher.block_bits; let bucket_size = 1u64 << params_hasher.bucket_bits; let mut alloc = StandardAlloc::default(); let mut buckets = >::alloc_cell(&mut alloc, (bucket_size * block_size) as usize); let mut num = >::alloc_cell(&mut alloc, bucket_size as usize); let mut hasher_a = AdvHasher::{ buckets: buckets, h9_opts: H9Opts::new(¶ms_hasher), num: num, GetHasherCommon: Struct1 { params: params_hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: H5Sub { hash_shift_: 32i32 - params_hasher.bucket_bits, bucket_size_: bucket_size as u32, block_bits_: params_hasher.block_bits as i32, block_mask_: block_size.wrapping_sub(1u64) as u32, } }; buckets = >::alloc_cell(&mut alloc, (bucket_size * block_size) as usize); num = >::alloc_cell(&mut alloc, bucket_size as usize); let mut hasher_b = hasher_a.clone_with_alloc(&mut alloc); assert!(hasher_a == hasher_b); let mut hasher_c = AdvHasher::{ buckets: buckets, h9_opts: H9Opts::new(¶ms_hasher), num: num, GetHasherCommon: Struct1 { params: params_hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: HQ7Sub {}, }; let mut hasher_d = hasher_c.clone_with_alloc(&mut alloc); assert!(hasher_d == hasher_c); hasher_a.BulkStoreRange(RANDOM_THEN_UNICODE, 0xfff, 15, RANDOM_THEN_UNICODE.len() - 8); hasher_c.BulkStoreRange(RANDOM_THEN_UNICODE, 0xfff, 15, RANDOM_THEN_UNICODE.len() - 8); hasher_c.BulkStoreRange(RANDOM_THEN_UNICODE, 0xfff, RANDOM_THEN_UNICODE.len(), RANDOM_THEN_UNICODE.len() - 8); // noop for i in 15..RANDOM_THEN_UNICODE.len() - 8 { hasher_b.Store(RANDOM_THEN_UNICODE, 0xfff, i); hasher_d.Store(RANDOM_THEN_UNICODE, 0xfff, i); } assert_eq!(hasher_a.buckets.slice(), hasher_c.buckets.slice()); assert_eq!(hasher_b.buckets.slice(), hasher_d.buckets.slice()); assert_eq!(hasher_a.num.slice(), hasher_c.num.slice()); assert_eq!(hasher_b.num.slice(), hasher_d.num.slice()); assert!(hasher_a == hasher_b); assert!(hasher_d == hasher_c); } #[cfg(feature="std")] #[test] fn test_bulk_store_range_pow2() { let params_hasher = BrotliHasherParams { type_: 5, block_bits: 6, bucket_bits: 15, num_last_distances_to_check:10, hash_len: 4, literal_byte_score: 540, }; let block_size = 1u64 << params_hasher.block_bits; let bucket_size = 1u64 << params_hasher.bucket_bits; let mut alloc = StandardAlloc::default(); let mut buckets = >::alloc_cell(&mut alloc, (bucket_size * block_size) as usize); let mut num = >::alloc_cell(&mut alloc, bucket_size as usize); let mut hasher_a = AdvHasher::{ buckets: buckets, h9_opts: H9Opts::new(¶ms_hasher), num: num, GetHasherCommon: Struct1 { params: params_hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: H5Sub { hash_shift_: 32i32 - params_hasher.bucket_bits, bucket_size_: bucket_size as u32, block_bits_: params_hasher.block_bits as i32, block_mask_: block_size.wrapping_sub(1u64) as u32, } }; buckets = >::alloc_cell(&mut alloc, (bucket_size * block_size) as usize); num = >::alloc_cell(&mut alloc, bucket_size as usize); let mut hasher_b = hasher_a.clone_with_alloc(&mut alloc); assert!(hasher_a == hasher_b); let mut hasher_e = hasher_a.clone_with_alloc(&mut alloc); let mut hasher_c = AdvHasher::{ buckets: buckets, h9_opts: H9Opts::new(¶ms_hasher), num: num, GetHasherCommon: Struct1 { params: params_hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: HQ7Sub {}, }; let mut hasher_d = hasher_c.clone_with_alloc(&mut alloc); assert!(hasher_d == hasher_c); hasher_a.BulkStoreRange(RANDOM_THEN_UNICODE, !0usize, RANDOM_THEN_UNICODE.len() - 64-3, RANDOM_THEN_UNICODE.len()-3); hasher_c.BulkStoreRange(RANDOM_THEN_UNICODE, !0usize, RANDOM_THEN_UNICODE.len() - 64-3, RANDOM_THEN_UNICODE.len()-3); for i in RANDOM_THEN_UNICODE.len() - 64 - 3 ..RANDOM_THEN_UNICODE.len()-3 { hasher_b.Store(RANDOM_THEN_UNICODE, !0usize, i); } hasher_d.StoreRange(RANDOM_THEN_UNICODE, !0usize, RANDOM_THEN_UNICODE.len() - 64-3, RANDOM_THEN_UNICODE.len()-3); let ret_start = hasher_e.StoreRangeOptBatch(RANDOM_THEN_UNICODE, !0, RANDOM_THEN_UNICODE.len() - 64-3, RANDOM_THEN_UNICODE.len()-3); assert!(ret_start > 15); hasher_e.BulkStoreRange(RANDOM_THEN_UNICODE, !0, ret_start, RANDOM_THEN_UNICODE.len()-3); assert_eq!(hasher_a.buckets.slice(), hasher_c.buckets.slice()); assert_eq!(hasher_b.buckets.slice(), hasher_d.buckets.slice()); assert_eq!(hasher_a.num.slice(), hasher_c.num.slice()); assert_eq!(hasher_b.num.slice(), hasher_d.num.slice()); assert_eq!(hasher_a.buckets.slice(), hasher_b.buckets.slice()); assert_eq!(hasher_c.buckets.slice(), hasher_d.buckets.slice()); assert_eq!(hasher_a.num.slice(), hasher_b.num.slice()); assert_eq!(hasher_c.num.slice(), hasher_d.num.slice()); assert!(hasher_a == hasher_b); assert!(hasher_d == hasher_c); assert!(hasher_a == hasher_e); } brotli-3.4.0/src/enc/bit_cost.rs000075500000000000000000000347611046102023000146510ustar 00000000000000#![allow(dead_code)] use core; use super::histogram::CostAccessors; use super::super::alloc::SliceWrapper; use super::util::{brotli_max_uint32_t, FastLog2, floatX, FastLog2u16}; #[cfg(feature="simd")] use packed_simd_2::IntoBits; use super::vectorization::{v256,v256i, Mem256i, sum8, cast_f32_to_i32, cast_i32_to_f32, log2i}; static kCopyBase: [u32; 24] = [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 18, 22, 30, 38, 54, 70, 102, 134, 198, 326, 582, 1094, 2118]; static kCopyExtra: [u32; 24] = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24]; static kBrotliMinWindowBits: i32 = 10i32; static kBrotliMaxWindowBits: i32 = 24i32; pub fn ShannonEntropy(mut population: &[u32], size: usize, total: &mut usize) -> super::util::floatX { let mut sum: usize = 0usize; let mut retval: super::util::floatX = 0i32 as super::util::floatX; let mut p: usize; if size & 1usize != 0 && population.len() != 0 { p = population[0] as usize; population = population.split_at(1).1; sum = sum.wrapping_add(p); retval = retval - p as super::util::floatX * FastLog2u16(p as u16); } for pop_iter in population.split_at((size >> 1) << 1).0 { p = *pop_iter as usize; sum = sum.wrapping_add(p); retval = retval - p as super::util::floatX * FastLog2u16(p as u16); } if sum != 0 { retval = retval + sum as super::util::floatX * FastLog2(sum as u64); // not sure it's 16 bit } *total = sum; retval } #[inline(always)] pub fn BitsEntropy(population: &[u32], size: usize) -> super::util::floatX { let mut sum: usize = 0; let mut retval: super::util::floatX = ShannonEntropy(population, size, &mut sum); if retval < sum as super::util::floatX { retval = sum as super::util::floatX; } retval } const BROTLI_REPEAT_ZERO_CODE_LENGTH: usize = 17; const BROTLI_CODE_LENGTH_CODES: usize = BROTLI_REPEAT_ZERO_CODE_LENGTH + 1; /* use std::io::{self, Error, ErrorKind, Read, Write}; macro_rules! println_stderr( ($($val:tt)*) => { { writeln!(&mut ::std::io::stderr(), $($val)*).unwrap(); } } ); */ #[cfg(feature="vector_scratch_space")] const vectorize_population_cost : bool = true; #[cfg(not(feature="vector_scratch_space"))] const vectorize_population_cost : bool = false; fn CostComputation >(depth_histo: &mut [u32;BROTLI_CODE_LENGTH_CODES], nnz_data: &T, nnz: usize, total_count: super::util::floatX, log2total: super::util::floatX) -> super::util::floatX { let mut bits : super::util::floatX = 0.0 as super::util::floatX; if true { let mut max_depth : usize = 1; for i in 0..nnz { // Compute -log2(P(symbol)) = -log2(count(symbol)/total_count) = // = log2(total_count) - log2(count(symbol)) let element = nnz_data.slice()[i>>3].extract(i&7); let log2p = log2total - FastLog2u16(element as u16); // Approximate the bit depth by round(-log2(P(symbol))) let depth = core::cmp::min((log2p + 0.5) as u8, 15u8); bits += element as super::util::floatX * log2p; if (depth as usize > max_depth) { max_depth = depth as usize; } depth_histo[depth as usize] += 1; } // Add the estimated encoding cost of the code length code histogram. bits += (18 + 2 * max_depth) as super::util::floatX; // Add the entropy of the code length code histogram. bits += BitsEntropy(depth_histo, BROTLI_CODE_LENGTH_CODES); //println_stderr!("{:?} {:?}", &depth_histo[..], bits); return bits; } let rem = nnz & 7; let nnz_srl_3 = nnz >> 3; if true { let mut vec_max_depth :[i32;8] = [1;8]; let mut depth_histo_vec = [[0i32;BROTLI_CODE_LENGTH_CODES]; 8]; for nnz_data_vec in nnz_data.slice().split_at(nnz_srl_3).0.iter() { for i in 0..8 { // Compute -log2(P(symbol)) = -log2(count(symbol)/total_count) = // = log2(total_count) - log2(count(symbol)) let ele = nnz_data_vec.extract(i); let log2p = log2total - FastLog2u16(ele as u16); // Approximate the bit depth by round(-log2(P(symbol))) let depth = core::cmp::min((log2p + 0.5) as i32, 15) as i32; bits += ele as super::util::floatX * log2p; vec_max_depth[i] = core::cmp::max(vec_max_depth[i], depth); depth_histo_vec[i][depth as usize] += 1; } } let mut max_depth = vec_max_depth[7]; for i in 0..8 { for j in 0..BROTLI_CODE_LENGTH_CODES { depth_histo[j] += depth_histo_vec[i][j] as u32; } max_depth = core::cmp::max(vec_max_depth[i], max_depth); } if rem != 0 { let last_vec = nnz_data.slice()[nnz_srl_3]; for i in 0..rem { // remainder won't have last element for sure let element = last_vec.extract(i); let log2p = log2total - FastLog2u16(element as u16); // Approximate the bit depth by round(-log2(P(symbol))) let depth = core::cmp::min((log2p + 0.5) as i32, 15); bits += element as super::util::floatX * log2p; max_depth = core::cmp::max(depth, max_depth); depth_histo[depth as usize] += 1; } } // Add the estimated encoding cost of the code length code histogram. bits += (18 + 2 * max_depth) as super::util::floatX; // Add the entropy of the code length code histogram. bits += BitsEntropy(depth_histo, BROTLI_CODE_LENGTH_CODES); //println_stderr!("{:?} {:?}", &depth_histo[..], bits); return bits; } let pow2l = v256::new( 1.0/*0.7071067811865476*/ as floatX, 0.3535533905932738 as floatX, 0.1767766952966369 as floatX, 0.0883883476483184 as floatX, 0.0441941738241592 as floatX, 0.0220970869120796 as floatX, 0.0110485434560398 as floatX, 0.0055242717280199 as floatX); let pow2h = v256::new(//FIXME: setr 0.0027621358640100 as floatX, 0.0013810679320050 as floatX, 0.0006905339660025 as floatX, 0.0003452669830012 as floatX, 0.0001726334915006 as floatX, 0.0000863167457503 as floatX, 0.0000431583728752 as floatX, /*0.0000215791864376f*/0.0 as floatX); let ymm_tc = v256::splat(total_count as floatX); let search_depthl = cast_f32_to_i32(pow2l * ymm_tc); let search_depthh = cast_f32_to_i32(pow2h * ymm_tc); let mut suml = v256i::splat(0); let mut sumh = v256i::splat(0); for nnz_data_vec in nnz_data.slice().split_at(nnz_srl_3).0.iter() { for sub_data_item_index in 0..8 { let count = v256i::splat(nnz_data_vec.extract(sub_data_item_index)); let cmpl:v256i = count.gt(search_depthl).into_bits(); let cmph:v256i = count.gt(search_depthh).into_bits(); suml = suml + (cmpl & v256i::splat(1)); sumh = sumh + (cmph & v256i::splat(1)); } } if rem != 0 { let last_element = nnz_data.slice()[nnz>>3]; for sub_index in 0..rem { let count = v256i::splat(last_element.extract(sub_index & 7)); let cmpl:v256i = count.gt(search_depthl).into_bits(); let cmph:v256i = count.gt(search_depthh).into_bits(); suml = suml + (cmpl & v256i::splat(1)); sumh = sumh + (cmph & v256i::splat(1)); } } let mut max_depth : usize = 1; // Deal with depth_histo and max_depth { let cumulative_sum:[Mem256i;2] = [suml, sumh]; let mut prev = cumulative_sum[0].extract(0); for j in 1..16 { let cur = cumulative_sum[(j&8) >> 3].extract(j & 7); let delta = cur - prev; prev = cur; let cur = &mut depth_histo[j]; *cur = (*cur as i32 + delta) as u32; // depth_histo[j] += delta if delta != 0 { max_depth = j; } } } let ymm_log2total = v256::splat(log2total); let mut bits_cumulative = v256::splat(0.0 as floatX); for nnz_data_item in nnz_data.slice().split_at(nnz_srl_3).0.iter() { let counts = cast_i32_to_f32(*nnz_data_item); let log_counts = log2i(*nnz_data_item); let log2p = ymm_log2total - log_counts; let tmp = counts * log2p; bits_cumulative = bits_cumulative + tmp; } bits += sum8(bits_cumulative); if rem != 0 { let last_vec = nnz_data.slice()[nnz_srl_3]; for i in 0..rem { let last_item = last_vec.extract(i); let log2p = log2total - FastLog2u16(last_item as u16); bits += last_item as super::util::floatX * log2p; } } // Add the estimated encoding cost of the code length code histogram. bits += (18 + 2 * max_depth) as super::util::floatX; // Add the entropy of the code length code histogram. bits += BitsEntropy(depth_histo, BROTLI_CODE_LENGTH_CODES); //println_stderr!("{:?} {:?}", depth_histo, bits); return bits; } use alloc::SliceWrapperMut; pub fn BrotliPopulationCost+CostAccessors>( histogram : &HistogramType, nnz_data : &mut HistogramType::i32vec ) -> super::util::floatX{ static kOneSymbolHistogramCost: super::util::floatX = 12i32 as super::util::floatX; static kTwoSymbolHistogramCost: super::util::floatX = 20i32 as super::util::floatX; static kThreeSymbolHistogramCost: super::util::floatX = 28i32 as super::util::floatX; static kFourSymbolHistogramCost: super::util::floatX = 37i32 as super::util::floatX; let data_size: usize = (*histogram).slice().len(); let mut count: i32 = 0i32; let mut s: [usize; 5] = [0; 5]; let mut bits: super::util::floatX = 0.0 as super::util::floatX; let mut i: usize; if (*histogram).total_count() == 0usize { return kOneSymbolHistogramCost; } i = 0usize; 'break1: while i < data_size { { if (*histogram).slice()[i] > 0u32 { s[count as (usize)] = i; count = count + 1; if count > 4i32 { { break 'break1; } } } } i = i.wrapping_add(1 as (usize)); } if count == 1i32 { return kOneSymbolHistogramCost; } if count == 2i32 { return kTwoSymbolHistogramCost + (*histogram).total_count() as super::util::floatX; } if count == 3i32 { let histo0: u32 = (*histogram).slice()[s[0usize]]; let histo1: u32 = (*histogram).slice()[s[1usize]]; let histo2: u32 = (*histogram).slice()[s[2usize]]; let histomax: u32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2)); return kThreeSymbolHistogramCost + (2u32).wrapping_mul(histo0.wrapping_add(histo1).wrapping_add(histo2)) as super::util::floatX - histomax as super::util::floatX; } if count == 4i32 { let mut histo: [u32; 4] = [0; 4]; let h23: u32; let histomax: u32; i = 0usize; while i < 4usize { { histo[i] = (*histogram).slice()[s[i]]; } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < 4usize { { let mut j: usize; j = i.wrapping_add(1usize); while j < 4usize { { if histo[j] > histo[i] { let mut __brotli_swap_tmp: u32 = histo[j]; histo[j] = histo[i]; histo[i] = __brotli_swap_tmp; } } j = j.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } h23 = histo[2usize].wrapping_add(histo[3usize]); histomax = brotli_max_uint32_t(h23, histo[0usize]); return kFourSymbolHistogramCost + (3u32).wrapping_mul(h23) as super::util::floatX + (2u32).wrapping_mul(histo[0usize].wrapping_add(histo[1usize])) as super::util::floatX - histomax as super::util::floatX; } if vectorize_population_cost { // vectorization failed: it's faster to do things inline than split into two loops let mut nnz: usize = 0; let mut depth_histo: [u32; 18] = [0u32; 18]; let total_count = (*histogram).total_count() as super::util::floatX; let log2total = FastLog2((*histogram).total_count() as u64); i = 0usize; while i < data_size { if (*histogram).slice()[i] > 0u32 { let nnz_val = &mut nnz_data.slice_mut()[nnz>>3]; *nnz_val = nnz_val.replace(nnz&7, histogram.slice()[i] as i32); i += 1; nnz += 1; } else { let mut reps: u32 = 1; for hd in (*histogram).slice()[i+1..(data_size as usize)].iter() { if *hd != 0 { break } reps += 1 } i += reps as usize; if i == data_size { { break; } } if reps < 3 { depth_histo[0] += reps } else { reps -= 2; let mut depth_histo_adds : u32 = 0; while reps > 0u32 { depth_histo_adds += 1; bits = bits + 3i32 as super::util::floatX; reps = reps >> 3i32; } depth_histo[BROTLI_REPEAT_ZERO_CODE_LENGTH] += depth_histo_adds; } } } bits += CostComputation(&mut depth_histo, nnz_data, nnz, total_count, log2total); } else { let mut max_depth: usize = 1usize; let mut depth_histo: [u32; 18] = [0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32]; let log2total: super::util::floatX = FastLog2((*histogram).total_count() as u64); // 64 bit here let mut reps : u32 = 0; for histo in histogram.slice()[..data_size].iter() { if *histo != 0 { if reps != 0 { if reps < 3 { depth_histo[0] += reps; } else { reps -= 2; while reps > 0u32 { depth_histo[17] += 1; bits = bits + 3 as super::util::floatX; reps = reps >> 3; } } reps = 0; } let log2p: super::util::floatX = log2total - FastLog2u16(*histo as (u16)); let mut depth: usize = (log2p + 0.5 as super::util::floatX) as (usize); bits = bits + *histo as super::util::floatX * log2p; depth = core::cmp::min(depth, 15); max_depth = core::cmp::max(depth, max_depth); depth_histo[depth] += 1; } else { reps += 1; } } bits = bits + (18usize).wrapping_add((2usize).wrapping_mul(max_depth)) as super::util::floatX; bits = bits + BitsEntropy(&depth_histo[..], 18usize); } bits } /* fn HistogramDataSizeCommand() -> usize { 704i32 as (usize) }*/ /* fn HistogramDataSizeDistance() -> usize { 520i32 as (usize) } */ brotli-3.4.0/src/enc/block_split.rs000075500000000000000000000023141046102023000153350ustar 00000000000000#![allow(dead_code)] use super::super::alloc; use super::super::alloc::Allocator; use super::super::alloc::SliceWrapper; use core; pub struct BlockSplit + alloc::Allocator> { pub num_types: usize, pub num_blocks: usize, pub types: >::AllocatedMemory, pub lengths: >::AllocatedMemory, } impl + alloc::Allocator> BlockSplit { pub fn new() -> BlockSplit { BlockSplit { num_types: 0, num_blocks: 0, types: >::AllocatedMemory::default(), lengths: >::AllocatedMemory::default(), } } pub fn destroy(&mut self, m: &mut Alloc) { >::free_cell(m, core::mem::replace(&mut self.types, >::AllocatedMemory::default())); >::free_cell(m, core::mem::replace(&mut self.lengths, >::AllocatedMemory::default())); self.num_blocks = 0; self.num_types = 0; } pub fn types_alloc_size(&self) -> usize { self.types.slice().len() } pub fn lengths_alloc_size(&self) -> usize { self.lengths.slice().len() } } brotli-3.4.0/src/enc/block_splitter.rs000075500000000000000000001205761046102023000160630ustar 00000000000000#![allow(dead_code)] use super::vectorization::{v256,v256i, Mem256f, sum8i}; use super::backward_references::BrotliEncoderParams; use super::bit_cost::BrotliPopulationCost; use super::block_split::BlockSplit; use super::cluster::{BrotliHistogramBitCostDistance, BrotliHistogramCombine, HistogramPair}; use super::command::Command; use super::histogram::{HistogramAddVector, CostAccessors, ClearHistograms, HistogramClear, HistogramAddHistogram, HistogramAddItem, HistogramLiteral, HistogramCommand, HistogramDistance}; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use super::util::{FastLog2, brotli_max_uint8_t, brotli_min_size_t}; #[cfg(feature="simd")] use packed_simd_2::IntoBits; use core; static kMaxLiteralHistograms: usize = 100usize; static kMaxCommandHistograms: usize = 50usize; static kLiteralBlockSwitchCost: super::util::floatX = 28.1 as super::util::floatX; static kCommandBlockSwitchCost: super::util::floatX = 13.5 as super::util::floatX; static kDistanceBlockSwitchCost: super::util::floatX = 14.6 as super::util::floatX; static kLiteralStrideLength: usize = 70usize; static kCommandStrideLength: usize = 40usize; static kSymbolsPerLiteralHistogram: usize = 544usize; static kSymbolsPerCommandHistogram: usize = 530usize; static kSymbolsPerDistanceHistogram: usize = 544usize; static kMinLengthForBlockSplitting: usize = 128usize; static kIterMulForRefining: usize = 2usize; static kMinItersForRefining: usize = 100usize; #[inline(always)] fn update_cost_and_signal(num_histograms32: u32, ix: usize, min_cost: super::util::floatX, block_switch_cost: super::util::floatX, cost: &mut [Mem256f], switch_signal: &mut [u8]) { if (false) { // scalar mode for k in 0.. ((num_histograms32 as usize + 7)>> 3 << 3) { cost[k>>3] = cost[k>>3].replace(k&7, cost[k>>3].extract(k&7) - min_cost); if (cost[k>>3].extract(k&7) >= block_switch_cost) { let mask = ((1 as u8) << (k & 7)) as u8; cost[k>>3] = cost[k>>3].replace(k&7, block_switch_cost); switch_signal[ix + (k >> 3)] |= mask; } } return; } if (false) { // scalar mode for k in 0.. ((num_histograms32 as usize + 7)>> 3 << 3) { cost[k>>3] = cost[k>>3].replace(k&7, cost[k>>3].extract(k&7) - min_cost); let cmpge = if (cost[k>>3].extract(k&7) >= block_switch_cost) { 0xff }else{0}; let mask = ((1 as u8) << (k & 7)) as u8; let bits = cmpge & mask; if block_switch_cost < cost[k>>3].extract(k&7) { cost[k>>3] = cost[k>>3].replace(k&7, block_switch_cost); } switch_signal[ix + (k >> 3)] |= bits; //if (((k + 1)>> 3) != (k >>3)) { // println_stderr!("{:} ss {:} c {:?}", k, switch_signal[ix + (k >> 3)],cost[k>>3]); //} } return; } let ymm_min_cost = v256::splat(min_cost); let ymm_block_switch_cost = v256::splat(block_switch_cost); let ymm_and_mask = v256i::new(1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7); for (index, cost_it) in cost[..((num_histograms32 as usize + 7)>> 3)].iter_mut().enumerate() { let mut ymm_cost = *cost_it; let costk_minus_min_cost = ymm_cost - ymm_min_cost; let ymm_cmpge:v256i = costk_minus_min_cost.ge(ymm_block_switch_cost).into_bits(); let ymm_bits = ymm_cmpge & ymm_and_mask; let result = sum8i(ymm_bits); //super::vectorization::sum8(ymm_bits) as u8; switch_signal[ix + index] |= result as u8; ymm_cost = costk_minus_min_cost.min(ymm_block_switch_cost); *cost_it = Mem256f::from(ymm_cost); //println_stderr!("{:} ss {:} c {:?}", (index << 3) + 7, switch_signal[ix + index],*cost_it); } } fn CountLiterals(cmds: &[Command], num_commands: usize) -> usize { let mut total_length: usize = 0usize; let mut i: usize; i = 0usize; while i < num_commands { { total_length = total_length.wrapping_add((cmds[(i as (usize))]).insert_len_ as (usize)); } i = i.wrapping_add(1 as (usize)); } total_length } fn CommandCopyLen(xself: &Command) -> u32 { (*xself).copy_len_ & 0xffffffu32 } fn CopyLiteralsToByteArray(cmds: &[Command], num_commands: usize, data: &[u8], offset: usize, mask: usize, literals: &mut [u8]) { let mut pos: usize = 0usize; let mut from_pos: usize = offset & mask; let mut i: usize; i = 0usize; while i < num_commands { { let mut insert_len: usize = (cmds[(i as (usize))]).insert_len_ as (usize); if from_pos.wrapping_add(insert_len) > mask { let head_size: usize = mask.wrapping_add(1usize).wrapping_sub(from_pos); literals[(pos as (usize))..((pos + head_size) as usize)].clone_from_slice(&data[(from_pos as (usize)).. ((from_pos + head_size) as usize)]); from_pos = 0usize; pos = pos.wrapping_add(head_size); insert_len = insert_len.wrapping_sub(head_size); } if insert_len > 0usize { literals[(pos as (usize))..(pos as usize + insert_len)].clone_from_slice(&data [(from_pos as (usize)).. (from_pos as usize + insert_len)]); pos = pos.wrapping_add(insert_len); } from_pos = from_pos.wrapping_add(insert_len).wrapping_add(CommandCopyLen(&cmds[(i as (usize))]) as (usize)) & mask; } i = i.wrapping_add(1 as (usize)); } } fn MyRand(seed: &mut u32) -> u32 { *seed = (*seed).wrapping_mul(16807u32); if *seed == 0u32 { *seed = 1u32; } *seed } fn InitialEntropyCodes + SliceWrapperMut + CostAccessors, IntegerType: Sized + Clone> (data: &[IntegerType], length: usize, stride: usize, num_histograms: usize, histograms: &mut [HistogramType]) where u64: core::convert::From { let mut seed: u32 = 7u32; let block_length: usize = length.wrapping_div(num_histograms); let mut i: usize; ClearHistograms(histograms, num_histograms); i = 0usize; while i < num_histograms { { let mut pos: usize = length.wrapping_mul(i).wrapping_div(num_histograms); if i != 0usize { pos = pos.wrapping_add((MyRand(&mut seed) as (usize)).wrapping_rem(block_length)); } if pos.wrapping_add(stride) >= length { pos = length.wrapping_sub(stride).wrapping_sub(1usize); } HistogramAddVector(&mut histograms[(i as (usize))], &data[(pos as (usize))..], stride); } i = i.wrapping_add(1 as (usize)); } } fn RandomSample + SliceWrapperMut + CostAccessors, IntegerType: Sized + Clone> (seed: &mut u32, data: &[IntegerType], length: usize, mut stride: usize, sample: &mut HistogramType) where u64: core::convert::From { let pos: usize; if stride >= length { pos = 0usize; stride = length; } else { pos = (MyRand(seed) as (usize)).wrapping_rem(length.wrapping_sub(stride).wrapping_add(1usize)); } HistogramAddVector(sample, &data[(pos as (usize))..], stride); } fn RefineEntropyCodes+SliceWrapperMut+CostAccessors+core::default::Default, IntegerType:Sized+Clone>(data: &[IntegerType], length: usize, stride: usize, num_histograms: usize, histograms: &mut [HistogramType]) where u64: core::convert::From{ let mut iters: usize = kIterMulForRefining.wrapping_mul(length) .wrapping_div(stride) .wrapping_add(kMinItersForRefining); let mut seed: u32 = 7u32; let mut iter: usize; iters = iters.wrapping_add(num_histograms) .wrapping_sub(1usize) .wrapping_div(num_histograms) .wrapping_mul(num_histograms); iter = 0usize; while iter < iters { { let mut sample = HistogramType::default(); HistogramClear(&mut sample); RandomSample(&mut seed, data, length, stride, &mut sample); HistogramAddHistogram(&mut histograms[(iter.wrapping_rem(num_histograms) as (usize))], &mut sample); } iter = iter.wrapping_add(1 as (usize)); } } fn BitCost(count: usize) -> super::util::floatX { if count == 0usize { -2.0 as super::util::floatX } else { FastLog2(count as u64) } } fn FindBlocks + SliceWrapperMut + CostAccessors, IntegerType: Sized + Clone> (data: &[IntegerType], length: usize, block_switch_bitcost: super::util::floatX, num_histograms: usize, histograms: &[HistogramType], insert_cost: &mut [super::util::floatX], cost: &mut [Mem256f], switch_signal: &mut [u8], block_id: &mut [u8]) -> usize where u64: core::convert::From { if num_histograms == 0 { return 0; } let data_size: usize = histograms[0usize].slice().len(); let bitmaplen: usize = num_histograms.wrapping_add(7usize) >> 3i32; let mut num_blocks: usize = 1usize; let mut i: usize; let mut j: usize; 0i32; if num_histograms <= 1usize { i = 0usize; while i < length { { block_id[(i as (usize))] = 0i32 as (u8); } i = i.wrapping_add(1 as (usize)); } return 1usize; } for item in insert_cost[..(data_size * num_histograms)].iter_mut() { *item = 0.0 as super::util::floatX; } i = 0usize; while i < num_histograms { { insert_cost[(i as (usize))] = FastLog2((histograms[(i as (usize))]).total_count() as (u32) as (u64)); } i = i.wrapping_add(1 as (usize)); } i = data_size; while i != 0usize { i = i.wrapping_sub(1 as (usize)); j = 0usize; while j < num_histograms { { insert_cost[(i.wrapping_mul(num_histograms).wrapping_add(j) as (usize))] = insert_cost[(j as (usize))] - BitCost((histograms[(j as (usize))]).slice()[i] as (usize)); } j = j.wrapping_add(1 as (usize)); } } for item in cost.iter_mut() { *item = Mem256f::default(); } for item in switch_signal[..(length * bitmaplen)].iter_mut() { *item = 0; } for (byte_ix, data_byte_ix) in data[..length].iter().enumerate() { { let block_id_ptr = &mut block_id[byte_ix]; let ix: usize = byte_ix.wrapping_mul(bitmaplen); let insert_cost_ix: usize = u64::from(data_byte_ix.clone()) .wrapping_mul(num_histograms as u64) as usize; let mut min_cost: super::util::floatX = 1e38 as super::util::floatX; let mut block_switch_cost: super::util::floatX = block_switch_bitcost; if false { // nonvectorized version: same code below for (k, insert_cost_iter) in insert_cost[insert_cost_ix..(insert_cost_ix + num_histograms)].iter().enumerate() { let cost_iter = &mut cost[(k >> 3)].extract(k&7); *cost_iter += *insert_cost_iter; if *cost_iter < min_cost { min_cost = *cost_iter; *block_id_ptr = k as u8; } } } else { // main (vectorized) loop let insert_cost_slice = insert_cost.split_at(insert_cost_ix).1; for (v_index, cost_iter) in cost.split_at_mut(num_histograms >> 3).0.iter_mut().enumerate() { let base_index = v_index << 3; let mut local_insert_cost = [0.0 as super::util::floatX; 8]; local_insert_cost.clone_from_slice(insert_cost_slice.split_at(base_index).1.split_at(8).0); for sub_index in 0usize .. 8usize { *cost_iter = (*cost_iter).replace(sub_index, (*cost_iter).extract(sub_index) + local_insert_cost[sub_index]); let final_cost = (*cost_iter).extract(sub_index); if final_cost < min_cost { min_cost = final_cost; *block_id_ptr = (base_index + sub_index) as u8; } } } let vectorized_offset = ((num_histograms>>3)<<3); let mut k = vectorized_offset; //remainder loop for for insert_cost_iter in insert_cost.split_at(insert_cost_ix + vectorized_offset).1.split_at(num_histograms&7).0.iter() { let cost_iter = &mut cost[(k >> 3)]; *cost_iter = cost_iter.replace(k&7, cost_iter.extract(k&7) + *insert_cost_iter); if cost_iter.extract(k&7) < min_cost { min_cost = cost_iter.extract(k&7); *block_id_ptr = k as u8; } k += 1; } } if byte_ix < 2000usize { block_switch_cost = block_switch_cost * (0.77 as super::util::floatX + 0.07 as super::util::floatX * byte_ix as (super::util::floatX) / 2000i32 as (super::util::floatX)); } update_cost_and_signal(num_histograms as u32, ix, min_cost, block_switch_cost, cost, switch_signal); } } { let mut byte_ix: usize = length.wrapping_sub(1usize); let mut ix: usize = byte_ix.wrapping_mul(bitmaplen); let mut cur_id: u8 = block_id[(byte_ix as (usize))]; while byte_ix > 0usize { let mask: u8 = (1u32 << (cur_id as (i32) & 7i32)) as (u8); 0i32; byte_ix -= 1; ix = ix.wrapping_sub(bitmaplen); if switch_signal[(ix.wrapping_add((cur_id as (i32) >> 3i32) as (usize)) as (usize))] as (i32) & mask as (i32) != 0 { if cur_id as (i32) != block_id[(byte_ix as (usize))] as (i32) { cur_id = block_id[(byte_ix as (usize))]; num_blocks = num_blocks.wrapping_add(1 as (usize)); } } block_id[(byte_ix as (usize))] = cur_id; } } num_blocks } fn RemapBlockIds(block_ids: &mut [u8], length: usize, new_id: &mut [u16], num_histograms: usize) -> usize { static kInvalidId: u16 = 256i32 as (u16); let mut next_id: u16 = 0i32 as (u16); let mut i: usize; i = 0usize; while i < num_histograms { { new_id[(i as (usize))] = kInvalidId; } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < length { { 0i32; if new_id[(block_ids[(i as (usize))] as (usize))] as (i32) == kInvalidId as (i32) { new_id[(block_ids[(i as (usize))] as (usize))] = { let _old = next_id; next_id = (next_id as (i32) + 1) as (u16); _old }; } } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < length { { block_ids[(i as (usize))] = new_id[(block_ids[(i as (usize))] as (usize))] as (u8); 0i32; } i = i.wrapping_add(1 as (usize)); } 0i32; next_id as (usize) } fn BuildBlockHistograms + SliceWrapperMut + CostAccessors, IntegerType: Sized + Clone> (data: &[IntegerType], length: usize, block_ids: &[u8], num_histograms: usize, histograms: &mut [HistogramType]) where u64: core::convert::From { let mut i: usize; ClearHistograms(histograms, num_histograms); i = 0usize; while i < length { { HistogramAddItem(&mut histograms[(block_ids[(i as (usize))] as (usize))], u64::from(data[(i as (usize))].clone()) as usize); } i = i.wrapping_add(1 as (usize)); } } fn ClusterBlocks+SliceWrapperMut+CostAccessors+core::default::Default+Clone, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator, IntegerType:Sized+Clone>( alloc:&mut Alloc, data: &[IntegerType], length: usize, num_blocks: usize, scratch_space: &mut HistogramType::i32vec, block_ids: &mut [u8], split: &mut BlockSplit, ) where u64: core::convert::From { let mut histogram_symbols = >::alloc_cell(alloc, num_blocks); let mut block_lengths = >::alloc_cell(alloc, num_blocks); let expected_num_clusters: usize = (16usize) .wrapping_mul(num_blocks.wrapping_add(64usize).wrapping_sub(1usize)) .wrapping_div(64usize); let mut all_histograms_size: usize = 0usize; let mut all_histograms_capacity: usize = expected_num_clusters; let mut all_histograms = >::alloc_cell(alloc, all_histograms_capacity); let mut cluster_size_size: usize = 0usize; let mut cluster_size_capacity: usize = expected_num_clusters; let mut cluster_size = >::alloc_cell(alloc, cluster_size_capacity); let mut num_clusters: usize = 0usize; let mut histograms = >::alloc_cell(alloc, brotli_min_size_t(num_blocks, 64usize)); let mut max_num_pairs: usize = (64i32 * 64i32 / 2i32) as (usize); let pairs_capacity: usize = max_num_pairs.wrapping_add(1usize); let mut pairs = >::alloc_cell(alloc, pairs_capacity); let mut pos: usize = 0usize; let mut clusters: >::AllocatedMemory; let num_final_clusters: usize; static kInvalidIndex: u32 = !(0u32); let mut i: usize; let mut sizes: [u32; 64] = [0; 64]; let mut new_clusters: [u32; 64] = [0; 64]; let mut symbols: [u32; 64] = [0; 64]; let mut remap: [u32; 64] = [0; 64]; { let mut block_idx: usize = 0usize; i = 0usize; while i < length { { 0i32; { let _rhs = 1; let _lhs = &mut block_lengths.slice_mut()[(block_idx as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } if i.wrapping_add(1usize) == length || block_ids[(i as (usize))] as (i32) != block_ids[(i.wrapping_add(1usize) as (usize))] as (i32) { block_idx = block_idx.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } 0i32; } i = 0usize; while i < num_blocks { { let num_to_combine: usize = brotli_min_size_t(num_blocks.wrapping_sub(i), 64usize); let num_new_clusters: usize; let mut j: usize; j = 0usize; while j < num_to_combine { { let mut k: usize; HistogramClear(&mut histograms.slice_mut()[(j as (usize))]); k = 0usize; while k < block_lengths.slice()[(i.wrapping_add(j) as (usize))] as (usize) { { HistogramAddItem(&mut histograms.slice_mut()[(j as (usize))], u64::from(data[{ let _old = pos; pos = pos.wrapping_add(1 as (usize)); _old }] .clone()) as usize); } k = k.wrapping_add(1 as (usize)); } let new_cost = BrotliPopulationCost(&histograms.slice()[(j as (usize))], scratch_space); (histograms.slice_mut()[(j as (usize))]).set_bit_cost(new_cost); new_clusters[j] = j as (u32); symbols[j] = j as (u32); sizes[j] = 1u32; } j = j.wrapping_add(1 as (usize)); } num_new_clusters = BrotliHistogramCombine(histograms.slice_mut(), &mut sizes[..], &mut symbols[..], &mut new_clusters[..], pairs.slice_mut(), num_to_combine, num_to_combine, 64usize, max_num_pairs, scratch_space); { if all_histograms_capacity < all_histograms_size.wrapping_add(num_new_clusters) { let mut _new_size: usize = if all_histograms_capacity == 0usize { all_histograms_size.wrapping_add(num_new_clusters) } else { all_histograms_capacity }; while _new_size < all_histograms_size.wrapping_add(num_new_clusters) { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); new_array.slice_mut()[..all_histograms_capacity] .clone_from_slice(&all_histograms.slice()[..all_histograms_capacity]); >::free_cell(alloc, core::mem::replace(&mut all_histograms, new_array)); all_histograms_capacity = _new_size; } } { if cluster_size_capacity < cluster_size_size.wrapping_add(num_new_clusters) { let mut _new_size: usize = if cluster_size_capacity == 0usize { cluster_size_size.wrapping_add(num_new_clusters) } else { cluster_size_capacity }; while _new_size < cluster_size_size.wrapping_add(num_new_clusters) { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); new_array.slice_mut()[..cluster_size_capacity] .clone_from_slice(&cluster_size.slice()[..cluster_size_capacity]); >::free_cell(alloc, core::mem::replace(&mut cluster_size, new_array)); cluster_size_capacity = _new_size; } } j = 0usize; while j < num_new_clusters { { all_histograms.slice_mut()[({ let _old = all_histograms_size; all_histograms_size = all_histograms_size.wrapping_add(1 as (usize)); _old } as (usize))] = histograms.slice()[(new_clusters[j] as (usize))].clone(); cluster_size.slice_mut()[({ let _old = cluster_size_size; cluster_size_size = cluster_size_size.wrapping_add(1 as (usize)); _old } as (usize))] = sizes[new_clusters[j] as (usize)]; remap[new_clusters[j] as (usize)] = j as (u32); } j = j.wrapping_add(1 as (usize)); } j = 0usize; while j < num_to_combine { { histogram_symbols.slice_mut()[(i.wrapping_add(j) as (usize))] = (num_clusters as (u32)).wrapping_add(remap[symbols[j] as (usize)]); } j = j.wrapping_add(1 as (usize)); } num_clusters = num_clusters.wrapping_add(num_new_clusters); 0i32; 0i32; } i = i.wrapping_add(64usize); } >::free_cell(alloc, core::mem::replace(&mut histograms, >::AllocatedMemory::default())); max_num_pairs = brotli_min_size_t((64usize).wrapping_mul(num_clusters), num_clusters.wrapping_div(2usize).wrapping_mul(num_clusters)); if pairs_capacity < max_num_pairs.wrapping_add(1usize) { let new_cell = >::alloc_cell(alloc, max_num_pairs.wrapping_add(1usize)); >::free_cell(alloc, core::mem::replace(&mut pairs, new_cell)); } clusters = >::alloc_cell(alloc, num_clusters); i = 0usize; for item in clusters.slice_mut()[..num_clusters].iter_mut() { *item = i as u32; i = i.wrapping_add(1 as (usize)); } num_final_clusters = BrotliHistogramCombine(all_histograms.slice_mut(), cluster_size.slice_mut(), histogram_symbols.slice_mut(), clusters.slice_mut(), pairs.slice_mut(), num_clusters, num_blocks, 256usize, max_num_pairs, scratch_space); >::free_cell(alloc, core::mem::replace(&mut pairs, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut cluster_size, >::AllocatedMemory::default())); let mut new_index = >::alloc_cell(alloc, num_clusters); for item in new_index.slice_mut().iter_mut() { *item = kInvalidIndex; } pos = 0usize; { let mut next_index: u32 = 0u32; i = 0usize; while i < num_blocks { { let mut histo: HistogramType = HistogramType::default(); let mut j: usize; let mut best_out: u32; let mut best_bits: super::util::floatX; HistogramClear(&mut histo); j = 0usize; while j < block_lengths.slice()[(i as (usize))] as (usize) { { HistogramAddItem(&mut histo, u64::from(data[({ let _old = pos; pos = pos.wrapping_add(1 as (usize)); _old } as (usize))] .clone()) as (usize)); } j = j.wrapping_add(1 as (usize)); } best_out = if i == 0usize { histogram_symbols.slice()[(0usize)] } else { histogram_symbols.slice()[(i.wrapping_sub(1usize) as (usize))] }; best_bits = BrotliHistogramBitCostDistance(&mut histo, &mut all_histograms.slice_mut()[(best_out as (usize))], scratch_space); j = 0usize; while j < num_final_clusters { { let cur_bits: super::util::floatX = BrotliHistogramBitCostDistance(&mut histo, &mut all_histograms.slice_mut()[(clusters.slice()[(j as (usize))] as (usize))], scratch_space); if cur_bits < best_bits { best_bits = cur_bits; best_out = clusters.slice()[(j as (usize))]; } } j = j.wrapping_add(1 as (usize)); } histogram_symbols.slice_mut()[(i as (usize))] = best_out; if new_index.slice()[(best_out as (usize))] == kInvalidIndex { new_index.slice_mut()[(best_out as (usize))] = { let _old = next_index; next_index = next_index.wrapping_add(1 as (u32)); _old }; } } i = i.wrapping_add(1 as (usize)); } } >::free_cell(alloc, core::mem::replace(&mut clusters, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut all_histograms, >::AllocatedMemory::default())); { if (*split).types_alloc_size() < num_blocks { let mut _new_size: usize = if (*split).types_alloc_size() == 0usize { num_blocks } else { (*split).types_alloc_size() }; while _new_size < num_blocks { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); new_array.slice_mut()[..(*split).types_alloc_size()] .clone_from_slice(&(*split).types.slice()[..(*split).types_alloc_size()]); >::free_cell(alloc, core::mem::replace(&mut (*split).types, new_array)); } } { if (*split).lengths_alloc_size() < num_blocks { let mut _new_size: usize = if (*split).lengths_alloc_size() == 0usize { num_blocks } else { (*split).lengths_alloc_size() }; while _new_size < num_blocks { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); new_array.slice_mut()[..(*split).lengths_alloc_size()].clone_from_slice((*split) .lengths .slice()); >::free_cell(alloc, core::mem::replace(&mut (*split).lengths, new_array)); } } { let mut cur_length: u32 = 0u32; let mut block_idx: usize = 0usize; let mut max_type: u8 = 0i32 as (u8); i = 0usize; while i < num_blocks { { cur_length = cur_length.wrapping_add(block_lengths.slice()[(i as (usize))]); if i.wrapping_add(1usize) == num_blocks || histogram_symbols.slice()[(i as (usize))] != histogram_symbols.slice()[(i.wrapping_add(1usize) as (usize))] { let id: u8 = new_index.slice()[(histogram_symbols.slice()[(i as (usize))] as (usize))] as (u8); (*split).types.slice_mut()[(block_idx as (usize))] = id; (*split).lengths.slice_mut()[(block_idx as (usize))] = cur_length; max_type = brotli_max_uint8_t(max_type, id); cur_length = 0u32; block_idx = block_idx.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } (*split).num_blocks = block_idx; (*split).num_types = (max_type as (usize)).wrapping_add(1usize); } >::free_cell(alloc, new_index); >::free_cell(alloc, block_lengths); >::free_cell(alloc, histogram_symbols); } fn SplitByteVector+SliceWrapperMut+CostAccessors+core::default::Default+Clone, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator, IntegerType:Sized+Clone>(alloc: &mut Alloc, data: &[IntegerType], length: usize, literals_per_histogram: usize, max_histograms: usize, sampling_stride_length: usize, block_switch_cost: super::util::floatX, params: &BrotliEncoderParams, scratch_space : &mut HistogramType::i32vec, split: &mut BlockSplit) where u64: core::convert::From{ let data_size: usize = HistogramType::default().slice().len(); let mut num_histograms: usize = length.wrapping_div(literals_per_histogram).wrapping_add(1usize); if num_histograms > max_histograms { num_histograms = max_histograms; } if length == 0usize { (*split).num_types = 1usize; return; } else if length < kMinLengthForBlockSplitting { { if (*split).types_alloc_size() < (*split).num_blocks.wrapping_add(1usize) { let mut _new_size: usize = if (*split).types_alloc_size() == 0usize { (*split).num_blocks.wrapping_add(1usize) } else { (*split).types_alloc_size() }; while _new_size < (*split).num_blocks.wrapping_add(1usize) { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); new_array.slice_mut()[..(*split).types_alloc_size()] .clone_from_slice(&(*split).types.slice()[..(*split).types_alloc_size()]); >::free_cell(alloc, core::mem::replace(&mut (*split).types, new_array)); } } { if (*split).lengths_alloc_size() < (*split).num_blocks.wrapping_add(1usize) { let mut _new_size: usize = if (*split).lengths_alloc_size() == 0usize { (*split).num_blocks.wrapping_add(1usize) } else { (*split).lengths_alloc_size() }; while _new_size < (*split).num_blocks.wrapping_add(1usize) { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); new_array.slice_mut()[..(*split).lengths_alloc_size()] .clone_from_slice(&(*split).lengths.slice()[..(*split).lengths_alloc_size()]); >::free_cell(alloc, core::mem::replace(&mut (*split).lengths, new_array)); } } (*split).num_types = 1usize; (*split).types.slice_mut()[((*split).num_blocks as (usize))] = 0i32 as (u8); (*split).lengths.slice_mut()[((*split).num_blocks as (usize))] = length as (u32); (*split).num_blocks = (*split).num_blocks.wrapping_add(1 as (usize)); return; } let mut histograms = >::alloc_cell(alloc, num_histograms); InitialEntropyCodes(data, length, sampling_stride_length, num_histograms, histograms.slice_mut()); RefineEntropyCodes(data, length, sampling_stride_length, num_histograms, histograms.slice_mut()); { let mut block_ids = >::alloc_cell(alloc, length); let mut num_blocks: usize = 0usize; let bitmaplen: usize = num_histograms.wrapping_add(7usize) >> 3i32; let mut insert_cost = >::alloc_cell(alloc, data_size.wrapping_mul(num_histograms)); let mut cost = >::alloc_cell(alloc, ((num_histograms + 7) >> 3)); let mut switch_signal = >::alloc_cell(alloc, length.wrapping_mul(bitmaplen)); let mut new_id = >::alloc_cell(alloc, num_histograms); let iters: usize = (if (*params).quality <= 11 { 3i32 } else { 10i32 }) as (usize); let mut i: usize; i = 0usize; while i < iters { { num_blocks = FindBlocks(data, length, block_switch_cost, num_histograms, histograms.slice_mut(), insert_cost.slice_mut(), cost.slice_mut(), switch_signal.slice_mut(), block_ids.slice_mut()); num_histograms = RemapBlockIds(block_ids.slice_mut(), length, new_id.slice_mut(), num_histograms); BuildBlockHistograms(data, length, block_ids.slice(), num_histograms, histograms.slice_mut()); } i = i.wrapping_add(1 as (usize)); } >::free_cell(alloc, insert_cost); >::free_cell(alloc, cost); >::free_cell(alloc, switch_signal); >::free_cell(alloc, new_id); >::free_cell(alloc, histograms); ClusterBlocks::(alloc, data, length, num_blocks, scratch_space, block_ids.slice_mut(), split ); >::free_cell(alloc, block_ids); } } pub fn BrotliSplitBlock + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator> (alloc: &mut Alloc, cmds: &[Command], num_commands: usize, data: &[u8], pos: usize, mask: usize, params: &BrotliEncoderParams, lit_scratch_space: &mut ::i32vec, cmd_scratch_space: &mut ::i32vec, dst_scratch_space: &mut ::i32vec, literal_split: &mut BlockSplit, insert_and_copy_split: &mut BlockSplit, dist_split: &mut BlockSplit) { { /*for (i, cmd) in cmds[..num_commands].iter().enumerate() { println_stderr!("C {:} {:} {:} {:} {:} {:}", i, cmd.insert_len_, cmd.copy_len_, cmd.dist_extra_, cmd.cmd_prefix_, cmd.dist_prefix_); }*/ let literals_count: usize = CountLiterals(cmds, num_commands); let mut literals = >::alloc_cell(alloc, literals_count); CopyLiteralsToByteArray(cmds, num_commands, data, pos, mask, literals.slice_mut()); SplitByteVector::(alloc, literals.slice(), literals_count, kSymbolsPerLiteralHistogram, kMaxLiteralHistograms, kLiteralStrideLength, kLiteralBlockSwitchCost, params, lit_scratch_space, literal_split); >::free_cell(alloc, literals); } { let mut insert_and_copy_codes = >::alloc_cell(alloc, num_commands); for i in 0..core::cmp::min(num_commands, cmds.len()) { insert_and_copy_codes.slice_mut()[(i as (usize))] = (cmds[(i as (usize))]).cmd_prefix_; } SplitByteVector::(alloc, insert_and_copy_codes.slice(), num_commands, kSymbolsPerCommandHistogram, kMaxCommandHistograms, kCommandStrideLength, kCommandBlockSwitchCost, params, cmd_scratch_space, insert_and_copy_split); >::free_cell(alloc, insert_and_copy_codes); } { let mut distance_prefixes = >::alloc_cell(alloc, num_commands); let mut j: usize = 0usize; let mut i: usize; i = 0usize; while i < num_commands { { let cmd = &cmds[(i as (usize))]; if CommandCopyLen(cmd) != 0 && ((*cmd).cmd_prefix_ as (i32) >= 128i32) { distance_prefixes.slice_mut()[({ let _old = j; j = j.wrapping_add(1 as (usize)); _old } as (usize))] = (*cmd).dist_prefix_ & 0x3ff; } } i = i.wrapping_add(1 as (usize)); } SplitByteVector::(alloc, distance_prefixes.slice(), j, kSymbolsPerDistanceHistogram, kMaxCommandHistograms, kCommandStrideLength, kDistanceBlockSwitchCost, params, dst_scratch_space, dist_split); >::free_cell(alloc, distance_prefixes); } } brotli-3.4.0/src/enc/brotli_bit_stream.rs000075500000000000000000003327601046102023000165470ustar 00000000000000#![allow(unknown_lints)] #![allow(dead_code)] #![allow(unused_imports)] #![allow(unused_macros)] #[cfg(feature="std")] use std::io::Write; use VERSION; use super::{v8, s16}; use super::util::floatX; use super::prior_eval; use super::stride_eval; use super::combined_alloc::BrotliAlloc; use super::input_pair::{InputPair, InputReference, InputReferenceMut}; use super::block_split::BlockSplit; use enc::backward_references::BrotliEncoderParams; use super::super::dictionary::{kBrotliDictionary, kBrotliDictionarySizeBitsByLength, kBrotliDictionaryOffsetsByLength}; use super::super::transform::{TransformDictionaryWord}; use super::static_dict::kNumDistanceCacheEntries; use super::command::{Command, GetCopyLengthCode, GetInsertLengthCode, CommandDistanceIndexAndOffset}; use super::constants::{BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS, BROTLI_NUM_LITERAL_SYMBOLS, BROTLI_NUM_COMMAND_SYMBOLS, BROTLI_CONTEXT_LUT, BROTLI_NUM_BLOCK_LEN_SYMBOLS, kZeroRepsBits, kZeroRepsDepth, kNonZeroRepsBits, kNonZeroRepsDepth, kCodeLengthBits, kCodeLengthDepth, kStaticCommandCodeDepth, kStaticCommandCodeBits, kStaticDistanceCodeDepth, kStaticDistanceCodeBits, kSigned3BitContextLookup, kUTF8ContextLookup, kInsBase, kInsExtra, kCopyBase, kCopyExtra}; use super::entropy_encode::{HuffmanTree, BrotliWriteHuffmanTree, BrotliCreateHuffmanTree, BrotliConvertBitDepthsToSymbols, NewHuffmanTree, InitHuffmanTree, SortHuffmanTreeItems, HuffmanComparator, BrotliSetDepth}; use super::histogram::{HistogramAddItem, HistogramLiteral, HistogramCommand, HistogramDistance, ContextType}; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use super::super::core; use super::find_stride; use super::vectorization::Mem256f; use super::interface; use super::pdf::PDF; use super::interface::{CommandProcessor, StaticCommand}; use super::context_map_entropy::{ContextMapEntropy, SpeedAndMax, speed_to_tuple}; pub struct PrefixCodeRange { pub offset: u32, pub nbits: u32, } pub const MAX_SIMPLE_DISTANCE_ALPHABET_SIZE: usize = 140; fn window_size_from_lgwin(lgwin: i32) -> usize{ (1usize << lgwin) - 16usize } fn context_type_str(context_type:ContextType) -> &'static str { match context_type { ContextType::CONTEXT_LSB6 => "lsb6", ContextType::CONTEXT_MSB6 => "msb6", ContextType::CONTEXT_UTF8 => "utf8", ContextType::CONTEXT_SIGNED => "sign", } } fn prediction_mode_str(prediction_mode_nibble:interface::LiteralPredictionModeNibble) -> &'static str { match prediction_mode_nibble.prediction_mode() { interface::LITERAL_PREDICTION_MODE_SIGN => "sign", interface::LITERAL_PREDICTION_MODE_LSB6 => "lsb6", interface::LITERAL_PREDICTION_MODE_MSB6 => "msb6", interface::LITERAL_PREDICTION_MODE_UTF8 => "utf8", _ => "unknown", } } fn is_long_enough_to_be_random(len: usize, high_entropy_detection_quality:u8) -> bool{ return match high_entropy_detection_quality { 0 => false, 1 => false, 2 => len >= 128, 3 => len >= 96, 4 => len >= 64, 5 => len >= 48, 6 => len >= 32, 7 => len >= 24, 8 => len >= 16, 9 => len >= 8, 10 => len >= 4, 11 => len >= 1, _ => len >= 8, } } const COMMAND_BUFFER_SIZE: usize = 4096; struct CommandQueue<'a, Alloc:BrotliAlloc+'a> { mb: InputPair<'a>, mb_byte_offset: usize, mc: &'a mut Alloc, queue: >::AllocatedMemory, pred_mode: interface::PredictionModeContextMap>, loc: usize, entropy_tally_scratch: find_stride::EntropyTally, best_strides_per_block_type: >::AllocatedMemory, entropy_pyramid: find_stride::EntropyPyramid, context_map_entropy: ContextMapEntropy<'a, Alloc>, stride_detection_quality: u8, high_entropy_detection_quality: u8, block_type_literal: u8, best_stride_index: usize, overfull: bool, } impl<'a, Alloc:BrotliAlloc> CommandQueue<'a, Alloc> { fn new(alloc: &'a mut Alloc, num_commands: usize, pred_mode: interface::PredictionModeContextMap>, mb: InputPair<'a>, stride_detection_quality: u8, high_entropy_detection_quality: u8, context_map_entropy: ContextMapEntropy<'a, Alloc>, best_strides: >::AllocatedMemory, entropy_tally_scratch: find_stride::EntropyTally, entropy_pyramid: find_stride::EntropyPyramid, ) -> CommandQueue <'a, Alloc> { // assume no more than 1/16 of the stream is block_types which may chop up literals // also there's the first btypel and a potential wrap around the ring buffer let queue = >::alloc_cell(alloc, num_commands * 17 / 16 + 4); CommandQueue { mc:alloc, queue: queue, // always need a spare command in case the ring buffer splits a literal into two pred_mode:pred_mode, mb:mb, mb_byte_offset:0, loc:0, best_strides_per_block_type: best_strides, entropy_tally_scratch: entropy_tally_scratch, entropy_pyramid: entropy_pyramid, stride_detection_quality: stride_detection_quality, high_entropy_detection_quality: high_entropy_detection_quality, context_map_entropy: context_map_entropy, block_type_literal: 0, best_stride_index: 0, overfull: false, } } fn full(&self) -> bool { self.loc == self.queue.len() } fn error_if_full(&mut self) { if self.full() { self.overfull = true; } } fn size(&self) -> usize { self.loc } fn clear(&mut self) { self.loc = 0; self.block_type_literal = 0; } fn free(&mut self, callback: &mut Cb) -> Result<(), ()> where Cb:FnMut(&mut interface::PredictionModeContextMap, &mut [interface::StaticCommand], InputPair, &mut Alloc) { callback(&mut self.pred_mode, self.queue.slice_mut().split_at_mut(self.loc).0, self.mb, self.mc); self.clear(); self.entropy_tally_scratch.free(&mut self.mc); self.entropy_pyramid.free(&mut self.mc); self.context_map_entropy.free(&mut self.mc); >::free_cell(self.mc, core::mem::replace(&mut self.queue, >::AllocatedMemory::default())); >::free_cell(self.mc, core::mem::replace(&mut self.best_strides_per_block_type, >::AllocatedMemory::default())); if self.overfull { return Err(()); } Ok(()) } } impl<'a, Alloc: BrotliAlloc> interface::CommandProcessor<'a> for CommandQueue<'a, Alloc> { fn push (&mut self, val: interface::Command >) { if self.full() { let mut tmp = >::alloc_cell(self.mc, self.queue.slice().len() * 2); tmp.slice_mut().split_at_mut(self.queue.slice().len()).0.clone_from_slice(self.queue.slice()); >::free_cell(self.mc, core::mem::replace(&mut self.queue, tmp)); } if !self.full() { self.queue.slice_mut()[self.loc] = val.freeze(); self.loc += 1; } else { self.error_if_full(); } } fn push_block_switch_literal(&mut self, block_type: u8) { self.push(interface::Command::BlockSwitchLiteral( interface::LiteralBlockSwitch::new(block_type, 0))) } } #[cfg(feature="std")] fn warn_on_missing_free() { let _err = ::std::io::stderr().write(b"Need to free entropy_tally_scratch before dropping CommandQueue\n"); } #[cfg(not(feature="std"))] fn warn_on_missing_free() { // no way to warn in this case } impl<'a, Alloc: BrotliAlloc> Drop for CommandQueue<'a, Alloc> { fn drop(&mut self) { if !self.entropy_tally_scratch.is_free() { warn_on_missing_free(); } } } #[cfg(not(feature="billing"))] fn best_singleton_speed_log(_name:&str, _data:&[SpeedAndMax;2], _cost:&[floatX;2]) { } #[cfg(feature="billing")] fn best_singleton_speed_log(name:&str, data:&[SpeedAndMax;2], cost:&[floatX;2]) { println!("{} hi cost: {} lo cost: {} speeds {:?} {:?}", name, cost[1], cost[0], data[1], data[0]); } #[cfg(not(feature="billing"))] fn best_speed_log(_name:&str, _data:&[SpeedAndMax;2], _cost:&[floatX;2]) {} #[cfg(feature="billing")] fn best_speed_log(name:&str, data:&[SpeedAndMax;2], cost:&[floatX;2]) { for high in 0..2 { println!("{} Speed [ inc: {}, max: {}, algo: 0 ] cost: {}", name, if high != 0 {"hi" } else {"lo"}, data[high].0, data[high].1, cost[high]); } } fn process_command_queue<'a, CmdProcessor: interface::CommandProcessor<'a> > ( command_queue: &mut CmdProcessor, input: InputPair<'a>, commands: &[Command], dist_cache: &[i32;kNumDistanceCacheEntries], mut recoder_state :RecoderState, block_type: &MetaBlockSplitRefs, params: &BrotliEncoderParams, context_type:Option, ) -> RecoderState { let mut input_iter = input.clone(); let mut local_dist_cache = [0i32;kNumDistanceCacheEntries]; local_dist_cache.clone_from_slice(&dist_cache[..]); let mut btypel_counter = 0usize; let mut btypec_counter = 0usize; let mut btyped_counter = 0usize; let mut btypel_sub = if block_type.btypel.num_types == 1 { 1u32<<31 } else {block_type.btypel.lengths[0]}; let mut btypec_sub = if block_type.btypec.num_types == 1 { 1u32<<31 } else {block_type.btypec.lengths[0]}; let mut btyped_sub = if block_type.btyped.num_types == 1 { 1u32<<31 } else {block_type.btyped.lengths[0]}; { command_queue.push_block_switch_literal(0); } let mut mb_len = input.len(); for cmd in commands.iter() { let (inserts, interim) = input_iter.split_at(core::cmp::min(cmd.insert_len_ as usize, mb_len)); recoder_state.num_bytes_encoded += inserts.len(); let _copy_cursor = input.len() - interim.len(); // let distance_context = CommandDistanceContext(cmd); let copylen_code: u32 = CommandCopyLenCode(cmd); let (prev_dist_index, dist_offset) = CommandDistanceIndexAndOffset(cmd, ¶ms.dist); let final_distance: usize; if prev_dist_index == 0 { final_distance = dist_offset as usize; } else { final_distance = (local_dist_cache[prev_dist_index - 1] as isize + dist_offset) as usize; } let copy_len = copylen_code as usize; let actual_copy_len : usize; let max_distance = core::cmp::min(recoder_state.num_bytes_encoded, window_size_from_lgwin(params.lgwin)); assert!(inserts.len() <= mb_len); if inserts.len() != 0 { let mut tmp_inserts = inserts; while tmp_inserts.len() > btypel_sub as usize { // we have to divide some: let (in_a, in_b) = tmp_inserts.split_at(btypel_sub as usize); if in_a.len() != 0 { if let Some(_) = context_type { command_queue.push_literals(&in_a); } else if params.high_entropy_detection_quality == 0 { command_queue.push_literals(&in_a); } else { command_queue.push_rand_literals(&in_a); } } mb_len -= in_a.len(); tmp_inserts = in_b; btypel_counter += 1; if block_type.btypel.types.len() > btypel_counter { btypel_sub = block_type.btypel.lengths[btypel_counter]; command_queue.push_block_switch_literal(block_type.btypel.types[btypel_counter]); } else { btypel_sub = 1u32<<31; } } if let Some(_) = context_type { command_queue.push_literals(&tmp_inserts); } else if params.high_entropy_detection_quality == 0 { command_queue.push_literals(&tmp_inserts); }else { command_queue.push_rand_literals(&tmp_inserts); } if tmp_inserts.len() != 0 { mb_len -= tmp_inserts.len(); btypel_sub -= tmp_inserts.len() as u32; } } if final_distance > max_distance { // is dictionary assert!(copy_len >= 4); assert!(copy_len < 25); let dictionary_offset = final_distance - max_distance - 1; let ndbits = kBrotliDictionarySizeBitsByLength[copy_len] as usize; let action = dictionary_offset >> ndbits; let word_sub_index = dictionary_offset & ((1 << ndbits) - 1); let word_index = word_sub_index * copy_len + kBrotliDictionaryOffsetsByLength[copy_len] as usize; let raw_word = &kBrotliDictionary[word_index..word_index + copy_len]; let mut transformed_word = [0u8; 38]; actual_copy_len = TransformDictionaryWord(&mut transformed_word[..], raw_word, copy_len as i32, action as i32) as usize; if actual_copy_len <= mb_len { command_queue.push(interface::Command::Dict( interface::DictCommand{ word_size: copy_len as u8, transform: action as u8, final_size: actual_copy_len as u8, empty: 0, word_id: word_sub_index as u32, })); mb_len -= actual_copy_len; assert_eq!(InputPair(InputReference{data:transformed_word.split_at(actual_copy_len).0, orig_offset:0}, InputReference::default()), interim.split_at(actual_copy_len).0); } else if mb_len != 0 { // truncated dictionary word: represent it as literals instead // won't be random noise since it fits in the dictionary, so we won't check for rand command_queue.push_literals(&interim.split_at(mb_len).0); mb_len = 0; assert_eq!(InputPair(InputReference{data:transformed_word.split_at(mb_len).0, orig_offset:0}, InputReference::default()), interim.split_at(mb_len).0); } } else { actual_copy_len = core::cmp::min(mb_len, copy_len); if actual_copy_len != 0 { command_queue.push(interface::Command::Copy( interface::CopyCommand{ distance: final_distance as u32, num_bytes: actual_copy_len as u32, })); } mb_len -= actual_copy_len; if prev_dist_index != 1 || dist_offset != 0 { // update distance cache unless it's the "0 distance symbol" let mut tmp_dist_cache = [0i32;kNumDistanceCacheEntries - 1]; tmp_dist_cache.clone_from_slice(&local_dist_cache[..kNumDistanceCacheEntries - 1]); local_dist_cache[1..].clone_from_slice(&tmp_dist_cache[..]); local_dist_cache[0] = final_distance as i32; } } { btypec_sub -= 1; if btypec_sub == 0 { btypec_counter += 1; if block_type.btypec.types.len() > btypec_counter { btypec_sub = block_type.btypec.lengths[btypec_counter]; command_queue.push(interface::Command::BlockSwitchCommand( interface::BlockSwitch(block_type.btypec.types[btypec_counter]))); } else { btypec_sub = 1u32 << 31; } } } if copy_len != 0 && cmd.cmd_prefix_ >= 128 { btyped_sub -= 1; if btyped_sub == 0 { btyped_counter += 1; if block_type.btyped.types.len() > btyped_counter { btyped_sub = block_type.btyped.lengths[btyped_counter]; command_queue.push(interface::Command::BlockSwitchDistance( interface::BlockSwitch(block_type.btyped.types[btyped_counter]))); } else { btyped_sub = 1u32 << 31; } } } let (copied, remainder) = interim.split_at(actual_copy_len); recoder_state.num_bytes_encoded += copied.len(); input_iter = remainder; } recoder_state } fn LogMetaBlock<'a, Alloc: BrotliAlloc, Cb>(alloc: &mut Alloc, commands: &[Command], input0: &'a[u8],input1: &'a[u8], dist_cache: &[i32;kNumDistanceCacheEntries], recoder_state :&mut RecoderState, block_type: MetaBlockSplitRefs, params: &BrotliEncoderParams, context_type:Option, callback: &mut Cb) where Cb:FnMut(&mut interface::PredictionModeContextMap, &mut [interface::StaticCommand], InputPair, &mut Alloc){ let mut local_literal_context_map = [0u8; 256 * 64]; let mut local_distance_context_map = [0u8; 256 * 64 + interface::DISTANCE_CONTEXT_MAP_OFFSET]; assert_eq!(*block_type.btypel.types.iter().max().unwrap_or(&0) as u32 + 1, block_type.btypel.num_types); assert_eq!(*block_type.btypec.types.iter().max().unwrap_or(&0) as u32 + 1, block_type.btypec.num_types); assert_eq!(*block_type.btyped.types.iter().max().unwrap_or(&0) as u32 + 1, block_type.btyped.num_types); if block_type.literal_context_map.len() <= 256 * 64 { for (index, item) in block_type.literal_context_map.iter().enumerate() { local_literal_context_map[index] = *item as u8; } } if block_type.distance_context_map.len() <= 256 * 64 { for (index, item) in block_type.distance_context_map.iter().enumerate() { local_distance_context_map[interface::DISTANCE_CONTEXT_MAP_OFFSET + index] = *item as u8; } } let mut prediction_mode = interface::PredictionModeContextMap::{ literal_context_map:InputReferenceMut{ data:local_literal_context_map.split_at_mut(block_type.literal_context_map.len()).0, orig_offset:0}, predmode_speed_and_distance_context_map:InputReferenceMut{ data: local_distance_context_map.split_at_mut(interface::PredictionModeContextMap::::size_of_combined_array(block_type.distance_context_map.len())).0, orig_offset: 0, }, }; for item in prediction_mode.get_mixing_values_mut().iter_mut() { *item = prior_eval::WhichPrior::STRIDE1 as u8; } prediction_mode.set_stride_context_speed([params.literal_adaptation[2], params.literal_adaptation[3]]); prediction_mode.set_context_map_speed([params.literal_adaptation[0], params.literal_adaptation[1]]); prediction_mode.set_combined_stride_context_speed([params.literal_adaptation[0], params.literal_adaptation[1]]); prediction_mode.set_literal_prediction_mode(interface::LiteralPredictionModeNibble(context_type.unwrap_or(ContextType::CONTEXT_LSB6) as u8)); let mut entropy_tally_scratch; let mut entropy_pyramid; if params.stride_detection_quality == 1 || params.stride_detection_quality == 2 { entropy_tally_scratch = find_stride::EntropyTally::::new(alloc, None); entropy_pyramid = find_stride::EntropyPyramid::::new(alloc); entropy_pyramid.populate(input0, input1, &mut entropy_tally_scratch); } else { entropy_tally_scratch = find_stride::EntropyTally::::disabled_placeholder(alloc); entropy_pyramid = find_stride::EntropyPyramid::::disabled_placeholder(alloc); } let input = InputPair(InputReference{data:input0, orig_offset:0}, InputReference{data:input1, orig_offset:input0.len()}); let mut best_strides = >::AllocatedMemory::default(); if params.stride_detection_quality > 2 { let mut stride_selector = stride_eval::StrideEval::::new(alloc, input, &prediction_mode, ¶ms); process_command_queue(&mut stride_selector, input, commands, dist_cache, *recoder_state, &block_type, params, context_type); let ntypes = stride_selector.num_types(); best_strides = >::alloc_cell(stride_selector.alloc(), ntypes); stride_selector.choose_stride(best_strides.slice_mut()); } let mut context_map_entropy = ContextMapEntropy::::new(alloc, input, entropy_pyramid.stride_last_level_range(), prediction_mode, params.cdf_adaptation_detection); if params.cdf_adaptation_detection != 0 { process_command_queue(&mut context_map_entropy, input, commands, dist_cache, *recoder_state, &block_type, params, context_type); { let (cm_speed, cm_cost) = context_map_entropy.best_singleton_speeds(true, false); let (stride_speed, stride_cost) = context_map_entropy.best_singleton_speeds(false, false); let (combined_speed, combined_cost) = context_map_entropy.best_singleton_speeds(false, true); best_singleton_speed_log("CM", &cm_speed, &cm_cost); best_singleton_speed_log("stride", &stride_speed, &stride_cost); best_singleton_speed_log("combined", &combined_speed, &combined_cost); } let cm_speed = context_map_entropy.best_speeds(true, false); let stride_speed = context_map_entropy.best_speeds(false, false); let combined_speed = context_map_entropy.best_speeds(false, true); let acost = context_map_entropy.best_speeds_costs(true, false); let bcost = context_map_entropy.best_speeds_costs(false, false); let ccost = context_map_entropy.best_speeds_costs(false, true); context_map_entropy.prediction_mode_mut().set_stride_context_speed(speed_to_tuple(stride_speed)); context_map_entropy.prediction_mode_mut().set_context_map_speed(speed_to_tuple(cm_speed)); context_map_entropy.prediction_mode_mut().set_combined_stride_context_speed(speed_to_tuple(combined_speed)); best_speed_log("CM", &cm_speed, &acost); best_speed_log("Stride", &stride_speed, &bcost); best_speed_log("StrideCombined", &combined_speed, &ccost); } let mut prior_selector = prior_eval::PriorEval::::new(alloc, input, entropy_pyramid.stride_last_level_range(), context_map_entropy.take_prediction_mode(), ¶ms); if params.prior_bitmask_detection != 0 { process_command_queue(&mut prior_selector, input, commands, dist_cache, *recoder_state, &block_type, params, context_type); prior_selector.choose_bitmask(); } let prediction_mode = prior_selector.take_prediction_mode(); prior_selector.free(alloc); let mut command_queue = CommandQueue::new(alloc, commands.len(), prediction_mode, input, params.stride_detection_quality, params.high_entropy_detection_quality, context_map_entropy, best_strides, entropy_tally_scratch, entropy_pyramid); *recoder_state = process_command_queue(&mut command_queue, input, commands, dist_cache, *recoder_state, &block_type, params, context_type); command_queue.free(callback).unwrap(); // ::std::io::stderr().write(input0).unwrap(); // ::std::io::stderr().write(input1).unwrap(); } static kBlockLengthPrefixCode: [PrefixCodeRange; BROTLI_NUM_BLOCK_LEN_SYMBOLS] = [PrefixCodeRange { offset: 1u32, nbits: 2u32, }, PrefixCodeRange { offset: 5u32, nbits: 2u32, }, PrefixCodeRange { offset: 9u32, nbits: 2u32, }, PrefixCodeRange { offset: 13u32, nbits: 2u32, }, PrefixCodeRange { offset: 17u32, nbits: 3u32, }, PrefixCodeRange { offset: 25u32, nbits: 3u32, }, PrefixCodeRange { offset: 33u32, nbits: 3u32, }, PrefixCodeRange { offset: 41u32, nbits: 3u32, }, PrefixCodeRange { offset: 49u32, nbits: 4u32, }, PrefixCodeRange { offset: 65u32, nbits: 4u32, }, PrefixCodeRange { offset: 81u32, nbits: 4u32, }, PrefixCodeRange { offset: 97u32, nbits: 4u32, }, PrefixCodeRange { offset: 113u32, nbits: 5u32, }, PrefixCodeRange { offset: 145u32, nbits: 5u32, }, PrefixCodeRange { offset: 177u32, nbits: 5u32, }, PrefixCodeRange { offset: 209u32, nbits: 5u32, }, PrefixCodeRange { offset: 241u32, nbits: 6u32, }, PrefixCodeRange { offset: 305u32, nbits: 6u32, }, PrefixCodeRange { offset: 369u32, nbits: 7u32, }, PrefixCodeRange { offset: 497u32, nbits: 8u32, }, PrefixCodeRange { offset: 753u32, nbits: 9u32, }, PrefixCodeRange { offset: 1265u32, nbits: 10u32, }, PrefixCodeRange { offset: 2289u32, nbits: 11u32, }, PrefixCodeRange { offset: 4337u32, nbits: 12u32, }, PrefixCodeRange { offset: 8433u32, nbits: 13u32, }, PrefixCodeRange { offset: 16625u32, nbits: 24u32, }]; fn BrotliWriteBits(n_bits: u8, bits: u64, pos: &mut usize, array: &mut [u8]) { assert!((bits >> n_bits as usize) == 0); assert!(n_bits <= 56); let ptr_offset: usize = ((*pos >> 3) as u32) as usize; let mut v = array[ptr_offset] as u64; v |= bits << ((*pos) as u64 & 7); array[ptr_offset + 7] = (v >> 56) as u8; array[ptr_offset + 6] = ((v >> 48) & 0xff) as u8; array[ptr_offset + 5] = ((v >> 40) & 0xff) as u8; array[ptr_offset + 4] = ((v >> 32) & 0xff) as u8; array[ptr_offset + 3] = ((v >> 24) & 0xff) as u8; array[ptr_offset + 2] = ((v >> 16) & 0xff) as u8; array[ptr_offset + 1] = ((v >> 8) & 0xff) as u8; array[ptr_offset] = (v & 0xff) as u8; *pos += n_bits as usize } fn BrotliWriteBitsPrepareStorage(pos: usize, array: &mut [u8]) { assert_eq!(pos & 7, 0); array[pos >> 3] = 0; } fn BrotliStoreHuffmanTreeOfHuffmanTreeToBitMask(num_codes: i32, code_length_bitdepth: &[u8], storage_ix: &mut usize, storage: &mut [u8]) { static kStorageOrder: [u8; 18] = [1i32 as (u8), 2i32 as (u8), 3i32 as (u8), 4i32 as (u8), 0i32 as (u8), 5i32 as (u8), 17i32 as (u8), 6i32 as (u8), 16i32 as (u8), 7i32 as (u8), 8i32 as (u8), 9i32 as (u8), 10i32 as (u8), 11i32 as (u8), 12i32 as (u8), 13i32 as (u8), 14i32 as (u8), 15i32 as (u8)]; static kHuffmanBitLengthHuffmanCodeSymbols: [u8; 6] = [0i32 as (u8), 7i32 as (u8), 3i32 as (u8), 2i32 as (u8), 1i32 as (u8), 15i32 as (u8)]; static kHuffmanBitLengthHuffmanCodeBitLengths: [u8; 6] = [2i32 as (u8), 4i32 as (u8), 3i32 as (u8), 2i32 as (u8), 2i32 as (u8), 4i32 as (u8)]; let mut skip_some: u64 = 0u64; let mut codes_to_store: u64 = 18; if num_codes > 1i32 { 'break5: while codes_to_store > 0 { { if code_length_bitdepth[(kStorageOrder[codes_to_store.wrapping_sub(1) as usize] as (usize))] as (i32) != 0i32 { { break 'break5; } } } codes_to_store = codes_to_store.wrapping_sub(1); } } if code_length_bitdepth[(kStorageOrder[0usize] as (usize))] as (i32) == 0i32 && (code_length_bitdepth[(kStorageOrder[1usize] as (usize))] as (i32) == 0i32) { skip_some = 2; if code_length_bitdepth[(kStorageOrder[2usize] as (usize))] as (i32) == 0i32 { skip_some = 3; } } BrotliWriteBits(2, skip_some, storage_ix, storage); { let mut i: u64; i = skip_some; while i < codes_to_store { { let l: usize = code_length_bitdepth[(kStorageOrder[i as usize] as (usize))] as (usize); BrotliWriteBits(kHuffmanBitLengthHuffmanCodeBitLengths[l] as (u8), kHuffmanBitLengthHuffmanCodeSymbols[l] as u64, storage_ix, storage); } i = i.wrapping_add(1); } } } fn BrotliStoreHuffmanTreeToBitMask(huffman_tree_size: usize, huffman_tree: &[u8], huffman_tree_extra_bits: &[u8], code_length_bitdepth: &[u8], code_length_bitdepth_symbols: &[u16], storage_ix: &mut usize, storage: &mut [u8]) { let mut i: usize; i = 0usize; while i < huffman_tree_size { { let ix: usize = huffman_tree[(i as (usize))] as (usize); BrotliWriteBits(code_length_bitdepth[(ix as (usize))] as (u8), code_length_bitdepth_symbols[(ix as (usize))] as (u64), storage_ix, storage); if ix == 16usize { BrotliWriteBits(2, huffman_tree_extra_bits[(i as (usize))] as (u64), storage_ix, storage); } else if ix == 17usize { BrotliWriteBits(3, huffman_tree_extra_bits[(i as (usize))] as (u64), storage_ix, storage); } } i = i.wrapping_add(1 as (usize)); } } pub fn BrotliStoreHuffmanTree(depths: &[u8], num: usize, tree: &mut [HuffmanTree], storage_ix: &mut usize, storage: &mut [u8]) { let mut huffman_tree: [u8; 704] = [0; 704]; let mut huffman_tree_extra_bits: [u8; 704] = [0; 704]; let mut huffman_tree_size: usize = 0usize; let mut code_length_bitdepth: [u8; 18] = [0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8), 0i32 as (u8)]; let mut code_length_bitdepth_symbols: [u16; 18] = [0; 18]; let mut huffman_tree_histogram: [u32; 18] = [0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32]; let mut i: usize; let mut num_codes: i32 = 0i32; let mut code: usize = 0usize; 0i32; BrotliWriteHuffmanTree(depths, num, &mut huffman_tree_size, &mut huffman_tree[..], &mut huffman_tree_extra_bits[..]); i = 0usize; while i < huffman_tree_size { { let _rhs = 1; let _lhs = &mut huffman_tree_histogram[huffman_tree[i] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } i = i.wrapping_add(1 as (usize)); } i = 0usize; 'break3: while i < 18usize { { if huffman_tree_histogram[i] != 0 { if num_codes == 0i32 { code = i; num_codes = 1i32; } else if num_codes == 1i32 { num_codes = 2i32; { { break 'break3; } } } } } i = i.wrapping_add(1 as (usize)); } BrotliCreateHuffmanTree(&mut huffman_tree_histogram, 18usize, 5i32, tree, &mut code_length_bitdepth); BrotliConvertBitDepthsToSymbols(&mut code_length_bitdepth, 18usize, &mut code_length_bitdepth_symbols); BrotliStoreHuffmanTreeOfHuffmanTreeToBitMask(num_codes, &code_length_bitdepth, storage_ix, storage); if num_codes == 1i32 { code_length_bitdepth[code] = 0i32 as (u8); } BrotliStoreHuffmanTreeToBitMask(huffman_tree_size, &huffman_tree, &huffman_tree_extra_bits, &code_length_bitdepth, &code_length_bitdepth_symbols, storage_ix, storage); } fn StoreStaticCodeLengthCode(storage_ix: &mut usize, storage: &mut [u8]) { BrotliWriteBits(40, 0xffu32 as (u64) << 32i32 | 0x55555554u32 as (u64), storage_ix, storage); } pub struct SimpleSortHuffmanTree {} impl HuffmanComparator for SimpleSortHuffmanTree { fn Cmp(self: &Self, v0: &HuffmanTree, v1: &HuffmanTree) -> bool { return (*v0).total_count_ < (*v1).total_count_; } } pub fn BrotliBuildAndStoreHuffmanTreeFast>( m : &mut AllocHT, histogram : &[u32], histogram_total : usize, max_bits : usize, depth : &mut [u8], bits : &mut [u16], storage_ix : &mut usize, storage : &mut [u8] ){ let mut count: u64 = 0; let mut symbols: [u64; 4] = [0; 4]; let mut length: u64 = 0; let mut total: usize = histogram_total; while total != 0usize { if histogram[(length as (usize))] != 0 { if count < 4 { symbols[count as usize] = length; } count = count.wrapping_add(1); total = total.wrapping_sub(histogram[(length as (usize))] as (usize)); } length = length.wrapping_add(1); } if count <= 1 { BrotliWriteBits(4, 1, storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[0usize], storage_ix, storage); depth[symbols[0usize] as (usize)] = 0i32 as (u8); bits[symbols[0usize] as (usize)] = 0i32 as (u16); return ; } for depth_elem in depth[..(length as usize)].iter_mut() { *depth_elem = 0; // memset } { let max_tree_size: u64 = (2u64).wrapping_mul(length).wrapping_add(1); let mut tree = if max_tree_size != 0 { m.alloc_cell(max_tree_size as usize) } else { AllocHT::AllocatedMemory::default() // null }; let mut count_limit: u32; if !(0i32 == 0) { return; } count_limit = 1u32; 'break11: loop { { let mut node_index: u32 = 0u32; let mut l: u64; l = length; while l != 0 { l = l.wrapping_sub(1); if histogram[(l as (usize))] != 0 { if histogram[(l as (usize))] >= count_limit { InitHuffmanTree(&mut tree.slice_mut()[(node_index as (usize))], histogram[(l as (usize))], -1i32 as (i16), l as (i16)); } else { InitHuffmanTree(&mut tree.slice_mut()[(node_index as (usize))], count_limit, -1i32 as (i16), l as (i16)); } node_index = node_index.wrapping_add(1 as (u32)); } } { let n: i32 = node_index as (i32); let sentinel: HuffmanTree; let mut i: i32 = 0i32; let mut j: i32 = n + 1i32; let mut k: i32; SortHuffmanTreeItems(tree.slice_mut(), n as (usize), SimpleSortHuffmanTree {}); sentinel = NewHuffmanTree(!(0u32), -1i16, -1i16); tree.slice_mut()[(node_index.wrapping_add(1u32) as (usize))] = sentinel.clone(); tree.slice_mut()[(node_index as (usize))] = sentinel.clone(); node_index = node_index.wrapping_add(2u32); k = n - 1i32; while k > 0i32 { { let left: i32; let right: i32; if (tree.slice()[(i as (usize))]).total_count_ <= (tree.slice()[(j as (usize))]).total_count_ { left = i; i = i + 1; } else { left = j; j = j + 1; } if (tree.slice()[(i as (usize))]).total_count_ <= (tree.slice()[(j as (usize))]).total_count_ { right = i; i = i + 1; } else { right = j; j = j + 1; } let sum_total = (tree.slice()[(left as (usize))]) .total_count_ .wrapping_add((tree.slice()[(right as (usize))]).total_count_); let tree_ind = (node_index.wrapping_sub(1u32) as (usize)); (tree.slice_mut()[tree_ind]).total_count_ = sum_total; (tree.slice_mut()[tree_ind]).index_left_ = left as (i16); (tree.slice_mut()[tree_ind]).index_right_or_value_ = right as (i16); tree.slice_mut()[(node_index as (usize))] = sentinel.clone(); node_index = node_index.wrapping_add(1u32); } k = k - 1; } if BrotliSetDepth(2i32 * n - 1i32, tree.slice_mut(), depth, 14i32) { { break 'break11; } } } } count_limit = count_limit.wrapping_mul(2u32); } { m.free_cell(core::mem::replace(&mut tree, AllocHT::AllocatedMemory::default())); } } BrotliConvertBitDepthsToSymbols(depth, length as usize, bits); if count <= 4 { let mut i: u64; BrotliWriteBits(2, 1, storage_ix, storage); BrotliWriteBits(2, count.wrapping_sub(1) as u64, storage_ix, storage); i = 0; while i < count { { let mut j: u64; j = i.wrapping_add(1); while j < count { { if depth[(symbols[j as usize] as (usize))] as (i32) < depth[(symbols[i as usize] as (usize)) as usize] as (i32) { let brotli_swap_tmp: u64 = symbols[j as usize]; symbols[j as usize] = symbols[i as usize]; symbols[i as usize] = brotli_swap_tmp; } } j = j.wrapping_add(1); } } i = i.wrapping_add(1); } if count == 2 { BrotliWriteBits(max_bits as u8, symbols[0usize], storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[1usize], storage_ix, storage); } else if count == 3 { BrotliWriteBits(max_bits as u8, symbols[0usize], storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[1usize], storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[2usize], storage_ix, storage); } else { BrotliWriteBits(max_bits as u8, symbols[0usize], storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[1usize], storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[2usize], storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[3usize], storage_ix, storage); BrotliWriteBits(1, if depth[(symbols[0usize] as (usize))] as (i32) == 1i32 { 1i32 } else { 0i32 } as (u64), storage_ix, storage); } } else { let mut previous_value: u8 = 8i32 as (u8); let mut i: u64; StoreStaticCodeLengthCode(storage_ix, storage); i = 0; while i < length { let value: u8 = depth[(i as (usize))]; let mut reps: u64 = 1; let mut k: u64; k = i.wrapping_add(1); while k < length && (depth[(k as (usize))] as (i32) == value as (i32)) { { reps = reps.wrapping_add(1); } k = k.wrapping_add(1); } i = i.wrapping_add(reps); if value as (i32) == 0i32 { BrotliWriteBits(kZeroRepsDepth[reps as usize] as (u8), kZeroRepsBits[reps as usize] as u64, storage_ix, storage); } else { if previous_value as (i32) != value as (i32) { BrotliWriteBits(kCodeLengthDepth[value as (usize)] as (u8), kCodeLengthBits[value as (usize)] as (u64), storage_ix, storage); reps = reps.wrapping_sub(1); } if reps < 3 { while reps != 0 { reps = reps.wrapping_sub(1); BrotliWriteBits(kCodeLengthDepth[value as (usize)] as (u8), kCodeLengthBits[value as (usize)] as (u64), storage_ix, storage); } } else { reps = reps.wrapping_sub(3); BrotliWriteBits(kNonZeroRepsDepth[reps as usize] as (u8), kNonZeroRepsBits[reps as usize] as u64, storage_ix, storage); } previous_value = value; } } } } pub struct MetaBlockSplit + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator> { pub literal_split: BlockSplit, pub command_split: BlockSplit, pub distance_split: BlockSplit, pub literal_context_map: >::AllocatedMemory, pub literal_context_map_size: usize, pub distance_context_map: >::AllocatedMemory, pub distance_context_map_size: usize, pub literal_histograms: >::AllocatedMemory, pub literal_histograms_size: usize, pub command_histograms: >::AllocatedMemory, pub command_histograms_size: usize, pub distance_histograms: >::AllocatedMemory, pub distance_histograms_size: usize, } impl + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator> MetaBlockSplit { pub fn new() -> Self { return MetaBlockSplit { literal_split:BlockSplit::::new(), command_split:BlockSplit::::new(), distance_split:BlockSplit::::new(), literal_context_map : >::AllocatedMemory::default(), literal_context_map_size : 0, distance_context_map : >::AllocatedMemory::default(), distance_context_map_size : 0, literal_histograms : >::AllocatedMemory::default(), literal_histograms_size : 0, command_histograms : >::AllocatedMemory::default(), command_histograms_size : 0, distance_histograms : >::AllocatedMemory::default(), distance_histograms_size : 0, } } pub fn destroy(&mut self, alloc: &mut Alloc) { self.literal_split.destroy(alloc); self.command_split.destroy(alloc); self.distance_split.destroy(alloc); >::free_cell(alloc, core::mem::replace(&mut self.literal_context_map, >::AllocatedMemory::default())); self.literal_context_map_size = 0; >::free_cell(alloc, core::mem::replace(&mut self.distance_context_map, >::AllocatedMemory::default())); self.distance_context_map_size = 0; >::free_cell(alloc, core::mem::replace(&mut self.literal_histograms, >::AllocatedMemory::default())); self.literal_histograms_size = 0; >::free_cell(alloc, core::mem::replace(&mut self.command_histograms, >::AllocatedMemory::default())); self.command_histograms_size = 0; >::free_cell(alloc, core::mem::replace(&mut self.distance_histograms, >::AllocatedMemory::default())); self.distance_histograms_size = 0; } } #[derive(Clone, Copy)] pub struct BlockTypeCodeCalculator { pub last_type: usize, pub second_last_type: usize, } pub struct BlockSplitCode { pub type_code_calculator: BlockTypeCodeCalculator, pub type_depths: [u8; 258], pub type_bits: [u16; 258], pub length_depths: [u8; 26], pub length_bits: [u16; 26], } pub struct BlockEncoder<'a, Alloc: alloc::Allocator + alloc::Allocator> { /* pub alloc_u8 : AllocU8, pub alloc_u16 : AllocU16, pub alloc_u32 : AllocU32, pub alloc_ht : AllocHT,*/ pub histogram_length_: usize, pub num_block_types_: usize, pub block_types_: &'a [u8], pub block_lengths_: &'a [u32], pub num_blocks_: usize, pub block_split_code_: BlockSplitCode, pub block_ix_: usize, pub block_len_: usize, pub entropy_ix_: usize, pub depths_: >::AllocatedMemory, pub bits_: >::AllocatedMemory, } fn Log2FloorNonZero(mut n: u64) -> u32 { let mut result: u32 = 0u32; 'loop1: loop { if { n = n >> 1i32; n } != 0 { result = result.wrapping_add(1 as (u32)); continue 'loop1; } else { break 'loop1; } } result } fn BrotliEncodeMlen(length: u32, bits: &mut u64, numbits: &mut u32, nibblesbits: &mut u32) { let lg: u32 = (if length == 1u32 { 1u32 } else { Log2FloorNonZero(length.wrapping_sub(1u32) as (u32) as (u64)).wrapping_add(1u32) }) as (u32); let mnibbles: u32 = (if lg < 16u32 { 16u32 } else { lg.wrapping_add(3u32) }) .wrapping_div(4u32); assert!(length > 0); assert!(length <= (1 << 24)); assert!(lg <= 24); *nibblesbits = mnibbles.wrapping_sub(4u32); *numbits = mnibbles.wrapping_mul(4u32); *bits = length.wrapping_sub(1u32) as u64; } fn StoreCompressedMetaBlockHeader(is_final_block: i32, length: usize, storage_ix: &mut usize, storage: &mut [u8]) { let mut lenbits: u64 = 0; let mut nlenbits: u32 = 0; let mut nibblesbits: u32 = 0; BrotliWriteBits(1, is_final_block as (u64), storage_ix, storage); if is_final_block != 0 { BrotliWriteBits(1, 0, storage_ix, storage); } BrotliEncodeMlen(length as u32, &mut lenbits, &mut nlenbits, &mut nibblesbits); BrotliWriteBits(2, nibblesbits as u64, storage_ix, storage); BrotliWriteBits(nlenbits as u8, lenbits, storage_ix, storage); if is_final_block == 0 { BrotliWriteBits(1, 0, storage_ix, storage); } } fn NewBlockTypeCodeCalculator() -> BlockTypeCodeCalculator { return BlockTypeCodeCalculator { last_type: 1, second_last_type: 0, }; } fn NewBlockEncoder<'a, Alloc: alloc::Allocator + alloc::Allocator> (histogram_length: usize, num_block_types: usize, block_types: &'a [u8], block_lengths: &'a [u32], num_blocks: usize) -> BlockEncoder<'a, Alloc> { let block_len: usize; if num_blocks != 0 && block_lengths.len() != 0 { block_len = block_lengths[0] as usize; } else { block_len = 0; } return BlockEncoder:: { histogram_length_: histogram_length, num_block_types_: num_block_types, block_types_: block_types, block_lengths_: block_lengths, num_blocks_: num_blocks, block_split_code_: BlockSplitCode { type_code_calculator: NewBlockTypeCodeCalculator(), type_depths: [0; 258], type_bits: [0; 258], length_depths: [0; 26], length_bits: [0; 26], }, block_ix_: 0, block_len_: block_len, entropy_ix_: 0, depths_: >::AllocatedMemory::default(), bits_: >::AllocatedMemory::default(), }; } fn NextBlockTypeCode(calculator: &mut BlockTypeCodeCalculator, type_: u8) -> usize { let type_code: usize = (if type_ as (usize) == (*calculator).last_type.wrapping_add(1usize) { 1u32 } else if type_ as (usize) == (*calculator).second_last_type { 0u32 } else { (type_ as (u32)).wrapping_add(2u32) }) as (usize); (*calculator).second_last_type = (*calculator).last_type; (*calculator).last_type = type_ as (usize); type_code } fn BlockLengthPrefixCode(len: u32) -> u32 { let mut code: u32 = (if len >= 177u32 { if len >= 753u32 { 20i32 } else { 14i32 } } else if len >= 41u32 { 7i32 } else { 0i32 }) as (u32); while code < (26i32 - 1i32) as (u32) && (len >= kBlockLengthPrefixCode[code.wrapping_add(1u32) as (usize)].offset) { code = code.wrapping_add(1 as (u32)); } code } fn StoreVarLenUint8(n: u64, storage_ix: &mut usize, storage: &mut [u8]) { if n == 0 { BrotliWriteBits(1, 0, storage_ix, storage); } else { let nbits: u8 = Log2FloorNonZero(n) as (u8); BrotliWriteBits(1, 1, storage_ix, storage); BrotliWriteBits(3, nbits as u64, storage_ix, storage); BrotliWriteBits(nbits, n.wrapping_sub(1u64 << nbits), storage_ix, storage); } } fn StoreSimpleHuffmanTree(depths: &[u8], symbols: &mut [usize], num_symbols: usize, max_bits: usize, storage_ix: &mut usize, storage: &mut [u8]) { BrotliWriteBits(2, 1, storage_ix, storage); BrotliWriteBits(2, num_symbols.wrapping_sub(1) as u64, storage_ix, storage); { let mut i: usize; i = 0usize; while i < num_symbols { { let mut j: usize; j = i.wrapping_add(1usize); while j < num_symbols { { if depths[(symbols[(j as (usize))] as (usize))] as (i32) < depths[(symbols[(i as (usize))] as (usize))] as (i32) { let mut __brotli_swap_tmp: usize = symbols[(j as (usize))]; symbols[(j as (usize))] = symbols[(i as (usize))]; symbols[(i as (usize))] = __brotli_swap_tmp; } } j = j.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } } if num_symbols == 2usize { BrotliWriteBits(max_bits as u8, symbols[(0usize)] as u64, storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[(1usize)] as u64, storage_ix, storage); } else if num_symbols == 3usize { BrotliWriteBits(max_bits as u8, symbols[(0usize)] as u64, storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[(1usize)] as u64, storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[(2usize)] as u64, storage_ix, storage); } else { BrotliWriteBits(max_bits as u8, symbols[(0usize)] as u64, storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[(1usize)] as u64, storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[(2usize)] as u64, storage_ix, storage); BrotliWriteBits(max_bits as u8, symbols[(3usize)] as u64, storage_ix, storage); BrotliWriteBits(1, if depths[(symbols[(0usize)] as (usize))] as (i32) == 1i32 { 1i32 } else { 0i32 } as (u64), storage_ix, storage); } } fn BuildAndStoreHuffmanTree(histogram: &[u32], histogram_length: usize, alphabet_size: usize, tree: &mut [HuffmanTree], depth: &mut [u8], bits: &mut [u16], storage_ix: &mut usize, storage: &mut [u8]) { let mut count: usize = 0usize; let mut s4: [usize; 4] = [0usize, 0usize, 0usize, 0usize]; let mut i: usize; let mut max_bits: usize = 0usize; i = 0usize; 'break31: while i < histogram_length { { if histogram[(i as (usize))] != 0 { if count < 4usize { s4[count] = i; } else if count > 4usize { { break 'break31; } } count = count.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } { let mut max_bits_counter: usize = alphabet_size.wrapping_sub(1usize); while max_bits_counter != 0 { max_bits_counter = max_bits_counter >> 1i32; max_bits = max_bits.wrapping_add(1 as (usize)); } } if count <= 1usize { BrotliWriteBits(4, 1, storage_ix, storage); BrotliWriteBits(max_bits as u8, s4[0usize] as u64, storage_ix, storage); depth[(s4[0usize] as (usize))] = 0i32 as (u8); bits[(s4[0usize] as (usize))] = 0i32 as (u16); return; } for depth_elem in depth[..histogram_length].iter_mut() { *depth_elem = 0; // memset } BrotliCreateHuffmanTree(histogram, histogram_length, 15i32, tree, depth); BrotliConvertBitDepthsToSymbols(depth, histogram_length, bits); if count <= 4usize { StoreSimpleHuffmanTree(depth, &mut s4[..], count, max_bits, storage_ix, storage); } else { BrotliStoreHuffmanTree(depth, histogram_length, tree, storage_ix, storage); } } fn GetBlockLengthPrefixCode(len: u32, code: &mut usize, n_extra: &mut u32, extra: &mut u32) { *code = BlockLengthPrefixCode(len) as (usize); *n_extra = kBlockLengthPrefixCode[*code].nbits; *extra = len.wrapping_sub(kBlockLengthPrefixCode[*code].offset); } fn StoreBlockSwitch(code: &mut BlockSplitCode, block_len: u32, block_type: u8, is_first_block: i32, storage_ix: &mut usize, storage: &mut [u8]) { let typecode: usize = NextBlockTypeCode(&mut (*code).type_code_calculator, block_type); let mut lencode: usize = 0; let mut len_nextra: u32 = 0; let mut len_extra: u32 = 0; if is_first_block == 0 { BrotliWriteBits((*code).type_depths[typecode] as (u8), (*code).type_bits[typecode] as (u64), storage_ix, storage); } GetBlockLengthPrefixCode(block_len, &mut lencode, &mut len_nextra, &mut len_extra); BrotliWriteBits((*code).length_depths[lencode] as (u8), (*code).length_bits[lencode] as (u64), storage_ix, storage); BrotliWriteBits(len_nextra as (u8), len_extra as (u64), storage_ix, storage); } fn BuildAndStoreBlockSplitCode(types: &[u8], lengths: &[u32], num_blocks: usize, num_types: usize, tree: &mut [HuffmanTree], code: &mut BlockSplitCode, storage_ix: &mut usize, storage: &mut [u8]) { let mut type_histo: [u32; 258] = [0; 258]; let mut length_histo: [u32; 26] = [0; 26]; let mut i: usize; let mut type_code_calculator = NewBlockTypeCodeCalculator(); i = 0usize; while i < num_blocks { { let type_code: usize = NextBlockTypeCode(&mut type_code_calculator, types[(i as (usize))]); if i != 0usize { let _rhs = 1; let _lhs = &mut type_histo[type_code]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } { let _rhs = 1; let _lhs = &mut length_histo[BlockLengthPrefixCode(lengths[(i as (usize))]) as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } i = i.wrapping_add(1 as (usize)); } StoreVarLenUint8(num_types.wrapping_sub(1) as u64, storage_ix, storage); if num_types > 1usize { BuildAndStoreHuffmanTree(&mut type_histo[0usize..], num_types.wrapping_add(2usize), num_types.wrapping_add(2usize), tree, &mut (*code).type_depths[0usize..], &mut (*code).type_bits[0usize..], storage_ix, storage); BuildAndStoreHuffmanTree(&mut length_histo[0usize..], super::constants::BROTLI_NUM_BLOCK_LEN_SYMBOLS, // 26 super::constants::BROTLI_NUM_BLOCK_LEN_SYMBOLS, tree, &mut (*code).length_depths[0usize..], &mut (*code).length_bits[0usize..], storage_ix, storage); StoreBlockSwitch(code, lengths[(0usize)], types[(0usize)], 1i32, storage_ix, storage); } } fn BuildAndStoreBlockSwitchEntropyCodes<'a, Alloc: alloc::Allocator + alloc::Allocator> (xself: &mut BlockEncoder<'a, Alloc>, tree: &mut [HuffmanTree], storage_ix: &mut usize, storage: &mut [u8]) { BuildAndStoreBlockSplitCode((*xself).block_types_, (*xself).block_lengths_, (*xself).num_blocks_, (*xself).num_block_types_, tree, &mut (*xself).block_split_code_, storage_ix, storage); } fn StoreTrivialContextMap(num_types: usize, context_bits: usize, tree: &mut [HuffmanTree], storage_ix: &mut usize, storage: &mut [u8]) { StoreVarLenUint8(num_types.wrapping_sub(1usize) as u64, storage_ix, storage); if num_types > 1usize { let repeat_code: usize = context_bits.wrapping_sub(1u32 as (usize)); let repeat_bits: usize = (1u32 << repeat_code).wrapping_sub(1u32) as (usize); let alphabet_size: usize = num_types.wrapping_add(repeat_code); let mut histogram: [u32; 272] = [0; 272]; let mut depths: [u8; 272] = [0; 272]; let mut bits: [u16; 272] = [0; 272]; let mut i: usize; BrotliWriteBits(1u8, 1u64, storage_ix, storage); BrotliWriteBits(4u8, repeat_code.wrapping_sub(1usize) as u64, storage_ix, storage); histogram[repeat_code] = num_types as (u32); histogram[0usize] = 1u32; i = context_bits; while i < alphabet_size { { histogram[i] = 1u32; } i = i.wrapping_add(1 as (usize)); } BuildAndStoreHuffmanTree(&mut histogram[..], alphabet_size, alphabet_size, tree, &mut depths[..], &mut bits[..], storage_ix, storage); i = 0usize; while i < num_types { { let code: usize = if i == 0usize { 0usize } else { i.wrapping_add(context_bits).wrapping_sub(1usize) }; BrotliWriteBits(depths[code] as (u8), bits[code] as (u64), storage_ix, storage); BrotliWriteBits(depths[repeat_code] as (u8), bits[repeat_code] as (u64), storage_ix, storage); BrotliWriteBits(repeat_code as u8, repeat_bits as u64, storage_ix, storage); } i = i.wrapping_add(1 as (usize)); } BrotliWriteBits(1, 1, storage_ix, storage); } } fn IndexOf(v: &[u8], v_size: usize, value: u8) -> usize { let mut i: usize = 0usize; while i < v_size { { if v[(i as (usize))] as (i32) == value as (i32) { return i; } } i = i.wrapping_add(1 as (usize)); } i } fn MoveToFront(v: &mut [u8], index: usize) { let value: u8 = v[(index as (usize))]; let mut i: usize; i = index; while i != 0usize { { v[(i as (usize))] = v[(i.wrapping_sub(1usize) as (usize))]; } i = i.wrapping_sub(1 as (usize)); } v[(0usize)] = value; } fn MoveToFrontTransform(v_in: &[u32], v_size: usize, v_out: &mut [u32]) { let mut i: usize; let mut mtf: [u8; 256] = [0; 256]; let mut max_value: u32; if v_size == 0usize { return; } max_value = v_in[(0usize)]; i = 1usize; while i < v_size { { if v_in[(i as (usize))] > max_value { max_value = v_in[(i as (usize))]; } } i = i.wrapping_add(1 as (usize)); } 0i32; i = 0usize; while i <= max_value as (usize) { { mtf[i] = i as (u8); } i = i.wrapping_add(1 as (usize)); } { let mtf_size: usize = max_value.wrapping_add(1u32) as (usize); i = 0usize; while i < v_size { { let index: usize = IndexOf(&mtf[..], mtf_size, v_in[(i as (usize))] as (u8)); 0i32; v_out[(i as (usize))] = index as (u32); MoveToFront(&mut mtf[..], index); } i = i.wrapping_add(1 as (usize)); } } } fn brotli_max_uint32_t(a: u32, b: u32) -> u32 { if a > b { a } else { b } } fn brotli_min_uint32_t(a: u32, b: u32) -> u32 { if a < b { a } else { b } } fn RunLengthCodeZeros(in_size: usize, v: &mut [u32], out_size: &mut usize, max_run_length_prefix: &mut u32) { let mut max_reps: u32 = 0u32; let mut i: usize; let mut max_prefix: u32; i = 0usize; while i < in_size { let mut reps: u32 = 0u32; while i < in_size && (v[(i as (usize))] != 0u32) { i = i.wrapping_add(1 as (usize)); } while i < in_size && (v[(i as (usize))] == 0u32) { { reps = reps.wrapping_add(1 as (u32)); } i = i.wrapping_add(1 as (usize)); } max_reps = brotli_max_uint32_t(reps, max_reps); } max_prefix = if max_reps > 0u32 { Log2FloorNonZero(max_reps as (u64)) } else { 0u32 }; max_prefix = brotli_min_uint32_t(max_prefix, *max_run_length_prefix); *max_run_length_prefix = max_prefix; *out_size = 0usize; i = 0usize; while i < in_size { 0i32; if v[(i as (usize))] != 0u32 { v[(*out_size as (usize))] = (v[(i as (usize))]).wrapping_add(*max_run_length_prefix); i = i.wrapping_add(1 as (usize)); *out_size = (*out_size).wrapping_add(1 as (usize)); } else { let mut reps: u32 = 1u32; let mut k: usize; k = i.wrapping_add(1usize); while k < in_size && (v[(k as (usize))] == 0u32) { { reps = reps.wrapping_add(1 as (u32)); } k = k.wrapping_add(1 as (usize)); } i = i.wrapping_add(reps as (usize)); while reps != 0u32 { if reps < 2u32 << max_prefix { let run_length_prefix: u32 = Log2FloorNonZero(reps as (u64)); let extra_bits: u32 = reps.wrapping_sub(1u32 << run_length_prefix); v[(*out_size as (usize))] = run_length_prefix.wrapping_add(extra_bits << 9i32); *out_size = (*out_size).wrapping_add(1 as (usize)); { { break; } } } else { let extra_bits: u32 = (1u32 << max_prefix).wrapping_sub(1u32); v[(*out_size as (usize))] = max_prefix.wrapping_add(extra_bits << 9i32); reps = reps.wrapping_sub((2u32 << max_prefix).wrapping_sub(1u32)); *out_size = (*out_size).wrapping_add(1 as (usize)); } } } } } fn EncodeContextMap>(m: &mut AllocU32, context_map: &[u32], context_map_size: usize, num_clusters: usize, tree: &mut [HuffmanTree], storage_ix: &mut usize, storage: &mut [u8]) { let mut i: usize; let mut rle_symbols: AllocU32::AllocatedMemory; let mut max_run_length_prefix: u32 = 6u32; let mut num_rle_symbols: usize = 0usize; static kSymbolMask: u32 = (1u32 << 9i32) - 1; let mut depths: [u8; 272] = [0; 272]; let mut bits: [u16; 272] = [0; 272]; StoreVarLenUint8(num_clusters.wrapping_sub(1usize) as u64, storage_ix, storage); if num_clusters == 1usize { return; } rle_symbols = if context_map_size != 0 { m.alloc_cell(context_map_size) } else { AllocU32::AllocatedMemory::default() }; MoveToFrontTransform(context_map, context_map_size, rle_symbols.slice_mut()); RunLengthCodeZeros(context_map_size, rle_symbols.slice_mut(), &mut num_rle_symbols, &mut max_run_length_prefix); let mut histogram: [u32; 272] = [0; 272]; i = 0usize; while i < num_rle_symbols { { let _rhs = 1; let _lhs = &mut histogram[(rle_symbols.slice()[(i as (usize))] & kSymbolMask) as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } i = i.wrapping_add(1 as (usize)); } { let use_rle: i32 = if !!(max_run_length_prefix > 0u32) { 1i32 } else { 0i32 }; BrotliWriteBits(1, use_rle as (u64), storage_ix, storage); if use_rle != 0 { BrotliWriteBits(4, max_run_length_prefix.wrapping_sub(1u32) as (u64), storage_ix, storage); } } BuildAndStoreHuffmanTree(&mut histogram[..], num_clusters.wrapping_add(max_run_length_prefix as (usize)), num_clusters.wrapping_add(max_run_length_prefix as (usize)), tree, &mut depths[..], &mut bits[..], storage_ix, storage); i = 0usize; while i < num_rle_symbols { { let rle_symbol: u32 = rle_symbols.slice()[(i as (usize))] & kSymbolMask; let extra_bits_val: u32 = rle_symbols.slice()[(i as (usize))] >> 9i32; BrotliWriteBits(depths[rle_symbol as (usize)] as (u8), bits[rle_symbol as (usize)] as (u64), storage_ix, storage); if rle_symbol > 0u32 && (rle_symbol <= max_run_length_prefix) { BrotliWriteBits(rle_symbol as (u8), extra_bits_val as (u64), storage_ix, storage); } } i = i.wrapping_add(1 as (usize)); } BrotliWriteBits(1, 1, storage_ix, storage); m.free_cell(rle_symbols); } fn BuildAndStoreEntropyCodes + alloc::Allocator, HistogramType: SliceWrapper> (m: &mut Alloc, xself: &mut BlockEncoder, histograms: &[HistogramType], histograms_size: usize, alphabet_size: usize, tree: &mut [HuffmanTree], storage_ix: &mut usize, storage: &mut [u8]) { let table_size: usize = histograms_size.wrapping_mul(xself.histogram_length_); (*xself).depths_ = if table_size != 0 { >::alloc_cell(m, table_size) } else { >::AllocatedMemory::default() }; (*xself).bits_ = if table_size != 0 { >::alloc_cell(m, table_size) } else { >::AllocatedMemory::default() }; { let mut i: usize; i = 0usize; while i < histograms_size { { let ix: usize = i.wrapping_mul(xself.histogram_length_); BuildAndStoreHuffmanTree(&(histograms[(i as (usize))]).slice()[0..], xself.histogram_length_, alphabet_size, tree, &mut (*xself).depths_.slice_mut()[(ix as (usize))..], &mut (*xself).bits_.slice_mut()[(ix as (usize))..], storage_ix, storage); } i = i.wrapping_add(1 as (usize)); } } } fn StoreSymbol + alloc::Allocator> (xself: &mut BlockEncoder, symbol: usize, storage_ix: &mut usize, storage: &mut [u8]){ if (*xself).block_len_ == 0usize { let block_ix: usize = { (*xself).block_ix_ = (*xself).block_ix_.wrapping_add(1 as (usize)); (*xself).block_ix_ }; let block_len: u32 = (*xself).block_lengths_[(block_ix as (usize))]; let block_type: u8 = (*xself).block_types_[(block_ix as (usize))]; (*xself).block_len_ = block_len as (usize); (*xself).entropy_ix_ = (block_type as (usize)).wrapping_mul((*xself).histogram_length_); StoreBlockSwitch(&mut (*xself).block_split_code_, block_len, block_type, 0i32, storage_ix, storage); } (*xself).block_len_ = (*xself).block_len_.wrapping_sub(1 as (usize)); { let ix: usize = (*xself).entropy_ix_.wrapping_add(symbol); BrotliWriteBits((*xself).depths_.slice()[(ix as (usize))] as (u8), (*xself).bits_.slice()[(ix as (usize))] as (u64), storage_ix, storage); } } fn CommandCopyLenCode(xself: &Command) -> u32 { let modifier = xself.copy_len_ >> 25; let delta: i32 = ((modifier | ((modifier & 0x40) << 1)) as u8) as i8 as i32; ((xself.copy_len_ & 0x1ffffff) as i32 + delta) as u32 } fn GetInsertExtra(inscode: u16) -> u32 { kInsExtra[inscode as (usize)] } fn GetInsertBase(inscode: u16) -> u32 { kInsBase[inscode as (usize)] } fn GetCopyBase(copycode: u16) -> u32 { kCopyBase[copycode as (usize)] } fn GetCopyExtra(copycode: u16) -> u32 { kCopyExtra[copycode as (usize)] } fn StoreCommandExtra(cmd: &Command, storage_ix: &mut usize, storage: &mut [u8]) { let copylen_code: u32 = CommandCopyLenCode(cmd); let inscode: u16 = GetInsertLengthCode((*cmd).insert_len_ as (usize)); let copycode: u16 = GetCopyLengthCode(copylen_code as (usize)); let insnumextra: u32 = GetInsertExtra(inscode); let insextraval: u64 = (*cmd).insert_len_.wrapping_sub(GetInsertBase(inscode)) as (u64); let copyextraval: u64 = copylen_code.wrapping_sub(GetCopyBase(copycode)) as (u64); let bits: u64 = copyextraval << insnumextra | insextraval; BrotliWriteBits(insnumextra.wrapping_add(GetCopyExtra(copycode)) as (u8), bits, storage_ix, storage); } fn Context(p1: u8, p2: u8, mode: ContextType) -> u8 { match mode { ContextType::CONTEXT_LSB6 => { return (p1 as (i32) & 0x3fi32) as (u8); } ContextType::CONTEXT_MSB6 => { return (p1 as (i32) >> 2i32) as (u8); } ContextType::CONTEXT_UTF8 => { return (kUTF8ContextLookup[p1 as (usize)] as (i32) | kUTF8ContextLookup[(p2 as (i32) + 256i32) as (usize)] as (i32)) as (u8); } ContextType::CONTEXT_SIGNED => { return ((kSigned3BitContextLookup[p1 as (usize)] as (i32) << 3i32) + kSigned3BitContextLookup[p2 as (usize)] as (i32)) as (u8); } } // 0i32 as (u8) } fn StoreSymbolWithContext + alloc::Allocator>(xself: &mut BlockEncoder, symbol: usize, context: usize, context_map: &[u32], storage_ix: &mut usize, storage: &mut [u8], context_bits: usize){ if (*xself).block_len_ == 0usize { let block_ix: usize = { (*xself).block_ix_ = (*xself).block_ix_.wrapping_add(1 as (usize)); (*xself).block_ix_ }; let block_len: u32 = (*xself).block_lengths_[(block_ix as (usize))]; let block_type: u8 = (*xself).block_types_[(block_ix as (usize))]; (*xself).block_len_ = block_len as (usize); (*xself).entropy_ix_ = block_type as (usize) << context_bits; StoreBlockSwitch(&mut (*xself).block_split_code_, block_len, block_type, 0i32, storage_ix, storage); } (*xself).block_len_ = (*xself).block_len_.wrapping_sub(1 as (usize)); { let histo_ix: usize = context_map[((*xself).entropy_ix_.wrapping_add(context) as (usize))] as (usize); let ix: usize = histo_ix.wrapping_mul((*xself).histogram_length_).wrapping_add(symbol); BrotliWriteBits((*xself).depths_.slice()[(ix as (usize))] as (u8), (*xself).bits_.slice()[(ix as (usize))] as (u64), storage_ix, storage); } } fn CommandCopyLen(xself: &Command) -> u32 { (*xself).copy_len_ & 0xffffffu32 } fn CommandDistanceContext(xself: &Command) -> u32 { let r: u32 = ((*xself).cmd_prefix_ as (i32) >> 6i32) as (u32); let c: u32 = ((*xself).cmd_prefix_ as (i32) & 7i32) as (u32); if (r == 0u32 || r == 2u32 || r == 4u32 || r == 7u32) && (c <= 2u32) { return c; } 3u32 } fn CleanupBlockEncoder + alloc::Allocator>(m: &mut Alloc, xself: &mut BlockEncoder){ >::free_cell(m, core::mem::replace(&mut (*xself).depths_, >::AllocatedMemory::default())); >::free_cell(m, core::mem::replace(&mut (*xself).bits_, >::AllocatedMemory::default())); } pub fn JumpToByteBoundary(storage_ix: &mut usize, storage: &mut [u8]) { *storage_ix = (*storage_ix).wrapping_add(7u32 as (usize)) & !7u32 as (usize); storage[((*storage_ix >> 3i32) as (usize))] = 0i32 as (u8); } pub fn BrotliStoreMetaBlock<'a, Alloc: BrotliAlloc, Cb> (alloc: &mut Alloc, input: &'a[u8], start_pos: usize, length: usize, mask: usize, mut prev_byte: u8, mut prev_byte2: u8, is_last: i32, params: &BrotliEncoderParams, literal_context_mode: ContextType, distance_cache: &[i32; kNumDistanceCacheEntries], commands: &[Command], n_commands: usize, mb: &mut MetaBlockSplit, recoder_state: &mut RecoderState, storage_ix: &mut usize, storage: &mut [u8], callback: &mut Cb) where Cb: FnMut(&mut interface::PredictionModeContextMap, &mut[interface::StaticCommand], InputPair, &mut Alloc) { let (input0,input1) = InputPairFromMaskedInput(input, start_pos, length, mask); if params.log_meta_block { LogMetaBlock(alloc, commands.split_at(n_commands).0, input0, input1, distance_cache, recoder_state, block_split_reference(mb), params, Some(literal_context_mode), callback); } let mut pos: usize = start_pos; let mut i: usize; let num_distance_symbols = params.dist.alphabet_size; let mut num_effective_distance_symbols = num_distance_symbols as usize; let mut tree: >::AllocatedMemory; let _literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode); let mut literal_enc: BlockEncoder; let mut command_enc: BlockEncoder; let mut distance_enc: BlockEncoder; let dist = ¶ms.dist; if params.large_window && num_effective_distance_symbols > BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS { num_effective_distance_symbols = BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS; } StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage); tree = if 2i32 * 704i32 + 1i32 != 0 { >::alloc_cell(alloc, (2i32 * 704i32 + 1i32) as (usize)) } else { >::AllocatedMemory::default() }; literal_enc = NewBlockEncoder::(BROTLI_NUM_LITERAL_SYMBOLS, (*mb).literal_split.num_types, (*mb).literal_split.types.slice(), (*mb).literal_split.lengths.slice(), (*mb).literal_split.num_blocks); command_enc = NewBlockEncoder::(BROTLI_NUM_COMMAND_SYMBOLS, (*mb).command_split.num_types, (*mb).command_split.types.slice(), (*mb).command_split.lengths.slice(), (*mb).command_split.num_blocks); distance_enc = NewBlockEncoder::(num_effective_distance_symbols, (*mb).distance_split.num_types, (*mb).distance_split.types.slice(), (*mb).distance_split.lengths.slice(), (*mb).distance_split.num_blocks); BuildAndStoreBlockSwitchEntropyCodes(&mut literal_enc, tree.slice_mut(), storage_ix, storage); BuildAndStoreBlockSwitchEntropyCodes(&mut command_enc, tree.slice_mut(), storage_ix, storage); BuildAndStoreBlockSwitchEntropyCodes(&mut distance_enc, tree.slice_mut(), storage_ix, storage); BrotliWriteBits(2, dist.distance_postfix_bits as (u64), storage_ix, storage); BrotliWriteBits(4, (dist.num_direct_distance_codes >> dist.distance_postfix_bits) as (u64), storage_ix, storage); i = 0usize; while i < (*mb).literal_split.num_types { { BrotliWriteBits(2, literal_context_mode as (u64), storage_ix, storage); } i = i.wrapping_add(1 as (usize)); } if (*mb).literal_context_map_size == 0usize { StoreTrivialContextMap((*mb).literal_histograms_size, 6, tree.slice_mut(), storage_ix, storage); } else { EncodeContextMap(alloc, (*mb).literal_context_map.slice(), (*mb).literal_context_map_size, (*mb).literal_histograms_size, tree.slice_mut(), storage_ix, storage); } if (*mb).distance_context_map_size == 0usize { StoreTrivialContextMap((*mb).distance_histograms_size, 2usize, tree.slice_mut(), storage_ix, storage); } else { EncodeContextMap(alloc, (*mb).distance_context_map.slice(), (*mb).distance_context_map_size, (*mb).distance_histograms_size, tree.slice_mut(), storage_ix, storage); } BuildAndStoreEntropyCodes(alloc, &mut literal_enc, (*mb).literal_histograms.slice(), (*mb).literal_histograms_size, BROTLI_NUM_LITERAL_SYMBOLS, tree.slice_mut(), storage_ix, storage); BuildAndStoreEntropyCodes(alloc, &mut command_enc, (*mb).command_histograms.slice(), (*mb).command_histograms_size, BROTLI_NUM_COMMAND_SYMBOLS, tree.slice_mut(), storage_ix, storage); BuildAndStoreEntropyCodes(alloc, &mut distance_enc, (*mb).distance_histograms.slice(), (*mb).distance_histograms_size, num_distance_symbols as usize, tree.slice_mut(), storage_ix, storage); { >::free_cell(alloc, core::mem::replace(&mut tree, >::AllocatedMemory::default())); } i = 0usize; while i < n_commands { { let cmd: Command = commands[(i as (usize))].clone(); let cmd_code: usize = cmd.cmd_prefix_ as (usize); StoreSymbol(&mut command_enc, cmd_code, storage_ix, storage); StoreCommandExtra(&cmd, storage_ix, storage); if (*mb).literal_context_map_size == 0usize { let mut j: usize; j = cmd.insert_len_ as (usize); while j != 0usize { { StoreSymbol(&mut literal_enc, input[((pos & mask) as (usize))] as (usize), storage_ix, storage); pos = pos.wrapping_add(1 as (usize)); } j = j.wrapping_sub(1 as (usize)); } } else { let mut j: usize; j = cmd.insert_len_ as (usize); while j != 0usize { { let context: usize = Context(prev_byte, prev_byte2, literal_context_mode) as (usize); let literal: u8 = input[((pos & mask) as (usize))]; StoreSymbolWithContext(&mut literal_enc, literal as (usize), context, (*mb).literal_context_map.slice(), storage_ix, storage, 6usize); prev_byte2 = prev_byte; prev_byte = literal; pos = pos.wrapping_add(1 as (usize)); } j = j.wrapping_sub(1 as (usize)); } } pos = pos.wrapping_add(CommandCopyLen(&cmd) as (usize)); if CommandCopyLen(&cmd) != 0 { prev_byte2 = input[((pos.wrapping_sub(2usize) & mask) as (usize))]; prev_byte = input[((pos.wrapping_sub(1usize) & mask) as (usize))]; if cmd.cmd_prefix_ as (i32) >= 128i32 { let dist_code: usize = cmd.dist_prefix_ as (usize) & 0x3ff; let distnumextra: u32 = u32::from(cmd.dist_prefix_) >> 10i32; //FIXME: from command let distextra: u64 = cmd.dist_extra_ as (u64); if (*mb).distance_context_map_size == 0usize { StoreSymbol(&mut distance_enc, dist_code, storage_ix, storage); } else { let context: usize = CommandDistanceContext(&cmd) as (usize); StoreSymbolWithContext(&mut distance_enc, dist_code, context, (*mb).distance_context_map.slice(), storage_ix, storage, 2usize); } BrotliWriteBits(distnumextra as (u8), distextra, storage_ix, storage); } } } i = i.wrapping_add(1 as (usize)); } CleanupBlockEncoder(alloc, &mut distance_enc); CleanupBlockEncoder(alloc, &mut command_enc); CleanupBlockEncoder(alloc, &mut literal_enc); if is_last != 0 { JumpToByteBoundary(storage_ix, storage); } } fn BuildHistograms(input: &[u8], start_pos: usize, mask: usize, commands: &[Command], n_commands: usize, lit_histo: &mut HistogramLiteral, cmd_histo: &mut HistogramCommand, dist_histo: &mut HistogramDistance) { let mut pos: usize = start_pos; let mut i: usize; i = 0usize; while i < n_commands { { let cmd: Command = commands[(i as (usize))].clone(); let mut j: usize; HistogramAddItem(cmd_histo, cmd.cmd_prefix_ as (usize)); j = cmd.insert_len_ as (usize); while j != 0usize { { HistogramAddItem(lit_histo, input[((pos & mask) as (usize))] as (usize)); pos = pos.wrapping_add(1 as (usize)); } j = j.wrapping_sub(1 as (usize)); } pos = pos.wrapping_add(CommandCopyLen(&cmd) as (usize)); if CommandCopyLen(&cmd) != 0 && (cmd.cmd_prefix_ as (i32) >= 128i32) { HistogramAddItem(dist_histo, cmd.dist_prefix_ as (usize) & 0x3ff); } } i = i.wrapping_add(1 as (usize)); } } fn StoreDataWithHuffmanCodes(input: &[u8], start_pos: usize, mask: usize, commands: &[Command], n_commands: usize, lit_depth: &[u8], lit_bits: &[u16], cmd_depth: &[u8], cmd_bits: &[u16], dist_depth: &[u8], dist_bits: &[u16], storage_ix: &mut usize, storage: &mut [u8]) { let mut pos: usize = start_pos; let mut i: usize; i = 0usize; while i < n_commands { { let cmd: Command = commands[(i as (usize))].clone(); let cmd_code: usize = cmd.cmd_prefix_ as (usize); let mut j: usize; BrotliWriteBits(cmd_depth[(cmd_code as (usize))] as (u8), cmd_bits[(cmd_code as (usize))] as (u64), storage_ix, storage); StoreCommandExtra(&cmd, storage_ix, storage); j = cmd.insert_len_ as (usize); while j != 0usize { { let literal: u8 = input[((pos & mask) as (usize))]; BrotliWriteBits(lit_depth[(literal as (usize))] as (u8), lit_bits[(literal as (usize))] as (u64), storage_ix, storage); pos = pos.wrapping_add(1 as (usize)); } j = j.wrapping_sub(1 as (usize)); } pos = pos.wrapping_add(CommandCopyLen(&cmd) as (usize)); if CommandCopyLen(&cmd) != 0 && (cmd.cmd_prefix_ as (i32) >= 128i32) { let dist_code: usize = cmd.dist_prefix_ as (usize) & 0x3ff; let distnumextra: u32 = u32::from(cmd.dist_prefix_) >> 10i32; let distextra: u32 = cmd.dist_extra_; BrotliWriteBits(dist_depth[(dist_code as (usize))] as (u8), dist_bits[(dist_code as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(distnumextra as (u8), distextra as (u64), storage_ix, storage); } } i = i.wrapping_add(1 as (usize)); } } fn nop<'a>(_data:&[interface::Command]){ } pub fn BrotliStoreMetaBlockTrivial<'a, Alloc: BrotliAlloc, Cb> (alloc: &mut Alloc, input: &'a [u8], start_pos: usize, length: usize, mask: usize, is_last: i32, params: &BrotliEncoderParams, distance_cache: &[i32; kNumDistanceCacheEntries], commands: &[Command], n_commands: usize, recoder_state: &mut RecoderState, storage_ix: &mut usize, storage: &mut [u8], f:&mut Cb) where Cb: FnMut(&mut interface::PredictionModeContextMap, &mut [interface::StaticCommand], InputPair, &mut Alloc) { let (input0,input1) = InputPairFromMaskedInput(input, start_pos, length, mask); if params.log_meta_block { LogMetaBlock(alloc, commands.split_at(n_commands).0, input0, input1, distance_cache, recoder_state, block_split_nop(), params, Some(ContextType::CONTEXT_LSB6), f); } let mut lit_histo: HistogramLiteral = HistogramLiteral::default(); let mut cmd_histo: HistogramCommand = HistogramCommand::default(); let mut dist_histo: HistogramDistance = HistogramDistance::default(); let mut lit_depth: [u8; 256] = [0; 256]; let mut lit_bits: [u16; 256] = [0; 256]; let mut cmd_depth: [u8; 704] = [0; 704]; let mut cmd_bits: [u16; 704] = [0; 704]; let mut dist_depth: [u8; MAX_SIMPLE_DISTANCE_ALPHABET_SIZE] = [0; MAX_SIMPLE_DISTANCE_ALPHABET_SIZE]; let mut dist_bits: [u16; MAX_SIMPLE_DISTANCE_ALPHABET_SIZE] = [0; MAX_SIMPLE_DISTANCE_ALPHABET_SIZE]; const MAX_HUFFMAN_TREE_SIZE: usize = (2i32 * 704i32 + 1i32) as usize; let mut tree: [HuffmanTree; MAX_HUFFMAN_TREE_SIZE] = [HuffmanTree { total_count_: 0, index_left_: 0, index_right_or_value_: 0, }; MAX_HUFFMAN_TREE_SIZE]; let num_distance_symbols = params.dist.alphabet_size; StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage); BuildHistograms(input, start_pos, mask, commands, n_commands, &mut lit_histo, &mut cmd_histo, &mut dist_histo); BrotliWriteBits(13, 0, storage_ix, storage); BuildAndStoreHuffmanTree(lit_histo.slice_mut(), BROTLI_NUM_LITERAL_SYMBOLS, BROTLI_NUM_LITERAL_SYMBOLS, &mut tree[..], &mut lit_depth[..], &mut lit_bits[..], storage_ix, storage); BuildAndStoreHuffmanTree(cmd_histo.slice_mut(), BROTLI_NUM_COMMAND_SYMBOLS, BROTLI_NUM_COMMAND_SYMBOLS, &mut tree[..], &mut cmd_depth[..], &mut cmd_bits[..], storage_ix, storage); BuildAndStoreHuffmanTree(dist_histo.slice_mut(), MAX_SIMPLE_DISTANCE_ALPHABET_SIZE, num_distance_symbols as usize, &mut tree[..], &mut dist_depth[..], &mut dist_bits[..], storage_ix, storage); StoreDataWithHuffmanCodes(input, start_pos, mask, commands, n_commands, &mut lit_depth[..], &mut lit_bits[..], &mut cmd_depth[..], &mut cmd_bits[..], &mut dist_depth[..], &mut dist_bits[..], storage_ix, storage); if is_last != 0 { JumpToByteBoundary(storage_ix, storage); } } fn StoreStaticCommandHuffmanTree(storage_ix: &mut usize, storage: &mut [u8]) { BrotliWriteBits(56, 0x926244u32 as (u64) << 32i32 | 0x16307003, storage_ix, storage); BrotliWriteBits(3, 0x0u64, storage_ix, storage); } fn StoreStaticDistanceHuffmanTree(storage_ix: &mut usize, storage: &mut [u8]) { BrotliWriteBits(28, 0x369dc03u64, storage_ix, storage); } struct BlockSplitRef<'a> { types: &'a [u8], lengths:&'a [u32], num_types: u32, } impl<'a> Default for BlockSplitRef<'a> { fn default() -> Self { BlockSplitRef { types:&[], lengths:&[], num_types:1, } } } #[derive(Default)] struct MetaBlockSplitRefs<'a> { btypel : BlockSplitRef<'a>, literal_context_map:&'a [u32], btypec : BlockSplitRef<'a>, btyped : BlockSplitRef<'a>, distance_context_map:&'a [u32], } fn block_split_nop() -> MetaBlockSplitRefs<'static> { return MetaBlockSplitRefs::default() } fn block_split_reference<'a, Alloc: BrotliAlloc> (mb:&'a MetaBlockSplit) -> MetaBlockSplitRefs<'a> { return MetaBlockSplitRefs::<'a> { btypel:BlockSplitRef { types: mb.literal_split.types.slice().split_at(mb.literal_split.num_blocks).0, lengths:mb.literal_split.lengths.slice().split_at(mb.literal_split.num_blocks).0, num_types:mb.literal_split.num_types as u32, }, literal_context_map: mb.literal_context_map.slice().split_at(mb.literal_context_map_size).0, btypec:BlockSplitRef { types: mb.command_split.types.slice().split_at(mb.command_split.num_blocks).0, lengths:mb.command_split.lengths.slice().split_at(mb.command_split.num_blocks).0, num_types:mb.command_split.num_types as u32, }, btyped:BlockSplitRef { types: mb.distance_split.types.slice().split_at(mb.distance_split.num_blocks).0, lengths:mb.distance_split.lengths.slice().split_at(mb.distance_split.num_blocks).0, num_types:mb.distance_split.num_types as u32, }, distance_context_map: mb.distance_context_map.slice().split_at(mb.distance_context_map_size).0, } } #[derive(Clone, Copy)] pub struct RecoderState { pub num_bytes_encoded : usize, } impl RecoderState { pub fn new() -> Self { RecoderState{ num_bytes_encoded:0, } } } pub fn BrotliStoreMetaBlockFast( m : &mut Alloc, input: &[u8], start_pos: usize, length: usize, mask: usize, is_last: i32, params: &BrotliEncoderParams, dist_cache: &[i32; kNumDistanceCacheEntries], commands: &[Command], n_commands: usize, recoder_state: &mut RecoderState, storage_ix: &mut usize, storage: &mut [u8], cb: &mut Cb, ) where Cb: FnMut(&mut interface::PredictionModeContextMap, &mut [interface::StaticCommand], InputPair, &mut Alloc ) { let (input0,input1) = InputPairFromMaskedInput(input, start_pos, length, mask); if params.log_meta_block { LogMetaBlock(m, commands.split_at(n_commands).0, input0, input1, dist_cache, recoder_state, block_split_nop(), params, Some(ContextType::CONTEXT_LSB6), cb); } let num_distance_symbols = params.dist.alphabet_size; let distance_alphabet_bits = Log2FloorNonZero(u64::from(num_distance_symbols) - 1) + 1; StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage); BrotliWriteBits(13, 0, storage_ix, storage); if n_commands <= 128usize { let mut histogram: [u32; 256] = [0; 256]; let mut pos: usize = start_pos; let mut num_literals: usize = 0usize; let mut i: usize; let mut lit_depth: [u8; 256] = [0; 256]; let mut lit_bits: [u16; 256] = [0; 256]; i = 0usize; while i < n_commands { { let cmd: Command = commands[(i as (usize))].clone(); let mut j: usize; j = cmd.insert_len_ as (usize); while j != 0usize { { { let _rhs = 1; let _lhs = &mut histogram[input[((pos & mask) as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } pos = pos.wrapping_add(1 as (usize)); } j = j.wrapping_sub(1 as (usize)); } num_literals = num_literals.wrapping_add(cmd.insert_len_ as (usize)); pos = pos.wrapping_add(CommandCopyLen(&cmd) as (usize)); } i = i.wrapping_add(1 as (usize)); } BrotliBuildAndStoreHuffmanTreeFast(m, &mut histogram[..], num_literals, 8usize, &mut lit_depth[..], &mut lit_bits[..], storage_ix, storage); StoreStaticCommandHuffmanTree(storage_ix, storage); StoreStaticDistanceHuffmanTree(storage_ix, storage); StoreDataWithHuffmanCodes(input, start_pos, mask, commands, n_commands, &mut lit_depth[..], &mut lit_bits[..], &kStaticCommandCodeDepth[..], &kStaticCommandCodeBits[..], &kStaticDistanceCodeDepth[..], &kStaticDistanceCodeBits[..], storage_ix, storage); } else { let mut lit_histo: HistogramLiteral = HistogramLiteral::default(); let mut cmd_histo: HistogramCommand = HistogramCommand::default(); let mut dist_histo: HistogramDistance = HistogramDistance::default(); let mut lit_depth: [u8; 256] = [0; 256]; let mut lit_bits: [u16; 256] = [0; 256]; let mut cmd_depth: [u8; 704] = [0; 704]; let mut cmd_bits: [u16; 704] = [0; 704]; let mut dist_depth: [u8; MAX_SIMPLE_DISTANCE_ALPHABET_SIZE] = [0; MAX_SIMPLE_DISTANCE_ALPHABET_SIZE]; let mut dist_bits: [u16; MAX_SIMPLE_DISTANCE_ALPHABET_SIZE] = [0; MAX_SIMPLE_DISTANCE_ALPHABET_SIZE]; BuildHistograms(input, start_pos, mask, commands, n_commands, &mut lit_histo, &mut cmd_histo, &mut dist_histo); BrotliBuildAndStoreHuffmanTreeFast(m, lit_histo.slice(), lit_histo.total_count_, 8usize, &mut lit_depth[..], &mut lit_bits[..], storage_ix, storage); BrotliBuildAndStoreHuffmanTreeFast(m, cmd_histo.slice(), cmd_histo.total_count_, 10usize, &mut cmd_depth[..], &mut cmd_bits[..], storage_ix, storage); BrotliBuildAndStoreHuffmanTreeFast(m, dist_histo.slice(), dist_histo.total_count_, distance_alphabet_bits as usize, &mut dist_depth[..], &mut dist_bits[..], storage_ix, storage); StoreDataWithHuffmanCodes(input, start_pos, mask, commands, n_commands, &mut lit_depth[..], &mut lit_bits[..], &mut cmd_depth[..], &mut cmd_bits[..], &mut dist_depth[..], &mut dist_bits[..], storage_ix, storage); } if is_last != 0 { JumpToByteBoundary(storage_ix, storage); } } fn BrotliStoreUncompressedMetaBlockHeader(length: usize, storage_ix: &mut usize, storage: &mut [u8]) { let mut lenbits: u64 = 0; let mut nlenbits: u32 = 0; let mut nibblesbits: u32 = 0; BrotliWriteBits(1, 0, storage_ix, storage); BrotliEncodeMlen(length as u32, &mut lenbits, &mut nlenbits, &mut nibblesbits); BrotliWriteBits(2, nibblesbits as u64, storage_ix, storage); BrotliWriteBits(nlenbits as u8, lenbits as u64, storage_ix, storage); BrotliWriteBits(1, 1, storage_ix, storage); } fn InputPairFromMaskedInput<'a>(input:&'a [u8], position: usize, len: usize, mask:usize) -> (&'a [u8], &'a [u8]) { let masked_pos: usize = position & mask; if masked_pos.wrapping_add(len) > mask.wrapping_add(1usize) { let len1: usize = mask.wrapping_add(1usize).wrapping_sub(masked_pos); return (&input[masked_pos..(masked_pos + len1)], &input[0..len.wrapping_sub(len1)]); } return (&input[masked_pos..masked_pos + len], &[]); } pub fn BrotliStoreUncompressedMetaBlock (alloc: &mut Alloc, is_final_block: i32, input: &[u8], position: usize, mask: usize, params: &BrotliEncoderParams, len: usize, recoder_state: &mut RecoderState, storage_ix: &mut usize, storage: &mut [u8], suppress_meta_block_logging: bool, cb: &mut Cb) where Cb: FnMut(&mut interface::PredictionModeContextMap, &mut [interface::StaticCommand], InputPair, &mut Alloc){ let (input0,input1) = InputPairFromMaskedInput(input, position, len, mask); BrotliStoreUncompressedMetaBlockHeader(len, storage_ix, storage); JumpToByteBoundary(storage_ix, storage); let dst_start0 = ((*storage_ix >> 3i32) as (usize)); storage[dst_start0..(dst_start0 + input0.len())].clone_from_slice(input0); *storage_ix = (*storage_ix).wrapping_add(input0.len() << 3i32); let dst_start1 = ((*storage_ix >> 3i32) as (usize)); storage[dst_start1..(dst_start1 + input1.len())].clone_from_slice(input1); *storage_ix = (*storage_ix).wrapping_add(input1.len() << 3i32); BrotliWriteBitsPrepareStorage(*storage_ix, storage); if params.log_meta_block && !suppress_meta_block_logging { let cmds = [Command{insert_len_:len as u32, copy_len_:0, dist_extra_:0, cmd_prefix_:0, dist_prefix_:0 }]; LogMetaBlock(alloc, &cmds, input0, input1, &[0i32, 0i32, 0i32, 0i32], recoder_state, block_split_nop(), params, None, cb); } if is_final_block != 0 { BrotliWriteBits(1u8, 1u64, storage_ix, storage); BrotliWriteBits(1u8, 1u64, storage_ix, storage); JumpToByteBoundary(storage_ix, storage); } } pub fn BrotliStoreSyncMetaBlock(storage_ix: &mut usize, storage: &mut [u8]) { BrotliWriteBits(6, 6, storage_ix, storage); JumpToByteBoundary(storage_ix, storage); } pub fn BrotliWriteEmptyLastMetaBlock(storage_ix: &mut usize, storage: &mut [u8]) { BrotliWriteBits(1u8, 1u64, storage_ix, storage); BrotliWriteBits(1u8, 1u64, storage_ix, storage); JumpToByteBoundary(storage_ix, storage); } const MAX_SIZE_ENCODING:usize = 10; fn encode_base_128(mut value: u64)-> (usize, [u8;MAX_SIZE_ENCODING]) { let mut ret = [0u8; MAX_SIZE_ENCODING]; for index in 0..ret.len() { ret[index] = (value & 0x7f) as u8; value >>= 7; if value != 0 { ret[index] |= 0x80; } else { return (index + 1, ret) } } (ret.len(), ret) } pub fn BrotliWriteMetadataMetaBlock(params: &BrotliEncoderParams, storage_ix: &mut usize, storage: &mut [u8]) { BrotliWriteBits(1u8, 0u64, storage_ix, storage); // not last BrotliWriteBits(2u8, 3u64, storage_ix, storage); // MNIBBLES = 0 (pattern 1,1) BrotliWriteBits(1u8, 0u64, storage_ix, storage); // reserved BrotliWriteBits(2u8, 1u64, storage_ix, storage); // num bytes for length of magic number header let (size_hint_count, size_hint_b128) = encode_base_128(params.size_hint as u64); BrotliWriteBits(8u8, 3 + size_hint_count as u64, storage_ix, storage); // 1 byte of data: writing 12 for the magic number header JumpToByteBoundary(storage_ix, storage); let magic_number: [u8;3] = if params.catable && !params.use_dictionary { [0xe1, 0x97, 0x81] } else if params.appendable { [0xe1, 0x97, 0x82] } else { [0xe1, 0x97, 0x80] }; for magic in magic_number.iter() { BrotliWriteBits(8u8, u64::from(*magic), storage_ix, storage); } BrotliWriteBits(8u8, u64::from(VERSION), storage_ix, storage); for sh in size_hint_b128[..size_hint_count].iter() { BrotliWriteBits(8u8, u64::from(*sh), storage_ix, storage); } } mod test { use super::{encode_base_128, MAX_SIZE_ENCODING}; #[test] fn test_encode_base_128() { assert_eq!(encode_base_128(0), (1,[0u8;MAX_SIZE_ENCODING])); assert_eq!(encode_base_128(1), (1,[1,0,0,0,0,0,0,0,0,0])); assert_eq!(encode_base_128(127), (1,[0x7f,0,0,0,0,0,0,0,0,0])); assert_eq!(encode_base_128(128), (2,[0x80,0x1,0,0,0,0,0,0,0,0])); assert_eq!(encode_base_128(16383), (2,[0xff,0x7f,0,0,0,0,0,0,0,0])); assert_eq!(encode_base_128(16384), (3,[0x80,0x80,0x1,0,0,0,0,0,0,0])); assert_eq!(encode_base_128(2097151), (3,[0xff,0xff,0x7f,0,0,0,0,0,0,0])); assert_eq!(encode_base_128(2097152), (4,[0x80,0x80,0x80,0x1,0,0,0,0,0,0])); assert_eq!(encode_base_128(4194303), (4,[0xff,0xff,0xff,0x1,0,0,0,0,0,0])); assert_eq!(encode_base_128(4294967295), (5,[0xff,0xff,0xff,0xff,0xf,0,0,0,0,0])); assert_eq!(encode_base_128(4294967296), (5,[0x80,0x80,0x80,0x80,0x10,0,0,0,0,0])); assert_eq!(encode_base_128(9223372036854775808), (10,[0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x1])); assert_eq!(encode_base_128(18446744073709551615), (10,[0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1])); } } brotli-3.4.0/src/enc/cluster.rs000075500000000000000000000502721046102023000145170ustar 00000000000000#![allow(dead_code)] use super::bit_cost::BrotliPopulationCost; use super::histogram::{CostAccessors, HistogramSelfAddHistogram, HistogramAddHistogram, HistogramClear}; use super::util::FastLog2; use super::util::brotli_min_size_t; use alloc; use alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use core; #[derive(Clone,Copy)] pub struct HistogramPair { pub idx1: u32, pub idx2: u32, pub cost_combo: super::util::floatX, pub cost_diff: super::util::floatX, } impl Default for HistogramPair { #[inline(always)] fn default() -> HistogramPair { HistogramPair { idx1: 0, idx2: 0, cost_combo: 0.0 as super::util::floatX, cost_diff: 0.0 as super::util::floatX, } } } /* Returns entropy reduction of the context map when we combine two clusters. */ #[inline(always)] fn ClusterCostDiff(size_a: usize, size_b: usize) -> super::util::floatX { let size_c: usize = size_a.wrapping_add(size_b); size_a as (super::util::floatX) * FastLog2(size_a as u64) + size_b as (super::util::floatX) * FastLog2(size_b as u64) - size_c as (super::util::floatX) * FastLog2(size_c as u64) } #[inline(always)] fn brotli_max_double(a: super::util::floatX, b: super::util::floatX) -> super::util::floatX { if a > b {a} else {b} } #[inline(always)] fn HistogramPairIsLess(p1: &HistogramPair, p2: &HistogramPair) -> bool { if (*p1).cost_diff != (*p2).cost_diff { if !!((*p1).cost_diff > (*p2).cost_diff) { true } else { false } } else if !!((*p1).idx2.wrapping_sub((*p1).idx1) > (*p2).idx2.wrapping_sub((*p2).idx1)) { true } else { false } } /* Computes the bit cost reduction by combining out[idx1] and out[idx2] and if it is below a threshold, stores the pair (idx1, idx2) in the *pairs queue. */ fn BrotliCompareAndPushToQueue + SliceWrapper + CostAccessors + Clone>( out : &[HistogramType], cluster_size : &[u32], mut idx1 : u32, mut idx2 : u32, max_num_pairs : usize, scratch_space: &mut HistogramType::i32vec, pairs : &mut [HistogramPair], num_pairs : &mut usize ){ let mut is_good_pair: i32 = 0i32; let mut p: HistogramPair = HistogramPair { idx1: 0, idx2: 0, cost_combo: 0.0, cost_diff: 0.0, }; if idx1 == idx2 { } else { if idx2 < idx1 { let t: u32 = idx2; idx2 = idx1; idx1 = t; } p.idx1 = idx1; p.idx2 = idx2; p.cost_diff = 0.5 as super::util::floatX * ClusterCostDiff(cluster_size[idx1 as usize] as (usize), cluster_size[idx2 as usize] as (usize)); p.cost_diff = p.cost_diff - (out[idx1 as (usize)]).bit_cost(); p.cost_diff = p.cost_diff - (out[idx2 as (usize)]).bit_cost(); if (out[idx1 as (usize)]).total_count() == 0i32 as (usize) { p.cost_combo = (out[idx2 as (usize)]).bit_cost(); is_good_pair = 1i32; } else if (out[idx2 as (usize)]).total_count() == 0i32 as (usize) { p.cost_combo = (out[idx1 as (usize)]).bit_cost(); is_good_pair = 1i32; } else { let threshold: super::util::floatX = if *num_pairs == 0i32 as (usize) { 1e38 as super::util::floatX } else { brotli_max_double(0.0 as super::util::floatX, (pairs[0i32 as (usize)]).cost_diff) }; let cost_combo: super::util::floatX; let mut combo : HistogramType = out[idx1 as usize ].clone(); HistogramAddHistogram(&mut combo, &out[idx2 as usize]); cost_combo = BrotliPopulationCost(&combo, scratch_space); if cost_combo < threshold - p.cost_diff { p.cost_combo = cost_combo; is_good_pair = 1i32; } } if is_good_pair != 0 { p.cost_diff = p.cost_diff + p.cost_combo; if *num_pairs > 0i32 as (usize) && (HistogramPairIsLess(&pairs[0i32 as (usize)], &p) != false) { /* Replace the top of the queue if needed. */ if *num_pairs < max_num_pairs { pairs[*num_pairs as (usize)] = pairs[0i32 as (usize)]; *num_pairs = (*num_pairs).wrapping_add(1 as (usize)); } pairs[0i32 as (usize)] = p; } else if *num_pairs < max_num_pairs { pairs[*num_pairs as (usize)] = p; *num_pairs = (*num_pairs).wrapping_add(1 as (usize)); } } } } pub fn BrotliHistogramCombine + SliceWrapper + CostAccessors +Clone> (mut out: &mut [HistogramType], cluster_size: &mut [u32], symbols: &mut [u32], clusters: &mut [u32], mut pairs: &mut [HistogramPair], mut num_clusters: usize, symbols_size: usize, max_clusters: usize, max_num_pairs: usize, scratch_space: &mut HistogramType::i32vec) -> usize{ let mut cost_diff_threshold: super::util::floatX = 0.0 as super::util::floatX; let mut min_cluster_size: usize = 1usize; let mut num_pairs: usize = 0usize; { /* We maintain a vector of histogram pairs, with the property that the pair with the maximum bit cost reduction is the first. */ let mut idx1: usize; idx1 = 0usize; while idx1 < num_clusters { { let mut idx2: usize; idx2 = idx1.wrapping_add(1usize); while idx2 < num_clusters { { BrotliCompareAndPushToQueue(out, cluster_size, clusters[(idx1 as (usize))], clusters[(idx2 as (usize))], max_num_pairs, scratch_space, pairs, &mut num_pairs); } idx2 = idx2.wrapping_add(1 as (usize)); } } idx1 = idx1.wrapping_add(1 as (usize)); } } while num_clusters > min_cluster_size { let best_idx1: u32; let best_idx2: u32; let mut i: usize; if (pairs[(0usize)]).cost_diff >= cost_diff_threshold { cost_diff_threshold = 1e38 as super::util::floatX; min_cluster_size = max_clusters; { { continue; } } } /* Take the best pair from the top of heap. */ best_idx1 = (pairs[(0usize)]).idx1; best_idx2 = (pairs[(0usize)]).idx2; HistogramSelfAddHistogram(&mut out, (best_idx1 as (usize)), (best_idx2 as (usize))); (out[(best_idx1 as (usize))]).set_bit_cost((pairs[(0usize)]).cost_combo); { let _rhs = cluster_size[(best_idx2 as (usize))]; let _lhs = &mut cluster_size[(best_idx1 as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs); } i = 0usize; while i < symbols_size { { if symbols[(i as (usize))] == best_idx2 { symbols[(i as (usize))] = best_idx1; } } i = i.wrapping_add(1 as (usize)); } i = 0usize; 'break9: while i < num_clusters { { if clusters[(i as (usize))] == best_idx2 { for offset in 0..(num_clusters - i - 1) { clusters[i + offset] = clusters[i + 1 + offset]; } break 'break9; } } i = i.wrapping_add(1 as (usize)); } num_clusters = num_clusters.wrapping_sub(1 as (usize)); { /* Remove pairs intersecting the just combined best pair. */ let mut copy_to_idx: usize = 0usize; i = 0usize; while i < num_pairs { 'continue12: loop { { let p: HistogramPair = pairs[(i as (usize))]; if (p).idx1 == best_idx1 || (p).idx2 == best_idx1 || (p).idx1 == best_idx2 || (p).idx2 == best_idx2 { /* Remove invalid pair from the queue. */ { break 'continue12; } } if HistogramPairIsLess(&pairs[(0usize)], &p) != false { /* Replace the top of the queue if needed. */ let front: HistogramPair = pairs[(0usize)]; pairs[(0usize)] = p; pairs[(copy_to_idx as (usize))] = front; } else { pairs[(copy_to_idx as (usize))] = p; } copy_to_idx = copy_to_idx.wrapping_add(1 as (usize)); } break; } i = i.wrapping_add(1 as (usize)); } num_pairs = copy_to_idx; } i = 0usize; /* Push new pairs formed with the combined histogram to the heap. */ while i < num_clusters { { BrotliCompareAndPushToQueue(out, cluster_size, best_idx1, clusters[(i as (usize))], max_num_pairs, scratch_space, &mut pairs, &mut num_pairs); } i = i.wrapping_add(1 as (usize)); } } num_clusters } /* What is the bit cost of moving histogram from cur_symbol to candidate. */ #[inline(always)] pub fn BrotliHistogramBitCostDistance + SliceWrapper + CostAccessors + Clone> (histogram: &HistogramType, candidate: &HistogramType, scratch_space : &mut HistogramType::i32vec) -> super::util::floatX{ if (*histogram).total_count() == 0usize { 0.0 as super::util::floatX } else { let mut tmp: HistogramType = histogram.clone(); HistogramAddHistogram(&mut tmp, candidate); BrotliPopulationCost(&tmp, scratch_space) - (*candidate).bit_cost() } } /* Find the best 'out' histogram for each of the 'in' histograms. When called, clusters[0..num_clusters) contains the unique values from symbols[0..in_size), but this property is not preserved in this function. Note: we assume that out[]->bit_cost_ is already up-to-date. */ pub fn BrotliHistogramRemap + SliceWrapper + CostAccessors + Clone> (inp: &[HistogramType], in_size: usize, clusters: &[u32], num_clusters: usize, scratch_space: &mut HistogramType::i32vec, out: &mut [HistogramType], symbols: &mut [u32]){ let mut i: usize; i = 0usize; while i < in_size { { let mut best_out: u32 = if i == 0usize { symbols[(0usize)] } else { symbols[(i.wrapping_sub(1usize) as (usize))] }; let mut best_bits: super::util::floatX = BrotliHistogramBitCostDistance(&inp[(i as (usize))], &mut out[(best_out as (usize))], scratch_space); let mut j: usize; j = 0usize; while j < num_clusters { { let cur_bits: super::util::floatX = BrotliHistogramBitCostDistance(&inp[(i as (usize))], &mut out[(clusters[(j as (usize))] as (usize))], scratch_space); if cur_bits < best_bits { best_bits = cur_bits; best_out = clusters[(j as (usize))]; } } j = j.wrapping_add(1 as (usize)); } symbols[(i as (usize))] = best_out; } i = i.wrapping_add(1 as (usize)); } i = 0usize; /* Recompute each out based on raw and symbols. */ while i < num_clusters { { HistogramClear(&mut out[(clusters[(i as (usize))] as (usize))]); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < in_size { { HistogramAddHistogram(&mut out[(symbols[(i as (usize))] as (usize))], &inp[(i as (usize))]); } i = i.wrapping_add(1 as (usize)); } } /* Reorders elements of the out[0..length) array and changes values in symbols[0..length) array in the following way: * when called, symbols[] contains indexes into out[], and has N unique values (possibly N < length) * on return, symbols'[i] = f(symbols[i]) and out'[symbols'[i]] = out[symbols[i]], for each 0 <= i < length, where f is a bijection between the range of symbols[] and [0..N), and the first occurrences of values in symbols'[i] come in consecutive increasing order. Returns N, the number of unique values in symbols[]. */ pub fn BrotliHistogramReindex + SliceWrapper + CostAccessors+Clone, Alloc:alloc::Allocator + alloc::Allocator > (alloc: &mut Alloc, out: &mut [HistogramType], symbols: &mut [u32], length: usize) -> usize{ static kInvalidIndex: u32 = !(0u32); let mut new_index = if length != 0 { >::alloc_cell(alloc, length) } else { >::AllocatedMemory::default() }; let mut next_index: u32; let mut tmp: >::AllocatedMemory; let mut i: usize; i = 0usize; while i < length { { new_index.slice_mut()[(i as (usize))] = kInvalidIndex; } i = i.wrapping_add(1 as (usize)); } next_index = 0u32; i = 0usize; while i < length { { if new_index.slice()[(symbols[(i as (usize))] as (usize))] == kInvalidIndex { new_index.slice_mut()[(symbols[(i as (usize))] as (usize))] = next_index; next_index = next_index.wrapping_add(1 as (u32)); } } i = i.wrapping_add(1 as (usize)); } /* TODO: by using idea of "cycle-sort" we can avoid allocation of tmp and reduce the number of copying by the factor of 2. */ tmp = if next_index != 0 { >::alloc_cell(alloc, next_index as usize) } else { >::AllocatedMemory::default() }; next_index = 0u32; i = 0usize; while i < length { { if new_index.slice()[(symbols[(i as (usize))] as (usize))] == next_index { tmp.slice_mut()[(next_index as (usize))] = out[(symbols[(i as (usize))] as (usize))] .clone(); next_index = next_index.wrapping_add(1 as (u32)); } symbols[(i as (usize))] = new_index.slice()[(symbols[(i as (usize))] as (usize))]; } i = i.wrapping_add(1 as (usize)); } { >::free_cell(alloc, new_index); } i = 0usize; while i < next_index as (usize) { { out[(i as (usize))] = tmp.slice()[(i as (usize))].clone(); } i = i.wrapping_add(1 as (usize)); } { >::free_cell(alloc, tmp) } next_index as (usize) } pub fn BrotliClusterHistograms + SliceWrapper + CostAccessors+Clone, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator > (alloc: &mut Alloc, inp: &[HistogramType], in_size: usize, max_histograms: usize, scratch_space: &mut HistogramType::i32vec, out: &mut [HistogramType], out_size: &mut usize, histogram_symbols: &mut [u32]){ let mut cluster_size = if in_size != 0 { >::alloc_cell(alloc, in_size) } else { >::AllocatedMemory::default() }; let mut clusters = if in_size != 0 { >::alloc_cell(alloc, in_size) } else { >::AllocatedMemory::default() }; let mut num_clusters: usize = 0usize; let max_input_histograms: usize = 64usize; let pairs_capacity: usize = max_input_histograms.wrapping_mul(max_input_histograms) .wrapping_div(2usize); let mut pairs = >::alloc_cell(alloc, pairs_capacity.wrapping_add(1usize)); let mut i: usize; i = 0usize; while i < in_size { { cluster_size.slice_mut()[(i as (usize))] = 1u32; } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < in_size { { out[(i as (usize))] = inp[(i as (usize))].clone(); (out[(i as (usize))]).set_bit_cost(BrotliPopulationCost(&inp[(i as (usize))], scratch_space)); histogram_symbols[(i as (usize))] = i as (u32); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < in_size { { let num_to_combine: usize = brotli_min_size_t(in_size.wrapping_sub(i), max_input_histograms); let num_new_clusters: usize; let mut j: usize; j = 0usize; while j < num_to_combine { { clusters.slice_mut()[(num_clusters.wrapping_add(j) as (usize))] = i.wrapping_add(j) as (u32); } j = j.wrapping_add(1 as (usize)); } num_new_clusters = BrotliHistogramCombine(out, cluster_size.slice_mut(), &mut histogram_symbols[(i as (usize))..], &mut clusters.slice_mut()[(num_clusters as (usize))..], pairs.slice_mut(), num_to_combine, num_to_combine, max_histograms, pairs_capacity, scratch_space); num_clusters = num_clusters.wrapping_add(num_new_clusters); } i = i.wrapping_add(max_input_histograms); } { let max_num_pairs: usize = brotli_min_size_t((64usize).wrapping_mul(num_clusters), num_clusters.wrapping_div(2usize) .wrapping_mul(num_clusters)); { if pairs_capacity < max_num_pairs.wrapping_add(1usize) { let mut _new_size: usize = if pairs_capacity == 0usize { max_num_pairs.wrapping_add(1usize) } else { pairs_capacity }; let mut new_array: >::AllocatedMemory; while _new_size < max_num_pairs.wrapping_add(1usize) { _new_size = _new_size.wrapping_mul(2usize); } new_array = if _new_size != 0 { >::alloc_cell(alloc, _new_size) } else { >::AllocatedMemory::default() }; new_array.slice_mut()[..pairs_capacity].clone_from_slice(&pairs.slice()[..pairs_capacity]); >::free_cell(alloc, core::mem::replace(&mut pairs, new_array)); } } num_clusters = BrotliHistogramCombine(out, cluster_size.slice_mut(), histogram_symbols, clusters.slice_mut(), pairs.slice_mut(), num_clusters, in_size, max_histograms, max_num_pairs, scratch_space); } >::free_cell(alloc, pairs); >::free_cell(alloc, cluster_size); BrotliHistogramRemap(inp, in_size, clusters.slice(), num_clusters, scratch_space, out, histogram_symbols); >::free_cell(alloc, clusters); *out_size = BrotliHistogramReindex(alloc, out, histogram_symbols, in_size); } /////////// DONE ////////////////////////// brotli-3.4.0/src/enc/combined_alloc.rs000064400000000000000000000434721046102023000157710ustar 00000000000000pub use alloc::Allocator; use super::command::Command; use super::util::floatX; use super::v8; use super::s16; use super::PDF; use super::interface::StaticCommand; use super::histogram::{ HistogramLiteral, HistogramCommand, HistogramDistance, ContextType, }; use super::cluster::HistogramPair; use super::entropy_encode::HuffmanTree; use super::hash_to_binary_tree::ZopfliNode; #[cfg(feature="std")] use alloc_stdlib::StandardAlloc; /* struct CombiningAllocator, AllocT2:Allocator>(AllocT1, AllocT2); impl , AllocT2:Allocator> CombiningAllocator { pub fn new(a: AllocT1, b: AllocT2) -> Self { CombiningAllocator(a, b) } } impl , AllocT2:Allocator> Allocator for CombiningAllocator { } impl , AllocT2:Allocator> Allocator for CombiningAllocator { } */ pub trait BrotliAlloc:Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator{ } #[cfg(feature="std")] impl BrotliAlloc for StandardAlloc{} pub struct CombiningAllocator, AllocU16:Allocator, AllocI32:Allocator, AllocU32:Allocator, AllocU64:Allocator, AllocCommand:Allocator, AllocFloatX:Allocator, AllocV8:Allocator, AllocS16:Allocator, AllocPDF:Allocator, AllocStaticCommand:Allocator, AllocHistogramLiteral:Allocator, AllocHistogramCommand:Allocator, AllocHistogramDistance:Allocator, AllocHistogramPair:Allocator, AllocContextType:Allocator, AllocHuffmanTree:Allocator, AllocZopfliNode:Allocator, >{ alloc_u8: AllocU8, alloc_u16: AllocU16, alloc_i32: AllocI32, alloc_u32: AllocU32, alloc_u64: AllocU64, alloc_c: AllocCommand, alloc_f: AllocFloatX, alloc_f32x8: AllocV8, alloc_i16x16: AllocS16, alloc_pdf: AllocPDF, alloc_sc: AllocStaticCommand, alloc_hl: AllocHistogramLiteral, alloc_hc: AllocHistogramCommand, alloc_hd: AllocHistogramDistance, alloc_hp: AllocHistogramPair, alloc_ct: AllocContextType, alloc_ht: AllocHuffmanTree, alloc_zn: AllocZopfliNode, } impl, AllocU16:Allocator, AllocI32:Allocator, AllocU32:Allocator, AllocU64:Allocator, AllocCommand:Allocator, AllocFloatX:Allocator, AllocV8:Allocator, AllocS16:Allocator, AllocPDF:Allocator, AllocStaticCommand:Allocator, AllocHistogramLiteral:Allocator, AllocHistogramCommand:Allocator, AllocHistogramDistance:Allocator, AllocHistogramPair:Allocator, AllocContextType:Allocator, AllocHuffmanTree:Allocator, AllocZopfliNode:Allocator, > CombiningAllocator { pub fn new(alloc_u8: AllocU8, alloc_u16: AllocU16, alloc_i32: AllocI32, alloc_u32: AllocU32, alloc_u64: AllocU64, alloc_c: AllocCommand, alloc_f: AllocFloatX, alloc_f32x8: AllocV8, alloc_i16x16: AllocS16, alloc_pdf: AllocPDF, alloc_sc: AllocStaticCommand, alloc_hl: AllocHistogramLiteral, alloc_hc: AllocHistogramCommand, alloc_hd: AllocHistogramDistance, alloc_hp: AllocHistogramPair, alloc_ct: AllocContextType, alloc_ht: AllocHuffmanTree, alloc_zn: AllocZopfliNode) -> Self { CombiningAllocator{ alloc_u8: alloc_u8, alloc_u16: alloc_u16, alloc_i32: alloc_i32, alloc_u32: alloc_u32, alloc_u64: alloc_u64, alloc_c: alloc_c, alloc_f: alloc_f, alloc_f32x8: alloc_f32x8, alloc_i16x16: alloc_i16x16, alloc_pdf: alloc_pdf, alloc_sc: alloc_sc, alloc_hl: alloc_hl, alloc_hc: alloc_hc, alloc_hd: alloc_hd, alloc_hp: alloc_hp, alloc_ct: alloc_ct, alloc_ht: alloc_ht, alloc_zn: alloc_zn, } } } impl, AllocU16:Allocator, AllocI32:Allocator, AllocU32:Allocator, AllocU64:Allocator, AllocCommand:Allocator, AllocFloatX:Allocator, AllocV8:Allocator, AllocS16:Allocator, AllocPDF:Allocator, AllocStaticCommand:Allocator, AllocHistogramLiteral:Allocator, AllocHistogramCommand:Allocator, AllocHistogramDistance:Allocator, AllocHistogramPair:Allocator, AllocContextType:Allocator, AllocHuffmanTree:Allocator, AllocZopfliNode:Allocator, > BrotliAlloc for CombiningAllocator { } impl+Default, AllocU16:Allocator+Default, AllocI32:Allocator+Default, AllocU32:Allocator+Default, AllocU64:Allocator+Default, AllocCommand:Allocator+Default, AllocFloatX:Allocator+Default, AllocV8:Allocator+Default, AllocS16:Allocator+Default, AllocPDF:Allocator+Default, AllocStaticCommand:Allocator+Default, AllocHistogramLiteral:Allocator+Default, AllocHistogramCommand:Allocator+Default, AllocHistogramDistance:Allocator+Default, AllocHistogramPair:Allocator+Default, AllocContextType:Allocator+Default, AllocHuffmanTree:Allocator+Default, AllocZopfliNode:Allocator+Default, > Default for CombiningAllocator { fn default() -> Self { CombiningAllocator{ alloc_u8: AllocU8::default(), alloc_u16: AllocU16::default(), alloc_i32: AllocI32::default(), alloc_u32: AllocU32::default(), alloc_u64: AllocU64::default(), alloc_c: AllocCommand::default(), alloc_f: AllocFloatX::default(), alloc_f32x8:AllocV8::default(), alloc_i16x16:AllocS16::default(), alloc_pdf: AllocPDF::default(), alloc_sc: AllocStaticCommand::default(), alloc_hl: AllocHistogramLiteral::default(), alloc_hc: AllocHistogramCommand::default(), alloc_hd: AllocHistogramDistance::default(), alloc_hp: AllocHistogramPair::default(), alloc_ct: AllocContextType::default(), alloc_ht: AllocHuffmanTree::default(), alloc_zn: AllocZopfliNode::default(), } } } impl+Clone, AllocU16:Allocator+Clone, AllocI32:Allocator+Clone, AllocU32:Allocator+Clone, AllocU64:Allocator+Clone, AllocCommand:Allocator+Clone, AllocFloatX:Allocator+Clone, AllocV8:Allocator+Clone, AllocS16:Allocator+Clone, AllocPDF:Allocator+Clone, AllocStaticCommand:Allocator+Clone, AllocHistogramLiteral:Allocator+Clone, AllocHistogramCommand:Allocator+Clone, AllocHistogramDistance:Allocator+Clone, AllocHistogramPair:Allocator+Clone, AllocContextType:Allocator+Clone, AllocHuffmanTree:Allocator+Clone, AllocZopfliNode:Allocator+Clone, > Clone for CombiningAllocator { fn clone(&self) -> Self { CombiningAllocator{ alloc_u8: self.alloc_u8.clone(), alloc_u16: self.alloc_u16.clone(), alloc_i32: self.alloc_i32.clone(), alloc_u32: self.alloc_u32.clone(), alloc_u64: self.alloc_u64.clone(), alloc_c: self.alloc_c.clone(), alloc_f: self.alloc_f.clone(), alloc_f32x8:self.alloc_f32x8.clone(), alloc_i16x16:self.alloc_i16x16.clone(), alloc_pdf: self.alloc_pdf.clone(), alloc_sc: self.alloc_sc.clone(), alloc_hl: self.alloc_hl.clone(), alloc_hc: self.alloc_hc.clone(), alloc_hd: self.alloc_hd.clone(), alloc_hp: self.alloc_hp.clone(), alloc_ct: self.alloc_ct.clone(), alloc_ht: self.alloc_ht.clone(), alloc_zn: self.alloc_zn.clone(), } } } impl+Copy, AllocU16:Allocator+Copy, AllocI32:Allocator+Copy, AllocU32:Allocator+Copy, AllocU64:Allocator+Copy, AllocCommand:Allocator+Copy, AllocFloatX:Allocator+Copy, AllocV8:Allocator+Copy, AllocS16:Allocator+Copy, AllocPDF:Allocator+Copy, AllocStaticCommand:Allocator+Copy, AllocHistogramLiteral:Allocator+Copy, AllocHistogramCommand:Allocator+Copy, AllocHistogramDistance:Allocator+Copy, AllocHistogramPair:Allocator+Copy, AllocContextType:Allocator+Copy, AllocHuffmanTree:Allocator+Copy, AllocZopfliNode:Allocator+Copy, > Copy for CombiningAllocator { } macro_rules! implement_allocator { ($bound_name: ty, $type_name: ty, $sub_type_name: ty, $local_name: ident) => { impl, AllocU16:Allocator, AllocI32:Allocator, AllocU32:Allocator, AllocU64:Allocator, AllocCommand:Allocator, AllocFloatX:Allocator, AllocV8:Allocator, AllocS16:Allocator, AllocPDF:Allocator, AllocStaticCommand:Allocator, AllocHistogramLiteral:Allocator, AllocHistogramCommand:Allocator, AllocHistogramDistance:Allocator, AllocHistogramPair:Allocator, AllocContextType:Allocator, AllocHuffmanTree:Allocator, AllocZopfliNode:Allocator, > Allocator<$type_name> for CombiningAllocator { type AllocatedMemory = $sub_type_name; fn alloc_cell(&mut self, size: usize) -> >::AllocatedMemory { self.$local_name.alloc_cell(size) } fn free_cell(&mut self, data: >::AllocatedMemory) { self.$local_name.free_cell(data) } } }; } implement_allocator!(AllocU8, u8, AllocU8::AllocatedMemory, alloc_u8); implement_allocator!(AllocU16, u16, AllocU16::AllocatedMemory, alloc_u16); implement_allocator!(AllocI32, i32, AllocI32::AllocatedMemory, alloc_i32); implement_allocator!(AllocU32, u32, AllocU32::AllocatedMemory, alloc_u32); implement_allocator!(AllocU64, u64, AllocU64::AllocatedMemory, alloc_u64); implement_allocator!(AllocCommand, Command, AllocCommand::AllocatedMemory, alloc_c); implement_allocator!(AllocFloatX, floatX, AllocFloatX::AllocatedMemory, alloc_f); implement_allocator!(AllocV8, v8, AllocV8::AllocatedMemory, alloc_f32x8); implement_allocator!(AllocS16, s16, AllocS16::AllocatedMemory, alloc_i16x16); implement_allocator!(AllocPDF, PDF, AllocPDF::AllocatedMemory, alloc_pdf); implement_allocator!(AllocStaticCommand, StaticCommand, AllocStaticCommand::AllocatedMemory, alloc_sc); implement_allocator!(AllocHistogramLiteral, HistogramLiteral, AllocHistogramLiteral::AllocatedMemory, alloc_hl); implement_allocator!(AllocHistogramCommand, HistogramCommand, AllocHistogramCommand::AllocatedMemory, alloc_hc); implement_allocator!(AllocHistogramDistance, HistogramDistance, AllocHistogramDistance::AllocatedMemory, alloc_hd); implement_allocator!(AllocHistogramPair, HistogramPair, AllocHistogramPair::AllocatedMemory, alloc_hp); implement_allocator!(AllocContextType, ContextType, AllocContextType::AllocatedMemory, alloc_ct); implement_allocator!(AllocHuffmanTree, HuffmanTree, AllocHuffmanTree::AllocatedMemory, alloc_ht); implement_allocator!(AllocZopfliNode, ZopfliNode, AllocZopfliNode::AllocatedMemory, alloc_zn); brotli-3.4.0/src/enc/command.rs000075500000000000000000000357431046102023000144620ustar 00000000000000 use super::util::Log2FloorNonZero; use super::encode::BROTLI_NUM_DISTANCE_SHORT_CODES; #[derive(Copy,Clone, Debug)] pub struct BrotliDistanceParams { pub distance_postfix_bits : u32, pub num_direct_distance_codes : u32, pub alphabet_size : u32, pub max_distance : usize, } #[derive(Clone, Copy, Debug)] pub struct Command { // stores copy_len in low 25 bits and copy_code - copy_len in high 7 bit pub insert_len_: u32, pub copy_len_: u32, //stores distance_extra bits pub dist_extra_: u32, pub cmd_prefix_: u16, // stores distance code in low 10 bits and num extra bits in high 6 bits pub dist_prefix_: u16, } impl Default for Command { fn default() -> Command { Command { insert_len_: 0, copy_len_: 0, dist_extra_: 0, cmd_prefix_: 0, dist_prefix_: 0, } } } pub fn CommandCopyLen(xself: &Command) -> u32 { (*xself).copy_len_ & 0x1ffffffi32 as (u32) } pub fn CommandDistanceContext(xself: &Command) -> u32 { let r: u32 = ((*xself).cmd_prefix_ as (i32) >> 6i32) as (u32); let c: u32 = ((*xself).cmd_prefix_ as (i32) & 7i32) as (u32); if (r == 0i32 as (u32) || r == 2i32 as (u32) || r == 4i32 as (u32) || r == 7i32 as (u32)) && (c <= 2i32 as (u32)) { c } else { 3i32 as (u32) } } #[inline(always)] pub fn ComputeDistanceCode(distance: usize, max_distance: usize, dist_cache: &[i32]) -> usize { if distance <= max_distance { let distance_plus_3: usize = distance.wrapping_add(3usize); let offset0: usize = distance_plus_3.wrapping_sub(dist_cache[(0usize)] as (usize)); let offset1: usize = distance_plus_3.wrapping_sub(dist_cache[(1usize)] as (usize)); if distance == dist_cache[(0usize)] as (usize) { return 0usize; } else if distance == dist_cache[(1usize)] as (usize) { return 1usize; } else if offset0 < 7usize { return (0x9750468i32 >> (4usize).wrapping_mul(offset0) & 0xfi32) as (usize); } else if offset1 < 7usize { return (0xfdb1acei32 >> (4usize).wrapping_mul(offset1) & 0xfi32) as (usize); } else if distance == dist_cache[(2usize)] as (usize) { return 2usize; } else if distance == dist_cache[(3usize)] as (usize) { return 3usize; } } distance.wrapping_add(16usize).wrapping_sub(1usize) } #[inline(always)] pub fn GetInsertLengthCode(insertlen: usize) -> u16 { if insertlen < 6usize { insertlen as (u16) } else if insertlen < 130usize { let nbits: u32 = Log2FloorNonZero(insertlen.wrapping_sub(2) as u64).wrapping_sub(1u32); ((nbits << 1i32) as (usize)) .wrapping_add(insertlen.wrapping_sub(2usize) >> nbits) .wrapping_add(2usize) as (u16) } else if insertlen < 2114usize { Log2FloorNonZero(insertlen.wrapping_sub(66usize) as u64).wrapping_add(10u32) as (u16) } else if insertlen < 6210usize { 21u32 as (u16) } else if insertlen < 22594usize { 22u32 as (u16) } else { 23u32 as (u16) } } #[inline(always)] pub fn GetCopyLengthCode(copylen: usize) -> u16 { if copylen < 10usize { copylen.wrapping_sub(2usize) as (u16) } else if copylen < 134usize { let nbits: u32 = Log2FloorNonZero(copylen.wrapping_sub(6usize) as u64).wrapping_sub(1u32); ((nbits << 1i32) as (usize)) .wrapping_add(copylen.wrapping_sub(6usize) >> nbits) .wrapping_add(4usize) as (u16) } else if copylen < 2118usize { Log2FloorNonZero(copylen.wrapping_sub(70usize) as u64).wrapping_add(12u32) as (u16) } else { 23u32 as (u16) } } #[inline(always)] pub fn CombineLengthCodes(inscode: u16, copycode: u16, use_last_distance: i32) -> u16 { let bits64: u16 = (copycode as (u32) & 0x7u32 | (inscode as (u32) & 0x7u32) << 3i32) as (u16); if use_last_distance != 0 && (inscode as (i32) < 8i32) && (copycode as (i32) < 16i32) { if copycode as (i32) < 8i32 { bits64 } else { let s64: u16 = 64i32 as (u16); (bits64 as (i32) | s64 as (i32)) as (u16) } } else { let sub_offset: i32 = 2i32 * ((copycode as (i32) >> 3i32) + 3i32 * (inscode as (i32) >> 3i32)); let offset = (sub_offset << 5i32) + 0x40i32 + (0x520d40i32 >> sub_offset & 0xc0i32); (offset as (u16) as (i32) | bits64 as (i32)) as (u16) } } #[inline(always)] pub fn GetLengthCode(insertlen: usize, copylen: usize, use_last_distance: i32, code: &mut u16) { let inscode: u16 = GetInsertLengthCode(insertlen); let copycode: u16 = GetCopyLengthCode(copylen); *code = CombineLengthCodes(inscode, copycode, use_last_distance); } pub fn PrefixEncodeCopyDistance(distance_code: usize, num_direct_codes: usize, postfix_bits: u64, code: &mut u16, extra_bits: &mut u32) { if distance_code < (BROTLI_NUM_DISTANCE_SHORT_CODES as usize).wrapping_add(num_direct_codes) { *code = distance_code as (u16); *extra_bits = 0u32; } else { let dist: u64 = (1u64 << (postfix_bits as u64).wrapping_add(2u32 as (u64))) .wrapping_add((distance_code as u64).wrapping_sub(BROTLI_NUM_DISTANCE_SHORT_CODES as u64).wrapping_sub(num_direct_codes as u64) as u64); let bucket: u64 = Log2FloorNonZero(dist).wrapping_sub(1u32) as (u64); let postfix_mask: u64 = (1u32 << postfix_bits).wrapping_sub(1u32) as (u64); let postfix: u64 = dist & postfix_mask; let prefix: u64 = (dist >> bucket) & 1; let offset: u64 = (2u64).wrapping_add(prefix) << bucket; let nbits: u64 = bucket.wrapping_sub(postfix_bits); *code = ((nbits << 10) | ((BROTLI_NUM_DISTANCE_SHORT_CODES as u64).wrapping_add(num_direct_codes as u64).wrapping_add( 2u64.wrapping_mul(nbits.wrapping_sub(1)).wrapping_add(prefix) << postfix_bits).wrapping_add(postfix))) as u16; *extra_bits = (dist.wrapping_sub(offset) >> postfix_bits) as u32; /*(16u64) .wrapping_add(num_direct_codes as u64) .wrapping_add((2u64).wrapping_mul(nbits.wrapping_sub(1)).wrapping_add(prefix) << postfix_bits) .wrapping_add(postfix) as (u16);*/ //*extra_bits = (nbits << 24i32 | dist.wrapping_sub(offset) >> postfix_bits) as (u32); } } pub fn CommandRestoreDistanceCode(xself: &Command, dist:&BrotliDistanceParams) -> u32 { if ((*xself).dist_prefix_ as (i32) & 0x3ff) < BROTLI_NUM_DISTANCE_SHORT_CODES as i32 + dist.num_direct_distance_codes as i32 { (*xself).dist_prefix_ as (u32) & 0x3ff } else { let dcode = xself.dist_prefix_ as u32 & 0x3ff; let nbits: u32 = u32::from((*xself).dist_prefix_ >> 10); let extra: u32 = (*xself).dist_extra_; let postfix_mask = (1u32 << dist.distance_postfix_bits) - 1; let hcode = dcode.wrapping_sub(dist.num_direct_distance_codes).wrapping_sub(BROTLI_NUM_DISTANCE_SHORT_CODES as u32) >> dist.distance_postfix_bits; let lcode = dcode.wrapping_sub(dist.num_direct_distance_codes).wrapping_sub(BROTLI_NUM_DISTANCE_SHORT_CODES as u32) & postfix_mask; let offset = (2u32.wrapping_add((hcode & 1)) << nbits).wrapping_sub(4); (offset.wrapping_add(extra) << dist.distance_postfix_bits).wrapping_add(lcode).wrapping_add(dist.num_direct_distance_codes).wrapping_add( BROTLI_NUM_DISTANCE_SHORT_CODES) } } // returns which distance code to use ( 0 means none, 1 means last, 2 means penultimate, 3 means the prior to penultimate pub fn CommandDistanceIndexAndOffset(cmd: &Command, dist: &BrotliDistanceParams) -> (usize, isize) { let n_postfix = dist.distance_postfix_bits; let n_direct = dist.num_direct_distance_codes; let dextra = cmd.dist_extra_; let dprefix = cmd.dist_prefix_ & 0x3ff; let n_dist_bits = cmd.dist_prefix_ >> 10; if u32::from(dprefix) < BROTLI_NUM_DISTANCE_SHORT_CODES { let table: [(usize, isize);16]= [(1,0), (2,0),(3,0),(4,0), (1,-1), (1, 1), (1,-2), (1,2),(1,-3),(1,3), (2,-1),(2,1),(2,-2),(2,2),(2,-3),(2,3)]; //eprint!("AA {:?} {:?} -> {:?}\n",*cmd, *dist, table[dprefix as usize]); return table[dprefix as usize]; } if (dprefix as usize) < BROTLI_NUM_DISTANCE_SHORT_CODES as usize + n_direct as usize { let ret = dprefix as isize + 1 - BROTLI_NUM_DISTANCE_SHORT_CODES as isize; //eprint!("BB {:?} {:?} -> {:?}\n",*cmd, *dist, ret); return (0, ret); } let postfix_mask = (1 << n_postfix) - 1; let dcode = dprefix as u32 - BROTLI_NUM_DISTANCE_SHORT_CODES as u32 - n_direct; let hcode = dcode >> n_postfix; let lcode = dcode & postfix_mask; let offset = ((2 + (hcode & 1)) << n_dist_bits) - 4; let ret = (((offset + dextra) << n_postfix) + lcode + n_direct + 1) as isize; //assert!(ret != 0); (0, ret) } mod test { // returns which distance code to use ( 0 means none, 1 means last, 2 means penultimate, 3 means the prior to penultimate #[cfg(test)] pub fn helperCommandDistanceIndexAndOffset(cmd: &super::Command, dist: &super::BrotliDistanceParams) -> (usize, isize) { let n_postfix = dist.distance_postfix_bits; let n_direct = dist.num_direct_distance_codes; let dextra = cmd.dist_extra_; let dist_prefix = cmd.dist_prefix_ & 0x3ff; if dist_prefix < 16 { let table: [(usize, isize);16]= [(1,0), (2,0),(3,0),(4,0), (1,-1), (1, 1), (1,-2), (1,2),(1,-3),(1,3), (2,-1),(2,1),(2,-2),(2,2),(2,-3),(2,3)]; return table[cmd.dist_prefix_ as usize]; } if (dist_prefix as usize) < 16 + n_direct as usize { return (0, dist_prefix as isize + 1 - 16); } let postfix_mask = (1 << n_postfix) - 1; let dcode = dist_prefix as u32 - 16 - n_direct; let n_dist_bits = 1 + (dcode >> (n_postfix + 1)); let hcode = dcode >> n_postfix; let lcode = dcode & postfix_mask; let offset = ((2 + (hcode & 1)) << n_dist_bits) - 4; (0, (((offset + dextra) << n_postfix) + lcode + n_direct + 1) as isize) } #[test] fn test_command_return_distance_index_offset() { let param = super::BrotliDistanceParams { distance_postfix_bits: 2, num_direct_distance_codes: 16, alphabet_size: 224, max_distance: 268435456, }; let mut cmd = super::Command::default(); cmd.insert_len_ = 63; cmd.copy_len_ = 3; cmd.dist_extra_ = 3; cmd.cmd_prefix_ = 297; cmd.dist_prefix_= 2089; assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), (0,46)); assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), helperCommandDistanceIndexAndOffset(&cmd, ¶m)); cmd = super::Command { insert_len_: 27, copy_len_: 3, dist_extra_: 0, cmd_prefix_: 281, dist_prefix_: 6 }; assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), (1,-2)); assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), helperCommandDistanceIndexAndOffset(&cmd, ¶m)); cmd = super::Command { insert_len_: 1, copy_len_: 3, dist_extra_: 0, cmd_prefix_: 137, dist_prefix_: 27 }; assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), (0,12)); assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), helperCommandDistanceIndexAndOffset(&cmd, ¶m)); cmd = super::Command { insert_len_: 5, copy_len_: 4, dist_extra_: 297, cmd_prefix_: 170, dist_prefix_: 11377 }; assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), (0,17574)); assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), helperCommandDistanceIndexAndOffset(&cmd, ¶m)); super::super::encode::InitInsertCommand(&mut cmd, 24); assert_eq!(super::CommandDistanceIndexAndOffset(&cmd, ¶m), (0,1)); } /* #[test] fn test_restore_distance_code() { for dist_code in 0..50000 { let mut cmd = super::Command::default(); let param =super::BrotliDistanceParams{ distance_postfix_bits:2, num_direct_distance_codes:16, alphabet_size:224, max_distance:268435456, }; super::InitCommand(&mut cmd, ¶m, 4, 4, 4, dist_code); let exp_dist_code = super::CommandRestoreDistanceCode(&cmd, ¶m); assert_eq!(exp_dist_code as u32, dist_code as u32); } }*/ } pub fn RecomputeDistancePrefixes(cmds: &mut [Command], num_commands: usize, num_direct_distance_codes: u32, distance_postfix_bits: u32, dist:&BrotliDistanceParams) { let mut i: usize; if num_direct_distance_codes == 0u32 && (distance_postfix_bits == 0u32) { return; } i = 0usize; while i < num_commands { { let cmd: &mut Command = &mut cmds[(i as (usize))]; if CommandCopyLen(cmd) != 0 && ((*cmd).cmd_prefix_ as (i32) >= 128i32) { PrefixEncodeCopyDistance(CommandRestoreDistanceCode(cmd, dist) as (usize), num_direct_distance_codes as (usize), distance_postfix_bits as (u64), &mut (*cmd).dist_prefix_, &mut (*cmd).dist_extra_); } } i = i.wrapping_add(1 as (usize)); } } pub fn InitCommand(xself: &mut Command, dist: &BrotliDistanceParams, insertlen: usize, copylen: usize, copylen_code: usize, distance_code: usize) { xself.insert_len_ = insertlen as (u32); let copylen_code_delta = (copylen_code as i32 - copylen as i32) as i8; xself.copy_len_ = (copylen as u32 | (u32::from(copylen_code_delta as u8) << 25)); PrefixEncodeCopyDistance(distance_code, dist.num_direct_distance_codes as usize, u64::from(dist.distance_postfix_bits), &mut xself.dist_prefix_, &mut xself.dist_extra_); GetLengthCode(insertlen, copylen_code, if !!((xself.dist_prefix_ as (i32) & 0x3ff) == 0i32) { 1i32 } else { 0i32 }, &mut xself.cmd_prefix_); } pub fn NewCommand(dist: &BrotliDistanceParams, insertlen: usize, copylen: usize, copylen_code: usize, distance_code: usize) -> Command { let mut xself: Command = Command { insert_len_: insertlen as (u32), copy_len_: (copylen | ((copylen_code ^ copylen) << 25)) as (u32), dist_extra_: 0, cmd_prefix_: 0, dist_prefix_: 0, }; InitCommand(&mut xself, dist, insertlen, copylen, copylen_code, distance_code); xself } brotli-3.4.0/src/enc/compat.rs000075500000000000000000000277711046102023000143310ustar 00000000000000#![cfg_attr(feature="simd", allow(unused))] use core::ops::{Shr, Add, Sub, AddAssign, Mul, BitAnd}; #[derive(Default, Copy, Clone, Debug)] pub struct Compat16x16([i16;16]); impl Compat16x16 { #[inline(always)] pub fn splat(a: i16) -> Compat16x16 { Compat16x16([a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,]) } #[inline(always)] pub fn new(a0: i16, a1: i16, a2: i16, a3: i16, a4: i16, a5: i16, a6: i16, a7: i16, a8: i16, a9: i16, a10: i16, a11: i16, a12: i16, a13: i16, a14:i16, a15:i16) -> Compat16x16 { Compat16x16([a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15]) } #[inline(always)] pub fn extract(&self, i: usize) -> i16 { self.0[i] } #[inline(always)] pub fn replace(&self, i: usize, data: i16) -> Compat16x16 { let mut ret = *self; ret.0[i] = data; ret } #[inline(always)] pub fn into_bits(&self) -> Self { *self } #[inline(always)] pub fn gt(&self, rhs: Compat16x16) -> Compat16x16 { Self::new(-((self.extract(0) > rhs.extract(0)) as i16), -((self.extract(1) > rhs.extract(1)) as i16), -((self.extract(2) > rhs.extract(2)) as i16), -((self.extract(3) > rhs.extract(3)) as i16), -((self.extract(4) > rhs.extract(4)) as i16), -((self.extract(5) > rhs.extract(5)) as i16), -((self.extract(6) > rhs.extract(6)) as i16), -((self.extract(7) > rhs.extract(7)) as i16), -((self.extract(8) > rhs.extract(8)) as i16), -((self.extract(9) > rhs.extract(9)) as i16), -((self.extract(10) > rhs.extract(10)) as i16), -((self.extract(11) > rhs.extract(11)) as i16), -((self.extract(12) > rhs.extract(12)) as i16), -((self.extract(13) > rhs.extract(13)) as i16), -((self.extract(14) > rhs.extract(14)) as i16), -((self.extract(15) > rhs.extract(15)) as i16)) } } macro_rules! op16 { ($a: expr, $b: expr, $op: expr) => ( Compat16x16::new($op($a[0], $b[0]), $op($a[1], $b[1]), $op($a[2], $b[2]), $op($a[3], $b[3]), $op($a[4], $b[4]), $op($a[5], $b[5]), $op($a[6], $b[6]), $op($a[7], $b[7]), $op($a[8], $b[8]), $op($a[9], $b[9]), $op($a[10], $b[10]), $op($a[11], $b[11]), $op($a[12], $b[12]), $op($a[13], $b[13]), $op($a[14], $b[14]), $op($a[15], $b[15])) ) } macro_rules! scalar_op16 { ($a: expr, $b: expr, $op: expr) => ( Compat16x16::new($op($a[0], $b), $op($a[1], $b), $op($a[2], $b), $op($a[3], $b), $op($a[4], $b), $op($a[5], $b), $op($a[6], $b), $op($a[7], $b), $op($a[8], $b), $op($a[9], $b), $op($a[10], $b), $op($a[11], $b), $op($a[12], $b), $op($a[13], $b), $op($a[14], $b), $op($a[15], $b)) ) } #[inline(always)] fn wrapping_i16_add(a: i16, b:i16) -> i16 { a.wrapping_add(b) } #[inline(always)] fn wrapping_i16_sub(a: i16, b:i16) -> i16 { a.wrapping_sub(b) } #[inline(always)] fn i16_bitand(a: i16, b:i16) -> i16 { a & b } #[inline(always)] fn shift16(a: i16, b:Scalar) -> i16 where i64:From { a >> i64::from(b) } impl Add for Compat16x16 { type Output = Compat16x16; #[inline(always)] fn add(self, other: Compat16x16) -> Compat16x16 { op16!(self.0, other.0, wrapping_i16_add) } } impl Sub for Compat16x16 { type Output = Compat16x16; #[inline(always)] fn sub(self, other: Compat16x16) -> Compat16x16 { op16!(self.0, other.0, wrapping_i16_sub) } } impl BitAnd for Compat16x16 { type Output = Compat16x16; #[inline(always)] fn bitand(self, other: Compat16x16) -> Compat16x16 { op16!(self.0, other.0, i16_bitand) } } impl Shr for Compat16x16 where i64:From { type Output = Compat16x16; #[inline(always)] fn shr(self, other: Scalar) -> Compat16x16 { scalar_op16!(self.0, other.clone(), shift16) } } #[derive(Default, Copy, Clone, Debug)] pub struct Compat32x8([i32;8]); impl Compat32x8 { #[inline(always)] pub fn splat(a: i32) -> Compat32x8 { Compat32x8([a, a, a, a, a, a, a, a]) } #[inline(always)] pub fn new(a0: i32, a1: i32, a2: i32, a3: i32, a4: i32, a5: i32, a6: i32, a7: i32) -> Compat32x8 { Compat32x8([a0, a1, a2, a3, a4, a5, a6, a7]) } #[inline(always)] pub fn extract(&self, i: usize) -> i32 { self.0[i] } #[inline(always)] pub fn replace(&self, i: usize, data: i32) -> Compat32x8 { let mut ret = *self; ret.0[i] = data; ret } #[inline(always)] pub fn gt(&self, rhs: Compat32x8) -> Compat32x8 { Self::new(-((self.extract(0) > rhs.extract(0)) as i32), -((self.extract(1) > rhs.extract(1)) as i32), -((self.extract(2) > rhs.extract(2)) as i32), -((self.extract(3) > rhs.extract(3)) as i32), -((self.extract(4) > rhs.extract(4)) as i32), -((self.extract(5) > rhs.extract(5)) as i32), -((self.extract(6) > rhs.extract(6)) as i32), -((self.extract(7) > rhs.extract(7)) as i32)) } #[inline(always)] pub fn ge(&self, rhs: Compat32x8) -> Compat32x8 { Self::new(-((self.extract(0) >= rhs.extract(0)) as i32), -((self.extract(1) >= rhs.extract(1)) as i32), -((self.extract(2) >= rhs.extract(2)) as i32), -((self.extract(3) >= rhs.extract(3)) as i32), -((self.extract(4) >= rhs.extract(4)) as i32), -((self.extract(5) >= rhs.extract(5)) as i32), -((self.extract(6) >= rhs.extract(6)) as i32), -((self.extract(7) >= rhs.extract(7)) as i32)) } pub fn into_bits(&self) -> Self { *self } } #[inline(always)] fn fmin(a: f32, b:f32) -> f32 { if a < b { a } else { b } } #[derive(Default, Copy, Clone, Debug)] pub struct CompatF8([f32;8]); impl CompatF8 { #[inline(always)] pub fn new(a0: f32, a1: f32, a2: f32, a3: f32, a4: f32, a5: f32, a6: f32, a7: f32) -> CompatF8 { CompatF8([a0, a1, a2, a3, a4, a5, a6, a7]) } #[inline(always)] pub fn splat(a: f32) -> CompatF8 { CompatF8([a, a, a, a, a, a, a, a]) } #[inline(always)] pub fn extract(&self, i: usize) -> f32 { self.0[i] } #[inline(always)] pub fn replace(&self, i: usize, data: f32) -> CompatF8 { let mut ret = *self; ret.0[i] = data; ret } #[inline(always)] pub fn ge(&self, rhs: CompatF8) -> Compat32x8 { Compat32x8::new(-((self.extract(0) >= rhs.extract(0)) as i32), -((self.extract(1) >= rhs.extract(1)) as i32), -((self.extract(2) >= rhs.extract(2)) as i32), -((self.extract(3) >= rhs.extract(3)) as i32), -((self.extract(4) >= rhs.extract(4)) as i32), -((self.extract(5) >= rhs.extract(5)) as i32), -((self.extract(6) >= rhs.extract(6)) as i32), -((self.extract(7) >= rhs.extract(7)) as i32)) } #[inline(always)] pub fn min(&self, rhs: CompatF8) -> CompatF8 { Self::new(fmin(self.extract(0), rhs.extract(0)), fmin(self.extract(1), rhs.extract(1)), fmin(self.extract(2), rhs.extract(2)), fmin(self.extract(3), rhs.extract(3)), fmin(self.extract(4), rhs.extract(4)), fmin(self.extract(5), rhs.extract(5)), fmin(self.extract(6), rhs.extract(6)), fmin(self.extract(7), rhs.extract(7))) } } impl Add for Compat32x8 { type Output = Compat32x8; #[inline(always)] fn add(self, other: Compat32x8) -> Compat32x8 { Compat32x8::new(self.0[0].wrapping_add(other.0[0]), self.0[1].wrapping_add(other.0[1]), self.0[2].wrapping_add(other.0[2]), self.0[3].wrapping_add(other.0[3]), self.0[4].wrapping_add(other.0[4]), self.0[5].wrapping_add(other.0[5]), self.0[6].wrapping_add(other.0[6]), self.0[7].wrapping_add(other.0[7])) } } impl BitAnd for Compat32x8 { type Output = Compat32x8; #[inline(always)] fn bitand(self, other: Compat32x8) -> Compat32x8 { Compat32x8::new(self.0[0] & other.0[0], self.0[1] & other.0[1], self.0[2] & other.0[2], self.0[3] & other.0[3], self.0[4] & other.0[4], self.0[5] & other.0[5], self.0[6] & other.0[6], self.0[7] & other.0[7]) } } impl Mul for Compat32x8 { type Output = Compat32x8; #[inline(always)] fn mul(self, other: Compat32x8) -> Compat32x8 { Compat32x8::new(self.0[0].wrapping_mul(other.0[0]), self.0[1].wrapping_mul(other.0[1]), self.0[2].wrapping_mul(other.0[2]), self.0[3].wrapping_mul(other.0[3]), self.0[4].wrapping_mul(other.0[4]), self.0[5].wrapping_mul(other.0[5]), self.0[6].wrapping_mul(other.0[6]), self.0[7].wrapping_mul(other.0[7])) } } impl Add for CompatF8 { type Output = CompatF8; #[inline(always)] fn add(self, other: CompatF8) -> CompatF8 { CompatF8::new(self.0[0] + other.0[0], self.0[1] + other.0[1], self.0[2] + other.0[2], self.0[3] + other.0[3], self.0[4] + other.0[4], self.0[5] + other.0[5], self.0[6] + other.0[6], self.0[7] + other.0[7]) } } impl Sub for CompatF8 { type Output = CompatF8; #[inline(always)] fn sub(self, other: CompatF8) -> CompatF8 { CompatF8::new(self.0[0] - other.0[0], self.0[1] - other.0[1], self.0[2] - other.0[2], self.0[3] - other.0[3], self.0[4] - other.0[4], self.0[5] - other.0[5], self.0[6] - other.0[6], self.0[7] - other.0[7]) } } impl Mul for CompatF8 { type Output = CompatF8; #[inline(always)] fn mul(self, other: CompatF8) -> CompatF8 { CompatF8::new(self.0[0] * other.0[0], self.0[1] * other.0[1], self.0[2] * other.0[2], self.0[3] * other.0[3], self.0[4] * other.0[4], self.0[5] * other.0[5], self.0[6] * other.0[6], self.0[7] * other.0[7]) } } impl AddAssign for CompatF8 { #[inline(always)] fn add_assign(&mut self, other: CompatF8) { self.0[0] += other.0[0]; self.0[1] += other.0[1]; self.0[2] += other.0[2]; self.0[3] += other.0[3]; self.0[4] += other.0[4]; self.0[5] += other.0[5]; self.0[6] += other.0[6]; self.0[7] += other.0[7]; } } brotli-3.4.0/src/enc/compress_fragment.rs000075500000000000000000001323061046102023000165530ustar 00000000000000#![allow(dead_code)] use super::backward_references::kHashMul32; //use super::super::alloc::{SliceWrapper, SliceWrapperMut}; use super::brotli_bit_stream::{BrotliBuildAndStoreHuffmanTreeFast, BrotliStoreHuffmanTree}; //caution: lots of the functions look structurally the same as two_pass, // but have subtle index differences // examples: IsMatch checks p1[4] and p1[5] // the hoops that BuildAndStoreCommandPrefixCode goes through are subtly different in order // (eg memcpy x+24, y instead of +24, y+40 // pretty much assume compress_fragment_two_pass is a trap! except for BrotliStoreMetaBlockHeader use super::compress_fragment_two_pass::{BrotliStoreMetaBlockHeader, BrotliWriteBits, memcpy}; use super::entropy_encode::{BrotliConvertBitDepthsToSymbols, BrotliCreateHuffmanTree, HuffmanTree, NewHuffmanTree}; use super::static_dict::{BROTLI_UNALIGNED_LOAD32, BROTLI_UNALIGNED_LOAD64, FindMatchLengthWithLimit}; use super::super::alloc; use super::util::{brotli_min_size_t, brotli_min_uint32_t, Log2FloorNonZero, FastLog2}; //static kHashMul32: u32 = 0x1e35a7bdu32; static kCmdHistoSeed: [u32; 128] = [0u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 0u32, 0u32, 0u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 0u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 1u32, 0u32, 0u32, 0u32, 0u32]; fn Hash(p: &[u8], shift: usize) -> u32 { let h: u64 = (BROTLI_UNALIGNED_LOAD64(p) << 24i32).wrapping_mul(kHashMul32 as (u64)); (h >> shift) as (u32) } fn IsMatch(p1: &[u8], p2: &[u8]) -> i32 { if !!(BROTLI_UNALIGNED_LOAD32(p1) == BROTLI_UNALIGNED_LOAD32(p2) && (p1[(4usize)] as (i32) == p2[(4usize)] as (i32))) { 1i32 } else { 0i32 } } fn BuildAndStoreLiteralPrefixCode>(mht: &mut AllocHT, input: &[u8], input_size: usize, depths: &mut [u8], bits: &mut [u16], storage_ix: &mut usize, storage: &mut [u8]) -> usize{ let mut histogram: [u32; 256] = [0; 256]; let mut histogram_total: usize; let mut i: usize; if input_size < (1i32 << 15i32) as (usize) { i = 0usize; while i < input_size { { let _rhs = 1; let _lhs = &mut histogram[input[(i as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } i = i.wrapping_add(1 as (usize)); } histogram_total = input_size; i = 0usize; while i < 256usize { { let adjust: u32 = (2u32).wrapping_mul(brotli_min_uint32_t(histogram[i], 11u32)); { let _rhs = adjust; let _lhs = &mut histogram[i]; *_lhs = (*_lhs).wrapping_add(_rhs); } histogram_total = histogram_total.wrapping_add(adjust as (usize)); } i = i.wrapping_add(1 as (usize)); } } else { static kSampleRate: usize = 29usize; i = 0usize; while i < input_size { { let _rhs = 1; let _lhs = &mut histogram[input[(i as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } i = i.wrapping_add(kSampleRate); } histogram_total = input_size.wrapping_add(kSampleRate).wrapping_sub(1usize).wrapping_div(kSampleRate); i = 0usize; while i < 256usize { { let adjust: u32 = (1u32).wrapping_add((2u32).wrapping_mul(brotli_min_uint32_t(histogram[i], 11u32))); { let _rhs = adjust; let _lhs = &mut histogram[i]; *_lhs = (*_lhs).wrapping_add(_rhs); } histogram_total = histogram_total.wrapping_add(adjust as (usize)); } i = i.wrapping_add(1 as (usize)); } } BrotliBuildAndStoreHuffmanTreeFast(mht, &mut histogram[..], histogram_total, 8usize, depths, bits, storage_ix, storage); { let mut literal_ratio: usize = 0usize; i = 0usize; while i < 256usize { { if histogram[i] != 0 { literal_ratio = literal_ratio.wrapping_add(histogram[i].wrapping_mul(depths[(i as (usize))] as (u32)) as (usize)); } } i = i.wrapping_add(1 as (usize)); } literal_ratio.wrapping_mul(125usize).wrapping_div(histogram_total) } } #[derive(PartialEq, Eq, Copy, Clone)] pub enum CodeBlockState { EMIT_REMAINDER, EMIT_COMMANDS, NEXT_BLOCK, } fn EmitInsertLen(insertlen: usize, depth: &[u8], bits: &[u16], histo: &mut [u32], storage_ix: &mut usize, storage: &mut [u8]) { if insertlen < 6usize { let code: usize = insertlen.wrapping_add(40usize); BrotliWriteBits(depth[(code as (usize))] as (usize), bits[(code as (usize))] as (u64), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(code as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else if insertlen < 130usize { let tail: usize = insertlen.wrapping_sub(2usize); let nbits: u32 = Log2FloorNonZero(tail as u64).wrapping_sub(1u32); let prefix: usize = tail >> nbits; let inscode: usize = ((nbits << 1i32) as (usize)).wrapping_add(prefix).wrapping_add(42usize); BrotliWriteBits(depth[(inscode as (usize))] as (usize), bits[(inscode as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(nbits as (usize), (tail as u64).wrapping_sub((prefix as u64) << nbits), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(inscode as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else if insertlen < 2114usize { let tail: usize = insertlen.wrapping_sub(66usize); let nbits: u32 = Log2FloorNonZero(tail as u64); let code: usize = nbits.wrapping_add(50u32) as (usize); BrotliWriteBits(depth[(code as (usize))] as (usize), bits[(code as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(nbits as (usize), (tail as u64).wrapping_sub(1 << nbits), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(code as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else { BrotliWriteBits(depth[(61usize)] as (usize), bits[(61usize)] as (u64), storage_ix, storage); BrotliWriteBits(12usize, (insertlen as u64).wrapping_sub(2114u64), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(61usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } } fn ShouldUseUncompressedMode(delta: isize, insertlen: usize, literal_ratio: usize) -> i32 { let compressed: usize = delta as (usize); if compressed.wrapping_mul(50usize) > insertlen { 0i32 } else if !!(literal_ratio > 980usize) { 1i32 } else { 0i32 } } fn RewindBitPosition(new_storage_ix: usize, storage_ix: &mut usize, storage: &mut [u8]) { let bitpos: usize = new_storage_ix & 7usize; let mask: usize = (1u32 << bitpos).wrapping_sub(1u32) as (usize); { let _rhs = mask as (u8); let _lhs = &mut storage[((new_storage_ix >> 3i32) as (usize))]; *_lhs = (*_lhs as (i32) & _rhs as (i32)) as (u8); } *storage_ix = new_storage_ix; } fn EmitUncompressedMetaBlock(begin: &[u8], len: usize, storage_ix_start: usize, storage_ix: &mut usize, storage: &mut [u8]) { RewindBitPosition(storage_ix_start, storage_ix, storage); BrotliStoreMetaBlockHeader(len, 1i32, storage_ix, storage); *storage_ix = (*storage_ix).wrapping_add(7u32 as (usize)) & !7u32 as (usize); memcpy(storage, ((*storage_ix >> 3i32) as (usize)), begin, 0, len); *storage_ix = (*storage_ix).wrapping_add(len << 3i32); storage[((*storage_ix >> 3i32) as (usize))] = 0i32 as (u8); } fn EmitLongInsertLen(insertlen: usize, depth: &[u8], bits: &[u16], histo: &mut [u32], storage_ix: &mut usize, storage: &mut [u8]) { if insertlen < 22594usize { BrotliWriteBits(depth[(62usize)] as (usize), bits[(62usize)] as (u64), storage_ix, storage); BrotliWriteBits(14usize, (insertlen as u64).wrapping_sub(6210), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(62usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else { BrotliWriteBits(depth[(63usize)] as (usize), bits[(63usize)] as (u64), storage_ix, storage); BrotliWriteBits(24usize, (insertlen as u64).wrapping_sub(22594), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(63usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } } fn EmitLiterals(input: &[u8], len: usize, depth: &[u8], bits: &[u16], storage_ix: &mut usize, storage: &mut [u8]) { let mut j: usize; j = 0usize; while j < len { { let lit: u8 = input[(j as (usize))]; BrotliWriteBits(depth[(lit as (usize))] as (usize), bits[(lit as (usize))] as (u64), storage_ix, storage); } j = j.wrapping_add(1 as (usize)); } } fn EmitDistance(distance: usize, depth: &[u8], bits: &[u16], histo: &mut [u32], storage_ix: &mut usize, storage: &mut [u8]) { let d: u64 = distance.wrapping_add(3usize) as u64; let nbits: u32 = Log2FloorNonZero(d as u64).wrapping_sub(1u32); let prefix: u64 = d >> nbits & 1; let offset: u64 = (2u64).wrapping_add(prefix) << nbits; let distcode: u64 = ((2u32).wrapping_mul(nbits.wrapping_sub(1u32)) as (u64)) .wrapping_add(prefix) .wrapping_add(80u64); BrotliWriteBits(depth[(distcode as (usize))] as (usize), bits[(distcode as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(nbits as (usize), d.wrapping_sub(offset), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(distcode as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } fn EmitCopyLenLastDistance(copylen: usize, depth: &[u8], bits: &[u16], histo: &mut [u32], storage_ix: &mut usize, storage: &mut [u8]) { if copylen < 12usize { BrotliWriteBits(depth[(copylen.wrapping_sub(4usize) as (usize))] as (usize), bits[(copylen.wrapping_sub(4usize) as (usize))] as (u64), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(copylen.wrapping_sub(4usize) as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else if copylen < 72usize { let tail: usize = copylen.wrapping_sub(8usize); let nbits: u32 = Log2FloorNonZero(tail as u64).wrapping_sub(1u32); let prefix: usize = tail >> nbits; let code: usize = ((nbits << 1i32) as (usize)).wrapping_add(prefix).wrapping_add(4usize); BrotliWriteBits(depth[(code as (usize))] as (usize), bits[(code as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(nbits as (usize), tail.wrapping_sub(prefix << nbits) as u64, storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(code as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else if copylen < 136usize { let tail: usize = copylen.wrapping_sub(8usize); let code: usize = (tail >> 5i32).wrapping_add(30usize); BrotliWriteBits(depth[(code as (usize))] as (usize), bits[(code as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(5usize, tail as u64 & 31, storage_ix, storage); BrotliWriteBits(depth[(64usize)] as (usize), bits[(64usize)] as (u64), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(code as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } { let _rhs = 1; let _lhs = &mut histo[(64usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else if copylen < 2120usize { let tail: usize = copylen.wrapping_sub(72usize); let nbits: u32 = Log2FloorNonZero(tail as u64); let code: usize = nbits.wrapping_add(28u32) as (usize); BrotliWriteBits(depth[(code as (usize))] as (usize), bits[(code as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(nbits as (usize), (tail as u64).wrapping_sub(1u64 << nbits), storage_ix, storage); BrotliWriteBits(depth[(64usize)] as (usize), bits[(64usize)] as (u64), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(code as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } { let _rhs = 1; let _lhs = &mut histo[(64usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else { BrotliWriteBits(depth[(39usize)] as (usize), bits[(39usize)] as (u64), storage_ix, storage); BrotliWriteBits(24usize, copylen.wrapping_sub(2120usize) as u64, storage_ix, storage); BrotliWriteBits(depth[(64usize)] as (usize), bits[(64usize)] as (u64), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(39usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } { let _rhs = 1; let _lhs = &mut histo[(64usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } } fn HashBytesAtOffset(v: u64, offset: i32, shift: usize) -> u32 { { let h: u64 = (v >> 8i32 * offset << 24i32).wrapping_mul(kHashMul32 as (u64)); (h >> shift) as (u32) } } fn EmitCopyLen(copylen: usize, depth: &[u8], bits: &[u16], histo: &mut [u32], storage_ix: &mut usize, storage: &mut [u8]) { if copylen < 10usize { BrotliWriteBits(depth[(copylen.wrapping_add(14usize) as (usize))] as (usize), bits[(copylen.wrapping_add(14usize) as (usize))] as (u64), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(copylen.wrapping_add(14usize) as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else if copylen < 134usize { let tail: usize = copylen.wrapping_sub(6usize); let nbits: u32 = Log2FloorNonZero(tail as u64).wrapping_sub(1u32); let prefix: usize = tail >> nbits; let code: usize = ((nbits << 1i32) as (usize)).wrapping_add(prefix).wrapping_add(20usize); BrotliWriteBits(depth[(code as (usize))] as (usize), bits[(code as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(nbits as (usize), (tail as u64).wrapping_sub((prefix as u64) << nbits), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(code as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else if copylen < 2118usize { let tail: usize = copylen.wrapping_sub(70usize); let nbits: u32 = Log2FloorNonZero(tail as u64); let code: usize = nbits.wrapping_add(28u32) as (usize); BrotliWriteBits(depth[(code as (usize))] as (usize), bits[(code as (usize))] as (u64), storage_ix, storage); BrotliWriteBits(nbits as (usize), (tail as u64).wrapping_sub(1 << nbits), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(code as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } else { BrotliWriteBits(depth[(39usize)] as (usize), bits[(39usize)] as (u64), storage_ix, storage); BrotliWriteBits(24usize, (copylen as u64).wrapping_sub(2118), storage_ix, storage); { let _rhs = 1; let _lhs = &mut histo[(39usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } } fn ShouldMergeBlock(data: &[u8], len: usize, depths: &[u8]) -> i32 { let mut histo: [usize; 256] = [0; 256]; static kSampleRate: usize = 43usize; let mut i: usize; i = 0usize; while i < len { { let _rhs = 1; let _lhs = &mut histo[data[(i as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (usize)); } i = i.wrapping_add(kSampleRate); } { let total: usize = len.wrapping_add(kSampleRate).wrapping_sub(1usize).wrapping_div(kSampleRate); let mut r: super::util::floatX = (FastLog2(total as u64) + 0.5 as super::util::floatX) * total as (super::util::floatX) + 200i32 as (super::util::floatX); i = 0usize; while i < 256usize { { r = r - histo[i] as (super::util::floatX) * (depths[(i as (usize))] as (super::util::floatX) + FastLog2(histo[i] as u64)); } i = i.wrapping_add(1 as (usize)); } if !!(r >= 0.0 as super::util::floatX) { 1i32 } else { 0i32 } } } fn UpdateBits(mut n_bits: usize, mut bits: u32, mut pos: usize, array: &mut [u8]) { while n_bits > 0usize { let byte_pos: usize = pos >> 3i32; let n_unchanged_bits: usize = pos & 7usize; let n_changed_bits: usize = brotli_min_size_t(n_bits, (8usize).wrapping_sub(n_unchanged_bits)); let total_bits: usize = n_unchanged_bits.wrapping_add(n_changed_bits); let mask: u32 = !(1u32 << total_bits).wrapping_sub(1u32) | (1u32 << n_unchanged_bits).wrapping_sub(1u32); let unchanged_bits: u32 = array[(byte_pos as (usize))] as (u32) & mask; let changed_bits: u32 = bits & (1u32 << n_changed_bits).wrapping_sub(1u32); array[(byte_pos as (usize))] = (changed_bits << n_unchanged_bits | unchanged_bits) as (u8); n_bits = n_bits.wrapping_sub(n_changed_bits); bits = bits >> n_changed_bits; pos = pos.wrapping_add(n_changed_bits); } } fn BuildAndStoreCommandPrefixCode(histogram: &[u32], depth: &mut [u8], bits: &mut [u16], storage_ix: &mut usize, storage: &mut [u8]) { let mut tree: [HuffmanTree; 129] = [NewHuffmanTree(0, 0, 0); 129]; let mut cmd_depth: [u8; 704] = [0i32 as (u8); 704]; let mut cmd_bits: [u16; 64] = [0; 64]; BrotliCreateHuffmanTree(&histogram[..], 64usize, 15i32, &mut tree[..], depth); BrotliCreateHuffmanTree(&histogram[(64usize)..], 64usize, 14i32, &mut tree[..], &mut depth[(64usize)..]); /* We have to jump through a few hoops here in order to compute the command bits because the symbols are in a different order than in the full alphabet. This looks complicated, but having the symbols in this order in the command bits saves a few branches in the Emit* functions. */ memcpy(&mut cmd_depth[..], 0, depth, 0, 24usize); memcpy(&mut cmd_depth[..], 24i32 as (usize), depth, (40usize), 8usize); memcpy(&mut cmd_depth[..], 32i32 as (usize), depth, (24usize), 8usize); memcpy(&mut cmd_depth[..], 40i32 as (usize), depth, (48usize), 8usize); memcpy(&mut cmd_depth[..], 48i32 as (usize), depth, (32usize), 8usize); memcpy(&mut cmd_depth[..], 56i32 as (usize), depth, (56usize), 8usize); BrotliConvertBitDepthsToSymbols(&mut cmd_depth[..], 64usize, &mut cmd_bits[..]); memcpy(bits, 0, &cmd_bits[..], 0, 24usize); memcpy(bits, (24usize), &cmd_bits[..], 32i32 as (usize), 8usize); memcpy(bits, (32usize), &cmd_bits[..], 48i32 as (usize), 8usize); memcpy(bits, (40usize), &cmd_bits[..], 24i32 as (usize), 8usize); memcpy(bits, (48usize), &cmd_bits[..], 40i32 as (usize), 8usize); memcpy(bits, (56usize), &cmd_bits[..], 56i32 as (usize), 8usize); BrotliConvertBitDepthsToSymbols(&mut depth[(64usize)..], 64usize, &mut bits[(64usize)..]); { let mut i: usize; for item in cmd_depth[..64].iter_mut() { *item = 0; } memcpy(&mut cmd_depth[..], 0, depth, 0, 8usize); memcpy(&mut cmd_depth[..], 64i32 as (usize), depth, (8usize), 8usize); memcpy(&mut cmd_depth[..], 128i32 as (usize), depth, (16usize), 8usize); memcpy(&mut cmd_depth[..], 192i32 as (usize), depth, (24usize), 8usize); memcpy(&mut cmd_depth[..], 384i32 as (usize), depth, (32usize), 8usize); i = 0usize; while i < 8usize { { cmd_depth[(128usize).wrapping_add((8usize).wrapping_mul(i))] = depth[i.wrapping_add(40)]; cmd_depth[(256usize).wrapping_add((8usize).wrapping_mul(i))] = depth[i.wrapping_add(48)]; cmd_depth[(448usize).wrapping_add((8usize).wrapping_mul(i))] = depth[i.wrapping_add(56)]; } i = i.wrapping_add(1 as (usize)); } BrotliStoreHuffmanTree(&mut cmd_depth[..], 704usize, &mut tree[..], storage_ix, storage); } BrotliStoreHuffmanTree(&mut depth[(64usize)..], 64usize, &mut tree[..], storage_ix, storage); } #[allow(unused_assignments)] fn BrotliCompressFragmentFastImpl>(m: &mut AllocHT, input_ptr: &[u8], mut input_size: usize, is_last: i32, table: &mut [i32], table_bits: usize, cmd_depth: &mut [u8], cmd_bits: &mut [u16], cmd_code_numbits: &mut usize, cmd_code: &mut [u8], storage_ix: &mut usize, storage: &mut [u8]){ let mut cmd_histo = [0u32; 128]; let mut ip_end = 0usize; let mut next_emit = 0usize; let base_ip = 0usize; static kFirstBlockSize: usize = (3i32 << 15i32) as (usize); static kMergeBlockSize: usize = (1i32 << 16i32) as (usize); let kInputMarginBytes = 16usize; let kMinMatchLen = 5usize; let mut metablock_start = 0usize; let mut block_size = brotli_min_size_t(input_size, kFirstBlockSize); let mut total_block_size = block_size; let mut mlen_storage_ix = (*storage_ix).wrapping_add(3usize); let mut lit_depth = [0u8; 256]; let mut lit_bits = [0u16; 256]; let mut literal_ratio: usize; let mut input_index = 0usize; let mut last_distance: i32; let shift: usize = (64u32 as usize).wrapping_sub(table_bits); BrotliStoreMetaBlockHeader(block_size, 0i32, storage_ix, storage); BrotliWriteBits(13usize, 0, storage_ix, storage); literal_ratio = BuildAndStoreLiteralPrefixCode(m, &input_ptr[input_index..], block_size, &mut lit_depth[..], &mut lit_bits[..], storage_ix, storage); { let mut i = 0usize; while i.wrapping_add(7usize) < *cmd_code_numbits { BrotliWriteBits(8usize, cmd_code[i >> 3] as u64, storage_ix, storage); i = i.wrapping_add(8usize); } } BrotliWriteBits(*cmd_code_numbits & 7usize, cmd_code[*cmd_code_numbits >> 3i32] as u64, storage_ix, storage); let mut code_block_selection: CodeBlockState = CodeBlockState::EMIT_COMMANDS; 'continue_to_next_block: loop { let mut ip_index: usize; if code_block_selection == CodeBlockState::EMIT_COMMANDS { cmd_histo[..128].clone_from_slice(&kCmdHistoSeed[..]); ip_index = input_index; last_distance = -1i32; ip_end = input_index.wrapping_add(block_size); if block_size >= kInputMarginBytes { let len_limit: usize = brotli_min_size_t(block_size.wrapping_sub(kMinMatchLen), input_size.wrapping_sub(kInputMarginBytes)); let ip_limit: usize = input_index.wrapping_add(len_limit); let mut next_hash = Hash(&input_ptr[{ ip_index = ip_index.wrapping_add(1usize); ip_index }..], shift); loop { let mut skip = 32u32; let mut next_ip = ip_index; let mut candidate = 0usize; loop { { 'break15: loop { { let hash = next_hash; let bytes_between_hash_lookups: u32 = { let _old = skip; skip = skip.wrapping_add(1u32); _old } >> 5i32; ip_index = next_ip; next_ip = ip_index.wrapping_add(bytes_between_hash_lookups as usize); if next_ip > ip_limit { code_block_selection = CodeBlockState::EMIT_REMAINDER; break 'break15; } next_hash = Hash(&input_ptr[next_ip..], shift); candidate = ip_index.wrapping_sub(last_distance as usize); if IsMatch(&input_ptr[ip_index..], &input_ptr[candidate..]) != 0 { if candidate < ip_index { table[hash as usize] = ip_index.wrapping_sub(base_ip) as i32; break 'break15; } } candidate = base_ip.wrapping_add(table[hash as usize] as usize); table[hash as usize] = ip_index.wrapping_sub(base_ip) as i32; } if IsMatch(&input_ptr[ip_index..], &input_ptr[candidate..]) != 0 { break; } } } if !(ip_index.wrapping_sub(candidate) > (1usize << 18i32).wrapping_sub(16usize) as isize as usize && (code_block_selection as i32 == CodeBlockState::EMIT_COMMANDS as i32)) { break; } } if code_block_selection as i32 != CodeBlockState::EMIT_COMMANDS as i32 { break; } { let base: usize = ip_index; let matched = (5usize) .wrapping_add(FindMatchLengthWithLimit(&input_ptr[candidate + 5..], &input_ptr[ip_index + 5..], ip_end.wrapping_sub(ip_index) .wrapping_sub(5usize))); let distance = base.wrapping_sub(candidate) as i32; let insert = base.wrapping_sub(next_emit); ip_index = ip_index.wrapping_add(matched); if insert < 6210 { EmitInsertLen(insert, cmd_depth, cmd_bits, &mut cmd_histo[..], storage_ix, storage); } else if ShouldUseUncompressedMode((next_emit as isize) - (metablock_start as isize), insert, literal_ratio) != 0 { EmitUncompressedMetaBlock(&input_ptr[metablock_start..], base.wrapping_sub(metablock_start), mlen_storage_ix.wrapping_sub(3usize), storage_ix, storage); input_size = input_size.wrapping_sub(base.wrapping_sub(input_index)); input_index = base; next_emit = input_index; code_block_selection = CodeBlockState::NEXT_BLOCK; continue 'continue_to_next_block; } else { EmitLongInsertLen(insert, cmd_depth, cmd_bits, &mut cmd_histo[..], storage_ix, storage); } EmitLiterals(&input_ptr[(next_emit as (usize))..], insert, &mut lit_depth[..], &mut lit_bits[..], storage_ix, storage); if distance == last_distance { BrotliWriteBits(cmd_depth[64] as usize, cmd_bits[64] as u64, storage_ix, storage); { let _rhs = 1u32; let _lhs = &mut cmd_histo[64]; *_lhs = (*_lhs).wrapping_add(_rhs); } } else { EmitDistance(distance as usize, cmd_depth, cmd_bits, &mut cmd_histo[..], storage_ix, storage); last_distance = distance; } EmitCopyLenLastDistance(matched, cmd_depth, cmd_bits, &mut cmd_histo[..], storage_ix, storage); next_emit = ip_index; if ip_index >= ip_limit { code_block_selection = CodeBlockState::EMIT_REMAINDER; continue 'continue_to_next_block; } { assert!(ip_index >= 3); let input_bytes: u64 = BROTLI_UNALIGNED_LOAD64(&input_ptr[ip_index - 3..]); let mut prev_hash: u32 = HashBytesAtOffset(input_bytes, 0i32, shift); let cur_hash: u32 = HashBytesAtOffset(input_bytes, 3i32, shift); table[prev_hash as usize] = ip_index.wrapping_sub(base_ip) .wrapping_sub(3usize) as i32; prev_hash = HashBytesAtOffset(input_bytes, 1i32, shift); table[prev_hash as usize] = ip_index.wrapping_sub(base_ip) .wrapping_sub(2usize) as i32; prev_hash = HashBytesAtOffset(input_bytes, 2i32, shift); table[prev_hash as usize] = ip_index.wrapping_sub(base_ip) .wrapping_sub(1usize) as i32; candidate = base_ip.wrapping_add(table[cur_hash as usize] as usize); table[cur_hash as usize] = ip_index.wrapping_sub(base_ip) as i32; } } while IsMatch(&input_ptr[ip_index..], &input_ptr[candidate..]) != 0 { let base: usize = ip_index; let matched: usize = (5usize) .wrapping_add(FindMatchLengthWithLimit(&input_ptr[candidate + 5..], &input_ptr[ip_index + 5..], ip_end.wrapping_sub(ip_index) .wrapping_sub(5usize))); if ip_index.wrapping_sub(candidate) > (1usize << 18i32).wrapping_sub(16usize) { break; } ip_index = ip_index.wrapping_add(matched); last_distance = base.wrapping_sub(candidate) as i32; EmitCopyLen(matched, cmd_depth, cmd_bits, &mut cmd_histo[..], storage_ix, storage); EmitDistance(last_distance as usize, cmd_depth, cmd_bits, &mut cmd_histo[..], storage_ix, storage); next_emit = ip_index; if ip_index >= ip_limit { code_block_selection = CodeBlockState::EMIT_REMAINDER; continue 'continue_to_next_block; } { assert!(ip_index >= 3); let input_bytes: u64 = BROTLI_UNALIGNED_LOAD64(&input_ptr[ip_index as usize - 3..]); let mut prev_hash: u32 = HashBytesAtOffset(input_bytes, 0i32, shift); let cur_hash: u32 = HashBytesAtOffset(input_bytes, 3i32, shift); table[prev_hash as usize] = ip_index.wrapping_sub(base_ip) .wrapping_sub(3usize) as i32; prev_hash = HashBytesAtOffset(input_bytes, 1i32, shift); table[prev_hash as usize] = ip_index.wrapping_sub(base_ip) .wrapping_sub(2usize) as i32; prev_hash = HashBytesAtOffset(input_bytes, 2i32, shift); table[prev_hash as usize] = ip_index.wrapping_sub(base_ip) .wrapping_sub(1usize) as i32; candidate = base_ip.wrapping_add(table[cur_hash as usize] as usize); table[cur_hash as usize] = ip_index.wrapping_sub(base_ip) as i32; } } if code_block_selection as i32 == CodeBlockState::EMIT_REMAINDER as i32 { break; } if code_block_selection as i32 == CodeBlockState::EMIT_COMMANDS as i32 { next_hash = Hash(&input_ptr[{ ip_index = ip_index.wrapping_add(1usize); ip_index }..], shift); } } } code_block_selection = CodeBlockState::EMIT_REMAINDER; continue 'continue_to_next_block; } else if code_block_selection as i32 == CodeBlockState::EMIT_REMAINDER as i32 { input_index = input_index.wrapping_add(block_size); input_size = input_size.wrapping_sub(block_size); block_size = brotli_min_size_t(input_size, kMergeBlockSize); if input_size > 0 && (total_block_size.wrapping_add(block_size) <= (1i32 << 20i32) as usize) && (ShouldMergeBlock(&input_ptr[input_index..], block_size, &mut lit_depth[..]) != 0) { total_block_size = total_block_size.wrapping_add(block_size); UpdateBits(20usize, total_block_size.wrapping_sub(1usize) as (u32), mlen_storage_ix, storage); code_block_selection = CodeBlockState::EMIT_COMMANDS; continue 'continue_to_next_block; } if next_emit < ip_end { let insert: usize = ip_end.wrapping_sub(next_emit); if insert < 6210 { EmitInsertLen(insert, cmd_depth, cmd_bits, &mut cmd_histo[..], storage_ix, storage); EmitLiterals(&input_ptr[next_emit..], insert, &mut lit_depth[..], &mut lit_bits[..], storage_ix, storage); } else if ShouldUseUncompressedMode(next_emit as isize - metablock_start as isize, insert, literal_ratio) != 0 { EmitUncompressedMetaBlock(&input_ptr[metablock_start..], ip_end.wrapping_sub(metablock_start), mlen_storage_ix.wrapping_sub(3usize), storage_ix, storage); } else { EmitLongInsertLen(insert, cmd_depth, cmd_bits, &mut cmd_histo[..], storage_ix, storage); EmitLiterals(&input_ptr[next_emit..], insert, &mut lit_depth[..], &mut lit_bits[..], storage_ix, storage); } } next_emit = ip_end; code_block_selection = CodeBlockState::NEXT_BLOCK; continue 'continue_to_next_block; } else if code_block_selection as i32 == CodeBlockState::NEXT_BLOCK as i32 { if input_size > 0 { metablock_start = input_index; block_size = brotli_min_size_t(input_size, kFirstBlockSize); total_block_size = block_size; mlen_storage_ix = (*storage_ix).wrapping_add(3usize); BrotliStoreMetaBlockHeader(block_size, 0i32, storage_ix, storage); BrotliWriteBits(13usize, 0, storage_ix, storage); literal_ratio = BuildAndStoreLiteralPrefixCode(m, &input_ptr[(input_index as (usize))..], block_size, &mut lit_depth[..], &mut lit_bits[..], storage_ix, storage); BuildAndStoreCommandPrefixCode(&mut cmd_histo[..], cmd_depth, cmd_bits, storage_ix, storage); code_block_selection = CodeBlockState::EMIT_COMMANDS; continue 'continue_to_next_block; } break; } } if is_last == 0 { cmd_code[0] = 0; *cmd_code_numbits = 0; BuildAndStoreCommandPrefixCode(&mut cmd_histo[..], cmd_depth, cmd_bits, cmd_code_numbits, cmd_code); } } macro_rules! compress_specialization { ($table_bits : expr, $fname: ident) => { fn $fname>(mht: &mut AllocHT, input: &[u8], input_size: usize, is_last: i32, table: &mut [i32], cmd_depth: &mut [u8], cmd_bits: &mut [u16], cmd_code_numbits: &mut usize, cmd_code: &mut [u8], storage_ix: &mut usize, storage: &mut [u8]) { BrotliCompressFragmentFastImpl(mht, input, input_size, is_last, table, $table_bits, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage); } }; } compress_specialization!(9, BrotliCompressFragmentFastImpl9); compress_specialization!(11, BrotliCompressFragmentFastImpl11); compress_specialization!(13, BrotliCompressFragmentFastImpl13); compress_specialization!(15, BrotliCompressFragmentFastImpl15); pub fn BrotliCompressFragmentFast>(m: &mut AllocHT, input: &[u8], input_size: usize, is_last: i32, table: &mut [i32], table_size: usize, cmd_depth: &mut [u8], cmd_bits: &mut [u16], cmd_code_numbits: &mut usize, cmd_code: &mut [u8], storage_ix: &mut usize, storage: &mut [u8]){ let initial_storage_ix: usize = *storage_ix; let table_bits: usize = Log2FloorNonZero(table_size as u64) as (usize); if input_size == 0usize { 0i32; BrotliWriteBits(1usize, 1, storage_ix, storage); BrotliWriteBits(1usize, 1, storage_ix, storage); *storage_ix = (*storage_ix).wrapping_add(7u32 as (usize)) & !7u32 as (usize); return; } if table_bits == 9usize { BrotliCompressFragmentFastImpl9(m, input, input_size, is_last, table, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage); } if table_bits == 11usize { BrotliCompressFragmentFastImpl11(m, input, input_size, is_last, table, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage); } if table_bits == 13usize { BrotliCompressFragmentFastImpl13(m, input, input_size, is_last, table, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage); } if table_bits == 15usize { BrotliCompressFragmentFastImpl15(m, input, input_size, is_last, table, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage); } if (*storage_ix).wrapping_sub(initial_storage_ix) > (31usize).wrapping_add(input_size << 3i32) { EmitUncompressedMetaBlock(input, input_size, initial_storage_ix, storage_ix, storage); } if is_last != 0 { BrotliWriteBits(1usize, 1, storage_ix, storage); BrotliWriteBits(1usize, 1, storage_ix, storage); *storage_ix = (*storage_ix).wrapping_add(7u32 as (usize)) & !7u32 as (usize); } } brotli-3.4.0/src/enc/compress_fragment_two_pass.rs000075500000000000000000001172611046102023000204750ustar 00000000000000#![allow(dead_code)] use super::backward_references::kHashMul32; //use super::super::alloc::{SliceWrapper, SliceWrapperMut}; use super::bit_cost::BitsEntropy; use super::brotli_bit_stream::{BrotliBuildAndStoreHuffmanTreeFast, BrotliStoreHuffmanTree}; use super::entropy_encode::{BrotliConvertBitDepthsToSymbols, BrotliCreateHuffmanTree, HuffmanTree, NewHuffmanTree}; use super::static_dict::{BROTLI_UNALIGNED_LOAD32, BROTLI_UNALIGNED_LOAD64, BROTLI_UNALIGNED_STORE64, FindMatchLengthWithLimit}; use super::super::alloc; use super::util::{brotli_min_size_t, Log2FloorNonZero}; use core; static kCompressFragmentTwoPassBlockSize: usize = (1i32 << 17i32) as (usize); // returns number of commands inserted fn EmitInsertLen(insertlen: u32, commands: &mut &mut [u32]) -> usize { if insertlen < 6u32 { (*commands)[0] = insertlen; } else if insertlen < 130u32 { let tail: u32 = insertlen.wrapping_sub(2u32); let nbits: u32 = Log2FloorNonZero(tail as (u64)).wrapping_sub(1u32); let prefix: u32 = tail >> nbits; let inscode: u32 = (nbits << 1i32).wrapping_add(prefix).wrapping_add(2u32); let extra: u32 = tail.wrapping_sub(prefix << nbits); (*commands)[0] = inscode | extra << 8i32; } else if insertlen < 2114u32 { let tail: u32 = insertlen.wrapping_sub(66u32); let nbits: u32 = Log2FloorNonZero(tail as (u64)); let code: u32 = nbits.wrapping_add(10u32); let extra: u32 = tail.wrapping_sub(1u32 << nbits); (*commands)[0] = code | extra << 8i32; } else if insertlen < 6210u32 { let extra: u32 = insertlen.wrapping_sub(2114u32); (*commands)[0] = 21u32 | extra << 8i32; } else if insertlen < 22594u32 { let extra: u32 = insertlen.wrapping_sub(6210u32); (*commands)[0] = 22u32 | extra << 8i32; } else { let extra: u32 = insertlen.wrapping_sub(22594u32); (*commands)[0] = 23u32 | extra << 8i32; } let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); 1 } fn EmitDistance(distance: u32, commands: &mut &mut [u32]) -> usize { let d: u32 = distance.wrapping_add(3u32); let nbits: u32 = Log2FloorNonZero(d as (u64)).wrapping_sub(1u32); let prefix: u32 = d >> nbits & 1u32; let offset: u32 = (2u32).wrapping_add(prefix) << nbits; let distcode: u32 = (2u32).wrapping_mul(nbits.wrapping_sub(1u32)).wrapping_add(prefix).wrapping_add(80u32); let extra: u32 = d.wrapping_sub(offset); (*commands)[0] = distcode | extra << 8i32; let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); 1 } fn EmitCopyLenLastDistance(copylen: usize, commands: &mut &mut [u32]) -> usize { if copylen < 12usize { (*commands)[0] = copylen.wrapping_add(20usize) as (u32); let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); 1 } else if copylen < 72usize { let tail: usize = copylen.wrapping_sub(8usize); let nbits: usize = Log2FloorNonZero(tail as u64).wrapping_sub(1u32) as (usize); let prefix: usize = tail >> nbits; let code: usize = (nbits << 1i32).wrapping_add(prefix).wrapping_add(28usize); let extra: usize = tail.wrapping_sub(prefix << nbits); (*commands)[0] = (code | extra << 8i32) as (u32); let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); 1 } else if copylen < 136usize { let tail: usize = copylen.wrapping_sub(8usize); let code: usize = (tail >> 5i32).wrapping_add(54usize); let extra: usize = tail & 31usize; (*commands)[0] = (code | extra << 8i32) as (u32); let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); (*commands)[0] = 64u32; let remainder2 = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder2[1..]); 2 } else if copylen < 2120usize { let tail: usize = copylen.wrapping_sub(72usize); let nbits: usize = Log2FloorNonZero(tail as u64) as (usize); let code: usize = nbits.wrapping_add(52usize); let extra: usize = tail.wrapping_sub(1usize << nbits); (*commands)[0] = (code | extra << 8i32) as (u32); let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); (*commands)[0] = 64u32; let remainder2 = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder2[1..]); 2 } else { let extra: usize = copylen.wrapping_sub(2120usize); (*commands)[0] = (63usize | extra << 8i32) as (u32); let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); (*commands)[0] = 64u32; let remainder2 = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder2[1..]); 2 } } fn HashBytesAtOffset(v: u64, offset: i32, shift: usize, length: usize) -> u32 { 0i32; 0i32; { let h: u64 = (v >> 8i32 * offset << ((8 - length) * 8)).wrapping_mul(kHashMul32 as (u64)); (h >> shift) as (u32) } } fn EmitCopyLen(copylen: usize, commands: &mut &mut [u32]) -> usize { if copylen < 10usize { (*commands)[0] = copylen.wrapping_add(38usize) as (u32); } else if copylen < 134usize { let tail: usize = copylen.wrapping_sub(6usize); let nbits: usize = Log2FloorNonZero(tail as u64).wrapping_sub(1u32) as (usize); let prefix: usize = tail >> nbits; let code: usize = (nbits << 1i32).wrapping_add(prefix).wrapping_add(44usize); let extra: usize = tail.wrapping_sub(prefix << nbits); (*commands)[0] = (code | extra << 8i32) as (u32); } else if copylen < 2118usize { let tail: usize = copylen.wrapping_sub(70usize); let nbits: usize = Log2FloorNonZero(tail as u64) as (usize); let code: usize = nbits.wrapping_add(52usize); let extra: usize = tail.wrapping_sub(1usize << nbits); (*commands)[0] = (code | extra << 8i32) as (u32); } else { let extra: usize = copylen.wrapping_sub(2118usize); (*commands)[0] = (63usize | extra << 8i32) as (u32); } let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); 1 } fn Hash(p: &[u8], shift: usize, length:usize) -> u32 { let h: u64 = (BROTLI_UNALIGNED_LOAD64(p) << ((8 - length) * 8)).wrapping_mul(kHashMul32 as (u64)); (h >> shift) as (u32) } fn IsMatch(p1: &[u8], p2: &[u8], length: usize) -> i32 { if BROTLI_UNALIGNED_LOAD32(p1) == BROTLI_UNALIGNED_LOAD32(p2) { if length == 4 { return 1; } return ((p1[(4usize)] as (i32) == p2[(4usize)] as (i32)) && (p1[(5usize)] as (i32) == p2[(5usize)] as (i32))) as i32 } 0 } #[allow(unused_assignments)] fn CreateCommands(input_index: usize, block_size: usize, input_size: usize, base_ip: &[u8], table: &mut [i32], table_bits: usize, min_match: usize, literals: &mut &mut [u8], num_literals: &mut usize, commands: &mut &mut [u32], num_commands: &mut usize) { let mut ip_index: usize = input_index; let shift: usize = (64u32 as (usize)).wrapping_sub(table_bits); let ip_end: usize = input_index.wrapping_add(block_size); let mut next_emit: usize = input_index; let mut last_distance: i32 = -1i32; let kInputMarginBytes: usize = 16usize; if block_size >= kInputMarginBytes { let len_limit: usize = brotli_min_size_t(block_size.wrapping_sub(min_match), input_size.wrapping_sub(kInputMarginBytes)); let ip_limit: usize = input_index.wrapping_add(len_limit); let mut next_hash: u32; let mut goto_emit_remainder: i32 = 0i32; next_hash = Hash(&base_ip[({ ip_index = ip_index.wrapping_add(1 as (usize)); ip_index } as (usize))..], shift, min_match); while goto_emit_remainder == 0 { let mut skip: u32 = 32u32; let mut next_ip: usize = ip_index; let mut candidate: usize = 0; 0i32; loop { { 'break3: loop { { let hash: u32 = next_hash; let bytes_between_hash_lookups: u32 = ({ let _old = skip; skip = skip.wrapping_add(1 as (u32)); _old }) >> 5i32; ip_index = next_ip; 0i32; next_ip = ip_index.wrapping_add(bytes_between_hash_lookups as (usize)); if next_ip > ip_limit { goto_emit_remainder = 1i32; { { break 'break3; } } } next_hash = Hash(&base_ip[(next_ip as (usize))..], shift, min_match); 0i32; candidate = ip_index.wrapping_sub(last_distance as (usize)); if IsMatch(&base_ip[(ip_index as (usize))..], &base_ip[(candidate as (usize))..], min_match) != 0 { if candidate < ip_index { table[(hash as (usize))] = ip_index.wrapping_sub(0usize) as (i32); { { break 'break3; } } } } candidate = table[(hash as (usize))] as (usize); 0i32; 0i32; table[(hash as (usize))] = ip_index.wrapping_sub(0usize) as (i32); } if !(IsMatch(&base_ip[(ip_index as (usize))..], &base_ip[(candidate as (usize))..], min_match) == 0) { break; } } } if !(ip_index.wrapping_sub(candidate) > (1usize << 18i32).wrapping_sub(16usize) as (isize) as (usize) && (goto_emit_remainder == 0)) { break; } } if goto_emit_remainder != 0 { { break; } } { let base: usize = ip_index; let matched: usize = min_match .wrapping_add(FindMatchLengthWithLimit(&base_ip[(candidate as (usize) + min_match)..], &base_ip[(ip_index as (usize) + min_match)..], ip_end.wrapping_sub(ip_index) .wrapping_sub(min_match))); let distance: i32 = base.wrapping_sub(candidate) as (i32); let insert: i32 = base.wrapping_sub(next_emit) as (i32); ip_index = ip_index.wrapping_add(matched); 0i32; *num_commands += EmitInsertLen(insert as (u32), commands); (*literals)[..(insert as usize)].clone_from_slice(&base_ip[(next_emit as usize).. ((next_emit + insert as usize))]); *num_literals += insert as usize; let new_literals = core::mem::replace(literals, &mut []); let _ = core::mem::replace(literals, &mut new_literals[(insert as usize)..]); if distance == last_distance { (*commands)[0] = 64u32; let remainder = core::mem::replace(commands, &mut []); let _ = core::mem::replace(commands, &mut remainder[1..]); *num_commands += 1; } else { *num_commands += EmitDistance(distance as (u32), commands); last_distance = distance; } *num_commands += EmitCopyLenLastDistance(matched, commands); next_emit = ip_index; if ip_index >= ip_limit { goto_emit_remainder = 1i32; { { break; } } } { let mut input_bytes: u64; let mut prev_hash: u32; let cur_hash: u32; if min_match == 4 { input_bytes = BROTLI_UNALIGNED_LOAD64(&base_ip[(ip_index as (usize) - 3)..]); cur_hash = HashBytesAtOffset(input_bytes, 3i32, shift, min_match); prev_hash = HashBytesAtOffset(input_bytes, 0i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(3usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 1i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(2usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 0i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(1usize) as (i32); }else { assert!(ip_index >= 5); // could this be off the end FIXME input_bytes = BROTLI_UNALIGNED_LOAD64(&base_ip[(ip_index as (usize) - 5)..]); prev_hash = HashBytesAtOffset(input_bytes, 0i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(5usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 1i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(4usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 2i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(3usize) as (i32); assert!(ip_index >= 2); input_bytes = BROTLI_UNALIGNED_LOAD64(&base_ip[(ip_index as (usize) - 2)..]); cur_hash = HashBytesAtOffset(input_bytes, 2i32, shift, min_match); prev_hash = HashBytesAtOffset(input_bytes, 0i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(2usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 1i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(1usize) as (i32); } candidate = table[(cur_hash as (usize))] as (usize); table[(cur_hash as (usize))] = ip_index as (i32); } } while ip_index.wrapping_sub(candidate) <= (1usize << 18i32).wrapping_sub(16usize) as (isize) as (usize) && (IsMatch(&base_ip[(ip_index as (usize))..], &base_ip[(candidate as (usize))..], min_match) != 0) { let base_index: usize = ip_index; let matched: usize = min_match .wrapping_add(FindMatchLengthWithLimit(&base_ip[(candidate as (usize) + min_match)..], &base_ip[(ip_index as (usize) + min_match)..], ip_end.wrapping_sub(ip_index) .wrapping_sub(min_match))); ip_index = ip_index.wrapping_add(matched); last_distance = base_index.wrapping_sub(candidate) as (i32); 0i32; *num_commands += EmitCopyLen(matched, commands); *num_commands += EmitDistance(last_distance as (u32), commands); next_emit = ip_index; if ip_index >= ip_limit { goto_emit_remainder = 1i32; { { break; } } } { assert!(ip_index >= 5); let mut input_bytes: u64; let cur_hash: u32; let mut prev_hash: u32; if min_match == 4 { input_bytes = BROTLI_UNALIGNED_LOAD64(&base_ip[(ip_index as (usize) - 3)..]); cur_hash = HashBytesAtOffset(input_bytes, 3i32, shift, min_match); prev_hash = HashBytesAtOffset(input_bytes, 0i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(3usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 1i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(2usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 2i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(1usize) as (i32); } else { input_bytes = BROTLI_UNALIGNED_LOAD64(&base_ip[(ip_index as (usize) - 5)..]); prev_hash = HashBytesAtOffset(input_bytes, 0i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(5usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 1i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(4usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 2i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(3usize) as (i32); assert!(ip_index >= 2); input_bytes = BROTLI_UNALIGNED_LOAD64(&base_ip[(ip_index as (usize) - 2)..]); cur_hash = HashBytesAtOffset(input_bytes, 2i32, shift, min_match); prev_hash = HashBytesAtOffset(input_bytes, 0i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(2usize) as (i32); prev_hash = HashBytesAtOffset(input_bytes, 1i32, shift, min_match); table[(prev_hash as (usize))] = ip_index.wrapping_sub(1usize) as (i32); } candidate = table[(cur_hash as (usize))] as (usize); table[(cur_hash as (usize))] = ip_index as (i32); } } if goto_emit_remainder == 0 { next_hash = Hash(&base_ip[({ ip_index = ip_index.wrapping_add(1 as (usize)); ip_index } as (usize))..], shift, min_match); } } } 0i32; if next_emit < ip_end { let insert: u32 = ip_end.wrapping_sub(next_emit) as (u32); *num_commands += EmitInsertLen(insert, commands); literals[..insert as usize].clone_from_slice(&base_ip[(next_emit as (usize)).. (next_emit + insert as usize)]); let mut xliterals = core::mem::replace(literals, &mut []); *literals = &mut core::mem::replace(&mut xliterals, &mut [])[(insert as usize)..]; *num_literals += insert as usize; } } fn ShouldCompress(input: &[u8], input_size: usize, num_literals: usize) -> i32 { let corpus_size: super::util::floatX = input_size as (super::util::floatX); if num_literals as (super::util::floatX) < 0.98 as super::util::floatX * corpus_size { 1i32 } else { let mut literal_histo: [u32; 256] = [0; 256]; let max_total_bit_cost: super::util::floatX = corpus_size * 8i32 as (super::util::floatX) * 0.98 as super::util::floatX / 43i32 as (super::util::floatX); let mut i: usize; i = 0usize; while i < input_size { { let _rhs = 1; let _lhs = &mut literal_histo[input[(i as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } i = i.wrapping_add(43usize); } if !!(BitsEntropy(&mut literal_histo[..], 256usize) < max_total_bit_cost) { 1i32 } else { 0i32 } } } pub fn BrotliWriteBits(n_bits: usize, bits: u64, pos: &mut usize, array: &mut [u8]) { let p = &mut array[((*pos >> 3i32) as (usize))..]; let mut v: u64 = p[0] as (u64); v = v | bits << (*pos & 7); BROTLI_UNALIGNED_STORE64(p, v); *pos = (*pos).wrapping_add(n_bits); } pub fn BrotliStoreMetaBlockHeader(len: usize, is_uncompressed: i32, storage_ix: &mut usize, storage: &mut [u8]) { let mut nibbles: u64 = 6; BrotliWriteBits(1, 0, storage_ix, storage); if len <= (1u32 << 16i32) as (usize) { nibbles = 4; } else if len <= (1u32 << 20i32) as (usize) { nibbles = 5; } BrotliWriteBits(2, nibbles.wrapping_sub(4), storage_ix, storage); BrotliWriteBits(nibbles.wrapping_mul(4) as usize, len.wrapping_sub(1) as u64, storage_ix, storage); BrotliWriteBits(1usize, is_uncompressed as (u64), storage_ix, storage); } pub fn memcpy(dst: &mut [T], dst_offset: usize, src: &[T], src_offset: usize, size_to_copy: usize) { dst[dst_offset..(dst_offset + size_to_copy)].clone_from_slice(&src[src_offset.. (src_offset + size_to_copy)]); } fn BuildAndStoreCommandPrefixCode(histogram: &[u32], depth: &mut [u8], mut bits: &mut [u16], storage_ix: &mut usize, storage: &mut [u8]) { let mut tree: [HuffmanTree; 129] = [NewHuffmanTree(0, 0, 0); 129]; let mut cmd_depth: [u8; 704] = [0; 704]; let mut cmd_bits: [u16; 64] = [0; 64]; BrotliCreateHuffmanTree(histogram, 64usize, 15i32, &mut tree[..], depth); BrotliCreateHuffmanTree(&histogram[(64usize)..], 64usize, 14i32, &mut tree[..], &mut depth[(64usize)..]); /* We have to jump through a few hoops here in order to compute the command bits because the symbols are in a different order than in the full alphabet. This looks complicated, but having the symbols in this order in the command bits saves a few branches in the Emit* functions. */ memcpy(&mut cmd_depth[..], 0, depth, 24, 24); memcpy(&mut cmd_depth[..], 24, depth, 0, 8); memcpy(&mut cmd_depth[..], 32i32 as (usize), depth, (48usize), 8usize); memcpy(&mut cmd_depth[..], 40i32 as (usize), depth, (8usize), 8usize); memcpy(&mut cmd_depth[..], 48i32 as (usize), depth, (56usize), 8usize); memcpy(&mut cmd_depth[..], 56i32 as (usize), depth, (16usize), 8usize); BrotliConvertBitDepthsToSymbols(&mut cmd_depth[..], 64usize, &mut cmd_bits[..]); memcpy(&mut bits, 0, &cmd_bits[..], 24i32 as (usize), 16usize); memcpy(&mut bits, (8usize), &cmd_bits[..], 40i32 as (usize), 8usize); memcpy(&mut bits, (16usize), &cmd_bits[..], 56i32 as (usize), 8usize); memcpy(&mut bits, (24usize), &cmd_bits[..], 0, 48usize); memcpy(&mut bits, (48usize), &cmd_bits[..], 32i32 as (usize), 8usize); memcpy(&mut bits, (56usize), &cmd_bits[..], 48i32 as (usize), 8usize); BrotliConvertBitDepthsToSymbols(&mut depth[(64usize)..], 64usize, &mut bits[(64usize)..]); { let mut i: usize; for item in cmd_depth[..64].iter_mut() { *item = 0; } //memset(&mut cmd_depth[..], 0i32, 64usize); memcpy(&mut cmd_depth[..], 0, depth, (24usize), 8usize); memcpy(&mut cmd_depth[..], 64i32 as (usize), depth, (32usize), 8usize); memcpy(&mut cmd_depth[..], 128i32 as (usize), depth, (40usize), 8usize); memcpy(&mut cmd_depth[..], 192i32 as (usize), depth, (48usize), 8usize); memcpy(&mut cmd_depth[..], 384i32 as (usize), depth, (56usize), 8usize); i = 0usize; while i < 8usize { { cmd_depth[(128usize).wrapping_add((8usize).wrapping_mul(i))] = depth[(i as (usize))]; cmd_depth[(256usize).wrapping_add((8usize).wrapping_mul(i))] = depth[i.wrapping_add(8)]; cmd_depth[(448usize).wrapping_add((8usize).wrapping_mul(i))] = depth[i.wrapping_add(16)]; } i = i.wrapping_add(1 as (usize)); } BrotliStoreHuffmanTree(&mut cmd_depth[..], 704usize, &mut tree[..], storage_ix, storage); } BrotliStoreHuffmanTree(&mut depth[(64usize)..], 64usize, &mut tree[..], storage_ix, storage); } fn StoreCommands>(mht: &mut AllocHT, mut literals: &[u8], num_literals: usize, commands: &[u32], num_commands: usize, storage_ix: &mut usize, storage: &mut [u8]) { static kNumExtraBits: [u32; 128] = [0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 1u32, 1u32, 2u32, 2u32, 3u32, 3u32, 4u32, 4u32, 5u32, 5u32, 6u32, 7u32, 8u32, 9u32, 10u32, 12u32, 14u32, 24u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 1u32, 1u32, 2u32, 2u32, 3u32, 3u32, 4u32, 4u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 1u32, 1u32, 2u32, 2u32, 3u32, 3u32, 4u32, 4u32, 5u32, 5u32, 6u32, 7u32, 8u32, 9u32, 10u32, 24u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 1u32, 1u32, 2u32, 2u32, 3u32, 3u32, 4u32, 4u32, 5u32, 5u32, 6u32, 6u32, 7u32, 7u32, 8u32, 8u32, 9u32, 9u32, 10u32, 10u32, 11u32, 11u32, 12u32, 12u32, 13u32, 13u32, 14u32, 14u32, 15u32, 15u32, 16u32, 16u32, 17u32, 17u32, 18u32, 18u32, 19u32, 19u32, 20u32, 20u32, 21u32, 21u32, 22u32, 22u32, 23u32, 23u32, 24u32, 24u32]; static kInsertOffset: [u32; 24] = [0u32, 1u32, 2u32, 3u32, 4u32, 5u32, 6u32, 8u32, 10u32, 14u32, 18u32, 26u32, 34u32, 50u32, 66u32, 98u32, 130u32, 194u32, 322u32, 578u32, 1090u32, 2114u32, 6210u32, 22594u32]; let mut lit_depths: [u8; 256] = [0; 256]; let mut lit_bits: [u16; 256] = [0; 256]; // maybe return this instead let mut lit_histo: [u32; 256] = [0; 256]; // maybe return this instead of init let mut cmd_depths: [u8; 128] = [0; 128]; let mut cmd_bits: [u16; 128] = [0; 128]; let mut cmd_histo: [u32; 128] = [0; 128]; let mut i: usize; i = 0usize; while i < num_literals { { let _rhs = 1; let _lhs = &mut lit_histo[literals[(i as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } i = i.wrapping_add(1 as (usize)); } BrotliBuildAndStoreHuffmanTreeFast(mht, &lit_histo[..], num_literals, 8usize, &mut lit_depths[..], &mut lit_bits[..], storage_ix, storage); i = 0usize; while i < num_commands { { let code: u32 = commands[(i as (usize))] & 0xffu32; 0i32; { let _rhs = 1; let _lhs = &mut cmd_histo[code as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } i = i.wrapping_add(1 as (usize)); } { let _rhs = 1i32; let _lhs = &mut cmd_histo[1usize]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } { let _rhs = 1i32; let _lhs = &mut cmd_histo[2usize]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } { let _rhs = 1i32; let _lhs = &mut cmd_histo[64usize]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } { let _rhs = 1i32; let _lhs = &mut cmd_histo[84usize]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } BuildAndStoreCommandPrefixCode(&mut cmd_histo[..], &mut cmd_depths[..], &mut cmd_bits[..], storage_ix, storage); i = 0usize; while i < num_commands { { let cmd: u32 = commands[(i as (usize))]; let code: u32 = cmd & 0xffu32; let extra: u32 = cmd >> 8i32; 0i32; BrotliWriteBits(cmd_depths[code as (usize)] as (usize), cmd_bits[code as (usize)] as (u64), storage_ix, storage); BrotliWriteBits(kNumExtraBits[code as (usize)] as (usize), extra as (u64), storage_ix, storage); if code < 24u32 { let insert: u32 = kInsertOffset[code as (usize)].wrapping_add(extra); for literal in literals[..(insert as usize)].iter() { let lit: u8 = *literal; BrotliWriteBits(lit_depths[lit as (usize)] as (usize), lit_bits[lit as (usize)] as (u64), storage_ix, storage); } literals = &literals[insert as usize..]; } } i = i.wrapping_add(1 as (usize)); } } fn EmitUncompressedMetaBlock(input: &[u8], input_size: usize, storage_ix: &mut usize, storage: &mut [u8]) { BrotliStoreMetaBlockHeader(input_size, 1i32, storage_ix, storage); *storage_ix = (*storage_ix).wrapping_add(7u32 as (usize)) & !7u32 as (usize); memcpy(storage, ((*storage_ix >> 3i32) as (usize)), input, 0, input_size); *storage_ix = (*storage_ix).wrapping_add(input_size << 3i32); storage[((*storage_ix >> 3i32) as (usize))] = 0i32 as (u8); } #[allow(unused_variables)] #[inline(always)] fn BrotliCompressFragmentTwoPassImpl>(m: &mut AllocHT, base_ip: &[u8], mut input_size: usize, is_last: i32, command_buf: &mut [u32], literal_buf: &mut [u8], table: &mut [i32], table_bits: usize, min_match: usize, storage_ix: &mut usize, storage: &mut [u8]){ let mut input_index: usize = 0usize; while input_size > 0usize { let block_size: usize = brotli_min_size_t(input_size, kCompressFragmentTwoPassBlockSize); let mut num_literals: usize = 0; let mut num_commands: usize = 0; { let mut literals = &mut literal_buf[..]; let mut commands = &mut command_buf[..]; CreateCommands(input_index, block_size, input_size, base_ip, table, table_bits, min_match, &mut literals, &mut num_literals, &mut commands, &mut num_commands); } if ShouldCompress(&base_ip[(input_index as (usize))..], block_size, num_literals) != 0 { BrotliStoreMetaBlockHeader(block_size, 0i32, storage_ix, storage); BrotliWriteBits(13usize, 0, storage_ix, storage); StoreCommands(m, literal_buf, num_literals, command_buf, num_commands, storage_ix, storage); } else { EmitUncompressedMetaBlock(&base_ip[(input_index as (usize))..], block_size, storage_ix, storage); } input_index = input_index.wrapping_add(block_size); input_size = input_size.wrapping_sub(block_size); } } macro_rules! compress_specialization { ($table_bits : expr, $fname: ident) => { fn $fname>(mht: &mut AllocHT, input: &[u8], input_size: usize, is_last: i32, command_buf: &mut [u32], literal_buf: &mut [u8], table: &mut [i32], storage_ix: &mut usize, storage: &mut [u8]) { let min_match = if $table_bits < 15 {4} else {6}; BrotliCompressFragmentTwoPassImpl(mht, input, input_size, is_last, command_buf, literal_buf, table, $table_bits, min_match, storage_ix, storage); } }; } compress_specialization!(8, BrotliCompressFragmentTwoPassImpl8); compress_specialization!(9, BrotliCompressFragmentTwoPassImpl9); compress_specialization!(10, BrotliCompressFragmentTwoPassImpl10); compress_specialization!(11, BrotliCompressFragmentTwoPassImpl11); compress_specialization!(12, BrotliCompressFragmentTwoPassImpl12); compress_specialization!(13, BrotliCompressFragmentTwoPassImpl13); compress_specialization!(14, BrotliCompressFragmentTwoPassImpl14); compress_specialization!(15, BrotliCompressFragmentTwoPassImpl15); compress_specialization!(16, BrotliCompressFragmentTwoPassImpl16); compress_specialization!(17, BrotliCompressFragmentTwoPassImpl17); fn RewindBitPosition(new_storage_ix: usize, storage_ix: &mut usize, storage: &mut [u8]) { let bitpos: usize = new_storage_ix & 7usize; let mask: usize = (1u32 << bitpos).wrapping_sub(1u32) as (usize); { let _rhs = mask as (u8); let _lhs = &mut storage[((new_storage_ix >> 3i32) as (usize))]; *_lhs = (*_lhs as (i32) & _rhs as (i32)) as (u8); } *storage_ix = new_storage_ix; } pub fn BrotliCompressFragmentTwoPass>(m: &mut AllocHT, input: &[u8], input_size: usize, is_last: i32, command_buf: &mut [u32], literal_buf: &mut [u8], table: &mut [i32], table_size: usize, storage_ix: &mut usize, storage: &mut [u8]){ let initial_storage_ix: usize = *storage_ix; let table_bits: usize = Log2FloorNonZero(table_size as u64) as (usize); if table_bits == 8usize { BrotliCompressFragmentTwoPassImpl8(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 9usize { BrotliCompressFragmentTwoPassImpl9(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 10usize { BrotliCompressFragmentTwoPassImpl10(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 11usize { BrotliCompressFragmentTwoPassImpl11(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 12usize { BrotliCompressFragmentTwoPassImpl12(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 13usize { BrotliCompressFragmentTwoPassImpl13(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 14usize { BrotliCompressFragmentTwoPassImpl14(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 15usize { BrotliCompressFragmentTwoPassImpl15(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 16usize { BrotliCompressFragmentTwoPassImpl16(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if table_bits == 17usize { BrotliCompressFragmentTwoPassImpl17(m, input, input_size, is_last, command_buf, literal_buf, table, storage_ix, storage); } if (*storage_ix).wrapping_sub(initial_storage_ix) > (31usize).wrapping_add(input_size << 3i32) { RewindBitPosition(initial_storage_ix, storage_ix, storage); EmitUncompressedMetaBlock(input, input_size, storage_ix, storage); } if is_last != 0 { BrotliWriteBits(1, 1, storage_ix, storage); BrotliWriteBits(1, 1, storage_ix, storage); *storage_ix = (*storage_ix).wrapping_add(7u32 as (usize)) & !7u32 as (usize); } } brotli-3.4.0/src/enc/constants.rs000075500000000000000000006212551046102023000150570ustar 00000000000000#![allow(dead_code)] pub const BROTLI_NUM_BLOCK_LEN_SYMBOLS: usize = 26; pub static kInsBase: [u32; 24] = [0u32, 1u32, 2u32, 3u32, 4u32, 5u32, 6u32, 8u32, 10u32, 14u32, 18u32, 26u32, 34u32, 50u32, 66u32, 98u32, 130u32, 194u32, 322u32, 578u32, 1090u32, 2114u32, 6210u32, 22594u32]; pub static kInsExtra: [u32; 24] = [0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 1u32, 1u32, 2u32, 2u32, 3u32, 3u32, 4u32, 4u32, 5u32, 5u32, 6u32, 7u32, 8u32, 9u32, 10u32, 12u32, 14u32, 24u32]; pub static kCopyBase: [u32; 24] = [2u32, 3u32, 4u32, 5u32, 6u32, 7u32, 8u32, 9u32, 10u32, 12u32, 14u32, 18u32, 22u32, 30u32, 38u32, 54u32, 70u32, 102u32, 134u32, 198u32, 326u32, 582u32, 1094u32, 2118u32]; pub static kCopyExtra: [u32; 24] = [0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 1u32, 1u32, 2u32, 2u32, 3u32, 3u32, 4u32, 4u32, 5u32, 5u32, 6u32, 7u32, 8u32, 9u32, 10u32, 24u32]; /* Common context lookup table for all context modes. */ static kContextLookup:[u8;2048] = [ /* CONTEXT_LSB6, last byte. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* CONTEXT_LSB6, second last byte, */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* CONTEXT_MSB6, last byte. */ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, /* CONTEXT_MSB6, second last byte, */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* CONTEXT_UTF8, last byte. */ /* ASCII range. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12, 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12, 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0, /* UTF8 continuation byte range. */ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, /* UTF8 lead byte range. */ 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, /* CONTEXT_UTF8 second last byte. */ /* ASCII range. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0, /* UTF8 continuation byte range. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* UTF8 lead byte range. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */ 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, /* CONTEXT_SIGNED, second last byte. */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, ]; pub const BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS:usize = 544; pub const BROTLI_NUM_LITERAL_SYMBOLS:usize = 256; pub const BROTLI_NUM_COMMAND_SYMBOLS:usize = 704; pub const BROTLI_WINDOW_GAP: usize = 16; pub const BROTLI_MAX_NPOSTFIX:usize = 3; pub const BROTLI_MAX_NDIRECT:usize = 120; #[inline(always)] pub fn BROTLI_CONTEXT_LUT(mode: super::histogram::ContextType)->&'static[u8] { &kContextLookup[((mode as usize) << 9)..] } pub fn BROTLI_CONTEXT(P1: u8, P2:u8, LUT:&[u8])->u8 { (LUT)[P1 as usize] | ((LUT)[256 + P2 as usize]) } pub static kZeroRepsBits: [usize; 704] = [0x0usize, 0x0usize, 0x0usize, 0x7usize, 0x17usize, 0x27usize, 0x37usize, 0x47usize, 0x57usize, 0x67usize, 0x77usize, 0x770usize, 0xb87usize, 0x1387usize, 0x1b87usize, 0x2387usize, 0x2b87usize, 0x3387usize, 0x3b87usize, 0x397usize, 0xb97usize, 0x1397usize, 0x1b97usize, 0x2397usize, 0x2b97usize, 0x3397usize, 0x3b97usize, 0x3a7usize, 0xba7usize, 0x13a7usize, 0x1ba7usize, 0x23a7usize, 0x2ba7usize, 0x33a7usize, 0x3ba7usize, 0x3b7usize, 0xbb7usize, 0x13b7usize, 0x1bb7usize, 0x23b7usize, 0x2bb7usize, 0x33b7usize, 0x3bb7usize, 0x3c7usize, 0xbc7usize, 0x13c7usize, 0x1bc7usize, 0x23c7usize, 0x2bc7usize, 0x33c7usize, 0x3bc7usize, 0x3d7usize, 0xbd7usize, 0x13d7usize, 0x1bd7usize, 0x23d7usize, 0x2bd7usize, 0x33d7usize, 0x3bd7usize, 0x3e7usize, 0xbe7usize, 0x13e7usize, 0x1be7usize, 0x23e7usize, 0x2be7usize, 0x33e7usize, 0x3be7usize, 0x3f7usize, 0xbf7usize, 0x13f7usize, 0x1bf7usize, 0x23f7usize, 0x2bf7usize, 0x33f7usize, 0x3bf7usize, 0x1c387usize, 0x5c387usize, 0x9c387usize, 0xdc387usize, 0x11c387usize, 0x15c387usize, 0x19c387usize, 0x1dc387usize, 0x1cb87usize, 0x5cb87usize, 0x9cb87usize, 0xdcb87usize, 0x11cb87usize, 0x15cb87usize, 0x19cb87usize, 0x1dcb87usize, 0x1d387usize, 0x5d387usize, 0x9d387usize, 0xdd387usize, 0x11d387usize, 0x15d387usize, 0x19d387usize, 0x1dd387usize, 0x1db87usize, 0x5db87usize, 0x9db87usize, 0xddb87usize, 0x11db87usize, 0x15db87usize, 0x19db87usize, 0x1ddb87usize, 0x1e387usize, 0x5e387usize, 0x9e387usize, 0xde387usize, 0x11e387usize, 0x15e387usize, 0x19e387usize, 0x1de387usize, 0x1eb87usize, 0x5eb87usize, 0x9eb87usize, 0xdeb87usize, 0x11eb87usize, 0x15eb87usize, 0x19eb87usize, 0x1deb87usize, 0x1f387usize, 0x5f387usize, 0x9f387usize, 0xdf387usize, 0x11f387usize, 0x15f387usize, 0x19f387usize, 0x1df387usize, 0x1fb87usize, 0x5fb87usize, 0x9fb87usize, 0xdfb87usize, 0x11fb87usize, 0x15fb87usize, 0x19fb87usize, 0x1dfb87usize, 0x1c397usize, 0x5c397usize, 0x9c397usize, 0xdc397usize, 0x11c397usize, 0x15c397usize, 0x19c397usize, 0x1dc397usize, 0x1cb97usize, 0x5cb97usize, 0x9cb97usize, 0xdcb97usize, 0x11cb97usize, 0x15cb97usize, 0x19cb97usize, 0x1dcb97usize, 0x1d397usize, 0x5d397usize, 0x9d397usize, 0xdd397usize, 0x11d397usize, 0x15d397usize, 0x19d397usize, 0x1dd397usize, 0x1db97usize, 0x5db97usize, 0x9db97usize, 0xddb97usize, 0x11db97usize, 0x15db97usize, 0x19db97usize, 0x1ddb97usize, 0x1e397usize, 0x5e397usize, 0x9e397usize, 0xde397usize, 0x11e397usize, 0x15e397usize, 0x19e397usize, 0x1de397usize, 0x1eb97usize, 0x5eb97usize, 0x9eb97usize, 0xdeb97usize, 0x11eb97usize, 0x15eb97usize, 0x19eb97usize, 0x1deb97usize, 0x1f397usize, 0x5f397usize, 0x9f397usize, 0xdf397usize, 0x11f397usize, 0x15f397usize, 0x19f397usize, 0x1df397usize, 0x1fb97usize, 0x5fb97usize, 0x9fb97usize, 0xdfb97usize, 0x11fb97usize, 0x15fb97usize, 0x19fb97usize, 0x1dfb97usize, 0x1c3a7usize, 0x5c3a7usize, 0x9c3a7usize, 0xdc3a7usize, 0x11c3a7usize, 0x15c3a7usize, 0x19c3a7usize, 0x1dc3a7usize, 0x1cba7usize, 0x5cba7usize, 0x9cba7usize, 0xdcba7usize, 0x11cba7usize, 0x15cba7usize, 0x19cba7usize, 0x1dcba7usize, 0x1d3a7usize, 0x5d3a7usize, 0x9d3a7usize, 0xdd3a7usize, 0x11d3a7usize, 0x15d3a7usize, 0x19d3a7usize, 0x1dd3a7usize, 0x1dba7usize, 0x5dba7usize, 0x9dba7usize, 0xddba7usize, 0x11dba7usize, 0x15dba7usize, 0x19dba7usize, 0x1ddba7usize, 0x1e3a7usize, 0x5e3a7usize, 0x9e3a7usize, 0xde3a7usize, 0x11e3a7usize, 0x15e3a7usize, 0x19e3a7usize, 0x1de3a7usize, 0x1eba7usize, 0x5eba7usize, 0x9eba7usize, 0xdeba7usize, 0x11eba7usize, 0x15eba7usize, 0x19eba7usize, 0x1deba7usize, 0x1f3a7usize, 0x5f3a7usize, 0x9f3a7usize, 0xdf3a7usize, 0x11f3a7usize, 0x15f3a7usize, 0x19f3a7usize, 0x1df3a7usize, 0x1fba7usize, 0x5fba7usize, 0x9fba7usize, 0xdfba7usize, 0x11fba7usize, 0x15fba7usize, 0x19fba7usize, 0x1dfba7usize, 0x1c3b7usize, 0x5c3b7usize, 0x9c3b7usize, 0xdc3b7usize, 0x11c3b7usize, 0x15c3b7usize, 0x19c3b7usize, 0x1dc3b7usize, 0x1cbb7usize, 0x5cbb7usize, 0x9cbb7usize, 0xdcbb7usize, 0x11cbb7usize, 0x15cbb7usize, 0x19cbb7usize, 0x1dcbb7usize, 0x1d3b7usize, 0x5d3b7usize, 0x9d3b7usize, 0xdd3b7usize, 0x11d3b7usize, 0x15d3b7usize, 0x19d3b7usize, 0x1dd3b7usize, 0x1dbb7usize, 0x5dbb7usize, 0x9dbb7usize, 0xddbb7usize, 0x11dbb7usize, 0x15dbb7usize, 0x19dbb7usize, 0x1ddbb7usize, 0x1e3b7usize, 0x5e3b7usize, 0x9e3b7usize, 0xde3b7usize, 0x11e3b7usize, 0x15e3b7usize, 0x19e3b7usize, 0x1de3b7usize, 0x1ebb7usize, 0x5ebb7usize, 0x9ebb7usize, 0xdebb7usize, 0x11ebb7usize, 0x15ebb7usize, 0x19ebb7usize, 0x1debb7usize, 0x1f3b7usize, 0x5f3b7usize, 0x9f3b7usize, 0xdf3b7usize, 0x11f3b7usize, 0x15f3b7usize, 0x19f3b7usize, 0x1df3b7usize, 0x1fbb7usize, 0x5fbb7usize, 0x9fbb7usize, 0xdfbb7usize, 0x11fbb7usize, 0x15fbb7usize, 0x19fbb7usize, 0x1dfbb7usize, 0x1c3c7usize, 0x5c3c7usize, 0x9c3c7usize, 0xdc3c7usize, 0x11c3c7usize, 0x15c3c7usize, 0x19c3c7usize, 0x1dc3c7usize, 0x1cbc7usize, 0x5cbc7usize, 0x9cbc7usize, 0xdcbc7usize, 0x11cbc7usize, 0x15cbc7usize, 0x19cbc7usize, 0x1dcbc7usize, 0x1d3c7usize, 0x5d3c7usize, 0x9d3c7usize, 0xdd3c7usize, 0x11d3c7usize, 0x15d3c7usize, 0x19d3c7usize, 0x1dd3c7usize, 0x1dbc7usize, 0x5dbc7usize, 0x9dbc7usize, 0xddbc7usize, 0x11dbc7usize, 0x15dbc7usize, 0x19dbc7usize, 0x1ddbc7usize, 0x1e3c7usize, 0x5e3c7usize, 0x9e3c7usize, 0xde3c7usize, 0x11e3c7usize, 0x15e3c7usize, 0x19e3c7usize, 0x1de3c7usize, 0x1ebc7usize, 0x5ebc7usize, 0x9ebc7usize, 0xdebc7usize, 0x11ebc7usize, 0x15ebc7usize, 0x19ebc7usize, 0x1debc7usize, 0x1f3c7usize, 0x5f3c7usize, 0x9f3c7usize, 0xdf3c7usize, 0x11f3c7usize, 0x15f3c7usize, 0x19f3c7usize, 0x1df3c7usize, 0x1fbc7usize, 0x5fbc7usize, 0x9fbc7usize, 0xdfbc7usize, 0x11fbc7usize, 0x15fbc7usize, 0x19fbc7usize, 0x1dfbc7usize, 0x1c3d7usize, 0x5c3d7usize, 0x9c3d7usize, 0xdc3d7usize, 0x11c3d7usize, 0x15c3d7usize, 0x19c3d7usize, 0x1dc3d7usize, 0x1cbd7usize, 0x5cbd7usize, 0x9cbd7usize, 0xdcbd7usize, 0x11cbd7usize, 0x15cbd7usize, 0x19cbd7usize, 0x1dcbd7usize, 0x1d3d7usize, 0x5d3d7usize, 0x9d3d7usize, 0xdd3d7usize, 0x11d3d7usize, 0x15d3d7usize, 0x19d3d7usize, 0x1dd3d7usize, 0x1dbd7usize, 0x5dbd7usize, 0x9dbd7usize, 0xddbd7usize, 0x11dbd7usize, 0x15dbd7usize, 0x19dbd7usize, 0x1ddbd7usize, 0x1e3d7usize, 0x5e3d7usize, 0x9e3d7usize, 0xde3d7usize, 0x11e3d7usize, 0x15e3d7usize, 0x19e3d7usize, 0x1de3d7usize, 0x1ebd7usize, 0x5ebd7usize, 0x9ebd7usize, 0xdebd7usize, 0x11ebd7usize, 0x15ebd7usize, 0x19ebd7usize, 0x1debd7usize, 0x1f3d7usize, 0x5f3d7usize, 0x9f3d7usize, 0xdf3d7usize, 0x11f3d7usize, 0x15f3d7usize, 0x19f3d7usize, 0x1df3d7usize, 0x1fbd7usize, 0x5fbd7usize, 0x9fbd7usize, 0xdfbd7usize, 0x11fbd7usize, 0x15fbd7usize, 0x19fbd7usize, 0x1dfbd7usize, 0x1c3e7usize, 0x5c3e7usize, 0x9c3e7usize, 0xdc3e7usize, 0x11c3e7usize, 0x15c3e7usize, 0x19c3e7usize, 0x1dc3e7usize, 0x1cbe7usize, 0x5cbe7usize, 0x9cbe7usize, 0xdcbe7usize, 0x11cbe7usize, 0x15cbe7usize, 0x19cbe7usize, 0x1dcbe7usize, 0x1d3e7usize, 0x5d3e7usize, 0x9d3e7usize, 0xdd3e7usize, 0x11d3e7usize, 0x15d3e7usize, 0x19d3e7usize, 0x1dd3e7usize, 0x1dbe7usize, 0x5dbe7usize, 0x9dbe7usize, 0xddbe7usize, 0x11dbe7usize, 0x15dbe7usize, 0x19dbe7usize, 0x1ddbe7usize, 0x1e3e7usize, 0x5e3e7usize, 0x9e3e7usize, 0xde3e7usize, 0x11e3e7usize, 0x15e3e7usize, 0x19e3e7usize, 0x1de3e7usize, 0x1ebe7usize, 0x5ebe7usize, 0x9ebe7usize, 0xdebe7usize, 0x11ebe7usize, 0x15ebe7usize, 0x19ebe7usize, 0x1debe7usize, 0x1f3e7usize, 0x5f3e7usize, 0x9f3e7usize, 0xdf3e7usize, 0x11f3e7usize, 0x15f3e7usize, 0x19f3e7usize, 0x1df3e7usize, 0x1fbe7usize, 0x5fbe7usize, 0x9fbe7usize, 0xdfbe7usize, 0x11fbe7usize, 0x15fbe7usize, 0x19fbe7usize, 0x1dfbe7usize, 0x1c3f7usize, 0x5c3f7usize, 0x9c3f7usize, 0xdc3f7usize, 0x11c3f7usize, 0x15c3f7usize, 0x19c3f7usize, 0x1dc3f7usize, 0x1cbf7usize, 0x5cbf7usize, 0x9cbf7usize, 0xdcbf7usize, 0x11cbf7usize, 0x15cbf7usize, 0x19cbf7usize, 0x1dcbf7usize, 0x1d3f7usize, 0x5d3f7usize, 0x9d3f7usize, 0xdd3f7usize, 0x11d3f7usize, 0x15d3f7usize, 0x19d3f7usize, 0x1dd3f7usize, 0x1dbf7usize, 0x5dbf7usize, 0x9dbf7usize, 0xddbf7usize, 0x11dbf7usize, 0x15dbf7usize, 0x19dbf7usize, 0x1ddbf7usize, 0x1e3f7usize, 0x5e3f7usize, 0x9e3f7usize, 0xde3f7usize, 0x11e3f7usize, 0x15e3f7usize, 0x19e3f7usize, 0x1de3f7usize, 0x1ebf7usize, 0x5ebf7usize, 0x9ebf7usize, 0xdebf7usize, 0x11ebf7usize, 0x15ebf7usize, 0x19ebf7usize, 0x1debf7usize, 0x1f3f7usize, 0x5f3f7usize, 0x9f3f7usize, 0xdf3f7usize, 0x11f3f7usize, 0x15f3f7usize, 0x19f3f7usize, 0x1df3f7usize, 0x1fbf7usize, 0x5fbf7usize, 0x9fbf7usize, 0xdfbf7usize, 0x11fbf7usize, 0x15fbf7usize, 0x19fbf7usize, 0x1dfbf7usize, 0xe1c387usize, 0x2e1c387usize, 0x4e1c387usize, 0x6e1c387usize, 0x8e1c387usize, 0xae1c387usize, 0xce1c387usize, 0xee1c387usize, 0xe5c387usize, 0x2e5c387usize, 0x4e5c387usize, 0x6e5c387usize, 0x8e5c387usize, 0xae5c387usize, 0xce5c387usize, 0xee5c387usize, 0xe9c387usize, 0x2e9c387usize, 0x4e9c387usize, 0x6e9c387usize, 0x8e9c387usize, 0xae9c387usize, 0xce9c387usize, 0xee9c387usize, 0xedc387usize, 0x2edc387usize, 0x4edc387usize, 0x6edc387usize, 0x8edc387usize, 0xaedc387usize, 0xcedc387usize, 0xeedc387usize, 0xf1c387usize, 0x2f1c387usize, 0x4f1c387usize, 0x6f1c387usize, 0x8f1c387usize, 0xaf1c387usize, 0xcf1c387usize, 0xef1c387usize, 0xf5c387usize, 0x2f5c387usize, 0x4f5c387usize, 0x6f5c387usize, 0x8f5c387usize, 0xaf5c387usize, 0xcf5c387usize, 0xef5c387usize, 0xf9c387usize, 0x2f9c387usize, 0x4f9c387usize, 0x6f9c387usize, 0x8f9c387usize, 0xaf9c387usize, 0xcf9c387usize, 0xef9c387usize, 0xfdc387usize, 0x2fdc387usize, 0x4fdc387usize, 0x6fdc387usize, 0x8fdc387usize, 0xafdc387usize, 0xcfdc387usize, 0xefdc387usize, 0xe1cb87usize, 0x2e1cb87usize, 0x4e1cb87usize, 0x6e1cb87usize, 0x8e1cb87usize, 0xae1cb87usize, 0xce1cb87usize, 0xee1cb87usize, 0xe5cb87usize, 0x2e5cb87usize, 0x4e5cb87usize, 0x6e5cb87usize, 0x8e5cb87usize, 0xae5cb87usize, 0xce5cb87usize, 0xee5cb87usize, 0xe9cb87usize, 0x2e9cb87usize, 0x4e9cb87usize, 0x6e9cb87usize, 0x8e9cb87usize, 0xae9cb87usize, 0xce9cb87usize, 0xee9cb87usize, 0xedcb87usize, 0x2edcb87usize, 0x4edcb87usize, 0x6edcb87usize, 0x8edcb87usize, 0xaedcb87usize, 0xcedcb87usize, 0xeedcb87usize, 0xf1cb87usize, 0x2f1cb87usize, 0x4f1cb87usize, 0x6f1cb87usize, 0x8f1cb87usize, 0xaf1cb87usize, 0xcf1cb87usize, 0xef1cb87usize, 0xf5cb87usize, 0x2f5cb87usize, 0x4f5cb87usize, 0x6f5cb87usize, 0x8f5cb87usize, 0xaf5cb87usize, 0xcf5cb87usize, 0xef5cb87usize, 0xf9cb87usize, 0x2f9cb87usize, 0x4f9cb87usize, 0x6f9cb87usize, 0x8f9cb87usize]; pub static kZeroRepsDepth: [u32; 704] = [0u32, 4u32, 8u32, 7u32, 7u32, 7u32, 7u32, 7u32, 7u32, 7u32, 7u32, 11u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 14u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 21u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32, 28u32]; pub static kUTF8ContextLookup: [u8; 512] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12, 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12, 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]; pub static kSigned3BitContextLookup: [u8; 256] = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7]; pub static kBrotliMinWindowBits: i32 = 10i32; pub static kBrotliMaxWindowBits: i32 = 24i32; pub static kCodeLengthDepth: [u8; 18] = [4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 4i32 as (u8), 5i32 as (u8), 5i32 as (u8), 0i32 as (u8), 4i32 as (u8), 4i32 as (u8)]; pub static kStaticDistanceCodeDepth: [u8; 64] = [6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8), 6i32 as (u8)]; pub static kCodeLengthBits: [u32; 18] = [0u32, 8u32, 4u32, 12u32, 2u32, 10u32, 6u32, 14u32, 1u32, 9u32, 5u32, 13u32, 3u32, 15u32, 31u32, 0u32, 11u32, 7u32]; pub static kNonZeroRepsBits: [usize; 704] = [0xbusize, 0x1busize, 0x2busize, 0x3busize, 0x2cbusize, 0x6cbusize, 0xacbusize, 0xecbusize, 0x2dbusize, 0x6dbusize, 0xadbusize, 0xedbusize, 0x2ebusize, 0x6ebusize, 0xaebusize, 0xeebusize, 0x2fbusize, 0x6fbusize, 0xafbusize, 0xefbusize, 0xb2cbusize, 0x1b2cbusize, 0x2b2cbusize, 0x3b2cbusize, 0xb6cbusize, 0x1b6cbusize, 0x2b6cbusize, 0x3b6cbusize, 0xbacbusize, 0x1bacbusize, 0x2bacbusize, 0x3bacbusize, 0xbecbusize, 0x1becbusize, 0x2becbusize, 0x3becbusize, 0xb2dbusize, 0x1b2dbusize, 0x2b2dbusize, 0x3b2dbusize, 0xb6dbusize, 0x1b6dbusize, 0x2b6dbusize, 0x3b6dbusize, 0xbadbusize, 0x1badbusize, 0x2badbusize, 0x3badbusize, 0xbedbusize, 0x1bedbusize, 0x2bedbusize, 0x3bedbusize, 0xb2ebusize, 0x1b2ebusize, 0x2b2ebusize, 0x3b2ebusize, 0xb6ebusize, 0x1b6ebusize, 0x2b6ebusize, 0x3b6ebusize, 0xbaebusize, 0x1baebusize, 0x2baebusize, 0x3baebusize, 0xbeebusize, 0x1beebusize, 0x2beebusize, 0x3beebusize, 0xb2fbusize, 0x1b2fbusize, 0x2b2fbusize, 0x3b2fbusize, 0xb6fbusize, 0x1b6fbusize, 0x2b6fbusize, 0x3b6fbusize, 0xbafbusize, 0x1bafbusize, 0x2bafbusize, 0x3bafbusize, 0xbefbusize, 0x1befbusize, 0x2befbusize, 0x3befbusize, 0x2cb2cbusize, 0x6cb2cbusize, 0xacb2cbusize, 0xecb2cbusize, 0x2db2cbusize, 0x6db2cbusize, 0xadb2cbusize, 0xedb2cbusize, 0x2eb2cbusize, 0x6eb2cbusize, 0xaeb2cbusize, 0xeeb2cbusize, 0x2fb2cbusize, 0x6fb2cbusize, 0xafb2cbusize, 0xefb2cbusize, 0x2cb6cbusize, 0x6cb6cbusize, 0xacb6cbusize, 0xecb6cbusize, 0x2db6cbusize, 0x6db6cbusize, 0xadb6cbusize, 0xedb6cbusize, 0x2eb6cbusize, 0x6eb6cbusize, 0xaeb6cbusize, 0xeeb6cbusize, 0x2fb6cbusize, 0x6fb6cbusize, 0xafb6cbusize, 0xefb6cbusize, 0x2cbacbusize, 0x6cbacbusize, 0xacbacbusize, 0xecbacbusize, 0x2dbacbusize, 0x6dbacbusize, 0xadbacbusize, 0xedbacbusize, 0x2ebacbusize, 0x6ebacbusize, 0xaebacbusize, 0xeebacbusize, 0x2fbacbusize, 0x6fbacbusize, 0xafbacbusize, 0xefbacbusize, 0x2cbecbusize, 0x6cbecbusize, 0xacbecbusize, 0xecbecbusize, 0x2dbecbusize, 0x6dbecbusize, 0xadbecbusize, 0xedbecbusize, 0x2ebecbusize, 0x6ebecbusize, 0xaebecbusize, 0xeebecbusize, 0x2fbecbusize, 0x6fbecbusize, 0xafbecbusize, 0xefbecbusize, 0x2cb2dbusize, 0x6cb2dbusize, 0xacb2dbusize, 0xecb2dbusize, 0x2db2dbusize, 0x6db2dbusize, 0xadb2dbusize, 0xedb2dbusize, 0x2eb2dbusize, 0x6eb2dbusize, 0xaeb2dbusize, 0xeeb2dbusize, 0x2fb2dbusize, 0x6fb2dbusize, 0xafb2dbusize, 0xefb2dbusize, 0x2cb6dbusize, 0x6cb6dbusize, 0xacb6dbusize, 0xecb6dbusize, 0x2db6dbusize, 0x6db6dbusize, 0xadb6dbusize, 0xedb6dbusize, 0x2eb6dbusize, 0x6eb6dbusize, 0xaeb6dbusize, 0xeeb6dbusize, 0x2fb6dbusize, 0x6fb6dbusize, 0xafb6dbusize, 0xefb6dbusize, 0x2cbadbusize, 0x6cbadbusize, 0xacbadbusize, 0xecbadbusize, 0x2dbadbusize, 0x6dbadbusize, 0xadbadbusize, 0xedbadbusize, 0x2ebadbusize, 0x6ebadbusize, 0xaebadbusize, 0xeebadbusize, 0x2fbadbusize, 0x6fbadbusize, 0xafbadbusize, 0xefbadbusize, 0x2cbedbusize, 0x6cbedbusize, 0xacbedbusize, 0xecbedbusize, 0x2dbedbusize, 0x6dbedbusize, 0xadbedbusize, 0xedbedbusize, 0x2ebedbusize, 0x6ebedbusize, 0xaebedbusize, 0xeebedbusize, 0x2fbedbusize, 0x6fbedbusize, 0xafbedbusize, 0xefbedbusize, 0x2cb2ebusize, 0x6cb2ebusize, 0xacb2ebusize, 0xecb2ebusize, 0x2db2ebusize, 0x6db2ebusize, 0xadb2ebusize, 0xedb2ebusize, 0x2eb2ebusize, 0x6eb2ebusize, 0xaeb2ebusize, 0xeeb2ebusize, 0x2fb2ebusize, 0x6fb2ebusize, 0xafb2ebusize, 0xefb2ebusize, 0x2cb6ebusize, 0x6cb6ebusize, 0xacb6ebusize, 0xecb6ebusize, 0x2db6ebusize, 0x6db6ebusize, 0xadb6ebusize, 0xedb6ebusize, 0x2eb6ebusize, 0x6eb6ebusize, 0xaeb6ebusize, 0xeeb6ebusize, 0x2fb6ebusize, 0x6fb6ebusize, 0xafb6ebusize, 0xefb6ebusize, 0x2cbaebusize, 0x6cbaebusize, 0xacbaebusize, 0xecbaebusize, 0x2dbaebusize, 0x6dbaebusize, 0xadbaebusize, 0xedbaebusize, 0x2ebaebusize, 0x6ebaebusize, 0xaebaebusize, 0xeebaebusize, 0x2fbaebusize, 0x6fbaebusize, 0xafbaebusize, 0xefbaebusize, 0x2cbeebusize, 0x6cbeebusize, 0xacbeebusize, 0xecbeebusize, 0x2dbeebusize, 0x6dbeebusize, 0xadbeebusize, 0xedbeebusize, 0x2ebeebusize, 0x6ebeebusize, 0xaebeebusize, 0xeebeebusize, 0x2fbeebusize, 0x6fbeebusize, 0xafbeebusize, 0xefbeebusize, 0x2cb2fbusize, 0x6cb2fbusize, 0xacb2fbusize, 0xecb2fbusize, 0x2db2fbusize, 0x6db2fbusize, 0xadb2fbusize, 0xedb2fbusize, 0x2eb2fbusize, 0x6eb2fbusize, 0xaeb2fbusize, 0xeeb2fbusize, 0x2fb2fbusize, 0x6fb2fbusize, 0xafb2fbusize, 0xefb2fbusize, 0x2cb6fbusize, 0x6cb6fbusize, 0xacb6fbusize, 0xecb6fbusize, 0x2db6fbusize, 0x6db6fbusize, 0xadb6fbusize, 0xedb6fbusize, 0x2eb6fbusize, 0x6eb6fbusize, 0xaeb6fbusize, 0xeeb6fbusize, 0x2fb6fbusize, 0x6fb6fbusize, 0xafb6fbusize, 0xefb6fbusize, 0x2cbafbusize, 0x6cbafbusize, 0xacbafbusize, 0xecbafbusize, 0x2dbafbusize, 0x6dbafbusize, 0xadbafbusize, 0xedbafbusize, 0x2ebafbusize, 0x6ebafbusize, 0xaebafbusize, 0xeebafbusize, 0x2fbafbusize, 0x6fbafbusize, 0xafbafbusize, 0xefbafbusize, 0x2cbefbusize, 0x6cbefbusize, 0xacbefbusize, 0xecbefbusize, 0x2dbefbusize, 0x6dbefbusize, 0xadbefbusize, 0xedbefbusize, 0x2ebefbusize, 0x6ebefbusize, 0xaebefbusize, 0xeebefbusize, 0x2fbefbusize, 0x6fbefbusize, 0xafbefbusize, 0xefbefbusize, 0xb2cb2cbusize, 0x1b2cb2cbusize, 0x2b2cb2cbusize, 0x3b2cb2cbusize, 0xb6cb2cbusize, 0x1b6cb2cbusize, 0x2b6cb2cbusize, 0x3b6cb2cbusize, 0xbacb2cbusize, 0x1bacb2cbusize, 0x2bacb2cbusize, 0x3bacb2cbusize, 0xbecb2cbusize, 0x1becb2cbusize, 0x2becb2cbusize, 0x3becb2cbusize, 0xb2db2cbusize, 0x1b2db2cbusize, 0x2b2db2cbusize, 0x3b2db2cbusize, 0xb6db2cbusize, 0x1b6db2cbusize, 0x2b6db2cbusize, 0x3b6db2cbusize, 0xbadb2cbusize, 0x1badb2cbusize, 0x2badb2cbusize, 0x3badb2cbusize, 0xbedb2cbusize, 0x1bedb2cbusize, 0x2bedb2cbusize, 0x3bedb2cbusize, 0xb2eb2cbusize, 0x1b2eb2cbusize, 0x2b2eb2cbusize, 0x3b2eb2cbusize, 0xb6eb2cbusize, 0x1b6eb2cbusize, 0x2b6eb2cbusize, 0x3b6eb2cbusize, 0xbaeb2cbusize, 0x1baeb2cbusize, 0x2baeb2cbusize, 0x3baeb2cbusize, 0xbeeb2cbusize, 0x1beeb2cbusize, 0x2beeb2cbusize, 0x3beeb2cbusize, 0xb2fb2cbusize, 0x1b2fb2cbusize, 0x2b2fb2cbusize, 0x3b2fb2cbusize, 0xb6fb2cbusize, 0x1b6fb2cbusize, 0x2b6fb2cbusize, 0x3b6fb2cbusize, 0xbafb2cbusize, 0x1bafb2cbusize, 0x2bafb2cbusize, 0x3bafb2cbusize, 0xbefb2cbusize, 0x1befb2cbusize, 0x2befb2cbusize, 0x3befb2cbusize, 0xb2cb6cbusize, 0x1b2cb6cbusize, 0x2b2cb6cbusize, 0x3b2cb6cbusize, 0xb6cb6cbusize, 0x1b6cb6cbusize, 0x2b6cb6cbusize, 0x3b6cb6cbusize, 0xbacb6cbusize, 0x1bacb6cbusize, 0x2bacb6cbusize, 0x3bacb6cbusize, 0xbecb6cbusize, 0x1becb6cbusize, 0x2becb6cbusize, 0x3becb6cbusize, 0xb2db6cbusize, 0x1b2db6cbusize, 0x2b2db6cbusize, 0x3b2db6cbusize, 0xb6db6cbusize, 0x1b6db6cbusize, 0x2b6db6cbusize, 0x3b6db6cbusize, 0xbadb6cbusize, 0x1badb6cbusize, 0x2badb6cbusize, 0x3badb6cbusize, 0xbedb6cbusize, 0x1bedb6cbusize, 0x2bedb6cbusize, 0x3bedb6cbusize, 0xb2eb6cbusize, 0x1b2eb6cbusize, 0x2b2eb6cbusize, 0x3b2eb6cbusize, 0xb6eb6cbusize, 0x1b6eb6cbusize, 0x2b6eb6cbusize, 0x3b6eb6cbusize, 0xbaeb6cbusize, 0x1baeb6cbusize, 0x2baeb6cbusize, 0x3baeb6cbusize, 0xbeeb6cbusize, 0x1beeb6cbusize, 0x2beeb6cbusize, 0x3beeb6cbusize, 0xb2fb6cbusize, 0x1b2fb6cbusize, 0x2b2fb6cbusize, 0x3b2fb6cbusize, 0xb6fb6cbusize, 0x1b6fb6cbusize, 0x2b6fb6cbusize, 0x3b6fb6cbusize, 0xbafb6cbusize, 0x1bafb6cbusize, 0x2bafb6cbusize, 0x3bafb6cbusize, 0xbefb6cbusize, 0x1befb6cbusize, 0x2befb6cbusize, 0x3befb6cbusize, 0xb2cbacbusize, 0x1b2cbacbusize, 0x2b2cbacbusize, 0x3b2cbacbusize, 0xb6cbacbusize, 0x1b6cbacbusize, 0x2b6cbacbusize, 0x3b6cbacbusize, 0xbacbacbusize, 0x1bacbacbusize, 0x2bacbacbusize, 0x3bacbacbusize, 0xbecbacbusize, 0x1becbacbusize, 0x2becbacbusize, 0x3becbacbusize, 0xb2dbacbusize, 0x1b2dbacbusize, 0x2b2dbacbusize, 0x3b2dbacbusize, 0xb6dbacbusize, 0x1b6dbacbusize, 0x2b6dbacbusize, 0x3b6dbacbusize, 0xbadbacbusize, 0x1badbacbusize, 0x2badbacbusize, 0x3badbacbusize, 0xbedbacbusize, 0x1bedbacbusize, 0x2bedbacbusize, 0x3bedbacbusize, 0xb2ebacbusize, 0x1b2ebacbusize, 0x2b2ebacbusize, 0x3b2ebacbusize, 0xb6ebacbusize, 0x1b6ebacbusize, 0x2b6ebacbusize, 0x3b6ebacbusize, 0xbaebacbusize, 0x1baebacbusize, 0x2baebacbusize, 0x3baebacbusize, 0xbeebacbusize, 0x1beebacbusize, 0x2beebacbusize, 0x3beebacbusize, 0xb2fbacbusize, 0x1b2fbacbusize, 0x2b2fbacbusize, 0x3b2fbacbusize, 0xb6fbacbusize, 0x1b6fbacbusize, 0x2b6fbacbusize, 0x3b6fbacbusize, 0xbafbacbusize, 0x1bafbacbusize, 0x2bafbacbusize, 0x3bafbacbusize, 0xbefbacbusize, 0x1befbacbusize, 0x2befbacbusize, 0x3befbacbusize, 0xb2cbecbusize, 0x1b2cbecbusize, 0x2b2cbecbusize, 0x3b2cbecbusize, 0xb6cbecbusize, 0x1b6cbecbusize, 0x2b6cbecbusize, 0x3b6cbecbusize, 0xbacbecbusize, 0x1bacbecbusize, 0x2bacbecbusize, 0x3bacbecbusize, 0xbecbecbusize, 0x1becbecbusize, 0x2becbecbusize, 0x3becbecbusize, 0xb2dbecbusize, 0x1b2dbecbusize, 0x2b2dbecbusize, 0x3b2dbecbusize, 0xb6dbecbusize, 0x1b6dbecbusize, 0x2b6dbecbusize, 0x3b6dbecbusize, 0xbadbecbusize, 0x1badbecbusize, 0x2badbecbusize, 0x3badbecbusize, 0xbedbecbusize, 0x1bedbecbusize, 0x2bedbecbusize, 0x3bedbecbusize, 0xb2ebecbusize, 0x1b2ebecbusize, 0x2b2ebecbusize, 0x3b2ebecbusize, 0xb6ebecbusize, 0x1b6ebecbusize, 0x2b6ebecbusize, 0x3b6ebecbusize, 0xbaebecbusize, 0x1baebecbusize, 0x2baebecbusize, 0x3baebecbusize, 0xbeebecbusize, 0x1beebecbusize, 0x2beebecbusize, 0x3beebecbusize, 0xb2fbecbusize, 0x1b2fbecbusize, 0x2b2fbecbusize, 0x3b2fbecbusize, 0xb6fbecbusize, 0x1b6fbecbusize, 0x2b6fbecbusize, 0x3b6fbecbusize, 0xbafbecbusize, 0x1bafbecbusize, 0x2bafbecbusize, 0x3bafbecbusize, 0xbefbecbusize, 0x1befbecbusize, 0x2befbecbusize, 0x3befbecbusize, 0xb2cb2dbusize, 0x1b2cb2dbusize, 0x2b2cb2dbusize, 0x3b2cb2dbusize, 0xb6cb2dbusize, 0x1b6cb2dbusize, 0x2b6cb2dbusize, 0x3b6cb2dbusize, 0xbacb2dbusize, 0x1bacb2dbusize, 0x2bacb2dbusize, 0x3bacb2dbusize, 0xbecb2dbusize, 0x1becb2dbusize, 0x2becb2dbusize, 0x3becb2dbusize, 0xb2db2dbusize, 0x1b2db2dbusize, 0x2b2db2dbusize, 0x3b2db2dbusize, 0xb6db2dbusize, 0x1b6db2dbusize, 0x2b6db2dbusize, 0x3b6db2dbusize, 0xbadb2dbusize, 0x1badb2dbusize, 0x2badb2dbusize, 0x3badb2dbusize, 0xbedb2dbusize, 0x1bedb2dbusize, 0x2bedb2dbusize, 0x3bedb2dbusize, 0xb2eb2dbusize, 0x1b2eb2dbusize, 0x2b2eb2dbusize, 0x3b2eb2dbusize, 0xb6eb2dbusize, 0x1b6eb2dbusize, 0x2b6eb2dbusize, 0x3b6eb2dbusize, 0xbaeb2dbusize, 0x1baeb2dbusize, 0x2baeb2dbusize, 0x3baeb2dbusize, 0xbeeb2dbusize, 0x1beeb2dbusize, 0x2beeb2dbusize, 0x3beeb2dbusize, 0xb2fb2dbusize, 0x1b2fb2dbusize, 0x2b2fb2dbusize, 0x3b2fb2dbusize, 0xb6fb2dbusize, 0x1b6fb2dbusize, 0x2b6fb2dbusize, 0x3b6fb2dbusize, 0xbafb2dbusize, 0x1bafb2dbusize, 0x2bafb2dbusize, 0x3bafb2dbusize, 0xbefb2dbusize, 0x1befb2dbusize, 0x2befb2dbusize, 0x3befb2dbusize, 0xb2cb6dbusize, 0x1b2cb6dbusize, 0x2b2cb6dbusize, 0x3b2cb6dbusize, 0xb6cb6dbusize, 0x1b6cb6dbusize, 0x2b6cb6dbusize, 0x3b6cb6dbusize, 0xbacb6dbusize, 0x1bacb6dbusize, 0x2bacb6dbusize, 0x3bacb6dbusize, 0xbecb6dbusize, 0x1becb6dbusize, 0x2becb6dbusize, 0x3becb6dbusize, 0xb2db6dbusize, 0x1b2db6dbusize, 0x2b2db6dbusize, 0x3b2db6dbusize, 0xb6db6dbusize, 0x1b6db6dbusize, 0x2b6db6dbusize, 0x3b6db6dbusize, 0xbadb6dbusize, 0x1badb6dbusize, 0x2badb6dbusize, 0x3badb6dbusize, 0xbedb6dbusize, 0x1bedb6dbusize, 0x2bedb6dbusize, 0x3bedb6dbusize, 0xb2eb6dbusize, 0x1b2eb6dbusize, 0x2b2eb6dbusize, 0x3b2eb6dbusize, 0xb6eb6dbusize, 0x1b6eb6dbusize, 0x2b6eb6dbusize, 0x3b6eb6dbusize, 0xbaeb6dbusize, 0x1baeb6dbusize, 0x2baeb6dbusize, 0x3baeb6dbusize]; pub static kNonZeroRepsDepth: [u32; 704] = [6u32, 6u32, 6u32, 6u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 12u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 18u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 24u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32, 30u32]; pub static kStaticCommandCodeDepth: [u8; 704] = [9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 9i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8), 11i32 as (u8)]; pub static kStaticDistanceCodeBits: [u16; 64] = [0i32 as (u16), 32i32 as (u16), 16i32 as (u16), 48i32 as (u16), 8i32 as (u16), 40i32 as (u16), 24i32 as (u16), 56i32 as (u16), 4i32 as (u16), 36i32 as (u16), 20i32 as (u16), 52i32 as (u16), 12i32 as (u16), 44i32 as (u16), 28i32 as (u16), 60i32 as (u16), 2i32 as (u16), 34i32 as (u16), 18i32 as (u16), 50i32 as (u16), 10i32 as (u16), 42i32 as (u16), 26i32 as (u16), 58i32 as (u16), 6i32 as (u16), 38i32 as (u16), 22i32 as (u16), 54i32 as (u16), 14i32 as (u16), 46i32 as (u16), 30i32 as (u16), 62i32 as (u16), 1i32 as (u16), 33i32 as (u16), 17i32 as (u16), 49i32 as (u16), 9i32 as (u16), 41i32 as (u16), 25i32 as (u16), 57i32 as (u16), 5i32 as (u16), 37i32 as (u16), 21i32 as (u16), 53i32 as (u16), 13i32 as (u16), 45i32 as (u16), 29i32 as (u16), 61i32 as (u16), 3i32 as (u16), 35i32 as (u16), 19i32 as (u16), 51i32 as (u16), 11i32 as (u16), 43i32 as (u16), 27i32 as (u16), 59i32 as (u16), 7i32 as (u16), 39i32 as (u16), 23i32 as (u16), 55i32 as (u16), 15i32 as (u16), 47i32 as (u16), 31i32 as (u16), 63i32 as (u16)]; pub static kStaticCommandCodeBits: [u16; 704] = [0i32 as (u16), 256i32 as (u16), 128i32 as (u16), 384i32 as (u16), 64i32 as (u16), 320i32 as (u16), 192i32 as (u16), 448i32 as (u16), 32i32 as (u16), 288i32 as (u16), 160i32 as (u16), 416i32 as (u16), 96i32 as (u16), 352i32 as (u16), 224i32 as (u16), 480i32 as (u16), 16i32 as (u16), 272i32 as (u16), 144i32 as (u16), 400i32 as (u16), 80i32 as (u16), 336i32 as (u16), 208i32 as (u16), 464i32 as (u16), 48i32 as (u16), 304i32 as (u16), 176i32 as (u16), 432i32 as (u16), 112i32 as (u16), 368i32 as (u16), 240i32 as (u16), 496i32 as (u16), 8i32 as (u16), 264i32 as (u16), 136i32 as (u16), 392i32 as (u16), 72i32 as (u16), 328i32 as (u16), 200i32 as (u16), 456i32 as (u16), 40i32 as (u16), 296i32 as (u16), 168i32 as (u16), 424i32 as (u16), 104i32 as (u16), 360i32 as (u16), 232i32 as (u16), 488i32 as (u16), 24i32 as (u16), 280i32 as (u16), 152i32 as (u16), 408i32 as (u16), 88i32 as (u16), 344i32 as (u16), 216i32 as (u16), 472i32 as (u16), 56i32 as (u16), 312i32 as (u16), 184i32 as (u16), 440i32 as (u16), 120i32 as (u16), 376i32 as (u16), 248i32 as (u16), 504i32 as (u16), 4i32 as (u16), 260i32 as (u16), 132i32 as (u16), 388i32 as (u16), 68i32 as (u16), 324i32 as (u16), 196i32 as (u16), 452i32 as (u16), 36i32 as (u16), 292i32 as (u16), 164i32 as (u16), 420i32 as (u16), 100i32 as (u16), 356i32 as (u16), 228i32 as (u16), 484i32 as (u16), 20i32 as (u16), 276i32 as (u16), 148i32 as (u16), 404i32 as (u16), 84i32 as (u16), 340i32 as (u16), 212i32 as (u16), 468i32 as (u16), 52i32 as (u16), 308i32 as (u16), 180i32 as (u16), 436i32 as (u16), 116i32 as (u16), 372i32 as (u16), 244i32 as (u16), 500i32 as (u16), 12i32 as (u16), 268i32 as (u16), 140i32 as (u16), 396i32 as (u16), 76i32 as (u16), 332i32 as (u16), 204i32 as (u16), 460i32 as (u16), 44i32 as (u16), 300i32 as (u16), 172i32 as (u16), 428i32 as (u16), 108i32 as (u16), 364i32 as (u16), 236i32 as (u16), 492i32 as (u16), 28i32 as (u16), 284i32 as (u16), 156i32 as (u16), 412i32 as (u16), 92i32 as (u16), 348i32 as (u16), 220i32 as (u16), 476i32 as (u16), 60i32 as (u16), 316i32 as (u16), 188i32 as (u16), 444i32 as (u16), 124i32 as (u16), 380i32 as (u16), 252i32 as (u16), 508i32 as (u16), 2i32 as (u16), 258i32 as (u16), 130i32 as (u16), 386i32 as (u16), 66i32 as (u16), 322i32 as (u16), 194i32 as (u16), 450i32 as (u16), 34i32 as (u16), 290i32 as (u16), 162i32 as (u16), 418i32 as (u16), 98i32 as (u16), 354i32 as (u16), 226i32 as (u16), 482i32 as (u16), 18i32 as (u16), 274i32 as (u16), 146i32 as (u16), 402i32 as (u16), 82i32 as (u16), 338i32 as (u16), 210i32 as (u16), 466i32 as (u16), 50i32 as (u16), 306i32 as (u16), 178i32 as (u16), 434i32 as (u16), 114i32 as (u16), 370i32 as (u16), 242i32 as (u16), 498i32 as (u16), 10i32 as (u16), 266i32 as (u16), 138i32 as (u16), 394i32 as (u16), 74i32 as (u16), 330i32 as (u16), 202i32 as (u16), 458i32 as (u16), 42i32 as (u16), 298i32 as (u16), 170i32 as (u16), 426i32 as (u16), 106i32 as (u16), 362i32 as (u16), 234i32 as (u16), 490i32 as (u16), 26i32 as (u16), 282i32 as (u16), 154i32 as (u16), 410i32 as (u16), 90i32 as (u16), 346i32 as (u16), 218i32 as (u16), 474i32 as (u16), 58i32 as (u16), 314i32 as (u16), 186i32 as (u16), 442i32 as (u16), 122i32 as (u16), 378i32 as (u16), 250i32 as (u16), 506i32 as (u16), 6i32 as (u16), 262i32 as (u16), 134i32 as (u16), 390i32 as (u16), 70i32 as (u16), 326i32 as (u16), 198i32 as (u16), 454i32 as (u16), 38i32 as (u16), 294i32 as (u16), 166i32 as (u16), 422i32 as (u16), 102i32 as (u16), 358i32 as (u16), 230i32 as (u16), 486i32 as (u16), 22i32 as (u16), 278i32 as (u16), 150i32 as (u16), 406i32 as (u16), 86i32 as (u16), 342i32 as (u16), 214i32 as (u16), 470i32 as (u16), 54i32 as (u16), 310i32 as (u16), 182i32 as (u16), 438i32 as (u16), 118i32 as (u16), 374i32 as (u16), 246i32 as (u16), 502i32 as (u16), 14i32 as (u16), 270i32 as (u16), 142i32 as (u16), 398i32 as (u16), 78i32 as (u16), 334i32 as (u16), 206i32 as (u16), 462i32 as (u16), 46i32 as (u16), 302i32 as (u16), 174i32 as (u16), 430i32 as (u16), 110i32 as (u16), 366i32 as (u16), 238i32 as (u16), 494i32 as (u16), 30i32 as (u16), 286i32 as (u16), 158i32 as (u16), 414i32 as (u16), 94i32 as (u16), 350i32 as (u16), 222i32 as (u16), 478i32 as (u16), 62i32 as (u16), 318i32 as (u16), 190i32 as (u16), 446i32 as (u16), 126i32 as (u16), 382i32 as (u16), 254i32 as (u16), 510i32 as (u16), 1i32 as (u16), 257i32 as (u16), 129i32 as (u16), 385i32 as (u16), 65i32 as (u16), 321i32 as (u16), 193i32 as (u16), 449i32 as (u16), 33i32 as (u16), 289i32 as (u16), 161i32 as (u16), 417i32 as (u16), 97i32 as (u16), 353i32 as (u16), 225i32 as (u16), 481i32 as (u16), 17i32 as (u16), 273i32 as (u16), 145i32 as (u16), 401i32 as (u16), 81i32 as (u16), 337i32 as (u16), 209i32 as (u16), 465i32 as (u16), 49i32 as (u16), 305i32 as (u16), 177i32 as (u16), 433i32 as (u16), 113i32 as (u16), 369i32 as (u16), 241i32 as (u16), 497i32 as (u16), 9i32 as (u16), 265i32 as (u16), 137i32 as (u16), 393i32 as (u16), 73i32 as (u16), 329i32 as (u16), 201i32 as (u16), 457i32 as (u16), 41i32 as (u16), 297i32 as (u16), 169i32 as (u16), 425i32 as (u16), 105i32 as (u16), 361i32 as (u16), 233i32 as (u16), 489i32 as (u16), 25i32 as (u16), 281i32 as (u16), 153i32 as (u16), 409i32 as (u16), 89i32 as (u16), 345i32 as (u16), 217i32 as (u16), 473i32 as (u16), 57i32 as (u16), 313i32 as (u16), 185i32 as (u16), 441i32 as (u16), 121i32 as (u16), 377i32 as (u16), 249i32 as (u16), 505i32 as (u16), 5i32 as (u16), 261i32 as (u16), 133i32 as (u16), 389i32 as (u16), 69i32 as (u16), 325i32 as (u16), 197i32 as (u16), 453i32 as (u16), 37i32 as (u16), 293i32 as (u16), 165i32 as (u16), 421i32 as (u16), 101i32 as (u16), 357i32 as (u16), 229i32 as (u16), 485i32 as (u16), 21i32 as (u16), 277i32 as (u16), 149i32 as (u16), 405i32 as (u16), 85i32 as (u16), 341i32 as (u16), 213i32 as (u16), 469i32 as (u16), 53i32 as (u16), 309i32 as (u16), 181i32 as (u16), 437i32 as (u16), 117i32 as (u16), 373i32 as (u16), 245i32 as (u16), 501i32 as (u16), 13i32 as (u16), 269i32 as (u16), 141i32 as (u16), 397i32 as (u16), 77i32 as (u16), 333i32 as (u16), 205i32 as (u16), 461i32 as (u16), 45i32 as (u16), 301i32 as (u16), 173i32 as (u16), 429i32 as (u16), 109i32 as (u16), 365i32 as (u16), 237i32 as (u16), 493i32 as (u16), 29i32 as (u16), 285i32 as (u16), 157i32 as (u16), 413i32 as (u16), 93i32 as (u16), 349i32 as (u16), 221i32 as (u16), 477i32 as (u16), 61i32 as (u16), 317i32 as (u16), 189i32 as (u16), 445i32 as (u16), 125i32 as (u16), 381i32 as (u16), 253i32 as (u16), 509i32 as (u16), 3i32 as (u16), 259i32 as (u16), 131i32 as (u16), 387i32 as (u16), 67i32 as (u16), 323i32 as (u16), 195i32 as (u16), 451i32 as (u16), 35i32 as (u16), 291i32 as (u16), 163i32 as (u16), 419i32 as (u16), 99i32 as (u16), 355i32 as (u16), 227i32 as (u16), 483i32 as (u16), 19i32 as (u16), 275i32 as (u16), 147i32 as (u16), 403i32 as (u16), 83i32 as (u16), 339i32 as (u16), 211i32 as (u16), 467i32 as (u16), 51i32 as (u16), 307i32 as (u16), 179i32 as (u16), 435i32 as (u16), 115i32 as (u16), 371i32 as (u16), 243i32 as (u16), 499i32 as (u16), 11i32 as (u16), 267i32 as (u16), 139i32 as (u16), 395i32 as (u16), 75i32 as (u16), 331i32 as (u16), 203i32 as (u16), 459i32 as (u16), 43i32 as (u16), 299i32 as (u16), 171i32 as (u16), 427i32 as (u16), 107i32 as (u16), 363i32 as (u16), 235i32 as (u16), 491i32 as (u16), 27i32 as (u16), 283i32 as (u16), 155i32 as (u16), 411i32 as (u16), 91i32 as (u16), 347i32 as (u16), 219i32 as (u16), 475i32 as (u16), 59i32 as (u16), 315i32 as (u16), 187i32 as (u16), 443i32 as (u16), 123i32 as (u16), 379i32 as (u16), 251i32 as (u16), 507i32 as (u16), 7i32 as (u16), 1031i32 as (u16), 519i32 as (u16), 1543i32 as (u16), 263i32 as (u16), 1287i32 as (u16), 775i32 as (u16), 1799i32 as (u16), 135i32 as (u16), 1159i32 as (u16), 647i32 as (u16), 1671i32 as (u16), 391i32 as (u16), 1415i32 as (u16), 903i32 as (u16), 1927i32 as (u16), 71i32 as (u16), 1095i32 as (u16), 583i32 as (u16), 1607i32 as (u16), 327i32 as (u16), 1351i32 as (u16), 839i32 as (u16), 1863i32 as (u16), 199i32 as (u16), 1223i32 as (u16), 711i32 as (u16), 1735i32 as (u16), 455i32 as (u16), 1479i32 as (u16), 967i32 as (u16), 1991i32 as (u16), 39i32 as (u16), 1063i32 as (u16), 551i32 as (u16), 1575i32 as (u16), 295i32 as (u16), 1319i32 as (u16), 807i32 as (u16), 1831i32 as (u16), 167i32 as (u16), 1191i32 as (u16), 679i32 as (u16), 1703i32 as (u16), 423i32 as (u16), 1447i32 as (u16), 935i32 as (u16), 1959i32 as (u16), 103i32 as (u16), 1127i32 as (u16), 615i32 as (u16), 1639i32 as (u16), 359i32 as (u16), 1383i32 as (u16), 871i32 as (u16), 1895i32 as (u16), 231i32 as (u16), 1255i32 as (u16), 743i32 as (u16), 1767i32 as (u16), 487i32 as (u16), 1511i32 as (u16), 999i32 as (u16), 2023i32 as (u16), 23i32 as (u16), 1047i32 as (u16), 535i32 as (u16), 1559i32 as (u16), 279i32 as (u16), 1303i32 as (u16), 791i32 as (u16), 1815i32 as (u16), 151i32 as (u16), 1175i32 as (u16), 663i32 as (u16), 1687i32 as (u16), 407i32 as (u16), 1431i32 as (u16), 919i32 as (u16), 1943i32 as (u16), 87i32 as (u16), 1111i32 as (u16), 599i32 as (u16), 1623i32 as (u16), 343i32 as (u16), 1367i32 as (u16), 855i32 as (u16), 1879i32 as (u16), 215i32 as (u16), 1239i32 as (u16), 727i32 as (u16), 1751i32 as (u16), 471i32 as (u16), 1495i32 as (u16), 983i32 as (u16), 2007i32 as (u16), 55i32 as (u16), 1079i32 as (u16), 567i32 as (u16), 1591i32 as (u16), 311i32 as (u16), 1335i32 as (u16), 823i32 as (u16), 1847i32 as (u16), 183i32 as (u16), 1207i32 as (u16), 695i32 as (u16), 1719i32 as (u16), 439i32 as (u16), 1463i32 as (u16), 951i32 as (u16), 1975i32 as (u16), 119i32 as (u16), 1143i32 as (u16), 631i32 as (u16), 1655i32 as (u16), 375i32 as (u16), 1399i32 as (u16), 887i32 as (u16), 1911i32 as (u16), 247i32 as (u16), 1271i32 as (u16), 759i32 as (u16), 1783i32 as (u16), 503i32 as (u16), 1527i32 as (u16), 1015i32 as (u16), 2039i32 as (u16), 15i32 as (u16), 1039i32 as (u16), 527i32 as (u16), 1551i32 as (u16), 271i32 as (u16), 1295i32 as (u16), 783i32 as (u16), 1807i32 as (u16), 143i32 as (u16), 1167i32 as (u16), 655i32 as (u16), 1679i32 as (u16), 399i32 as (u16), 1423i32 as (u16), 911i32 as (u16), 1935i32 as (u16), 79i32 as (u16), 1103i32 as (u16), 591i32 as (u16), 1615i32 as (u16), 335i32 as (u16), 1359i32 as (u16), 847i32 as (u16), 1871i32 as (u16), 207i32 as (u16), 1231i32 as (u16), 719i32 as (u16), 1743i32 as (u16), 463i32 as (u16), 1487i32 as (u16), 975i32 as (u16), 1999i32 as (u16), 47i32 as (u16), 1071i32 as (u16), 559i32 as (u16), 1583i32 as (u16), 303i32 as (u16), 1327i32 as (u16), 815i32 as (u16), 1839i32 as (u16), 175i32 as (u16), 1199i32 as (u16), 687i32 as (u16), 1711i32 as (u16), 431i32 as (u16), 1455i32 as (u16), 943i32 as (u16), 1967i32 as (u16), 111i32 as (u16), 1135i32 as (u16), 623i32 as (u16), 1647i32 as (u16), 367i32 as (u16), 1391i32 as (u16), 879i32 as (u16), 1903i32 as (u16), 239i32 as (u16), 1263i32 as (u16), 751i32 as (u16), 1775i32 as (u16), 495i32 as (u16), 1519i32 as (u16), 1007i32 as (u16), 2031i32 as (u16), 31i32 as (u16), 1055i32 as (u16), 543i32 as (u16), 1567i32 as (u16), 287i32 as (u16), 1311i32 as (u16), 799i32 as (u16), 1823i32 as (u16), 159i32 as (u16), 1183i32 as (u16), 671i32 as (u16), 1695i32 as (u16), 415i32 as (u16), 1439i32 as (u16), 927i32 as (u16), 1951i32 as (u16), 95i32 as (u16), 1119i32 as (u16), 607i32 as (u16), 1631i32 as (u16), 351i32 as (u16), 1375i32 as (u16), 863i32 as (u16), 1887i32 as (u16), 223i32 as (u16), 1247i32 as (u16), 735i32 as (u16), 1759i32 as (u16), 479i32 as (u16), 1503i32 as (u16), 991i32 as (u16), 2015i32 as (u16), 63i32 as (u16), 1087i32 as (u16), 575i32 as (u16), 1599i32 as (u16), 319i32 as (u16), 1343i32 as (u16), 831i32 as (u16), 1855i32 as (u16), 191i32 as (u16), 1215i32 as (u16), 703i32 as (u16), 1727i32 as (u16), 447i32 as (u16), 1471i32 as (u16), 959i32 as (u16), 1983i32 as (u16), 127i32 as (u16), 1151i32 as (u16), 639i32 as (u16), 1663i32 as (u16), 383i32 as (u16), 1407i32 as (u16), 895i32 as (u16), 1919i32 as (u16), 255i32 as (u16), 1279i32 as (u16), 767i32 as (u16), 1791i32 as (u16), 511i32 as (u16), 1535i32 as (u16), 1023i32 as (u16), 2047i32 as (u16)]; brotli-3.4.0/src/enc/context_map_entropy.rs000064400000000000000000000466171046102023000171440ustar 00000000000000use core; pub use super::ir_interpret::{IRInterpreter, Context, push_base}; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use super::interface; use super::input_pair::{InputPair, InputReference, InputReferenceMut}; use super::util::{floatX, FastLog2u16}; use super::find_stride; use super::weights::{Weights, BLEND_FIXED_POINT_PRECISION}; const DEFAULT_CM_SPEED_INDEX: usize = 8; const NUM_SPEEDS_TO_TRY: usize = 16; const SPEEDS_TO_SEARCH: [u16; NUM_SPEEDS_TO_TRY]= [0, 1, 1, 1, 2, 4, 8, 16, 16, 32, 64, 128, 128, 512, 1664, 1664, ]; const MAXES_TO_SEARCH: [u16; NUM_SPEEDS_TO_TRY] = [32, 32, 128, 16384, 1024, 1024, 8192, 48, 8192, 4096, 16384, 256, 16384, 16384, 16384, 16384, ]; const NIBBLE_PRIOR_SIZE: usize = 16 * NUM_SPEEDS_TO_TRY; // the high nibble, followed by the low nibbles const CONTEXT_MAP_PRIOR_SIZE: usize = 256 * NIBBLE_PRIOR_SIZE * 17; const STRIDE_PRIOR_SIZE: usize = 256 * 256 * NIBBLE_PRIOR_SIZE * 2; #[derive(Clone,Copy, Debug)] pub struct SpeedAndMax(pub u16, pub u16); pub fn speed_to_tuple(inp:[SpeedAndMax;2]) -> [(u16,u16);2] { [(inp[0].0, inp[0].1), (inp[1].0, inp[1].1)] } fn get_stride_cdf_low(data: &mut [u16], stride_prior: u8, cm_prior: usize, high_nibble: u8) -> &mut [u16] { let index: usize = 1 + 2 * (cm_prior as usize | ((stride_prior as usize & 0xf) << 8) | ((high_nibble as usize) << 12)); data.split_at_mut(NUM_SPEEDS_TO_TRY * index << 4).1.split_at_mut(16 * NUM_SPEEDS_TO_TRY).0 } fn get_stride_cdf_high(data: &mut [u16], stride_prior: u8, cm_prior: usize) -> &mut [u16] { let index: usize = 2 * (cm_prior as usize | ((stride_prior as usize) << 8)); data.split_at_mut(NUM_SPEEDS_TO_TRY * index << 4).1.split_at_mut(16 * NUM_SPEEDS_TO_TRY).0 } fn get_cm_cdf_low(data: &mut [u16], cm_prior: usize, high_nibble: u8) -> &mut [u16] { let index: usize = (high_nibble as usize + 1) + 17 * cm_prior as usize; data.split_at_mut(NUM_SPEEDS_TO_TRY * index << 4).1.split_at_mut(16 * NUM_SPEEDS_TO_TRY).0 } fn get_cm_cdf_high(data: &mut [u16], cm_prior: usize) -> &mut [u16] { let index: usize = 17 * cm_prior as usize; data.split_at_mut(NUM_SPEEDS_TO_TRY * index << 4).1.split_at_mut(16 * NUM_SPEEDS_TO_TRY).0 } fn init_cdfs(cdfs: &mut [u16]) { assert_eq!(cdfs.len() % (16 * NUM_SPEEDS_TO_TRY), 0); let mut total_index = 0usize; let len = cdfs.len(); loop { for cdf_index in 0..16 { let vec = cdfs.split_at_mut(total_index).1.split_at_mut(NUM_SPEEDS_TO_TRY).0; for item in vec { *item = 4 + 4 * cdf_index as u16; } total_index += NUM_SPEEDS_TO_TRY; } if total_index == len { break; } } } fn compute_combined_cost(singleton_cost: &mut [floatX;NUM_SPEEDS_TO_TRY], cdfs: &[u16], mixing_cdf: [u16;16], nibble_u8: u8, _weights: &mut [Weights; NUM_SPEEDS_TO_TRY]) { assert_eq!(cdfs.len(), 16 * NUM_SPEEDS_TO_TRY); let nibble = nibble_u8 as usize & 0xf; let mut stride_pdf = [0u16; NUM_SPEEDS_TO_TRY]; stride_pdf.clone_from_slice(cdfs.split_at(NUM_SPEEDS_TO_TRY * nibble).1.split_at(NUM_SPEEDS_TO_TRY).0); let mut cm_pdf:u16 = mixing_cdf[nibble]; if nibble_u8 != 0 { let mut tmp = [0u16; NUM_SPEEDS_TO_TRY]; tmp.clone_from_slice(cdfs.split_at(NUM_SPEEDS_TO_TRY * (nibble - 1)).1.split_at(NUM_SPEEDS_TO_TRY).0); for i in 0..NUM_SPEEDS_TO_TRY { stride_pdf[i] -= tmp[i]; } cm_pdf -= mixing_cdf[nibble - 1] } let mut stride_max = [0u16; NUM_SPEEDS_TO_TRY]; stride_max.clone_from_slice(cdfs.split_at(NUM_SPEEDS_TO_TRY * 15).1); let cm_max = mixing_cdf[15]; for i in 0..NUM_SPEEDS_TO_TRY { if stride_pdf[i] == 0 { assert!(stride_pdf[i] != 0); } if stride_max[i] == 0 { assert!(stride_max[i] != 0); } let w; w = (1<<(BLEND_FIXED_POINT_PRECISION - 2)) ; // a quarter of weight to stride let combined_pdf = w * u32::from(stride_pdf[i]) + ((1<> BLEND_FIXED_POINT_PRECISION) as u16) - FastLog2u16((combined_max >> BLEND_FIXED_POINT_PRECISION) as u16); singleton_cost[i] -= del; } } fn compute_cost(singleton_cost: &mut [floatX;NUM_SPEEDS_TO_TRY], cdfs: &[u16], nibble_u8: u8) { assert_eq!(cdfs.len(), 16 * NUM_SPEEDS_TO_TRY); let nibble = nibble_u8 as usize & 0xf; let mut pdf = [0u16; NUM_SPEEDS_TO_TRY]; pdf.clone_from_slice(cdfs.split_at(NUM_SPEEDS_TO_TRY * nibble).1.split_at(NUM_SPEEDS_TO_TRY).0); if nibble_u8 != 0 { let mut tmp = [0u16; NUM_SPEEDS_TO_TRY]; tmp.clone_from_slice(cdfs.split_at(NUM_SPEEDS_TO_TRY * (nibble - 1)).1.split_at(NUM_SPEEDS_TO_TRY).0); for i in 0..NUM_SPEEDS_TO_TRY { pdf[i] -= tmp[i]; } } let mut max = [0u16; NUM_SPEEDS_TO_TRY]; max.clone_from_slice(cdfs.split_at(NUM_SPEEDS_TO_TRY * 15).1); for i in 0..NUM_SPEEDS_TO_TRY { if pdf[i] == 0 { assert!(pdf[i] != 0); } if max[i] == 0 { assert!(max[i] != 0); } let del = FastLog2u16(pdf[i]) - FastLog2u16(max[i]); singleton_cost[i] -= del; } } fn update_cdf(cdfs: &mut [u16], nibble_u8: u8) { assert_eq!(cdfs.len(), 16 * NUM_SPEEDS_TO_TRY); let mut overall_index = nibble_u8 as usize * NUM_SPEEDS_TO_TRY; for _nibble in (nibble_u8 as usize & 0xf) .. 16 { for speed_index in 0..NUM_SPEEDS_TO_TRY { cdfs[overall_index + speed_index] += SPEEDS_TO_SEARCH[speed_index]; } overall_index += NUM_SPEEDS_TO_TRY; } overall_index = 0; for nibble in 0 .. 16 { for speed_index in 0..NUM_SPEEDS_TO_TRY { if nibble == 0 { assert!(cdfs[overall_index + speed_index] != 0); } else { assert!(cdfs[overall_index + speed_index] - cdfs[overall_index + speed_index - NUM_SPEEDS_TO_TRY] != 0); } } overall_index += NUM_SPEEDS_TO_TRY; } for max_index in 0..NUM_SPEEDS_TO_TRY { if cdfs[15 * NUM_SPEEDS_TO_TRY + max_index] >= MAXES_TO_SEARCH[max_index] { const CDF_BIAS:[u16;16] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]; for nibble_index in 0..16 { let tmp = &mut cdfs[nibble_index * NUM_SPEEDS_TO_TRY + max_index]; *tmp = (tmp.wrapping_add(CDF_BIAS[nibble_index])).wrapping_sub(tmp.wrapping_add(CDF_BIAS[nibble_index]) >> 2); } } } overall_index = 0; for nibble in 0 .. 16 { for speed_index in 0..NUM_SPEEDS_TO_TRY { if nibble == 0 { assert!(cdfs[overall_index + speed_index] != 0); } else { assert!(cdfs[overall_index + speed_index] - cdfs[overall_index + speed_index - NUM_SPEEDS_TO_TRY] != 0); } } overall_index += NUM_SPEEDS_TO_TRY; } } fn extract_single_cdf(cdf_bundle:&[u16], index:usize) -> [u16;16] { assert_eq!(cdf_bundle.len(), 16 * NUM_SPEEDS_TO_TRY); assert!(index < NUM_SPEEDS_TO_TRY); [ cdf_bundle[index + 0 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 1 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 2 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 3 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 4 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 5 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 6 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 7 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 8 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 9 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 10 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 11 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 12 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 13 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 14 * NUM_SPEEDS_TO_TRY], cdf_bundle[index + 15 * NUM_SPEEDS_TO_TRY], ] } fn min_cost_index_for_speed(cost: &[floatX]) -> usize { assert_eq!(cost.len(), NUM_SPEEDS_TO_TRY); let mut min_cost = cost[0]; let mut best_choice = 0; for i in 1..NUM_SPEEDS_TO_TRY { if cost[i] < min_cost { best_choice = i; min_cost = cost[i]; } } best_choice } fn min_cost_speed_max(cost: &[floatX]) -> SpeedAndMax { let best_choice = min_cost_index_for_speed(cost); SpeedAndMax( SPEEDS_TO_SEARCH[best_choice], MAXES_TO_SEARCH[best_choice]) } fn min_cost_value(cost: &[floatX]) -> floatX { let best_choice = min_cost_index_for_speed(cost); cost[best_choice] } const SINGLETON_COMBINED_STRATEGY: usize = 2; const SINGLETON_STRIDE_STRATEGY: usize = 1; const SINGLETON_CM_STRATEGY: usize = 0; pub struct ContextMapEntropy<'a, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator, > { input: InputPair<'a>, context_map: interface::PredictionModeContextMap>, block_type: u8, cur_stride: u8, local_byte_offset: usize, weight: [[Weights; NUM_SPEEDS_TO_TRY];2], cm_priors: >::AllocatedMemory, stride_priors: >::AllocatedMemory, _stride_pyramid_leaves: [u8; find_stride::NUM_LEAF_NODES], singleton_costs: [[[floatX;NUM_SPEEDS_TO_TRY];2];3], } impl<'a, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator, > ContextMapEntropy<'a, Alloc> { pub fn new(m16: &mut Alloc, input: InputPair<'a>, stride: [u8; find_stride::NUM_LEAF_NODES], prediction_mode: interface::PredictionModeContextMap>, cdf_detection_quality: u8) -> Self { let cdf_detect = cdf_detection_quality != 0; let mut ret = ContextMapEntropy::{ input: input, context_map: prediction_mode, block_type: 0, cur_stride: 1, local_byte_offset: 0, cm_priors: if cdf_detect {>::alloc_cell(m16, CONTEXT_MAP_PRIOR_SIZE)} else {>::AllocatedMemory::default()}, stride_priors: if cdf_detect {>::alloc_cell(m16, STRIDE_PRIOR_SIZE)} else {>::AllocatedMemory::default()}, _stride_pyramid_leaves: stride, weight:[[Weights::new(); NUM_SPEEDS_TO_TRY], [Weights::new(); NUM_SPEEDS_TO_TRY]], singleton_costs:[[[0.0 as floatX;NUM_SPEEDS_TO_TRY];2];3], }; if cdf_detect { init_cdfs(ret.cm_priors.slice_mut()); init_cdfs(ret.stride_priors.slice_mut()); } ret } pub fn take_prediction_mode(&mut self) -> interface::PredictionModeContextMap> { core::mem::replace(&mut self.context_map, interface::PredictionModeContextMap::>{ literal_context_map:InputReferenceMut::default(), predmode_speed_and_distance_context_map:InputReferenceMut::default(), }) } pub fn prediction_mode_mut(&mut self) -> &mut interface::PredictionModeContextMap> { &mut self.context_map } pub fn best_singleton_speeds(&self, cm: bool, combined: bool) -> ([SpeedAndMax;2], [floatX; 2]) { let cost_type_index = if combined { 2usize } else if cm { 0usize } else { 1usize }; let mut ret_cost = [self.singleton_costs[cost_type_index][0][0], self.singleton_costs[cost_type_index][1][0]]; let mut best_indexes = [0,0]; for speed_index in 1..NUM_SPEEDS_TO_TRY { for highness in 0..2 { let cur_cost = self.singleton_costs[cost_type_index][highness][speed_index]; if cur_cost < ret_cost[highness] { best_indexes[highness] = speed_index; ret_cost[highness] = cur_cost; } } } let ret_speed = [SpeedAndMax(SPEEDS_TO_SEARCH[best_indexes[0]], MAXES_TO_SEARCH[best_indexes[0]]), SpeedAndMax(SPEEDS_TO_SEARCH[best_indexes[1]], MAXES_TO_SEARCH[best_indexes[1]])]; (ret_speed, ret_cost) } pub fn best_speeds(&mut self, // mut due to helpers cm:bool, combined: bool) -> [SpeedAndMax;2] { let mut ret = [SpeedAndMax(SPEEDS_TO_SEARCH[0],MAXES_TO_SEARCH[0]); 2]; let cost_type_index = if combined { 2usize } else if cm { 0usize } else { 1usize }; for high in 0..2 { /*eprintln!("TRIAL {} {}", cm, combined); for i in 0..NUM_SPEEDS_TO_TRY { eprintln!("{},{} costs {:?}", SPEEDS_TO_SEARCH[i], MAXES_TO_SEARCH[i], self.singleton_costs[cost_type_index][high][i]); }*/ ret[high] = min_cost_speed_max(&self.singleton_costs[cost_type_index][high][..]); } ret } pub fn best_speeds_costs(&mut self, // mut due to helpers cm:bool, combined: bool) -> [floatX;2] { let cost_type_index = if combined { 2usize } else if cm { 0usize } else { 1usize }; let mut ret = [0.0 as floatX; 2]; for high in 0..2 { ret[high] = min_cost_value(&self.singleton_costs[cost_type_index][high][..]); } ret } pub fn free(&mut self, alloc: &mut Alloc) { >::free_cell(alloc, core::mem::replace(&mut self.cm_priors, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.stride_priors, >::AllocatedMemory::default())); } fn update_cost_base(&mut self, stride_prior: u8, _selected_bits:u8, cm_prior: usize, literal: u8) { let upper_nibble = (literal >> 4); let lower_nibble = literal & 0xf; let provisional_cm_high_cdf: [u16; 16]; let provisional_cm_low_cdf: [u16; 16]; { let cm_cdf_high = get_cm_cdf_high(self.cm_priors.slice_mut(), cm_prior); compute_cost(&mut self.singleton_costs[SINGLETON_CM_STRATEGY][1], cm_cdf_high, upper_nibble); // choose a fairly reasonable cm speed rather than a selected one let best_cm_index = DEFAULT_CM_SPEED_INDEX;// = min_cost_index_for_speed(&self.singleton_costs[SINGLETON_CM_STRATEGY][1]); provisional_cm_high_cdf = extract_single_cdf(cm_cdf_high, best_cm_index); } { let cm_cdf_low = get_cm_cdf_low(self.cm_priors.slice_mut(), cm_prior, upper_nibble); compute_cost(&mut self.singleton_costs[SINGLETON_CM_STRATEGY][0], cm_cdf_low, lower_nibble); // choose a fairly reasonable cm speed rather than a selected one let best_cm_index = DEFAULT_CM_SPEED_INDEX;//min_cost_index_for_speed(&self.singleton_costs[SINGLETON_CM_STRATEGY][0]); provisional_cm_low_cdf = extract_single_cdf(cm_cdf_low, best_cm_index); } { let stride_cdf_high = get_stride_cdf_high(self.stride_priors.slice_mut(), stride_prior, cm_prior); compute_combined_cost(&mut self.singleton_costs[SINGLETON_COMBINED_STRATEGY][1], stride_cdf_high, provisional_cm_high_cdf, upper_nibble, &mut self.weight[1]); compute_cost(&mut self.singleton_costs[SINGLETON_STRIDE_STRATEGY][1], stride_cdf_high, upper_nibble); update_cdf(stride_cdf_high, upper_nibble); } { let stride_cdf_low = get_stride_cdf_low(self.stride_priors.slice_mut(), stride_prior, cm_prior, upper_nibble); compute_combined_cost(&mut self.singleton_costs[SINGLETON_COMBINED_STRATEGY][0], stride_cdf_low, provisional_cm_low_cdf, lower_nibble, &mut self.weight[0]); compute_cost(&mut self.singleton_costs[SINGLETON_STRIDE_STRATEGY][0], stride_cdf_low, lower_nibble); update_cdf(stride_cdf_low, lower_nibble); } { let cm_cdf_high = get_cm_cdf_high(self.cm_priors.slice_mut(), cm_prior); update_cdf(cm_cdf_high, upper_nibble); } { let cm_cdf_low = get_cm_cdf_low(self.cm_priors.slice_mut(), cm_prior, upper_nibble); update_cdf(cm_cdf_low, lower_nibble); } } } impl<'a, 'b, Alloc: alloc::Allocator + alloc::Allocator + alloc::Allocator> interface::CommandProcessor<'b> for ContextMapEntropy<'a, Alloc> { fn push(&mut self, val: interface::Command>) { push_base(self, val) } } impl<'a, Alloc: alloc::Allocator + alloc::Allocator + alloc::Allocator> IRInterpreter for ContextMapEntropy<'a, Alloc> { fn inc_local_byte_offset(&mut self, inc: usize) { self.local_byte_offset += inc; } fn local_byte_offset(&self) -> usize { self.local_byte_offset } fn update_block_type(&mut self, new_type: u8, stride: u8) { self.block_type = new_type; self.cur_stride = stride; } fn block_type(&self) -> u8 { self.block_type } fn literal_data_at_offset(&self, index:usize) -> u8 { self.input[index] } fn literal_context_map(&self) -> &[u8] { self.context_map.literal_context_map.slice() } fn prediction_mode(&self) -> ::interface::LiteralPredictionModeNibble { self.context_map.literal_prediction_mode() } fn update_cost(&mut self, stride_prior: [u8;8], stride_prior_offset: usize, selected_bits: u8, cm_prior: usize, literal: u8) { let stride = self.cur_stride as usize; self.update_cost_base(stride_prior[stride_prior_offset.wrapping_sub(stride) & 7], selected_bits, cm_prior, literal) } } brotli-3.4.0/src/enc/dictionary_hash.rs000075500000000000000000005525251046102023000162160ustar 00000000000000#![allow(dead_code)] pub static kStaticDictionaryHash: [u16; 32768] = [32072, 0, 0, 0, 0, 0, 0, 0, 0, 21860, 0, 0, 0, 0, 0, 0, 0, 40486, 0, 0, 0, 0, 0, 45798, 0, 0, 0, 0, 0, 0, 1292, 0, 0, 0, 0, 4964, 278, 23717, 0, 19972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2126, 16102, 0, 0, 0, 14437, 0, 0, 0, 0, 0, 0, 0, 26727, 2253, 0, 0, 17252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3622, 0, 0, 0, 0, 22984, 0, 0, 0, 0, 0, 0, 16647, 0, 34247, 0, 0, 0, 0, 0, 48486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19532, 0, 0, 24004, 0, 0, 0, 9828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31974, 0, 0, 0, 0, 0, 0, 0, 0, 20650, 2404, 0, 20773, 1677, 9031, 0, 6404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6761, 7206, 0, 0, 21992, 22983, 0, 0, 3529, 0, 1864, 0, 0, 0, 0, 0, 0, 11046, 0, 0, 9641, 0, 0, 0, 6507, 0, 0, 36934, 21576, 62375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8294, 0, 0, 0, 0, 0, 0, 0, 40807, 0, 0, 0, 39398, 8136, 0, 0, 0, 0, 0, 0, 0, 8875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7941, 0, 0, 25609, 0, 0, 0, 936, 3716, 3213, 15687, 0, 0, 0, 0, 0, 52519, 0, 17381, 0, 0, 0, 0, 1320, 5797, 0, 21029, 0, 0, 6472, 807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13545, 0, 0, 0, 3624, 0, 0, 0, 29674, 30820, 0, 31237, 0, 6596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64070, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22278, 0, 37446, 0, 0, 0, 0, 7240, 423, 0, 24612, 21705, 17636, 0, 0, 0, 0, 0, 0, 1833, 0, 0, 0, 328, 6021, 0, 0, 0, 19974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62119, 4178, 0, 0, 0, 0, 12100, 8617, 0, 0, 16900, 0, 36678, 0, 0, 0, 35366, 0, 51718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20998, 0, 62086, 0, 0, 0, 0, 0, 5542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14629, 10952, 25927, 0, 0, 0, 0, 19849, 0, 0, 0, 0, 0, 0, 0, 30952, 3046, 14314, 12998, 0, 0, 0, 15268, 0, 40582, 30216, 62118, 0, 0, 0, 20132, 0, 0, 0, 0, 0, 12005, 0, 0, 0, 52358, 0, 0, 0, 0, 24778, 0, 44, 33095, 0, 0, 0, 0, 0, 26372, 0, 0, 0, 0, 0, 3781, 0, 0, 17928, 9479, 0, 0, 0, 0, 0, 0, 0, 0, 32297, 28613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47174, 11723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2536, 55143, 0, 0, 6410, 0, 0, 0, 0, 0, 0, 0, 0, 56294, 11914, 0, 529, 0, 30184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8261, 0, 0, 28808, 58854, 22633, 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64135, 0, 0, 331, 3684, 0, 1605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16650, 37, 0, 23622, 3144, 15429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22443, 69, 0, 0, 0, 0, 0, 0, 0, 0, 17832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11113, 0, 0, 0, 0, 18309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26630, 0, 0, 25512, 25895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16901, 0, 0, 0, 27558, 0, 0, 9418, 0, 0, 0, 3508, 0, 0, 0, 0, 0, 0, 0, 0, 37990, 9289, 8517, 0, 0, 0, 0, 1578, 1604, 23944, 0, 0, 14916, 12781, 0, 0, 0, 0, 0, 0, 0, 12105, 0, 16617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21348, 11240, 28870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5772, 0, 0, 27812, 0, 0, 0, 0, 0, 0, 0, 8324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16748, 1157, 0, 0, 18794, 16324, 25898, 935, 8333, 0, 0, 0, 0, 0, 0, 0, 0, 18246, 0, 18086, 0, 46854, 0, 0, 0, 0, 0, 0, 339, 0, 0, 25188, 12780, 12166, 6409, 0, 0, 0, 0, 16516, 0, 27012, 28395, 0, 0, 0, 0, 0, 0, 0, 1420, 0, 0, 0, 9768, 52967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25163, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64998, 0, 0, 0, 0, 0, 21893, 0, 0, 0, 0, 0, 47366, 0, 0, 0, 870, 0, 0, 0, 12646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26020, 16360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1809, 0, 0, 0, 6601, 15878, 0, 0, 0, 0, 0, 29092, 0, 28516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21988, 0, 0, 0, 42950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5133, 1318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54982, 24904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51526, 0, 0, 0, 0, 0, 3685, 0, 0, 0, 0, 10062, 9412, 0, 0, 0, 31460, 5708, 6181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27144, 57478, 0, 0, 0, 0, 0, 0, 7084, 0, 21993, 53126, 0, 0, 0, 0, 8397, 0, 0, 5733, 0, 0, 0, 0, 0, 2116, 0, 24742, 0, 11271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1133, 0, 4873, 0, 0, 38310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17932, 0, 0, 18053, 0, 0, 0, 25510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17798, 0, 26214, 0, 0, 0, 0, 0, 0, 0, 0, 23016, 17415, 20392, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3239, 0, 46119, 0, 0, 0, 28580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41478, 0, 0, 31016, 55334, 10056, 1924, 0, 0, 0, 0, 0, 36614, 0, 36711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13994, 59303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26501, 0, 5639, 0, 0, 0, 0, 0, 0, 13897, 1253, 0, 0, 0, 0, 0, 5095, 0, 0, 0, 28869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8646, 0, 0, 0, 0, 25641, 17796, 0, 0, 0, 0, 0, 0, 0, 13316, 620, 6309, 11819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 904, 1095, 0, 24229, 0, 0, 28744, 49703, 0, 23077, 0, 0, 0, 0, 32392, 0, 0, 0, 0, 35271, 0, 28740, 5866, 0, 0, 0, 0, 0, 0, 0, 4361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7917, 8869, 0, 0, 0, 13924, 0, 0, 0, 0, 0, 41958, 0, 0, 0, 0, 0, 0, 6766, 13989, 0, 0, 0, 903, 0, 0, 24010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64390, 0, 22468, 0, 25861, 0, 0, 0, 0, 23656, 5317, 0, 0, 0, 0, 0, 0, 23017, 5445, 16009, 0, 0, 0, 0, 0, 0, 0, 0, 48006, 10473, 0, 0, 14404, 0, 0, 0, 42183, 0, 0, 0, 51270, 0, 0, 10602, 24132, 0, 0, 0, 0, 0, 43782, 0, 0, 17834, 0, 0, 0, 25576, 27205, 0, 0, 0, 0, 0, 0, 0, 0, 29066, 0, 0, 0, 0, 0, 626, 1988, 14700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44710, 0, 0, 0, 0, 3848, 7623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42374, 0, 0, 0, 0, 0, 0, 0, 0, 19272, 6436, 0, 0, 5256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39783, 0, 0, 0, 0, 30984, 0, 0, 0, 0, 0, 0, 28230, 0, 0, 0, 29028, 10538, 3205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5636, 840, 295, 0, 0, 8488, 8198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4074, 19526, 0, 0, 0, 0, 31144, 64038, 0, 0, 0, 0, 0, 0, 16716, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17706, 0, 0, 0, 0, 0, 0, 50630, 0, 50503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25446, 0, 0, 0, 13831, 0, 0, 0, 0, 0, 0, 2696, 4039, 0, 0, 0, 0, 25288, 0, 12076, 2054, 0, 48934, 0, 0, 0, 0, 16969, 59431, 17259, 35335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31275, 0, 0, 0, 1097, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 776, 839, 0, 0, 29386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5864, 12134, 0, 0, 0, 0, 0, 0, 0, 25349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24678, 0, 0, 0, 63335, 0, 28836, 8142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4494, 0, 0, 0, 0, 0, 14088, 1188, 0, 16260, 0, 0, 0, 16421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 17060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24076, 29445, 0, 33543, 0, 4901, 0, 0, 12522, 0, 0, 62471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4046, 0, 0, 0, 0, 20486, 0, 15460, 2217, 51719, 0, 0, 0, 0, 0, 23495, 0, 0, 0, 0, 0, 0, 15370, 0, 15849, 0, 15113, 0, 0, 0, 0, 0, 0, 0, 0, 27972, 7337, 0, 0, 0, 0, 30342, 0, 0, 0, 0, 0, 0, 0, 0, 32299, 23940, 0, 17766, 0, 0, 0, 0, 0, 0, 6184, 0, 20904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31492, 0, 0, 0, 5509, 0, 0, 0, 0, 0, 0, 0, 0, 2669, 50182, 0, 0, 12299, 0, 0, 0, 0, 0, 0, 0, 5257, 28167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11750, 3890, 0, 0, 26500, 0, 0, 0, 0, 0, 0, 0, 49318, 0, 0, 0, 0, 0, 0, 0, 10981, 0, 0, 0, 0, 0, 0, 0, 0, 17961, 1831, 0, 0, 0, 0, 0, 0, 0, 29638, 0, 0, 0, 0, 26473, 0, 6216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28683, 39975, 0, 0, 0, 0, 0, 51654, 0, 0, 0, 27527, 0, 0, 0, 0, 0, 0, 0, 0, 30859, 3268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28772, 0, 18212, 0, 0, 0, 0, 25448, 65446, 0, 0, 0, 0, 0, 0, 3337, 1670, 0, 0, 0, 0, 0, 19332, 0, 0, 0, 0, 24936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1043, 0, 0, 0, 0, 15814, 0, 21670, 0, 0, 0, 0, 0, 0, 0, 16263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32454, 0, 30630, 0, 0, 20170, 9926, 0, 0, 0, 18247, 0, 0, 14376, 0, 2056, 17191, 0, 0, 0, 0, 0, 0, 0, 7812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22474, 52806, 1588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10825, 0, 0, 0, 0, 40934, 0, 0, 0, 0, 0, 0, 0, 28677, 0, 0, 5714, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25865, 22246, 0, 0, 0, 0, 17256, 35751, 0, 0, 0, 0, 0, 0, 0, 0, 8236, 0, 32108, 0, 0, 0, 43, 14342, 0, 16517, 0, 0, 30732, 0, 4012, 133, 0, 40583, 971, 23942, 0, 0, 27275, 0, 0, 0, 204, 0, 0, 27140, 7564, 44327, 27592, 57958, 0, 0, 0, 0, 22344, 25701, 0, 0, 0, 0, 0, 0, 0, 19524, 31755, 0, 0, 28102, 0, 59111, 0, 0, 0, 0, 0, 0, 0, 12261, 0, 44934, 0, 0, 0, 0, 31560, 0, 11114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18953, 18311, 0, 45159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2059, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22411, 23943, 0, 0, 0, 0, 0, 0, 11690, 0, 0, 4069, 0, 0, 2668, 6342, 0, 0, 0, 0, 0, 0, 27658, 1766, 0, 0, 0, 0, 23240, 56070, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34119, 0, 24453, 0, 0, 0, 0, 21867, 0, 17610, 9894, 0, 0, 27976, 38790, 0, 0, 0, 43654, 0, 31559, 12202, 23142, 0, 0, 0, 50343, 0, 0, 0, 0, 0, 32806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49895, 0, 0, 0, 0, 15786, 4263, 0, 0, 0, 0, 4746, 3814, 0, 0, 0, 0, 0, 0, 17192, 453, 17323, 0, 20328, 4036, 0, 0, 0, 15844, 0, 0, 0, 0, 27561, 31940, 32296, 0, 0, 0, 0, 0, 0, 0, 11499, 11782, 0, 0, 0, 0, 9738, 50471, 0, 0, 0, 0, 0, 35430, 0, 0, 0, 0, 0, 29734, 0, 0, 0, 36551, 0, 0, 0, 0, 9257, 5606, 0, 13829, 0, 7015, 0, 0, 0, 0, 0, 25127, 0, 0, 19051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2572, 0, 0, 0, 0, 0, 0, 29797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42342, 0, 0, 0, 0, 9293, 0, 17896, 56038, 4077, 0, 0, 0, 29899, 37351, 0, 30823, 0, 8326, 0, 0, 0, 18342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18569, 54054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37254, 0, 0, 31433, 61510, 0, 2022, 0, 0, 0, 0, 0, 25381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2149, 25289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12516, 14185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36486, 0, 0, 0, 0, 10889, 9607, 0, 28711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28490, 0, 0, 0, 0, 26181, 10283, 1701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14980, 0, 7783, 0, 27846, 0, 0, 0, 56486, 3892, 0, 0, 0, 5770, 16583, 0, 26309, 13422, 20292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28742, 0, 0, 0, 0, 14536, 1158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42438, 0, 3332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17353, 1447, 0, 0, 8427, 48518, 1359, 0, 0, 0, 0, 0, 14986, 0, 32168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9230, 2791, 0, 0, 0, 0, 0, 0, 0, 0, 16073, 31623, 4269, 0, 0, 0, 0, 0, 0, 4519, 0, 0, 27912, 58950, 0, 0, 0, 0, 0, 0, 0, 0, 8361, 19812, 0, 0, 0, 0, 6056, 7877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9128, 1125, 0, 16548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17292, 6854, 21352, 0, 2380, 0, 0, 4007, 0, 0, 0, 0, 0, 24357, 4202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42823, 3022, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14373, 0, 20677, 3304, 2759, 20522, 64903, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27814, 2802, 8870, 3758, 1255, 0, 0, 0, 0, 0, 0, 0, 0, 30027, 9510, 0, 0, 0, 0, 17864, 14855, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51462, 0, 0, 0, 0, 0, 0, 0, 45734, 0, 0, 23467, 32327, 0, 0, 10826, 52999, 0, 0, 0, 33222, 31336, 64326, 0, 0, 0, 0, 0, 0, 0, 32166, 0, 0, 3891, 0, 0, 0, 7017, 645, 0, 0, 0, 0, 0, 0, 27915, 46087, 0, 0, 0, 21863, 0, 34246, 0, 0, 16715, 0, 0, 0, 0, 14052, 21416, 0, 0, 0, 0, 0, 0, 0, 0, 39846, 0, 0, 0, 0, 0, 38982, 0, 0, 17512, 7460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15428, 0, 0, 0, 0, 0, 0, 0, 28356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19911, 0, 20007, 0, 0, 0, 10855, 943, 0, 0, 10821, 0, 0, 0, 0, 4170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65415, 0, 0, 0, 0, 0, 0, 0, 0, 9865, 24646, 0, 0, 0, 0, 0, 40519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22091, 23655, 0, 0, 0, 0, 0, 0, 0, 31686, 0, 0, 0, 58599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24421, 0, 28100, 0, 0, 0, 31268, 0, 3204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14822, 0, 0, 0, 0, 19947, 10182, 0, 0, 9480, 14821, 4398, 0, 0, 14532, 0, 0, 0, 48871, 1873, 0, 0, 0, 0, 0, 0, 0, 589, 1541, 0, 0, 0, 0, 0, 23333, 0, 0, 0, 14149, 0, 0, 0, 0, 1296, 14374, 0, 27300, 0, 0, 0, 0, 0, 0, 7276, 0, 0, 0, 0, 0, 0, 47718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5164, 1765, 0, 14405, 0, 37574, 1994, 0, 6636, 0, 0, 0, 0, 0, 0, 0, 0, 27815, 0, 0, 0, 0, 2568, 6820, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11336, 26247, 0, 0, 23912, 0, 0, 0, 30536, 0, 0, 34342, 0, 17799, 0, 0, 0, 22149, 0, 6118, 0, 25732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26600, 5190, 0, 0, 1142, 0, 0, 0, 0, 0, 0, 0, 0, 39527, 0, 0, 0, 0, 0, 39494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3085, 0, 0, 0, 0, 0, 0, 0, 4786, 0, 0, 0, 28873, 6532, 0, 0, 26664, 0, 9193, 11719, 0, 0, 0, 0, 0, 0, 31752, 64646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25094, 0, 0, 18153, 20167, 0, 0, 0, 17254, 0, 0, 878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26059, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31592, 0, 0, 8167, 24362, 6212, 0, 34758, 0, 0, 0, 0, 0, 0, 32520, 0, 0, 44679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17989, 8681, 29222, 0, 0, 0, 0, 0, 0, 0, 0, 10251, 4902, 1452, 15207, 0, 0, 0, 0, 0, 0, 0, 22822, 0, 10469, 0, 0, 0, 0, 0, 0, 19337, 17670, 107, 11494, 0, 0, 0, 0, 27305, 2565, 0, 0, 0, 0, 0, 0, 0, 64518, 200, 28389, 0, 0, 0, 0, 31208, 0, 30762, 0, 0, 0, 0, 0, 29321, 60518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3209, 3237, 12490, 22663, 0, 0, 0, 18789, 31464, 16391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20646, 0, 0, 0, 27238, 0, 0, 0, 0, 0, 15940, 4488, 6951, 0, 0, 0, 46342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20584, 3367, 0, 25350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55943, 0, 0, 0, 0, 0, 24133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2929, 0, 0, 50086, 0, 2918, 25356, 30052, 115, 11846, 0, 0, 0, 0, 3056, 0, 0, 0, 0, 17639, 239, 19815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21479, 0, 0, 0, 0, 0, 28420, 11786, 4772, 0, 0, 3368, 36295, 0, 31463, 0, 0, 14665, 996, 0, 20582, 0, 0, 0, 9988, 0, 23685, 0, 0, 0, 52551, 0, 0, 0, 0, 0, 0, 0, 7556, 0, 0, 0, 0, 0, 0, 0, 1895, 2186, 0, 0, 0, 0, 0, 27755, 25447, 0, 0, 0, 0, 31052, 63270, 0, 0, 0, 0, 0, 0, 0, 36742, 0, 24804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21290, 2276, 0, 0, 0, 0, 26475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15332, 0, 0, 0, 0, 0, 0, 0, 0, 3176, 19431, 0, 0, 0, 0, 0, 0, 0, 62726, 0, 0, 0, 25380, 0, 0, 27883, 1316, 0, 0, 7724, 3015, 0, 0, 0, 0, 6697, 0, 0, 47910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3141, 0, 0, 0, 14820, 0, 0, 0, 0, 9326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31493, 0, 0, 0, 0, 0, 6566, 0, 0, 0, 0, 0, 0, 6569, 1348, 0, 25638, 0, 0, 0, 0, 0, 20324, 0, 0, 17067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11876, 0, 41030, 0, 0, 0, 26405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11431, 28137, 14950, 0, 10151, 0, 0, 0, 0, 0, 0, 0, 29574, 0, 0, 0, 0, 27176, 57446, 0, 0, 0, 0, 28650, 57574, 1387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58247, 0, 0, 0, 0, 0, 0, 0, 16805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3526, 0, 15781, 0, 5572, 13352, 0, 0, 0, 0, 0, 18665, 23463, 0, 0, 0, 0, 0, 0, 15405, 6885, 0, 0, 0, 0, 15272, 0, 0, 0, 0, 0, 0, 0, 0, 9861, 0, 0, 0, 0, 0, 0, 0, 0, 9512, 4037, 0, 0, 11563, 49639, 0, 0, 0, 0, 0, 0, 27880, 57830, 0, 0, 0, 0, 0, 41831, 0, 21924, 0, 0, 0, 0, 0, 0, 0, 25509, 0, 27462, 0, 18085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13898, 8068, 26441, 0, 0, 0, 0, 0, 0, 25316, 0, 0, 0, 0, 16298, 7397, 5706, 19239, 0, 0, 0, 0, 0, 0, 0, 0, 1392, 50919, 0, 0, 0, 0, 0, 53863, 0, 0, 0, 0, 1451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17801, 15813, 0, 12740, 0, 0, 0, 32967, 0, 0, 0, 0, 0, 0, 5389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31143, 0, 20548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12109, 19015, 0, 34983, 0, 21732, 3600, 0, 0, 0, 0, 47750, 17288, 43975, 22857, 47559, 0, 0, 0, 0, 26408, 48358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30470, 0, 0, 23560, 4581, 0, 22404, 0, 49286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49831, 0, 0, 0, 27525, 31691, 7, 0, 0, 25835, 0, 0, 0, 0, 0, 4201, 16485, 0, 20676, 0, 0, 0, 0, 3753, 23303, 16264, 3878, 0, 0, 0, 0, 0, 0, 11434, 0, 0, 0, 0, 0, 0, 7589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22820, 11146, 49158, 0, 23623, 0, 0, 0, 0, 0, 0, 0, 13893, 0, 0, 0, 0, 0, 0, 11722, 60071, 1258, 0, 0, 0, 0, 0, 0, 18564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27945, 0, 0, 0, 0, 5479, 0, 20006, 17608, 3431, 10988, 30180, 0, 0, 0, 0, 0, 0, 0, 24581, 14, 0, 0, 0, 0, 0, 0, 25572, 0, 0, 0, 28612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8710, 0, 14116, 0, 0, 116, 292, 0, 0, 0, 37831, 0, 43078, 0, 0, 0, 0, 0, 0, 0, 0, 21832, 0, 0, 32134, 783, 0, 0, 30982, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5932, 0, 0, 0, 18505, 15175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3630, 16965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17797, 0, 0, 0, 0, 0, 0, 520, 42150, 0, 0, 3122, 0, 0, 0, 22506, 0, 0, 0, 0, 0, 0, 0, 0, 28550, 0, 0, 0, 50278, 0, 0, 13641, 5958, 0, 35238, 0, 0, 0, 0, 0, 0, 0, 0, 29993, 18724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20619, 9319, 0, 0, 0, 0, 23977, 0, 5193, 0, 0, 12196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20105, 677, 0, 0, 0, 0, 0, 0, 0, 0, 29419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20266, 0, 0, 0, 0, 10631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26628, 12744, 0, 20648, 0, 0, 0, 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 646, 0, 25604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63782, 0, 0, 0, 0, 24616, 0, 0, 0, 21291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45638, 0, 0, 0, 0, 1931, 0, 0, 0, 20521, 59975, 0, 20614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56231, 0, 0, 0, 0, 0, 29991, 0, 52871, 0, 20934, 0, 0, 0, 0, 0, 0, 0, 16871, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7237, 0, 0, 0, 0, 0, 47558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10406, 0, 0, 0, 0, 0, 0, 0, 43046, 0, 0, 2930, 0, 12936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31141, 0, 0, 0, 0, 0, 0, 0, 37639, 0, 17572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31240, 0, 0, 0, 0, 0, 688, 0, 0, 0, 0, 0, 1648, 0, 0, 0, 0, 10055, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6345, 199, 0, 34982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56839, 0, 0, 0, 0, 0, 48902, 0, 13412, 0, 0, 0, 0, 0, 0, 0, 0, 2441, 4420, 0, 0, 0, 0, 20428, 933, 0, 0, 0, 0, 0, 0, 0, 45383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17036, 741, 0, 0, 0, 0, 0, 0, 0, 27589, 0, 0, 30282, 18950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25993, 0, 0, 0, 2443, 0, 0, 31622, 0, 14150, 0, 0, 0, 28679, 0, 0, 0, 0, 0, 0, 15464, 0, 0, 0, 0, 54694, 0, 0, 0, 0, 0, 0, 3827, 0, 0, 0, 3756, 0, 9897, 0, 0, 0, 0, 0, 19082, 31239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27625, 0, 0, 0, 784, 4647, 32652, 0, 0, 63494, 0, 0, 0, 0, 0, 0, 0, 21062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3404, 58470, 0, 32325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18634, 2789, 0, 0, 0, 0, 0, 0, 0, 8548, 0, 0, 0, 22501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15881, 0, 0, 0, 0, 35879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7978, 17956, 0, 0, 0, 0, 0, 0, 0, 24324, 0, 0, 4937, 0, 0, 0, 8168, 0, 13420, 10340, 0, 0, 0, 0, 0, 11780, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16712, 0, 0, 0, 0, 0, 0, 0, 17640, 17991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2953, 0, 0, 0, 0, 0, 0, 0, 9100, 16806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30667, 0, 0, 19013, 0, 0, 0, 0, 0, 0, 205, 15334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1969, 0, 0, 0, 0, 0, 0, 0, 26248, 52518, 0, 49798, 0, 0, 0, 0, 0, 0, 0, 9668, 0, 0, 0, 0, 0, 4742, 0, 0, 21641, 0, 0, 0, 0, 0, 0, 53574, 0, 0, 0, 0, 0, 0, 5707, 0, 0, 0, 0, 0, 0, 0, 3018, 12454, 0, 0, 0, 0, 2920, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23910, 0, 0, 0, 0, 0, 0, 0, 55879, 0, 0, 0, 0, 0, 775, 0, 43270, 5066, 48967, 0, 0, 22986, 4165, 8971, 44838, 0, 0, 0, 0, 0, 62279, 272, 0, 0, 0, 0, 51430, 0, 0, 0, 0, 0, 0, 28234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13349, 0, 0, 0, 51111, 20265, 13861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 7494, 0, 0, 0, 0, 0, 0, 0, 0, 21768, 62407, 0, 0, 0, 0, 7979, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38918, 0, 56742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16296, 5767, 0, 0, 0, 0, 0, 0, 0, 32068, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29796, 0, 0, 0, 0, 0, 0, 0, 0, 23916, 30183, 0, 58791, 0, 0, 0, 0, 0, 0, 0, 20518, 0, 0, 0, 0, 8969, 0, 0, 0, 183, 0, 0, 0, 0, 0, 2314, 17445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23748, 0, 0, 8139, 4839, 27914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29478, 0, 0, 16552, 26663, 0, 53767, 0, 0, 13960, 8039, 18696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 782, 16005, 0, 0, 0, 0, 0, 0, 0, 0, 6258, 56806, 16456, 12455, 0, 0, 0, 0, 0, 0, 0, 23780, 0, 0, 0, 0, 0, 0, 9355, 0, 0, 0, 7273, 41063, 24780, 57766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3820, 2597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29225, 61126, 0, 0, 0, 58439, 15691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37190, 22408, 967, 0, 0, 0, 23078, 26858, 0, 0, 0, 19753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5416, 13702, 0, 0, 0, 0, 0, 52742, 20394, 38567, 0, 0, 0, 51079, 0, 0, 136, 8516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8936, 5031, 12520, 19334, 0, 0, 22827, 30247, 28074, 31140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27497, 18148, 20104, 59079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24389, 0, 0, 6125, 0, 0, 0, 0, 9541, 0, 0, 24553, 29095, 0, 0, 0, 0, 0, 0, 0, 25444, 0, 0, 9643, 0, 0, 63047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39558, 0, 0, 0, 0, 0, 0, 20620, 11815, 499, 0, 5128, 2278, 0, 0, 0, 0, 0, 46310, 0, 0, 0, 0, 0, 0, 0, 0, 23530, 40166, 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26758, 0, 0, 0, 0, 0, 51911, 0, 0, 23532, 0, 0, 0, 0, 51238, 25737, 44486, 12622, 0, 0, 0, 0, 0, 0, 3078, 0, 9253, 0, 0, 1128, 22023, 0, 0, 0, 21350, 0, 16420, 0, 0, 0, 0, 0, 0, 0, 65094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22532, 0, 48774, 0, 34503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9797, 0, 0, 0, 0, 0, 0, 0, 13797, 0, 38279, 0, 0, 1738, 0, 489, 46343, 0, 45382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29030, 0, 0, 0, 0, 0, 0, 6220, 56550, 0, 0, 0, 0, 0, 26885, 0, 28806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45958, 0, 0, 0, 0, 20553, 49927, 0, 0, 0, 0, 0, 0, 3019, 12358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26571, 13319, 0, 0, 653, 23399, 0, 0, 0, 0, 0, 0, 0, 0, 22316, 0, 0, 21188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27556, 0, 0, 0, 0, 0, 0, 0, 27878, 21483, 27653, 0, 29701, 237, 0, 10632, 0, 0, 0, 0, 33766, 0, 0, 0, 0, 0, 0, 31563, 0, 0, 0, 0, 0, 1416, 2439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9611, 0, 0, 0, 0, 0, 0, 0, 5611, 16581, 26601, 35462, 0, 0, 0, 26756, 0, 59271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26984, 57734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7882, 0, 0, 0, 19528, 6469, 0, 0, 1161, 0, 0, 0, 7688, 20935, 425, 0, 0, 0, 0, 0, 0, 0, 0, 12519, 0, 12902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2411, 0, 11725, 26086, 0, 0, 20201, 0, 0, 0, 0, 0, 0, 0, 0, 11045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21541, 1141, 21190, 0, 9188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 1093, 0, 0, 0, 0, 0, 0, 0, 0, 4842, 0, 13672, 0, 0, 12230, 0, 0, 0, 10532, 0, 0, 8937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28996, 0, 0, 11720, 26982, 0, 46182, 0, 43911, 31754, 0, 1160, 3940, 0, 20772, 0, 0, 0, 0, 0, 24549, 0, 32582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31845, 0, 0, 0, 0, 0, 0, 0, 2310, 11788, 0, 0, 43047, 0, 0, 0, 18853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63622, 0, 0, 7048, 17318, 0, 0, 0, 21957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1039, 6279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46470, 0, 0, 24, 19719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21353, 3846, 0, 0, 0, 0, 0, 0, 0, 36679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11268, 0, 0, 0, 0, 0, 9382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29926, 0, 33606, 0, 4708, 2828, 0, 0, 29543, 0, 0, 0, 0, 0, 29893, 0, 0, 0, 0, 0, 0, 0, 0, 3663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10920, 7111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37094, 0, 0, 0, 27110, 0, 0, 0, 0, 0, 0, 21865, 0, 27753, 30214, 0, 0, 0, 0, 0, 57895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12648, 5446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19784, 17124, 0, 52007, 0, 0, 0, 0, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24900, 0, 0, 0, 0, 0, 1476, 0, 65031, 0, 0, 1205, 46663, 0, 30023, 11625, 1094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10058, 0, 0, 0, 0, 0, 0, 28455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14788, 0, 0, 0, 0, 16808, 0, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15944, 23207, 0, 0, 0, 0, 247, 0, 0, 0, 0, 24743, 0, 0, 0, 5252, 0, 0, 0, 0, 0, 0, 0, 0, 29961, 18660, 21099, 46791, 0, 7045, 0, 0, 0, 0, 25707, 0, 0, 17412, 3828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5803, 5637, 0, 38151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 853, 0, 0, 0, 0, 0, 0, 30215, 0, 0, 0, 0, 0, 0, 0, 8741, 0, 0, 0, 0, 0, 27366, 0, 0, 0, 0, 171, 4070, 0, 0, 0, 0, 0, 0, 0, 0, 24073, 7366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2184, 5189, 0, 20932, 1545, 4996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6313, 0, 0, 0, 0, 0, 0, 0, 30826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21640, 63303, 0, 0, 3275, 31111, 0, 0, 0, 0, 0, 0, 0, 11556, 0, 14756, 0, 0, 0, 15108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23914, 28966, 0, 0, 0, 4965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10216, 5223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27142, 0, 0, 1173, 20198, 0, 0, 0, 0, 0, 56614, 0, 0, 0, 0, 0, 4612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17769, 7910, 0, 0, 31880, 0, 0, 6055, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16840, 23879, 0, 0, 11051, 0, 0, 0, 32552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20842, 13701, 0, 0, 0, 37191, 7373, 10471, 17482, 25348, 0, 0, 0, 38502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21509, 6058, 0, 0, 0, 0, 0, 0, 3173, 0, 0, 0, 9543, 0, 0, 0, 0, 0, 0, 17768, 12708, 0, 0, 0, 0, 0, 37030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12748, 48743, 0, 11718, 0, 0, 25194, 0, 0, 0, 9033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5028, 0, 30118, 0, 0, 0, 0, 0, 42759, 0, 0, 3720, 0, 0, 0, 0, 0, 0, 25190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5450, 5125, 0, 58086, 0, 0, 0, 0, 0, 27716, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22052, 0, 0, 0, 0, 26249, 0, 15947, 3460, 0, 0, 0, 35814, 0, 0, 0, 7813, 19500, 32167, 0, 18597, 0, 0, 0, 0, 0, 28644, 0, 0, 0, 60743, 0, 0, 0, 0, 0, 29636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17220, 15885, 9414, 9642, 0, 0, 0, 593, 0, 0, 24228, 0, 0, 0, 0, 0, 40422, 0, 26244, 0, 23109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64902, 0, 0, 0, 0, 3979, 60007, 0, 0, 0, 28199, 0, 0, 0, 43142, 0, 0, 0, 0, 0, 0, 0, 29158, 0, 30532, 0, 0, 0, 0, 13256, 0, 0, 0, 0, 16549, 0, 0, 0, 0, 0, 26116, 0, 0, 0, 0, 0, 0, 0, 0, 22825, 0, 0, 0, 0, 0, 0, 0, 1065, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18985, 4805, 0, 0, 0, 0, 0, 17702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3468, 0, 0, 0, 0, 13447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56871, 0, 0, 1776, 15780, 0, 0, 2603, 0, 10280, 31366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11592, 3591, 0, 2372, 0, 0, 0, 0, 0, 0, 0, 20004, 0, 0, 0, 0, 0, 0, 12072, 518, 0, 0, 1960, 8999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7178, 32999, 0, 0, 0, 0, 0, 0, 1641, 0, 0, 0, 0, 0, 0, 0, 6764, 9893, 490, 4005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25258, 5541, 0, 14053, 306, 20743, 0, 0, 9422, 0, 0, 0, 0, 0, 0, 0, 11977, 260, 0, 35175, 0, 0, 0, 0, 0, 0, 0, 18405, 0, 0, 0, 16582, 0, 0, 0, 22470, 0, 0, 0, 0, 0, 0, 2792, 0, 0, 0, 14026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14858, 3909, 0, 0, 0, 57671, 0, 0, 0, 0, 0, 0, 15979, 0, 0, 0, 2794, 15239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26884, 9070, 0, 0, 0, 0, 51846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19499, 37127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19205, 10350, 11910, 0, 0, 0, 0, 15083, 23108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15274, 41735, 0, 56774, 0, 0, 2825, 0, 14025, 389, 0, 0, 0, 0, 0, 0, 0, 0, 21482, 31910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20456, 710, 0, 0, 25032, 21797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32427, 21252, 0, 30150, 0, 43174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11403, 0, 0, 1029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6892, 9252, 0, 63206, 3496, 14406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22568, 0, 0, 21253, 0, 0, 0, 0, 0, 0, 0, 39623, 0, 0, 10189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30729, 59910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7660, 24871, 0, 838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12013, 13252, 0, 551, 0, 0, 0, 43207, 0, 30567, 0, 0, 0, 0, 0, 0, 0, 0, 28394, 30724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22665, 22725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29414, 0, 0, 0, 0, 16074, 8966, 245, 1445, 0, 0, 0, 0, 24872, 0, 0, 0, 0, 13124, 0, 35527, 0, 0, 0, 0, 0, 0, 13259, 10917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25191, 0, 0, 0, 13956, 0, 0, 0, 0, 0, 0, 0, 54631, 19625, 12070, 3083, 0, 0, 0, 0, 14436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21766, 0, 15463, 29322, 0, 0, 0, 0, 0, 0, 29990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23653, 0, 0, 0, 0, 0, 0, 0, 0, 2643, 0, 0, 21223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4114, 0, 0, 0, 0, 0, 0, 0, 0, 34790, 0, 0, 0, 0, 0, 0, 0, 16103, 0, 0, 0, 0, 0, 0, 297, 3620, 3338, 10372, 0, 14727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29924, 22473, 13895, 15529, 32455, 30378, 13540, 0, 28807, 0, 0, 0, 0, 0, 0, 0, 64582, 18380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38598, 0, 0, 0, 0, 0, 0, 0, 0, 1236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32710, 0, 0, 0, 0, 4590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16744, 0, 0, 0, 0, 0, 0, 20005, 0, 0, 13608, 1191, 0, 0, 0, 62183, 0, 0, 0, 0, 0, 24484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5380, 0, 0, 32328, 0, 0, 63814, 0, 0, 0, 2919, 0, 0, 0, 0, 17034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7690, 486, 0, 0, 0, 39270, 0, 49094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20967, 17993, 12647, 0, 0, 0, 16036, 32616, 0, 0, 0, 0, 16294, 8555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35174, 0, 0, 0, 0, 0, 0, 30346, 0, 0, 0, 0, 0, 0, 0, 14797, 3652, 0, 0, 8268, 12934, 0, 54950, 0, 0, 0, 0, 2632, 33959, 0, 23175, 0, 0, 0, 0, 0, 36262, 0, 0, 0, 0, 0, 0, 32684, 26918, 0, 32676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15625, 11943, 1206, 0, 0, 0, 0, 18052, 0, 0, 0, 0, 0, 16422, 0, 0, 0, 26404, 0, 0, 28777, 0, 0, 24902, 0, 0, 408, 45351, 0, 35719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3658, 17446, 0, 165, 0, 0, 0, 0, 0, 0, 0, 6151, 0, 0, 24424, 0, 0, 0, 0, 0, 0, 0, 24170, 24293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11847, 0, 39591, 0, 0, 0, 0, 0, 0, 9549, 2788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1010, 0, 0, 0, 0, 0, 0, 26055, 31724, 0, 24233, 1828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17284, 0, 0, 0, 0, 19464, 0, 0, 0, 0, 0, 0, 0, 0, 32452, 0, 0, 0, 28871, 0, 0, 0, 0, 17704, 53383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17892, 1938, 0, 0, 0, 0, 0, 16362, 0, 0, 21605, 0, 0, 5003, 0, 0, 0, 0, 0, 0, 22693, 0, 22342, 0, 0, 0, 55846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22853, 0, 0, 0, 0, 0, 0, 0, 0, 6600, 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40711, 0, 0, 0, 0, 0, 33894, 0, 0, 0, 0, 0, 0, 13000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30308, 0, 0, 0, 0, 0, 0, 5386, 0, 0, 0, 0, 0, 0, 27844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17740, 0, 0, 0, 0, 25093, 29064, 0, 0, 0, 0, 0, 0, 0, 12680, 11462, 0, 0, 0, 0, 0, 0, 0, 0, 84, 7303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27044, 457, 0, 22924, 58246, 19016, 0, 2606, 45703, 0, 5157, 0, 25028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2065, 0, 0, 0, 0, 0, 31946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33382, 0, 47878, 0, 0, 0, 0, 0, 0, 0, 0, 25004, 0, 0, 0, 0, 0, 0, 0, 26153, 35654, 0, 58055, 30668, 0, 0, 0, 0, 25988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7560, 20583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1733, 0, 0, 0, 8196, 0, 0, 11241, 0, 30572, 60326, 0, 15013, 0, 0, 0, 40646, 0, 23812, 0, 10022, 0, 0, 0, 0, 0, 0, 0, 0, 12874, 31015, 0, 0, 0, 0, 0, 0, 1608, 0, 0, 0, 0, 18308, 0, 0, 0, 0, 27114, 0, 0, 0, 0, 0, 0, 0, 7944, 1382, 0, 11813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24517, 0, 11621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21702, 0, 0, 13100, 8262, 2644, 7973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1033, 12581, 0, 25221, 0, 0, 0, 40998, 16301, 62983, 0, 0, 0, 0, 1263, 9318, 0, 0, 0, 18854, 0, 0, 1741, 33895, 0, 0, 0, 0, 0, 0, 26377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32165, 0, 51143, 0, 0, 0, 0, 0, 29412, 0, 0, 0, 0, 0, 0, 0, 0, 1674, 4230, 0, 0, 0, 0, 0, 10502, 0, 0, 0, 0, 5545, 0, 0, 0, 0, 0, 2099, 45158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14157, 0, 26955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27050, 6726, 0, 0, 0, 0, 0, 0, 0, 0, 28554, 0, 0, 7142, 0, 0, 0, 0, 16936, 0, 0, 0, 25833, 0, 4399, 6980, 0, 46214, 0, 0, 0, 0, 0, 10630, 21164, 0, 0, 0, 0, 0, 0, 0, 2446, 48551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13381, 0, 0, 0, 0, 0, 0, 0, 0, 15400, 12135, 0, 0, 0, 0, 0, 4774, 586, 0, 0, 0, 0, 0, 0, 0, 0, 23751, 9736, 4548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25577, 29607, 6250, 1637, 0, 0, 0, 0, 22024, 0, 0, 0, 0, 22308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37414, 24044, 0, 0, 0, 14474, 29735, 0, 7077, 0, 45990, 0, 0, 0, 0, 30568, 40039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6150, 0, 4228, 0, 0, 0, 0, 0, 27687, 0, 0, 0, 0, 0, 0, 0, 24548, 21513, 1350, 0, 0, 0, 33607, 0, 0, 0, 0, 0, 0, 0, 0, 11784, 1414, 0, 0, 0, 0, 0, 0, 0, 18244, 940, 0, 0, 0, 0, 0, 0, 7270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16709, 0, 0, 0, 0, 0, 0, 0, 48935, 0, 0, 0, 0, 0, 0, 23660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53350, 0, 0, 0, 0, 0, 0, 4236, 16358, 0, 4422, 6665, 32644, 0, 0, 744, 18084, 0, 11014, 0, 0, 0, 0, 0, 29508, 0, 0, 0, 0, 0, 0, 0, 7686, 0, 0, 13289, 5478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12872, 0, 0, 24134, 1005, 22916, 0, 31429, 23400, 0, 0, 0, 0, 0, 0, 0, 28424, 0, 0, 0, 25706, 27109, 0, 0, 26345, 0, 0, 0, 0, 0, 0, 25126, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 17032, 0, 0, 21799, 0, 0, 10060, 0, 12296, 21892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20777, 14311, 0, 58182, 32232, 0, 10282, 0, 2121, 11527, 0, 0, 0, 12325, 0, 0, 0, 0, 0, 0, 0, 28804, 2344, 8133, 0, 0, 0, 0, 21864, 62695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2771, 0, 0, 23204, 0, 0, 0, 0, 0, 6278, 0, 0, 0, 0, 0, 26597, 0, 0, 0, 0, 23144, 0, 0, 0, 0, 0, 31816, 20070, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24456, 2118, 0, 0, 0, 0, 6570, 1156, 0, 0, 0, 0, 0, 0, 0, 30406, 0, 0, 0, 28388, 3572, 0, 0, 26599, 12426, 5286, 0, 0, 0, 0, 0, 4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24970, 24167, 0, 0, 0, 0, 28745, 4678, 0, 0, 0, 0, 0, 0, 0, 1444, 236, 0, 0, 0, 0, 0, 0, 0, 0, 19428, 0, 0, 0, 0, 0, 0, 2092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2827, 0, 0, 0, 0, 0, 19881, 19204, 0, 11749, 0, 0, 0, 0, 0, 0, 0, 17958, 0, 17894, 0, 18726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21510, 5033, 0, 0, 0, 0, 22855, 0, 0, 0, 0, 0, 14598, 0, 29605, 0, 0, 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 47142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2225, 14823, 0, 0, 2637, 6182, 78, 15078, 0, 0, 0, 0, 20264, 0, 0, 0, 0, 0, 0, 36743, 4140, 44551, 17352, 25703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14024, 0, 0, 0, 0, 0, 0, 28004, 0, 0, 0, 0, 0, 7588, 0, 0, 0, 0, 0, 0, 0, 2087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18028, 0, 0, 0, 300, 14212, 0, 0, 1386, 40327, 0, 0, 0, 0, 0, 0, 31082, 0, 0, 22374, 0, 0, 0, 0, 0, 35718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26532, 7756, 0, 0, 18982, 0, 0, 0, 0, 0, 0, 0, 0, 6440, 1159, 7180, 0, 0, 0, 0, 0, 0, 45766, 0, 57798, 0, 16740, 0, 0, 6802, 60454, 0, 0, 0, 26470, 0, 0, 0, 0, 0, 65382, 4362, 7750, 0, 0, 0, 0, 0, 0, 9096, 4743, 334, 0, 0, 0, 0, 0, 0, 39974, 0, 0, 0, 25828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3027, 0, 0, 0, 15816, 0, 0, 0, 0, 0, 0, 0, 0, 48327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16168, 41799, 0, 0, 24458, 8581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54503, 0, 0, 0, 0, 5097, 30852, 18664, 0, 0, 0, 0, 0, 0, 16484, 0, 0, 27337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35942, 0, 0, 0, 0, 0, 0, 0, 4356, 0, 0, 0, 0, 0, 57030, 0, 0, 1417, 41191, 0, 0, 0, 0, 0, 23429, 0, 0, 0, 0, 10024, 21735, 0, 0, 10126, 0, 0, 0, 0, 19046, 0, 0, 0, 0, 0, 0, 24105, 4710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4394, 0, 0, 0, 0, 13253, 0, 56391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55974, 0, 0, 0, 52070, 0, 15620, 0, 0, 0, 0, 0, 2660, 0, 0, 0, 0, 21644, 0, 0, 52455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8902, 0, 0, 0, 0, 0, 0, 3116, 0, 464, 34726, 0, 0, 0, 0, 0, 0, 25003, 12423, 0, 27172, 1896, 7335, 0, 0, 0, 0, 0, 35686, 0, 0, 0, 0, 3472, 0, 0, 0, 0, 22406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21124, 23594, 33127, 0, 0, 0, 0, 0, 0, 16684, 22087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8714, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55814, 0, 0, 0, 0, 0, 0, 4109, 23460, 0, 0, 8874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29960, 63398, 1302, 0, 0, 0, 0, 0, 0, 0, 0, 24806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9799, 0, 0, 0, 0, 0, 0, 0, 31333, 0, 0, 0, 0, 0, 19557, 0, 0, 0, 0, 0, 5701, 0, 0, 0, 63014, 0, 0, 0, 0, 0, 0, 0, 21254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12484, 0, 0, 0, 48326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15783, 0, 0, 1202, 0, 0, 0, 0, 23174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3086, 49191, 0, 0, 5387, 15141, 0, 0, 0, 3365, 0, 0, 0, 0, 20076, 14021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 376, 40198, 0, 0, 0, 52039, 0, 24932, 0, 0, 0, 0, 808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9860, 0, 0, 0, 0, 0, 23719, 0, 21476, 0, 0, 0, 0, 20776, 4807, 0, 0, 3177, 16678, 0, 0, 110, 10853, 0, 0, 0, 17382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7500, 4966, 0, 0, 0, 0, 0, 0, 0, 52102, 0, 24516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26535, 0, 0, 0, 46247, 0, 0, 0, 15557, 0, 0, 0, 0, 76, 52327, 0, 0, 0, 0, 17866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46758, 0, 0, 0, 0, 0, 19173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2985, 0, 0, 0, 0, 0, 0, 14310, 0, 0, 2125, 45831, 0, 0, 0, 0, 0, 0, 9838, 0, 13227, 19492, 0, 0, 0, 29764, 0, 0, 0, 0, 686, 30053, 0, 0, 0, 0, 0, 30789, 139, 20837, 0, 0, 0, 0, 502, 18533, 0, 0, 0, 0, 0, 19111, 0, 0, 0, 0, 0, 31396, 0, 0, 0, 17444, 0, 0, 0, 0, 0, 0, 0, 49862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25610, 550, 0, 0, 561, 0, 29034, 0, 0, 0, 3528, 0, 0, 0, 1715, 14661, 18, 63463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29578, 59014, 0, 39430, 0, 0, 0, 0, 2250, 16612, 0, 31780, 0, 0, 0, 0, 0, 0, 462, 16967, 0, 29029, 0, 0, 0, 0, 0, 23462, 0, 0, 0, 0, 0, 0, 0, 0, 1768, 0, 6025, 16998, 1804, 0, 0, 54182, 0, 0, 0, 0, 0, 0, 0, 0, 14124, 0, 6154, 29702, 0, 0, 0, 0, 0, 7716, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48807, 0, 8292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16389, 5933, 0, 14857, 51303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35623, 9097, 23047, 0, 0, 23112, 0, 0, 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, 151, 9254, 1390, 0, 0, 0, 0, 0, 0, 54215, 0, 0, 0, 0, 6187, 0, 0, 0, 0, 13095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9866, 0, 0, 59622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25286, 0, 0, 23848, 32069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9255, 2187, 15270, 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22212, 1865, 17543, 0, 0, 0, 0, 0, 0, 21996, 0, 0, 0, 0, 55975, 0, 0, 0, 0, 0, 0, 0, 0, 32138, 21156, 0, 0, 0, 0, 0, 0, 14249, 0, 0, 0, 2388, 0, 0, 0, 0, 6823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26694, 0, 0, 6059, 53511, 0, 0, 0, 0, 0, 0, 0, 49542, 6159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1036, 24036, 0, 2501, 0, 0, 0, 0, 0, 0, 17419, 51271, 3377, 15142, 0, 0, 0, 0, 0, 0, 5007, 62374, 0, 56935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24422, 0, 0, 0, 0, 0, 0, 0, 0, 942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28263, 0, 0, 0, 0, 0, 0, 0, 15622, 0, 19749, 0, 0, 1611, 0, 22219, 48583, 25129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 721, 0, 0, 0, 0, 32518, 0, 0, 0, 18469, 0, 0, 0, 0, 0, 0, 5896, 29927, 3657, 23046, 0, 0, 3214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 3048, 455, 0, 31012, 0, 0, 0, 0, 0, 0, 0, 23270, 0, 32677, 0, 0, 0, 0, 0, 38086, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4900, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25541, 0, 18788, 0, 0, 22248, 1351, 0, 61734, 4524, 30629, 0, 14887, 242, 29063, 0, 0, 14408, 4741, 0, 0, 0, 37318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8106, 0, 32107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1481, 0, 0, 28132, 0, 25798, 0, 59783, 0, 0, 0, 0, 0, 59078, 0, 0, 0, 23366, 0, 0, 0, 0, 0, 0, 0, 30887, 0, 0, 0, 0, 16200, 0, 0, 0, 335, 0, 0, 0, 714, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30730, 9478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18790, 0, 0, 0, 0, 663, 0, 0, 0, 1034, 31431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30120, 0, 0, 0, 0, 13925, 0, 0, 0, 0, 0, 0, 2280, 13414, 0, 0, 0, 0, 0, 0, 22028, 23687, 3017, 11047, 0, 0, 21738, 18630, 0, 0, 0, 0, 0, 0, 0, 30246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17257, 0, 21896, 63783, 0, 0, 0, 21094, 0, 18662, 0, 25700, 0, 22533, 0, 0, 0, 0, 0, 6341, 5800, 11111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15399, 12970, 6501, 0, 0, 3179, 26438, 0, 0, 0, 0, 0, 0, 0, 15750, 0, 13062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 21284, 11177, 4391, 0, 0, 0, 0, 19595, 40647, 0, 0, 0, 0, 0, 11877, 0, 0, 0, 26439, 0, 0, 0, 0, 695, 49126, 27467, 11972, 0, 0, 0, 0, 0, 0, 9961, 0, 0, 0, 31722, 62982, 0, 0, 0, 0, 15817, 52710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24614, 0, 0, 0, 0, 0, 20550, 0, 0, 5034, 3942, 0, 0, 0, 45927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2548, 0, 0, 0, 0, 0, 0, 45606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3405, 12582, 15563, 54087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24202, 5893, 0, 0, 0, 44230, 0, 0, 0, 5605, 0, 47782, 0, 32230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7014, 0, 0, 0, 0, 16488, 3175, 0, 27237, 0, 0, 0, 0, 0, 40902, 0, 0, 0, 0, 0, 0, 0, 32004, 31434, 0, 24392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29130, 58214, 0, 0, 0, 0, 0, 0, 29002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37926, 0, 0, 0, 0, 0, 0, 0, 0, 1290, 0, 0, 0, 4713, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1803, 966, 0, 17700, 0, 0, 654, 19109, 0, 51655, 0, 0, 0, 0, 0, 10470, 1584, 0, 0, 0, 0, 0, 0, 0, 2506, 0, 0, 25159, 4303, 0, 0, 0, 395, 15879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1352, 6535, 0, 19652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4722, 7909, 0, 0, 0, 0, 30152, 0, 0, 64742, 0, 0, 0, 0, 0, 0, 2153, 9125, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1328, 17030, 0, 0, 0, 0, 0, 0, 0, 54151, 0, 0, 0, 0, 1775, 54535, 0, 0, 0, 0, 31624, 0, 0, 0, 7150, 0, 0, 0, 0, 0, 0, 0, 1840, 35943, 0, 0, 0, 0, 0, 56455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64486, 0, 0, 0, 51174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 16134, 19883, 39943, 10281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14125, 2407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26921, 0, 0, 0, 0, 0, 22188, 0, 20810, 10053, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28170, 0, 15208, 0, 0, 32517, 5736, 19271, 3562, 10534, 0, 0, 0, 59655, 0, 0, 0, 0, 27084, 60422, 0, 0, 24969, 0, 0, 0, 2636, 0, 0, 0, 0, 26277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30596, 3594, 0, 0, 0, 8362, 14565, 0, 0, 0, 0, 0, 0, 10793, 12326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5906, 59686, 0, 0, 23081, 517, 0, 15556, 0, 0, 0, 8486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19877, 0, 0, 0, 0, 0, 0, 0, 0, 7497, 0, 0, 26085, 0, 0, 23784, 63591, 6568, 6310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7018, 14470, 18858, 0, 5641, 10660, 0, 0, 0, 0, 0, 0, 0, 35526, 1515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27656, 0, 0, 9606, 0, 39590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 4327, 12649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20199, 0, 0, 0, 0, 0, 0, 26730, 0, 0, 0, 19400, 14695, 0, 31334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19589, 0, 0, 0, 0, 0, 0, 0, 0, 5064, 11908, 0, 27333, 0, 0, 0, 0, 0, 0, 0, 47751, 0, 0, 0, 26662, 0, 0, 0, 0, 0, 0, 0, 55655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6245, 0, 0, 0, 0, 0, 0, 0, 0, 23368, 63911, 0, 0, 0, 0, 0, 0, 0, 0, 1974, 0, 0, 0, 0, 0, 0, 0, 8520, 24037, 0, 0, 0, 0, 0, 0, 0, 26279, 0, 0, 0, 22886, 0, 0, 0, 27782, 0, 30694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33703, 0, 0, 0, 30405, 0, 34598, 0, 51047, 0, 0, 0, 0, 1908, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1511, 21897, 0, 0, 0, 0, 0, 0, 51398, 0, 24870, 0, 32647, 0, 0, 0, 35015, 0, 0, 0, 0, 0, 0, 0, 11204, 0, 0, 0, 0, 0, 0, 7758, 57991, 0, 0, 0, 30949, 0, 0, 22, 15140, 9162, 0, 0, 0, 0, 0, 0, 25540, 20136, 7108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16427, 10789, 9805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4680, 0, 0, 52679, 0, 0, 0, 0, 0, 14884, 0, 0, 0, 16804, 0, 0, 0, 0, 0, 0, 9578, 5287, 0, 0, 0, 0, 0, 0, 0, 34054, 0, 0, 0, 0, 0, 19076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7627, 55719, 0, 39463, 14446, 58374, 0, 0, 0, 0, 23465, 15845, 0, 0, 0, 0, 0, 38534, 0, 0, 0, 17893, 10922, 0, 7176, 678, 0, 0, 0, 0, 0, 0, 0, 0, 3113, 46279, 0, 0, 0, 0, 0, 0, 0, 23334, 0, 0, 18088, 23268, 0, 62342, 0, 0, 0, 16613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38182, 0, 0, 0, 0, 0, 0, 25292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10344, 71, 6446, 0, 0, 1893, 0, 0, 1106, 0, 28680, 30756, 0, 41126, 0, 0, 1492, 0, 15341, 0, 0, 0, 0, 17575, 0, 21220, 0, 0, 0, 0, 0, 25060, 2088, 21828, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 16708, 0, 0, 0, 1668, 0, 0, 0, 0, 0, 12260, 0, 0, 0, 0, 0, 0, 0, 0, 4078, 0, 0, 0, 0, 0, 12713, 6215, 0, 0, 20329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3732, 0, 1646, 0, 0, 27460, 0, 34406, 17128, 14341, 0, 0, 0, 0, 0, 19527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8551, 21546, 10212, 3020, 2951, 0, 17638, 0, 0, 6985, 44999, 2218, 8197, 0, 0, 30472, 63366, 0, 26660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1265, 0, 0, 0, 0, 0, 0, 0, 2610, 0, 0, 0, 11278, 20295, 0, 0, 0, 0, 0, 19780, 0, 0, 0, 0, 0, 0, 2353, 10852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5421, 24292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34407, 0, 0, 0, 0, 0, 0, 15432, 20774, 0, 0, 0, 0, 0, 0, 0, 0, 12360, 10757, 0, 0, 0, 33126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29573, 0, 2343, 0, 0, 0, 0, 0, 63079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43015, 0, 16038, 0, 0, 0, 0, 0, 0, 0, 0, 1480, 25573, 0, 0, 0, 0, 0, 0, 0, 8839, 0, 0, 0, 0, 0, 0, 0, 24645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5063, 0, 0, 0, 0, 0, 45830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 823, 0, 0, 64039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15300, 0, 0, 0, 0, 0, 0, 2924, 46759, 6760, 19268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34182, 0, 0, 3977, 18149, 0, 0, 0, 32199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23524, 25994, 0, 0, 10343, 0, 0, 0, 9733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16741, 0, 0, 4626, 23367, 0, 0, 31400, 0, 0, 3557, 0, 0, 4234, 0, 0, 0, 0, 0, 0, 28486, 0, 0, 0, 0, 0, 14213, 0, 57191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 65318, 29832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29989, 0, 31846, 0, 0, 8170, 0, 0, 4421, 27626, 30884, 0, 0, 20204, 0, 0, 0, 0, 44614, 534, 20868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28710, 0, 10277, 0, 0, 0, 0, 0, 29511, 0, 19813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27020, 0, 0, 0, 0, 0, 0, 53094, 0, 35207, 0, 0, 0, 37542, 0, 61766, 8584, 8037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12488, 22757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19973, 0, 0, 0, 63943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36006, 0, 0, 0, 19012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8580, 0, 0, 0, 0, 0, 0, 0, 18021, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1254, 0, 0, 0, 42630, 0, 0, 0, 0, 0, 0, 0, 16262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2124, 25479, 0, 0, 0, 0, 16873, 0, 0, 0, 0, 3142, 0, 0, 18443, 0, 0, 0, 0, 0, 3917, 0, 8841, 1190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9284, 0, 0, 24394, 41351, 0, 0, 0, 42087, 0, 62566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6728, 4199, 0, 0, 0, 0, 25515, 0, 1231, 0, 374, 15623, 0, 29956, 0, 14118, 0, 0, 0, 0, 0, 19047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20900, 0, 16743, 0, 0, 0, 28902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13838, 0, 0, 10052, 0, 0, 0, 0, 7432, 43783, 17097, 0, 0, 0, 0, 0, 873, 0, 0, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8459, 23559, 0, 53030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35750, 0, 4071, 0, 0, 0, 38662, 0, 41414, 0, 0, 0, 0, 11656, 0, 0, 0, 0, 0, 4011, 42695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25353, 0, 0, 0, 0, 0, 0, 0, 27177, 22372, 0, 0, 0, 0, 0, 30980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46278, 3976, 12711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4072, 11078, 0, 0, 16553, 2405, 0, 0, 0, 0, 0, 0, 0, 0, 2670, 0, 0, 0, 0, 0, 0, 32998, 0, 0, 0, 0, 0, 0, 0, 47046, 0, 30533, 0, 0, 11050, 9734, 13129, 0, 0, 0, 0, 23494, 0, 0, 0, 0, 0, 58310, 0, 0, 0, 57543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 5163, 59687, 2220, 0, 0, 0, 0, 0, 0, 29510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17316, 0, 20069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27174, 0, 0, 0, 0, 0, 0, 0, 22949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19208, 0, 0, 0, 0, 0, 0, 20933, 0, 0, 6026, 8742, 0, 0, 0, 17380, 0, 13127, 2797, 0, 0, 30116, 0, 0, 5963, 8004, 0, 57126, 0, 0, 0, 0, 0, 42854, 14792, 30759, 0, 24964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16933, 0, 0, 0, 0, 0, 0, 15176, 40839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 788, 30341, 0, 0, 0, 0, 21036, 24102, 0, 0, 0, 0, 30123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22597, 31531, 26789, 0, 59559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9352, 29863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24551, 0, 0, 0, 0, 0, 0, 0, 20516, 0, 0, 0, 39462, 3665, 0, 28265, 0, 8778, 64262, 0, 57414, 9132, 0, 0, 18276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26344, 30725, 524, 19751, 0, 13796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18155, 0, 12841, 0, 74, 24998, 13579, 1061, 0, 64199, 0, 0, 8776, 0, 0, 60231, 0, 25412, 0, 0, 0, 59143, 0, 0, 0, 0, 0, 0, 14344, 1510, 0, 0, 0, 38374, 0, 0, 0, 0, 0, 0, 0, 0, 13353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9446, 0, 0, 0, 0, 0, 0, 0, 32613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19844, 0, 0, 0, 0, 14859, 0, 0, 0, 0, 6662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14154, 0, 29770, 0, 0, 0, 0, 0, 16520, 2182, 0, 0, 0, 0, 0, 36102, 3340, 0, 0, 0, 0, 0, 0, 0, 0, 25189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15720, 0, 0, 0, 0, 0, 0, 22758, 0, 0, 304, 0, 3243, 14117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5130, 12679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21733, 10441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36103, 0, 0, 0, 0, 0, 23590, 0, 57479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10824, 18372, 0, 0, 0, 0, 0, 35078, 15722, 12967, 0, 0, 0, 0, 0, 34599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53639, 0, 38630, 0, 0, 0, 0, 0, 0, 31017, 11333, 0, 0, 0, 0, 19144, 0, 9513, 0, 0, 0, 0, 0, 0, 0, 0, 56711, 24042, 0, 1197, 0, 0, 58502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8230, 6121, 18628, 0, 0, 0, 0, 0, 0, 25290, 0, 0, 0, 0, 0, 1514, 0, 0, 0, 0, 0, 0, 0, 14378, 9798, 32363, 0, 0, 0, 0, 0, 9577, 0, 0, 0, 0, 0, 0, 26788, 0, 0, 0, 0, 0, 0, 330, 10533, 0, 0, 0, 0, 0, 42246, 0, 0, 0, 0, 0, 0, 5074, 21028, 0, 38119, 0, 0, 0, 0, 0, 0, 248, 0, 31176, 62054, 0, 53287, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9224, 2117, 0, 0, 0, 0, 15818, 5607, 0, 52582, 0, 0, 0, 0, 0, 0, 0, 0, 18248, 24005, 23018, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 427, 0, 0, 39910, 0, 0, 7080, 11399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22220, 57894, 0, 0, 0, 0, 0, 0, 0, 13156, 0, 1413, 1007, 0, 0, 0, 0, 21415, 0, 21543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41702, 22538, 9573, 0, 0, 0, 8806, 0, 0, 6920, 56359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42215, 0, 0, 13708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16453, 0, 0, 0, 0, 0, 0, 1582, 1764, 3282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11653, 0, 0, 0, 0, 12139, 0, 29482, 31076, 1673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40262, 0, 0, 0, 33862, 0, 0, 0, 0, 0, 20996, 0, 0, 0, 0, 0, 4615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43943, 333, 19367, 0, 0, 0, 0, 0, 0, 0, 26821, 0, 32389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4936, 11687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10885, 0, 0, 0, 0, 0, 25926, 0, 0, 0, 0, 0, 0, 15851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8360, 0, 17130, 7942, 0, 11460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18150, 14248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22310, 0, 0, 0, 42758, 0, 0, 0, 0, 0, 0, 0, 0, 29354, 5574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9156, 0, 0, 1801, 14023, 0, 0, 0, 0, 0, 62406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31018, 65510, 0, 0, 0, 0, 0, 0, 0, 26182, 0, 0, 0, 0, 0, 0, 0, 27717, 0, 0, 0, 0, 0, 0, 0, 46950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31108, 0, 11366, 0, 0, 0, 3717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8552, 6054, 3339, 0, 0, 0, 0, 51622, 0, 0, 0, 0, 0, 0, 0, 3718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28358, 0, 2756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1462, 0, 0, 27622, 0, 0, 0, 0, 0, 0, 0, 62502, 14410, 56743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36550, 0, 38054, 0, 0, 0, 21221, 0, 0, 0, 0, 0, 0, 0, 27077, 0, 0, 16906, 0, 12587, 12101, 0, 0, 0, 0, 0, 0, 10414, 28775, 21769, 60167, 0, 56646, 0, 0, 0, 0, 0, 20740, 0, 0, 0, 0, 0, 0, 5931, 5351, 0, 65478, 0, 0, 0, 0, 0, 0, 7977, 52647, 0, 4868, 0, 0, 0, 55463, 0, 0, 0, 0, 0, 32197, 0, 0, 0, 0, 0, 13445, 0, 0, 0, 26631, 0, 0, 0, 0, 0, 11237, 0, 0, 0, 0, 209, 1285, 0, 0, 1928, 0, 0, 0, 0, 43334, 23849, 23172, 0, 0, 0, 0, 0, 0, 0, 0, 24712, 62439, 8811, 3463, 20457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16008, 56263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60358, 22761, 6565, 0, 0, 30888, 27686, 0, 0, 0, 17093, 0, 0, 0, 0, 22121, 0, 0, 0, 7593, 14182, 0, 28103, 0, 0, 0, 0, 0, 45126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18500, 0, 0, 0, 0, 28202, 0, 0, 0, 0, 0, 0, 0, 0, 26308, 0, 29541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29572, 0, 0, 0, 21285, 0, 0, 0, 0, 0, 60839, 0, 0, 0, 0, 0, 30407, 15949, 2981, 0, 0, 0, 46439, 0, 0, 0, 0, 0, 23911, 26505, 25222, 12811, 5895, 0, 6343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31815, 0, 0, 0, 0, 0, 0, 0, 0, 19688, 10245, 0, 0, 0, 31301, 26985, 28964, 0, 0, 0, 0, 0, 0, 0, 0, 27208, 31172, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16292, 0, 0, 0, 0, 0, 8743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6438, 0, 0, 0, 33319, 0, 0, 0, 33286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22181, 7499, 24774, 0, 10756, 0, 44775, 724, 0, 25768, 25669, 24873, 5349, 25257, 0, 0, 54566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 439, 357, 0, 0, 6536, 8452, 0, 0, 1802, 0, 0, 61350, 0, 15045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22885, 0, 0, 32073, 0, 0, 0, 9546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27748, 0, 0, 23176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24583, 0, 0, 0, 0, 0, 34118, 0, 0, 0, 0, 2158, 0, 5586, 30340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24452, 0, 0, 0, 0, 2409, 4390, 0, 24196, 0, 0, 0, 0, 0, 0, 32264, 26948, 20587, 0, 0, 0, 2155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4328, 26276, 0, 0, 0, 0, 0, 0, 0, 0, 23564, 0, 12458, 11367, 0, 0, 25162, 0, 0, 0, 0, 0, 0, 65414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32966, 0, 0, 0, 34662, 0, 0, 0, 0, 0, 39238, 0, 0, 0, 0, 11400, 10214, 266, 12452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15173, 0, 0, 0, 13668, 0, 13222, 0, 23364, 0, 0, 0, 0, 0, 11941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25575, 0, 0, 0, 57383, 0, 0, 0, 10308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2865, 9287, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21508, 22380, 59526, 0, 0, 0, 23589, 0, 0, 0, 51590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4645, 3980, 28295, 0, 0, 0, 0, 0, 12388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21734, 0, 17607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41767, 0, 0, 0, 0, 0, 0, 0, 18436, 0, 0, 0, 0, 0, 0, 0, 21958, 0, 19430, 0, 0, 1204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3240, 55239, 0, 0, 0, 0, 0, 30660, 0, 0, 0, 28901, 0, 0, 0, 0, 4716, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11754, 0, 0, 0, 0, 22086, 0, 22564, 8749, 0, 0, 28391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2886, 0, 0, 0, 0, 0, 0, 0, 29062, 0, 0, 0, 0, 0, 0, 0, 40358, 0, 0, 15916, 39526, 0, 13735, 0, 0, 0, 0, 28938, 0, 407, 4006, 0, 0, 0, 26916, 0, 0, 0, 0, 0, 27526, 30280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24586, 0, 24649, 5126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8684, 0, 0, 0, 0, 0, 0, 0, 23019, 0, 22377, 18599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27593, 9735, 0, 20196, 0, 0, 0, 0, 28168, 48423, 0, 0, 0, 0, 0, 31399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13892, 0, 0, 0, 0, 0, 17606, 0, 0, 15242, 29767, 26378, 17701, 0, 0, 14472, 0, 4840, 0, 0, 0, 0, 0, 0, 24708, 0, 9349, 4330, 0, 0, 0, 0, 0, 0, 0, 16137, 0, 0, 34854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25063, 0, 0, 0, 0, 0, 0, 6603, 12583, 0, 0, 0, 0, 0, 0, 0, 0, 7433, 29188, 0, 0, 0, 0, 0, 31270, 0, 0, 22920, 3143, 0, 0, 0, 0, 0, 23461, 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, 0, 0, 0, 21381, 0, 11524, 0, 0, 0, 0, 0, 0, 21004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 23239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2313, 0, 0, 40614, 0, 0, 14825, 0, 0, 0, 0, 0, 0, 46535, 0, 41190, 7853, 0, 31656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3433, 5255, 0, 0, 0, 0, 0, 0, 0, 33958, 0, 0, 0, 0, 72, 15493, 0, 0, 0, 0, 0, 0, 0, 36070, 0, 0, 0, 0, 0, 0, 0, 14724, 0, 0, 0, 0, 0, 29828, 0, 0, 0, 0, 0, 0, 0, 18822, 20008, 0, 0, 0, 0, 2438, 2952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24420, 0, 19908, 0, 0, 0, 8101, 0, 17479, 0, 0, 3530, 0, 8202, 29319, 0, 0, 1132, 6789, 0, 0, 23881, 0, 0, 0, 4810, 0, 0, 46918, 0, 0, 0, 41574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39334, 0, 0, 0, 26117, 0, 0, 0, 0, 0, 0, 5100, 0, 0, 0, 0, 0, 23496, 27813, 4045, 54918, 0, 0, 0, 0, 0, 0, 6473, 7428, 0, 0, 0, 0, 6792, 0, 0, 0, 0, 0, 3560, 32103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54790, 0, 0, 6926, 0, 0, 0, 0, 16518, 0, 0, 0, 0, 0, 20806, 0, 0, 0, 0, 1841, 3174, 0, 0, 0, 0, 9612, 18374, 0, 0, 0, 0, 32744, 0, 0, 9671, 0, 59879, 0, 23300, 8073, 0, 0, 14758, 0, 0, 0, 10342, 0, 0, 0, 0, 0, 0, 24808, 14759, 0, 0, 0, 0, 0, 0, 5515, 0, 0, 14852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2354, 23271, 0, 32740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18472, 0, 0, 0, 0, 0, 0, 0, 0, 33190, 0, 0, 0, 0, 0, 0, 0, 0, 8972, 21669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25574, 0, 0, 0, 0, 5096, 0, 14283, 55367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12644, 0, 0, 0, 0, 4651, 0, 0, 0, 0, 0, 0, 0, 661, 0, 0, 13638, 19466, 0, 0, 0, 0, 0, 31273, 0, 8010, 0, 0, 0, 0, 0, 3211, 0, 0, 0, 0, 63430, 0, 0, 0, 0, 0, 15237, 0, 0, 0, 0, 0, 0, 19018, 2437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14312, 0, 0, 0, 0, 16836, 0, 0, 471, 35975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6023, 0, 0, 0, 0, 0, 0, 0, 0, 11593, 9639, 0, 0, 0, 55783, 0, 5700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27908, 0, 26598, 0, 0, 6667, 6470, 0, 0, 0, 0, 0, 0, 0, 62534, 0, 0, 0, 0, 16522, 27911, 0, 0, 10025, 7172, 0, 0, 779, 0, 360, 17477, 0, 0, 0, 61991, 7752, 7717, 1494, 0, 0, 0, 26569, 40742, 0, 0, 0, 0, 0, 0, 0, 26406, 10474, 32196, 0, 0, 0, 0, 0, 50567, 16521, 11716, 0, 0, 0, 0, 0, 55558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61926, 0, 26436, 0, 0, 0, 0, 4459, 10598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9223, 0, 29318, 0, 0, 0, 0, 0, 60423, 0, 0, 0, 0, 0, 0, 0, 47078, 0, 50246, 0, 12612, 0, 0, 0, 0, 0, 0, 0, 61799, 0, 55015, 0, 21060, 7309, 0, 0, 0, 0, 0, 11976, 0, 0, 0, 0, 23527, 0, 0, 0, 0, 0, 0, 10347, 15942, 0, 34023, 0, 0, 0, 0, 4969, 0, 0, 0, 0, 0, 0, 0, 0, 28997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19716, 28872, 0, 0, 0, 0, 0, 22152, 0, 0, 0, 0, 0, 0, 26342, 0, 0, 0, 9764, 0, 0, 0, 0, 0, 0, 0, 21798, 0, 0, 0, 0, 13, 6853, 32136, 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, 54502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46183, 0, 0, 625, 22854, 0, 0, 0, 0, 2061, 23588, 0, 0, 11049, 56262, 0, 0, 18538, 1509, 0, 0, 17258, 4453, 0, 0, 0, 0, 12429, 0, 0, 0, 0, 8102, 0, 0, 0, 0, 0, 0, 8074, 0, 23852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16136, 3428, 0, 27876, 0, 0, 0, 7332, 0, 0, 0, 0, 0, 28900, 0, 0, 2284, 0, 0, 17573, 201, 1508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31365, 27688, 22565, 0, 0, 0, 5159, 0, 0, 0, 0, 4584, 42599, 0, 0, 0, 44422, 1068, 23173, 0, 0, 0, 613, 0, 0, 0, 12645, 0, 0, 0, 0, 0, 27076, 6732, 0, 0, 0, 3913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22244, 29992, 15911, 0, 0, 0, 0, 0, 22982, 0, 0, 0, 0, 0, 0, 0, 50598, 0, 0, 0, 0, 0, 0, 5161, 1574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19108, 0, 0, 0, 35014, 0, 0, 0, 25956, 29067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1356, 61927, 0, 0, 0, 64455, 2122, 64231, 0, 0, 18763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 907, 34471, 0, 0, 0, 39078, 0, 0, 1995, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 822, 0, 15978, 44423, 0, 0, 3112, 325, 0, 0, 0, 0, 0, 15397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1193, 4294, 4968, 15559, 0, 46150, 0, 0, 0, 0, 0, 18917, 0, 0, 0, 0, 0, 0, 9928, 37543, 0, 0, 0, 0, 13097, 36999, 0, 0, 0, 15430, 0, 0, 8424, 29639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40487, 0, 13284, 0, 11141, 0, 0, 0, 32388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5298, 57702, 0, 0, 0, 0, 0, 0, 0, 13060, 0, 0, 0, 0, 0, 0, 8233, 42278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36422, 0, 0, 0, 7972, 0, 0, 0, 18437, 0, 0, 0, 0, 7406, 0, 0, 0, 9225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13865, 47591, 18220, 53703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2796, 0, 0, 0, 0, 0, 24940, 17223, 0, 0, 0, 13221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15848, 0, 0, 0, 0, 0, 6122, 1735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16968, 18151, 0, 0, 0, 0, 0, 47494, 0, 0, 0, 0, 0, 0, 26089, 19494, 0, 0, 0, 0, 0, 15494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28809, 0, 0, 0, 0, 42727, 0, 55174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35302, 0, 48135, 20972, 33094, 0, 0, 0, 0, 0, 9765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39559, 0, 0, 13736, 6950, 0, 0, 0, 0, 23658, 8903, 0, 0, 0, 0, 0, 0, 0, 22662, 0, 0, 0, 0, 0, 58886, 7468, 0, 0, 0, 0, 0, 0, 0, 0, 64550, 0, 0, 0, 0, 0, 47622, 0, 0, 0, 50886, 0, 0, 0, 0, 0, 57606, 912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1449, 0, 1169, 0, 718, 46151, 12104, 0, 0, 0, 0, 0, 0, 48230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1259, 0, 0, 33734, 23208, 62567, 0, 65158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28684, 59878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25769, 0, 0, 0, 0, 65479, 0, 0, 0, 0, 555, 22789, 0, 19748, 1769, 10246, 8680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14250, 0, 5899, 3303, 0, 0, 0, 0, 0, 0, 0, 0, 21097, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10795, 0, 0, 0, 16204, 0, 0, 0, 0, 0, 26986, 2469, 0, 14660, 0, 0, 0, 0, 0, 45447, 12234, 3494, 4555, 10566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2801, 0, 0, 0, 15755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39654, 0, 0, 0, 0, 0, 0, 6763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33574, 0, 10279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63527, 0, 0, 3912, 0, 0, 7492, 0, 0, 0, 35142, 0, 0, 0, 0, 0, 0, 17576, 8103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16713, 4198, 0, 0, 4782, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16228, 0, 0, 0, 0, 25961, 20166, 0, 0, 0, 10980, 0, 0, 0, 0, 0, 14340, 18922, 14567, 0, 44199, 0, 0, 0, 0, 0, 0, 0, 18406, 0, 0, 0, 0, 0, 37606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20902, 0, 0, 0, 56358, 0, 38342, 0, 0, 0, 0, 9514, 36071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21700, 0, 0, 5266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134, 0, 1453, 0, 0, 0, 0, 0, 3882, 0, 0, 0, 0, 0, 0, 0, 0, 4004, 0, 0, 0, 51910, 0, 0, 0, 0, 0, 23076, 4648, 0, 0, 0, 31051, 25351, 0, 0, 0, 22884, 0, 0, 0, 0, 0, 63975, 0, 0, 2376, 16997, 0, 0, 2096, 0, 0, 0, 3373, 7046, 0, 0, 0, 0, 0, 0, 0, 30726, 0, 0, 0, 0, 20, 0, 13707, 614, 0, 0, 12840, 3079, 0, 0, 0, 0, 0, 51046, 3729, 0, 32680, 0, 0, 0, 0, 0, 24008, 62759, 0, 0, 4745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2414, 0, 0, 44262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24937, 0, 0, 0, 0, 0, 0, 0, 0, 19140, 0, 13575, 0, 0, 0, 0, 0, 0, 0, 39110, 0, 0, 0, 28036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4261, 0, 0, 0, 0, 5992, 0, 264, 0, 0, 0, 0, 0, 0, 0, 13739, 0, 21928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4232, 15110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30022, 0, 0, 27977, 0, 0, 0, 0, 0, 24776, 0, 0, 0, 0, 0, 2962, 0, 0, 0, 0, 0, 0, 26564, 22441, 0, 0, 0, 0, 0, 13640, 11205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19305, 1894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14119, 5224, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25796, 0, 0, 0, 0, 0, 0, 7470, 0, 0, 0, 0, 63815, 0, 55654, 0, 0, 12584, 0, 1524, 33223, 0, 0, 0, 9895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11624, 0, 0, 0, 5614, 0, 0, 0, 0, 0, 0, 0, 21320, 0, 0, 53607, 0, 51206, 0, 0, 0, 25863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8964, 1740, 0, 0, 0, 0, 0, 0, 0, 0, 13476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7975, 0, 0, 3306, 8134, 0, 8389, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21477, 31112, 31652, 0, 0, 0, 0, 0, 0, 0, 28452, 0, 0, 0, 44231, 0, 0, 0, 0, 0, 0, 0, 24805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12428, 6471, 0, 0, 0, 0, 525, 17926, 0, 0, 0, 26919, 0, 0, 18120, 0, 0, 0, 30024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29189, 0, 0, 0, 43559, 0, 0, 0, 0, 0, 0, 19787, 7557, 0, 59334, 0, 0, 10184, 6085, 0, 44039, 0, 0, 0, 0, 0, 0, 0, 11175, 0, 0, 0, 0, 30440, 63110, 0, 0, 0, 0, 0, 0, 11017, 0, 0, 0, 0, 0, 0, 0, 0, 27204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 5226, 2727, 0, 15588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4650, 0, 2675, 0, 0, 32420, 0, 0, 0, 61511, 0, 0, 5419, 17829, 2123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38183, 2640, 0, 11274, 14533, 1842, 0, 0, 42663, 12681, 3430, 0, 11845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6533, 0, 0, 0, 0, 0, 54598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12616, 38535, 0, 0, 0, 0, 0, 32229, 0, 0, 0, 54279, 0, 48614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31401, 0, 0, 0, 0, 34310, 0, 0, 0, 22788, 0, 52134, 0, 0, 0, 0, 0, 0, 0, 23302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40678, 0, 0, 0, 51463, 535, 0, 0, 0, 0, 15525, 0, 0, 0, 0, 0, 0, 4904, 869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63718, 0, 0, 0, 0, 0, 0, 0, 0, 1678, 0, 692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26216, 0, 0, 0, 0, 0, 29355, 0, 0, 0, 0, 25095, 0, 0, 0, 0, 4335, 0, 0, 0, 0, 0, 14538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27273, 55014, 0, 0, 0, 0, 0, 27271, 0, 0, 0, 0, 0, 30468, 0, 0, 0, 0, 18186, 0, 0, 0, 0, 0, 14345, 0, 0, 0, 2152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58438, 21034, 0, 23339, 21318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21412, 0, 0, 0, 0, 0, 0, 0, 12869, 0, 0, 4875, 0, 0, 0, 0, 29191, 0, 0, 0, 0, 0, 0, 1640, 10247, 0, 14244, 0, 0, 0, 0, 9867, 0, 0, 0, 0, 0, 12363, 0, 0, 7653, 0, 0, 4168, 2663, 0, 4580, 0, 11143, 0, 0, 0, 0, 0, 0, 0, 30662, 0, 0, 0, 0, 0, 6724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 6821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29958, 0, 3461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28324, 18795, 7013, 12746, 11655, 0, 37287, 0, 0, 10953, 7718, 9705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8137, 17988, 0, 25156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15784, 6918, 0, 0, 0, 0, 7019, 10919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4171, 55495, 4940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22440, 19333, 0, 0, 28136, 0, 6249, 21317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53414, 0, 0, 0, 57318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39303, 0, 0, 0, 0, 0, 19940, 0, 0, 0, 0, 0, 0, 0, 25543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2698, 3911, 0, 0, 0, 26790, 0, 0, 0, 0, 0, 0, 32424, 0, 0, 18470, 0, 0, 0, 14726, 29834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1000, 4197, 0, 0, 0, 19366, 0, 0, 0, 39878, 0, 0, 0, 0, 2185, 8901, 5288, 9829, 25000, 0, 0, 0, 0, 0, 0, 1062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35622, 0, 0, 23048, 62503, 6506, 0, 0, 0, 0, 0, 0, 0, 13609, 10438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7723, 42119, 0, 0, 0, 0, 0, 13317, 0, 0, 0, 41606, 0, 27111, 0, 0, 21194, 11461, 0, 0, 0, 0, 26856, 58342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20940, 48710, 0, 0, 0, 0, 0, 0, 5227, 0, 0, 0, 0, 0, 10061, 31300, 0, 0, 0, 19236, 0, 0, 0, 0, 0, 30277, 13896, 0, 0, 0, 12876, 13159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, 46951, 13134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2249, 0, 0, 0, 0, 44967, 0, 0, 0, 0, 0, 0, 3465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24868, 0, 0, 0, 0, 0, 23909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16164, 0, 10437, 0, 0, 5263, 20102, 20938, 0, 0, 0, 1192, 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21385, 4870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18596, 0, 0, 0, 0, 1422, 4038, 2858, 0, 0, 0, 0, 0, 0, 0, 0, 48998, 0, 0, 0, 0, 0, 0, 0, 0, 6508, 37350, 0, 0, 0, 0, 0, 0, 0, 0, 17001, 39431, 0, 0, 0, 0, 0, 30182, 0, 21445, 7403, 28164, 0, 51750, 0, 0, 0, 62631, 0, 0, 0, 0, 0, 0, 0, 31206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13477, 0, 0, 456, 26693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14890, 0, 0, 0, 0, 0, 26697, 22022, 13225, 27364, 0, 0, 0, 18884, 0, 0, 0, 0, 0, 0, 0, 0, 3659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1448, 5413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6340, 0, 0, 18091, 18725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22118, 0, 0, 0, 18981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29223, 3724, 0, 0, 0, 0, 43526, 0, 0, 0, 25668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21545, 9862, 0, 22692, 32201, 60646, 0, 7300, 0, 0, 0, 58887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50342, 0, 65255, 4360, 17286, 0, 0, 0, 0, 0, 0, 0, 28708, 0, 0, 30025, 60102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47014, 0, 31973, 0, 9572, 0, 0, 0, 0, 0, 0, 0, 18501, 0, 0, 0, 0, 0, 14597, 0, 0, 0, 53735, 5228, 22183, 0, 0, 0, 0, 0, 0, 1554, 24164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10827, 0, 0, 0, 0, 34918, 0, 0, 0, 0, 22252, 0, 0, 46855, 0, 0, 0, 0, 0, 31207, 0, 0, 10733, 0, 0, 63334, 0, 0, 0, 0, 8616, 50119, 20169, 12678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58087, 20298, 5, 0, 0, 30920, 0, 0, 0, 0, 0, 0, 0, 296, 13190, 0, 30663, 0, 0, 18536, 12228, 0, 6788, 0, 0, 0, 0, 30890, 21796, 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20965, 0, 0, 0, 0, 2161, 0, 0, 0, 0, 0, 0, 24038, 0, 0, 0, 0, 13544, 7398, 0, 0, 32522, 9605, 0, 0, 0, 0, 3208, 7590, 0, 0, 0, 43846, 0, 0, 0, 38663, 0, 0, 0, 0, 0, 39014, 4142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6373, 0, 0, 13676, 0, 0, 0, 0, 30374, 21288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22791, 0, 0, 0, 0, 0, 37958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9452, 9990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4841, 0, 0, 0, 0, 18820, 152, 0, 0, 0, 0, 0, 13260, 3334, 0, 0, 24234, 8422, 0, 17957, 0, 0, 0, 10244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7204, 0, 0, 0, 0, 1201, 26151, 0, 31173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64838, 4203, 7525, 521, 0, 18888, 37031, 0, 0, 0, 0, 0, 0, 0, 0, 7082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4490, 12487, 0, 0, 0, 0, 0, 0, 0, 36615, 0, 0, 0, 14854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6539, 13029, 9704, 38983, 0, 0, 0, 0, 168, 10405, 0, 0, 0, 0, 394, 25607, 0, 57063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16141, 19878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29446, 0, 12036, 0, 0, 0, 0, 0, 6982, 18572, 0, 24584, 14535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 21642, 0, 0, 0, 0, 0, 0, 5254, 0, 0, 0, 0, 0, 0, 0, 0, 1622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3853, 9126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7241, 10982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 950, 0, 0, 57990, 0, 0, 277, 0, 0, 0, 694, 36007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42470, 0, 0, 0, 0, 18409, 51142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28646, 0, 0, 0, 30693, 0, 0, 0, 0, 0, 56295, 5544, 0, 0, 0, 0, 8518, 8366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45670, 0, 0, 9608, 33062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18694, 0, 0, 0, 0, 1672, 23493, 0, 0, 6955, 7655, 0, 36134, 0, 0, 0, 0, 0, 0, 0, 0, 23432, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13382, 0, 0, 0, 19621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20228, 0, 0, 2728, 31495, 0, 0, 0, 0, 29096, 22213, 235, 35495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5348, 0, 0, 0, 0, 8968, 1989, 0, 0, 1066, 0, 0, 11492, 5965, 31367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18727, 0, 0, 0, 6757, 0, 0, 10765, 4646, 0, 36166, 0, 27943, 0, 0, 26888, 8420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4975, 0, 0, 0, 14762, 3111, 0, 0, 0, 0, 0, 43399, 0, 0, 0, 0, 0, 0, 0, 18980, 0, 0, 0, 0, 0, 44550, 0, 0, 0, 0, 4051, 0, 0, 0, 0, 37734, 0, 0, 0, 0, 0, 5188, 0, 0, 0, 0, 0, 24486, 0, 5989, 0, 41159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20326, 0, 0, 747, 6884, 0, 0, 0, 41798, 0, 0, 3117, 22919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21032, 0, 0, 0, 0, 0, 0, 0, 0, 9574, 0, 0, 0, 0, 0, 0, 4302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21068, 34630, 0, 0, 0, 0, 0, 64071, 0, 0, 0, 0, 0, 0, 26667, 7943, 0, 0, 0, 0, 0, 52934, 0, 0, 17002, 0, 0, 0, 0, 0, 0, 20294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27301, 18347, 7974, 0, 0, 0, 0, 0, 0, 0, 0, 16874, 0, 0, 0, 0, 45414, 0, 0, 0, 0, 0, 0, 648, 1575, 0, 0, 0, 31749, 0, 0, 0, 23301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15912, 50535, 0, 0, 0, 0, 1993, 8582, 0, 0, 0, 0, 0, 0, 0, 38438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15850, 6183, 0, 0, 0, 0, 3402, 0, 0, 27494, 0, 0, 749, 0, 0, 0, 0, 0, 0, 0, 26025, 29606, 0, 0, 7144, 19622, 30504, 0, 0, 0, 0, 0, 0, 0, 0, 21316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21444, 0, 0, 1289, 6919, 0, 0, 0, 0, 0, 0, 8299, 0, 0, 0, 14090, 35655, 0, 0, 0, 0, 0, 0, 0, 0, 2377, 15206, 0, 0, 6028, 4452, 0, 25508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50310, 0, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51014, 0, 0, 0, 0, 0, 0, 0, 9286, 0, 7429, 0, 0, 28393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16680, 452, 0, 0, 0, 0, 0, 23718, 0, 0, 0, 31750, 0, 0, 0, 0, 0, 0, 0, 0, 3568, 0, 0, 13604, 0, 0, 0, 0, 0, 25255, 0, 0, 0, 50982, 0, 56582, 0, 0, 7467, 0, 0, 0, 0, 30181, 0, 0, 0, 0, 0, 0, 0, 30564, 7208, 7845, 0, 0, 0, 0, 0, 0, 7726, 0, 0, 0, 0, 62182, 0, 0, 0, 41094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22695, 0, 0, 0, 0, 0, 0, 17736, 0, 0, 0, 0, 0, 0, 0, 0, 50054, 0, 0, 0, 14180, 0, 0, 0, 0, 0, 0, 8974, 0, 0, 0, 0, 0, 0, 0, 0, 23332, 0, 0, 0, 11140, 0, 0, 0, 0, 0, 0, 0, 24262, 27145, 9540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26537, 45510, 6062, 3879, 0, 0, 20233, 25991, 0, 0, 17803, 0, 0, 0, 0, 0, 13962, 5508, 16971, 27013, 7437, 31494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4714, 0, 0, 0, 0, 0, 0, 0, 0, 17189, 0, 0, 0, 0, 0, 27492, 0, 0, 26953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47430, 19596, 12549, 0, 0, 0, 8390, 1006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24100, 17577, 4, 0, 0, 0, 0, 0, 22277, 0, 0, 0, 0, 0, 0, 0, 26692, 0, 0, 0, 0, 0, 24676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29477, 0, 0, 0, 21573, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9864, 14214, 0, 0, 0, 0, 0, 0, 25771, 5766, 0, 0, 8909, 8679, 0, 0, 6861, 16166, 0, 38887, 0, 0, 0, 0, 0, 0, 12392, 8678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52646, 1354, 2950, 0, 14692, 0, 0, 10572, 49830, 0, 0, 0, 0, 0, 0, 0, 0, 3626, 582, 0, 0, 0, 55750, 0, 0, 0, 30885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5830, 0, 0, 2090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31142, 0, 0, 0, 0, 0, 10503, 0, 0, 18825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57158, 0, 0, 30792, 63526, 0, 0, 0, 9863, 16267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18824, 0, 0, 0, 0, 0, 0, 19653, 25388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25480, 23015, 0, 0, 10440, 6725, 0, 0, 0, 22436, 24265, 15109, 0, 0, 0, 62311, 8906, 34534, 0, 0, 0, 0, 0, 0, 15913, 1319, 0, 0, 20296, 1477, 30760, 0, 25928, 16772, 0, 0, 1069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17029, 0, 31909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41542, 0, 21478, 0, 0, 0, 9796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22187, 58343, 0, 0, 0, 24295, 0, 0, 0, 0, 0, 61831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2833, 5829, 0, 0, 0, 62855, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16676, 0, 0, 0, 0, 0, 0, 13577, 27431, 0, 0, 0, 0, 21480, 10501, 0, 16932, 0, 0, 0, 0, 0, 22918, 0, 48294, 2574, 2150, 0, 0, 0, 0, 1897, 4518, 0, 0, 0, 0, 0, 0, 25064, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47942, 0, 0, 0, 0, 10990, 13767, 25705, 37863, 21672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43430, 1712, 0, 0, 0, 0, 18886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10535, 0, 0, 0, 0, 0, 0, 0, 15012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14734, 0, 0, 55782, 0, 0, 30824, 10886, 0, 0, 0, 0, 0, 51302, 0, 0, 8012, 0, 0, 0, 0, 0, 20680, 6981, 0, 57415, 11, 0, 0, 18277, 0, 14564, 0, 0, 0, 32390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19113, 5158, 0, 11172, 0, 16774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10315, 13830, 0, 0, 0, 0, 0, 0, 10410, 7141, 0, 0, 0, 0, 0, 18116, 0, 0, 0, 44615, 15403, 13958, 0, 1540, 14632, 19525, 24201, 19781, 0, 0, 0, 24165, 0, 38951, 0, 0, 0, 0, 0, 6308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17416, 15749, 3438, 13255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32228, 0, 0, 0, 0, 176, 0, 0, 50566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5284, 0, 0, 0, 0, 0, 0, 25897, 28326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15945, 0, 0, 0, 9804, 293, 0, 0, 0, 0, 0, 0, 0, 13988, 23082, 4677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5670, 0, 0, 0, 0, 0, 0, 0, 44070, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6405, 0, 30692, 0, 0, 0, 61702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45926, 0, 15398, 0, 0, 0, 0, 0, 0, 4554, 2692, 0, 0, 0, 0, 0, 32485, 0, 0, 0, 10084, 0, 0, 0, 0, 0, 0, 24297, 0, 0, 0, 0, 0, 0, 0, 0, 22790, 0, 0, 0, 55110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7112, 0, 31530, 45255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40743, 17226, 22599, 0, 0, 0, 0, 0, 0, 0, 0, 3695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56999, 0, 0, 0, 0, 0, 13799, 3114, 21287, 1353, 7591, 0, 0, 0, 8455, 0, 0, 6824, 0, 0, 0, 0, 0, 0, 0, 14569, 0, 0, 0, 29000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19979, 0, 18376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11332, 0, 0, 0, 49863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2191, 7527, 23148, 58022, 0, 0, 0, 30631, 0, 26565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 754, 0, 0, 15877, 0, 0, 0, 0, 0, 0, 0, 17510, 7657, 2821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41927, 0, 0, 0, 0, 0, 0, 0, 0, 2569, 34439, 0, 0, 3790, 0, 0, 0, 15339, 8775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15908, 0, 0, 21419, 8359, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 0, 25318, 8008, 20551, 0, 0, 0, 45735, 30058, 30372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31432, 10567, 0, 0, 0, 0, 17450, 0, 0, 0, 0, 0, 0, 30310, 0, 38022, 0, 0, 0, 0, 0, 28932, 0, 0, 0, 0, 0, 43910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22180, 12075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22247, 0, 0, 22826, 12359, 0, 0, 0, 0, 4105, 50407, 0, 0, 0, 0, 0, 0, 13581, 28583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28936, 0, 0, 0, 0, 0, 17673, 10310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 905, 57862, 1580, 0, 0, 0, 0, 58630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13479, 0, 0, 14153, 13286, 0, 0, 9259, 0, 0, 0, 0, 0, 6606, 3524, 0, 0, 0, 0, 0, 6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 49255, 0, 0, 0, 0, 0, 42886, 0, 38215, 0, 0, 0, 0, 0, 0, 0, 0, 17580, 0, 0, 0, 0, 0, 0, 0, 0, 55046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10213, 0, 0, 0, 0, 3604, 37767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28715, 4229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1226, 26820, 0, 0, 0, 12133, 6984, 261, 21130, 32548, 0, 0, 0, 0, 0, 0, 3565, 12390, 20713, 28071, 0, 0, 1706, 25287, 0, 0, 0, 0, 0, 0, 0, 0, 14670, 0, 0, 0, 0, 0, 0, 30534, 0, 0, 0, 12615, 0, 43750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28228, 0, 0, 0, 0, 0, 0, 0, 45095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1224, 3975, 10954, 6375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23180, 20100, 0, 0, 0, 0, 25736, 8519, 0, 0, 0, 0, 0, 6663, 0, 2534, 0, 0, 0, 0, 0, 0, 0, 0, 23720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19398, 0, 47814, 26281, 49702, 0, 0, 4332, 12965, 0, 0, 5704, 3206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15396, 0, 0, 0, 44102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25317, 1064, 39271, 27433, 0, 14952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14308, 0, 0, 0, 0, 0, 0, 2763, 4100, 0, 0, 0, 0, 0, 0, 18792, 0, 0, 0, 22154, 32583, 0, 6244, 0, 0, 0, 0, 0, 0, 0, 49478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21894, 0, 0, 11048, 0, 0, 0, 0, 0, 0, 11685, 0, 53862, 0, 0, 15114, 0, 13870, 0, 0, 0, 0, 0, 0, 0, 919, 0, 0, 0, 31916, 0, 22570, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7333, 0, 0, 0, 0, 3272, 0, 0, 0, 0, 27718, 32712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1782, 0, 3688, 0, 0, 0, 0, 29862, 0, 0, 0, 0, 0, 0, 0, 22469, 0, 0, 0, 0, 0, 0, 0, 55302, 850, 15492, 0, 0, 0, 5927, 19786, 13350, 0, 25702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15335, 8394, 0, 0, 0, 0, 0, 0, 26566, 0, 0, 0, 0, 843, 2245, 0, 0, 0, 0, 0, 0, 0, 0, 6959, 0, 20488, 1638, 0, 0, 11533, 50759, 0, 0, 0, 0, 0, 20871, 0, 0, 0, 0, 0, 24519, 0, 0, 0, 0, 9544, 23591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20969, 7109, 29001, 0, 0, 32422, 31720, 64294, 0, 0, 0, 0, 16106, 0, 0, 0, 6930, 4933, 0, 0, 0, 22917, 0, 27015, 0, 0, 0, 0, 19880, 8070, 0, 0, 0, 0, 23945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3310, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18439, 0, 0, 0, 20742, 0, 0, 0, 10597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20236, 0, 0, 0, 16584, 3429, 0, 0, 0, 0, 0, 0, 0, 0, 27241, 0, 0, 0, 0, 16132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 28261, 0, 0, 0, 0, 0, 0, 0, 29509, 0, 0, 0, 0, 0, 0, 0, 0, 2921, 31781, 0, 0, 0, 0, 0, 0, 6408, 4196, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11689, 45863, 0, 0, 0, 0, 906, 3301, 0, 0, 25544, 32421, 0, 0, 0, 0, 0, 0, 0, 0, 1260, 61607, 0, 27302, 0, 0, 8682, 16614, 0, 0, 0, 0, 10830, 0, 0, 9604, 15049, 13413, 0, 0, 0, 0, 0, 0, 26761, 0, 0, 0, 0, 0, 0, 61990, 0, 0, 0, 0, 0, 12580, 0, 0, 11432, 0, 0, 0, 0, 0, 22507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12389, 0, 0, 0, 0, 0, 0, 2408, 22661, 14507, 43239, 0, 9700, 0, 0, 24714, 0, 0, 0, 0, 0, 0, 0, 0, 23972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34086, 0, 0, 22955, 7238, 0, 0, 0, 0, 0, 28485, 13806, 20038, 0, 0, 0, 0, 22602, 0, 0, 0, 1645, 22340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26502, 0, 0, 554, 0, 0, 0, 0, 61735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 883, 27879, 15948, 0, 3242, 57382, 0, 0, 0, 0, 0, 0, 13930, 0, 0, 0, 0, 0, 30922, 0, 4137, 52615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31911, 16072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26340, 0, 61671, 0, 0, 0, 0, 3145, 56199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, 5131, 33479, 0, 15751, 0, 0, 0, 0, 0, 0, 4136, 1446, 0, 0, 0, 0, 0, 0, 11304, 17863, 0, 0, 0, 0, 0, 25125, 0, 0, 0, 36646, 6057, 0, 0, 0, 855, 11301, 0, 0, 0, 0, 0, 64774, 0, 0, 0, 19397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1040, 27367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64358, 0, 0, 178, 132, 0, 0, 14763, 24455, 0, 0, 0, 46374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46246, 0, 0, 0, 37382, 0, 0, 0, 7462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8166, 0, 0, 6921, 0, 0, 0, 9163, 0, 0, 0, 119, 0, 0, 0, 23146, 17156, 0, 0, 0, 0, 0, 9127, 0, 0, 0, 17927, 0, 0, 0, 0, 0, 22084, 0, 0, 0, 0, 0, 39879, 0, 0, 2035, 0, 1067, 0, 0, 0, 0, 0, 16652, 59591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20171, 0, 0, 0, 0, 17733, 0, 0, 0, 0, 0, 32037, 0, 0, 0, 0, 0, 14277, 0, 0, 0, 0, 0, 0, 0, 42022, 0, 0, 26793, 20358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8907, 0, 0, 0, 0, 0, 0, 0, 0, 27780, 0, 0, 0, 0, 32330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39399, 0, 9732, 0, 16199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 854, 0, 2984, 45063, 25418, 26980, 22539, 0, 9133, 3653, 15528, 28743, 4649, 0, 616, 65127, 0, 0, 0, 61863, 0, 0, 0, 0, 0, 0, 0, 55303, 0, 0, 0, 0, 0, 0, 0, 0, 23880, 0, 0, 0, 0, 0, 0, 0, 31848, 62854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49606, 0, 27974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32580, 0, 0, 0, 26052, 4043, 0, 0, 40454, 0, 0, 26056, 30565, 0, 0, 0, 0, 0, 0, 0, 31398, 0, 0, 0, 0, 0, 0, 0, 0, 29288, 1797, 0, 0, 3220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20427, 0, 0, 0, 0, 23621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35591, 0, 0, 6862, 0, 0, 0, 4265, 0, 6285, 5383, 0, 0, 0, 0, 0, 36870, 0, 39847, 0, 0, 17224, 5414, 27882, 58118, 0, 0, 13224, 4262, 0, 0, 0, 31302, 0, 0, 1388, 2982, 11881, 0, 0, 0, 0, 0, 0, 16837, 809, 0, 24140, 10724, 0, 0, 0, 0, 5835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1256, 19237, 0, 0, 0, 0, 0, 0, 0, 5796, 11848, 0, 0, 52870, 11464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5645, 9158, 0, 25223, 0, 0, 0, 0, 0, 39142, 24968, 8135, 32104, 28678, 0, 0, 0, 46311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23820, 0, 0, 0, 0, 0, 4050, 0, 1323, 25220, 0, 0, 0, 20133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13444, 1198, 60806, 0, 0, 0, 0, 17356, 50247, 30632, 0, 0, 0, 0, 0, 0, 0, 11944, 999, 0, 0, 0, 0, 4010, 10404, 0, 0, 0, 0, 0, 0, 10346, 0, 0, 49510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38919, 0, 0, 0, 0, 0, 0, 6351, 60966, 20137, 487, 0, 0, 0, 0, 0, 0, 655, 2406, 17387, 43303, 0, 0, 0, 17063, 0, 0, 213, 0, 0, 0, 0, 0, 0, 17221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10820, 0, 0, 0, 0, 369, 6, 0, 0, 9098, 21093, 0, 31653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27143, 0, 0, 16234, 0, 0, 0, 0, 0, 0, 0, 0, 6020, 31723, 28293, 0, 0, 0, 0, 1936, 30695, 0, 0, 0, 0, 0, 52902, 0, 0, 29512, 10791, 0, 20420, 0, 0, 16010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24328, 0, 0, 0, 0, 0, 0, 40870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24648, 0, 0, 0, 0, 0, 0, 0, 7786, 2852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44678, 0, 17925, 0, 0, 105, 53062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18762, 0, 0, 40679, 0, 0, 0, 16165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62310, 1322, 14247, 0, 0, 0, 0, 0, 0, 0, 0, 1832, 6052, 0, 0, 11882, 0, 0, 0, 0, 17668, 0, 28262, 0, 29542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28007, 0, 0, 0, 57223, 1585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21162, 0, 0, 62247, 0, 0, 0, 0, 0, 25414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36326, 0, 0, 0, 23845, 0, 0, 0, 0, 0, 0, 0, 2693, 0, 0, 0, 0, 0, 0, 0, 13125, 0, 31236, 0, 0, 0, 0, 0, 22502, 0, 0, 0, 0, 0, 0, 5994, 10309, 0, 0, 0, 7269, 0, 0, 0, 0, 17929, 0, 1011, 44647, 0, 0, 0, 0, 0, 14919, 0, 0, 0, 0, 20586, 5350, 0, 0, 0, 45702, 0, 13189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35782, 17992, 0, 0, 0, 0, 0, 8203, 0, 0, 0, 0, 0, 0, 56678, 0, 0, 0, 0, 0, 38087, 4233, 0, 2127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10148, 0, 0, 0, 2021, 0, 0, 0, 0, 0, 0, 0, 47206, 0, 0, 0, 0, 0, 0, 0, 9220, 0, 0, 0, 0, 19465, 0, 0, 0, 0, 0, 0, 0, 0, 39206, 0, 38055, 0, 0, 0, 0, 0, 0, 0, 46982, 0, 0, 0, 0, 0, 22054, 3850, 0, 0, 0, 0, 0, 0, 0, 55, 0, 10542, 0, 0, 0, 0, 7239, 0, 0, 0, 0, 0, 59367, 0, 0, 14761, 0, 0, 0, 0, 43079, 0, 0, 0, 0, 0, 2726, 0, 0, 9582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37478, 0, 0, 0, 31364, 0, 0, 0, 0, 0, 0, 0, 0, 20393, 8933, 0, 0, 0, 0, 0, 9380, 0, 0, 0, 0, 16905, 549, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1558, 0, 0, 0, 0, 0, 0, 0, 19242, 0, 0, 0, 0, 0, 0, 24933, 0, 6276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42310, 23595, 24068, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13191, 6158, 2567, 0, 0, 268, 47047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27940, 0, 0, 0, 0, 0, 26726, 0, 0, 0, 0, 8200, 1222, 31562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2922, 8231, 8904, 29157, 0, 0, 0, 0, 0, 0, 0, 0, 23976, 4836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31658, 0, 0, 31685, 0, 0, 2889, 6213, 0, 0, 0, 0, 0, 13605, 0, 0, 0, 0, 0, 24772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20684, 26468, 24075, 0, 0, 0, 21193, 0, 715, 679, 0, 0, 0, 0, 0, 0, 3050, 7654, 0, 0, 0, 13798, 0, 0, 0, 0, 15, 27973, 0, 0, 8491, 2086, 0, 0, 0, 43206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60391, 0, 0, 0, 0, 0, 0, 0, 25892, 0, 22276, 0, 34374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20165, 0, 0, 25672, 0, 0, 0, 1811, 24839, 0, 31044, 0, 0, 25513, 0, 0, 0, 0, 0, 12810, 0, 0, 62438, 0, 0, 1325, 0, 364, 3782, 0, 0, 0, 0, 0, 0, 0, 0, 8042, 19687, 0, 0, 0, 33415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11844, 0, 0, 0, 0, 3341, 1543, 6698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41158, 0, 24294, 0, 3844, 12329, 0, 0, 0, 13738, 0, 0, 0, 0, 0, 0, 0, 0, 26245, 0, 0, 0, 0, 0, 0, 6378, 0, 343, 4838, 0, 0, 0, 24358, 11688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1489, 34759, 0, 0, 0, 0, 363, 51974, 1878, 11013, 0, 0, 32265, 59782, 0, 0, 0, 28421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14089, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29257, 61222, 0, 30661, 0, 28327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27108, 8843, 0, 9673, 2084, 0, 0, 0, 16327, 0, 48455, 0, 0, 0, 0, 0, 0, 4876, 9316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9035, 18852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4164, 0, 0, 14827, 1349, 0, 0, 0, 0, 0, 11909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21765, 0, 0, 0, 0, 0, 0, 0, 0, 31272, 63910, 0, 0, 0, 25924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44487, 0, 0, 0, 20612, 0, 0, 27754, 31428, 0, 0, 0, 0, 0, 0, 0, 17287, 0, 3943, 0, 0, 0, 63302, 0, 0, 0, 0, 25256, 19942, 0, 55142, 0, 39046, 0, 0, 0, 0, 0, 0, 0, 15367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9576, 63847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25226, 5734, 0, 0, 0, 0, 0, 0, 13801, 4997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43942, 1270, 2566, 6284, 0, 0, 16230, 0, 0, 0, 20678, 0, 0, 0, 0, 0, 38855, 0, 0, 0, 0, 29643, 0, 0, 0, 41, 3655, 0, 0, 0, 0, 0, 14276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15686, 0, 0, 0, 15718, 0, 50694, 0, 0, 16232, 8007, 0, 0, 0, 5060, 329, 11591, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13065, 7302, 27530, 15366, 0, 24934, 0, 0, 0, 17828, 0, 0, 4552, 6311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47686, 368, 12103, 10122, 33830, 0, 0, 599, 18534, 9579, 49479, 0, 5668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13157, 0, 0, 0, 0, 23274, 14055, 0, 0, 0, 0, 0, 48903, 0, 0, 0, 0, 0, 0, 1871, 0, 15434, 0, 0, 0, 16174, 62470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7749, 0, 0, 0, 0, 0, 0, 0, 30501, 0, 0, 0, 0, 25675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9285, 0, 0, 25323, 1669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3588, 0, 0, 0, 0, 0, 32902, 0, 0, 4426, 0, 0, 0, 0, 57959, 0, 0, 0, 0, 0, 0, 29898, 58278, 0, 0, 0, 0, 11880, 1220, 0, 0, 0, 41479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42566, 0, 0, 0, 0, 0, 0, 0, 40167, 9484, 3493, 0, 0, 0, 0, 0, 21126, 0, 0, 0, 0, 8649, 18918, 0, 0, 0, 0, 0, 0, 0, 34886, 2601, 0, 0, 0, 0, 12518, 0, 0, 0, 0, 7976, 10311, 0, 0, 0, 0, 0, 0, 0, 45190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16842, 20229, 0, 0, 0, 0, 0, 0, 7528, 4614, 0, 0, 0, 0, 0, 30086, 0, 0, 0, 1671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9896, 6277, 0, 0, 0, 0, 0, 61191, 0, 41287, 0, 21956, 0, 0, 20010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13195, 0, 0, 0, 0, 1381, 0, 0, 0, 0, 365, 30951, 24268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27944, 359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28487, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 56775, 12586, 8421, 0, 0, 0, 0, 0, 0, 26185, 14599, 0, 0, 8040, 5702, 12585, 3109, 0, 0, 0, 0, 0, 21574, 5388, 0, 0, 0, 0, 0, 0, 0, 5106, 52454, 0, 0, 0, 0, 0, 0, 0, 0, 1907, 29895, 0, 6116, 0, 0, 0, 0, 11081, 5285, 0, 28069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4104, 0, 0, 0, 0, 0, 0, 41511, 0, 0, 0, 0, 0, 0, 5262, 0, 0, 0, 503, 4231, 7720, 34343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7304, 10374, 1718, 0, 0, 29127, 0, 0, 0, 0, 0, 0, 0, 0, 23497, 22567, 6952, 2340, 0, 0, 0, 0, 0, 0, 0, 0, 20360, 12453, 0, 45094, 0, 0, 0, 0, 0, 28582, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23084, 0, 0, 0, 30696, 0, 0, 0, 0, 45862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5580, 6053, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 712, 70, 0, 0, 26091, 11335, 0, 0, 0, 0, 13612, 0, 13160, 1926, 435, 51559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47302, 19083, 0, 0, 12742, 0, 1607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6155, 37095, 0, 0, 0, 0, 0, 18948, 7146, 0, 0, 0, 0, 0, 0, 0, 7848, 2055, 0, 0, 0, 0, 8910, 0, 19336, 0, 0, 48070, 8490, 0, 0, 0, 0, 0, 0, 0, 9932, 56423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43398, 0, 0, 0, 0, 0, 0, 0, 0, 16173, 0, 0, 0, 0, 0, 0, 0, 32011, 0, 0, 30918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18889, 0, 0, 0, 0, 8965, 0, 0, 0, 44358, 0, 0, 0, 8997, 0, 34055, 0, 0, 0, 0, 0, 29350, 0, 0, 501, 17767, 0, 0, 32457, 60262, 0, 0, 0, 30886, 0, 0, 3757, 1063, 0, 0, 0, 25637, 0, 0, 0, 0, 0, 28068, 0, 26374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11684, 0, 0, 0, 0, 0, 0, 24779, 229, 0, 13766, 0, 0, 7402, 11525, 0, 0, 0, 0, 0, 0, 0, 0, 26313, 23686, 0, 0, 29736, 47527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27268, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 32038, 0, 0, 0, 0, 1135, 26596, 0, 0, 12300, 14631, 0, 0, 0, 43238, 0, 871, 0, 0, 31496, 0, 8457, 17669, 0, 12836, 0, 0, 0, 22726, 0, 38758, 0, 0, 375, 6564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 18535, 0, 22948, 0, 0, 32360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15652, 0, 0, 0, 32774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15145, 0, 0, 0, 21100, 27654, 0, 0, 0, 0, 0, 0, 4874, 26215, 0, 1639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4169, 0, 0, 0, 0, 0, 7336, 0, 0, 0, 0, 21572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24644, 1675, 2533, 0, 0, 0, 53318, 0, 13094, 0, 0, 0, 0, 0, 0, 0, 6246, 0, 22020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28453, 5576, 5124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27910, 0, 29382, 18216, 8583, 0, 0, 0, 39174, 0, 43558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11973, 0, 0, 0, 0, 0, 23397, 0, 0, 0, 0, 6091, 0, 0, 0, 0, 0, 0, 0, 6474, 16197, 14217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26728, 0, 567, 48839, 0, 0, 0, 0, 0, 15271, 0, 0, 31818, 43974, 2450, 0, 0, 0, 0, 0, 0, 0, 11368, 9191, 0, 44454, 0, 0, 0, 0, 0, 0, 14568, 12293, 0, 0, 0, 8453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 902, 0, 0, 0, 27236, 5612, 11495, 0, 0, 0, 0, 0, 0, 0, 0, 9194, 23684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26217, 44870, 0, 0, 0, 0, 0, 0, 5581, 7173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20968, 18340, 0, 0, 0, 0, 0, 0, 0, 0, 4107, 11239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48806, 0, 0, 0, 32292, 0, 0, 0, 0, 0, 0, 0, 10884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27562, 0, 5643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3089, 31525, 0, 19684, 0, 0, 0, 0, 0, 0, 0, 61415, 0, 0, 0, 0, 0, 36198, 0, 0, 0, 0, 0, 0, 0, 7908, 0, 0, 0, 0, 872, 743, 0, 0, 0, 0, 0, 0, 0, 0, 1229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32484, 0, 0, 0, 0, 0, 34822, 0, 0, 0, 0, 0, 50726, 0, 0, 0, 0, 7274, 0, 0, 0, 15304, 11526, 0, 0, 0, 3047, 0, 0, 0, 0, 0, 0, 22376, 0, 0, 0, 846, 0, 0, 0, 0, 35815, 0, 0, 0, 23652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23721, 2148, 0, 0, 0, 0, 0, 0, 14856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1358, 0, 3082, 0, 0, 0, 848, 10949, 0, 0, 0, 0, 0, 0, 6504, 0, 0, 14372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8201, 9958, 0, 0, 0, 0, 0, 0, 24266, 0, 0, 0, 0, 0, 0, 0, 0, 26469, 0, 0, 0, 0, 18604, 2053, 0, 33511, 0, 0, 0, 0, 0, 9222, 0, 0, 0, 0, 0, 44006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41895, 0, 0, 0, 0, 0, 0, 0, 0, 12044, 390, 0, 0, 0, 0, 0, 4935, 0, 48646, 0, 56102, 3052, 16070, 0, 0, 0, 0, 0, 0, 0, 8612, 9320, 38311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 42918, 0, 32550, 0, 0, 0, 0, 0, 0, 0, 0, 27434, 57926, 17064, 0, 0, 46502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26760, 6756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 5000, 0, 0, 0, 0, 32293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26246, 0, 0, 0, 0, 0, 0, 0, 0, 23, 7301, 0, 0, 0, 36199, 0, 40838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27178, 57350, 0, 0, 12457, 9317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16810, 0, 0, 0, 14510, 0, 0, 0, 0, 21319, 0, 0, 0, 13508, 17, 11365, 0, 0, 0, 0, 5291, 0, 8329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27685, 0, 0, 0, 0, 0, 0, 0, 52006, 0, 0, 0, 7493, 0, 44263, 0, 0, 0, 0, 0, 0, 0, 0, 9800, 0, 0, 0, 25676, 61478, 0, 0, 0, 0, 0, 0, 5773, 0, 0, 0, 0, 41991, 26057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22629, 0, 0, 0, 47783, 362, 1959, 23468, 0, 0, 0, 10921, 0, 0, 0, 3150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32456, 0, 0, 0, 0, 0, 0, 0, 4559, 3270, 0, 0, 983, 0, 0, 26343, 0, 33446, 0, 0, 0, 61767, 0, 48390, 0, 0, 0, 0, 0, 0, 0, 2790, 0, 39782, 7849, 0, 0, 0, 0, 0, 0, 0, 1544, 2183, 0, 0, 0, 0, 0, 0, 0, 0, 4040, 2471, 20009, 30020, 0, 0, 11242, 0, 0, 0, 5578, 53382, 0, 22631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 9030, 0, 0, 0, 0, 0, 0, 265, 1412, 0, 0, 11626, 3687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17449, 24359, 0, 0, 26729, 40134, 0, 0, 0, 0, 29768, 61958, 0, 0, 0, 0, 0, 0, 0, 0, 20908, 0, 0, 0, 0, 0, 11016, 0, 0, 47462, 21547, 5926, 0, 0, 14728, 2983, 24104, 15301, 0, 0, 0, 0, 0, 32645, 0, 0, 0, 0, 0, 0, 0, 3300, 0, 0, 0, 15972, 0, 0, 0, 0, 0, 0, 6634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3076, 0, 30983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 12775, 0, 0, 0, 0, 7177, 18022, 0, 0, 0, 0, 0, 22534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27560, 0, 0, 0, 0, 30278, 10668, 23877, 0, 0, 0, 0, 0, 0, 0, 29124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48454, 0, 0, 0, 0, 6442, 0, 16330, 22951, 0, 0, 16904, 0, 0, 0, 0, 644, 0, 0, 0, 40038, 0, 0, 0, 37222, 0, 0, 0, 9830, 0, 0, 0, 0, 0, 34919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13733, 0, 0, 0, 28196, 0, 0, 0, 0, 0, 19876, 0, 0, 0, 0, 0, 0, 0, 23558, 0, 11142, 0, 27781, 0, 0, 0, 0, 13864, 0, 0, 0, 24682, 47847, 0, 0, 0, 0, 6890, 0, 0, 0, 0, 0, 3981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1772, 0, 0, 0, 0, 0, 0, 0, 3603, 1991, 0, 27396, 8652, 0, 18312, 0, 0, 0, 0, 30054, 0, 0, 0, 0, 0, 0, 0, 11270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20708, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 7050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14862, 0, 0, 3492, 0, 0, 0, 55878, 0, 0, 0, 16486, 0, 0, 0, 18119, 0, 0, 0, 0, 0, 0, 2154, 1284, 0, 0, 23113, 31751, 0, 0, 29547, 0, 0, 0, 0, 0, 0, 36647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7913, 0, 0, 0, 0, 20644, 0, 0, 10508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43622, 0, 0, 0, 0, 0, 40966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 901, 11529, 5191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24454, 0, 0, 26665, 27590, 0, 27397, 0, 0, 0, 0, 0, 0, 23562, 2949, 0, 0, 30344, 62214, 0, 47334, 2026, 18885, 0, 0, 0, 48678, 0, 0, 0, 22694, 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15465, 0, 0, 0, 0, 38822, 0, 0, 0, 0, 945, 32708, 0, 54791, 0, 14918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23396, 0, 0, 0, 0, 0, 0, 5486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30856, 64166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35206, 0, 0, 0, 30535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62663, 0, 0, 1096, 17574, 31820, 0, 0, 14375, 4402, 27207, 0, 0, 21448, 4676, 0, 0, 0, 0, 16585, 5094, 0, 0, 0, 0, 0, 0, 0, 0, 4845, 0, 0, 32870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31466, 0, 0, 0, 0, 31783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4522, 16039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7464, 4773, 0, 0, 0, 0, 0, 0, 0, 0, 18636, 0, 0, 0, 25640, 0, 0, 0, 0, 0, 0, 2244, 0, 0, 11818, 0, 1168, 0, 0, 0, 0, 0, 0, 0, 6540, 23079, 13770, 7719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58150, 528, 34502, 32682, 0, 0, 12997, 0, 0, 0, 0, 0, 2214, 0, 0, 0, 0, 0, 58567, 0, 0, 0, 26375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32005, 22952, 59047, 0, 13543, 0, 0, 0, 0, 0, 0, 0, 0, 16328, 0, 0, 33542, 0, 0, 0, 19782, 0, 0, 0, 16644, 0, 0, 0, 0, 31688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10276, 0, 0, 0, 0, 0, 0, 0, 36327, 0, 0, 29480, 0, 0, 0, 777, 12709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27398, 0, 0, 0, 4455, 9037, 31397, 0, 9221, 0, 0, 0, 60487, 20840, 1796, 0, 0, 0, 0, 0, 0, 0, 0, 8364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19752, 44902, 0, 38566, 0, 0, 18027, 0, 0, 0, 0, 0, 0, 0, 0, 10662, 0, 0, 0, 0, 0, 11812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19910, 0, 0, 0, 45030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19978, 5127, 0, 11620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19817, 0, 5579, 9350, 0, 0, 21002, 19718, 0, 0, 0, 21926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20711, 0, 0, 0, 20197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40550, 0, 0, 0, 57510, 0, 0, 0, 53895, 0, 0, 15017, 0, 17000, 39367, 2347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8588, 0, 0, 0, 0, 0, 3273, 17862, 3498, 2085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19048, 0, 0, 0, 0, 0, 11978, 58631, 0, 0, 0, 0, 0, 0, 523, 0, 12969, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28197, 0, 47846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 687, 14917, 748, 8229, 0, 0, 0, 0, 0, 0, 2476, 12935, 0, 0, 0, 0, 0, 0, 22792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27528, 59142, 0, 0, 20876, 20134, 0, 0, 0, 0, 440, 12068, 0, 58951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48038, 0, 0, 0, 60999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15716, 7498, 5476, 0, 0, 0, 0, 20202, 37959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29801, 0, 5451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13573, 0, 0, 22856, 0, 0, 0, 0, 21927, 0, 0, 0, 0, 0, 0, 9130, 0, 0, 0, 0, 0, 0, 13732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2282, 583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3726, 26503, 0, 0, 0, 0, 0, 0, 9258, 0, 0, 0, 0, 0, 0, 0, 0, 21604, 0, 0, 0, 45574, 0, 0, 0, 0, 0, 20710, 0, 0, 0, 42694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1163, 6694, 0, 0, 0, 0, 0, 0, 0, 10948, 0, 0, 0, 29700, 0, 0, 0, 0, 0, 58823, 3796, 27399, 20939, 10180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 29287, 28649, 14534, 0, 0, 16428, 45607, 0, 0, 0, 0, 0, 0, 25322, 0, 4908, 0, 0, 0, 0, 0, 0, 25476, 29097, 14246, 11053, 0, 0, 0, 0, 0, 0, 0, 0, 18502, 0, 0, 0, 44390, 0, 0, 0, 17765, 0, 0, 0, 0, 0, 0, 24520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28166, 0, 0, 0, 0, 0, 48198, 0, 0, 31467, 0, 24585, 0, 0, 0, 0, 18692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7236, 968, 13637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14791, 0, 0, 0, 12324, 0, 12741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11108, 0, 0, 0, 0, 4009, 40295, 20616, 4357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15015, 0, 0, 0, 0, 0, 43751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23974, 0, 0, 0, 0, 17480, 20647, 0, 0, 0, 0, 0, 0, 8876, 0, 0, 40806, 0, 0, 0, 0, 0, 0, 0, 14502, 17160, 17764, 0, 0, 31594, 35431, 0, 0, 2890, 0, 0, 0, 0, 0, 0, 0, 0, 27524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8228, 0, 56583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2662, 0, 26724, 0, 0, 0, 0, 0, 0, 0, 64198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3049, 54983, 0, 0, 0, 0, 0, 0, 0, 837, 0, 17604, 0, 0, 0, 0, 0, 28838, 0, 0, 0, 0, 0, 0, 26312, 0, 0, 3910, 0, 0, 0, 25830, 0, 0, 0, 0, 0, 8391, 0, 19845, 19240, 1092, 0, 0, 5449, 0, 0, 0, 0, 17188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10629, 0, 0, 6671, 61094, 5832, 8358, 0, 0, 0, 55078, 0, 0, 0, 0, 0, 29860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51494, 0, 28647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25989, 0, 0, 30153, 61318, 0, 0, 0, 0, 0, 0, 0, 24903, 0, 0, 0, 4388, 0, 42054, 0, 0, 0, 0, 0, 0, 0, 53158, 0, 0, 0, 0, 0, 0, 0, 50918, 0, 0, 0, 0, 0, 0, 26251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5929, 2853, 0, 37126, 7372, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2027, 934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55686, 0, 0, 5672, 5447, 0, 62758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2923, 0, 556, 1415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8645, 0, 9477, 0, 0, 0, 0, 0, 0, 0, 48742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24235, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16970, 18823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25158, 0, 0, 0, 0, 0, 18567, 20072, 2823, 14313, 1830, 0, 0, 0, 0, 0, 0, 0, 0, 27048, 23526, 0, 0, 0, 0, 0, 997, 492, 0, 14730, 16677, 396, 13574, 0, 0, 0, 41671, 0, 0, 0, 0, 0, 0, 0, 19045, 0, 0, 0, 421, 17545, 3110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47111, 14475, 56551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3697, 0, 0, 0, 0, 0, 0, 49382, 0, 35559, 0, 0, 0, 0, 40, 0, 11496, 15621, 0, 8550, 0, 0, 0, 63462, 0, 0, 0, 0, 0, 0, 0, 36966, 0, 50406, 0, 46022, 1001, 0, 0, 12069, 3249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15241, 0, 0, 0, 0, 0, 0, 0, 0, 64743, 0, 0, 0, 0, 0, 58759, 0, 0, 0, 0, 1136, 26981, 0, 0, 0, 0, 0, 0, 0, 17732, 0, 0, 0, 17157, 20011, 6629, 0, 43879, 0, 0, 0, 13572, 25128, 10759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 875, 24007, 0, 0, 0, 0, 7628, 0, 0, 0, 0, 0, 12268, 0, 0, 0, 0, 0, 0, 0, 0, 19300, 23210, 356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15236, 0, 0, 0, 0, 0, 49670, 0, 0, 0, 0, 0, 0, 0, 21764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45799, 0, 0, 436, 3589, 0, 0, 11402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62822, 0, 0, 0, 39814, 588, 0, 0, 0, 0, 0, 0, 27750, 0, 0, 0, 0, 0, 0, 1609, 22660, 2346, 18951, 0, 16068, 0, 0, 0, 0, 0, 0, 5162, 11110, 0, 0, 0, 0, 15048, 1060, 0, 7879, 18280, 326, 0, 14886, 19656, 0, 7594, 0, 0, 0, 0, 0, 781, 581, 0, 16198, 0, 0, 0, 0, 0, 0, 1078, 9892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4489, 0, 0, 0, 0, 33798, 0, 0, 0, 54534, 0, 0, 0, 0, 0, 0, 0, 33158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42086, 13834, 2757, 8456, 16773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3434, 0, 0, 0, 0, 0, 3946, 29668, 0, 0, 30634, 36775, 0, 0, 0, 0, 0, 24901, 0, 16069, 6280, 0, 0, 0, 0, 41990, 0, 0, 0, 0, 0, 0, 0, 27365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1450, 44807, 0, 0, 0, 32100, 0, 0, 0, 0, 0, 35110, 0, 0, 0, 0, 0, 0, 0, 0, 17448, 19591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1739, 0, 0, 0, 0, 5511, 0, 0, 0, 32934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18180, 0, 0, 0, 23428, 19754, 0, 0, 31174, 3021, 31655, 23464, 0, 0, 0, 0, 0, 0, 57255, 0, 0, 21292, 64487, 0, 0, 0, 0, 0, 0, 25802, 9189, 0, 0, 0, 0, 0, 49254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5837, 50023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15495, 0, 0, 0, 0, 0, 51942, 0, 0, 0, 0, 0, 0, 0, 0, 28104, 58662, 0, 50214, 0, 0, 0, 0, 0, 0, 0, 0, 2988, 0, 22888, 31812, 0, 0, 0, 0, 0, 2020, 0, 18916, 0, 0, 0, 0, 0, 0, 0, 23973, 0, 0, 0, 0, 17516, 11717, 0, 0, 0, 55911, 0, 0, 0, 0, 0, 0, 0, 2855, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46822, 0, 24710, 28586, 0, 0, 0, 1556, 0, 0, 30117, 0, 0, 22090, 57127, 3403, 14087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1041, 0, 10633, 6916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27269, 0, 0, 13322, 18055, 0, 29380, 0, 56454, 0, 0, 120, 0, 0, 8773, 0, 0, 0, 0, 16040, 0, 0, 0, 0, 0, 0, 0, 27242, 23781, 0, 1572, 0, 28134, 0, 0, 1512, 0, 0, 0, 0, 0, 0, 27684, 0, 38470, 0, 0, 0, 0, 0, 0, 1513, 8709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46566, 0, 0, 0, 0, 28521, 61159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13028, 0, 5863, 0, 0, 15693, 0, 0, 0, 0, 0, 0, 0, 1131, 23398, 0, 0, 0, 0, 0, 0, 0, 26212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18404, 0, 0, 0, 0, 1457, 26183, 0, 0, 2475, 7110, 0, 0, 0, 0, 27180, 60166, 0, 0, 0, 20262, 0, 41862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28229, 0, 0, 0, 29254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27690, 0, 0, 13636, 12776, 1862, 0, 0, 0, 0, 0, 0, 17225, 3271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4457, 18117, 0, 2023, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 3654, 0, 0, 0, 0, 0, 0, 0, 0, 18440, 0, 0, 0, 0, 0, 0, 0, 0, 29861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24074, 0, 0, 0, 0, 0, 0, 0, 0, 12004, 0, 32358, 0, 0, 3081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10792, 1799, 21322, 0, 7880, 12613, 0, 0, 0, 0, 0, 0, 0, 0, 13993, 0, 0, 0, 16202, 0, 0, 0, 0, 32102, 0, 37223, 0, 10500, 0, 0, 0, 0, 0, 0, 0, 0, 32008, 0, 0, 0, 0, 0, 23816, 3236, 0, 0, 0, 0, 0, 23237, 0, 0, 5642, 0, 4684, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26852, 0, 0, 0, 0, 0, 0, 7148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7890, 61798, 939, 0, 0, 56679, 0, 0, 0, 0, 0, 27078, 202, 5029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28005, 0, 0, 15273, 24741, 5676, 20452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55910, 0, 0, 0, 0, 5069, 27942, 0, 21092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21384, 28260, 0, 2502, 20108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46726, 0, 30790, 0, 0, 0, 0, 0, 14725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1099, 6372, 0, 0, 0, 12422, 15182, 0, 8683, 0, 10665, 19462, 0, 0, 0, 0, 0, 0, 1590, 0, 31628, 0, 22632, 19750, 0, 0, 0, 0, 0, 0, 0, 24198, 0, 0, 0, 0, 0, 50662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11015, 0, 0, 0, 0, 0, 0, 0, 0, 16490, 54695, 0, 0, 0, 0, 0, 0, 0, 0, 12937, 0, 0, 0, 0, 16004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2181, 6923, 0, 0, 0, 0, 0, 0, 0, 15624, 11302, 0, 0, 5673, 7559, 0, 0, 14668, 15684, 0, 0, 0, 0, 0, 0, 24204, 48134, 0, 24230, 0, 55527, 0, 0, 3464, 19141, 0, 0, 0, 0]; brotli-3.4.0/src/enc/encode.rs000075500000000000000000003604661046102023000143040ustar 00000000000000#![allow(dead_code)] use super::hash_to_binary_tree::InitializeH10; use super::constants::{BROTLI_WINDOW_GAP, BROTLI_CONTEXT_LUT, BROTLI_CONTEXT, BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS, BROTLI_MAX_NPOSTFIX, BROTLI_MAX_NDIRECT}; use super::backward_references::{BrotliCreateBackwardReferences, Struct1, UnionHasher, BrotliEncoderParams, BrotliEncoderMode, BrotliHasherParams, H2Sub, H3Sub, H4Sub, H5Sub, H6Sub, H54Sub, HQ5Sub, HQ7Sub, AdvHasher, BasicHasher, H9, H9_BUCKET_BITS, H9_BLOCK_SIZE, H9_BLOCK_BITS, H9_NUM_LAST_DISTANCES_TO_CHECK, AnyHasher, HowPrepared, StoreLookaheadThenStore, AdvHashSpecialization}; use alloc::Allocator; pub use super::parameters::BrotliEncoderParameter; use super::combined_alloc::BrotliAlloc; use super::interface; use super::bit_cost::{BitsEntropy, ShannonEntropy}; #[allow(unused_imports)] use super::block_split::BlockSplit; #[allow(unused_imports)] use super::brotli_bit_stream::{BrotliBuildAndStoreHuffmanTreeFast, BrotliStoreHuffmanTree, BrotliStoreMetaBlock, BrotliStoreMetaBlockFast, BrotliStoreMetaBlockTrivial, BrotliStoreUncompressedMetaBlock, BrotliWriteEmptyLastMetaBlock, BrotliWriteMetadataMetaBlock, MetaBlockSplit, RecoderState, JumpToByteBoundary}; use enc::input_pair::InputReferenceMut; use super::command::{Command, GetLengthCode, BrotliDistanceParams}; use super::compress_fragment::BrotliCompressFragmentFast; use super::compress_fragment_two_pass::{BrotliCompressFragmentTwoPass, BrotliWriteBits}; #[allow(unused_imports)] use super::entropy_encode::{BrotliConvertBitDepthsToSymbols, BrotliCreateHuffmanTree, HuffmanTree}; use super::metablock::{BrotliBuildMetaBlock, BrotliBuildMetaBlockGreedy, BrotliOptimizeHistograms, BrotliInitDistanceParams}; use super::static_dict::{BrotliGetDictionary, kNumDistanceCacheEntries}; use super::histogram::{ContextType, HistogramLiteral, HistogramCommand, HistogramDistance, CostAccessors}; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut}; use super::utf8_util::BrotliIsMostlyUTF8; use super::util::{brotli_min_size_t, Log2FloorNonZero}; use core; //fn BrotliCreateHqZopfliBackwardReferences(m: &mut [MemoryManager], // dictionary: &[BrotliDictionary], // num_bytes: usize, // position: usize, // ringbuffer: &[u8], // ringbuffer_mask: usize, // params: &[BrotliEncoderParams], // hasher: &mut [u8], // dist_cache: &mut [i32], // last_insert_len: &mut [usize], // commands: &mut [Command], // num_commands: &mut [usize], // num_literals: &mut [usize]); //fn BrotliCreateZopfliBackwardReferences(m: &mut [MemoryManager], // dictionary: &[BrotliDictionary], // num_bytes: usize, // position: usize, // ringbuffer: &[u8], // ringbuffer_mask: usize, // params: &[BrotliEncoderParams], // hasher: &mut [u8], // dist_cache: &mut [i32], // last_insert_len: &mut [usize], // commands: &mut [Command], // num_commands: &mut [usize], // num_literals: &mut [usize]); //fn BrotliInitBlockSplit(xself: &mut BlockSplit); //fn BrotliInitMemoryManager(m: &mut [MemoryManager], // alloc_func: fn(&mut [::std::os::raw::c_void], usize) // -> *mut ::std::os::raw::c_void, // free_func: fn(*mut ::std::os::raw::c_void, // *mut ::std::os::raw::c_void), // opaque: *mut ::std::os::raw::c_void); //fn BrotliInitZopfliNodes(array: &mut [ZopfliNode], length: usize); //fn BrotliWipeOutMemoryManager(m: &mut [MemoryManager]); static kCompressFragmentTwoPassBlockSize: usize = (1i32 << 17i32) as (usize); static kMinUTF8Ratio: super::util::floatX = 0.75 as super::util::floatX; pub struct RingBuffer> { pub size_: u32, pub mask_: u32, pub tail_size_: u32, pub total_size_: u32, pub cur_size_: u32, pub pos_: u32, pub data_mo: AllocU8::AllocatedMemory, pub buffer_index: usize, } #[derive(PartialEq, Eq, Copy, Clone)] #[repr(i32)] pub enum BrotliEncoderStreamState { BROTLI_STREAM_PROCESSING = 0, BROTLI_STREAM_FLUSH_REQUESTED = 1, BROTLI_STREAM_FINISHED = 2, BROTLI_STREAM_METADATA_HEAD = 3, BROTLI_STREAM_METADATA_BODY = 4, } #[derive(Clone,Copy,Debug)] enum NextOut { DynamicStorage(u32), TinyBuf(u32), None, } fn GetNextOutInternal<'a>( next_out :&NextOut, storage : &'a mut [u8], tiny_buf : &'a mut [u8;16], ) -> &'a mut[u8]{ match next_out { &NextOut::DynamicStorage(offset) => return &mut storage[offset as usize..], &NextOut::TinyBuf(offset) => return &mut tiny_buf[offset as usize..], &NextOut::None => &mut [], } } macro_rules! GetNextOut { ($s : expr) => { GetNextOutInternal(&$s.next_out_, $s.storage_.slice_mut(), &mut $s.tiny_buf_) }; } fn NextOutIncrement(next_out :&NextOut, inc : i32) -> NextOut{ match next_out { &NextOut::DynamicStorage(offset) => return NextOut::DynamicStorage((offset as i32 + inc) as u32), &NextOut::TinyBuf(offset) => return NextOut::TinyBuf((offset as i32 + inc) as u32), &NextOut::None => NextOut::None, } } fn IsNextOutNull(next_out :&NextOut) -> bool { match next_out { &NextOut::DynamicStorage(_) => false, &NextOut::TinyBuf(_) => false, &NextOut::None => true, } } #[derive(Clone,Copy,Debug)] pub enum IsFirst { NothingWritten, HeaderWritten, FirstCatableByteWritten, BothCatableBytesWritten, } pub struct BrotliEncoderStateStruct { pub params: BrotliEncoderParams, pub m8: Alloc, pub hasher_: UnionHasher, pub input_pos_: u64, pub ringbuffer_: RingBuffer, pub cmd_alloc_size_: usize, pub commands_: >::AllocatedMemory, // not sure about this one pub num_commands_: usize, pub num_literals_: usize, pub last_insert_len_: usize, pub last_flush_pos_: u64, pub last_processed_pos_: u64, pub dist_cache_: [i32; 16], pub saved_dist_cache_: [i32; kNumDistanceCacheEntries], pub last_bytes_: u16, pub last_bytes_bits_: u8, pub prev_byte_: u8, pub prev_byte2_: u8, pub storage_size_: usize, pub storage_: >::AllocatedMemory, pub small_table_: [i32; 1024], pub large_table_: >::AllocatedMemory, // pub large_table_size_: usize, // <-- get this by doing large_table_.len() pub cmd_depths_: [u8; 128], pub cmd_bits_: [u16; 128], pub cmd_code_: [u8; 512], pub cmd_code_numbits_: usize, pub command_buf_: >::AllocatedMemory, pub literal_buf_: >::AllocatedMemory, next_out_: NextOut, pub available_out_: usize, pub total_out_: u64, pub tiny_buf_: [u8; 16], pub remaining_metadata_bytes_: u32, pub stream_state_: BrotliEncoderStreamState, pub is_last_block_emitted_: bool, pub is_initialized_: bool, pub is_first_mb: IsFirst, pub literal_scratch_space: ::i32vec, pub command_scratch_space: ::i32vec, pub distance_scratch_space: ::i32vec, pub recoder_state: RecoderState, custom_dictionary: bool, } pub fn set_parameter(params: &mut BrotliEncoderParams, p: BrotliEncoderParameter, value: u32) -> i32 { if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_MODE as (i32) { params.mode = match value { 0 => BrotliEncoderMode::BROTLI_MODE_GENERIC, 1 => BrotliEncoderMode::BROTLI_MODE_TEXT, 2 => BrotliEncoderMode::BROTLI_MODE_FONT, 3 => BrotliEncoderMode::BROTLI_FORCE_LSB_PRIOR, 4 => BrotliEncoderMode::BROTLI_FORCE_MSB_PRIOR, 5 => BrotliEncoderMode::BROTLI_FORCE_UTF8_PRIOR, 6 => BrotliEncoderMode::BROTLI_FORCE_SIGNED_PRIOR, _ => BrotliEncoderMode::BROTLI_MODE_GENERIC, }; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_QUALITY as (i32) { params.quality = value as (i32); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_STRIDE_DETECTION_QUALITY as (i32) { params.stride_detection_quality = value as (u8); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_HIGH_ENTROPY_DETECTION_QUALITY as (i32) { params.high_entropy_detection_quality = value as (u8); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_CDF_ADAPTATION_DETECTION as (i32) { params.cdf_adaptation_detection = value as (u8); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_Q9_5 as (i32) { params.q9_5 = (value != 0); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_PRIOR_BITMASK_DETECTION as (i32) { params.prior_bitmask_detection = value as u8; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_SPEED as (i32) { params.literal_adaptation[1].0 = value as u16; if params.literal_adaptation[0] == (0,0) { params.literal_adaptation[0].0 = value as u16; } return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_SPEED_MAX as (i32) { params.literal_adaptation[1].1 = value as u16; if params.literal_adaptation[0].1 == 0 { params.literal_adaptation[0].1 = value as u16; } return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_CM_SPEED as (i32) { params.literal_adaptation[3].0 = value as u16; if params.literal_adaptation[2] == (0,0) { params.literal_adaptation[2].0 = value as u16; } return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_CM_SPEED_MAX as (i32) { params.literal_adaptation[3].1 = value as u16; if params.literal_adaptation[2].1 == 0 { params.literal_adaptation[2].1 = value as u16; } return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_SPEED_LOW as (i32) { params.literal_adaptation[0].0 = value as u16; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_SPEED_LOW_MAX as (i32) { params.literal_adaptation[0].1 = value as u16; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_CM_SPEED_LOW as (i32) { params.literal_adaptation[2].0 = value as u16; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_CM_SPEED_LOW_MAX as (i32) { params.literal_adaptation[2].1 = value as u16; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_LITERAL_BYTE_SCORE as (i32) { params.hasher.literal_byte_score = value as i32; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_METABLOCK_CALLBACK as (i32) { params.log_meta_block = if value != 0 {true} else {false}; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_LGWIN as (i32) { params.lgwin = value as (i32); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_LGBLOCK as (i32) { params.lgblock = value as (i32); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING as (i32) { if value != 0u32 && (value != 1u32) { return 0i32; } params.disable_literal_context_modeling = if !!!(value == 0) { 1i32 } else { 0i32 }; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT as (i32) { params.size_hint = value as (usize); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_LARGE_WINDOW as (i32) { params.large_window = value != 0; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_AVOID_DISTANCE_PREFIX_SEARCH as (i32) { params.avoid_distance_prefix_search = value != 0; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_CATABLE as (i32) { params.catable = value != 0; if !params.appendable { params.appendable = value != 0; } params.use_dictionary = (value == 0); return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_APPENDABLE as (i32) { params.appendable = value != 0; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_MAGIC_NUMBER as (i32) { params.magic_number = value != 0; return 1i32; } if p as (i32) == BrotliEncoderParameter::BROTLI_PARAM_FAVOR_EFFICIENCY as (i32) { params.favor_cpu_efficiency = value != 0; return 1i32; } 0i32 } pub fn BrotliEncoderSetParameter (state: &mut BrotliEncoderStateStruct, p: BrotliEncoderParameter, value: u32) -> i32 { if (*state).is_initialized_ { return 0i32; } set_parameter(&mut state.params, p, value) } /* "Large Window Brotli" */ pub const BROTLI_LARGE_MAX_DISTANCE_BITS: u32 = 62; pub const BROTLI_LARGE_MIN_WBITS: u32 = 10; pub const BROTLI_LARGE_MAX_WBITS: u32 = 30; pub const BROTLI_MAX_DISTANCE_BITS:u32 = 24; pub const BROTLI_MAX_WINDOW_BITS:usize = BROTLI_MAX_DISTANCE_BITS as usize; pub const BROTLI_MAX_DISTANCE:usize = 0x3FFFFFC; pub const BROTLI_MAX_ALLOWED_DISTANCE:usize = 0x7FFFFFC; pub const BROTLI_NUM_DISTANCE_SHORT_CODES:u32 = 16; pub fn BROTLI_DISTANCE_ALPHABET_SIZE(NPOSTFIX: u32, NDIRECT:u32, MAXNBITS: u32) -> u32 { BROTLI_NUM_DISTANCE_SHORT_CODES + (NDIRECT) + ((MAXNBITS) << ((NPOSTFIX) + 1)) } //#define BROTLI_NUM_DISTANCE_SYMBOLS \ // BROTLI_DISTANCE_ALPHABET_SIZE( \ // BROTLI_MAX_NDIRECT, BROTLI_MAX_NPOSTFIX, BROTLI_LARGE_MAX_DISTANCE_BITS) pub const BROTLI_NUM_DISTANCE_SYMBOLS:usize = 1128; pub fn BrotliEncoderInitParams() -> BrotliEncoderParams { return BrotliEncoderParams { dist: BrotliDistanceParams { distance_postfix_bits:0, num_direct_distance_codes:0, alphabet_size: BROTLI_DISTANCE_ALPHABET_SIZE(0, 0, BROTLI_MAX_DISTANCE_BITS), max_distance: BROTLI_MAX_DISTANCE, }, mode: BrotliEncoderMode::BROTLI_MODE_GENERIC, log_meta_block: false, large_window:false, avoid_distance_prefix_search:false, quality: 11, q9_5: false, lgwin: 22i32, lgblock: 0i32, size_hint: 0usize, disable_literal_context_modeling: 0i32, stride_detection_quality: 0, high_entropy_detection_quality: 0, cdf_adaptation_detection: 0, prior_bitmask_detection: 0, literal_adaptation: [(0,0);4], catable: false, use_dictionary: true, appendable: false, magic_number: false, favor_cpu_efficiency:false, hasher: BrotliHasherParams { type_: 6, block_bits: 9 - 1, bucket_bits: 15, hash_len: 5, num_last_distances_to_check: 16, literal_byte_score: 0, }, }; } fn ExtendLastCommand( s: &mut BrotliEncoderStateStruct, bytes: &mut u32, wrapped_last_processed_pos: &mut u32 ) { let last_command = &mut s.commands_.slice_mut()[s.num_commands_ - 1]; let mask = s.ringbuffer_.mask_; let max_backward_distance:u64 = (1u64 << s.params.lgwin) - BROTLI_WINDOW_GAP as u64; let last_copy_len = u64::from(last_command.copy_len_) & 0x1ffffff; let last_processed_pos:u64 = s.last_processed_pos_ - last_copy_len; let max_distance:u64 = if last_processed_pos < max_backward_distance { last_processed_pos } else { max_backward_distance }; let cmd_dist:u64 = s.dist_cache_[0] as u64; let distance_code:u32 = super::command::CommandRestoreDistanceCode(last_command, &s.params.dist); if (distance_code < BROTLI_NUM_DISTANCE_SHORT_CODES || distance_code as u64 - (BROTLI_NUM_DISTANCE_SHORT_CODES - 1) as u64 == cmd_dist) { if (cmd_dist <= max_distance) { while (*bytes != 0 && s.ringbuffer_.data_mo.slice()[s.ringbuffer_.buffer_index + (*wrapped_last_processed_pos as usize & mask as usize)] == s.ringbuffer_.data_mo.slice()[s.ringbuffer_.buffer_index + (((*wrapped_last_processed_pos as usize).wrapping_sub(cmd_dist as usize)) & mask as usize)]) { last_command.copy_len_+=1; (*bytes)-=1; (*wrapped_last_processed_pos)+=1; } } /* The copy length is at most the metablock size, and thus expressible. */ GetLengthCode(last_command.insert_len_ as usize, ((last_command.copy_len_ & 0x1FFFFFF) as i32 + (last_command.copy_len_ >> 25) as i32) as usize, ((last_command.dist_prefix_ & 0x3FF) == 0) as i32, &mut last_command.cmd_prefix_); } } fn RingBufferInit>() -> RingBuffer { return RingBuffer { size_: 0, mask_: 0, // 0xff?? tail_size_: 0, total_size_: 0, cur_size_: 0, pos_: 0, data_mo: AllocU8::AllocatedMemory::default(), buffer_index: 0usize, }; } pub fn BrotliEncoderCreateInstance (m8: Alloc) -> BrotliEncoderStateStruct { let cache: [i32; 16] = [4, 11, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; BrotliEncoderStateStruct:: { params: BrotliEncoderInitParams(), input_pos_: 0, num_commands_: 0usize, num_literals_: 0usize, last_insert_len_: 0usize, last_flush_pos_: 0, last_processed_pos_: 0, prev_byte_: 0i32 as (u8), prev_byte2_: 0i32 as (u8), storage_size_: 0usize, storage_: >::AllocatedMemory::default(), hasher_: UnionHasher::::default(), large_table_: >::AllocatedMemory::default(), // large_table_size_: 0usize, cmd_code_numbits_: 0usize, command_buf_: >::AllocatedMemory::default(), literal_buf_: >::AllocatedMemory::default(), next_out_: NextOut::None, available_out_: 0usize, total_out_: 0u64, is_first_mb: IsFirst::NothingWritten, stream_state_: BrotliEncoderStreamState::BROTLI_STREAM_PROCESSING, is_last_block_emitted_: false, is_initialized_: false, ringbuffer_: RingBufferInit(), commands_: >::AllocatedMemory::default(), cmd_alloc_size_: 0usize, dist_cache_: cache, saved_dist_cache_: [cache[0], cache[1], cache[2], cache[3]], cmd_bits_: [0; 128], cmd_depths_: [0; 128], last_bytes_: 0, last_bytes_bits_: 0, cmd_code_: [0; 512], m8: m8, remaining_metadata_bytes_: 0, small_table_: [0; 1024], tiny_buf_: [0; 16], literal_scratch_space: HistogramLiteral::make_nnz_storage(), command_scratch_space: HistogramCommand::make_nnz_storage(), distance_scratch_space: HistogramDistance::make_nnz_storage(), recoder_state: RecoderState::new(), custom_dictionary: false, } } fn RingBufferFree>(m: &mut AllocU8, rb: &mut RingBuffer) { m.free_cell(core::mem::replace(&mut rb.data_mo, AllocU8::AllocatedMemory::default())); } fn DestroyHasher + alloc::Allocator>( m16: &mut Alloc, handle: &mut UnionHasher){ handle.free(m16); } /* fn DestroyHasher, AllocU32:alloc::Allocator>( m16: &mut AllocU16, m32:&mut AllocU32, handle: &mut UnionHasher){ match handle { &mut UnionHasher::H2(ref mut hasher) => { m32.free_cell(core::mem::replace(&mut hasher.buckets_.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H3(ref mut hasher) => { m32.free_cell(core::mem::replace(&mut hasher.buckets_.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H4(ref mut hasher) => { m32.free_cell(core::mem::replace(&mut hasher.buckets_.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H54(ref mut hasher) => { m32.free_cell(core::mem::replace(&mut hasher.buckets_.buckets_, >::AllocatedMemory::default())); } &mut UnionHasher::H5(ref mut hasher) => { m16.free_cell(core::mem::replace(&mut hasher.num, AllocU16::AllocatedMemory::default())); m32.free_cell(core::mem::replace(&mut hasher.buckets, >::AllocatedMemory::default())); } &mut UnionHasher::H6(ref mut hasher) => { m16.free_cell(core::mem::replace(&mut hasher.num, AllocU16::AllocatedMemory::default())); m32.free_cell(core::mem::replace(&mut hasher.buckets, >::AllocatedMemory::default())); } &mut UnionHasher::H9(ref mut hasher) => { m16.free_cell(core::mem::replace(&mut hasher.num_, AllocU16::AllocatedMemory::default())); m32.free_cell(core::mem::replace(&mut hasher.buckets_, >::AllocatedMemory::default())); } _ => {} } *handle = UnionHasher::::default(); } */ fn BrotliEncoderCleanupState (s: &mut BrotliEncoderStateStruct) { { >::free_cell(&mut s.m8, core::mem::replace(&mut (*s).storage_, >::AllocatedMemory::default())); } { >::free_cell(&mut s.m8, core::mem::replace(&mut (*s).commands_, >::AllocatedMemory::default())); } RingBufferFree(&mut s.m8, &mut (*s).ringbuffer_); DestroyHasher(&mut s.m8, &mut (*s).hasher_); { >::free_cell(&mut s.m8, core::mem::replace(&mut (*s).large_table_, >::AllocatedMemory::default())); } { >::free_cell(&mut s.m8, core::mem::replace(&mut (*s).command_buf_, >::AllocatedMemory::default())); } { >::free_cell(&mut s.m8, core::mem::replace(&mut (*s).literal_buf_, >::AllocatedMemory::default())); } } pub fn BrotliEncoderDestroyInstance (s: &mut BrotliEncoderStateStruct) { BrotliEncoderCleanupState(s); } fn brotli_min_int(a: i32, b: i32) -> i32 { if a < b { a } else { b } } fn brotli_max_int(a: i32, b: i32) -> i32 { if a > b { a } else { b } } #[cfg(not(feature="disallow_large_window_size"))] fn check_large_window_ok() -> bool { true } #[cfg(feature="disallow_large_window_size")] fn check_large_window_ok() -> bool { false } pub fn SanitizeParams(params: &mut BrotliEncoderParams) { (*params).quality = brotli_min_int(11i32, brotli_max_int(0i32, (*params).quality)); if (*params).lgwin < 10i32 { (*params).lgwin = 10i32; } else if (*params).lgwin > 24i32 { if params.large_window && check_large_window_ok() { if (*params).lgwin > 30i32 { (*params).lgwin = 30i32; } } else { (*params).lgwin = 24i32; } } if params.catable { params.appendable = true; } } fn ComputeLgBlock(params: &BrotliEncoderParams) -> i32 { let mut lgblock: i32 = (*params).lgblock; if (*params).quality == 0i32 || (*params).quality == 1i32 { lgblock = (*params).lgwin; } else if (*params).quality < 4i32 { lgblock = 14i32; } else if lgblock == 0i32 { lgblock = 16i32; if (*params).quality >= 9i32 && ((*params).lgwin > lgblock) { lgblock = brotli_min_int(18i32, (*params).lgwin); } } else { lgblock = brotli_min_int(24i32, brotli_max_int(16i32, lgblock)); } lgblock } fn ComputeRbBits(params: &BrotliEncoderParams) -> i32 { 1i32 + brotli_max_int((*params).lgwin, (*params).lgblock) } fn RingBufferSetup>(params: &BrotliEncoderParams, rb: &mut RingBuffer) { let window_bits: i32 = ComputeRbBits(params); let tail_bits: i32 = (*params).lgblock; *(&mut (*rb).size_) = 1u32 << window_bits; *(&mut (*rb).mask_) = (1u32 << window_bits).wrapping_sub(1u32); *(&mut (*rb).tail_size_) = 1u32 << tail_bits; *(&mut (*rb).total_size_) = (*rb).size_.wrapping_add((*rb).tail_size_); } fn EncodeWindowBits(lgwin: i32, large_window: bool, last_bytes: &mut u16, last_bytes_bits: &mut u8) { if large_window { *last_bytes = (((lgwin & 0x3F) << 8) | 0x11) as u16; *last_bytes_bits = 14; } else { if lgwin == 16i32 { *last_bytes = 0i32 as (u16); *last_bytes_bits = 1i32 as (u8); } else if lgwin == 17i32 { *last_bytes = 1i32 as (u16); *last_bytes_bits = 7i32 as (u8); } else if lgwin > 17i32 { *last_bytes = (lgwin - 17i32 << 1i32 | 1i32) as (u16); *last_bytes_bits = 4i32 as (u8); } else { *last_bytes = (lgwin - 8i32 << 4i32 | 1i32) as (u16); *last_bytes_bits = 7i32 as (u8); } } } fn InitCommandPrefixCodes(cmd_depths: &mut [u8], cmd_bits: &mut [u16], cmd_code: &mut [u8], cmd_code_numbits: &mut usize) { static kDefaultCommandDepths: [u8; 128] = [ 0,4,4,5,6,6,7,7,7,7,7,8,8,8,8,8,0,0,0,4,4,4,4,4,5,5,6,6,6,6,7,7,7,7, 10,10,10,10,10,10,0,4,4,5,5,5,6,6,7,8,8,9,10,10,10,10,10,10,10,10,10,10,10,10, 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,5,5,5,5,5,5,4,4,4,4,4,4,4,5,5,5,5,5,5, 6,6,7,7,7,8,10,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0]; static kDefaultCommandBits: [u16; 128] = [ 0,0,8,9,3,35,7,71,39,103,23,47,175,111,239,31,0,0,0,4,12,2,10,6,13,29, 11,43,27,59,87,55,15,79,319,831,191,703,447,959,0,14,1,25,5,21,19,51, 119,159,95,223,479,991,63,575,127,639,383,895,255,767,511,1023,14, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,59,7,39,23,55,30,1,17,9,25,5,0,8,4,12, 2,10,6,21,13,29,3,19,11,15,47,31,95,63,127,255,767,2815,1791,3839, 511,2559,1535,3583,1023,3071,2047,4095,0,0,0,0]; static kDefaultCommandCode: [u8; 57] = [ 0xff,0x77,0xd5,0xbf,0xe7,0xde,0xea,0x9e,0x51,0x5d,0xde,0xc6,0x70,0x57, 0xbc,0x58,0x58,0x58,0xd8,0xd8,0x58,0xd5,0xcb,0x8c,0xea,0xe0,0xc3,0x87, 0x1f,0x83,0xc1,0x60,0x1c,0x67,0xb2,0xaa,0x6,0x83,0xc1,0x60,0x30,0x18, 0xcc,0xa1,0xce,0x88,0x54,0x94,0x46,0xe1,0xb0,0xd0,0x4e,0xb2,0xf7,0x4,0x0]; static kDefaultCommandCodeNumBits: usize = 448usize; cmd_depths[..].clone_from_slice(&kDefaultCommandDepths[..]); cmd_bits[..].clone_from_slice(&kDefaultCommandBits[..]); cmd_code[..kDefaultCommandCode.len()].clone_from_slice(&kDefaultCommandCode[..]); *cmd_code_numbits = kDefaultCommandCodeNumBits; } fn EnsureInitialized (s: &mut BrotliEncoderStateStruct) -> i32 { if (*s).is_initialized_ { return 1i32; } SanitizeParams(&mut (*s).params); (*s).params.lgblock = ComputeLgBlock(&mut (*s).params); ChooseDistanceParams(&mut s.params); (*s).remaining_metadata_bytes_ = !(0u32); RingBufferSetup(&mut (*s).params, &mut (*s).ringbuffer_); { let mut lgwin: i32 = (*s).params.lgwin; if (*s).params.quality == 0i32 || (*s).params.quality == 1i32 { lgwin = brotli_max_int(lgwin, 18i32); } EncodeWindowBits(lgwin, s.params.large_window, &mut (*s).last_bytes_, &mut (*s).last_bytes_bits_); } if (*s).params.quality == 0i32 { InitCommandPrefixCodes(&mut (*s).cmd_depths_[..], &mut (*s).cmd_bits_[..], &mut (*s).cmd_code_[..], &mut (*s).cmd_code_numbits_); } if s.params.catable { // if we want to properly concatenate, then we need to ignore any distances // this value 0x7ffffff0 was chosen to be larger than max_distance + gap // but small enough so that +/-3 will not overflow (due to distance modifications) for item in s.dist_cache_.iter_mut() { *item = 0x7ffffff0; } for item in s.saved_dist_cache_.iter_mut() { *item = 0x7ffffff0; } } (*s).is_initialized_ = true; 1i32 } fn RingBufferInitBuffer>(m: &mut AllocU8, buflen: u32, rb: &mut RingBuffer) { static kSlackForEightByteHashingEverywhere: usize = 7usize; let mut new_data = m.alloc_cell(((2u32).wrapping_add(buflen) as (usize)) .wrapping_add(kSlackForEightByteHashingEverywhere)); let mut i: usize; if (*rb).data_mo.slice().len() != 0 { let lim: usize = ((2u32).wrapping_add((*rb).cur_size_) as (usize)) .wrapping_add(kSlackForEightByteHashingEverywhere); new_data.slice_mut()[..lim].clone_from_slice(&(*rb).data_mo.slice()[..lim]); m.free_cell(core::mem::replace(&mut (*rb).data_mo, AllocU8::AllocatedMemory::default())); } let _ = core::mem::replace(&mut (*rb).data_mo, new_data); (*rb).cur_size_ = buflen; (*rb).buffer_index = 2usize; (*rb).data_mo.slice_mut()[((*rb).buffer_index.wrapping_sub(2usize))] = 0; (*rb).data_mo.slice_mut()[((*rb).buffer_index.wrapping_sub(1usize))] = 0; i = 0usize; while i < kSlackForEightByteHashingEverywhere { { (*rb).data_mo.slice_mut()[((*rb) .buffer_index .wrapping_add((*rb).cur_size_ as (usize)) .wrapping_add(i) as (usize))] = 0; } i = i.wrapping_add(1 as (usize)); } } fn RingBufferWriteTail>(bytes: &[u8], n: usize, rb: &mut RingBuffer) { let masked_pos: usize = ((*rb).pos_ & (*rb).mask_) as (usize); if masked_pos < (*rb).tail_size_ as (usize) { let p: usize = ((*rb).size_ as (usize)).wrapping_add(masked_pos); let begin = ((*rb).buffer_index.wrapping_add(p) as (usize)); let lim = brotli_min_size_t(n, ((*rb).tail_size_ as (usize)).wrapping_sub(masked_pos)); (*rb).data_mo.slice_mut()[begin..(begin + lim)].clone_from_slice(&bytes[..lim]); } } fn RingBufferWrite>(m: &mut AllocU8, bytes: &[u8], n: usize, rb: &mut RingBuffer) { if (*rb).pos_ == 0u32 && (n < (*rb).tail_size_ as (usize)) { (*rb).pos_ = n as (u32); RingBufferInitBuffer(m, (*rb).pos_, rb); (*rb).data_mo.slice_mut()[((*rb).buffer_index as (usize))..(((*rb).buffer_index as (usize)) + n)] .clone_from_slice(&bytes[..n]); return; } if (*rb).cur_size_ < (*rb).total_size_ { RingBufferInitBuffer(m, (*rb).total_size_, rb); if !(0i32 == 0) { return; } (*rb).data_mo.slice_mut()[((*rb) .buffer_index .wrapping_add((*rb).size_ as (usize)) .wrapping_sub(2usize) as (usize))] = 0i32 as (u8); (*rb).data_mo.slice_mut()[((*rb) .buffer_index .wrapping_add((*rb).size_ as (usize)) .wrapping_sub(1usize) as (usize))] = 0i32 as (u8); } { let masked_pos: usize = ((*rb).pos_ & (*rb).mask_) as (usize); RingBufferWriteTail(bytes, n, rb); if masked_pos.wrapping_add(n) <= (*rb).size_ as (usize) { // a single write fits let start = ((*rb).buffer_index.wrapping_add(masked_pos) as (usize)); (*rb).data_mo.slice_mut()[start..(start + n)].clone_from_slice(&bytes[..n]); } else { { let start = ((*rb).buffer_index.wrapping_add(masked_pos) as (usize)); let mid = brotli_min_size_t(n, ((*rb).total_size_ as (usize)).wrapping_sub(masked_pos)); (*rb).data_mo.slice_mut()[start..(start + mid)].clone_from_slice(&bytes[..mid]); } let xstart = ((*rb).buffer_index.wrapping_add(0usize) as (usize)); let size = n.wrapping_sub(((*rb).size_ as (usize)).wrapping_sub(masked_pos)); let bytes_start = (((*rb).size_ as (usize)).wrapping_sub(masked_pos) as (usize)); (*rb).data_mo.slice_mut()[xstart..(xstart + size)].clone_from_slice(&bytes[bytes_start.. (bytes_start + size)]); } } let data_2 = (*rb).data_mo.slice()[((*rb) .buffer_index .wrapping_add((*rb).size_ as (usize)) .wrapping_sub(2usize) as (usize))]; (*rb).data_mo.slice_mut()[((*rb).buffer_index.wrapping_sub(2usize) as (usize))] = data_2; let data_1 = (*rb).data_mo.slice()[((*rb) .buffer_index .wrapping_add((*rb).size_ as (usize)) .wrapping_sub(1usize) as (usize))]; (*rb).data_mo.slice_mut()[((*rb).buffer_index.wrapping_sub(1usize) as (usize))] = data_1; (*rb).pos_ = (*rb).pos_.wrapping_add(n as (u32)); if (*rb).pos_ > 1u32 << 30i32 { (*rb).pos_ = (*rb).pos_ & (1u32 << 30i32).wrapping_sub(1u32) | 1u32 << 30i32; } } fn CopyInputToRingBuffer (s: &mut BrotliEncoderStateStruct, input_size: usize, input_buffer: &[u8]) { if EnsureInitialized(s) == 0 { return; } RingBufferWrite(&mut s.m8, input_buffer, input_size, &mut s.ringbuffer_); if !(0i32 == 0) { return; } (*s).input_pos_ = (*s).input_pos_.wrapping_add(input_size as u64); if (s.ringbuffer_).pos_ <= (s.ringbuffer_).mask_ { let start = ((s.ringbuffer_).buffer_index.wrapping_add((s.ringbuffer_).pos_ as (usize)) as (usize)); for item in (s.ringbuffer_).data_mo.slice_mut()[start..(start + 7)].iter_mut() { *item = 0; } } } fn ChooseHasher(params: &mut BrotliEncoderParams) { let hparams = &mut params.hasher; if (*params).quality >= 10 && !params.q9_5{ (*hparams).type_ = 10; } else if (*params).quality == 10 { // we are using quality 10 as a proxy for "9.5" (*hparams).type_ = 9; (*hparams).num_last_distances_to_check = H9_NUM_LAST_DISTANCES_TO_CHECK as i32; (*hparams).block_bits = H9_BLOCK_BITS as i32; (*hparams).bucket_bits = H9_BUCKET_BITS as i32; (*hparams).hash_len = 4; } else if (*params).quality == 9 { (*hparams).type_ = 9; (*hparams).num_last_distances_to_check = H9_NUM_LAST_DISTANCES_TO_CHECK as i32; (*hparams).block_bits = H9_BLOCK_BITS as i32; (*hparams).bucket_bits = H9_BUCKET_BITS as i32; (*hparams).hash_len = 4; } else if (*params).quality == 4 && ((*params).size_hint >= (1i32 << 20i32) as (usize)) { (*hparams).type_ = 54i32; } else if (*params).quality < 5 { (*hparams).type_ = (*params).quality; } else if (*params).lgwin <= 16 { (*hparams).type_ = if (*params).quality < 7 { 40i32 } else if (*params).quality < 9 { 41i32 } else { 42i32 }; } else if ((params.q9_5 && (*params).size_hint > (1usize << 20i32)) || (*params).size_hint > (1usize << 22i32)) && ((*params).lgwin >= 19i32) { (*hparams).type_ = 6i32; (*hparams).block_bits = core::cmp::min((*params).quality - 1, 9); (*hparams).bucket_bits = 15i32; (*hparams).hash_len = 5i32; (*hparams).num_last_distances_to_check = if (*params).quality < 7 { 4i32 } else if (*params).quality < 9 { 10i32 } else { 16i32 }; } else { (*hparams).type_ = 5i32; (*hparams).block_bits = core::cmp::min((*params).quality - 1, 9); (*hparams).bucket_bits = if (*params).quality < 7 && (*params).size_hint <= (1usize << 20i32) { 14i32 } else { 15i32 }; (*hparams).num_last_distances_to_check = if (*params).quality < 7 { 4i32 } else if (*params).quality < 9 { 10i32 } else { 16i32 }; } } fn InitializeH2>(m32: &mut AllocU32, params : &BrotliEncoderParams) -> BasicHasher> { BasicHasher { GetHasherCommon:Struct1{ params:params.hasher, is_prepared_:1, dict_num_lookups:0, dict_num_matches:0, }, buckets_:H2Sub{buckets_:m32.alloc_cell(65537 + 8)}, h9_opts: super::backward_references::H9Opts::new(¶ms.hasher), } } fn InitializeH3>(m32: &mut AllocU32, params : &BrotliEncoderParams) -> BasicHasher> { BasicHasher { GetHasherCommon:Struct1{ params:params.hasher, is_prepared_:1, dict_num_lookups:0, dict_num_matches:0, }, buckets_:H3Sub{buckets_:m32.alloc_cell(65538 + 8)}, h9_opts: super::backward_references::H9Opts::new(¶ms.hasher), } } fn InitializeH4>(m32: &mut AllocU32, params : &BrotliEncoderParams) -> BasicHasher> { BasicHasher { GetHasherCommon:Struct1{ params:params.hasher, is_prepared_:1, dict_num_lookups:0, dict_num_matches:0, }, buckets_:H4Sub{buckets_:m32.alloc_cell(131072 + 8)}, h9_opts: super::backward_references::H9Opts::new(¶ms.hasher), } } fn InitializeH54>(m32: &mut AllocU32, params : &BrotliEncoderParams) -> BasicHasher> { BasicHasher { GetHasherCommon:Struct1{ params:params.hasher, is_prepared_:1, dict_num_lookups:0, dict_num_matches:0, }, buckets_:H54Sub{buckets_:m32.alloc_cell(1048580 + 8)}, h9_opts: super::backward_references::H9Opts::new(¶ms.hasher), } } fn InitializeH9 + alloc::Allocator>(m16: &mut Alloc, params : &BrotliEncoderParams) -> H9 { H9 { dict_search_stats_:Struct1{ params:params.hasher, is_prepared_:1, dict_num_lookups:0, dict_num_matches:0, }, num_:>::alloc_cell(m16, 1<>::alloc_cell(m16, H9_BLOCK_SIZE< + alloc::Allocator> (m16: &mut Alloc, params: &BrotliEncoderParams, ) -> UnionHasher { let block_size = 1u64 << params.hasher.block_bits; let bucket_size = 1u64 << params.hasher.bucket_bits; let buckets : >::AllocatedMemory = >::alloc_cell(m16, (bucket_size * block_size) as usize); let num : >::AllocatedMemory = >::alloc_cell(m16, bucket_size as usize); if params.hasher.block_bits == (HQ5Sub{}).block_bits() && (1< + alloc::Allocator> (m16: &mut Alloc, params: &BrotliEncoderParams) -> UnionHasher { let block_size = 1u64 << params.hasher.block_bits; let bucket_size = 1u64 << params.hasher.bucket_bits; let buckets: >::AllocatedMemory = >::alloc_cell(m16, (bucket_size * block_size) as usize); let num: >::AllocatedMemory = >::alloc_cell(m16, bucket_size as usize); UnionHasher::H6(AdvHasher { buckets: buckets, num: num, h9_opts: super::backward_references::H9Opts::new(¶ms.hasher), GetHasherCommon: Struct1 { params: params.hasher, is_prepared_: 1, dict_num_lookups: 0, dict_num_matches: 0, }, specialization: H6Sub { bucket_size_: 1u32 << params.hasher.bucket_bits, block_bits_: params.hasher.block_bits, block_mask_: block_size.wrapping_sub(1) as u32, hash_mask: 0xffffffffffffffffu64 >> 64i32 - 8i32 * params.hasher.hash_len, hash_shift_: 64i32 - params.hasher.bucket_bits, }, }) } fn BrotliMakeHasher + alloc::Allocator> (m: &mut Alloc, params: &BrotliEncoderParams) -> UnionHasher { let hasher_type: i32 = params.hasher.type_; if hasher_type == 2i32 { return UnionHasher::H2(InitializeH2(m, params)); } if hasher_type == 3i32 { return UnionHasher::H3(InitializeH3(m, params)); } if hasher_type == 4i32 { return UnionHasher::H4(InitializeH4(m, params)); } if hasher_type == 5i32 { return InitializeH5(m, params); } if hasher_type == 6i32 { return InitializeH6(m, params); } if hasher_type == 9i32 { return UnionHasher::H9(InitializeH9(m, params)); } /* if hasher_type == 40i32 { return InitializeH40(params); } if hasher_type == 41i32 { return InitializeH41(params); } if hasher_type == 42i32 { return InitializeH42(params); } */ if hasher_type == 54i32 { return UnionHasher::H54(InitializeH54(m, params)); } if hasher_type == 10i32 { return UnionHasher::H10(InitializeH10(m, false, params, 0)); } // since we don't support all of these, fall back to something sane return InitializeH6(m, params); // return UnionHasher::Uninit; } fn HasherReset + alloc::Allocator,>(t: &mut UnionHasher){ match t { &mut UnionHasher::Uninit => {} _ => (t.GetHasherCommon()).is_prepared_ = 0i32, }; } fn GetHasherCommon + alloc::Allocator> (t: &mut UnionHasher) -> &mut Struct1 { t.GetHasherCommon() } pub fn HasherSetup + alloc::Allocator>(m16: &mut Alloc, handle: &mut UnionHasher, params: &mut BrotliEncoderParams, data: &[u8], position: usize, input_size: usize, is_last: i32){ let one_shot: i32 = (position == 0usize && (is_last != 0)) as (i32); let is_uninit = match (handle) { &mut UnionHasher::Uninit => true, _ => false, }; if is_uninit { //let alloc_size: usize; ChooseHasher(&mut (*params)); //alloc_size = HasherSize(params, one_shot, input_size); //xself = BrotliAllocate(m, alloc_size.wrapping_mul(::std::mem::size_of::())) *handle = BrotliMakeHasher(m16, params); handle.GetHasherCommon().params = (*params).hasher; HasherReset(handle); // this sets everything to zero, unlike in C handle.GetHasherCommon().is_prepared_ = 1; } else { match handle.Prepare(one_shot != 0, input_size, data) { HowPrepared::ALREADY_PREPARED => {} HowPrepared::NEWLY_PREPARED => { if position == 0usize { let common = handle.GetHasherCommon(); (*common).dict_num_lookups = 0usize; (*common).dict_num_matches = 0usize; } } } } } fn HasherPrependCustomDictionary + alloc::Allocator> (m: &mut Alloc, handle: &mut UnionHasher, params: &mut BrotliEncoderParams, size: usize, dict: &[u8]) { HasherSetup(m, handle, params, dict, 0usize, size, 0i32); match handle { &mut UnionHasher::H2(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H3(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H4(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H5(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H5q7(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H5q5(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H6(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H9(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H54(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::H10(ref mut hasher) => StoreLookaheadThenStore(hasher, size, dict), &mut UnionHasher::Uninit => panic!("Uninitialized"), } } pub fn BrotliEncoderSetCustomDictionary (s: &mut BrotliEncoderStateStruct, size: usize, dict: &[u8]) { BrotliEncoderSetCustomDictionaryWithOptionalPrecomputedHasher(s, size, dict, UnionHasher::Uninit) } pub fn BrotliEncoderSetCustomDictionaryWithOptionalPrecomputedHasher (s: &mut BrotliEncoderStateStruct, size: usize, mut dict: &[u8], opt_hasher: UnionHasher, ) { let has_optional_hasher = if let UnionHasher::Uninit = opt_hasher { false } else {true}; let max_dict_size: usize = (1usize << (*s).params.lgwin).wrapping_sub(16usize); s.hasher_ = opt_hasher; let mut dict_size: usize = size; if EnsureInitialized(s) == 0 { return; } if dict_size == 0usize || (*s).params.quality == 0i32 || (*s).params.quality == 1i32 || size <= 1 { (*s).params.catable = true; // don't risk a too-short dictionary (*s).params.appendable = true; // don't risk a too-short dictionary return; } s.custom_dictionary = true; if size > max_dict_size { dict = &dict[(size.wrapping_sub(max_dict_size) as (usize))..]; dict_size = max_dict_size; } CopyInputToRingBuffer(s, dict_size, dict); (*s).last_flush_pos_ = dict_size as u64; (*s).last_processed_pos_ = dict_size as u64; if dict_size > 0 { (*s).prev_byte_ = dict[(dict_size.wrapping_sub(1usize) as (usize))]; } if dict_size > 1usize { (*s).prev_byte2_ = dict[(dict_size.wrapping_sub(2usize) as (usize))]; } let m16 = &mut s.m8; if cfg!(debug_assertions) || !has_optional_hasher { let mut orig_hasher = UnionHasher::Uninit; if has_optional_hasher { orig_hasher = core::mem::replace(&mut s.hasher_, UnionHasher::Uninit); } HasherPrependCustomDictionary(m16, &mut (*s).hasher_, &mut (*s).params, dict_size, dict); if has_optional_hasher { debug_assert!(orig_hasher == s.hasher_); DestroyHasher(m16, &mut orig_hasher); } } } pub fn BrotliEncoderMaxCompressedSizeMulti(input_size: usize, num_threads: usize) -> usize { BrotliEncoderMaxCompressedSize(input_size) + num_threads * 8 } pub fn BrotliEncoderMaxCompressedSize(input_size: usize) -> usize { let magic_size = 16usize; let num_large_blocks: usize = input_size >> 14i32; let tail: usize = input_size.wrapping_sub(num_large_blocks << 24i32); let tail_overhead: usize = (if tail > (1i32 << 20i32) as (usize) { 4i32 } else { 3i32 }) as (usize); let overhead: usize = (2usize) .wrapping_add((4usize).wrapping_mul(num_large_blocks)) .wrapping_add(tail_overhead) .wrapping_add(1usize); let result: usize = input_size.wrapping_add(overhead); if input_size == 0usize { return 1usize + magic_size; } if result < input_size { 0usize } else { result + magic_size } } fn InitOrStitchToPreviousBlock + alloc::Allocator> (m: &mut Alloc, handle: &mut UnionHasher, data: &[u8], mask: usize, params: &mut BrotliEncoderParams, position: usize, input_size: usize, is_last: i32) { HasherSetup(m, handle, params, data, position, input_size, is_last); handle.StitchToPreviousBlock(input_size, position, data, mask); } pub fn InitInsertCommand(xself: &mut Command, insertlen: usize) { (*xself).insert_len_ = insertlen as (u32); (*xself).copy_len_ = (4i32 << 25i32) as (u32); (*xself).dist_extra_ = 0u32; (*xself).dist_prefix_ = (1u16 << 10) | BROTLI_NUM_DISTANCE_SHORT_CODES as (u16); GetLengthCode(insertlen, 4usize, 0i32, &mut (*xself).cmd_prefix_); } fn ShouldCompress(data: &[u8], mask: usize, last_flush_pos: u64, bytes: usize, num_literals: usize, num_commands: usize) -> i32 { if num_commands < (bytes >> 8i32).wrapping_add(2usize) { if num_literals as (super::util::floatX) > 0.99 as super::util::floatX * bytes as (super::util::floatX) { let mut literal_histo: [u32; 256] = [0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32]; static kSampleRate: u32 = 13u32; static kMinEntropy: super::util::floatX = 7.92 as super::util::floatX; let bit_cost_threshold: super::util::floatX = bytes as (super::util::floatX) * kMinEntropy / kSampleRate as (super::util::floatX); let t: usize = bytes.wrapping_add(kSampleRate as (usize)) .wrapping_sub(1usize) .wrapping_div(kSampleRate as (usize)); let mut pos: u32 = last_flush_pos as (u32); let mut i: usize; i = 0usize; while i < t { { { let _rhs = 1; let _lhs = &mut literal_histo[data[((pos as (usize) & mask) as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } pos = pos.wrapping_add(kSampleRate); } i = i.wrapping_add(1 as (usize)); } if BitsEntropy(&literal_histo[..], 256usize) > bit_cost_threshold { return 0i32; } } } 1i32 } /* Chooses the literal context mode for a metablock */ fn ChooseContextMode(params: &BrotliEncoderParams, data: &[u8], pos: usize, mask: usize, length: usize) -> ContextType{ /* We only do the computation for the option of something else than CONTEXT_UTF8 for the highest qualities */ match params.mode { BrotliEncoderMode::BROTLI_FORCE_LSB_PRIOR => return ContextType::CONTEXT_LSB6, BrotliEncoderMode::BROTLI_FORCE_MSB_PRIOR => return ContextType::CONTEXT_MSB6, BrotliEncoderMode::BROTLI_FORCE_UTF8_PRIOR => return ContextType::CONTEXT_UTF8, BrotliEncoderMode::BROTLI_FORCE_SIGNED_PRIOR => return ContextType::CONTEXT_SIGNED, _ => {}, } if (params.quality >= 10 && BrotliIsMostlyUTF8(data, pos, mask, length, kMinUTF8Ratio) == 0) { return ContextType::CONTEXT_SIGNED; } return ContextType::CONTEXT_UTF8; } #[derive(PartialEq, Eq, Copy, Clone)] pub enum BrotliEncoderOperation { BROTLI_OPERATION_PROCESS = 0, BROTLI_OPERATION_FLUSH = 1, BROTLI_OPERATION_FINISH = 2, BROTLI_OPERATION_EMIT_METADATA = 3, } fn MakeUncompressedStream(input: &[u8], input_size: usize, output: &mut [u8]) -> usize { let mut size: usize = input_size; let mut result: usize = 0usize; let mut offset: usize = 0usize; if input_size == 0usize { output[(0usize)] = 6i32 as (u8); return 1usize; } output[({ let _old = result; result = result.wrapping_add(1 as (usize)); _old } as (usize))] = 0x21i32 as (u8); output[({ let _old = result; result = result.wrapping_add(1 as (usize)); _old } as (usize))] = 0x3i32 as (u8); while size > 0usize { let mut nibbles: u32 = 0u32; let chunk_size: u32; let bits: u32; chunk_size = if size > (1u32 << 24i32) as (usize) { 1u32 << 24i32 } else { size as (u32) }; if chunk_size > 1u32 << 16i32 { nibbles = if chunk_size > 1u32 << 20i32 { 2i32 } else { 1i32 } as (u32); } bits = nibbles << 1i32 | chunk_size.wrapping_sub(1u32) << 3i32 | 1u32 << (19u32).wrapping_add((4u32).wrapping_mul(nibbles)); output[({ let _old = result; result = result.wrapping_add(1 as (usize)); _old } as (usize))] = bits as (u8); output[({ let _old = result; result = result.wrapping_add(1 as (usize)); _old } as (usize))] = (bits >> 8i32) as (u8); output[({ let _old = result; result = result.wrapping_add(1 as (usize)); _old } as (usize))] = (bits >> 16i32) as (u8); if nibbles == 2u32 { output[({ let _old = result; result = result.wrapping_add(1 as (usize)); _old } as (usize))] = (bits >> 24i32) as (u8); } output[(result as usize)..(result + chunk_size as usize)].clone_from_slice( &input[offset .. (offset + chunk_size as usize)]); result = result.wrapping_add(chunk_size as (usize)); offset = offset.wrapping_add(chunk_size as (usize)); size = size.wrapping_sub(chunk_size as (usize)); } output[({ let _old = result; result = result.wrapping_add(1 as (usize)); _old } as (usize))] = 3i32 as (u8); result } pub fn BrotliEncoderCompress, &mut [interface::StaticCommand], interface::InputPair, &mut Alloc)>( empty_m8: Alloc, m8: &mut Alloc, quality: i32, lgwin: i32, mode: BrotliEncoderMode, input_size: usize, input_buffer: &[u8], encoded_size: &mut usize, encoded_buffer: &mut [u8], metablock_callback: &mut MetablockCallback) -> i32 { let out_size: usize = *encoded_size; let input_start = input_buffer; let output_start = encoded_buffer; let max_out_size: usize = BrotliEncoderMaxCompressedSize(input_size); if out_size == 0usize { return 0i32; } if input_size == 0usize { *encoded_size = 1; output_start[0] = 6; return 1i32; } let mut is_fallback: i32 = 0i32; if quality == 10i32 { panic!("Unimplemented: need to set 9.5 here"); } if is_fallback == 0 { let mut s_orig = BrotliEncoderCreateInstance(core::mem::replace(m8, empty_m8)); let mut result: i32; { let s = &mut s_orig; let mut available_in: usize = input_size; let mut next_in_array: &[u8] = input_buffer; let mut next_in_offset: usize = 0; let mut available_out: usize = *encoded_size; let mut next_out_array: &mut [u8] = output_start; let mut next_out_offset: usize = 0; let mut total_out = Some(0usize); BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_QUALITY, quality as (u32)); BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, lgwin as (u32)); BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_MODE, mode as (u32)); BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT, input_size as (u32)); if lgwin > BROTLI_MAX_WINDOW_BITS as i32 { BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_LARGE_WINDOW, 1); } result = BrotliEncoderCompressStream(s, BrotliEncoderOperation::BROTLI_OPERATION_FINISH, &mut available_in, &mut next_in_array, &mut next_in_offset, &mut available_out, &mut next_out_array, &mut next_out_offset, &mut total_out, metablock_callback); if BrotliEncoderIsFinished(s) == 0 { result = 0i32; } *encoded_size = total_out.unwrap(); BrotliEncoderDestroyInstance(s); } let _ = core::mem::replace(m8, s_orig.m8); if result == 0 || max_out_size != 0 && (*encoded_size > max_out_size) { is_fallback = 1i32; } else { return 1i32; } } assert!(is_fallback != 0); *encoded_size = 0usize; if max_out_size == 0 { return 0i32; } if out_size >= max_out_size { *encoded_size = MakeUncompressedStream(input_start, input_size, output_start); return 1i32; } 0i32 } fn InjectBytePaddingBlock(s: &mut BrotliEncoderStateStruct) { let mut seal: u32 = (*s).last_bytes_ as (u32); let mut seal_bits: usize = (*s).last_bytes_bits_ as (usize); let destination: &mut [u8]; (*s).last_bytes_ = 0; (*s).last_bytes_bits_ = 0; seal = seal | 0x6u32 << seal_bits; seal_bits = seal_bits.wrapping_add(6usize); if !IsNextOutNull(&(*s).next_out_) { destination = &mut GetNextOut!(*s)[((*s).available_out_ as (usize))..]; } else { destination = &mut (*s).tiny_buf_[..]; (*s).next_out_ = NextOut::TinyBuf(0); } destination[(0usize)] = seal as (u8); if seal_bits > 8usize { destination[(1usize)] = (seal >> 8i32) as (u8); } if seal_bits > 16usize { destination[(2usize)] = (seal >> 16i32) as (u8); } (*s).available_out_ = (*s).available_out_.wrapping_add(seal_bits.wrapping_add(7usize) >> 3i32); } fn InjectFlushOrPushOutput( s: &mut BrotliEncoderStateStruct, available_out: &mut usize, next_out_array: &mut [u8], next_out_offset: &mut usize, total_out: &mut Option) -> i32 { if (*s).stream_state_ as (i32) == BrotliEncoderStreamState::BROTLI_STREAM_FLUSH_REQUESTED as (i32) && ((*s).last_bytes_bits_ as (i32) != 0i32) { InjectBytePaddingBlock(s); return 1i32; } if (*s).available_out_ != 0usize && (*available_out != 0usize) { let copy_output_size: usize = brotli_min_size_t((*s).available_out_, *available_out); (*next_out_array)[(*next_out_offset)..(*next_out_offset + copy_output_size)].clone_from_slice(&GetNextOut!(s)[..copy_output_size]); //memcpy(*next_out, (*s).next_out_, copy_output_size); *next_out_offset = (*next_out_offset).wrapping_add(copy_output_size); *available_out = (*available_out).wrapping_sub(copy_output_size); (*s).next_out_ = NextOutIncrement(&(*s).next_out_, (copy_output_size as (i32))); (*s).available_out_ = (*s).available_out_.wrapping_sub(copy_output_size); (*s).total_out_ = (*s).total_out_.wrapping_add(copy_output_size as u64); if let &mut Some(ref mut total_out_inner) = total_out { *total_out_inner = (*s).total_out_ as usize; } return 1i32; } 0i32 } fn UnprocessedInputSize( s: &BrotliEncoderStateStruct) -> u64 { (*s).input_pos_.wrapping_sub((*s).last_processed_pos_) } fn UpdateSizeHint(s: &mut BrotliEncoderStateStruct, available_in: usize) { if (*s).params.size_hint == 0usize { let delta: u64 = UnprocessedInputSize(s); let tail: u64 = available_in as u64; let limit: u32 = 1u32 << 30i32; let total: u32; if delta >= u64::from(limit) || tail >= u64::from(limit) || delta.wrapping_add(tail) >= u64::from(limit) { total = limit; } else { total = delta.wrapping_add(tail) as (u32); } (*s).params.size_hint = total as (usize); } } fn WrapPosition(position: u64) -> u32 { let mut result: u32 = position as (u32); let gb: u64 = position >> 30i32; if gb > 2 { result = result & (1u32 << 30i32).wrapping_sub(1u32) | ((gb.wrapping_sub(1) & 1) as (u32)).wrapping_add(1u32) << 30i32; } result } fn InputBlockSize(s: &mut BrotliEncoderStateStruct) -> usize { if EnsureInitialized(s) == 0 { return 0usize; } 1usize << (*s).params.lgblock } fn GetBrotliStorage(s: &mut BrotliEncoderStateStruct, size: usize) { if (*s).storage_size_ < size { >::free_cell(&mut (*s).m8, core::mem::replace(&mut (*s).storage_, >::AllocatedMemory::default())); (*s).storage_ = >::alloc_cell(&mut (*s).m8, size); (*s).storage_size_ = size; } } fn MaxHashTableSize(quality: i32) -> usize { (if quality == 0i32 { 1i32 << 15i32 } else { 1i32 << 17i32 }) as (usize) } fn HashTableSize(max_table_size: usize, input_size: usize) -> usize { let mut htsize: usize = 256usize; while htsize < max_table_size && (htsize < input_size) { htsize = htsize << 1i32; } htsize } macro_rules! GetHashTable { ($s : expr, $quality: expr, $input_size : expr, $table_size : expr) => { GetHashTableInternal(&mut $s.m8, &mut $s.small_table_, &mut $s.large_table_, $quality, $input_size, $table_size) }; } fn GetHashTableInternal<'a, AllocI32: alloc::Allocator>(mi32: &mut AllocI32, small_table_: &'a mut [i32; 1024], large_table_: &'a mut AllocI32::AllocatedMemory, quality: i32, input_size: usize, table_size: &mut usize) -> &'a mut [i32] { let max_table_size: usize = MaxHashTableSize(quality); let mut htsize: usize = HashTableSize(max_table_size, input_size); let table: &mut [i32]; if quality == 0i32 { if htsize & 0xaaaaausize == 0usize { htsize = htsize << 1i32; } } if htsize <= small_table_.len() { table = &mut small_table_[..]; } else { if htsize > large_table_.slice().len() { //(*s).large_table_size_ = htsize; { mi32.free_cell(core::mem::replace(large_table_, AllocI32::AllocatedMemory::default())); } *large_table_ = mi32.alloc_cell(htsize); } table = large_table_.slice_mut(); } *table_size = htsize; for item in table[..htsize].iter_mut() { *item = 0; } table // FIXME: probably need a macro to do this without borrowing the whole EncoderStateStruct } fn UpdateLastProcessedPos(s: &mut BrotliEncoderStateStruct) -> i32 { let wrapped_last_processed_pos: u32 = WrapPosition((*s).last_processed_pos_); let wrapped_input_pos: u32 = WrapPosition((*s).input_pos_); (*s).last_processed_pos_ = (*s).input_pos_; if !!(wrapped_input_pos < wrapped_last_processed_pos) { 1i32 } else { 0i32 } } fn MaxMetablockSize(params: &BrotliEncoderParams) -> usize { let bits: i32 = brotli_min_int(ComputeRbBits(params), 24i32); 1usize << bits } fn ChooseContextMap(quality: i32, bigram_histo: &mut [u32], num_literal_contexts: &mut usize, literal_context_map: &mut &[u32]) { static kStaticContextMapContinuation: [u32; 64] = [1u32, 1u32, 2u32, 2u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32]; static kStaticContextMapSimpleUTF8: [u32; 64] = [0u32, 0u32, 1u32, 1u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32]; let mut monogram_histo: [u32; 3] = [0u32, 0u32, 0u32]; let mut two_prefix_histo: [u32; 6] = [0u32, 0u32, 0u32, 0u32, 0u32, 0u32]; let total: usize; let mut i: usize; let mut dummy: usize = 0; let mut entropy: [super::util::floatX; 4] = [0.0 as super::util::floatX;4]; i = 0usize; while i < 9usize { { { let _rhs = bigram_histo[(i as (usize))]; let _lhs = &mut monogram_histo[i.wrapping_rem(3usize)]; *_lhs = (*_lhs).wrapping_add(_rhs); } { let _rhs = bigram_histo[(i as (usize))]; let _lhs = &mut two_prefix_histo[i.wrapping_rem(6usize)]; *_lhs = (*_lhs).wrapping_add(_rhs); } } i = i.wrapping_add(1 as (usize)); } entropy[1usize] = ShannonEntropy(&monogram_histo[..], 3usize, &mut dummy); entropy[2usize] = ShannonEntropy(&two_prefix_histo[..], 3usize, &mut dummy) + ShannonEntropy(&two_prefix_histo[3i32 as (usize)..], 3usize, &mut dummy); entropy[3usize] = 0i32 as (super::util::floatX); i = 0usize; while i < 3usize { { let _rhs = ShannonEntropy(&bigram_histo[((3usize).wrapping_mul(i) as (usize))..], 3usize, &mut dummy); let _lhs = &mut entropy[3usize]; *_lhs = *_lhs + _rhs; } i = i.wrapping_add(1 as (usize)); } total = monogram_histo[0usize] .wrapping_add(monogram_histo[1usize]) .wrapping_add(monogram_histo[2usize]) as (usize); 0i32; entropy[0usize] = 1.0 as super::util::floatX / total as (super::util::floatX); { let _rhs = entropy[0usize]; let _lhs = &mut entropy[1usize]; *_lhs = *_lhs * _rhs; } { let _rhs = entropy[0usize]; let _lhs = &mut entropy[2usize]; *_lhs = *_lhs * _rhs; } { let _rhs = entropy[0usize]; let _lhs = &mut entropy[3usize]; *_lhs = *_lhs * _rhs; } if quality < 7i32 { entropy[3usize] = entropy[1usize] * 10i32 as (super::util::floatX); } if entropy[1usize] - entropy[2usize] < 0.2 as super::util::floatX && (entropy[1usize] - entropy[3usize] < 0.2 as super::util::floatX) { *num_literal_contexts = 1usize; } else if entropy[2usize] - entropy[3usize] < 0.02 as super::util::floatX { *num_literal_contexts = 2usize; *literal_context_map = &kStaticContextMapSimpleUTF8[..]; } else { *num_literal_contexts = 3usize; *literal_context_map = &kStaticContextMapContinuation[..]; } } static kStaticContextMapComplexUTF8: [u32; 64] = [ 11, 11, 12, 12, /* 0 special */ 0, 0, 0, 0, /* 4 lf */ 1, 1, 9, 9, /* 8 space */ 2, 2, 2, 2, /* !, first after space/lf and after something else. */ 1, 1, 1, 1, /* " */ 8, 3, 3, 3, /* % */ 1, 1, 1, 1, /* ({[ */ 2, 2, 2, 2, /* }]) */ 8, 4, 4, 4, /* :; */ 8, 7, 4, 4, /* . */ 8, 0, 0, 0, /* > */ 3, 3, 3, 3, /* [0..9] */ 5, 5, 10, 5, /* [A-Z] */ 5, 5, 10, 5, 6, 6, 6, 6, /* [a-z] */ 6, 6, 6, 6, ]; /* Decide if we want to use a more complex static context map containing 13 context values, based on the entropy reduction of histograms over the first 5 bits of literals. */ fn ShouldUseComplexStaticContextMap(input: &[u8], mut start_pos: usize, length : usize, mask : usize, quality: i32, size_hint: usize, num_literal_contexts: &mut usize, literal_context_map: &mut &[u32]) -> bool { let _ = quality; //BROTLI_UNUSED(quality); /* Try the more complex static context map only for long data. */ if (size_hint < (1 << 20)) { return false; } else { let end_pos = start_pos + length; /* To make entropy calculations faster and to fit on the stack, we collect histograms over the 5 most significant bits of literals. One histogram without context and 13 additional histograms for each context value. */ let mut combined_histo:[u32; 32] = [0;32]; let mut context_histo:[[u32;32]; 13] = [[0;32];13]; let mut total = 0u32; let mut entropy = [0.0 as super::util::floatX;3]; let mut dummy = 0usize; let utf8_lut = BROTLI_CONTEXT_LUT(ContextType::CONTEXT_UTF8); while start_pos + 64 <= end_pos { let stride_end_pos = start_pos + 64; let mut prev2 = input[start_pos & mask]; let mut prev1 = input[(start_pos + 1) & mask]; /* To make the analysis of the data faster we only examine 64 byte long strides at every 4kB intervals. */ for pos in start_pos + 2..stride_end_pos { let literal = input[pos & mask]; let context = kStaticContextMapComplexUTF8[ BROTLI_CONTEXT(prev1, prev2, utf8_lut) as usize] as u8; total += 1; combined_histo[(literal >> 3) as usize] += 1; context_histo[context as usize][(literal >> 3) as usize] += 1; prev2 = prev1; prev1 = literal; } start_pos += 4096; } entropy[1] = ShannonEntropy(&combined_histo[..], 32, &mut dummy); entropy[2] = 0.0 as super::util::floatX; for i in 0..13 { assert!(i < 13); entropy[2] += ShannonEntropy(&context_histo[i][..], 32, &mut dummy); } entropy[0] = (1.0 as super::util::floatX) / (total as super::util::floatX); entropy[1] *= entropy[0]; entropy[2] *= entropy[0]; /* The triggering heuristics below were tuned by compressing the individual files of the silesia corpus. If we skip this kind of context modeling for not very well compressible input (i.e. entropy using context modeling is 60% of maximal entropy) or if expected savings by symbol are less than 0.2 bits, then in every case when it triggers, the final compression ratio is improved. Note however that this heuristics might be too strict for some cases and could be tuned further. */ if (entropy[2] > 3.0 || entropy[1] - entropy[2] < 0.2) { return false; } else { *num_literal_contexts = 13; *literal_context_map = &kStaticContextMapComplexUTF8; return true; } } } fn DecideOverLiteralContextModeling(input: &[u8], mut start_pos: usize, length: usize, mask: usize, quality: i32, size_hint: usize, num_literal_contexts: &mut usize, literal_context_map: &mut &[u32]) { if quality < 5i32 || length < 64usize { } else if ShouldUseComplexStaticContextMap(input, start_pos, length, mask, quality, size_hint, num_literal_contexts, literal_context_map) { } else { let end_pos: usize = start_pos.wrapping_add(length); let mut bigram_prefix_histo: [u32; 9] = [0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32, 0u32]; while start_pos.wrapping_add(64usize) <= end_pos { { static lut: [i32; 4] = [0i32, 0i32, 1i32, 2i32]; let stride_end_pos: usize = start_pos.wrapping_add(64usize); let mut prev: i32 = lut[(input[((start_pos & mask) as (usize))] as (i32) >> 6i32) as (usize)] * 3i32; let mut pos: usize; pos = start_pos.wrapping_add(1usize); while pos < stride_end_pos { { let literal: u8 = input[((pos & mask) as (usize))]; { let _rhs = 1; let cur_ind = (prev + lut[(literal as (i32) >> 6i32) as (usize)]); let _lhs = &mut bigram_prefix_histo[cur_ind as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } prev = lut[(literal as (i32) >> 6i32) as (usize)] * 3i32; } pos = pos.wrapping_add(1 as (usize)); } } start_pos = start_pos.wrapping_add(4096usize); } ChooseContextMap(quality, &mut bigram_prefix_histo[..], num_literal_contexts, literal_context_map); } } fn WriteMetaBlockInternal (alloc: &mut Alloc, data: &[u8], mask: usize, last_flush_pos: u64, bytes: usize, mut is_last: i32, literal_context_mode: ContextType, params: &BrotliEncoderParams, lit_scratch_space: &mut ::i32vec, cmd_scratch_space: &mut ::i32vec, dst_scratch_space: &mut ::i32vec, prev_byte: u8, prev_byte2: u8, num_literals: usize, num_commands: usize, commands: &mut [Command], saved_dist_cache: &[i32;kNumDistanceCacheEntries], dist_cache: &mut [i32;16], recoder_state: &mut RecoderState, storage_ix: &mut usize, storage: &mut [u8], cb: &mut Cb) where Cb: FnMut(&mut interface::PredictionModeContextMap, &mut [interface::StaticCommand], interface::InputPair, &mut Alloc) { let actual_is_last = is_last; if params.appendable { is_last = 0; } else { assert_eq!(params.catable, false); // Sanitize Params senforces this constraint } let wrapped_last_flush_pos: u32 = WrapPosition(last_flush_pos); let last_bytes: u16; let last_bytes_bits: u8; let literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode); let mut block_params = params.clone(); if bytes == 0usize { BrotliWriteBits(2usize, 3, storage_ix, storage); *storage_ix = (*storage_ix).wrapping_add(7u32 as (usize)) & !7u32 as (usize); return; } if ShouldCompress(data, mask, last_flush_pos, bytes, num_literals, num_commands) == 0 { dist_cache[..4].clone_from_slice(&saved_dist_cache[..4]); BrotliStoreUncompressedMetaBlock(alloc, is_last, data, wrapped_last_flush_pos as (usize), mask, params, bytes, recoder_state, storage_ix, storage, false, cb); if actual_is_last != is_last { BrotliWriteEmptyLastMetaBlock(storage_ix, storage) } return; } let saved_byte_location = (*storage_ix) >> 3; last_bytes = ((storage[saved_byte_location + 1] as u16) << 8) | storage[saved_byte_location] as u16; last_bytes_bits = *storage_ix as u8; /*if params.dist.num_direct_distance_codes != 0 || params.dist.distance_postfix_bits != 0 { RecomputeDistancePrefixes(commands, num_commands, params.dist.num_direct_distance_codes, params.dist.distance_postfix_bits); }*/ // why was this removed?? if (*params).quality <= 2i32 { BrotliStoreMetaBlockFast(alloc, data, wrapped_last_flush_pos as (usize), bytes, mask, is_last, params, saved_dist_cache, commands, num_commands, recoder_state, storage_ix, storage, cb); } else if (*params).quality < 4i32 { BrotliStoreMetaBlockTrivial(alloc, data, wrapped_last_flush_pos as (usize), bytes, mask, is_last, params, saved_dist_cache, commands, num_commands, recoder_state, storage_ix, storage, cb); } else { //let mut literal_context_mode: ContextType = ContextType::CONTEXT_UTF8; let mut mb = MetaBlockSplit::::new(); if (*params).quality < 10i32 { let mut num_literal_contexts: usize = 1usize; let mut literal_context_map: &[u32] = &[]; if (*params).disable_literal_context_modeling == 0 { DecideOverLiteralContextModeling(data, wrapped_last_flush_pos as (usize), bytes, mask, (*params).quality, (*params).size_hint, &mut num_literal_contexts, &mut literal_context_map); } BrotliBuildMetaBlockGreedy(alloc, data, wrapped_last_flush_pos as (usize), mask, prev_byte, prev_byte2, literal_context_mode, literal_context_lut, num_literal_contexts, literal_context_map, commands, num_commands, &mut mb); } else { BrotliBuildMetaBlock(alloc, data, wrapped_last_flush_pos as (usize), mask, &mut block_params, prev_byte, prev_byte2, commands, num_commands, literal_context_mode, lit_scratch_space, cmd_scratch_space, dst_scratch_space, &mut mb); } if (*params).quality >= 4i32 { let mut num_effective_dist_codes = block_params.dist.alphabet_size; if num_effective_dist_codes > BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS as u32 { num_effective_dist_codes = BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS as u32; } BrotliOptimizeHistograms(num_effective_dist_codes as usize, &mut mb); } BrotliStoreMetaBlock(alloc, data, wrapped_last_flush_pos as (usize), bytes, mask, prev_byte, prev_byte2, is_last, &block_params, literal_context_mode, saved_dist_cache, commands, num_commands, &mut mb, recoder_state, storage_ix, storage, cb); mb.destroy(alloc); } if bytes + 4 + saved_byte_location < (*storage_ix >> 3i32) { dist_cache[..4].clone_from_slice(&saved_dist_cache[..4]); //memcpy(dist_cache, // saved_dist_cache, // (4usize).wrapping_mul(::std::mem::size_of::())); storage[saved_byte_location] = last_bytes as u8; storage[saved_byte_location + 1] = (last_bytes >> 8) as u8; *storage_ix = last_bytes_bits as (usize); BrotliStoreUncompressedMetaBlock(alloc, is_last, data, wrapped_last_flush_pos as (usize), mask, params, bytes, recoder_state, storage_ix, storage, true, cb); } if actual_is_last != is_last { BrotliWriteEmptyLastMetaBlock(storage_ix, storage) } } fn ChooseDistanceParams(params: &mut BrotliEncoderParams) { let mut num_direct_distance_codes = 0u32; let mut distance_postfix_bits = 0u32; if params.quality >= 4 { let ndirect_msb; if params.mode == BrotliEncoderMode::BROTLI_MODE_FONT { distance_postfix_bits = 1; num_direct_distance_codes = 12; } else { distance_postfix_bits = params.dist.distance_postfix_bits; num_direct_distance_codes = params.dist.num_direct_distance_codes; } ndirect_msb = (num_direct_distance_codes >> distance_postfix_bits) & 0x0f; if distance_postfix_bits > BROTLI_MAX_NPOSTFIX as u32 || num_direct_distance_codes > BROTLI_MAX_NDIRECT as u32 || (ndirect_msb << distance_postfix_bits) != num_direct_distance_codes { distance_postfix_bits = 0; num_direct_distance_codes = 0; } } BrotliInitDistanceParams(params, distance_postfix_bits, num_direct_distance_codes); /*( if (params.large_window) { max_distance = BROTLI_MAX_ALLOWED_DISTANCE; if (num_direct_distance_codes != 0 || distance_postfix_bits != 0) { max_distance = (3 << 29) - 4; } alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE( num_direct_distance_codes, distance_postfix_bits, BROTLI_LARGE_MAX_DISTANCE_BITS); } else { alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE( num_direct_distance_codes, distance_postfix_bits, BROTLI_MAX_DISTANCE_BITS); } params.dist.num_direct_distance_codes = num_direct_distance_codes; params.dist.distance_postfix_bits = distance_postfix_bits; params.dist.alphabet_size = alphabet_size; params.dist.max_distance = max_distance;*/ } fn EncodeData( s: &mut BrotliEncoderStateStruct, is_last: i32, force_flush: i32, out_size: &mut usize, callback: &mut MetablockCallback // mut output: &'a mut &'a mut [u8] ) -> i32 where MetablockCallback: FnMut(&mut interface::PredictionModeContextMap, &mut [interface::StaticCommand], interface::InputPair, &mut Alloc){ let mut delta: u64 = UnprocessedInputSize(s); let mut bytes: u32 = delta as (u32); let mask = (*s).ringbuffer_.mask_; if EnsureInitialized(s) == 0 { return 0i32; } let dictionary = BrotliGetDictionary(); if (*s).is_last_block_emitted_ { return 0i32; } if is_last != 0 { (*s).is_last_block_emitted_ = true; } if delta > InputBlockSize(s) as u64 { return 0i32; } let mut storage_ix: usize = usize::from((*s).last_bytes_bits_); { let meta_size = core::cmp::max(bytes as usize, (*s).input_pos_.wrapping_sub((*s).last_flush_pos_) as usize); GetBrotliStorage(s, (2usize).wrapping_mul(meta_size).wrapping_add(503 + 24)); } { (*s).storage_.slice_mut()[0] = (*s).last_bytes_ as u8; (*s).storage_.slice_mut()[1] = ((*s).last_bytes_ >> 8) as u8; } let mut catable_header_size = 0; if let IsFirst::NothingWritten = s.is_first_mb { if s.params.magic_number { BrotliWriteMetadataMetaBlock(&s.params, &mut storage_ix, (*s).storage_.slice_mut()); (*s).last_bytes_ = (*s).storage_.slice()[((storage_ix >> 3i32) as (usize))] as u16 | ( ((*s).storage_.slice()[1 + ((storage_ix >> 3i32) as (usize))] as u16)<<8); (*s).last_bytes_bits_ = (storage_ix & 7u32 as (usize)) as (u8); (*s).next_out_ = NextOut::DynamicStorage(0); catable_header_size = storage_ix >> 3; *out_size = catable_header_size; s.is_first_mb = IsFirst::HeaderWritten; } } if let IsFirst::BothCatableBytesWritten = s.is_first_mb { // nothing to do here, move along } else if !s.params.catable { s.is_first_mb = IsFirst::BothCatableBytesWritten; } else if bytes != 0 { assert!(s.last_processed_pos_ < 2 || s.custom_dictionary); let num_bytes_to_write_uncompressed:usize = core::cmp::min(2, bytes as usize); { let data = &mut (*s).ringbuffer_.data_mo.slice_mut ()[((*s).ringbuffer_.buffer_index as (usize))..]; BrotliStoreUncompressedMetaBlock(&mut s.m8, 0, data, s.last_flush_pos_ as usize, mask as usize, &s.params, num_bytes_to_write_uncompressed, &mut (*s).recoder_state, &mut storage_ix, (*s).storage_.slice_mut(), false /* suppress meta-block logging */, callback); (*s).last_bytes_ = (*s).storage_.slice()[((storage_ix >> 3i32) as (usize))] as u16 | ( ((*s).storage_.slice()[1 + ((storage_ix >> 3i32) as (usize))] as u16)<<8); (*s).last_bytes_bits_ = (storage_ix & 7u32 as (usize)) as (u8); s.prev_byte2_ = s.prev_byte_; s.prev_byte_ = data[s.last_flush_pos_ as usize & mask as usize]; if num_bytes_to_write_uncompressed == 2 { s.prev_byte2_ = s.prev_byte_; s.prev_byte_ = data[(s.last_flush_pos_ + 1) as usize & mask as usize]; } } s.last_flush_pos_ += num_bytes_to_write_uncompressed as u64; bytes -= num_bytes_to_write_uncompressed as u32; (*s).last_processed_pos_ += num_bytes_to_write_uncompressed as u64; if num_bytes_to_write_uncompressed >= 2 { s.is_first_mb = IsFirst::BothCatableBytesWritten; } else if num_bytes_to_write_uncompressed == 1 { if let IsFirst::FirstCatableByteWritten = s.is_first_mb { s.is_first_mb = IsFirst::BothCatableBytesWritten; } else { s.is_first_mb = IsFirst::FirstCatableByteWritten; } } catable_header_size = storage_ix >> 3; (*s).next_out_ = NextOut::DynamicStorage(0); *out_size = catable_header_size; delta = UnprocessedInputSize(s); } let mut wrapped_last_processed_pos: u32 = WrapPosition((*s).last_processed_pos_); if (*s).params.quality == 1i32 && (*s).command_buf_.slice().len() == 0 { let new_buf = >::alloc_cell(&mut (*s).m8, kCompressFragmentTwoPassBlockSize); (*s).command_buf_ = new_buf; let new_buf8 = >::alloc_cell(&mut (*s).m8, kCompressFragmentTwoPassBlockSize); (*s).literal_buf_ = new_buf8; } if (*s).params.quality == 0i32 || (*s).params.quality == 1i32 { let mut table_size: usize = 0; { let table: &mut [i32]; if delta == 0 && (is_last == 0) { *out_size = catable_header_size; return 1i32; } let data = &mut (*s).ringbuffer_.data_mo.slice_mut ()[((*s).ringbuffer_.buffer_index as (usize))..]; //(*s).storage_.slice_mut()[0] = (*s).last_bytes_ as u8; // (*s).storage_.slice_mut()[1] = ((*s).last_bytes_ >> 8) as u8; table = GetHashTable!(s, (*s).params.quality, bytes as (usize), &mut table_size); if (*s).params.quality == 0i32 { BrotliCompressFragmentFast(&mut s.m8, &mut data[((wrapped_last_processed_pos & mask) as (usize))..], bytes as (usize), is_last, table, table_size, &mut (*s).cmd_depths_[..], &mut (*s).cmd_bits_[..], &mut (*s).cmd_code_numbits_, &mut (*s).cmd_code_[..], &mut storage_ix, (*s).storage_.slice_mut()); } else { BrotliCompressFragmentTwoPass(&mut s.m8, &mut data[((wrapped_last_processed_pos & mask) as (usize))..], bytes as (usize), is_last, (*s).command_buf_.slice_mut(), (*s).literal_buf_.slice_mut(), table, table_size, &mut storage_ix, (*s).storage_.slice_mut()); } (*s).last_bytes_ = (*s).storage_.slice()[((storage_ix >> 3i32) as (usize))] as u16 | (( (*s).storage_.slice()[((storage_ix >> 3i32) as (usize)) + 1] as u16) << 8); (*s).last_bytes_bits_ = (storage_ix & 7u32 as (usize)) as (u8); } UpdateLastProcessedPos(s); // *output = &mut (*s).storage_.slice_mut(); (*s).next_out_ = NextOut::DynamicStorage(0); // this always returns that *out_size = storage_ix >> 3i32; return 1i32; } { let mut newsize: usize = (*s).num_commands_.wrapping_add(bytes.wrapping_div(2u32) as (usize)).wrapping_add(1usize); if newsize > (*s).cmd_alloc_size_ { newsize = newsize.wrapping_add(bytes.wrapping_div(4u32).wrapping_add(16u32) as (usize)); (*s).cmd_alloc_size_ = newsize; let mut new_commands = >::alloc_cell(&mut s.m8, newsize); if (*s).commands_.slice().len() != 0 { new_commands.slice_mut()[..(*s).num_commands_].clone_from_slice(&(*s).commands_.slice()[..(*s).num_commands_]); >::free_cell(&mut s.m8, core::mem::replace(&mut (*s).commands_, >::AllocatedMemory::default())); } (*s).commands_ = new_commands; } } InitOrStitchToPreviousBlock(&mut (*s).m8, &mut (*s).hasher_, &mut (*s).ringbuffer_.data_mo.slice_mut()[((*s).ringbuffer_.buffer_index as (usize))..], mask as (usize), &mut (*s).params, wrapped_last_processed_pos as (usize), bytes as (usize), is_last); let literal_context_mode = ChooseContextMode( &s.params, (*s).ringbuffer_.data_mo.slice(), WrapPosition(s.last_flush_pos_) as usize, mask as usize, (s.input_pos_.wrapping_sub(s.last_flush_pos_)) as usize); if s.num_commands_ != 0 && s.last_insert_len_ == 0 { ExtendLastCommand(s, &mut bytes, &mut wrapped_last_processed_pos); } if false { // we are remapping 10 as quality=9.5 since Zopfli doesn't seem to offer much benefits here panic!(r####" BrotliCreateZopfliBackwardReferences(m, dictionary, bytes as (usize), wrapped_last_processed_pos as (usize), data, mask as (usize), &mut (*s).params, (*s).hasher_, (*s).dist_cache_.as_mut_ptr(), &mut (*s).last_insert_len_, &mut *(*s).commands_[((*s).num_commands_ as (usize))..], &mut (*s).num_commands_, &mut (*s).num_literals_);"####); } else if false && (*s).params.quality == 11i32 { panic!(r####"BrotliCreateHqZopfliBackwardReferences(m, dictionary, bytes as (usize), wrapped_last_processed_pos as (usize), data, mask as (usize), &mut (*s).params, (*s).hasher_, (*s).dist_cache_.as_mut_ptr(), &mut (*s).last_insert_len_, &mut *(*s).commands_[((*s).num_commands_ as (usize))..], &mut (*s).num_commands_, &mut (*s).num_literals_);"####); } else { BrotliCreateBackwardReferences(&mut (*s).m8, &dictionary, bytes as (usize), wrapped_last_processed_pos as (usize), &mut (*s).ringbuffer_.data_mo.slice_mut()[((*s).ringbuffer_.buffer_index as usize)..], mask as (usize), &mut (*s).params, &mut (*s).hasher_, &mut (*s).dist_cache_, &mut (*s).last_insert_len_, &mut (*s).commands_.slice_mut()[((*s).num_commands_ as (usize))..], &mut (*s).num_commands_, &mut (*s).num_literals_); } { let max_length: usize = MaxMetablockSize(&mut (*s).params); let max_literals: usize = max_length.wrapping_div(8usize); let max_commands: usize = max_length.wrapping_div(8usize); let processed_bytes: usize = (*s).input_pos_.wrapping_sub((*s).last_flush_pos_) as usize; let next_input_fits_metablock: i32 = if !!(processed_bytes.wrapping_add(InputBlockSize(s)) <= max_length) { 1i32 } else { 0i32 }; let should_flush: i32 = if !!((*s).params.quality < 4i32 && ((*s).num_literals_.wrapping_add((*s).num_commands_) >= 0x2fffusize)) { 1i32 } else { 0i32 }; if is_last == 0 && (force_flush == 0) && (should_flush == 0) && (next_input_fits_metablock != 0) && ((*s).num_literals_ < max_literals) && ((*s).num_commands_ < max_commands) { if UpdateLastProcessedPos(s) != 0 { HasherReset(&mut (*s).hasher_); } *out_size = catable_header_size; return 1i32; } } if (*s).last_insert_len_ > 0usize { InitInsertCommand(&mut (*s).commands_.slice_mut()[({ let _old = (*s).num_commands_; (*s).num_commands_ = (*s).num_commands_.wrapping_add(1 as (usize)); _old } as (usize))], (*s).last_insert_len_); (*s).num_literals_ = (*s).num_literals_.wrapping_add((*s).last_insert_len_); (*s).last_insert_len_ = 0usize; } if is_last == 0 && ((*s).input_pos_ == (*s).last_flush_pos_) { *out_size = catable_header_size; return 1i32; } { let metablock_size: u32 = (*s).input_pos_.wrapping_sub((*s).last_flush_pos_) as (u32); //let mut storage_ix: usize = (*s).last_bytes_bits_ as (usize); //(*s).storage_.slice_mut()[(0usize)] = (*s).last_bytes_ as u8; //(*s).storage_.slice_mut()[(1usize)] = ((*s).last_bytes_ >> 8) as u8; WriteMetaBlockInternal(&mut (*s).m8, &mut (*s).ringbuffer_.data_mo.slice_mut()[((*s).ringbuffer_.buffer_index as usize)..], mask as (usize), (*s).last_flush_pos_, metablock_size as (usize), is_last, literal_context_mode, &mut (*s).params, &mut (*s).literal_scratch_space, &mut (*s).command_scratch_space, &mut (*s).distance_scratch_space, (*s).prev_byte_, (*s).prev_byte2_, (*s).num_literals_, (*s).num_commands_, (*s).commands_.slice_mut(), &mut (*s).saved_dist_cache_, &mut (*s).dist_cache_, &mut (*s).recoder_state, &mut storage_ix, (*s).storage_.slice_mut(), callback); (*s).last_bytes_ = (*s).storage_.slice()[((storage_ix >> 3i32) as (usize))] as u16 | ( ((*s).storage_.slice()[1 + ((storage_ix >> 3i32) as (usize))] as u16)<<8); (*s).last_bytes_bits_ = (storage_ix & 7u32 as (usize)) as (u8); (*s).last_flush_pos_ = (*s).input_pos_; if UpdateLastProcessedPos(s) != 0 { HasherReset(&mut (*s).hasher_); } let data = &(*s).ringbuffer_.data_mo.slice()[(*s).ringbuffer_.buffer_index as usize..]; if (*s).last_flush_pos_ > 0 { (*s).prev_byte_ = data[((((*s).last_flush_pos_ as (u32)).wrapping_sub(1u32) & mask) as (usize))]; } if (*s).last_flush_pos_ > 1 { (*s).prev_byte2_ = data[(((*s).last_flush_pos_.wrapping_sub(2) as (u32) & mask) as (usize))]; } (*s).num_commands_ = 0usize; (*s).num_literals_ = 0usize; (*s).saved_dist_cache_.clone_from_slice(&(*s).dist_cache_.split_at(4).0); (*s).next_out_ = NextOut::DynamicStorage(0); // this always returns that *out_size = storage_ix >> 3i32; 1i32 } } fn WriteMetadataHeader(s: &mut BrotliEncoderStateStruct) -> usize { let block_size = (*s).remaining_metadata_bytes_ as (usize); let header = GetNextOut!(*s); let mut storage_ix: usize; storage_ix = (*s).last_bytes_bits_ as (usize); header[(0usize)] = (*s).last_bytes_ as u8; header[(1usize)] = ((*s).last_bytes_ >> 8) as u8; (*s).last_bytes_ = 0; (*s).last_bytes_bits_ = 0; BrotliWriteBits(1usize, 0, &mut storage_ix, header); BrotliWriteBits(2usize, 3, &mut storage_ix, header); BrotliWriteBits(1usize, 0, &mut storage_ix, header); if block_size == 0usize { BrotliWriteBits(2usize, 0, &mut storage_ix, header); } else { let nbits: u32 = if block_size == 1usize { 0u32 } else { Log2FloorNonZero((block_size as (u32)).wrapping_sub(1u32) as (u64)).wrapping_add(1u32) }; let nbytes: u32 = nbits.wrapping_add(7u32).wrapping_div(8u32); BrotliWriteBits(2usize, nbytes as (u64), &mut storage_ix, header); BrotliWriteBits((8u32).wrapping_mul(nbytes) as (usize), block_size.wrapping_sub(1usize) as u64, &mut storage_ix, header); } storage_ix.wrapping_add(7u32 as (usize)) >> 3i32 } fn brotli_min_uint32_t(a: u32, b: u32) -> u32 { if a < b { a } else { b } } fn ProcessMetadata, &mut [interface::StaticCommand], interface::InputPair, &mut Alloc)>( s: &mut BrotliEncoderStateStruct, available_in: &mut usize, next_in_array: &[u8], next_in_offset: &mut usize, available_out: &mut usize, next_out_array: &mut[u8], next_out_offset: &mut usize, total_out: &mut Option, metablock_callback: &mut MetaBlockCallback) -> i32 { if *available_in > (1u32 << 24i32) as (usize) { return 0i32; } if (*s).stream_state_ as (i32) == BrotliEncoderStreamState::BROTLI_STREAM_PROCESSING as (i32) { (*s).remaining_metadata_bytes_ = *available_in as (u32); (*s).stream_state_ = BrotliEncoderStreamState::BROTLI_STREAM_METADATA_HEAD; } if (*s).stream_state_ as (i32) != BrotliEncoderStreamState::BROTLI_STREAM_METADATA_HEAD as (i32) && ((*s).stream_state_ as (i32) != BrotliEncoderStreamState::BROTLI_STREAM_METADATA_BODY as (i32)) { return 0i32; } while 1i32 != 0 { if InjectFlushOrPushOutput(s, available_out, next_out_array, next_out_offset, total_out) != 0 { { continue; } } if (*s).available_out_ != 0usize { { break; } } if (*s).input_pos_ != (*s).last_flush_pos_ { let mut avail_out : usize = (*s).available_out_; let result: i32 = EncodeData(s, 0i32, 1i32, &mut avail_out, metablock_callback); (*s).available_out_ = avail_out; if result == 0 { return 0i32; } { { continue; } } } if (*s).stream_state_ as (i32) == BrotliEncoderStreamState::BROTLI_STREAM_METADATA_HEAD as (i32) { (*s).next_out_ = NextOut::TinyBuf(0); (*s).available_out_ = WriteMetadataHeader(s); (*s).stream_state_ = BrotliEncoderStreamState::BROTLI_STREAM_METADATA_BODY; { { continue; } } } else { if (*s).remaining_metadata_bytes_ == 0u32 { (*s).remaining_metadata_bytes_ = !(0u32); (*s).stream_state_ = BrotliEncoderStreamState::BROTLI_STREAM_PROCESSING; { { break; } } } if *available_out != 0 { let copy: u32 = brotli_min_size_t((*s).remaining_metadata_bytes_ as (usize), *available_out) as (u32); next_out_array[*next_out_offset .. (*next_out_offset + copy as usize)].clone_from_slice( &next_in_array[*next_in_offset ..(*next_in_offset + copy as usize)]); //memcpy(*next_out, *next_in, copy as (usize)); // *next_in = (*next_in).offset(copy as (isize)); *next_in_offset += copy as usize; *available_in = (*available_in).wrapping_sub(copy as (usize)); (*s).remaining_metadata_bytes_ = (*s).remaining_metadata_bytes_.wrapping_sub(copy); *next_out_offset += copy as usize; // *next_out = (*next_out).offset(copy as (isize)); *available_out = (*available_out).wrapping_sub(copy as (usize)); } else { let copy: u32 = brotli_min_uint32_t((*s).remaining_metadata_bytes_, 16u32); (*s).next_out_ = NextOut::TinyBuf(0); GetNextOut!(s)[..(copy as usize)].clone_from_slice( &next_in_array[*next_in_offset ..(*next_in_offset + copy as usize)]); //memcpy((*s).next_out_, *next_in, copy as (usize)); // *next_in = (*next_in).offset(copy as (isize)); *next_in_offset += copy as usize; *available_in = (*available_in).wrapping_sub(copy as (usize)); (*s).remaining_metadata_bytes_ = (*s).remaining_metadata_bytes_.wrapping_sub(copy); (*s).available_out_ = copy as (usize); } { { continue; } } } } 1i32 } fn CheckFlushCompleteInner(stream_state: &mut BrotliEncoderStreamState, available_out: usize, next_out: &mut NextOut) { if *stream_state == BrotliEncoderStreamState::BROTLI_STREAM_FLUSH_REQUESTED && (available_out == 0) { *stream_state = BrotliEncoderStreamState::BROTLI_STREAM_PROCESSING; *next_out = NextOut::None; } } fn CheckFlushComplete(s: &mut BrotliEncoderStateStruct) { CheckFlushCompleteInner(&mut (*s).stream_state_, (*s).available_out_, &mut (*s).next_out_); } fn BrotliEncoderCompressStreamFast( s: &mut BrotliEncoderStateStruct, op: BrotliEncoderOperation, available_in: &mut usize, next_in_array: &[u8], next_in_offset: &mut usize, available_out: &mut usize, next_out_array: &mut [u8], next_out_offset: &mut usize, total_out: &mut Option) -> i32 { let block_size_limit: usize = 1usize << (*s).params.lgwin; let buf_size: usize = brotli_min_size_t(kCompressFragmentTwoPassBlockSize, brotli_min_size_t(*available_in, block_size_limit)); let mut command_buf = >::AllocatedMemory::default(); let mut literal_buf = >::AllocatedMemory::default(); if (*s).params.quality != 0i32 && ((*s).params.quality != 1i32) { return 0i32; } if (*s).params.quality == 1i32 { if (*s).command_buf_.slice().len() == 0 && (buf_size == kCompressFragmentTwoPassBlockSize) { (*s).command_buf_ = >::alloc_cell(&mut s.m8, kCompressFragmentTwoPassBlockSize); (*s).literal_buf_ = >::alloc_cell(&mut s.m8, kCompressFragmentTwoPassBlockSize); } if (*s).command_buf_.slice().len() != 0 { command_buf = core::mem::replace(&mut (*s).command_buf_, >::AllocatedMemory::default()); literal_buf = core::mem::replace(&mut (*s).literal_buf_, >::AllocatedMemory::default()); } else { command_buf = >::alloc_cell(&mut s.m8, buf_size); literal_buf = >::alloc_cell(&mut s.m8, buf_size); } } while 1i32 != 0 { if InjectFlushOrPushOutput(s, available_out, next_out_array, next_out_offset, total_out) != 0 { { continue; } } if (*s).available_out_ == 0usize && ((*s).stream_state_ as (i32) == BrotliEncoderStreamState::BROTLI_STREAM_PROCESSING as (i32)) && (*available_in != 0usize || op as (i32) != BrotliEncoderOperation::BROTLI_OPERATION_PROCESS as (i32)) { let block_size: usize = brotli_min_size_t(block_size_limit, *available_in); let is_last: i32 = (*available_in == block_size && (op as (i32) == BrotliEncoderOperation::BROTLI_OPERATION_FINISH as (i32))) as (i32); let force_flush: i32 = (*available_in == block_size && (op as (i32) == BrotliEncoderOperation::BROTLI_OPERATION_FLUSH as (i32))) as (i32); let max_out_size: usize = (2usize).wrapping_mul(block_size).wrapping_add(503usize); let mut inplace: i32 = 1i32; let storage: &mut [u8]; let mut storage_ix: usize = (*s).last_bytes_bits_ as (usize); let mut table_size: usize = 0; let table: &mut [i32]; if force_flush != 0 && (block_size == 0usize) { (*s).stream_state_ = BrotliEncoderStreamState::BROTLI_STREAM_FLUSH_REQUESTED; { { continue; } } } if max_out_size <= *available_out { storage = &mut next_out_array[*next_out_offset..];//GetNextOut!(s); } else { inplace = 0i32; GetBrotliStorage(s, max_out_size); storage = (*s).storage_.slice_mut(); } storage[(0usize)] = (*s).last_bytes_ as u8; storage[(1usize)] = ((*s).last_bytes_ >> 8) as u8; table = GetHashTable!(s, (*s).params.quality, block_size, &mut table_size); if (*s).params.quality == 0i32 { BrotliCompressFragmentFast(&mut s.m8, &(next_in_array)[*next_in_offset..], block_size, is_last, table, table_size, &mut (*s).cmd_depths_[..], &mut (*s).cmd_bits_[..], &mut (*s).cmd_code_numbits_, &mut (*s).cmd_code_[..], &mut storage_ix, storage); } else { BrotliCompressFragmentTwoPass(&mut s.m8, &(next_in_array)[*next_in_offset..], block_size, is_last, command_buf.slice_mut(), literal_buf.slice_mut(), table, table_size, &mut storage_ix, storage); } *next_in_offset += block_size as usize; *available_in = (*available_in).wrapping_sub(block_size); if inplace != 0 { let out_bytes: usize = storage_ix >> 3i32; 0i32; 0i32; *next_out_offset += out_bytes as (usize); *available_out = (*available_out).wrapping_sub(out_bytes); (*s).total_out_ = (*s).total_out_.wrapping_add(out_bytes as u64); if let &mut Some(ref mut total_out_inner) = total_out { *total_out_inner = (*s).total_out_ as usize; } } else { let out_bytes: usize = storage_ix >> 3i32; (*s).next_out_ = NextOut::DynamicStorage(0); (*s).available_out_ = out_bytes; } (*s).last_bytes_ = storage[((storage_ix >> 3i32) as (usize))] as u16 | ( ((storage[1 + ((storage_ix >> 3i32) as (usize))] as u16)<< 8)); (*s).last_bytes_bits_ = (storage_ix & 7u32 as (usize)) as (u8); if force_flush != 0 { (*s).stream_state_ = BrotliEncoderStreamState::BROTLI_STREAM_FLUSH_REQUESTED; } if is_last != 0 { (*s).stream_state_ = BrotliEncoderStreamState::BROTLI_STREAM_FINISHED; } { { continue; } } } { { break; } } } if command_buf.slice().len() == kCompressFragmentTwoPassBlockSize && s.command_buf_.slice().len() == 0 { // undo temporary aliasing of command_buf and literal_buf (*s).command_buf_ = core::mem::replace(&mut command_buf, >::AllocatedMemory::default()); (*s).literal_buf_ = core::mem::replace(&mut literal_buf, >::AllocatedMemory::default()); } else { >::free_cell(&mut s.m8, command_buf); >::free_cell(&mut s.m8, literal_buf); } CheckFlushComplete(s); 1i32 } fn RemainingInputBlockSize(s: &mut BrotliEncoderStateStruct) -> usize { let delta: u64 = UnprocessedInputSize(s); let block_size: usize = InputBlockSize(s); if delta >= block_size as u64 { return 0usize; } (block_size as u64).wrapping_sub(delta) as usize } pub fn BrotliEncoderCompressStream, &mut [interface::StaticCommand], interface::InputPair, &mut Alloc)>( s: &mut BrotliEncoderStateStruct, op: BrotliEncoderOperation, available_in: &mut usize, next_in_array: &[u8], next_in_offset: &mut usize, available_out: &mut usize, next_out_array: &mut [u8], next_out_offset: &mut usize, total_out: &mut Option, metablock_callback: &mut MetablockCallback) -> i32 { if EnsureInitialized(s) == 0 { return 0i32; } if (*s).remaining_metadata_bytes_ != !(0u32) { if *available_in != (*s).remaining_metadata_bytes_ as (usize) { return 0i32; } if op as (i32) != BrotliEncoderOperation::BROTLI_OPERATION_EMIT_METADATA as (i32) { return 0i32; } } if op as (i32) == BrotliEncoderOperation::BROTLI_OPERATION_EMIT_METADATA as (i32) { UpdateSizeHint(s, 0usize); return ProcessMetadata(s, available_in, next_in_array, next_in_offset, available_out, next_out_array, next_out_offset, total_out, metablock_callback); } if (*s).stream_state_ as (i32) == BrotliEncoderStreamState::BROTLI_STREAM_METADATA_HEAD as (i32) || (*s).stream_state_ as (i32) == BrotliEncoderStreamState::BROTLI_STREAM_METADATA_BODY as (i32) { return 0i32; } if (*s).stream_state_ as (i32) != BrotliEncoderStreamState::BROTLI_STREAM_PROCESSING as (i32) && (*available_in != 0usize) { return 0i32; } if ((*s).params.quality == 0i32 || (*s).params.quality == 1i32) && !s.params.catable { // this part of the code does not support concatability return BrotliEncoderCompressStreamFast(s, op, available_in, next_in_array, next_in_offset, available_out, next_out_array, next_out_offset, total_out); } while 1i32 != 0 { let remaining_block_size: usize = RemainingInputBlockSize(s); if remaining_block_size != 0usize && (*available_in != 0usize) { let copy_input_size: usize = brotli_min_size_t(remaining_block_size, *available_in); CopyInputToRingBuffer(s, copy_input_size, &next_in_array[*next_in_offset..]); *next_in_offset += copy_input_size as (usize); *available_in = (*available_in).wrapping_sub(copy_input_size); { { continue; } } } if InjectFlushOrPushOutput(s, available_out, next_out_array, next_out_offset, total_out) != 0 { { continue; } } if (*s).available_out_ == 0usize && ((*s).stream_state_ as (i32) == BrotliEncoderStreamState::BROTLI_STREAM_PROCESSING as (i32)) { if remaining_block_size == 0usize || op as (i32) != BrotliEncoderOperation::BROTLI_OPERATION_PROCESS as (i32) { let is_last: i32 = if !!(*available_in == 0usize && (op as (i32) == BrotliEncoderOperation::BROTLI_OPERATION_FINISH as (i32))) { 1i32 } else { 0i32 }; let force_flush: i32 = if !!(*available_in == 0usize && (op as (i32) == BrotliEncoderOperation::BROTLI_OPERATION_FLUSH as (i32))) { 1i32 } else { 0i32 }; let result: i32; UpdateSizeHint(s, *available_in); let mut avail_out = (*s).available_out_; result = EncodeData(s, is_last, force_flush, &mut avail_out, metablock_callback); (*s).available_out_ = avail_out; //this function set next_out to &storage[0] if result == 0 { return 0i32; } if force_flush != 0 { (*s).stream_state_ = BrotliEncoderStreamState::BROTLI_STREAM_FLUSH_REQUESTED; } if is_last != 0 { (*s).stream_state_ = BrotliEncoderStreamState::BROTLI_STREAM_FINISHED; } { { continue; } } } } { { break; } } } CheckFlushComplete(s); 1i32 } pub fn BrotliEncoderIsFinished(s: &BrotliEncoderStateStruct) -> i32 { if !!((*s).stream_state_ as (i32) == BrotliEncoderStreamState::BROTLI_STREAM_FINISHED as (i32) && (BrotliEncoderHasMoreOutput(s) == 0)) { 1i32 } else { 0i32 } } pub fn BrotliEncoderHasMoreOutput( s: &BrotliEncoderStateStruct) -> i32 { if !!((*s).available_out_ != 0usize) { 1i32 } else { 0i32 } } pub fn BrotliEncoderTakeOutput<'a, Alloc:BrotliAlloc>(s: &'a mut BrotliEncoderStateStruct, size: &mut usize) -> &'a [u8] { let mut consumed_size: usize = (*s).available_out_; let mut result: &[u8] = GetNextOut!(*s); if *size != 0 { consumed_size = brotli_min_size_t(*size, (*s).available_out_); } if consumed_size != 0 { (*s).next_out_ = NextOutIncrement(&(*s).next_out_, consumed_size as i32); (*s).available_out_ = (*s).available_out_.wrapping_sub(consumed_size); (*s).total_out_ = (*s).total_out_.wrapping_add(consumed_size as u64); CheckFlushCompleteInner(&mut (*s).stream_state_, (*s).available_out_, &mut (*s).next_out_); *size = consumed_size; } else { *size = 0usize; result = &[]; } result } pub fn BrotliEncoderVersion() -> u32 { 0x1000f01u32 } pub fn BrotliEncoderInputBlockSize(s: &mut BrotliEncoderStateStruct) -> usize { InputBlockSize(s) } pub fn BrotliEncoderCopyInputToRingBuffer(s: &mut BrotliEncoderStateStruct, input_size: usize, input_buffer: &[u8]) { CopyInputToRingBuffer(s, input_size, input_buffer); } pub fn BrotliEncoderWriteData<'a, Alloc: BrotliAlloc, MetablockCallback:FnMut(&mut interface::PredictionModeContextMap, &mut [interface::StaticCommand], interface::InputPair, &mut Alloc)>( s: &'a mut BrotliEncoderStateStruct, is_last: i32, force_flush: i32, out_size: &mut usize, output: &'a mut &'a mut [u8], metablock_callback: &mut MetablockCallback) -> i32 { let ret = EncodeData(s, is_last, force_flush, out_size, metablock_callback); *output = (*s).storage_.slice_mut(); ret } brotli-3.4.0/src/enc/entropy_encode.rs000064400000000000000000000526541046102023000160560ustar 00000000000000/* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Entropy encoding (Huffman) utilities. */ #![allow(dead_code)] use super::util::brotli_max_uint32_t; #[derive(Clone, Copy)] pub struct HuffmanTree { pub total_count_: u32, pub index_left_: i16, pub index_right_or_value_: i16, } impl Default for HuffmanTree { fn default() -> HuffmanTree { HuffmanTree { total_count_: 0, index_left_: 0, index_right_or_value_: 0, } } } pub fn NewHuffmanTree(count: u32, left: i16, right: i16) -> HuffmanTree { return HuffmanTree { total_count_: count, index_left_: left, index_right_or_value_: right, }; } pub fn InitHuffmanTree(xself: &mut HuffmanTree, count: u32, left: i16, right: i16) { *xself = NewHuffmanTree(count, left, right); } pub fn BrotliSetDepth(p0: i32, pool: &mut [HuffmanTree], depth: &mut [u8], max_depth: i32) -> bool { let mut stack: [i32; 16] = [0; 16]; let mut level: i32 = 0i32; let mut p: i32 = p0; 0i32; stack[0usize] = -1i32; loop { if (pool[(p as (usize))]).index_left_ as (i32) >= 0i32 { level = level + 1; if level > max_depth { return false; } stack[level as (usize)] = (pool[(p as (usize))]).index_right_or_value_ as (i32); p = (pool[(p as (usize))]).index_left_ as (i32); { { continue; } } } else { let pp = pool[(p as (usize))]; depth[((pp).index_right_or_value_ as (usize))] = level as (u8); } while level >= 0i32 && (stack[level as (usize)] == -1i32) { level = level - 1; } if level < 0i32 { return true; } p = stack[level as (usize)]; stack[level as (usize)] = -1i32; } } pub trait HuffmanComparator { fn Cmp(self: &Self, a: &HuffmanTree, b: &HuffmanTree) -> bool; } pub struct SortHuffmanTree {} impl HuffmanComparator for SortHuffmanTree { fn Cmp(self: &Self, v0: &HuffmanTree, v1: &HuffmanTree) -> bool { if (*v0).total_count_ != (*v1).total_count_ { if !!((*v0).total_count_ < (*v1).total_count_) { true } else { false } } else if !!((*v0).index_right_or_value_ as (i32) > (*v1).index_right_or_value_ as (i32)) { true } else { false } } } pub fn SortHuffmanTreeItems(items: &mut [HuffmanTree], n: usize, comparator: Comparator) { static gaps: [usize; 6] = [132usize, 57usize, 23usize, 10usize, 4usize, 1usize]; if n < 13usize { let mut i: usize; i = 1usize; while i < n { { let mut tmp: HuffmanTree = items[(i as (usize))]; let mut k: usize = i; let mut j: usize = i.wrapping_sub(1usize); while comparator.Cmp(&mut tmp, &mut items[(j as (usize))]) { items[(k as (usize))] = items[(j as (usize))]; k = j; if { let _old = j; j = j.wrapping_sub(1 as (usize)); _old } == 0 { { break; } } } items[(k as (usize))] = tmp; } i = i.wrapping_add(1 as (usize)); } } else { let mut g: i32 = if n < 57usize { 2i32 } else { 0i32 }; while g < 6i32 { { let gap: usize = gaps[g as (usize)]; let mut i: usize; i = gap; while i < n { { let mut j: usize = i; let mut tmp: HuffmanTree = items[(i as (usize))]; while j >= gap && (comparator.Cmp(&mut tmp, &mut items[(j.wrapping_sub(gap) as (usize))])) { { items[(j as (usize))] = items[(j.wrapping_sub(gap) as (usize))]; } j = j.wrapping_sub(gap); } items[(j as (usize))] = tmp; } i = i.wrapping_add(1 as (usize)); } } g = g + 1; } } } /* This function will create a Huffman tree. The catch here is that the tree cannot be arbitrarily deep. Brotli specifies a maximum depth of 15 bits for "code trees" and 7 bits for "code length code trees." count_limit is the value that is to be faked as the minimum value and this minimum value is raised until the tree matches the maximum length requirement. This algorithm is not of excellent performance for very long data blocks, especially when population counts are longer than 2**tree_limit, but we are not planning to use this with extremely long blocks. See https://en.wikipedia.org/wiki/Huffman_coding */ pub fn BrotliCreateHuffmanTree(data: &[u32], length: usize, tree_limit: i32, tree: &mut [HuffmanTree], depth: &mut [u8]) { let mut count_limit: u32; let mut sentinel: HuffmanTree = HuffmanTree { total_count_: 0, index_left_: 0, index_right_or_value_: 0, }; InitHuffmanTree(&mut sentinel, !(0u32), -1i32 as (i16), -1i32 as (i16)); count_limit = 1u32; 'break1: loop { { let mut n: usize = 0usize; let mut i: usize; let mut j: usize; let mut k: usize; i = length; while i != 0usize { i = i.wrapping_sub(1 as (usize)); if data[(i as (usize))] != 0 { let count: u32 = brotli_max_uint32_t(data[(i as (usize))], count_limit); InitHuffmanTree(&mut tree[({ let _old = n; n = n.wrapping_add(1 as (usize)); _old } as (usize))], count, -1i32 as (i16), i as (i16)); } } if n == 1usize { depth[((tree[(0usize)]).index_right_or_value_ as (usize))] = 1i32 as (u8); { { break 'break1; } } } SortHuffmanTreeItems(tree, n, SortHuffmanTree {}); tree[(n as (usize))] = sentinel; tree[(n.wrapping_add(1usize) as (usize))] = sentinel; i = 0usize; j = n.wrapping_add(1usize); k = n.wrapping_sub(1usize); while k != 0usize { { let left: usize; let right: usize; if (tree[(i as (usize))]).total_count_ <= (tree[(j as (usize))]).total_count_ { left = i; i = i.wrapping_add(1 as (usize)); } else { left = j; j = j.wrapping_add(1 as (usize)); } if (tree[(i as (usize))]).total_count_ <= (tree[(j as (usize))]).total_count_ { right = i; i = i.wrapping_add(1 as (usize)); } else { right = j; j = j.wrapping_add(1 as (usize)); } { let j_end: usize = (2usize).wrapping_mul(n).wrapping_sub(k); (tree[(j_end as (usize))]).total_count_ = (tree[(left as (usize))]) .total_count_ .wrapping_add((tree[(right as (usize))]).total_count_); (tree[(j_end as (usize))]).index_left_ = left as (i16); (tree[(j_end as (usize))]).index_right_or_value_ = right as (i16); tree[(j_end.wrapping_add(1usize) as (usize))] = sentinel; } } k = k.wrapping_sub(1 as (usize)); } if BrotliSetDepth((2usize).wrapping_mul(n).wrapping_sub(1usize) as (i32), tree, depth, tree_limit) { { break 'break1; } } } count_limit = count_limit.wrapping_mul(2u32); } } pub fn BrotliOptimizeHuffmanCountsForRle(mut length: usize, counts: &mut [u32], good_for_rle: &mut [u8]) { let mut nonzero_count: usize = 0usize; let mut stride: usize; let mut limit: usize; let mut sum: usize; let streak_limit: usize = 1240usize; let mut i: usize; i = 0usize; while i < length { { if counts[(i as (usize))] != 0 { nonzero_count = nonzero_count.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } if nonzero_count < 16usize { return; } while length != 0usize && (counts[(length.wrapping_sub(1usize) as (usize))] == 0u32) { length = length.wrapping_sub(1 as (usize)); } if length == 0usize { return; } { let mut nonzeros: usize = 0usize; let mut smallest_nonzero: u32 = (1i32 << 30i32) as (u32); i = 0usize; while i < length { { if counts[(i as (usize))] != 0u32 { nonzeros = nonzeros.wrapping_add(1 as (usize)); if smallest_nonzero > counts[(i as (usize))] { smallest_nonzero = counts[(i as (usize))]; } } } i = i.wrapping_add(1 as (usize)); } if nonzeros < 5usize { return; } if smallest_nonzero < 4u32 { let zeros: usize = length.wrapping_sub(nonzeros); if zeros < 6usize { i = 1usize; while i < length.wrapping_sub(1usize) { { if counts[(i.wrapping_sub(1usize) as (usize))] != 0u32 && (counts[(i as (usize))] == 0u32) && (counts[(i.wrapping_add(1usize) as (usize))] != 0u32) { counts[(i as (usize))] = 1u32; } } i = i.wrapping_add(1 as (usize)); } } } if nonzeros < 28usize { return; } } for rle_item in good_for_rle.iter_mut() { *rle_item = 0; } { let mut symbol: u32 = counts[(0usize)]; let mut step: usize = 0usize; i = 0usize; while i <= length { { if i == length || counts[(i as (usize))] != symbol { if symbol == 0u32 && (step >= 5usize) || symbol != 0u32 && (step >= 7usize) { let mut k: usize; k = 0usize; while k < step { { good_for_rle[(i.wrapping_sub(k).wrapping_sub(1usize) as (usize))] = 1i32 as (u8); } k = k.wrapping_add(1 as (usize)); } } step = 1usize; if i != length { symbol = counts[(i as (usize))]; } } else { step = step.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } } stride = 0usize; limit = (256u32) .wrapping_mul((counts[(0usize)]).wrapping_add(counts[(1usize)]).wrapping_add(counts [(2usize)])) .wrapping_div(3u32) .wrapping_add(420u32) as (usize); sum = 0usize; i = 0usize; while i <= length { { if i == length || good_for_rle[(i as (usize))] != 0 || i != 0usize && (good_for_rle[(i.wrapping_sub(1usize) as (usize))] != 0) || ((256u32).wrapping_mul(counts[(i as (usize))]) as (usize)) .wrapping_sub(limit) .wrapping_add(streak_limit) >= (2usize).wrapping_mul(streak_limit) { if stride >= 4usize || stride >= 3usize && (sum == 0usize) { let mut k: usize; let mut count: usize = sum.wrapping_add(stride.wrapping_div(2usize)).wrapping_div(stride); if count == 0usize { count = 1usize; } if sum == 0usize { count = 0usize; } k = 0usize; while k < stride { { counts[(i.wrapping_sub(k).wrapping_sub(1usize) as (usize))] = count as (u32); } k = k.wrapping_add(1 as (usize)); } } stride = 0usize; sum = 0usize; if i < length.wrapping_sub(2usize) { limit = (256u32) .wrapping_mul((counts[(i as (usize))]) .wrapping_add(counts[(i.wrapping_add(1usize) as (usize))]) .wrapping_add(counts[(i.wrapping_add(2usize) as (usize))])) .wrapping_div(3u32) .wrapping_add(420u32) as (usize); } else if i < length { limit = (256u32).wrapping_mul(counts[(i as (usize))]) as (usize); } else { limit = 0usize; } } stride = stride.wrapping_add(1 as (usize)); if i != length { sum = sum.wrapping_add(counts[(i as (usize))] as (usize)); if stride >= 4usize { limit = (256usize) .wrapping_mul(sum) .wrapping_add(stride.wrapping_div(2usize)) .wrapping_div(stride); } if stride == 4usize { limit = limit.wrapping_add(120usize); } } } i = i.wrapping_add(1 as (usize)); } } pub fn DecideOverRleUse(depth: &[u8], length: usize, use_rle_for_non_zero: &mut i32, use_rle_for_zero: &mut i32) { let mut total_reps_zero: usize = 0usize; let mut total_reps_non_zero: usize = 0usize; let mut count_reps_zero: usize = 1usize; let mut count_reps_non_zero: usize = 1usize; let mut i: usize; i = 0usize; while i < length { let value: u8 = depth[(i as (usize))]; let mut reps: usize = 1usize; let mut k: usize; k = i.wrapping_add(1usize); while k < length && (depth[(k as (usize))] as (i32) == value as (i32)) { { reps = reps.wrapping_add(1 as (usize)); } k = k.wrapping_add(1 as (usize)); } if reps >= 3usize && (value as (i32) == 0i32) { total_reps_zero = total_reps_zero.wrapping_add(reps); count_reps_zero = count_reps_zero.wrapping_add(1 as (usize)); } if reps >= 4usize && (value as (i32) != 0i32) { total_reps_non_zero = total_reps_non_zero.wrapping_add(reps); count_reps_non_zero = count_reps_non_zero.wrapping_add(1 as (usize)); } i = i.wrapping_add(reps); } *use_rle_for_non_zero = if !!(total_reps_non_zero > count_reps_non_zero.wrapping_mul(2usize)) { 1i32 } else { 0i32 }; *use_rle_for_zero = if !!(total_reps_zero > count_reps_zero.wrapping_mul(2usize)) { 1i32 } else { 0i32 }; } fn Reverse(v: &mut [u8], mut start: usize, mut end: usize) { end = end.wrapping_sub(1 as (usize)); while start < end { let tmp: u8 = v[(start as (usize))]; v[(start as (usize))] = v[(end as (usize))]; v[(end as (usize))] = tmp; start = start.wrapping_add(1 as (usize)); end = end.wrapping_sub(1 as (usize)); } } fn BrotliWriteHuffmanTreeRepetitions(previous_value: u8, value: u8, mut repetitions: usize, tree_size: &mut usize, tree: &mut [u8], extra_bits_data: &mut [u8]) { 0i32; if previous_value as (i32) != value as (i32) { tree[(*tree_size as (usize))] = value; extra_bits_data[(*tree_size as (usize))] = 0i32 as (u8); *tree_size = (*tree_size).wrapping_add(1 as (usize)); repetitions = repetitions.wrapping_sub(1 as (usize)); } if repetitions == 7usize { tree[(*tree_size as (usize))] = value; extra_bits_data[(*tree_size as (usize))] = 0i32 as (u8); *tree_size = (*tree_size).wrapping_add(1 as (usize)); repetitions = repetitions.wrapping_sub(1 as (usize)); } if repetitions < 3usize { let mut i: usize; i = 0usize; while i < repetitions { { tree[(*tree_size as (usize))] = value; extra_bits_data[(*tree_size as (usize))] = 0i32 as (u8); *tree_size = (*tree_size).wrapping_add(1 as (usize)); } i = i.wrapping_add(1 as (usize)); } } else { let start: usize = *tree_size; repetitions = repetitions.wrapping_sub(3usize); while 1i32 != 0 { tree[(*tree_size as (usize))] = 16i32 as (u8); extra_bits_data[(*tree_size as (usize))] = (repetitions & 0x3usize) as (u8); *tree_size = (*tree_size).wrapping_add(1 as (usize)); repetitions = repetitions >> 2i32; if repetitions == 0usize { { break; } } repetitions = repetitions.wrapping_sub(1 as (usize)); } Reverse(tree, start, *tree_size); Reverse(extra_bits_data, start, *tree_size); } } fn BrotliWriteHuffmanTreeRepetitionsZeros(mut repetitions: usize, tree_size: &mut usize, tree: &mut [u8], extra_bits_data: &mut [u8]) { if repetitions == 11usize { tree[(*tree_size as (usize))] = 0i32 as (u8); extra_bits_data[(*tree_size as (usize))] = 0i32 as (u8); *tree_size = (*tree_size).wrapping_add(1 as (usize)); repetitions = repetitions.wrapping_sub(1 as (usize)); } if repetitions < 3usize { let mut i: usize; i = 0usize; while i < repetitions { { tree[(*tree_size as (usize))] = 0i32 as (u8); extra_bits_data[(*tree_size as (usize))] = 0i32 as (u8); *tree_size = (*tree_size).wrapping_add(1 as (usize)); } i = i.wrapping_add(1 as (usize)); } } else { let start: usize = *tree_size; repetitions = repetitions.wrapping_sub(3usize); while 1i32 != 0 { tree[(*tree_size as (usize))] = 17i32 as (u8); extra_bits_data[(*tree_size as (usize))] = (repetitions & 0x7usize) as (u8); *tree_size = (*tree_size).wrapping_add(1 as (usize)); repetitions = repetitions >> 3i32; if repetitions == 0usize { { break; } } repetitions = repetitions.wrapping_sub(1 as (usize)); } Reverse(tree, start, *tree_size); Reverse(extra_bits_data, start, *tree_size); } } pub fn BrotliWriteHuffmanTree(depth: &[u8], length: usize, tree_size: &mut usize, tree: &mut [u8], extra_bits_data: &mut [u8]) { let mut previous_value: u8 = 8i32 as (u8); let mut i: usize; let mut use_rle_for_non_zero: i32 = 0i32; let mut use_rle_for_zero: i32 = 0i32; let mut new_length: usize = length; i = 0usize; 'break27: while i < length { { if depth[(length.wrapping_sub(i).wrapping_sub(1usize) as (usize))] as (i32) == 0i32 { new_length = new_length.wrapping_sub(1 as (usize)); } else { break 'break27; } } i = i.wrapping_add(1 as (usize)); } if length > 50usize { DecideOverRleUse(depth, new_length, &mut use_rle_for_non_zero, &mut use_rle_for_zero); } i = 0usize; while i < new_length { let value: u8 = depth[(i as (usize))]; let mut reps: usize = 1usize; if value as (i32) != 0i32 && (use_rle_for_non_zero != 0) || value as (i32) == 0i32 && (use_rle_for_zero != 0) { let mut k: usize; k = i.wrapping_add(1usize); while k < new_length && (depth[(k as (usize))] as (i32) == value as (i32)) { { reps = reps.wrapping_add(1 as (usize)); } k = k.wrapping_add(1 as (usize)); } } if value as (i32) == 0i32 { BrotliWriteHuffmanTreeRepetitionsZeros(reps, tree_size, tree, extra_bits_data); } else { BrotliWriteHuffmanTreeRepetitions(previous_value, value, reps, tree_size, tree, extra_bits_data); previous_value = value; } i = i.wrapping_add(reps); } } fn BrotliReverseBits(num_bits: usize, mut bits: u16) -> u16 { static kLut: [usize; 16] = [0x0usize, 0x8usize, 0x4usize, 0xcusize, 0x2usize, 0xausize, 0x6usize, 0xeusize, 0x1usize, 0x9usize, 0x5usize, 0xdusize, 0x3usize, 0xbusize, 0x7usize, 0xfusize]; let mut retval: usize = kLut[(bits as (i32) & 0xfi32) as (usize)]; let mut i: usize; i = 4usize; while i < num_bits { { retval = retval << 4i32; bits = (bits as (i32) >> 4i32) as (u16); retval = retval | kLut[(bits as (i32) & 0xfi32) as (usize)]; } i = i.wrapping_add(4usize); } retval = retval >> ((0usize).wrapping_sub(num_bits) & 0x3usize); retval as (u16) } const MAX_HUFFMAN_BITS: usize = 16; pub fn BrotliConvertBitDepthsToSymbols(depth: &[u8], len: usize, bits: &mut [u16]) { /* In Brotli, all bit depths are [1..15] 0 bit depth means that the symbol does not exist. */ let mut bl_count: [u16; MAX_HUFFMAN_BITS] = [0; MAX_HUFFMAN_BITS]; let mut next_code: [u16; MAX_HUFFMAN_BITS] = [0; MAX_HUFFMAN_BITS]; let mut i: usize; let mut code: i32 = 0i32; i = 0usize; while i < len { { let _rhs = 1; let _lhs = &mut bl_count[depth[(i as (usize))] as (usize)]; *_lhs = (*_lhs as (i32) + _rhs) as (u16); } i = i.wrapping_add(1 as (usize)); } bl_count[0usize] = 0i32 as (u16); next_code[0usize] = 0i32 as (u16); i = 1usize; while i < MAX_HUFFMAN_BITS { { code = code + bl_count[i.wrapping_sub(1usize)] as (i32) << 1i32; next_code[i] = code as (u16); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < len { { if depth[(i as (usize))] != 0 { bits[(i as (usize))] = BrotliReverseBits(depth[(i as (usize))] as (usize), { let _rhs = 1; let _lhs = &mut next_code[depth[(i as (usize))] as (usize)]; let _old = *_lhs; *_lhs = (*_lhs as (i32) + _rhs) as (u16); _old }); } } i = i.wrapping_add(1 as (usize)); } } brotli-3.4.0/src/enc/fast_log.rs000064400000000000000000000360251046102023000146310ustar 00000000000000#[allow(dead_code)] static mut kLog2Table: [f32; 256] = [0.0000000000000000f32, 0.0000000000000000f32, 1.0000000000000000f32, 1.5849625007211563f32, 2.0000000000000000f32, 2.3219280948873622f32, 2.5849625007211561f32, 2.8073549220576042f32, 3.0000000000000000f32, 3.1699250014423126f32, 3.3219280948873626f32, 3.4594316186372978f32, 3.5849625007211565f32, 3.7004397181410922f32, 3.8073549220576037f32, 3.9068905956085187f32, 4.0000000000000000f32, 4.0874628412503400f32, 4.1699250014423122f32, 4.2479275134435852f32, 4.3219280948873626f32, 4.3923174227787607f32, 4.4594316186372973f32, 4.5235619560570131f32, 4.5849625007211570f32, 4.6438561897747244f32, 4.7004397181410926f32, 4.7548875021634691f32, 4.8073549220576037f32, 4.8579809951275728f32, 4.9068905956085187f32, 4.9541963103868758f32, 5.0000000000000000f32, 5.0443941193584534f32, 5.0874628412503400f32, 5.1292830169449664f32, 5.1699250014423122f32, 5.2094533656289501f32, 5.2479275134435852f32, 5.2854022188622487f32, 5.3219280948873626f32, 5.3575520046180838f32, 5.3923174227787607f32, 5.4262647547020979f32, 5.4594316186372973f32, 5.4918530963296748f32, 5.5235619560570131f32, 5.5545888516776376f32, 5.5849625007211570f32, 5.6147098441152083f32, 5.6438561897747244f32, 5.6724253419714961f32, 5.7004397181410926f32, 5.7279204545631996f32, 5.7548875021634691f32, 5.7813597135246599f32, 5.8073549220576046f32, 5.8328900141647422f32, 5.8579809951275719f32, 5.8826430493618416f32, 5.9068905956085187f32, 5.9307373375628867f32, 5.9541963103868758f32, 5.9772799234999168f32, 6.0000000000000000f32, 6.0223678130284544f32, 6.0443941193584534f32, 6.0660891904577721f32, 6.0874628412503400f32, 6.1085244567781700f32, 6.1292830169449672f32, 6.1497471195046822f32, 6.1699250014423122f32, 6.1898245588800176f32, 6.2094533656289510f32, 6.2288186904958804f32, 6.2479275134435861f32, 6.2667865406949019f32, 6.2854022188622487f32, 6.3037807481771031f32, 6.3219280948873617f32, 6.3398500028846252f32, 6.3575520046180847f32, 6.3750394313469254f32, 6.3923174227787598f32, 6.4093909361377026f32, 6.4262647547020979f32, 6.4429434958487288f32, 6.4594316186372982f32, 6.4757334309663976f32, 6.4918530963296748f32, 6.5077946401986964f32, 6.5235619560570131f32, 6.5391588111080319f32, 6.5545888516776376f32, 6.5698556083309478f32, 6.5849625007211561f32, 6.5999128421871278f32, 6.6147098441152092f32, 6.6293566200796095f32, 6.6438561897747253f32, 6.6582114827517955f32, 6.6724253419714952f32, 6.6865005271832185f32, 6.7004397181410917f32, 6.7142455176661224f32, 6.7279204545631988f32, 6.7414669864011465f32, 6.7548875021634691f32, 6.7681843247769260f32, 6.7813597135246599f32, 6.7944158663501062f32, 6.8073549220576037f32, 6.8201789624151887f32, 6.8328900141647422f32, 6.8454900509443757f32, 6.8579809951275719f32, 6.8703647195834048f32, 6.8826430493618416f32, 6.8948177633079437f32, 6.9068905956085187f32, 6.9188632372745955f32, 6.9307373375628867f32, 6.9425145053392399f32, 6.9541963103868758f32, 6.9657842846620879f32, 6.9772799234999168f32, 6.9886846867721664f32, 7.0000000000000000f32, 7.0112272554232540f32, 7.0223678130284544f32, 7.0334230015374501f32, 7.0443941193584534f32, 7.0552824355011898f32, 7.0660891904577721f32, 7.0768155970508317f32, 7.0874628412503400f32, 7.0980320829605272f32, 7.1085244567781700f32, 7.1189410727235076f32, 7.1292830169449664f32, 7.1395513523987937f32, 7.1497471195046822f32, 7.1598713367783891f32, 7.1699250014423130f32, 7.1799090900149345f32, 7.1898245588800176f32, 7.1996723448363644f32, 7.2094533656289492f32, 7.2191685204621621f32, 7.2288186904958804f32, 7.2384047393250794f32, 7.2479275134435861f32, 7.2573878426926521f32, 7.2667865406949019f32, 7.2761244052742384f32, 7.2854022188622487f32, 7.2946207488916270f32, 7.3037807481771031f32, 7.3128829552843557f32, 7.3219280948873617f32, 7.3309168781146177f32, 7.3398500028846243f32, 7.3487281542310781f32, 7.3575520046180847f32, 7.3663222142458151f32, 7.3750394313469254f32, 7.3837042924740528f32, 7.3923174227787607f32, 7.4008794362821844f32, 7.4093909361377026f32, 7.4178525148858991f32, 7.4262647547020979f32, 7.4346282276367255f32, 7.4429434958487288f32, 7.4512111118323299f32, 7.4594316186372973f32, 7.4676055500829976f32, 7.4757334309663976f32, 7.4838157772642564f32, 7.4918530963296748f32, 7.4998458870832057f32, 7.5077946401986964f32, 7.5156998382840436f32, 7.5235619560570131f32, 7.5313814605163119f32, 7.5391588111080319f32, 7.5468944598876373f32, 7.5545888516776376f32, 7.5622424242210728f32, 7.5698556083309478f32, 7.5774288280357487f32, 7.5849625007211561f32, 7.5924570372680806f32, 7.5999128421871278f32, 7.6073303137496113f32, 7.6147098441152075f32, 7.6220518194563764f32, 7.6293566200796095f32, 7.6366246205436488f32, 7.6438561897747244f32, 7.6510516911789290f32, 7.6582114827517955f32, 7.6653359171851765f32, 7.6724253419714952f32, 7.6794800995054464f32, 7.6865005271832185f32, 7.6934869574993252f32, 7.7004397181410926f32, 7.7073591320808825f32, 7.7142455176661224f32, 7.7210991887071856f32, 7.7279204545631996f32, 7.7347096202258392f32, 7.7414669864011465f32, 7.7481928495894596f32, 7.7548875021634691f32, 7.7615512324444795f32, 7.7681843247769260f32, 7.7747870596011737f32, 7.7813597135246608f32, 7.7879025593914317f32, 7.7944158663501062f32, 7.8008998999203047f32, 7.8073549220576037f32, 7.8137811912170374f32, 7.8201789624151887f32, 7.8265484872909159f32, 7.8328900141647422f32, 7.8392037880969445f32, 7.8454900509443757f32, 7.8517490414160571f32, 7.8579809951275719f32, 7.8641861446542798f32, 7.8703647195834048f32, 7.8765169465650002f32, 7.8826430493618425f32, 7.8887432488982601f32, 7.8948177633079446f32, 7.9008668079807496f32, 7.9068905956085187f32, 7.9128893362299619f32, 7.9188632372745955f32, 7.9248125036057813f32, 7.9307373375628867f32, 7.9366379390025719f32, 7.9425145053392399f32, 7.9483672315846778f32, 7.9541963103868758f32, 7.9600019320680806f32, 7.9657842846620870f32, 7.9715435539507720f32, 7.9772799234999168f32, 7.9829935746943104f32, 7.9886846867721664f32, 7.9943534368588578f32]; brotli-3.4.0/src/enc/find_stride.rs000064400000000000000000000761741046102023000153360ustar 00000000000000use super::interface; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut}; use core::mem; use core::cmp; use core::ops::{Index, IndexMut, Range}; use super::input_pair::{InputReference, InputPair}; use super::util::FastLog2; // float32 doesn't have enough resolution for blocks of data more than 3.5 megs pub type floatY = f64; // the cost of storing a particular population of data including the approx // cost of a huffman table to describe the frequencies of each symbol pub fn HuffmanCost(population: &[u32]) -> floatY{ assert_eq!(population.len(), 256 * 256); let mut cost : floatY = 0.0 as floatY; let mut sum : floatY = 0.0 as floatY; let mut buckets : floatY = 0.0 as floatY; for pop in population.iter() { if *pop == 0 { continue; } cost -= *pop as floatY * FastLog2(*pop as u64) as floatY; sum += *pop as floatY; buckets += 1.0 as floatY; } let cost = 16.0 as floatY * buckets + cost + sum * FastLog2(sum as u64) as floatY; //println!("Observed {} nonzero buckets with a sum of {}, hc={}", buckets, sum, cost); cost } // this holds a population of data assuming 1 byte of prior for that data // bucket_populations is therefore a 65536-long dynamically allocated buffer pub struct EntropyBucketPopulation > { pub bucket_populations: AllocU32::AllocatedMemory, pub cached_bit_entropy: floatY, } impl> EntropyBucketPopulation { pub fn new(m32: &mut AllocU32) -> Self { let size = 256 * 256; EntropyBucketPopulation:: { cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), } } pub fn free(&mut self, m32: &mut AllocU32) { m32.free_cell(mem::replace(&mut self.bucket_populations, AllocU32::AllocatedMemory::default())); } fn clone_from(&mut self, other: &EntropyBucketPopulation) { self.bucket_populations.slice_mut().clone_from_slice(other.bucket_populations.slice()); } fn add_assign(&mut self, other: &EntropyBucketPopulation) { assert_eq!(self.bucket_populations.slice().len(), other.bucket_populations.slice().len()); for (item, other_item) in self.bucket_populations.slice_mut().iter_mut().zip(other.bucket_populations.slice().iter()) { *item += *other_item; } self.cached_bit_entropy = HuffmanCost(self.bucket_populations.slice()); } // clear the allocated memory and reset literal population to zero fn bzero(&mut self) { self.cached_bit_entropy = 0.0; for bp in self.bucket_populations.slice_mut().iter_mut() { *bp = 0; } } // setup population to the sum of an array of populations where the stride of that row matches. Additionally allow another optional fn initiate_from(&mut self, rows: [&[Self];2], rows_stride:[&[u8];2], stride: u8, do_clear: bool) { self.cached_bit_entropy = 0.0; let mut found_any = false; for (sub_row, sub_stride) in rows.iter().zip(rows_stride.iter()) { for (item, istride) in sub_row.iter().zip(sub_stride.iter()) { if *istride != stride { continue; // if we chain, then optional was already filtered by stride } if do_clear && !found_any { self.bucket_populations.slice_mut().clone_from_slice(item.bucket_populations.slice()); found_any = true; } else{ for (dst, src) in self.bucket_populations.slice_mut().iter_mut().zip(item.bucket_populations.slice().iter()) { *dst += *src; } } } } if do_clear && !found_any { self.bzero(); } else { self.cached_bit_entropy = HuffmanCost(self.bucket_populations.slice()); } } fn bit_cost_of_data_subset(&mut self, data0:&[u8], mut stride: u8, mut prev_bytes: [u8;NUM_STRIDES], scratch: &mut EntropyBucketPopulation) -> floatY{ prev_bytes.reverse(); stride = cmp::max(1, stride); // we return stride=1 to mean 1 away scratch.bucket_populations.slice_mut().clone_from_slice(self.bucket_populations.slice()); scratch.bucket_populations.slice_mut()[65535] += 1; // to demonstrate that we have scratch.bucket_populations.slice_mut()[65535] -= 1; // to demonstrate that we have write capability let mut stray_count = 0.0 as floatY; assert_eq!((NUM_STRIDES - 1) & NUM_STRIDES, 0); // must be power of two for (index,val) in data0.iter().enumerate() { let prior_byte = prev_bytes[(index + (NUM_STRIDES - stride as usize)) & (NUM_STRIDES - 1)]; let loc = &mut scratch.bucket_populations.slice_mut()[prior_byte as usize * 256 + *val as usize]; if *loc == 0 { stray_count += 1.0; } else { *loc -= 1; } prev_bytes[index & (NUM_STRIDES - 1)] = *val; } if self.cached_bit_entropy == 0.0 as floatY { self.cached_bit_entropy = HuffmanCost(self.bucket_populations.slice()); } debug_assert_eq!(HuffmanCost(self.bucket_populations.slice()), self.cached_bit_entropy); scratch.cached_bit_entropy = HuffmanCost(scratch.bucket_populations.slice()); self.cached_bit_entropy - scratch.cached_bit_entropy + stray_count * 8.0 } } const NUM_STRIDES:usize = 8; #[derive(Copy,Clone)] pub struct BucketPopIndex { pub val: u8, pub six_bits: u8, pub stride: u8, } impl > Index for EntropyBucketPopulation { type Output = u32; fn index<'a>(&'a self, index: BucketPopIndex) -> &'a u32 { &self.bucket_populations.slice()[index.val as usize + index.six_bits as usize * 256 + index.stride as usize * 256 * 64] } } impl > IndexMut for EntropyBucketPopulation { fn index_mut<'a>(&'a mut self, index: BucketPopIndex) -> &'a mut u32 { &mut self.bucket_populations.slice_mut()[index.val as usize + index.six_bits as usize * 256 + index.stride as usize * 256 * 64] } } pub struct EntropyTally > { pop:[EntropyBucketPopulation;NUM_STRIDES], } const NUM_LEVELS: usize = 4; const NUM_NODES: usize = (1<<(NUM_LEVELS)) - 1; pub const NUM_LEAF_NODES: usize = (NUM_NODES + 1) >> 1; pub struct EntropyPyramid > { pop: [EntropyBucketPopulation;NUM_NODES], stride: [u8;NUM_NODES], } impl> EntropyPyramid { pub fn last_level_range(&self) -> Range { (NUM_NODES - (1 << (NUM_LEVELS - 1)))..NUM_NODES } pub fn byte_index_to_pyramid_index(&self, byte_index: usize, metablock_size: usize) -> usize { let range = self.last_level_range(); cmp::min(range.start + (range.end - range.start) * byte_index / metablock_size, range.end - 1) // since we tally after the end of the literal block, it could be after the pyramid } pub fn reset_scratch_to_deepest_level(&self, output: &mut EntropyTally) { let mut has_modified = [false; NUM_STRIDES]; //println!("Last level range {:?}", self.last_level_range()); for index in self.last_level_range() { if has_modified[self.stride[index] as usize] { output.pop[self.stride[index] as usize].add_assign(&self.pop[index]); } else { output.pop[self.stride[index] as usize].clone_from(&self.pop[index]); has_modified[self.stride[index] as usize] = true; } } for stride in 0..NUM_STRIDES { if !has_modified[stride] { output.pop[stride].bzero(); output.pop[stride].cached_bit_entropy = 0.0; } else { output.pop[stride].cached_bit_entropy = HuffmanCost(output.pop[stride].bucket_populations.slice()); } //println!("BASE PYRAMID {} = {}", stride,output.pop[stride].cached_bit_entropy); } } pub fn stride_last_level_range(&self) -> [u8; NUM_LEAF_NODES] { let mut ret = [0u8; NUM_LEAF_NODES]; ret.clone_from_slice(self.stride.split_at(self.stride.len() - NUM_LEAF_NODES).1); ret } pub fn free(&mut self, m32: &mut AllocU32) { for item in self.pop.iter_mut() { item.free(m32); } } pub fn disabled_placeholder(_m32: &mut AllocU32) -> Self { EntropyPyramid:: { pop: [ EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:AllocU32::AllocatedMemory::default(), }, ], stride:[0;NUM_NODES], } } pub fn new(m32: &mut AllocU32) -> Self { let size = 256 * 256; EntropyPyramid:: { pop: [ EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:m32.alloc_cell(size), }, ], stride:[0;NUM_NODES], } } pub fn bit_cost_of_literals(&mut self, data0: &[u8], start_index: u32, metablock_len: usize, stride:u8, previous_bytes: [u8; NUM_STRIDES], scratch: &mut EntropyTally) -> floatY { assert!(stride as usize <= NUM_STRIDES); let cost = self.pop[self.byte_index_to_pyramid_index(start_index as usize, metablock_len)].bit_cost_of_data_subset( data0, stride, previous_bytes, &mut scratch.pop[0]); cost } fn populate_entry_stride1(&mut self, input:InputPair, index: u32) { let mut prev_val = 0; let pyr_item = &mut self.pop[index as usize]; pyr_item.bzero(); assert_eq!(pyr_item.bucket_populations.slice()[65535], 0); for val in input.0.slice().iter().chain(input.1.slice().iter()) { pyr_item.bucket_populations.slice_mut()[prev_val as usize * 256 + *val as usize] += 1; prev_val = *val; } pyr_item.cached_bit_entropy = HuffmanCost(pyr_item.bucket_populations.slice()); self.stride[index as usize] = 0; } fn populate_entry(&mut self, input:InputPair, scratch: &mut EntropyTally, index: u32, mirror_range: Option>, prev_range: Option>) { let mut initial_entropies = [0.0 as floatY; NUM_STRIDES]; let nothing: &[EntropyBucketPopulation] = &[]; let nothing_u8: &[u8] = &[]; { let pop_ranges = [match mirror_range{ None => nothing, Some(ref ir) => &self.pop[ir.clone()], }, match prev_range { None => nothing, Some(ref pr) => &self.pop[pr.clone()], }]; let stride_ranges = [match mirror_range{ None => nothing_u8, Some(ref ir) => &self.stride[ir.clone()], }, match prev_range { None => nothing_u8, Some(ref pr) => &self.stride[pr.clone()], }]; for stride in 0..NUM_STRIDES { scratch.pop[stride].initiate_from(pop_ranges, stride_ranges, stride as u8, true); initial_entropies[stride] = scratch.pop[stride].cached_bit_entropy; } } scratch.observe_input_stream(input.0.slice(), input.1.slice()); let mut best_entropy_index = 0; let mut min_entropy_value = (scratch.pop[0].cached_bit_entropy - initial_entropies[0]); //println!("{} OLD ENTROPY {:} NEW_ENTROPY {:}", best_entropy_index, scratch.pop[0].cached_bit_entropy, initial_entropies[0]); for stride in 1..NUM_STRIDES { let entropy_value = scratch.pop[stride].cached_bit_entropy - initial_entropies[stride]; //println!("{} OLD ENTROPY {:} NEW_ENTROPY {:}", stride, scratch.pop[stride].cached_bit_entropy, initial_entropies[stride]); if entropy_value < min_entropy_value { best_entropy_index = stride; min_entropy_value = entropy_value; } } self.pop[index as usize].clone_from(&scratch.pop[best_entropy_index]); self.stride[index as usize] = best_entropy_index as u8; } pub fn populate_stride1(&mut self, input0:&[u8], input1:&[u8]) { let input = InputPair(InputReference{data:input0,orig_offset:0}, InputReference{data:input1,orig_offset:input0.len()}); for i in 0..2 { let first_range = if i == 0 { input.split_at(input.len() >> 1).0 } else { input.split_at(input.len() >> 1).1 }; for j in 0..2 { let second_range = if j == 0 { first_range.split_at(input.len() >> 2).0 } else { first_range.split_at(input.len() >> 2).1 }; if NUM_LEVELS == 4 { for k in 0..2 { let third_range = if j == 0 { second_range.split_at(input.len() >> 3).0 } else { second_range.split_at(input.len() >> 3).1 }; self.populate_entry_stride1(third_range, 7 + ((i << 2) + (j << 1) + k)); } } else { assert_eq!(NUM_LEVELS, 3); // we hard coded the 3 levels for now... we can add more later or make this into some kind of recursion self.populate_entry_stride1(second_range, 3 + ((i << 1) + j)); } } } } pub fn populate(&mut self, input0:&[u8], input1:&[u8], scratch: &mut EntropyTally) { let input = InputPair(InputReference{data:input0,orig_offset:0}, InputReference{data:input1,orig_offset:input0.len()}); self.populate_entry(input, scratch, 0, None, None); // BASE // LEVEL 1 self.populate_entry(input.split_at(input.len() >> 1).0, scratch, 1, Some(0..1), None); self.populate_entry(input.split_at(input.len() >> 1).1, scratch, 2, None, Some(1..2)); // should we use the range from 0..1?? // LEVEL 2 self.populate_entry(input.split_at(input.len() >> 2).0, scratch, 3, Some(1..3), None); self.populate_entry(input.split_at(input.len() >> 1).0.split_at(input.len() >>2).1, scratch, 4, Some(2..3), Some(3..4)); self.populate_entry(input.split_at(input.len() >> 1).1.split_at(input.len() >>2).0, scratch, 5, Some(3..5), None); self.populate_entry(input.split_at(input.len() >> 1).1.split_at(input.len() >>2).1, scratch, 6, Some(3..6), None); if NUM_LEVELS == 4 { // level 4 self.populate_entry(input.split_at(input.len() >> 1).0.split_at(input.len() >> 2).0.split_at(input.len() >> 3).0, scratch, 7, Some(4..7), None); self.populate_entry(input.split_at(input.len() >> 1).0.split_at(input.len() >> 2).0.split_at(input.len() >>3).1, scratch, 8, Some(4..7), Some(7..8)); self.populate_entry(input.split_at(input.len() >> 1).0.split_at(input.len() >> 2).1.split_at(input.len() >>3).0, scratch, 9, Some(5..7), Some(7..9)); self.populate_entry(input.split_at(input.len() >> 1).0.split_at(input.len() >> 2).1.split_at(input.len() >>3).1, scratch, 0xa, Some(5..7), Some(7..0xa)); self.populate_entry(input.split_at(input.len() >> 1).1.split_at(input.len() >> 2).0.split_at(input.len() >> 3).0, scratch, 0xb, Some(6..7), Some(7..0xb)); self.populate_entry(input.split_at(input.len() >> 1).1.split_at(input.len() >> 2).0.split_at(input.len() >>3).1, scratch, 0xc, Some(6..7), Some(7..0xc)); self.populate_entry(input.split_at(input.len() >> 1).1 .split_at(input.len() >> 2).1.split_at(input.len() >>3).0, scratch, 0xd, None, Some(7..0xd)); self.populate_entry(input.split_at(input.len() >> 1).1.split_at(input.len() >> 2).1.split_at(input.len() >>3).1, scratch, 0xe, None, Some(7..0xe)); } else { assert_eq!(NUM_LEVELS, 3); // we hard coded the 3 levels for now... we can add more later or make this into some kind of recursion } } } impl > EntropyTally { pub fn new(m32: &mut AllocU32, max_stride_arg: Option) -> EntropyTally { let size = 256 * 256; let max_stride = max_stride_arg.unwrap_or(NUM_STRIDES as u8); EntropyTally:: { pop:[ EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:if 0 < max_stride { m32.alloc_cell(size) } else { AllocU32::AllocatedMemory::default() }, }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:if 1 < max_stride { m32.alloc_cell(size) } else { AllocU32::AllocatedMemory::default() }, }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:if 2 < max_stride { m32.alloc_cell(size) } else { AllocU32::AllocatedMemory::default() }, }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:if 3 < max_stride { m32.alloc_cell(size) } else { AllocU32::AllocatedMemory::default() }, }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:if 4 < max_stride { m32.alloc_cell(size) } else { AllocU32::AllocatedMemory::default() }, }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:if 5 < max_stride { m32.alloc_cell(size) } else { AllocU32::AllocatedMemory::default() }, }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:if 6 < max_stride { m32.alloc_cell(size) } else { AllocU32::AllocatedMemory::default() }, }, EntropyBucketPopulation::{ cached_bit_entropy:0.0, bucket_populations:if 7 < max_stride { m32.alloc_cell(size) } else { AllocU32::AllocatedMemory::default() }, }, ]} } pub fn disabled_placeholder(m32: &mut AllocU32) -> EntropyTally { Self::new(m32, Some(0)) } fn observe_input_stream(&mut self, input0:&[u8], input1:&[u8]) { let mut priors = [0u8;NUM_STRIDES]; for val in input0.iter().chain(input1.iter()) { for stride in 0..NUM_STRIDES { self.pop[stride].bucket_populations.slice_mut()[priors[stride] as usize * 256 + (*val as usize)] += 1; } { let mut tmp = [0u8;NUM_STRIDES - 1]; tmp.clone_from_slice(&priors[..(NUM_STRIDES - 1)]); priors[1..].clone_from_slice(&tmp[..]); priors[0] = *val; } } for stride in 0..NUM_STRIDES { self.pop[stride].cached_bit_entropy = HuffmanCost(self.pop[stride].bucket_populations.slice()); } } fn identify_best_population_and_update_cache(&mut self) -> u8 { let mut old_bit_entropy : [floatY; NUM_STRIDES] = [0.0; NUM_STRIDES]; for (obe, be) in old_bit_entropy.iter_mut().zip(self.pop.iter_mut()) { *obe = be.cached_bit_entropy; if *obe != 0.0 { be.cached_bit_entropy = HuffmanCost(be.bucket_populations.slice()); } } let mut best_stride = 0u8; let mut best_entropy = self.pop[0].cached_bit_entropy - old_bit_entropy[0]; //println!("Weighing {} as {}", best_stride, best_entropy); for index in 1..NUM_STRIDES { let cur = self.pop[index].cached_bit_entropy - old_bit_entropy[index]; //println!("Weighing {} as {} = [{} - {}]", index, cur, self.pop[index].cached_bit_entropy, old_bit_entropy[index]); if (best_entropy == 0.0 || cur < best_entropy) && old_bit_entropy[index] > 0.0 { best_stride = index as u8; best_entropy = cur; } } return best_stride; } pub fn peek(&mut self) -> &mut EntropyBucketPopulation { &mut self.pop[0] } pub fn get_previous_bytes(&self, input0:&[u8], input1:&[u8], bytes_processed: usize) -> [u8; NUM_STRIDES] { let mut retval = [0u8; NUM_STRIDES]; for index in 0..NUM_STRIDES { let bp_offset = index + 1; if bp_offset <= bytes_processed { let offset = bytes_processed - bp_offset; if offset >= input0.len() { retval[index] = input1[offset - input0.len()]; } else { retval[index] = input0[offset]; } } } retval } pub fn pick_best_stride>(&mut self, commands: &[interface::Command], input0: &[u8], input1: &[u8], bytes_processed: &mut usize, entropy_pyramid: &EntropyPyramid, stride_detection_quality: u8) -> u8 { if stride_detection_quality == 0 { return 0; } //println!("ENTROPY PYRAMID {:?}", entropy_pyramid.stride); if stride_detection_quality > 1 { entropy_pyramid.reset_scratch_to_deepest_level(self); } let mut pyramid_byte_index: usize = 0; for cmd in commands.iter() { match *cmd { interface::Command::Copy(ref copy) => { *bytes_processed += copy.num_bytes as usize; }, interface::Command::Dict(ref dict) => { *bytes_processed += dict.final_size as usize; }, interface::Command::Literal(ref lit) => { if stride_detection_quality > 1 { let mut priors = self.get_previous_bytes(input0, input1, *bytes_processed); for (lindex, val) in lit.data.slice().iter().enumerate() { if lindex == NUM_STRIDES { let vpriors = self.get_previous_bytes(input0, input1, NUM_STRIDES+*bytes_processed); assert_eq!(vpriors, priors); } for (index, prior) in priors.iter().enumerate() { self.pop[index].bucket_populations.slice_mut()[256 * (*prior as usize) + *val as usize] += 1; // increment the population value of this literal // for the respective prior for the stride index } { //reset prior values for the next item let mut tmp = [0u8;7]; tmp.clone_from_slice(&priors[..7]); priors[1..].clone_from_slice(&tmp[..]); priors[0] = *val; } } } *bytes_processed += lit.data.slice().len(); pyramid_byte_index = *bytes_processed; }, interface::Command::BlockSwitchCommand(_) | interface::Command::BlockSwitchLiteral(_) | interface::Command::BlockSwitchDistance(_) | interface::Command::PredictionMode(_) => {}, } } let best_stride = if stride_detection_quality > 1 { self.identify_best_population_and_update_cache() + 1 } else { entropy_pyramid.stride[ entropy_pyramid.byte_index_to_pyramid_index(pyramid_byte_index, input0.len() + input1.len())] + 1 }; //println!("ENTROPY PYRAMID {:?} selected {}", entropy_pyramid.stride, best_stride); best_stride } pub fn free(&mut self, m32: &mut AllocU32) { for item in self.pop.iter_mut() { m32.free_cell(mem::replace(&mut item.bucket_populations, AllocU32::AllocatedMemory::default())) } } pub fn is_free(&mut self) -> bool { self.pop[0].bucket_populations.slice().len() == 0 } } brotli-3.4.0/src/enc/fixed_queue.rs000064400000000000000000000035041046102023000153320ustar 00000000000000use core; pub const MAX_THREADS: usize = 16; pub struct FixedQueue{ data: [Option;MAX_THREADS], size: usize, start: usize, } impl Default for FixedQueue { fn default() -> Self { Self::new() } } impl FixedQueue { pub fn new() -> Self { FixedQueue{ data:[None,None,None,None,None,None,None,None, None,None,None,None,None,None,None,None, ], size:0, start:0, } } pub fn can_push(&self) -> bool { self.size < self.data.len() } pub fn size(&self) -> usize { self.size } pub fn push(&mut self, item: T) -> Result<(), ()> { if self.size == self.data.len() { return Err(()); } let index = (self.start + self.size) % self.data.len(); self.data[index] = Some(item); self.size += 1; Ok(()) } pub fn pop(&mut self) -> Option { if self.size == 0 { return None; } let index = self.start%self.data.len(); let ret = core::mem::replace(&mut self.data[index], None); self.start += 1; self.size -= 1; ret } pub fn how_much_free_space(&self) -> usize { self.data.len() - self.size } pub fn remove) ->bool>(&mut self,f:F) -> Option { if self.size == 0 { return None; } for index in 0..self.size { if f(&self.data[(self.start + index)%self.data.len()]) { let start_index = self.start%self.data.len(); let target_index = (self.start + index)%self.data.len(); let ret = core::mem::replace(&mut self.data[target_index], None); let replace = core::mem::replace(&mut self.data[start_index], None); let is_none = core::mem::replace(&mut self.data[target_index], replace); assert!(is_none.is_none()); self.start += 1; self.size -= 1; return ret } } None } } brotli-3.4.0/src/enc/histogram.rs000075500000000000000000000373071046102023000150370ustar 00000000000000#![allow(dead_code)] use super::block_split::BlockSplit; use super::command::{Command, CommandCopyLen, CommandDistanceContext}; use super::constants::{kSigned3BitContextLookup, kUTF8ContextLookup}; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut}; use super::vectorization::{Mem256i}; use core; use core::cmp::min; static kBrotliMinWindowBits: i32 = 10i32; static kBrotliMaxWindowBits: i32 = 24i32; //#[derive(Clone)] clone is broken for arrays > 32 pub struct HistogramLiteral { pub data_: [u32; 256], pub total_count_: usize, pub bit_cost_: super::util::floatX, } impl Clone for HistogramLiteral { #[inline(always)] fn clone(&self) -> HistogramLiteral { return HistogramLiteral { data_: self.data_, total_count_: self.total_count_, bit_cost_: self.bit_cost_, }; } } impl Default for HistogramLiteral { #[inline(always)] fn default() -> HistogramLiteral { return HistogramLiteral { data_: [0; 256], total_count_: 0, bit_cost_: 3.402e+38 as super::util::floatX, }; } } //#[derive(Clone)] clone is broken for arrays > 32 pub struct HistogramCommand { pub data_: [u32; 704], pub total_count_: usize, pub bit_cost_: super::util::floatX, } impl Clone for HistogramCommand { #[inline(always)] fn clone(&self) -> HistogramCommand { return HistogramCommand { data_: self.data_, total_count_: self.total_count_, bit_cost_: self.bit_cost_, }; } } impl Default for HistogramCommand { #[inline(always)] fn default() -> HistogramCommand { return HistogramCommand { data_: [0; 704], total_count_: 0, bit_cost_: 3.402e+38 as super::util::floatX, }; } } //#[derive(Clone)] // #derive is broken for arrays > 32 #[cfg(not(feature="disallow_large_window_size"))] const BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS: usize = 544; #[cfg(feature="disallow_large_window_size")] const BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS: usize = 520; pub struct HistogramDistance { pub data_: [u32; BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS], pub total_count_: usize, pub bit_cost_: super::util::floatX, } impl Clone for HistogramDistance { fn clone(&self) -> HistogramDistance { return HistogramDistance { data_: self.data_, total_count_: self.total_count_, bit_cost_: self.bit_cost_, }; } } impl Default for HistogramDistance { fn default() -> HistogramDistance { return HistogramDistance { data_: [0; BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS], total_count_: 0, bit_cost_: 3.402e+38 as super::util::floatX, }; } } pub trait CostAccessors { type i32vec : Sized + SliceWrapper+SliceWrapperMut; fn make_nnz_storage() -> Self::i32vec; fn total_count(&self) -> usize; fn bit_cost(&self) -> super::util::floatX; fn set_bit_cost(&mut self, cost: super::util::floatX); fn set_total_count(&mut self, count: usize); } impl SliceWrapper for HistogramLiteral { #[inline(always)] fn slice(&self) -> &[u32] { return &self.data_[..]; } } impl SliceWrapperMut for HistogramLiteral { #[inline(always)] fn slice_mut(&mut self) -> &mut [u32] { return &mut self.data_[..]; } } pub struct Array264i([Mem256i;33]); impl SliceWrapperMut for Array264i { #[inline(always)] fn slice_mut(&mut self) -> &mut [Mem256i] { return &mut self.0[..] } } impl SliceWrapper for Array264i { #[inline(always)] fn slice(&self) -> & [Mem256i] { return &self.0[..] } } impl Default for Array264i { #[inline(always)] fn default() -> Array264i { return Array264i([Mem256i::default().clone();33]); } } pub struct Array528i([Mem256i;66]); impl SliceWrapperMut for Array528i { #[inline(always)] fn slice_mut(&mut self) -> &mut [Mem256i] { return &mut self.0[..] } } impl SliceWrapper for Array528i { #[inline(always)] fn slice(&self) -> & [Mem256i] { return &self.0[..] } } impl Default for Array528i { #[inline(always)] fn default() -> Array528i { return Array528i([Mem256i::default();66]); } } pub struct Array712i([Mem256i;89]); impl SliceWrapperMut for Array712i { #[inline(always)] fn slice_mut(&mut self) -> &mut [Mem256i] { return &mut self.0[..] } } impl SliceWrapper for Array712i { #[inline(always)] fn slice(&self) -> & [Mem256i] { return &self.0[..] } } impl Default for Array712i { #[inline(always)] fn default() -> Array712i { return Array712i([Mem256i::default();89]); } } pub struct EmptyIVec{} impl SliceWrapperMut for EmptyIVec { #[inline(always)] fn slice_mut(&mut self) -> &mut [Mem256i] { return &mut [] } } impl SliceWrapper for EmptyIVec { #[inline(always)] fn slice(&self) -> & [Mem256i] { return & [] } } impl Default for EmptyIVec { #[inline(always)] fn default() -> EmptyIVec { return EmptyIVec{}; } } #[cfg(feature="vector_scratch_space")] pub type HistogramLiteralScratch = Array264i; #[cfg(not(feature="vector_scratch_space"))] pub type HistogramLiteralScratch = EmptyIVec; impl CostAccessors for HistogramLiteral { type i32vec = HistogramLiteralScratch; fn make_nnz_storage() -> Self::i32vec { return HistogramLiteralScratch::default(); } #[inline(always)] fn total_count(&self) -> usize { return self.total_count_; } #[inline(always)] fn bit_cost(&self) -> super::util::floatX { return self.bit_cost_; } #[inline(always)] fn set_bit_cost(&mut self, data: super::util::floatX) { self.bit_cost_ = data; } #[inline(always)] fn set_total_count(&mut self, data: usize) { self.total_count_ = data; } } impl SliceWrapper for HistogramCommand { #[inline(always)] fn slice(&self) -> &[u32] { return &self.data_[..]; } } impl SliceWrapperMut for HistogramCommand { #[inline(always)] fn slice_mut(&mut self) -> &mut [u32] { return &mut self.data_[..]; } } #[cfg(feature="vector_scratch_space")] pub type HistogramCommandScratch = Array712i; #[cfg(not(feature="vector_scratch_space"))] pub type HistogramCommandScratch = EmptyIVec; impl CostAccessors for HistogramCommand { type i32vec = HistogramCommandScratch; fn make_nnz_storage() -> Self::i32vec { return HistogramCommandScratch::default(); } #[inline(always)] fn total_count(&self) -> usize { return self.total_count_; } #[inline(always)] fn bit_cost(&self) -> super::util::floatX { return self.bit_cost_; } #[inline(always)] fn set_bit_cost(&mut self, data: super::util::floatX) { self.bit_cost_ = data; } #[inline(always)] fn set_total_count(&mut self, data: usize) { self.total_count_ = data; } } impl SliceWrapper for HistogramDistance { #[inline(always)] fn slice(&self) -> &[u32] { return &self.data_[..]; } } impl SliceWrapperMut for HistogramDistance { #[inline(always)] fn slice_mut(&mut self) -> &mut [u32] { return &mut self.data_[..]; } } #[cfg(feature="vector_scratch_space")] pub type HistogramDistanceScratch = Array528i; #[cfg(not(feature="vector_scratch_space"))] pub type HistogramDistanceScratch = EmptyIVec; impl CostAccessors for HistogramDistance { type i32vec = HistogramDistanceScratch; fn make_nnz_storage() -> Self::i32vec { return HistogramDistanceScratch::default(); } #[inline(always)] fn total_count(&self) -> usize { return self.total_count_; } #[inline(always)] fn bit_cost(&self) -> super::util::floatX { return self.bit_cost_; } #[inline(always)] fn set_bit_cost(&mut self, data: super::util::floatX) { self.bit_cost_ = data; } #[inline(always)] fn set_total_count(&mut self, data: usize) { self.total_count_ = data; } } #[derive(Copy,Clone)] pub enum ContextType { CONTEXT_LSB6 = 0, CONTEXT_MSB6 = 1, CONTEXT_UTF8 = 2, CONTEXT_SIGNED = 3, } impl Default for ContextType { #[inline(always)] fn default() -> ContextType { ContextType::CONTEXT_LSB6 } } pub struct BlockSplitIterator<'a, Alloc: alloc::Allocator + 'a + alloc::Allocator + 'a> { pub split_: &'a BlockSplit, pub idx_: usize, pub type_: usize, pub length_: usize, } fn NewBlockSplitIterator<'a, Alloc: alloc::Allocator + alloc::Allocator> (split: &'a BlockSplit) -> BlockSplitIterator<'a, Alloc> { return BlockSplitIterator::<'a> { split_: split, idx_: 0i32 as (usize), type_: 0i32 as (usize), length_: if (*split).lengths.slice().len() != 0 { (*split).lengths.slice()[0] as usize } else { 0i32 as (usize) }, }; } fn InitBlockSplitIterator<'a, Alloc:alloc::Allocator + alloc::Allocator>( xself: &'a mut BlockSplitIterator<'a, Alloc>, split: &'a BlockSplit){ (*xself).split_ = split; (*xself).idx_ = 0i32 as (usize); (*xself).type_ = 0i32 as (usize); (*xself).length_ = if (*split).lengths.slice().len() != 0 { (*split).lengths.slice()[0] as u32 } else { 0i32 as (u32) } as (usize); } fn BlockSplitIteratorNext<'a, Alloc: alloc::Allocator + alloc::Allocator>(xself: &mut BlockSplitIterator){ if (*xself).length_ == 0i32 as (usize) { (*xself).idx_ = (*xself).idx_.wrapping_add(1 as (usize)); (*xself).type_ = (*(*xself).split_).types.slice()[(*xself).idx_ as (usize)] as (usize); (*xself).length_ = (*(*xself).split_).lengths.slice()[(*xself).idx_ as (usize)] as (usize); } (*xself).length_ = (*xself).length_.wrapping_sub(1 as (usize)); } pub fn HistogramAddItem + SliceWrapperMut + CostAccessors> (xself: &mut HistogramType, val: usize) { { let _rhs = 1; let _lhs = &mut (*xself).slice_mut()[val]; let val = (*_lhs).wrapping_add(_rhs as (u32)); *_lhs = val; } let new_count = (*xself).total_count().wrapping_add(1 as (usize)); (*xself).set_total_count(new_count); } pub fn HistogramAddVector + SliceWrapperMut + CostAccessors, IntegerType: Sized + Clone> (xself: &mut HistogramType, p: &[IntegerType], n: usize) where u64: core::convert::From { let new_tc = (*xself).total_count().wrapping_add(n); (*xself).set_total_count(new_tc); for p_item in p[..n].iter() { let _rhs = 1; let index: usize = u64::from(p_item.clone()) as usize; let _lhs = &mut (*xself).slice_mut()[index]; *_lhs = (*_lhs).wrapping_add(_rhs as (u32)); } } #[inline(always)] pub fn HistogramClear+CostAccessors>(xself: &mut HistogramType){ for data_elem in xself.slice_mut().iter_mut() { *data_elem = 0; } (*xself).set_total_count(0); (*xself).set_bit_cost(3.402e+38 as super::util::floatX); } pub fn ClearHistograms+CostAccessors>(array: &mut [HistogramType], length: usize){ for item in array[..length].iter_mut() { HistogramClear(item) } } #[inline(always)] pub fn HistogramAddHistogram + SliceWrapper + CostAccessors>( xself : &mut HistogramType, v : &HistogramType ){ let old_total_count = (*xself).total_count(); (*xself).set_total_count(old_total_count + (*v).total_count()); let h0 = xself.slice_mut(); let h1 = v.slice(); let n = min(h0.len(), h1.len()); for i in 0..n { let h0val = &mut h0[i]; let val = h0val.wrapping_add(h1[i]); *h0val = val; } } pub fn HistogramSelfAddHistogram + SliceWrapper + CostAccessors>( xself : &mut [HistogramType], i0 : usize, i1 : usize ){ let tc_new = xself[i1].total_count(); let tc_old = xself[i0].total_count(); xself[i0].set_total_count(tc_old.wrapping_add(tc_new)); let h0 = xself[i0].slice().len(); let h0a = xself[i0].slice().len(); let h1 = xself[i1].slice().len(); let n = min(h0, min(h0a, h1)); for h_index in 0..n { let val = xself[i0].slice()[h_index].wrapping_add(xself[i1].slice()[h_index]); xself[i0].slice_mut()[h_index] = val; } } #[inline(always)] pub fn Context(p1: u8, p2: u8, mode: ContextType) -> u8 { match mode { ContextType::CONTEXT_SIGNED => { ((kSigned3BitContextLookup[p1 as (usize)] as (i32) << 3i32) + kSigned3BitContextLookup[p2 as (usize)] as (i32)) as (u8) } ContextType::CONTEXT_UTF8 => { (kUTF8ContextLookup[p1 as (usize)] as (i32) | kUTF8ContextLookup[(p2 as (i32) + 256i32) as (usize)] as (i32)) as (u8) } ContextType::CONTEXT_MSB6 => (p1 as (i32) >> 2i32) as (u8), ContextType::CONTEXT_LSB6 => (p1 as (i32) & 0x3fi32) as (u8),/* else { 0i32 as (u8) }*/ } } pub fn BrotliBuildHistogramsWithContext<'a, Alloc: alloc::Allocator + alloc::Allocator> (cmds: &[Command], num_commands: usize, literal_split: &BlockSplit, insert_and_copy_split: &BlockSplit, dist_split: &BlockSplit, ringbuffer: &[u8], start_pos: usize, mask: usize, mut prev_byte: u8, mut prev_byte2: u8, context_modes: &[ContextType], literal_histograms: &mut [HistogramLiteral], insert_and_copy_histograms: &mut [HistogramCommand], copy_dist_histograms: &mut [HistogramDistance]) { let mut pos: usize = start_pos; let mut literal_it: BlockSplitIterator; let mut insert_and_copy_it: BlockSplitIterator; let mut dist_it: BlockSplitIterator; let mut i: usize; literal_it = NewBlockSplitIterator(literal_split); insert_and_copy_it = NewBlockSplitIterator(insert_and_copy_split); dist_it = NewBlockSplitIterator(dist_split); i = 0usize; while i < num_commands { { let cmd = &cmds[(i as (usize))]; let mut j: usize; BlockSplitIteratorNext(&mut insert_and_copy_it); HistogramAddItem(&mut insert_and_copy_histograms[(insert_and_copy_it.type_ as (usize))], (*cmd).cmd_prefix_ as (usize)); j = (*cmd).insert_len_ as (usize); while j != 0usize { { let context: usize; BlockSplitIteratorNext(&mut literal_it); context = if context_modes.len() != 0 { (literal_it.type_ << 6i32).wrapping_add(Context(prev_byte, prev_byte2, context_modes[(literal_it.type_ as (usize))]) as (usize)) } else { literal_it.type_ }; HistogramAddItem(&mut literal_histograms[(context as (usize))], ringbuffer[((pos & mask) as (usize))] as (usize)); prev_byte2 = prev_byte; prev_byte = ringbuffer[((pos & mask) as (usize))]; pos = pos.wrapping_add(1 as (usize)); } j = j.wrapping_sub(1 as (usize)); } pos = pos.wrapping_add(CommandCopyLen(cmd) as (usize)); if CommandCopyLen(cmd) != 0 { prev_byte2 = ringbuffer[((pos.wrapping_sub(2usize) & mask) as (usize))]; prev_byte = ringbuffer[((pos.wrapping_sub(1usize) & mask) as (usize))]; if (*cmd).cmd_prefix_ as (i32) >= 128i32 { let context: usize; BlockSplitIteratorNext(&mut dist_it); context = (dist_it.type_ << 2i32).wrapping_add(CommandDistanceContext(cmd) as (usize)); HistogramAddItem(&mut copy_dist_histograms[(context as (usize))], (*cmd).dist_prefix_ as (usize) & 0x3ff); } } } i = i.wrapping_add(1 as (usize)); } } brotli-3.4.0/src/enc/input_pair.rs000064400000000000000000000105111046102023000151750ustar 00000000000000use core; use super::super::alloc::SliceWrapper; use super::super::alloc::SliceWrapperMut; use super::interface::Freezable; #[derive(Copy,Clone,Default,Debug)] pub struct InputReference<'a> { pub data: &'a [u8], pub orig_offset: usize, // offset into the original slice of data } impl<'a> SliceWrapper for InputReference<'a> { fn slice(&self) -> & [u8] { self.data } } impl<'a> Freezable for InputReference<'a> { fn freeze(&self) -> super::interface::SliceOffset { debug_assert!(self.data.len() <= 0xffffffff); super::interface::SliceOffset(self.orig_offset, self.data.len() as u32) } } pub struct InputReferenceMut<'a> { pub data: &'a mut [u8], pub orig_offset: usize, // offset into the original slice of data } impl<'a> SliceWrapper for InputReferenceMut<'a> { fn slice(&self) -> & [u8] { self.data } } impl<'a> SliceWrapperMut for InputReferenceMut<'a> { fn slice_mut(&mut self) -> &mut [u8] { self.data } } impl <'a> Default for InputReferenceMut<'a> { fn default() -> Self { InputReferenceMut { data:&mut[], orig_offset:0, } } } impl <'a> From> for InputReference<'a> { fn from(val: InputReferenceMut<'a>) -> InputReference<'a> { InputReference{ data: val.data, orig_offset: val.orig_offset, } } } impl <'a> From<&'a InputReferenceMut<'a>> for InputReference<'a> { fn from(val: &'a InputReferenceMut<'a>) -> InputReference<'a> { InputReference{ data: val.data, orig_offset: val.orig_offset, } } } #[derive(Clone, Debug,Copy)] pub struct InputPair<'a>(pub InputReference<'a>, pub InputReference<'a>); impl<'a> core::cmp::PartialEq for InputPair<'a> { fn eq<'b>(&self, other: &InputPair<'b>) -> bool { if self.0.len() + self.1.len() != other.0.len() + other.1.len() { return false; } for (a_iter, b_iter) in self.0.data.iter().chain(self.1.data.iter()).zip(other.0.data.iter().chain(other.1.data.iter())) { if *a_iter != *b_iter { return false; } } return true; } } impl<'a> core::ops::Index for InputPair<'a> { type Output = u8; fn index(&self, index:usize) -> &u8 { if index >= self.0.len() { &self.1.data[index - self.0.len()] } else { &self.0.data[index] } } } impl<'a> core::fmt::LowerHex for InputPair<'a> { fn fmt(&self, fmtr: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { for item in self.0.data { if let Err(e) = fmtr.write_fmt(format_args!("{:02x}", item)) { return Err(e) } } for item in self.1.data { if let Err(e) = fmtr.write_fmt(format_args!("{:02x}", item)) { return Err(e); } } Ok(()) } } impl<'a> InputPair<'a> { pub fn split_at(&self, loc : usize) -> (InputPair<'a>, InputPair<'a>) { if loc >= self.0.len() { let offset_from_self_1 = loc - self.0.len(); let (first, second) = self.1.data.split_at(core::cmp::min(offset_from_self_1, self.1.len())); return (InputPair::<'a>(self.0, InputReference::<'a>{data:first, orig_offset:self.1.orig_offset}), InputPair::<'a>(InputReference::<'a>::default(), InputReference::<'a>{data:second, orig_offset:offset_from_self_1 + self.1.orig_offset, }), ); } let (first, second) = self.0.data.split_at(core::cmp::min(loc, self.0.len())); (InputPair::<'a>(InputReference::<'a>{data:first, orig_offset:self.0.orig_offset}, InputReference::<'a>::default()), InputPair::<'a>(InputReference::<'a>{data:second, orig_offset:self.0.orig_offset + loc}, self.1)) } pub fn len(&self) -> usize { self.0.len() + self.1.len() } } brotli-3.4.0/src/enc/interface.rs000064400000000000000000000662561046102023000150040ustar 00000000000000#[allow(unused_imports)] // right now just used in feature flag use core; use alloc::{SliceWrapper, Allocator, SliceWrapperMut}; pub use super::input_pair::{InputPair,InputReference, InputReferenceMut}; use super::histogram; #[derive(Debug,Copy,Clone,Default)] pub struct BlockSwitch(pub u8); // Commands that can instantiate as a no-op should implement this. pub trait Nop { fn nop() -> T; } impl BlockSwitch { #[inline(always)] pub fn new(block_type: u8) -> Self { BlockSwitch(block_type) } #[inline(always)] pub fn block_type(&self) -> u8 { self.0 } } #[derive(Debug,Copy,Clone,Default)] pub struct LiteralBlockSwitch(pub BlockSwitch, pub u8); impl LiteralBlockSwitch { pub fn new(block_type: u8, stride: u8) -> Self { LiteralBlockSwitch(BlockSwitch::new(block_type), stride) } #[inline(always)] pub fn block_type(&self) -> u8 { self.0.block_type() } #[inline(always)] pub fn stride(&self) -> u8 { self.1 } #[inline(always)] pub fn update_stride(&mut self, new_stride: u8) { self.1 = new_stride; } } pub const LITERAL_PREDICTION_MODE_SIGN: u8 = 3; pub const LITERAL_PREDICTION_MODE_UTF8: u8 = 2; pub const LITERAL_PREDICTION_MODE_MSB6: u8 = 1; pub const LITERAL_PREDICTION_MODE_LSB6: u8 = 0; #[derive(Default, Copy, Clone, Debug, PartialEq, Eq, Hash)] pub struct LiteralPredictionModeNibble(pub u8); impl LiteralPredictionModeNibble { #[inline(always)] pub fn new(prediction_mode: u8) -> Result { if prediction_mode < 16 { return Ok(LiteralPredictionModeNibble(prediction_mode)); } return Err(()); } #[inline(always)] pub fn prediction_mode(&self) -> u8 { self.0 } #[inline(always)] pub fn signed() -> Self { LiteralPredictionModeNibble(LITERAL_PREDICTION_MODE_SIGN) } #[inline(always)] pub fn utf8() -> Self { LiteralPredictionModeNibble(LITERAL_PREDICTION_MODE_UTF8) } #[inline(always)] pub fn msb6() -> Self { LiteralPredictionModeNibble(LITERAL_PREDICTION_MODE_MSB6) } #[inline(always)] pub fn lsb6() -> Self { LiteralPredictionModeNibble(LITERAL_PREDICTION_MODE_LSB6) } #[inline(always)] pub fn to_context_enum(&self) -> Result{ match self.0 { LITERAL_PREDICTION_MODE_LSB6 => Ok(histogram::ContextType::CONTEXT_LSB6), LITERAL_PREDICTION_MODE_MSB6 => Ok(histogram::ContextType::CONTEXT_MSB6), LITERAL_PREDICTION_MODE_UTF8 => Ok(histogram::ContextType::CONTEXT_UTF8), LITERAL_PREDICTION_MODE_SIGN => Ok(histogram::ContextType::CONTEXT_SIGNED), _ => Err(()), } } } pub const NUM_SPEED_VALUES: usize = 12; pub const NUM_MIXING_VALUES: usize = 16 * 256 + 16 * 256; pub const NUM_PREDMODE_SETUP_VALUES: usize = 4; pub const RESERVED_OFFSET: usize = 3; pub const ADV_CONTEXT_MAP_OFFSET: usize = 2; pub const MIXING_MATH_OFFSET: usize = 1; pub const PREDMODE_OFFSET: usize = 0; pub const MIXING_OFFSET:usize = NUM_PREDMODE_SETUP_VALUES + PREDMODE_OFFSET; pub const SPEED_OFFSET: usize = MIXING_OFFSET + NUM_MIXING_VALUES; pub const DISTANCE_CONTEXT_MAP_OFFSET: usize = SPEED_OFFSET + NUM_SPEED_VALUES; pub const MAX_PREDMODE_SPEED_AND_DISTANCE_CONTEXT_MAP_SIZE: usize = DISTANCE_CONTEXT_MAP_OFFSET + 256 * 4; pub const MAX_LITERAL_CONTEXT_MAP_SIZE: usize = 256 * 64; pub const MAX_ADV_LITERAL_CONTEXT_MAP_SIZE: usize = 256 * 64 * 2; #[derive(Debug)] pub struct PredictionModeContextMap> { pub literal_context_map: SliceType, pub predmode_speed_and_distance_context_map: SliceType, } impl+SliceWrapperMut> PredictionModeContextMap { #[inline] pub fn distance_context_map_mut(&mut self) -> &mut [u8] { self.predmode_speed_and_distance_context_map.slice_mut().split_at_mut(DISTANCE_CONTEXT_MAP_OFFSET).1 } #[inline] pub fn set_stride_context_speed(&mut self, speed_max: [(u16, u16);2]) { let cm_slice = self.predmode_speed_and_distance_context_map.slice_mut(); for high in 0..2 { cm_slice[Self::stride_context_speed_offset()+high] = Self::u16_to_f8(speed_max[high].0); cm_slice[Self::stride_context_speed_max_offset()+high] = Self::u16_to_f8(speed_max[high].1); } } #[inline] pub fn set_context_map_speed(&mut self, speed_max: [(u16, u16);2]) { let cm_slice = self.predmode_speed_and_distance_context_map.slice_mut(); for high in 0..2 { cm_slice[Self::context_map_speed_offset()+high] = Self::u16_to_f8(speed_max[high].0); cm_slice[Self::context_map_speed_max_offset()+high] = Self::u16_to_f8(speed_max[high].1); } } pub fn set_mixing_math(&mut self, math_enum: u8) { let cm_slice = self.predmode_speed_and_distance_context_map.slice_mut(); cm_slice[MIXING_MATH_OFFSET] = math_enum; } pub fn set_adv_context_map(&mut self, is_adv: u8) { let cm_slice = self.predmode_speed_and_distance_context_map.slice_mut(); cm_slice[ADV_CONTEXT_MAP_OFFSET] = is_adv; } #[inline] pub fn set_mixing_values(&mut self, mixing_mask: &[u8; NUM_MIXING_VALUES]) { let cm_slice = self.predmode_speed_and_distance_context_map.slice_mut(); cm_slice[MIXING_OFFSET..(MIXING_OFFSET + NUM_MIXING_VALUES)].clone_from_slice(&mixing_mask[..]); } #[inline] pub fn get_mixing_values_mut(&mut self) -> &mut [u8] { let cm_slice = self.predmode_speed_and_distance_context_map.slice_mut(); &mut cm_slice[MIXING_OFFSET..(MIXING_OFFSET + NUM_MIXING_VALUES)] } #[inline] pub fn set_combined_stride_context_speed(&mut self, speed_max: [(u16, u16);2]) { let cm_slice = self.predmode_speed_and_distance_context_map.slice_mut(); for high in 0..2 { cm_slice[Self::combined_stride_context_speed_offset()+high] = Self::u16_to_f8(speed_max[high].0); cm_slice[Self::combined_stride_context_speed_max_offset()+high] = Self::u16_to_f8(speed_max[high].1); } } pub fn set_literal_prediction_mode(&mut self, val: LiteralPredictionModeNibble) { let cm_slice = self.predmode_speed_and_distance_context_map.slice_mut(); cm_slice[PREDMODE_OFFSET] = val.0; } } impl> PredictionModeContextMap { #[inline] pub fn from_mut>(other: PredictionModeContextMap) -> PredictionModeContextMap where SliceType: From{ PredictionModeContextMap::{ literal_context_map:SliceType::from(other.literal_context_map), predmode_speed_and_distance_context_map: SliceType::from(other.predmode_speed_and_distance_context_map), } } #[inline] pub fn get_mixing_values(&self) -> &[u8] { let cm_slice = self.predmode_speed_and_distance_context_map.slice(); &cm_slice[MIXING_OFFSET..(MIXING_OFFSET + NUM_MIXING_VALUES)] } #[inline] pub fn get_mixing_math(&self) ->u8 { let cm_slice = self.predmode_speed_and_distance_context_map.slice(); if cm_slice.len() <= MIXING_MATH_OFFSET { return 1; } cm_slice[MIXING_MATH_OFFSET] } #[inline] pub fn get_is_adv_context_map(&self) -> u8 { let cm_slice = self.predmode_speed_and_distance_context_map.slice(); if cm_slice.len() <= ADV_CONTEXT_MAP_OFFSET { return 0; } cm_slice[ADV_CONTEXT_MAP_OFFSET] } #[inline] pub fn has_context_speeds(&self) -> bool { self.predmode_speed_and_distance_context_map.slice().len() >= DISTANCE_CONTEXT_MAP_OFFSET } #[inline] pub fn size_of_combined_array(distance_context_map_size: usize) -> usize { distance_context_map_size + DISTANCE_CONTEXT_MAP_OFFSET } #[inline] pub fn context_speeds_standard_len(&self) -> usize { NUM_SPEED_VALUES } #[inline] pub fn context_speeds_f8(&self) -> &[u8] { &self.predmode_speed_and_distance_context_map.slice()[SPEED_OFFSET..DISTANCE_CONTEXT_MAP_OFFSET] } #[inline] pub fn distance_context_map(&self) -> &[u8] { self.predmode_speed_and_distance_context_map.slice().split_at(DISTANCE_CONTEXT_MAP_OFFSET).1 } #[inline] pub fn f8_to_u16(data: u8) -> u16 { self::u8_to_speed(data) } #[inline] pub fn u16_to_f8(data: u16) -> u8 { self::speed_to_u8(data) } #[inline] pub fn stride_context_speed_offset() -> usize { SPEED_OFFSET } #[inline] pub fn stride_context_speed_max_offset() -> usize { SPEED_OFFSET + 2 } #[inline] pub fn context_map_speed_offset() -> usize { SPEED_OFFSET + 4 } #[inline] pub fn context_map_speed_max_offset() -> usize { SPEED_OFFSET + 6 } #[inline] pub fn combined_stride_context_speed_offset() -> usize { SPEED_OFFSET + 8 } #[inline] pub fn combined_stride_context_speed_max_offset() -> usize { SPEED_OFFSET + 10 } #[inline] pub fn literal_prediction_mode(&self) -> LiteralPredictionModeNibble { let cm_slice = self.predmode_speed_and_distance_context_map.slice(); if PREDMODE_OFFSET < cm_slice.len() { LiteralPredictionModeNibble(cm_slice[PREDMODE_OFFSET]) } else { LiteralPredictionModeNibble::default() } } pub fn stride_context_speed(&self) -> [(u16, u16);2] { let v = self.stride_context_speed_f8(); [(self::u8_to_speed(v[0].0), self::u8_to_speed(v[0].1)), (self::u8_to_speed(v[1].0), self::u8_to_speed(v[1].1))] } pub fn context_map_speed(&self) -> [(u16, u16);2] { let v = self.context_map_speed_f8(); [(self::u8_to_speed(v[0].0), self::u8_to_speed(v[0].1)), (self::u8_to_speed(v[1].0), self::u8_to_speed(v[1].1))] } pub fn combined_stride_context_speed(&self) -> [(u16, u16);2] { let v = self.combined_stride_context_speed_f8(); [(self::u8_to_speed(v[0].0), self::u8_to_speed(v[0].1)), (self::u8_to_speed(v[1].0), self::u8_to_speed(v[1].1))] } #[inline] pub fn stride_context_speed_f8(&self) -> [(u8, u8);2] { let cm_slice = self.predmode_speed_and_distance_context_map.slice(); let low_speed = cm_slice[Self::stride_context_speed_offset()]; let high_speed = cm_slice[Self::stride_context_speed_offset() + 1]; let low_max = cm_slice[Self::stride_context_speed_max_offset()]; let high_max = cm_slice[Self::stride_context_speed_max_offset() + 1]; [(low_speed, low_max), (high_speed, high_max)] } #[inline] pub fn combined_stride_context_speed_f8(&self) -> [(u8, u8);2] { let cm_slice = self.predmode_speed_and_distance_context_map.slice(); let low_speed = cm_slice[Self::combined_stride_context_speed_offset()]; let high_speed = cm_slice[Self::combined_stride_context_speed_offset() + 1]; let low_max = cm_slice[Self::combined_stride_context_speed_max_offset()]; let high_max = cm_slice[Self::combined_stride_context_speed_max_offset() + 1]; [(low_speed, low_max), (high_speed, high_max)] } #[inline] pub fn context_map_speed_f8(&self) -> [(u8, u8);2] { let cm_slice = self.predmode_speed_and_distance_context_map.slice(); let low_speed = cm_slice[Self::context_map_speed_offset()]; let high_speed = cm_slice[Self::context_map_speed_offset() + 1]; let low_max = cm_slice[Self::context_map_speed_max_offset()]; let high_max = cm_slice[Self::context_map_speed_max_offset() + 1]; [(low_speed, low_max), (high_speed, high_max)] } } impl+Clone> Clone for PredictionModeContextMap { #[inline(always)] fn clone(&self) -> Self { PredictionModeContextMap:: { literal_context_map:self.literal_context_map.clone(), predmode_speed_and_distance_context_map:self.predmode_speed_and_distance_context_map.clone(), } } } impl+Clone+Copy> Copy for PredictionModeContextMap { } #[derive(Debug,Clone,Copy)] pub struct CopyCommand { pub distance: u32, pub num_bytes: u32, } impl Nop for CopyCommand { #[inline(always)] fn nop() -> Self { CopyCommand { distance: 1, num_bytes: 0 } } } #[derive(Debug,Clone,Copy)] pub struct DictCommand { pub word_size: u8, pub transform: u8, pub final_size: u8, pub empty: u8, pub word_id: u32, } impl Nop for DictCommand { #[inline(always)] fn nop() -> Self { DictCommand { word_size: 0, transform: 0, final_size: 0, empty: 1, word_id: 0 } } } #[derive(Debug)] #[cfg(not(feature="external-literal-probability"))] pub struct FeatureFlagSliceType >(core::marker::PhantomData); #[cfg(not(feature="external-literal-probability"))] impl> SliceWrapper for FeatureFlagSliceType { fn slice(&self) -> &[u8] { &[] } } #[cfg(not(feature="external-literal-probability"))] impl+Default> Default for FeatureFlagSliceType { fn default() -> Self { FeatureFlagSliceType::(core::marker::PhantomData::::default()) } } #[derive(Debug)] #[cfg(feature="external-literal-probability")] pub struct FeatureFlagSliceType >(pub SliceType); #[cfg(feature="external-literal-probability")] impl> SliceWrapper for FeatureFlagSliceType { #[inline(always)] fn slice(&self) -> &[u8] { self.0.slice() } } #[cfg(feature="external-literal-probability")] impl+Default> Default for FeatureFlagSliceType { #[inline(always)] fn default() -> Self { FeatureFlagSliceType::(SliceType::default()) } } impl+Clone> Clone for FeatureFlagSliceType { #[inline(always)] fn clone(&self) -> Self { FeatureFlagSliceType::(self.0.clone()) } } impl+Clone+Copy> Copy for FeatureFlagSliceType { } #[derive(Debug)] pub struct LiteralCommand> { pub data: SliceType, pub prob: FeatureFlagSliceType, pub high_entropy: bool, // this block of bytes is high entropy with a few patterns never seen again; adapt slower } impl> SliceWrapper for LiteralCommand { #[inline(always)] fn slice(&self) -> &[u8] { self.data.slice() } } impl+SliceWrapperMut> SliceWrapperMut for LiteralCommand { #[inline(always)] fn slice_mut(&mut self) -> &mut [u8] { self.data.slice_mut() } } impl+Default> Nop> for LiteralCommand { #[inline(always)] fn nop() -> Self { LiteralCommand { data: SliceType::default(), prob: FeatureFlagSliceType::::default(), high_entropy: false, } } } impl+Clone> Clone for LiteralCommand { #[inline(always)] fn clone(&self) -> LiteralCommand{ LiteralCommand::{data:self.data.clone(), prob:self.prob.clone(),high_entropy: self.high_entropy.clone(),} } } impl+Clone+Copy> Copy for LiteralCommand { } #[derive(Debug)] pub enum Command > { Copy(CopyCommand), Dict(DictCommand), Literal(LiteralCommand), BlockSwitchCommand(BlockSwitch), BlockSwitchLiteral(LiteralBlockSwitch), BlockSwitchDistance(BlockSwitch), PredictionMode(PredictionModeContextMap), } impl+Default> Command { #[inline] pub fn free_array(&mut self, apply_func: &mut F) where F: FnMut(SliceType) { match self { &mut Command::Literal(ref mut lit) => { apply_func(core::mem::replace(&mut lit.data, SliceType::default())) }, &mut Command::PredictionMode(ref mut pm) => { apply_func(core::mem::replace(&mut pm.literal_context_map, SliceType::default())); apply_func(core::mem::replace(&mut pm.predmode_speed_and_distance_context_map, SliceType::default())); }, _ => {}, } } } impl> Default for Command { #[inline(always)] fn default() -> Self { Command::::nop() } } impl> Nop> for Command { #[inline(always)] fn nop() -> Command { Command::Copy(CopyCommand::nop()) } } impl+Clone> Clone for Command { #[inline] fn clone(&self) -> Command{ match self { &Command::Copy(ref copy) => Command::Copy(copy.clone()), &Command::Dict(ref dict) => Command::Dict(dict.clone()), &Command::Literal(ref literal) => Command::Literal(literal.clone()), &Command::BlockSwitchCommand(ref switch) => Command::BlockSwitchCommand(switch.clone()), &Command::BlockSwitchLiteral(ref switch) => Command::BlockSwitchLiteral(switch.clone()), &Command::BlockSwitchDistance(ref switch) => Command::BlockSwitchDistance(switch.clone()), &Command::PredictionMode(ref pm) => Command::PredictionMode(pm.clone()), } } } impl+Clone+Copy> Copy for Command { } #[inline(always)] pub fn free_cmd_inline> (xself: &mut Command, m8: &mut SliceTypeAllocator) { match *xself { Command::Literal(ref mut lit) => { m8.free_cell(core::mem::replace(&mut lit.data, SliceTypeAllocator::AllocatedMemory::default())) }, Command::PredictionMode(ref mut pm) => { m8.free_cell(core::mem::replace(&mut pm.literal_context_map, SliceTypeAllocator::AllocatedMemory::default())); m8.free_cell(core::mem::replace(&mut pm.predmode_speed_and_distance_context_map, SliceTypeAllocator::AllocatedMemory::default())); }, Command::Dict(_) | Command::Copy(_) | Command::BlockSwitchCommand(_) | Command::BlockSwitchLiteral(_) | Command::BlockSwitchDistance(_) => {}, } } #[inline(never)] pub fn free_cmd> (xself: &mut Command, m8: &mut SliceTypeAllocator) { free_cmd_inline(xself, m8) } #[derive(Clone, Copy, Default, Debug)] pub struct SliceOffset(pub usize, pub u32); impl SliceWrapper for SliceOffset { fn slice(&self) -> &[u8] { // not perfect--shouldn't be calling this without thawing the wrapper &[] } } pub trait Freezable { fn freeze(&self) -> SliceOffset; } pub trait Unfreezable { fn thaw<'a>(&self, data: &'a [u8]) -> InputReference<'a>; fn thaw_mut<'a>(&self, data: &'a mut [u8]) -> InputReferenceMut<'a>; fn thaw_pair<'a>(&self, pair: &InputPair<'a>) -> Result, ()>; } impl<'a> From> for SliceOffset { fn from(f: InputReference<'a>) -> Self { debug_assert!(f.data.len() <= 0xffffffff); SliceOffset(f.orig_offset, f.data.len() as u32) } } impl Unfreezable for SliceOffset { fn thaw<'a>(&self, data: &'a [u8]) -> InputReference<'a> { InputReference{ data: data.split_at(self.0).1.split_at(self.1 as usize).0, orig_offset: self.0, } } fn thaw_mut<'a>(&self, data: &'a mut [u8]) -> InputReferenceMut<'a> { InputReferenceMut{ data: data.split_at_mut(self.0).1.split_at_mut(self.1 as usize).0, orig_offset: self.0, } } fn thaw_pair<'a>(&self, pair: &InputPair<'a>) -> Result, ()> { if self.0 >= pair.1.orig_offset { return Ok(InputReference{ data: pair.1.data.split_at(self.0 - pair.1.orig_offset).1.split_at(self.1 as usize).0, orig_offset: self.0, }); } let offset = self.0 - pair.0.orig_offset; if offset + self.1 as usize <= pair.0.data.len() { // overlap Ok(InputReference{ data: pair.0.data.split_at(offset).1.split_at(self.1 as usize).0, orig_offset: self.0, }) } else { Err(()) } } } impl SliceOffset { pub fn offset(&self) -> usize { self.0 } pub fn len(&self) -> usize { self.1 as usize } pub fn len32(&self) -> u32 { self.1 } } pub type StaticCommand = Command; pub trait CommandProcessor<'a> { fn push(&mut self, val: Command >); fn push_literals(&mut self, data:&InputPair<'a>) { if data.0.len() != 0 { self.push(Command::Literal(LiteralCommand{ data: data.0, prob:FeatureFlagSliceType::::default(), high_entropy: false, })); } if data.1.len() != 0 { self.push(Command::Literal(LiteralCommand{ data: data.1, prob:FeatureFlagSliceType::::default(), high_entropy: false, })); } } fn push_rand_literals(&mut self, data:&InputPair<'a>) { if data.0.len() != 0 { self.push(Command::Literal(LiteralCommand{ data:data.0, prob:FeatureFlagSliceType::::default(), high_entropy: true, })); } if data.1.len() != 0 { self.push(Command::Literal(LiteralCommand{ data:data.1, prob:FeatureFlagSliceType::::default(), high_entropy: true, })); } } fn push_block_switch_literal(&mut self, block_type: u8) { self.push(Command::BlockSwitchLiteral(LiteralBlockSwitch::new(block_type, 0))) } } pub fn thaw_pair<'a, SliceType: Unfreezable + SliceWrapper>(xself: &Command, data: &InputPair<'a>) -> Command> { match *xself { Command::Literal(ref lit) => { Command::Literal(LiteralCommand{ data:lit.data.thaw_pair(data).unwrap(), prob:FeatureFlagSliceType::default(), high_entropy: lit.high_entropy, }) }, Command::PredictionMode(ref pm) => { Command::PredictionMode(PredictionModeContextMap{ literal_context_map:pm.literal_context_map.thaw_pair(data).unwrap(), predmode_speed_and_distance_context_map:pm.predmode_speed_and_distance_context_map.thaw_pair(data).unwrap(), }) }, Command::Dict(ref d) => { Command::Dict(d.clone()) }, Command::Copy(ref c) => { Command::Copy(c.clone()) }, Command::BlockSwitchCommand(ref c) => { Command::BlockSwitchCommand(c.clone()) }, Command::BlockSwitchLiteral(ref c) => { Command::BlockSwitchLiteral(c.clone()) }, Command::BlockSwitchDistance(ref c) => { Command::BlockSwitchDistance(c.clone()) }, } } pub fn thaw<'a, SliceType: Unfreezable + SliceWrapper>(xself: &Command, data: &'a[u8]) -> Command> { match *xself { Command::Literal(ref lit) => { Command::Literal(LiteralCommand{ data:lit.data.thaw(data), prob:FeatureFlagSliceType::default(), high_entropy: lit.high_entropy, }) }, Command::PredictionMode(ref pm) => { Command::PredictionMode(PredictionModeContextMap{ literal_context_map:pm.literal_context_map.thaw(data), predmode_speed_and_distance_context_map:pm.predmode_speed_and_distance_context_map.thaw(data), }) }, Command::Dict(ref d) => { Command::Dict(d.clone()) }, Command::Copy(ref c) => { Command::Copy(c.clone()) }, Command::BlockSwitchCommand(ref c) => { Command::BlockSwitchCommand(c.clone()) }, Command::BlockSwitchLiteral(ref c) => { Command::BlockSwitchLiteral(c.clone()) }, Command::BlockSwitchDistance(ref c) => { Command::BlockSwitchDistance(c.clone()) }, } } impl +Freezable> Command { pub fn freeze(&self) -> Command { match *self { Command::Literal(ref lit) => { Command::Literal(LiteralCommand{ data:lit.data.freeze(), prob:FeatureFlagSliceType::default(), high_entropy: lit.high_entropy, }) }, Command::PredictionMode(ref pm) => { Command::PredictionMode(PredictionModeContextMap{ literal_context_map:pm.literal_context_map.freeze(), predmode_speed_and_distance_context_map:pm.predmode_speed_and_distance_context_map.freeze(), }) }, Command::Dict(ref d) => { Command::Dict(d.clone()) }, Command::Copy(ref c) => { Command::Copy(c.clone()) }, Command::BlockSwitchCommand(ref c) => { Command::BlockSwitchCommand(c.clone()) }, Command::BlockSwitchLiteral(ref c) => { Command::BlockSwitchLiteral(c.clone()) }, Command::BlockSwitchDistance(ref c) => { Command::BlockSwitchDistance(c.clone()) }, } } } #[inline(always)] pub fn speed_to_u8(data: u16) -> u8 { let length = 16 - data.leading_zeros() as u8; let mantissa = if data != 0 { let rem = data - (1 << (length - 1)); (rem << 3) >> (length - 1) } else { 0 }; (length << 3) | mantissa as u8 } #[inline(always)] pub fn u8_to_speed(data: u8) -> u16 { if data < 8 { 0 } else { let log_val = (data >> 3) - 1; let rem = (u16::from(data) & 0x7) << log_val; (1u16 << log_val) | (rem >> 3) } } #[cfg(test)] mod test { use super::speed_to_u8; use super::u8_to_speed; fn tst_u8_to_speed(data: u16) { assert_eq!(u8_to_speed(speed_to_u8(data)), data); } #[test] fn test_u8_to_speed() { tst_u8_to_speed(0); tst_u8_to_speed(1); tst_u8_to_speed(2); tst_u8_to_speed(3); tst_u8_to_speed(4); tst_u8_to_speed(5); tst_u8_to_speed(6); tst_u8_to_speed(7); tst_u8_to_speed(8); tst_u8_to_speed(10); tst_u8_to_speed(12); tst_u8_to_speed(16); tst_u8_to_speed(24); tst_u8_to_speed(32); tst_u8_to_speed(48); tst_u8_to_speed(64); tst_u8_to_speed(96); tst_u8_to_speed(768); tst_u8_to_speed(1280); tst_u8_to_speed(1536); tst_u8_to_speed(1664); } } brotli-3.4.0/src/enc/ir_interpret.rs000064400000000000000000000105721046102023000155400ustar 00000000000000use super::interface; use super::super::alloc::SliceWrapper; use super::histogram::ContextType; use super::input_pair::InputReference; use super::constants::{kSigned3BitContextLookup, kUTF8ContextLookup}; use super::interface::LiteralPredictionModeNibble; pub trait IRInterpreter { fn inc_local_byte_offset(&mut self, inc:usize); fn local_byte_offset(&self) -> usize; fn update_block_type(&mut self, new_type: u8, new_stride: u8); fn block_type(&self) -> u8; fn literal_data_at_offset(&self, index: usize) -> u8; fn literal_context_map(&self) -> &[u8]; fn prediction_mode(&self) -> ::interface::LiteralPredictionModeNibble; fn update_cost(&mut self, stride_prior: [u8;8], stride_byte_offset: usize, selected_bits:u8, cm_prior: usize, literal: u8); } pub fn push_base<'a, Interpreter: IRInterpreter>(xself: &mut Interpreter, val: interface::Command>) { match val { interface::Command::BlockSwitchCommand(_) | interface::Command::BlockSwitchDistance(_) | interface::Command::PredictionMode(_) => {} interface::Command::Copy(ref copy) => { xself.inc_local_byte_offset(copy.num_bytes as usize); }, interface::Command::Dict(ref dict) => { xself.inc_local_byte_offset(dict.final_size as usize); }, interface::Command::BlockSwitchLiteral(block_type) => xself.update_block_type(block_type.block_type(), block_type.stride()), interface::Command::Literal(ref lit) => { //let stride = xself.get_stride(xself.local_byte_offset()) as usize; let mut priors= [0u8; 8]; for poffset in 0..8 { if xself.local_byte_offset() > poffset { let input_offset = xself.local_byte_offset() - poffset - 1; priors[7 - poffset] = xself.literal_data_at_offset(input_offset); } } let mut cur = 0usize; for literal in lit.data.slice().iter() { let (huffman_table_index, selected_bits) = compute_huffman_table_index_for_context_map(priors[(cur + 7)&7], priors[(cur + 6) &7], xself.literal_context_map(), xself.prediction_mode(), xself.block_type()); xself.update_cost(priors, (cur + 7) & 7, selected_bits, huffman_table_index, *literal); priors[cur & 7] = *literal; cur += 1; cur &= 7; } xself.inc_local_byte_offset(lit.data.slice().len()); } } } // not sure why this fails //impl<'a> interface::CommandProcessor<'a> for IRInterpreter { // fn push])>(&mut self, // val: interface::Command>, // callback: &mut Cb) { // push_base(self, val, callback) // } //} fn compute_huffman_table_index_for_context_map ( prev_byte: u8, prev_prev_byte: u8, literal_context_map: &[u8],//interface::PredictionModeContextMap, prediction_mode: LiteralPredictionModeNibble, block_type: u8, ) -> (usize, u8) { let prior = Context(prev_byte, prev_prev_byte, prediction_mode.to_context_enum().unwrap()); assert!(prior < 64); let context_map_index = ((block_type as usize)<< 6) | prior as usize; if context_map_index < literal_context_map.len() { (literal_context_map[context_map_index] as usize, prior) } else { (prior as usize, prior) } } pub fn Context(p1: u8, p2: u8, mode: ContextType) -> u8 { match mode { ContextType::CONTEXT_LSB6 => { return (p1 as (i32) & 0x3fi32) as (u8); } ContextType::CONTEXT_MSB6 => { return (p1 as (i32) >> 2i32) as (u8); } ContextType::CONTEXT_UTF8 => { return (kUTF8ContextLookup[p1 as (usize)] as (i32) | kUTF8ContextLookup[(p2 as (i32) + 256i32) as (usize)] as (i32)) as (u8); } ContextType::CONTEXT_SIGNED => { return ((kSigned3BitContextLookup[p1 as (usize)] as (i32) << 3i32) + kSigned3BitContextLookup[p2 as (usize)] as (i32)) as (u8); } } // 0i32 as (u8) } brotli-3.4.0/src/enc/literal_cost.rs000075500000000000000000000203011046102023000155100ustar 00000000000000#![allow(dead_code)] use super::utf8_util::BrotliIsMostlyUTF8; use super::util::FastLog2f64; static kMinUTF8Ratio: super::util::floatX = 0.75 as super::util::floatX; fn brotli_min_size_t(a: usize, b: usize) -> usize { if a < b { a } else { b } } fn UTF8Position(last: usize, c: usize, clamp: usize) -> usize { if c < 128i32 as (usize) { 0i32 as (usize) } else if c >= 192i32 as (usize) { brotli_min_size_t(1i32 as (usize), clamp) } else if last < 0xe0i32 as (usize) { 0i32 as (usize) } else { brotli_min_size_t(2i32 as (usize), clamp) } } fn DecideMultiByteStatsLevel(pos: usize, len: usize, mask: usize, data: &[u8]) -> usize { let mut counts: [usize; 3] = [0usize, 0usize, 0usize]; let mut max_utf8: usize = 1usize; let mut last_c: usize = 0usize; let mut i: usize; i = 0usize; while i < len { { let c: usize = data[((pos.wrapping_add(i) & mask) as (usize))] as (usize); { let _rhs = 1; let _lhs = &mut counts[UTF8Position(last_c, c, 2usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (usize)); } last_c = c; } i = i.wrapping_add(1 as (usize)); } if counts[2usize] < 500usize { max_utf8 = 1usize; } if counts[1usize].wrapping_add(counts[2usize]) < 25usize { max_utf8 = 0usize; } max_utf8 } fn EstimateBitCostsForLiteralsUTF8(pos: usize, len: usize, mask: usize, data: &[u8], cost: &mut [super::util::floatX]) { let max_utf8: usize = DecideMultiByteStatsLevel(pos, len, mask, data); let mut histogram: [[usize; 256]; 3] = [[0; 256]; 3]; let window_half: usize = 495usize; let in_window: usize = brotli_min_size_t(window_half, len); let mut in_window_utf8: [usize; 3] = [0usize, 0usize, 0usize]; let mut i: usize; { let mut last_c: usize = 0usize; let mut utf8_pos: usize = 0usize; i = 0usize; while i < in_window { { let c: usize = data[((pos.wrapping_add(i) & mask) as (usize))] as (usize); { let _rhs = 1; let _lhs = &mut histogram[utf8_pos][c]; *_lhs = (*_lhs).wrapping_add(_rhs as (usize)); } { let _rhs = 1; let _lhs = &mut in_window_utf8[utf8_pos]; *_lhs = (*_lhs).wrapping_add(_rhs as (usize)); } utf8_pos = UTF8Position(last_c, c, max_utf8); last_c = c; } i = i.wrapping_add(1 as (usize)); } } i = 0usize; while i < len { { if i >= window_half { let c: usize = (if i < window_half.wrapping_add(1usize) { 0i32 } else { data[((pos.wrapping_add(i).wrapping_sub(window_half).wrapping_sub(1usize) & mask) as (usize))] as (i32) }) as (usize); let last_c: usize = (if i < window_half.wrapping_add(2usize) { 0i32 } else { data[((pos.wrapping_add(i).wrapping_sub(window_half).wrapping_sub(2usize) & mask) as (usize))] as (i32) }) as (usize); let utf8_pos2: usize = UTF8Position(last_c, c, max_utf8); { let _rhs = 1; let _lhs = &mut histogram[utf8_pos2][data[((pos.wrapping_add(i).wrapping_sub(window_half) & mask) as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_sub(_rhs as (usize)); } { let _rhs = 1; let _lhs = &mut in_window_utf8[utf8_pos2]; *_lhs = (*_lhs).wrapping_sub(_rhs as (usize)); } } if i.wrapping_add(window_half) < len { let c: usize = data[((pos.wrapping_add(i) .wrapping_add(window_half) .wrapping_sub(1usize) & mask) as (usize))] as (usize); let last_c: usize = data[((pos.wrapping_add(i) .wrapping_add(window_half) .wrapping_sub(2usize) & mask) as (usize))] as (usize); let utf8_pos2: usize = UTF8Position(last_c, c, max_utf8); { let _rhs = 1; let _lhs = &mut histogram[utf8_pos2][data[((pos.wrapping_add(i).wrapping_add(window_half) & mask) as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (usize)); } { let _rhs = 1; let _lhs = &mut in_window_utf8[utf8_pos2]; *_lhs = (*_lhs).wrapping_add(_rhs as (usize)); } } { let c: usize = (if i < 1usize { 0i32 } else { data[((pos.wrapping_add(i).wrapping_sub(1usize) & mask) as (usize))] as (i32) }) as (usize); let last_c: usize = (if i < 2usize { 0i32 } else { data[((pos.wrapping_add(i).wrapping_sub(2usize) & mask) as (usize))] as (i32) }) as (usize); let utf8_pos: usize = UTF8Position(last_c, c, max_utf8); let masked_pos: usize = pos.wrapping_add(i) & mask; let mut histo: usize = histogram[utf8_pos][data[(masked_pos as (usize))] as (usize)]; //precision is vital here: lets keep double precision let mut lit_cost: f64; if histo == 0usize { histo = 1usize; } lit_cost = FastLog2f64(in_window_utf8[utf8_pos] as u64) as f64 - FastLog2f64(histo as u64) as f64; lit_cost = lit_cost + 0.02905; if lit_cost < 1.0 { lit_cost = lit_cost * 0.5; lit_cost = lit_cost + 0.5; } if i < 2000usize { lit_cost = lit_cost + (0.7 - (2000usize).wrapping_sub(i) as (f64) / 2000.0 * 0.35 ); } cost[(i as (usize))] = lit_cost as (super::util::floatX); } } i = i.wrapping_add(1 as (usize)); } } pub fn BrotliEstimateBitCostsForLiterals(pos: usize, len: usize, mask: usize, data: &[u8], cost: &mut [super::util::floatX]) { if BrotliIsMostlyUTF8(data, pos, mask, len, kMinUTF8Ratio) != 0 { EstimateBitCostsForLiteralsUTF8(pos, len, mask, data, cost); } else { let mut histogram: [usize; 256] = [0; 256]; let window_half: usize = 2000usize; let mut in_window: usize = brotli_min_size_t(window_half, len); let mut i: usize; i = 0usize; while i < in_window { { let _rhs = 1; let _lhs = &mut histogram[data[((pos.wrapping_add(i) & mask) as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (usize)); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < len { { let mut histo: usize; if i >= window_half { { let _rhs = 1; let _lhs = &mut histogram[data[((pos.wrapping_add(i).wrapping_sub(window_half) & mask) as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_sub(_rhs as (usize)); } in_window = in_window.wrapping_sub(1 as (usize)); } if i.wrapping_add(window_half) < len { { let _rhs = 1; let _lhs = &mut histogram[data[((pos.wrapping_add(i).wrapping_add(window_half) & mask) as (usize))] as (usize)]; *_lhs = (*_lhs).wrapping_add(_rhs as (usize)); } in_window = in_window.wrapping_add(1 as (usize)); } histo = histogram[data[((pos.wrapping_add(i) & mask) as (usize))] as (usize)]; if histo == 0usize { histo = 1usize; } { //precision is vital here: lets keep double precision let mut lit_cost: f64 = FastLog2f64(in_window as u64) as f64 - FastLog2f64(histo as u64) as f64; lit_cost = lit_cost + 0.029; if lit_cost < 1.0 { lit_cost = lit_cost * 0.5; lit_cost = lit_cost + 0.5; } cost[(i as (usize))] = lit_cost as (super::util::floatX); } } i = i.wrapping_add(1 as (usize)); } } } brotli-3.4.0/src/enc/metablock.rs000075500000000000000000001371331046102023000150010ustar 00000000000000#![allow(dead_code)] use super::combined_alloc::BrotliAlloc; use super::backward_references::{BrotliEncoderParams}; use super::encode::{BROTLI_DISTANCE_ALPHABET_SIZE, BROTLI_MAX_DISTANCE_BITS, BROTLI_LARGE_MAX_DISTANCE_BITS, BROTLI_MAX_ALLOWED_DISTANCE}; use super::constants::BROTLI_MAX_NPOSTFIX; use super::bit_cost::{BitsEntropy, BrotliPopulationCost}; use super::block_split::BlockSplit; use super::block_splitter::BrotliSplitBlock; use super::brotli_bit_stream::MetaBlockSplit; use super::cluster::BrotliClusterHistograms; use super::command::{Command, CommandCopyLen, CommandRestoreDistanceCode, PrefixEncodeCopyDistance, BrotliDistanceParams}; use super::entropy_encode::BrotliOptimizeHuffmanCountsForRle; use super::histogram::{BrotliBuildHistogramsWithContext, CostAccessors, HistogramLiteral, HistogramCommand, HistogramDistance, HistogramClear, ClearHistograms, ContextType, HistogramAddHistogram, HistogramAddItem, Context, }; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use super::util::{brotli_min_size_t, brotli_max_size_t}; use core; pub fn BrotliInitDistanceParams(params: &mut BrotliEncoderParams, npostfix: u32, ndirect: u32) { let dist_params = &mut params.dist; let mut alphabet_size; let mut max_distance; dist_params.distance_postfix_bits = npostfix; dist_params.num_direct_distance_codes = ndirect; alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE( npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS); max_distance = ndirect + (1u32 << (BROTLI_MAX_DISTANCE_BITS + npostfix + 2)) - (1u32 << (npostfix + 2)); if (params.large_window) { let bound:[u32;BROTLI_MAX_NPOSTFIX + 1] = [0, 4, 12, 28]; let postfix = 1u32 << npostfix; alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE( npostfix, ndirect, BROTLI_LARGE_MAX_DISTANCE_BITS); /* The maximum distance is set so that no distance symbol used can encode a distance larger than BROTLI_MAX_ALLOWED_DISTANCE with all its extra bits set. */ if (ndirect < bound[npostfix as usize]) { max_distance = BROTLI_MAX_ALLOWED_DISTANCE as u32 - (bound[npostfix as usize] - ndirect); } else if (ndirect >= bound[npostfix as usize ] + postfix) { max_distance = (3u32 << 29) - 4 + (ndirect - bound[npostfix as usize]); } else { max_distance = BROTLI_MAX_ALLOWED_DISTANCE as u32; } } dist_params.alphabet_size = alphabet_size; dist_params.max_distance = max_distance as usize; } fn RecomputeDistancePrefixes(cmds: &mut [Command], num_commands: usize, orig_params:&BrotliDistanceParams, new_params: &BrotliDistanceParams) { if orig_params.distance_postfix_bits == new_params.distance_postfix_bits && orig_params.num_direct_distance_codes == new_params.num_direct_distance_codes { return; } for cmd in cmds.split_at_mut(num_commands).0.iter_mut() { if (CommandCopyLen(cmd) != 0 && cmd.cmd_prefix_ >= 128) { let ret = CommandRestoreDistanceCode(cmd, orig_params); PrefixEncodeCopyDistance(ret as usize, new_params.num_direct_distance_codes as usize, new_params.distance_postfix_bits as u64, &mut cmd.dist_prefix_, &mut cmd.dist_extra_); } } } fn ComputeDistanceCost(cmds: &[Command], num_commands: usize, orig_params: &BrotliDistanceParams, new_params: &BrotliDistanceParams, scratch: &mut ::i32vec, cost: &mut f64) -> bool { let mut equal_params = false; let mut dist_prefix: u16 = 0; let mut dist_extra: u32 = 0; let mut extra_bits: f64 = 0.0; let mut histo = HistogramDistance::default(); if (orig_params.distance_postfix_bits == new_params.distance_postfix_bits && orig_params.num_direct_distance_codes == new_params.num_direct_distance_codes) { equal_params = true; } for cmd in cmds.split_at(num_commands).0 { if CommandCopyLen(cmd) != 0 && cmd.cmd_prefix_ >= 128 { if (equal_params) { dist_prefix = cmd.dist_prefix_; } else { let distance = CommandRestoreDistanceCode(cmd, orig_params); if distance > new_params.max_distance as u32 { return false; } PrefixEncodeCopyDistance(distance as usize, new_params.num_direct_distance_codes as usize, new_params.distance_postfix_bits as u64, &mut dist_prefix, &mut dist_extra); } HistogramAddItem(&mut histo, (dist_prefix & 0x3FF) as usize); extra_bits += (dist_prefix >> 10) as f64; } } *cost = BrotliPopulationCost(&histo, scratch) as f64 + extra_bits; return true; } pub fn BrotliBuildMetaBlock (alloc: &mut Alloc, ringbuffer: &[u8], pos: usize, mask: usize, params: &mut BrotliEncoderParams, prev_byte: u8, prev_byte2: u8, cmds: &mut [Command], num_commands: usize, literal_context_mode: ContextType, lit_scratch_space: &mut ::i32vec, cmd_scratch_space: &mut ::i32vec, dst_scratch_space: &mut ::i32vec, mb: &mut MetaBlockSplit) { static kMaxNumberOfHistograms: usize = 256usize; let mut distance_histograms: >::AllocatedMemory; let mut literal_histograms: >::AllocatedMemory; let mut literal_context_modes: >::AllocatedMemory = >::AllocatedMemory::default(); let literal_histograms_size: usize; let distance_histograms_size: usize; let mut i: usize; let mut literal_context_multiplier: usize = 1usize; let mut ndirect_msb:u32 = 0; let mut check_orig = true; if !params.avoid_distance_prefix_search { let mut best_dist_cost: f64 = 1e99; let orig_params = params.clone(); let mut new_params = params.clone(); for npostfix in 0..(BROTLI_MAX_NPOSTFIX + 1) { while ndirect_msb < 16 { let ndirect = ndirect_msb << npostfix; let skip: bool; let mut dist_cost: f64 = 0.0; BrotliInitDistanceParams(&mut new_params, npostfix as u32, ndirect as u32); if npostfix as u32 == orig_params.dist.distance_postfix_bits && ndirect == orig_params.dist.num_direct_distance_codes { check_orig = false; } skip = !ComputeDistanceCost( cmds, num_commands, &orig_params.dist, &new_params.dist, dst_scratch_space, &mut dist_cost); if skip || (dist_cost > best_dist_cost) { break; } best_dist_cost = dist_cost; params.dist = new_params.dist; ndirect_msb += 1; } if ndirect_msb > 0 { ndirect_msb -= 1; } ndirect_msb /= 2; } if check_orig { let mut dist_cost: f64 = 0.0; ComputeDistanceCost(cmds, num_commands, &orig_params.dist, &orig_params.dist, dst_scratch_space, &mut dist_cost); if dist_cost < best_dist_cost { // best_dist_cost = dist_cost; unused params.dist = orig_params.dist; } } RecomputeDistancePrefixes(cmds, num_commands, &orig_params.dist, ¶ms.dist); } BrotliSplitBlock(alloc, cmds, num_commands, ringbuffer, pos, mask, params, lit_scratch_space, cmd_scratch_space, dst_scratch_space, &mut (*mb).literal_split, &mut (*mb).command_split, &mut (*mb).distance_split); if (*params).disable_literal_context_modeling == 0 { literal_context_multiplier = (1i32 << 6i32) as (usize); literal_context_modes = >::alloc_cell(alloc, (*mb).literal_split.num_types); for item in literal_context_modes.slice_mut().iter_mut() { *item = literal_context_mode; } } literal_histograms_size = (*mb).literal_split.num_types.wrapping_mul(literal_context_multiplier); literal_histograms = >::alloc_cell(alloc, literal_histograms_size); distance_histograms_size = (*mb).distance_split.num_types << 2i32; distance_histograms = >::alloc_cell(alloc, distance_histograms_size); (*mb).command_histograms_size = (*mb).command_split.num_types; (*mb).command_histograms = >::alloc_cell(alloc, (*mb).command_histograms_size); BrotliBuildHistogramsWithContext(cmds, num_commands, &mut (*mb).literal_split, &mut (*mb).command_split, &mut (*mb).distance_split, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_modes.slice(), literal_histograms.slice_mut(), (*mb).command_histograms.slice_mut(), distance_histograms.slice_mut()); >::free_cell(alloc, literal_context_modes); (*mb).literal_context_map_size = (*mb).literal_split.num_types << 6i32; (*mb).literal_context_map = >::alloc_cell(alloc, (*mb).literal_context_map_size); (*mb).literal_histograms_size = (*mb).literal_context_map_size; (*mb).literal_histograms = >::alloc_cell(alloc, (*mb).literal_histograms_size); BrotliClusterHistograms(alloc, literal_histograms.slice(), literal_histograms_size, kMaxNumberOfHistograms, lit_scratch_space, (*mb).literal_histograms.slice_mut(), &mut (*mb).literal_histograms_size, (*mb).literal_context_map.slice_mut()); >::free_cell(alloc, literal_histograms); if (*params).disable_literal_context_modeling != 0 { i = (*mb).literal_split.num_types; while i != 0usize { let mut j: usize = 0usize; i = i.wrapping_sub(1 as (usize)); while j < (1i32 << 6i32) as (usize) { { let val = (*mb).literal_context_map.slice()[(i as (usize))]; (*mb).literal_context_map.slice_mut()[((i << 6i32).wrapping_add(j) as (usize))] = val; } j = j.wrapping_add(1 as (usize)); } } } (*mb).distance_context_map_size = (*mb).distance_split.num_types << 2i32; (*mb).distance_context_map = >::alloc_cell(alloc, (*mb).distance_context_map_size); (*mb).distance_histograms_size = (*mb).distance_context_map_size; (*mb).distance_histograms = >::alloc_cell(alloc, (*mb).distance_histograms_size); BrotliClusterHistograms(alloc, distance_histograms.slice(), (*mb).distance_context_map_size, kMaxNumberOfHistograms, dst_scratch_space, (*mb).distance_histograms.slice_mut(), &mut (*mb).distance_histograms_size, (*mb).distance_context_map.slice_mut()); >::free_cell(alloc, distance_histograms); } /* pub struct BlockSplitter<'a, HistogramType:SliceWrapper+SliceWrapperMut +CostAccessors, AllocU8:alloc::Allocator+'a, AllocU32:alloc::Allocator+'a, AllocHT:alloc::Allocator+'a > { */ pub struct BlockSplitter { pub alphabet_size_: usize, pub min_block_size_: usize, pub split_threshold_: super::util::floatX, pub num_blocks_: usize, // pub split_: &'a mut BlockSplit, // pub histograms_: AllocHT::AllocatedMemory, // FIXME: pull this one out at the end // pub histograms_size_: &'a mut usize, // FIXME: pull this one out at the end pub target_block_size_: usize, pub block_size_: usize, pub curr_histogram_ix_: usize, pub last_histogram_ix_: [usize; 2], pub last_entropy_: [super::util::floatX; 2], pub merge_last_count_: usize, } pub struct ContextBlockSplitter { pub alphabet_size_: usize, pub num_contexts_: usize, pub max_block_types_: usize, pub min_block_size_: usize, pub split_threshold_: super::util::floatX, pub num_blocks_: usize, // pub split_: &'a mut BlockSplit, // pub histograms_: AllocHL::AllocatedMemory, // pub histograms_size_: &'a mut usize, // FIXME: pull this one out at the end pub target_block_size_: usize, pub block_size_: usize, pub curr_histogram_ix_: usize, pub last_histogram_ix_: [usize; 2], pub last_entropy_: [super::util::floatX; 2 * BROTLI_MAX_STATIC_CONTEXTS], pub merge_last_count_: usize, } enum LitBlocks { plain(BlockSplitter), //<'a, HistogramLiteral, AllocU8, AllocU32, AllocHL>, ctx(ContextBlockSplitter), //<'a, AllocU8, AllocU32, AllocHL>, } /* pub struct BlockSplitterCommand { pub alphabet_size_: usize, pub min_block_size_: usize, pub split_threshold_: super::util::floatX, pub num_blocks_: usize, pub split_: *mut BlockSplit, pub histograms_: *mut HistogramCommand, pub histograms_size_: *mut usize, pub target_block_size_: usize, pub block_size_: usize, pub curr_histogram_ix_: usize, pub last_histogram_ix_: [usize; 2], pub last_entropy_: [super::util::floatX; 2], pub merge_last_count_: usize, } pub struct BlockSplitterDistance { pub alphabet_size_: usize, pub min_block_size_: usize, pub split_threshold_: super::util::floatX, pub num_blocks_: usize, pub split_: *mut BlockSplit, pub histograms_: *mut HistogramDistance, pub histograms_size_: *mut usize, pub target_block_size_: usize, pub block_size_: usize, pub curr_histogram_ix_: usize, pub last_histogram_ix_: [usize; 2], pub last_entropy_: [super::util::floatX; 2], pub merge_last_count_: usize, } */ fn InitBlockSplitter + SliceWrapperMut + CostAccessors, Alloc: alloc::Allocator + alloc::Allocator + alloc::Allocator> (alloc: &mut Alloc, alphabet_size: usize, min_block_size: usize, split_threshold: super::util::floatX, num_symbols: usize, split: &mut BlockSplit, histograms: &mut >::AllocatedMemory, histograms_size: &mut usize) -> BlockSplitter { let max_num_blocks: usize = num_symbols.wrapping_div(min_block_size).wrapping_add(1usize); let max_num_types: usize = brotli_min_size_t(max_num_blocks, (256i32 + 1i32) as (usize)); let mut xself = BlockSplitter { last_entropy_: [0.0 as super::util::floatX; 2], alphabet_size_: alphabet_size, min_block_size_: min_block_size, split_threshold_: split_threshold, num_blocks_: 0usize, //(*xself).split_ : split, //(*xself).histograms_size_ : histograms_size, target_block_size_: min_block_size, block_size_: 0usize, curr_histogram_ix_: 0usize, merge_last_count_: 0usize, last_histogram_ix_: [0usize; 2], }; { if (*split).types.slice().len() < max_num_blocks { let mut _new_size: usize = if (*split).types.slice().len() == 0usize { max_num_blocks } else { (*split).types.slice().len() }; let mut new_array: >::AllocatedMemory; while _new_size < max_num_blocks { _new_size = _new_size.wrapping_mul(2usize); } new_array = >::alloc_cell(alloc, _new_size); if ((*split).types.slice().len() != 0usize) { new_array.slice_mut()[..(*split).types.slice().len()].clone_from_slice((*split) .types .slice()); } >::free_cell(alloc, core::mem::replace(&mut (*split).types, new_array)); } } { if (*split).lengths.slice().len() < max_num_blocks { let mut _new_size: usize = if (*split).lengths.slice().len() == 0usize { max_num_blocks } else { (*split).lengths.slice().len() }; while _new_size < max_num_blocks { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); new_array.slice_mut()[..(*split).lengths.slice().len()].clone_from_slice((*split) .lengths .slice()); >::free_cell(alloc, core::mem::replace(&mut (*split).lengths, new_array)); } } (*split).num_blocks = max_num_blocks; *histograms_size = max_num_types; let hlocal = >::alloc_cell(alloc, *histograms_size); >::free_cell(alloc, core::mem::replace(&mut *histograms, hlocal)); HistogramClear(&mut histograms.slice_mut()[0]); xself.last_histogram_ix_[0] = 0; xself.last_histogram_ix_[1] = 0; return xself; } fn InitContextBlockSplitter + alloc::Allocator + alloc::Allocator> (alloc: &mut Alloc, alphabet_size: usize, num_contexts: usize, min_block_size: usize, split_threshold: super::util::floatX, num_symbols: usize, split: &mut BlockSplit, histograms: &mut >::AllocatedMemory, histograms_size: &mut usize) -> ContextBlockSplitter { let max_num_blocks: usize = num_symbols.wrapping_div(min_block_size).wrapping_add(1usize); let max_num_types: usize; assert!(num_contexts <= BROTLI_MAX_STATIC_CONTEXTS); let mut xself = ContextBlockSplitter { alphabet_size_: alphabet_size, num_contexts_: num_contexts, max_block_types_: (256usize).wrapping_div(num_contexts), min_block_size_: min_block_size, split_threshold_: split_threshold, num_blocks_: 0usize, // histograms_size_: histograms_size, target_block_size_: min_block_size, block_size_: 0usize, curr_histogram_ix_: 0usize, merge_last_count_: 0usize, last_histogram_ix_: [0; 2], last_entropy_: [0.0 as super::util::floatX; 2 * BROTLI_MAX_STATIC_CONTEXTS], }; max_num_types = brotli_min_size_t(max_num_blocks, xself.max_block_types_.wrapping_add(1usize)); { if (*split).types.slice().len() < max_num_blocks { let mut _new_size: usize = if (*split).types.slice().len() == 0usize { max_num_blocks } else { (*split).types.slice().len() }; while _new_size < max_num_blocks { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); if ((*split).types.slice().len() != 0usize) { new_array.slice_mut()[..(*split).types.slice().len()].clone_from_slice((*split) .types .slice()); } >::free_cell(alloc, core::mem::replace(&mut (*split).types, new_array)); } } { if (*split).lengths.slice().len() < max_num_blocks { let mut _new_size: usize = if (*split).lengths.slice().len() == 0usize { max_num_blocks } else { (*split).lengths.slice().len() }; while _new_size < max_num_blocks { _new_size = _new_size.wrapping_mul(2usize); } let mut new_array = >::alloc_cell(alloc, _new_size); if ((*split).lengths.slice().len() != 0usize) { new_array.slice_mut()[..(*split).lengths.slice().len()].clone_from_slice((*split) .lengths .slice()); } >::free_cell(alloc, core::mem::replace(&mut (*split).lengths, new_array)); } } (*split).num_blocks = max_num_blocks; *histograms_size = max_num_types.wrapping_mul(num_contexts); *histograms = >::alloc_cell(alloc, *histograms_size); //(*xself).histograms_ = *histograms; ClearHistograms(&mut histograms.slice_mut()[(0usize)..], num_contexts); xself.last_histogram_ix_[0] = 0; xself.last_histogram_ix_[1] = 0; return xself; } fn BlockSplitterFinishBlock +SliceWrapperMut +CostAccessors +Clone, Alloc:alloc::Allocator + alloc::Allocator>(xself: &mut BlockSplitter, split: &mut BlockSplit, histograms: &mut [HistogramType], histograms_size: &mut usize, is_final: i32){ (*xself).block_size_ = brotli_max_size_t((*xself).block_size_, (*xself).min_block_size_); if (*xself).num_blocks_ == 0usize { (*split).lengths.slice_mut()[(0usize)] = (*xself).block_size_ as (u32); (*split).types.slice_mut()[(0usize)] = 0i32 as (u8); (*xself).last_entropy_[(0usize)] = BitsEntropy((histograms[(0usize)]).slice(), (*xself).alphabet_size_); (*xself).last_entropy_[(1usize)] = (*xself).last_entropy_[(0usize)]; (*xself).num_blocks_ = (*xself).num_blocks_.wrapping_add(1 as (usize)); (*split).num_types = (*split).num_types.wrapping_add(1 as (usize)); (*xself).curr_histogram_ix_ = (*xself).curr_histogram_ix_.wrapping_add(1 as (usize)); if (*xself).curr_histogram_ix_ < *histograms_size { HistogramClear(&mut histograms[((*xself).curr_histogram_ix_ as (usize))]); } (*xself).block_size_ = 0usize; } else if (*xself).block_size_ > 0usize { let entropy: super::util::floatX = BitsEntropy((histograms[((*xself).curr_histogram_ix_ as (usize))]).slice(), (*xself).alphabet_size_); let mut combined_histo: [HistogramType; 2] = [histograms[(*xself).curr_histogram_ix_].clone(), histograms[(*xself).curr_histogram_ix_].clone()]; let mut combined_entropy: [super::util::floatX; 2] = [0.0 as super::util::floatX, 0.0 as super::util::floatX]; let mut diff: [super::util::floatX; 2] = [0.0 as super::util::floatX, 0.0 as super::util::floatX]; for j in 0..2 { { let last_histogram_ix: usize = (*xself).last_histogram_ix_[j]; HistogramAddHistogram(&mut combined_histo[j], &histograms[(last_histogram_ix as (usize))]); combined_entropy[j] = BitsEntropy(&mut combined_histo[j].slice_mut()[0usize..], (*xself).alphabet_size_); diff[j] = combined_entropy[j] - entropy - (*xself).last_entropy_[(j as (usize))]; } } if (*split).num_types < 256usize && (diff[0usize] > (*xself).split_threshold_) && (diff[1usize] > (*xself).split_threshold_) { (*split).lengths.slice_mut()[((*xself).num_blocks_ as (usize))] = (*xself).block_size_ as (u32); (*split).types.slice_mut()[((*xself).num_blocks_ as (usize))] = (*split).num_types as (u8); (*xself).last_histogram_ix_[1usize] = (*xself).last_histogram_ix_[0usize]; (*xself).last_histogram_ix_[0usize] = (*split).num_types as (u8) as (usize); (*xself).last_entropy_[(1usize)] = (*xself).last_entropy_[(0usize)]; (*xself).last_entropy_[(0usize)] = entropy; (*xself).num_blocks_ = (*xself).num_blocks_.wrapping_add(1 as (usize)); (*split).num_types = (*split).num_types.wrapping_add(1 as (usize)); (*xself).curr_histogram_ix_ = (*xself).curr_histogram_ix_.wrapping_add(1 as (usize)); if (*xself).curr_histogram_ix_ < *histograms_size { HistogramClear(&mut histograms[((*xself).curr_histogram_ix_ as (usize))]); } (*xself).block_size_ = 0usize; (*xself).merge_last_count_ = 0usize; (*xself).target_block_size_ = (*xself).min_block_size_; } else if diff[1usize] < diff[0usize] - 20.0 as super::util::floatX { (*split).lengths.slice_mut()[((*xself).num_blocks_ as (usize))] = (*xself).block_size_ as (u32); (*split).types.slice_mut()[((*xself).num_blocks_ as (usize))] = (*split).types.slice() [((*xself).num_blocks_.wrapping_sub(2usize) as (usize))]; //FIXME: investigate copy? { let mut __brotli_swap_tmp: usize = (*xself).last_histogram_ix_[0usize]; (*xself).last_histogram_ix_[0usize] = (*xself).last_histogram_ix_[1usize]; (*xself).last_histogram_ix_[1usize] = __brotli_swap_tmp; } histograms[((*xself).last_histogram_ix_[0usize] as (usize))] = combined_histo[1usize].clone(); (*xself).last_entropy_[(1usize)] = (*xself).last_entropy_[(0usize)]; (*xself).last_entropy_[(0usize)] = combined_entropy[1usize]; (*xself).num_blocks_ = (*xself).num_blocks_.wrapping_add(1 as (usize)); (*xself).block_size_ = 0usize; HistogramClear(&mut histograms[((*xself).curr_histogram_ix_ as (usize))]); (*xself).merge_last_count_ = 0usize; (*xself).target_block_size_ = (*xself).min_block_size_; } else { { let _rhs = (*xself).block_size_ as (u32); let _lhs = &mut (*split).lengths.slice_mut()[((*xself).num_blocks_.wrapping_sub(1usize) as (usize))]; *_lhs = (*_lhs).wrapping_add(_rhs); } histograms[((*xself).last_histogram_ix_[0usize] as (usize))] = combined_histo[0usize].clone(); (*xself).last_entropy_[(0usize)] = combined_entropy[0usize]; if (*split).num_types == 1usize { (*xself).last_entropy_[(1usize)] = (*xself).last_entropy_[(0usize)]; } (*xself).block_size_ = 0usize; HistogramClear(&mut histograms[((*xself).curr_histogram_ix_ as (usize))]); if { (*xself).merge_last_count_ = (*xself).merge_last_count_.wrapping_add(1 as (usize)); (*xself).merge_last_count_ } > 1usize { (*xself).target_block_size_ = (*xself).target_block_size_.wrapping_add((*xself).min_block_size_); } } } if is_final != 0 { *histograms_size = (*split).num_types; (*split).num_blocks = (*xself).num_blocks_; } } const BROTLI_MAX_STATIC_CONTEXTS: usize = 13; fn ContextBlockSplitterFinishBlock + alloc::Allocator + alloc::Allocator, AllocHL:alloc::Allocator> (xself: &mut ContextBlockSplitter, m : &mut AllocHL, split: &mut BlockSplit, histograms: &mut [HistogramLiteral], histograms_size: &mut usize, is_final: i32) { let num_contexts: usize = (*xself).num_contexts_; if (*xself).block_size_ < (*xself).min_block_size_ { (*xself).block_size_ = (*xself).min_block_size_; } if (*xself).num_blocks_ == 0usize { let mut i: usize; (*split).lengths.slice_mut()[(0usize)] = (*xself).block_size_ as (u32); (*split).types.slice_mut()[(0usize)] = 0i32 as (u8); i = 0usize; while i < num_contexts { { (*xself).last_entropy_[(i as (usize))] = BitsEntropy((histograms[(i as (usize))]).slice(), (*xself).alphabet_size_); (*xself).last_entropy_[(num_contexts.wrapping_add(i) as (usize))] = (*xself).last_entropy_ [(i as (usize))]; } i = i.wrapping_add(1 as (usize)); } (*xself).num_blocks_ = (*xself).num_blocks_.wrapping_add(1 as (usize)); (*split).num_types = (*split).num_types.wrapping_add(1 as (usize)); (*xself).curr_histogram_ix_ = (*xself).curr_histogram_ix_.wrapping_add(num_contexts); if (*xself).curr_histogram_ix_ < *histograms_size { ClearHistograms(&mut histograms[((*xself).curr_histogram_ix_ as (usize))..], (*xself).num_contexts_); } (*xself).block_size_ = 0usize; } else if (*xself).block_size_ > 0usize { let mut entropy = [0.0 as super::util::floatX; BROTLI_MAX_STATIC_CONTEXTS]; let mut combined_histo = m.alloc_cell(2 * num_contexts); let mut combined_entropy = [0.0 as super::util::floatX; 2 * BROTLI_MAX_STATIC_CONTEXTS]; let mut diff: [super::util::floatX; 2] = [0.0 as super::util::floatX; 2]; let mut i: usize; i = 0usize; while i < num_contexts { { let curr_histo_ix: usize = (*xself).curr_histogram_ix_.wrapping_add(i); let mut j: usize; entropy[i] = BitsEntropy(&(histograms[(curr_histo_ix as (usize))]).slice(), (*xself).alphabet_size_); j = 0usize; while j < 2usize { { let jx: usize = j.wrapping_mul(num_contexts).wrapping_add(i); let last_histogram_ix: usize = (*xself).last_histogram_ix_[j].wrapping_add(i); combined_histo.slice_mut()[jx] = histograms[(curr_histo_ix as (usize))].clone(); HistogramAddHistogram(&mut combined_histo.slice_mut()[jx], &mut histograms[(last_histogram_ix as (usize))]); combined_entropy[jx] = BitsEntropy(combined_histo.slice()[jx].slice(), (*xself).alphabet_size_); { let _rhs = combined_entropy[jx] - entropy[i] - (*xself).last_entropy_[(jx as (usize))]; let _lhs = &mut diff[j]; *_lhs = *_lhs + _rhs; } } j = j.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } if (*split).num_types < (*xself).max_block_types_ && (diff[0usize] > (*xself).split_threshold_) && (diff[1usize] > (*xself).split_threshold_) { (*split).lengths.slice_mut()[((*xself).num_blocks_ as (usize))] = (*xself).block_size_ as (u32); (*split).types.slice_mut()[((*xself).num_blocks_ as (usize))] = (*split).num_types as (u8); (*xself).last_histogram_ix_[1usize] = (*xself).last_histogram_ix_[0usize]; (*xself).last_histogram_ix_[0usize] = (*split).num_types.wrapping_mul(num_contexts); i = 0usize; while i < num_contexts { { (*xself).last_entropy_[(num_contexts.wrapping_add(i) as (usize))] = (*xself).last_entropy_[(i as (usize))]; (*xself).last_entropy_[(i as (usize))] = entropy[i]; } i = i.wrapping_add(1 as (usize)); } (*xself).num_blocks_ = (*xself).num_blocks_.wrapping_add(1 as (usize)); (*split).num_types = (*split).num_types.wrapping_add(1 as (usize)); (*xself).curr_histogram_ix_ = (*xself).curr_histogram_ix_.wrapping_add(num_contexts); if (*xself).curr_histogram_ix_ < *histograms_size { ClearHistograms(&mut histograms[((*xself).curr_histogram_ix_ as (usize))..], (*xself).num_contexts_); } (*xself).block_size_ = 0usize; (*xself).merge_last_count_ = 0usize; (*xself).target_block_size_ = (*xself).min_block_size_; } else if diff[1usize] < diff[0usize] - 20.0 as super::util::floatX { (*split).lengths.slice_mut()[((*xself).num_blocks_ as (usize))] = (*xself).block_size_ as (u32); let nbm2 = (*split).types.slice()[((*xself).num_blocks_.wrapping_sub(2usize) as (usize))]; (*split).types.slice_mut()[((*xself).num_blocks_ as (usize))] = nbm2; { let mut __brotli_swap_tmp: usize = (*xself).last_histogram_ix_[0usize]; (*xself).last_histogram_ix_[0usize] = (*xself).last_histogram_ix_[1usize]; (*xself).last_histogram_ix_[1usize] = __brotli_swap_tmp; } i = 0usize; while i < num_contexts { { histograms[((*xself).last_histogram_ix_[0usize].wrapping_add(i) as (usize))] = combined_histo.slice()[num_contexts.wrapping_add(i)].clone(); (*xself).last_entropy_[(num_contexts.wrapping_add(i) as (usize))] = (*xself).last_entropy_[(i as (usize))]; (*xself).last_entropy_[(i as (usize))] = combined_entropy[num_contexts.wrapping_add(i)]; HistogramClear(&mut histograms[((*xself).curr_histogram_ix_.wrapping_add(i) as (usize))]); } i = i.wrapping_add(1 as (usize)); } (*xself).num_blocks_ = (*xself).num_blocks_.wrapping_add(1 as (usize)); (*xself).block_size_ = 0usize; (*xself).merge_last_count_ = 0usize; (*xself).target_block_size_ = (*xself).min_block_size_; } else { { let _rhs = (*xself).block_size_ as (u32); let _lhs = &mut (*split).lengths.slice_mut()[((*xself).num_blocks_.wrapping_sub(1usize) as (usize))]; let old_split_length = *_lhs; *_lhs = old_split_length.wrapping_add(_rhs); } i = 0usize; while i < num_contexts { { histograms[((*xself).last_histogram_ix_[0usize].wrapping_add(i) as (usize))] = combined_histo.slice()[i].clone(); (*xself).last_entropy_[(i as (usize))] = combined_entropy[i]; if (*split).num_types == 1usize { (*xself).last_entropy_[(num_contexts.wrapping_add(i) as (usize))] = (*xself).last_entropy_[(i as (usize))]; } HistogramClear(&mut histograms[((*xself).curr_histogram_ix_.wrapping_add(i) as (usize))]); } i = i.wrapping_add(1 as (usize)); } (*xself).block_size_ = 0usize; if { (*xself).merge_last_count_ = (*xself).merge_last_count_.wrapping_add(1 as (usize)); (*xself).merge_last_count_ } > 1usize { (*xself).target_block_size_ = (*xself).target_block_size_.wrapping_add((*xself).min_block_size_); } } m.free_cell(combined_histo); } if is_final != 0 { *histograms_size = (*split).num_types.wrapping_mul(num_contexts); (*split).num_blocks = (*xself).num_blocks_; } } fn BlockSplitterAddSymbol +SliceWrapperMut +CostAccessors +Clone, Alloc:alloc::Allocator + alloc::Allocator>(xself: &mut BlockSplitter, split: &mut BlockSplit, histograms: &mut [HistogramType], histograms_size: &mut usize, symbol: usize){ HistogramAddItem(&mut histograms[((*xself).curr_histogram_ix_ as (usize))], symbol); (*xself).block_size_ = (*xself).block_size_.wrapping_add(1 as (usize)); if (*xself).block_size_ == (*xself).target_block_size_ { BlockSplitterFinishBlock(xself, split, histograms, histograms_size, 0i32); } } fn ContextBlockSplitterAddSymbol + alloc::Allocator + alloc::Allocator> (xself: &mut ContextBlockSplitter, m : &mut Alloc, split: &mut BlockSplit, histograms: &mut [HistogramLiteral], histograms_size: &mut usize, symbol: usize, context: usize) { HistogramAddItem(&mut histograms[((*xself).curr_histogram_ix_.wrapping_add(context) as (usize))], symbol); (*xself).block_size_ = (*xself).block_size_.wrapping_add(1 as (usize)); if (*xself).block_size_ == (*xself).target_block_size_ { ContextBlockSplitterFinishBlock(xself, m, split, histograms, histograms_size, 0i32); } } fn MapStaticContexts + alloc::Allocator + alloc::Allocator+ alloc::Allocator + alloc::Allocator> (m32: &mut Alloc, num_contexts: usize, static_context_map: &[u32], mb: &mut MetaBlockSplit) { let mut i: usize; (*mb).literal_context_map_size = (*mb).literal_split.num_types << 6i32; let new_literal_context_map = >::alloc_cell(m32, (*mb).literal_context_map_size); >::free_cell(m32, core::mem::replace(&mut (*mb).literal_context_map, new_literal_context_map)); i = 0usize; while i < (*mb).literal_split.num_types { { let offset: u32 = i.wrapping_mul(num_contexts) as (u32); let mut j: usize; j = 0usize; while j < (1u32 << 6i32) as (usize) { { (*mb).literal_context_map.slice_mut()[((i << 6i32).wrapping_add(j) as (usize))] = offset.wrapping_add(static_context_map[(j as (usize))]); } j = j.wrapping_add(1 as (usize)); } } i = i.wrapping_add(1 as (usize)); } } pub fn BrotliBuildMetaBlockGreedyInternal + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator> (alloc: &mut Alloc, ringbuffer: &[u8], mut pos: usize, mask: usize, mut prev_byte: u8, mut prev_byte2: u8, literal_context_mode: ContextType, num_contexts: usize, static_context_map: &[u32], commands: &[Command], n_commands: usize, mb: &mut MetaBlockSplit) { let mut lit_blocks: LitBlocks; let mut cmd_blocks: BlockSplitter; let mut dist_blocks: BlockSplitter; let mut num_literals: usize = 0usize; let mut i: usize; i = 0usize; while i < n_commands { { num_literals = num_literals.wrapping_add((commands[(i as (usize))]).insert_len_ as (usize)); } i = i.wrapping_add(1 as (usize)); } lit_blocks = if num_contexts == 1usize { LitBlocks::plain(InitBlockSplitter::(alloc, 256usize, 512usize, 400.0 as super::util::floatX, num_literals, &mut (*mb).literal_split, &mut (*mb).literal_histograms, &mut (*mb).literal_histograms_size)) } else { LitBlocks::ctx(InitContextBlockSplitter::(alloc, 256usize, num_contexts, 512usize, 400.0 as super::util::floatX, num_literals, &mut (*mb).literal_split, &mut (*mb).literal_histograms, &mut (*mb).literal_histograms_size)) }; cmd_blocks = InitBlockSplitter::(alloc, 704usize, 1024usize, 500.0 as super::util::floatX, n_commands, &mut (*mb).command_split, &mut (*mb).command_histograms, &mut (*mb).command_histograms_size); dist_blocks = InitBlockSplitter::(alloc, 64usize, 512usize, 100.0 as super::util::floatX, n_commands, &mut (*mb).distance_split, &mut (*mb).distance_histograms, &mut (*mb).distance_histograms_size); i = 0usize; while i < n_commands { { let cmd: Command = commands[(i as (usize))].clone(); let mut j: usize; BlockSplitterAddSymbol(&mut cmd_blocks, &mut (*mb).command_split, &mut (*mb).command_histograms.slice_mut(), &mut (*mb).command_histograms_size, cmd.cmd_prefix_ as (usize)); j = cmd.insert_len_ as (usize); while j != 0usize { { let literal: u8 = ringbuffer[((pos & mask) as (usize))]; match (&mut lit_blocks) { &mut LitBlocks::plain(ref mut lit_blocks_plain) => { BlockSplitterAddSymbol(lit_blocks_plain, &mut (*mb).literal_split, &mut (*mb).literal_histograms.slice_mut(), &mut (*mb).literal_histograms_size, literal as (usize)) } &mut LitBlocks::ctx(ref mut lit_blocks_ctx) => { let context: usize = Context(prev_byte, prev_byte2, literal_context_mode) as (usize); ContextBlockSplitterAddSymbol(lit_blocks_ctx, alloc, &mut (*mb).literal_split, &mut (*mb).literal_histograms.slice_mut(), &mut (*mb).literal_histograms_size, literal as (usize), static_context_map[(context as (usize))] as (usize)); } } prev_byte2 = prev_byte; prev_byte = literal; pos = pos.wrapping_add(1 as (usize)); } j = j.wrapping_sub(1 as (usize)); } pos = pos.wrapping_add(CommandCopyLen(&cmd) as (usize)); if CommandCopyLen(&cmd) != 0 { prev_byte2 = ringbuffer[((pos.wrapping_sub(2usize) & mask) as (usize))]; prev_byte = ringbuffer[((pos.wrapping_sub(1usize) & mask) as (usize))]; if cmd.cmd_prefix_ as (i32) >= 128i32 { BlockSplitterAddSymbol(&mut dist_blocks, &mut (*mb).distance_split, &mut (*mb).distance_histograms.slice_mut(), &mut (*mb).distance_histograms_size, cmd.dist_prefix_ as (usize) & 0x3ff); } } } i = i.wrapping_add(1 as (usize)); } match (&mut lit_blocks) { &mut LitBlocks::plain(ref mut lit_blocks_plain) => { BlockSplitterFinishBlock(lit_blocks_plain, &mut (*mb).literal_split, &mut (*mb).literal_histograms.slice_mut(), &mut (*mb).literal_histograms_size, 1i32) } &mut LitBlocks::ctx(ref mut lit_blocks_ctx) => { ContextBlockSplitterFinishBlock(lit_blocks_ctx, alloc, &mut (*mb).literal_split, &mut (*mb).literal_histograms.slice_mut(), &mut (*mb).literal_histograms_size, 1i32) } } BlockSplitterFinishBlock(&mut cmd_blocks, &mut (*mb).command_split, &mut (*mb).command_histograms.slice_mut(), &mut (*mb).command_histograms_size, 1i32); BlockSplitterFinishBlock(&mut dist_blocks, &mut (*mb).distance_split, &mut (*mb).distance_histograms.slice_mut(), &mut (*mb).distance_histograms_size, 1i32); if num_contexts > 1usize { MapStaticContexts(alloc, num_contexts, static_context_map, mb); } } pub fn BrotliBuildMetaBlockGreedy + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator> (alloc: &mut Alloc, ringbuffer: &[u8], pos: usize, mask: usize, prev_byte: u8, prev_byte2: u8, literal_context_mode: ContextType, _literal_context_lut: &[u8], num_contexts: usize, static_context_map: &[u32], commands: &[Command], n_commands: usize, mb: &mut MetaBlockSplit) { if num_contexts == 1usize { BrotliBuildMetaBlockGreedyInternal(alloc, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_mode, 1usize, &[], commands, n_commands, mb); } else { BrotliBuildMetaBlockGreedyInternal(alloc, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_mode, num_contexts, static_context_map, commands, n_commands, mb); } } pub fn BrotliOptimizeHistograms + alloc::Allocator + alloc::Allocator + alloc::Allocator + alloc::Allocator> (num_distance_codes: usize, mb: &mut MetaBlockSplit) { let mut good_for_rle: [u8; 704] = [0; 704]; let mut i: usize; i = 0usize; while i < (*mb).literal_histograms_size { { BrotliOptimizeHuffmanCountsForRle(256usize, (*mb).literal_histograms.slice_mut()[(i as (usize))] .slice_mut(), &mut good_for_rle[..]); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < (*mb).command_histograms_size { { BrotliOptimizeHuffmanCountsForRle(704usize, (*mb).command_histograms.slice_mut()[(i as (usize))] .slice_mut(), &mut good_for_rle[..]); } i = i.wrapping_add(1 as (usize)); } i = 0usize; while i < (*mb).distance_histograms_size { { BrotliOptimizeHuffmanCountsForRle(num_distance_codes, (*mb).distance_histograms.slice_mut()[(i as (usize))] .slice_mut(), &mut good_for_rle[..]); } i = i.wrapping_add(1 as (usize)); } } brotli-3.4.0/src/enc/mod.rs000075500000000000000000000266221046102023000136170ustar 00000000000000#![cfg_attr(not(feature="std"), allow(unused_imports))] #[macro_use] pub mod vectorization; pub mod input_pair; pub mod fast_log; pub mod command; pub mod block_split; pub mod brotli_bit_stream; pub mod constants; pub mod entropy_encode; pub mod static_dict; pub mod combined_alloc; pub mod static_dict_lut; pub mod dictionary_hash; pub mod util; pub mod utf8_util; pub mod bit_cost; pub mod cluster; pub mod literal_cost; pub mod histogram; pub mod backward_references; pub use self::backward_references::hash_to_binary_tree; pub use self::backward_references::hq as backward_references_hq; pub mod block_splitter; pub mod metablock; pub mod compress_fragment_two_pass; pub mod compress_fragment; pub mod encode; pub mod reader; pub mod writer; pub mod find_stride; pub mod interface; pub mod ir_interpret; pub mod prior_eval; pub mod stride_eval; pub mod context_map_entropy; pub mod pdf; pub use self::combined_alloc::{CombiningAllocator, BrotliAlloc}; mod compat; pub mod threading; pub mod singlethreading; pub mod multithreading; pub mod fixed_queue; pub mod worker_pool; #[cfg(feature="simd")] use packed_simd_2::{i16x16, f32x8, i32x8}; #[cfg(feature="simd")] pub type s16 = i16x16; #[cfg(feature="simd")] pub type v8 = f32x8; #[cfg(feature="simd")] pub type s8 = i32x8; #[cfg(not(feature="simd"))] pub type s16 = compat::Compat16x16; #[cfg(not(feature="simd"))] pub type v8 = compat::CompatF8; #[cfg(not(feature="simd"))] pub type s8 = compat::Compat32x8; mod test; mod weights; mod parameters; pub use self::util::floatX; pub use self::pdf::PDF; pub use self::hash_to_binary_tree::ZopfliNode; pub use self::backward_references::{BrotliEncoderParams, UnionHasher}; pub use self::encode::{ BrotliEncoderInitParams, BrotliEncoderSetParameter, BrotliEncoderMaxCompressedSizeMulti, BrotliEncoderMaxCompressedSize, }; use self::encode::{BrotliEncoderCreateInstance, BrotliEncoderDestroyInstance, BrotliEncoderOperation, BrotliEncoderSetCustomDictionary, BrotliEncoderCompressStream, BrotliEncoderIsFinished}; pub use self::interface::StaticCommand; use brotli_decompressor::{CustomRead, CustomWrite}; pub use self::vectorization::{v256,v256i, Mem256f}; pub use interface::{InputReference,InputPair, InputReferenceMut}; #[cfg(feature="std")] use std::io::{Read,Write, Error, ErrorKind}; #[cfg(feature="std")] use std::io; #[cfg(feature="std")] pub use alloc_stdlib::StandardAlloc; pub use alloc::{AllocatedStackMemory, Allocator, SliceWrapper, SliceWrapperMut, StackAllocator}; #[cfg(feature="std")] pub use brotli_decompressor::{IntoIoReader, IoReaderWrapper, IoWriterWrapper}; pub use self::threading::{SendAlloc, Owned, BrotliEncoderThreadError, BatchSpawnableLite, CompressionThreadResult, }; #[cfg(feature="std")] pub use self::worker_pool::{ compress_worker_pool, new_work_pool, WorkerPool, }; #[cfg(not(feature="std"))] pub use self::singlethreading::{ compress_worker_pool, new_work_pool, WorkerPool, }; #[cfg(feature="std")] pub fn compress_multi+Send+'static+Sync> ( params:&BrotliEncoderParams, owned_input: &mut Owned, output: &mut [u8], alloc_per_thread:&mut [SendAlloc, backward_references::UnionHasher, Alloc, , backward_references::UnionHasher, Alloc, (SliceW, BrotliEncoderParams)> as BatchSpawnableLite, backward_references::UnionHasher, Alloc, (SliceW, BrotliEncoderParams)>>::JoinHandle>], ) -> Result where >::AllocatedMemory: Send, >::AllocatedMemory: Send+Sync, >::AllocatedMemory: Send+Sync { let mut work_pool = self::worker_pool::new_work_pool(alloc_per_thread.len() - 1); compress_worker_pool(params, owned_input,output, alloc_per_thread,&mut work_pool) } #[cfg(not(feature="std"))] pub use self::singlethreading::compress_multi; #[cfg(not(feature="std"))] pub use self::singlethreading::compress_multi as compress_multi_no_threadpool; #[cfg(feature="std")] pub use self::multithreading::compress_multi as compress_multi_no_threadpool; #[cfg(feature="std")] pub fn BrotliCompress(r: &mut InputType, w: &mut OutputType, params: &BrotliEncoderParams) -> Result where InputType: Read, OutputType: Write { let mut input_buffer: [u8; 4096] = [0; 4096]; let mut output_buffer: [u8; 4096] = [0; 4096]; BrotliCompressCustomAlloc(r, w, &mut input_buffer[..], &mut output_buffer[..], params, StandardAlloc::default(), ) } #[cfg(feature="std")] pub fn BrotliCompressCustomAlloc (r: &mut InputType, w: &mut OutputType, input_buffer: &mut [u8], output_buffer: &mut [u8], params: &BrotliEncoderParams, alloc: Alloc) -> Result where InputType: Read, OutputType: Write { let mut nop_callback = |_data:&mut interface::PredictionModeContextMap, _cmds: &mut [interface::StaticCommand], _mb: interface::InputPair, _m: &mut Alloc|(); BrotliCompressCustomIo(&mut IoReaderWrapper::(r), &mut IoWriterWrapper::(w), input_buffer, output_buffer, params, alloc, &mut nop_callback, Error::new(ErrorKind::UnexpectedEof, "Unexpected EOF")) } pub fn BrotliCompressCustomIo, &mut [interface::StaticCommand], interface::InputPair, &mut Alloc)> (r: &mut InputType, w: &mut OutputType, input_buffer: &mut [u8], output_buffer: &mut [u8], params: &BrotliEncoderParams, alloc: Alloc, metablock_callback: &mut MetablockCallback, unexpected_eof_error_constant: ErrType) -> Result where InputType: CustomRead, OutputType: CustomWrite { BrotliCompressCustomIoCustomDict(r,w,input_buffer,output_buffer, params, alloc, metablock_callback, &[], unexpected_eof_error_constant) } pub fn BrotliCompressCustomIoCustomDict, &mut [interface::StaticCommand], interface::InputPair, &mut Alloc)> (r: &mut InputType, w: &mut OutputType, input_buffer: &mut [u8], output_buffer: &mut [u8], params: &BrotliEncoderParams, alloc: Alloc, metablock_callback: &mut MetablockCallback, dict: &[u8], unexpected_eof_error_constant: ErrType) -> Result where InputType: CustomRead, OutputType: CustomWrite { assert!(input_buffer.len() != 0); assert!(output_buffer.len() != 0); let mut s_orig = BrotliEncoderCreateInstance(alloc); s_orig.params = params.clone(); if dict.len() != 0 { BrotliEncoderSetCustomDictionary(&mut s_orig, dict.len(), dict); } let mut next_in_offset: usize = 0; let mut next_out_offset: usize = 0; let mut total_out = Some(0usize); let mut read_err: Result<(), ErrType> = Ok(()); { let s = &mut s_orig; //BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_MODE, 0 as (u32)); // gen, text, font //BrotliEncoderSetParameter(s, // BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT, // input.len() as (u32)); let mut available_in: usize = 0; let mut available_out: usize = output_buffer.len(); let mut eof = false; loop { if available_in == 0 && !eof { next_in_offset = 0; match r.read(input_buffer) { Err(e) => { read_err = Err(e); available_in = 0; eof = true; }, Ok(size) => { if size == 0 { eof = true; } available_in = size; } } } let op : BrotliEncoderOperation; if available_in == 0 { op = BrotliEncoderOperation::BROTLI_OPERATION_FINISH; } else { op = BrotliEncoderOperation::BROTLI_OPERATION_PROCESS; } let result = BrotliEncoderCompressStream(s, op, &mut available_in, input_buffer, &mut next_in_offset, &mut available_out, output_buffer, &mut next_out_offset, &mut total_out, metablock_callback); let fin = BrotliEncoderIsFinished(s); if available_out == 0 || fin != 0 { let lim = output_buffer.len() - available_out; assert_eq!(next_out_offset, lim); next_out_offset = 0; while next_out_offset < lim { match w.write(&mut output_buffer[next_out_offset..lim]) { Err(e) => { BrotliEncoderDestroyInstance(s); if let Err(err) = read_err { return Err(err); } return Err(e); } Ok(size) => { next_out_offset += size; } } } available_out = output_buffer.len(); next_out_offset = 0; } if result <= 0 { if let Ok(_) = read_err { read_err = Err(unexpected_eof_error_constant); } break; } if fin != 0 { break; } } BrotliEncoderDestroyInstance(s); } if let Err(err) = read_err { return Err(err) } Ok(total_out.unwrap()) } brotli-3.4.0/src/enc/multithreading.rs000075500000000000000000000124311046102023000160510ustar 00000000000000#![cfg(feature="std")] use core::mem; use std; use core::marker::PhantomData; use std::thread::{ JoinHandle, }; use alloc::{SliceWrapper, Allocator}; use enc::BrotliAlloc; use enc::BrotliEncoderParams; use enc::backward_references::UnionHasher; use enc::threading::{ CompressMulti, SendAlloc, InternalSendAlloc, BatchSpawnable, BatchSpawnableLite, Joinable, Owned, OwnedRetriever, CompressionThreadResult, InternalOwned, BrotliEncoderThreadError, AnyBoxConstructor, PoisonedThreadError, }; // in-place thread create use std::sync::RwLock; pub struct MultiThreadedJoinable(JoinHandle, PhantomData); impl Joinable for MultiThreadedJoinable { fn join(self) -> Result { match self.0.join() { Ok(t) => Ok(t), Err(e) => Err(::new(e)), } } } pub struct MultiThreadedOwnedRetriever(RwLock); impl OwnedRetriever for MultiThreadedOwnedRetriever { fn viewT>(&self, f:F) -> Result { match self.0.read() { Ok(u) => Ok(f(&*u)), Err(_) => Err(PoisonedThreadError::default()), } } fn unwrap(self) -> Result { match self.0.into_inner() { Ok(u) => Ok(u), Err(_) => Err(PoisonedThreadError::default()), } } } #[derive(Default)] pub struct MultiThreadedSpawner{} fn spawn_work ReturnValue+Send+'static, Alloc:BrotliAlloc+Send+'static, U:Send+'static+Sync>( extra_input: ExtraInput, index: usize, num_threads: usize, locked_input:std::sync::Arc>, alloc:Alloc, f:F, ) -> std::thread::JoinHandle where >::AllocatedMemory:Send+'static { std::thread::spawn(move || { let t:ReturnValue = locked_input.view(move |guard:&U|->ReturnValue { f(extra_input, index, num_threads, guard, alloc) }).unwrap(); t }) } impl BatchSpawnable for MultiThreadedSpawner where >::AllocatedMemory:Send+'static { type JoinHandle = MultiThreadedJoinable; type FinalJoinHandle = std::sync::Arc>; fn make_spawner( &mut self, input: &mut Owned, ) -> Self::FinalJoinHandle { std::sync::Arc::>::new(RwLock::new(mem::replace(input, Owned(InternalOwned::Borrowed)).unwrap())) } fn spawn ReturnValue+Send+'static+Copy>( &mut self, input: &mut Self::FinalJoinHandle, work:&mut SendAlloc, index: usize, num_threads: usize, f: F, ) { let (alloc, extra_input) = work.replace_with_default(); let ret = spawn_work(extra_input, index, num_threads, input.clone(), alloc, f); *work = SendAlloc(InternalSendAlloc::Join(MultiThreadedJoinable(ret, PhantomData::default()))); } } impl BatchSpawnableLite for MultiThreadedSpawner where >::AllocatedMemory:Send+'static, >::AllocatedMemory: Send+Sync, >::AllocatedMemory: Send+Sync { type JoinHandle = >::JoinHandle; type FinalJoinHandle = >::FinalJoinHandle; fn make_spawner( &mut self, input: &mut Owned, ) -> Self::FinalJoinHandle { >::make_spawner(self, input) } fn spawn( &mut self, handle:&mut Self::FinalJoinHandle, alloc_per_thread:&mut SendAlloc, index: usize, num_threads: usize, f: fn(ExtraInput, usize, usize, &U, Alloc) -> ReturnValue, ) { >::spawn(self, handle, alloc_per_thread, index, num_threads, f) } } pub fn compress_multi+Send+'static+Sync> ( params:&BrotliEncoderParams, owned_input: &mut Owned, output: &mut [u8], alloc_per_thread:&mut [SendAlloc, UnionHasher, Alloc, ,UnionHasher, Alloc, SliceW>>::JoinHandle>], ) -> Result where >::AllocatedMemory: Send, >::AllocatedMemory: Send+Sync, >::AllocatedMemory: Send+Sync { CompressMulti(params, owned_input, output, alloc_per_thread, &mut MultiThreadedSpawner::default()) } brotli-3.4.0/src/enc/parameters.rs000064400000000000000000000112421046102023000151700ustar 00000000000000#[derive(PartialEq, Eq, Copy, Clone, Debug)] #[repr(C)] pub enum BrotliEncoderParameter { BROTLI_PARAM_MODE = 0, BROTLI_PARAM_QUALITY = 1, BROTLI_PARAM_LGWIN = 2, BROTLI_PARAM_LGBLOCK = 3, BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING = 4, BROTLI_PARAM_SIZE_HINT = 5, BROTLI_PARAM_LARGE_WINDOW = 6, BROTLI_PARAM_Q9_5 = 150, BROTLI_METABLOCK_CALLBACK = 151, BROTLI_PARAM_STRIDE_DETECTION_QUALITY = 152, BROTLI_PARAM_HIGH_ENTROPY_DETECTION_QUALITY = 153, BROTLI_PARAM_LITERAL_BYTE_SCORE = 154, BROTLI_PARAM_CDF_ADAPTATION_DETECTION = 155, BROTLI_PARAM_PRIOR_BITMASK_DETECTION = 156, BROTLI_PARAM_SPEED = 157, BROTLI_PARAM_SPEED_MAX = 158, BROTLI_PARAM_CM_SPEED = 159, BROTLI_PARAM_CM_SPEED_MAX = 160, BROTLI_PARAM_SPEED_LOW = 161, BROTLI_PARAM_SPEED_LOW_MAX = 162, BROTLI_PARAM_CM_SPEED_LOW = 164, BROTLI_PARAM_CM_SPEED_LOW_MAX = 165, BROTLI_PARAM_AVOID_DISTANCE_PREFIX_SEARCH = 166, BROTLI_PARAM_CATABLE = 167, BROTLI_PARAM_APPENDABLE = 168, BROTLI_PARAM_MAGIC_NUMBER = 169, BROTLI_PARAM_NO_DICTIONARY = 170, BROTLI_PARAM_FAVOR_EFFICIENCY = 171, UNUSED7=7, UNUSED8=8, UNUSED9=9, UNUSED10=10, UNUSED11=11, UNUSED12=12, UNUSED13=13, UNUSED14=14, UNUSED15=15, UNUSED16=16, UNUSED17=17, UNUSED18=18, UNUSED19=19, UNUSED20=20, UNUSED21=21, UNUSED22=22, UNUSED23=23, UNUSED24=24, UNUSED25=25, UNUSED26=26, UNUSED27=27, UNUSED28=28, UNUSED29=29, UNUSED30=30, UNUSED31=31, UNUSED32=32, UNUSED33=33, UNUSED34=34, UNUSED35=35, UNUSED36=36, UNUSED37=37, UNUSED38=38, UNUSED39=39, UNUSED40=40, UNUSED41=41, UNUSED42=42, UNUSED43=43, UNUSED44=44, UNUSED45=45, UNUSED46=46, UNUSED47=47, UNUSED48=48, UNUSED49=49, UNUSED50=50, UNUSED51=51, UNUSED52=52, UNUSED53=53, UNUSED54=54, UNUSED55=55, UNUSED56=56, UNUSED57=57, UNUSED58=58, UNUSED59=59, UNUSED60=60, UNUSED61=61, UNUSED62=62, UNUSED63=63, UNUSED64=64, UNUSED65=65, UNUSED66=66, UNUSED67=67, UNUSED68=68, UNUSED69=69, UNUSED70=70, UNUSED71=71, UNUSED72=72, UNUSED73=73, UNUSED74=74, UNUSED75=75, UNUSED76=76, UNUSED77=77, UNUSED78=78, UNUSED79=79, UNUSED80=80, UNUSED81=81, UNUSED82=82, UNUSED83=83, UNUSED84=84, UNUSED85=85, UNUSED86=86, UNUSED87=87, UNUSED88=88, UNUSED89=89, UNUSED90=90, UNUSED91=91, UNUSED92=92, UNUSED93=93, UNUSED94=94, UNUSED95=95, UNUSED96=96, UNUSED97=97, UNUSED98=98, UNUSED99=99, UNUSED100=100, UNUSED101=101, UNUSED102=102, UNUSED103=103, UNUSED104=104, UNUSED105=105, UNUSED106=106, UNUSED107=107, UNUSED108=108, UNUSED109=109, UNUSED110=110, UNUSED111=111, UNUSED112=112, UNUSED113=113, UNUSED114=114, UNUSED115=115, UNUSED116=116, UNUSED117=117, UNUSED118=118, UNUSED119=119, UNUSED120=120, UNUSED121=121, UNUSED122=122, UNUSED123=123, UNUSED124=124, UNUSED125=125, UNUSED126=126, UNUSED127=127, UNUSED128=128, UNUSED129=129, UNUSED130=130, UNUSED131=131, UNUSED132=132, UNUSED133=133, UNUSED134=134, UNUSED135=135, UNUSED136=136, UNUSED137=137, UNUSED138=138, UNUSED139=139, UNUSED140=140, UNUSED141=141, UNUSED142=142, UNUSED143=143, UNUSED144=144, UNUSED145=145, UNUSED146=146, UNUSED147=147, UNUSED148=148, UNUSED149=149, UNUSED172=172, UNUSED173=173, UNUSED174=174, UNUSED175=175, UNUSED176=176, UNUSED177=177, UNUSED178=178, UNUSED179=179, UNUSED180=180, UNUSED181=181, UNUSED182=182, UNUSED183=183, UNUSED184=184, UNUSED185=185, UNUSED186=186, UNUSED187=187, UNUSED188=188, UNUSED189=189, UNUSED190=190, UNUSED191=191, UNUSED192=192, UNUSED193=193, UNUSED194=194, UNUSED195=195, UNUSED196=196, UNUSED197=197, UNUSED198=198, UNUSED199=199, UNUSED200=200, UNUSED201=201, UNUSED202=202, UNUSED203=203, UNUSED204=204, UNUSED205=205, UNUSED206=206, UNUSED207=207, UNUSED208=208, UNUSED209=209, UNUSED210=210, UNUSED211=211, UNUSED212=212, UNUSED213=213, UNUSED214=214, UNUSED215=215, UNUSED216=216, UNUSED217=217, UNUSED218=218, UNUSED219=219, UNUSED220=220, UNUSED221=221, UNUSED222=222, UNUSED223=223, UNUSED224=224, UNUSED225=225, UNUSED226=226, UNUSED227=227, UNUSED228=228, UNUSED229=229, UNUSED230=230, UNUSED231=231, UNUSED232=232, UNUSED233=233, UNUSED234=234, UNUSED235=235, UNUSED236=236, UNUSED237=237, UNUSED238=238, UNUSED239=239, UNUSED240=240, UNUSED241=241, UNUSED242=242, UNUSED243=243, UNUSED244=244, UNUSED245=245, UNUSED246=246, UNUSED247=247, UNUSED248=248, UNUSED249=249, UNUSED250=250, UNUSED251=251, UNUSED252=252, UNUSED253=253, UNUSED254=254, UNUSED255=255, } brotli-3.4.0/src/enc/pdf.rs000064400000000000000000000001541046102023000135760ustar 00000000000000 //TODO: replace with builtin SIMD type #[derive(Copy, Clone, Default, Debug)] pub struct PDF([i16;16]); brotli-3.4.0/src/enc/prior_eval.rs000064400000000000000000000720631046102023000151770ustar 00000000000000use core; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use super::interface; use super::backward_references::BrotliEncoderParams; use super::input_pair::{InputPair, InputReference, InputReferenceMut}; use super::ir_interpret::{IRInterpreter, push_base}; use super::util::{floatX, FastLog2u16}; use super::find_stride; use super::{s16, v8}; #[cfg(feature="simd")] use packed_simd_2::IntoBits; // the high nibble, followed by the low nibbles pub const CONTEXT_MAP_PRIOR_SIZE: usize = 256 * 17; pub const STRIDE_PRIOR_SIZE: usize = 256 * 256 * 2; pub const ADV_PRIOR_SIZE: usize = 65536 + (20 << 16); pub const DEFAULT_SPEED: (u16, u16) = (8, 8192); pub enum WhichPrior { CM = 0, ADV = 1, SLOW_CM = 2, FAST_CM = 3, STRIDE1 = 4, STRIDE2 = 5, STRIDE3 = 6, STRIDE4 = 7, // STRIDE8 = 8, NUM_PRIORS = 8, // future ideas } pub trait Prior { fn lookup_lin(stride_byte: u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize; #[inline(always)] fn lookup_mut(data:&mut [s16], stride_byte: u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> CDF { let index = Self::lookup_lin(stride_byte, selected_context, actual_context, high_nibble); CDF::from(&mut data[index]) } #[inline(always)] fn lookup(data:&[s16], stride_byte: u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> &s16 { let index = Self::lookup_lin(stride_byte, selected_context, actual_context, high_nibble); &data[index] } #[allow(unused_variables)] #[inline(always)] fn score_index(stride_byte: u8, selected_context: u8, actual_context: usize, high_nibble: Option) -> usize { let which = Self::which(); assert!(which < WhichPrior::NUM_PRIORS as usize); assert!(actual_context < 256); if let Some(nibble) = high_nibble { WhichPrior::NUM_PRIORS as usize * (actual_context + 4096 + 256 * nibble as usize) + which } else { WhichPrior::NUM_PRIORS as usize * (actual_context + 256 * (stride_byte >> 4) as usize) + which } } fn which() -> usize; } #[inline(always)] fn upper_score_index(stride_byte: u8, _selected_context: u8, actual_context: usize) -> usize { actual_context + 256 * (stride_byte >> 4) as usize } #[inline(always)] fn lower_score_index(_stride_byte: u8, _selected_context: u8, actual_context: usize, high_nibble: u8) -> usize { debug_assert!(actual_context< 256); debug_assert!(high_nibble < 16); actual_context + 4096 + 256 * high_nibble as usize } #[allow(unused_variables)] #[inline(always)] fn stride_lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { if let Some(nibble) = high_nibble { 1 + 2 * (actual_context as usize | ((stride_byte as usize & 0xf) << 8) | ((nibble as usize) << 12)) } else { 2 * (actual_context as usize | ((stride_byte as usize) << 8)) } } pub struct Stride1Prior{ } impl Stride1Prior { #[inline(always)] pub fn offset() -> usize{ 0 } } impl Prior for Stride1Prior { #[inline(always)] fn lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble) } #[inline(always)] fn which() -> usize { WhichPrior::STRIDE1 as usize } } /*impl StridePrior for Stride1Prior { const STRIDE_OFFSET:usize = 0; }*/ pub struct Stride2Prior{ } impl Stride2Prior { #[inline(always)] pub fn offset() -> usize{ 1 } } impl Prior for Stride2Prior { #[inline(always)] fn lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble) } #[inline] fn which() -> usize { WhichPrior::STRIDE2 as usize } } /*impl StridePrior for Stride2Prior { const STRIDE_OFFSET:usize = 1; }*/ pub struct Stride3Prior{ } impl Stride3Prior { #[inline(always)] pub fn offset() -> usize{ 2 } } impl Prior for Stride3Prior { #[inline(always)] fn lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble) } #[inline(always)] fn which() -> usize { WhichPrior::STRIDE3 as usize } } /*impl StridePrior for Stride3Prior { const STRIDE_OFFSET:usize = 2; }*/ pub struct Stride4Prior{ } impl Stride4Prior { #[inline(always)] pub fn offset() -> usize{ 3 } } impl Prior for Stride4Prior { #[inline(always)] fn lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble) } #[inline] fn which() -> usize { WhichPrior::STRIDE4 as usize } } /*impl StridePrior for Stride4Prior { const STRIDE_OFFSET:usize = 3; }*/ /*pub struct Stride8Prior{ } impl StridePrior for Stride8Prior { const STRIDE_OFFSET:usize = 7; } impl Stride8Prior { #[inline(always)] pub fn offset() -> usize{ 7 } } impl Prior for Stride8Prior { fn lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble) } #[inline] fn which() -> usize { WhichPrior::STRIDE8 as usize } } */ pub struct CMPrior { } impl Prior for CMPrior { #[allow(unused_variables)] #[inline(always)] fn lookup_lin(stride_byte: u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { if let Some(nibble) = high_nibble { (nibble as usize + 1) + 17 * actual_context } else { 17 * actual_context as usize } } #[inline(always)] fn which() -> usize { WhichPrior::CM as usize } } pub struct FastCMPrior { } impl Prior for FastCMPrior { #[allow(unused_variables)] #[inline(always)] fn lookup_lin(stride_byte: u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { if let Some(nibble) = high_nibble { 2 * actual_context } else { 2 * actual_context + 1 } } #[inline(always)] fn which() -> usize { WhichPrior::FAST_CM as usize } } pub struct SlowCMPrior { } impl Prior for SlowCMPrior { #[allow(unused_variables)] #[inline(always)] fn lookup_lin(stride_byte: u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { if let Some(nibble) = high_nibble { (nibble as usize + 1) + 17 * actual_context } else { 17 * actual_context as usize } } #[inline] fn which() -> usize { WhichPrior::SLOW_CM as usize } } pub struct AdvPrior { } impl Prior for AdvPrior { #[allow(unused_variables)] #[inline(always)] fn lookup_lin(stride_byte: u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { if let Some(nibble) = high_nibble { 65536 + ((actual_context as usize) | ((stride_byte as usize) << 8) | ((nibble as usize & 0xf) << 16)) } else { (actual_context as usize) | ((stride_byte as usize & 0xf0) << 8) } } #[inline(always)] fn which() -> usize { WhichPrior::ADV as usize } } pub struct CDF<'a> { cdf:&'a mut s16, } impl<'a> CDF<'a> { #[inline(always)] pub fn cost(&self, nibble_u8:u8) -> floatX { let nibble = nibble_u8 as usize & 0xf; let mut pdf = self.cdf.extract(usize::from(nibble)); if nibble_u8 != 0 { pdf -= self.cdf.extract(usize::from(nibble - 1)); } FastLog2u16(self.cdf.extract(15) as u16) - FastLog2u16(pdf as u16) } #[inline(always)] pub fn update(&mut self, nibble_u8:u8, speed: (u16, u16)) { let mut cdf = *self.cdf; let increment_v = s16::splat(speed.0 as i16); let one_to_16 = s16::new(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); let mask_v: s16 = one_to_16.gt(s16::splat(i16::from(nibble_u8))).into_bits(); cdf = cdf + (increment_v & mask_v); if cdf.extract(15) >= speed.1 as i16{ let cdf_bias = one_to_16; cdf = cdf + cdf_bias - ((cdf + cdf_bias) >> 2); } *self.cdf = cdf; } } impl<'a> From<&'a mut s16> for CDF<'a> { #[inline(always)] fn from(cdf: &'a mut s16) -> CDF<'a> { CDF { cdf:cdf, } } } pub fn init_cdfs(cdfs: &mut [s16]) { for item in cdfs.iter_mut() { *item = s16::new(4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64); } } pub struct PriorEval<'a, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator, > { input: InputPair<'a>, context_map: interface::PredictionModeContextMap>, block_type: u8, local_byte_offset: usize, _nop: >::AllocatedMemory, cm_priors: >::AllocatedMemory, slow_cm_priors: >::AllocatedMemory, fast_cm_priors: >::AllocatedMemory, stride_priors: [>::AllocatedMemory; 4], adv_priors: >::AllocatedMemory, _stride_pyramid_leaves: [u8; find_stride::NUM_LEAF_NODES], score: >::AllocatedMemory, cm_speed: [(u16, u16);2], stride_speed: [(u16, u16);2], cur_stride: u8, } impl<'a, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator, > PriorEval<'a, Alloc> { pub fn new(alloc: &mut Alloc, input: InputPair<'a>, stride: [u8; find_stride::NUM_LEAF_NODES], prediction_mode: interface::PredictionModeContextMap>, params: &BrotliEncoderParams, ) -> Self { let do_alloc = params.prior_bitmask_detection != 0; let mut cm_speed = prediction_mode.context_map_speed(); let mut stride_speed = prediction_mode.stride_context_speed(); if cm_speed[0] == (0,0) { cm_speed[0] = params.literal_adaptation[2] } if cm_speed[0] == (0,0) { cm_speed[0] = DEFAULT_SPEED; } if cm_speed[1] == (0,0) { cm_speed[1] = params.literal_adaptation[3] } if cm_speed[1] == (0,0) { cm_speed[1] = cm_speed[0]; } if stride_speed[0] == (0, 0) { stride_speed[0] = params.literal_adaptation[0] } if stride_speed[0] == (0, 0) { stride_speed[0] = DEFAULT_SPEED; } if stride_speed[1] == (0, 0) { stride_speed[1] = params.literal_adaptation[1] } if stride_speed[1] == (0, 0) { stride_speed[1] = stride_speed[0]; } let mut ret = PriorEval::{ input: input, context_map: prediction_mode, block_type: 0, cur_stride: 1, local_byte_offset: 0, _nop: >::AllocatedMemory::default(), cm_priors: if do_alloc {>::alloc_cell(alloc, CONTEXT_MAP_PRIOR_SIZE)} else { >::AllocatedMemory::default()}, slow_cm_priors: if do_alloc {>::alloc_cell(alloc, CONTEXT_MAP_PRIOR_SIZE)} else { >::AllocatedMemory::default()}, fast_cm_priors: if do_alloc {>::alloc_cell(alloc, CONTEXT_MAP_PRIOR_SIZE)} else { >::AllocatedMemory::default()}, stride_priors: [ if do_alloc {>::alloc_cell(alloc, STRIDE_PRIOR_SIZE)} else { >::AllocatedMemory::default()}, if do_alloc {>::alloc_cell(alloc, STRIDE_PRIOR_SIZE)} else { >::AllocatedMemory::default()}, if do_alloc {>::alloc_cell(alloc, STRIDE_PRIOR_SIZE)} else { >::AllocatedMemory::default()}, if do_alloc {>::alloc_cell(alloc, STRIDE_PRIOR_SIZE)} else { >::AllocatedMemory::default()}, /*if do_alloc {m16x16.alloc_cell(STRIDE_PRIOR_SIZE)} else { Alloc16x16::AllocatedMemory::default()},*/], adv_priors: if do_alloc {>::alloc_cell(alloc, ADV_PRIOR_SIZE)} else { >::AllocatedMemory::default()}, _stride_pyramid_leaves: stride, score: if do_alloc {>::alloc_cell(alloc, 8192)} else { >::AllocatedMemory::default()}, cm_speed: cm_speed, stride_speed: stride_speed, }; init_cdfs(ret.cm_priors.slice_mut()); init_cdfs(ret.slow_cm_priors.slice_mut()); init_cdfs(ret.fast_cm_priors.slice_mut()); init_cdfs(ret.stride_priors[0].slice_mut()); init_cdfs(ret.stride_priors[1].slice_mut()); init_cdfs(ret.stride_priors[2].slice_mut()); init_cdfs(ret.stride_priors[3].slice_mut()); //init_cdfs(ret.stride_priors[4].slice_mut()); init_cdfs(ret.adv_priors.slice_mut()); ret } pub fn choose_bitmask(&mut self) { let epsilon = 6.0; let mut max_popularity = 0u32; let mut max_popularity_index = 0u8; assert_eq!(WhichPrior::NUM_PRIORS as usize, 8); let mut popularity = [0u32; 8]; let mut bitmask = [0u8; super::interface::NUM_MIXING_VALUES]; for (i, score) in self.score.slice().iter().enumerate() { let cm_score = score.extract(WhichPrior::CM as usize); let slow_cm_score = score.extract(WhichPrior::SLOW_CM as usize); let fast_cm_score = score.extract(WhichPrior::FAST_CM as usize) + 16.0; let stride1_score = score.extract(WhichPrior::STRIDE1 as usize); let stride2_score = score.extract(WhichPrior::STRIDE2 as usize); let stride3_score = score.extract(WhichPrior::STRIDE3 as usize) + 16.0; let stride4_score = score.extract(WhichPrior::STRIDE4 as usize); //let stride8_score = score.extract(WhichPrior::STRIDE8) * 1.125 + 16.0; let stride8_score = stride4_score + 1.0; // FIXME: never lowest -- ignore stride 8 let stride_score = core::cmp::min(stride1_score as u64, core::cmp::min(stride2_score as u64, core::cmp::min(stride3_score as u64, core::cmp::min(stride4_score as u64, stride8_score as u64)))); let adv_score = score.extract(WhichPrior::ADV as usize); if adv_score + epsilon < stride_score as floatX && adv_score + epsilon < cm_score && adv_score + epsilon < slow_cm_score && adv_score + epsilon < fast_cm_score { bitmask[i] = 1; } else if slow_cm_score + epsilon < stride_score as floatX && slow_cm_score + epsilon < cm_score && slow_cm_score + epsilon < fast_cm_score { bitmask[i] = 2; } else if fast_cm_score + epsilon < stride_score as floatX && fast_cm_score + epsilon < cm_score { bitmask[i] = 3; } else if epsilon + (stride_score as floatX) < cm_score { bitmask[i] = WhichPrior::STRIDE1 as u8; if stride_score == stride8_score as u64 { //bitmask[i] = WhichPrior::STRIDE8 as u8; } if stride_score == stride4_score as u64 { bitmask[i] = WhichPrior::STRIDE4 as u8; } if stride_score == stride3_score as u64 { bitmask[i] = WhichPrior::STRIDE3 as u8; } if stride_score == stride2_score as u64 { bitmask[i] = WhichPrior::STRIDE2 as u8; } if stride_score == stride1_score as u64 { bitmask[i] = WhichPrior::STRIDE1 as u8; } } else { bitmask[i] = 0; } if stride_score == 0 { bitmask[i] = max_popularity_index; //eprintln!("Miss {}[{}] ~ {}", bitmask[i], i, max_popularity_index); } else { popularity[bitmask[i] as usize] += 1; if popularity[bitmask[i] as usize] > max_popularity { max_popularity = popularity[bitmask[i] as usize]; max_popularity_index = bitmask[i]; } //eprintln!("Score {} {} {} {} {}: {}[{}] max={},{}", cm_score, adv_score, slow_cm_score, fast_cm_score, stride_score, bitmask[i], i, max_popularity, max_popularity_index); } } self.context_map.set_mixing_values(&bitmask); } pub fn free(&mut self, alloc: &mut Alloc) { >::free_cell(alloc, core::mem::replace(&mut self.score, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.cm_priors, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.slow_cm_priors, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.fast_cm_priors, >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.stride_priors[0], >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.stride_priors[1], >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.stride_priors[2], >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.stride_priors[3], >::AllocatedMemory::default())); //>::free_cell(alloc, core::mem::replace(&mut self.stride_priors[4], >::AllocatedMemory::default())); >::free_cell(alloc, core::mem::replace(&mut self.adv_priors, >::AllocatedMemory::default())); } pub fn take_prediction_mode(&mut self) -> interface::PredictionModeContextMap> { core::mem::replace(&mut self.context_map, interface::PredictionModeContextMap::>{ literal_context_map:InputReferenceMut::default(), predmode_speed_and_distance_context_map:InputReferenceMut::default(), }) } fn update_cost_base(&mut self, stride_prior: [u8;8], stride_prior_offset:usize, selected_bits: u8, cm_prior: usize, literal: u8) { let mut l_score = v8::splat(0.0); let mut h_score = v8::splat(0.0); let base_stride_prior = stride_prior[stride_prior_offset.wrapping_sub(self.cur_stride as usize) & 7]; let hscore_index = upper_score_index(base_stride_prior, selected_bits, cm_prior); let lscore_index = lower_score_index(base_stride_prior, selected_bits, cm_prior, literal>>4); { type CurPrior = CMPrior; let mut cdf = CurPrior::lookup_mut(self.cm_priors.slice_mut(), base_stride_prior, selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, self.cm_speed[1]); } { type CurPrior = CMPrior; let mut cdf = CurPrior::lookup_mut(self.cm_priors.slice_mut(), base_stride_prior, selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, self.cm_speed[0]); } { type CurPrior = SlowCMPrior; let mut cdf = CurPrior::lookup_mut(self.slow_cm_priors.slice_mut(), base_stride_prior, selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, (0,1024)); } { type CurPrior = SlowCMPrior; let mut cdf = CurPrior::lookup_mut(self.slow_cm_priors.slice_mut(), base_stride_prior, selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, (0,1024)); } { type CurPrior = FastCMPrior; let mut cdf = CurPrior::lookup_mut(self.fast_cm_priors.slice_mut(), base_stride_prior, selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, self.cm_speed[0]); } { type CurPrior = FastCMPrior; let mut cdf = CurPrior::lookup_mut(self.fast_cm_priors.slice_mut(), base_stride_prior, selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, self.cm_speed[0]); } { type CurPrior = Stride1Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[0].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, self.stride_speed[1]); } { type CurPrior = Stride1Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[0].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, self.stride_speed[0]); } { type CurPrior = Stride2Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[1].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, self.stride_speed[1]); } { type CurPrior = Stride2Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[1].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, self.stride_speed[0]); } { type CurPrior = Stride3Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[2].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, self.stride_speed[1]); } { type CurPrior = Stride3Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[2].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, self.stride_speed[0]); } { type CurPrior = Stride4Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[3].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, self.stride_speed[1]); } { type CurPrior = Stride4Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[3].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, self.stride_speed[0]); } /* { type CurPrior = Stride8Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[4].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&7], selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, self.stride_speed[1]); } { type CurPrior = Stride8Prior; let mut cdf = CurPrior::lookup_mut(self.stride_priors[4].slice_mut(), stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) & 7], selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, self.stride_speed[0]); } */ type CurPrior = AdvPrior; { let mut cdf = CurPrior::lookup_mut(self.adv_priors.slice_mut(), base_stride_prior, selected_bits, cm_prior, None); h_score = h_score.replace(CurPrior::which(), cdf.cost(literal>>4)); cdf.update(literal >> 4, self.stride_speed[1]); } { let mut cdf = CurPrior::lookup_mut(self.adv_priors.slice_mut(), base_stride_prior, selected_bits, cm_prior, Some(literal >> 4)); l_score = l_score.replace(CurPrior::which(), cdf.cost(literal&0xf)); cdf.update(literal&0xf, self.stride_speed[0]); } self.score.slice_mut()[lscore_index] += l_score; self.score.slice_mut()[hscore_index] += h_score; } } impl<'a, Alloc: alloc::Allocator + alloc::Allocator + alloc::Allocator> IRInterpreter for PriorEval<'a, Alloc> { #[inline] fn inc_local_byte_offset(&mut self, inc: usize) { self.local_byte_offset += inc; } #[inline] fn local_byte_offset(&self) -> usize { self.local_byte_offset } #[inline] fn update_block_type(&mut self, new_type: u8, stride: u8) { self.block_type = new_type; self.cur_stride = stride; } #[inline] fn block_type(&self) -> u8 { self.block_type } #[inline] fn literal_data_at_offset(&self, index:usize) -> u8 { self.input[index] } #[inline] fn literal_context_map(&self) -> &[u8] { self.context_map.literal_context_map.slice() } #[inline] fn prediction_mode(&self) -> ::interface::LiteralPredictionModeNibble { self.context_map.literal_prediction_mode() } #[inline] fn update_cost(&mut self, stride_prior: [u8;8], stride_prior_offset: usize, selected_bits: u8, cm_prior: usize, literal: u8) { //let stride = self.cur_stride as usize; self.update_cost_base(stride_prior, stride_prior_offset, selected_bits, cm_prior, literal) } } impl<'a, 'b, Alloc: alloc::Allocator + alloc::Allocator + alloc::Allocator> interface::CommandProcessor<'b> for PriorEval<'a, Alloc> { #[inline] fn push(&mut self, val: interface::Command>) { push_base(self, val) } } brotli-3.4.0/src/enc/reader.rs000075500000000000000000000212661046102023000143010ustar 00000000000000#![cfg_attr(not(feature="std"), allow(unused_imports))] use super::combined_alloc::BrotliAlloc; use super::encode::{BrotliEncoderCreateInstance, BrotliEncoderDestroyInstance, BrotliEncoderParameter, BrotliEncoderSetParameter, BrotliEncoderOperation, BrotliEncoderStateStruct, BrotliEncoderCompressStream, BrotliEncoderIsFinished}; use super::backward_references::BrotliEncoderParams; use super::interface; use brotli_decompressor::CustomRead; #[cfg(feature="std")] pub use brotli_decompressor::{IntoIoReader, IoReaderWrapper, IoWriterWrapper}; pub use alloc::{AllocatedStackMemory, Allocator, SliceWrapper, SliceWrapperMut, StackAllocator}; #[cfg(feature="std")] pub use alloc_stdlib::StandardAlloc; #[cfg(feature="std")] use std::io; #[cfg(feature="std")] use std::io::{Read, Error, ErrorKind}; #[cfg(feature="std")] pub struct CompressorReaderCustomAlloc, Alloc: BrotliAlloc> ( CompressorReaderCustomIo, BufferType, Alloc>); #[cfg(feature="std")] impl, Alloc: BrotliAlloc> CompressorReaderCustomAlloc { pub fn new(r: R, buffer : BufferType, alloc: Alloc, q: u32, lgwin: u32) -> Self { CompressorReaderCustomAlloc::( CompressorReaderCustomIo::, BufferType, Alloc>::new( IntoIoReader::(r), buffer, alloc, Error::new(ErrorKind::InvalidData, "Invalid Data"), q, lgwin)) } pub fn get_ref(&self) -> &R { &self.0.get_ref().0 } pub fn into_inner(self) -> R { self.0.into_inner().0 } } #[cfg(feature="std")] impl, Alloc: BrotliAlloc> Read for CompressorReaderCustomAlloc { fn read(&mut self, buf: &mut [u8]) -> Result { self.0.read(buf) } } #[cfg(feature="std")] pub struct CompressorReader(CompressorReaderCustomAlloc>::AllocatedMemory, StandardAlloc>); #[cfg(feature="std")] impl CompressorReader { pub fn new(r: R, buffer_size: usize, q: u32, lgwin: u32) -> Self { let mut alloc = StandardAlloc::default(); let buffer = >::alloc_cell(&mut alloc, if buffer_size == 0 { 4096} else {buffer_size}); CompressorReader::(CompressorReaderCustomAlloc::new(r, buffer, alloc, q, lgwin)) } pub fn with_params(r: R, buffer_size: usize, params: &BrotliEncoderParams) -> Self { let mut reader = Self::new(r, buffer_size, params.quality as u32, params.lgwin as u32); (reader.0).0.state.0.params = params.clone(); reader } pub fn get_ref(&self) -> &R { self.0.get_ref() } pub fn into_inner(self) -> R { self.0.into_inner() } } #[cfg(feature="std")] impl Read for CompressorReader { fn read(&mut self, buf: &mut [u8]) -> Result { self.0.read(buf) } } pub struct CompressorReaderCustomIo, BufferType: SliceWrapperMut, Alloc: BrotliAlloc> { input_buffer: BufferType, total_out: Option, input_offset: usize, input_len: usize, input: R, input_eof: bool, error_if_invalid_data: Option, state: StateWrapper, } struct StateWrapper(BrotliEncoderStateStruct); impl Drop for StateWrapper { fn drop(&mut self) { BrotliEncoderDestroyInstance(&mut self.0); } } impl, BufferType : SliceWrapperMut, Alloc: BrotliAlloc> CompressorReaderCustomIo { pub fn new(r: R, buffer : BufferType, alloc : Alloc, invalid_data_error_type : ErrType, q: u32, lgwin: u32) -> Self { let mut ret = CompressorReaderCustomIo{ input_buffer : buffer, total_out : Some(0), input_offset : 0, input_len : 0, input_eof : false, input: r, state : StateWrapper(BrotliEncoderCreateInstance(alloc)), error_if_invalid_data : Some(invalid_data_error_type), }; BrotliEncoderSetParameter(&mut ret.state.0, BrotliEncoderParameter::BROTLI_PARAM_QUALITY, q as (u32)); BrotliEncoderSetParameter(&mut ret.state.0, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, lgwin as (u32)); ret } pub fn copy_to_front(&mut self) { let avail_in = self.input_len - self.input_offset; if self.input_offset == self.input_buffer.slice_mut().len() { self.input_offset = 0; self.input_len = 0; } else if self.input_offset + 256 > self.input_buffer.slice_mut().len() && avail_in < self.input_offset { let (first, second) = self.input_buffer.slice_mut().split_at_mut(self.input_offset); first[0..avail_in].clone_from_slice(&second[0..avail_in]); self.input_len -= self.input_offset; self.input_offset = 0; } } pub fn into_inner(self) -> R{ match self { CompressorReaderCustomIo { input_buffer:_ib, total_out:_to, input_offset: _io, input_len: _len, input, input_eof:_ieof, error_if_invalid_data: _eiid, state: _state, } => { input } } } pub fn get_ref(&self) -> &R { &self.input } } impl, BufferType : SliceWrapperMut, Alloc: BrotliAlloc> CustomRead for CompressorReaderCustomIo { fn read(&mut self, buf: &mut [u8]) -> Result { let mut nop_callback = |_data:&mut interface::PredictionModeContextMap, _cmds: &mut [interface::StaticCommand], _mb: interface::InputPair, _mfv: &mut Alloc|(); let mut output_offset : usize = 0; let mut avail_out = buf.len(); let mut avail_in = self.input_len - self.input_offset; while output_offset == 0 { if self.input_len < self.input_buffer.slice_mut().len() && !self.input_eof { match self.input.read(&mut self.input_buffer.slice_mut()[self.input_len..]) { Err(e) => return Err(e), Ok(size) => if size == 0 { self.input_eof = true; }else { self.input_len += size; avail_in = self.input_len - self.input_offset; }, } } let op : BrotliEncoderOperation; if avail_in == 0 { op = BrotliEncoderOperation::BROTLI_OPERATION_FINISH; } else { op = BrotliEncoderOperation::BROTLI_OPERATION_PROCESS; } let ret = BrotliEncoderCompressStream( &mut self.state.0, op, &mut avail_in, &self.input_buffer.slice_mut()[..], &mut self.input_offset, &mut avail_out, buf, &mut output_offset, &mut self.total_out, &mut nop_callback); if avail_in == 0 { self.copy_to_front(); } if ret <= 0 { return Err(self.error_if_invalid_data.take().unwrap()); } let fin = BrotliEncoderIsFinished(&mut self.state.0); if fin != 0 { break; } } Ok(output_offset) } } brotli-3.4.0/src/enc/singlethreading.rs000064400000000000000000000144151046102023000162010ustar 00000000000000use core::mem; #[cfg(feature="std")] use std; use alloc::{SliceWrapper, Allocator}; use enc::BrotliAlloc; use enc::BrotliEncoderParams; use core::marker::PhantomData; use super::backward_references::{UnionHasher}; use enc::threading::{ CompressMulti, SendAlloc, InternalSendAlloc, BatchSpawnable, BatchSpawnableLite, Joinable, Owned, OwnedRetriever, CompressionThreadResult, InternalOwned, PoisonedThreadError, BrotliEncoderThreadError, }; pub struct SingleThreadedJoinable { result:Result, } impl Joinable for SingleThreadedJoinable { fn join(self) -> Result { self.result } } #[cfg(feature="std")] pub struct SingleThreadedOwnedRetriever(std::sync::RwLock); #[cfg(feature="std")] impl OwnedRetriever for SingleThreadedOwnedRetriever { fn view T>(&self, f:F) -> Result { Ok(f(&*self.0.read().unwrap())) } fn unwrap(self) -> Result {Ok(self.0.into_inner().unwrap())} } #[cfg(feature="std")] impl SingleThreadedOwnedRetriever { fn new(u:U) -> Self { SingleThreadedOwnedRetriever(std::sync::RwLock::new(u)) } } #[cfg(not(feature="std"))] pub struct SingleThreadedOwnedRetriever(U); #[cfg(not(feature="std"))] impl SingleThreadedOwnedRetriever { fn new(u:U) -> Self { SingleThreadedOwnedRetriever(u) } } #[cfg(not(feature="std"))] impl OwnedRetriever for SingleThreadedOwnedRetriever { fn viewT>(&self, f:F) -> Result { Ok(f(&self.0)) } fn unwrap(self) -> Result {Ok(self.0)} } #[derive(Default)] pub struct SingleThreadedSpawner{} impl BatchSpawnable for SingleThreadedSpawner where >::AllocatedMemory:Send+'static { type JoinHandle = SingleThreadedJoinable; type FinalJoinHandle = SingleThreadedOwnedRetriever; fn make_spawner( &mut self, input: &mut Owned, ) ->Self::FinalJoinHandle { SingleThreadedOwnedRetriever::::new(mem::replace(input, Owned(InternalOwned::Borrowed)).unwrap()) } fn spawn ReturnValue+Send+'static+Copy>( &mut self, handle: &mut Self::FinalJoinHandle, work:&mut SendAlloc, index: usize, num_threads: usize, f: F, ) { let (alloc, extra_input) = work.replace_with_default(); let ret = handle.view(|sub_view| f(extra_input, index, num_threads, sub_view, alloc)); *work = SendAlloc(InternalSendAlloc::Join(SingleThreadedJoinable{result:Ok(ret.unwrap())})); } } impl BatchSpawnableLite for SingleThreadedSpawner where >::AllocatedMemory:Send+'static { type JoinHandle = >::JoinHandle; type FinalJoinHandle = >::FinalJoinHandle; fn make_spawner( &mut self, input: &mut Owned, ) -> Self::FinalJoinHandle { >::make_spawner(self, input) } fn spawn( &mut self, handle:&mut Self::FinalJoinHandle, alloc_per_thread:&mut SendAlloc, index: usize, num_threads: usize, f: fn(ExtraInput, usize, usize, &U, Alloc) -> ReturnValue, ) { >::spawn(self, handle, alloc_per_thread, index, num_threads, f) } } pub fn compress_multi+Send+'static+Sync> ( params:&BrotliEncoderParams, owned_input: &mut Owned, output: &mut [u8], alloc_per_thread:&mut [SendAlloc, UnionHasher, Alloc, ,UnionHasher, Alloc, SliceW>>::JoinHandle>], ) -> Result where >::AllocatedMemory: Send, >::AllocatedMemory: Send, >::AllocatedMemory: Send { CompressMulti(params, owned_input, output, alloc_per_thread, &mut SingleThreadedSpawner::default()) } pub struct WorkerPool { a: PhantomData, b: PhantomData, c: PhantomData, d: PhantomData, } pub fn new_work_pool(_num_threads: usize) -> WorkerPool{ WorkerPool::{ a:PhantomData::default(), b:PhantomData::default(), c:PhantomData::default(), d:PhantomData::default(), } } pub fn compress_worker_pool+Send+'static+Sync> ( params:&BrotliEncoderParams, owned_input: &mut Owned, output: &mut [u8], alloc_per_thread:&mut [SendAlloc, UnionHasher, Alloc, , UnionHasher, Alloc, SliceW>>::JoinHandle>], _worker_pool:&mut WorkerPool, UnionHasher, Alloc, (SliceW, BrotliEncoderParams)>, ) -> Result where >::AllocatedMemory: Send, >::AllocatedMemory: Send, >::AllocatedMemory: Send { compress_multi(params, owned_input, output, alloc_per_thread) } brotli-3.4.0/src/enc/static_dict.rs000075500000000000000000001516751046102023000153410ustar 00000000000000use core; pub const kNumDistanceCacheEntries: usize = 4; use super::static_dict_lut::{kDictHashMul32, kDictNumBits, kStaticDictionaryBuckets, kStaticDictionaryWords, DictWord}; use super::super::dictionary::{kBrotliDictionary, kBrotliDictionarySizeBitsByLength, kBrotliDictionaryOffsetsByLength}; #[allow(unused)] static kUppercaseFirst: u8 = 10i32 as (u8); #[allow(unused)] static kOmitLastNTransforms: [u8; 10] = [0i32 as (u8), 12i32 as (u8), 27i32 as (u8), 23i32 as (u8), 42i32 as (u8), 63i32 as (u8), 56i32 as (u8), 48i32 as (u8), 59i32 as (u8), 64i32 as (u8)]; pub struct BrotliDictionary { pub size_bits_by_length: &'static [u8; 25], pub offsets_by_length: &'static [u32; 25], pub data: &'static [u8; 122784], } pub static kBrotliEncDictionary: BrotliDictionary = BrotliDictionary { size_bits_by_length: &kBrotliDictionarySizeBitsByLength, offsets_by_length: &kBrotliDictionaryOffsetsByLength, data: &kBrotliDictionary, }; #[inline(always)] pub fn BrotliGetDictionary() -> &'static BrotliDictionary { return &kBrotliEncDictionary; } #[inline(always)] pub fn BROTLI_UNALIGNED_LOAD32(sl: &[u8]) -> u32 { let mut p = [0u8;4]; p[..].clone_from_slice(&sl.split_at(4).0); return (p[0] as u32) | ((p[1] as u32) << 8) | ((p[2] as u32) << 16) | ((p[3] as u32) << 24); } #[inline(always)] pub fn Hash(data: &[u8]) -> u32 { let h: u32 = BROTLI_UNALIGNED_LOAD32(data).wrapping_mul(kDictHashMul32); h >> 32i32 - kDictNumBits } #[inline(always)] pub fn BROTLI_UNALIGNED_LOAD64(sl: &[u8]) -> u64 { let mut p = [0u8;8]; p[..].clone_from_slice(sl.split_at(8).0); return (p[0] as u64) | ((p[1] as u64) << 8) | ((p[2] as u64) << 16) | ((p[3] as u64) << 24) | ((p[4] as u64) << 32) | ((p[5] as u64) << 40) | ((p[6] as u64) << 48) | ((p[7] as u64) << 56); } #[inline(always)] pub fn BROTLI_UNALIGNED_STORE64(outp: &mut [u8], v: u64) { let p = [(v & 0xff) as u8, ((v >> 8) & 0xff) as u8, ((v >> 16) & 0xff) as u8, ((v >> 24) & 0xff) as u8, ((v >> 32) & 0xff) as u8, ((v >> 40) & 0xff) as u8, ((v >> 48) & 0xff) as u8, ((v >> 56) & 0xff) as u8]; outp.split_at_mut(8).0.clone_from_slice(&p[..]); } macro_rules! sub_match { ($s1 : expr, $s2 : expr, $limit : expr, $matched : expr, $split_pair1 : expr, $split_pair2 : expr, $s1_lo : expr, $s2_lo : expr, $s1_as_64 : expr, $s2_as_64 : expr, $vec_len: expr) => { $split_pair1 = $s1.split_at($vec_len); $s1_lo[..$vec_len].clone_from_slice($split_pair1.0); $s1 = $split_pair1.1; $split_pair2 = $s2.split_at($vec_len); $s2_lo[..$vec_len].clone_from_slice($split_pair2.0); $s2 = $split_pair2.1; $limit -= $vec_len; for index in 0..($vec_len >> 3) { $s1_as_64 = BROTLI_UNALIGNED_LOAD64(&$s1_lo[(index << 3)..((index + 1) << 3)]); $s2_as_64 = BROTLI_UNALIGNED_LOAD64(&$s2_lo[(index << 3)..((index + 1) << 3)]); if $s2_as_64 == $s1_as_64 { $matched = $matched.wrapping_add(8usize) as u32 as usize; } else { $matched = $matched.wrapping_add((($s2_as_64 ^ $s1_as_64).trailing_zeros() >> 3i32) as usize) as u32 as usize; return $matched; } } } } macro_rules! sub_match8 { ($s1 : expr, $s2 : expr, $limit : expr, $matched : expr, $s1_as_64 : expr, $s2_as_64 : expr) => { $limit -= 8; $s1_as_64 = BROTLI_UNALIGNED_LOAD64($s1); $s1 = $s1.split_at(8).1; $s2_as_64 = BROTLI_UNALIGNED_LOAD64($s2); $s2 = $s2.split_at(8).1; if $s2_as_64 == $s1_as_64 { $matched = $matched.wrapping_add(8usize) as u32 as usize; } else { $matched = $matched.wrapping_add((($s2_as_64 ^ $s1_as_64).trailing_zeros() >> 3i32) as usize) as u32 as usize; return $matched; } } } // factor of 10 slower (example takes 158s, not 30, and for the 30 second run it took 15 of them) #[allow(unused)] pub fn SlowerFindMatchLengthWithLimit(s1: &[u8], s2: &[u8], limit: usize) -> usize { for index in 0..limit { if s1[index] != s2[index] { return index; } } return limit; } // factor of 5 slower (example takes 90 seconds) #[allow(unused)] pub fn FindMatchLengthWithLimit(s1: &[u8], s2: &[u8], limit: usize) -> usize { for (index, pair) in s1[..limit].iter().zip(s2[..limit].iter()).enumerate() { if *pair.0 != *pair.1 { return index; } } return limit; } #[allow(unused)] pub fn FindMatchLengthWithLimitMin4(s1: &[u8], s2: &[u8], limit: usize) -> usize { let (s1_start, s1_rest) = s1.split_at(5); let (s2_start, s2_rest) = s2.split_at(5); let v0 = BROTLI_UNALIGNED_LOAD32(s1_start); let v1 = BROTLI_UNALIGNED_LOAD32(s2_start); let beyond_ok = s1_start[4] != s2_start[4]; if v0 != v1 { return 0; } if limit <= 4 || beyond_ok { return core::cmp::min(limit, 4); } return ComplexFindMatchLengthWithLimit(s1_rest, s2_rest, limit - 5) + 5; } #[inline] pub fn ComplexFindMatchLengthWithLimit(mut s1: &[u8], mut s2: &[u8], mut limit: usize) -> usize { let mut matched: usize = 0usize; let mut s1_as_64 : u64; let mut s2_as_64 : u64; if limit >= 8 { sub_match8!(s1, s2, limit, matched, s1_as_64, s2_as_64); if limit >= 16 { let mut split_pair1 : (&[u8], &[u8]); let mut split_pair2 : (&[u8], &[u8]); { let mut s1_lo = [0u8; 16]; let mut s1_hi = [0u8; 16]; sub_match!(s1, s2, limit, matched, split_pair1, split_pair2, s1_lo, s1_hi, s1_as_64, s2_as_64, 16); } if limit >= 32 { let mut s1_lo_a = [0u8; 128]; let mut s1_hi_a = [0u8; 128]; sub_match!(s1, s2, limit, matched, split_pair1, split_pair2, s1_lo_a, s1_hi_a, s1_as_64, s2_as_64, 32); if limit >= 64 { sub_match!(s1, s2, limit, matched, split_pair1, split_pair2, s1_lo_a, s1_hi_a, s1_as_64, s2_as_64, 64); while limit >= 128 { sub_match!(s1, s2, limit, matched, split_pair1, split_pair2, s1_lo_a, s1_hi_a, s1_as_64, s2_as_64, 128); } } } } while limit >= 8 { sub_match8!(s1, s2, limit, matched, s1_as_64, s2_as_64); } } assert!(s1.len() >= (limit & 7usize)); assert!(s2.len() >= (limit & 7usize)); for index in 0..(limit & 7usize) { if s1[index] != s2[index] { return matched + index; } } matched + (limit & 7usize) // made it through the loop } mod test { #[allow(unused)] fn construct_situation(seed : &[u8], mut output: &mut [u8], limit : usize, matchfor: usize) { output[..].clone_from_slice(&seed[..]); if matchfor >= limit { return } output[matchfor] = output[matchfor].wrapping_add((matchfor as u8 % 253u8).wrapping_add(1)); } #[test] fn test_find_match_length() { let mut a = [91u8;600000]; let mut b = [0u8;600000]; for i in 1..a.len() { a[i] = (a[i - 1] % 19u8).wrapping_add(17u8); } construct_situation(&a[..], &mut b[..], a.len(), 0); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 0); construct_situation(&a[..], &mut b[..], a.len(), 1); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 1); construct_situation(&a[..], &mut b[..], a.len(), 10); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 10); construct_situation(&a[..], &mut b[..], a.len(), 9); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 9); construct_situation(&a[..], &mut b[..], a.len(), 7); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 7); construct_situation(&a[..], &mut b[..], a.len(), 8); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 8); construct_situation(&a[..], &mut b[..], a.len(), 48); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 48); construct_situation(&a[..], &mut b[..], a.len(), 49); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 49); construct_situation(&a[..], &mut b[..], a.len(), 63); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 63); construct_situation(&a[..], &mut b[..], a.len(), 222); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 222); construct_situation(&a[..], &mut b[..], a.len(), 1590); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 1590); construct_situation(&a[..], &mut b[..], a.len(), 12590); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 12590); construct_situation(&a[..], &mut b[..], a.len(), 52592); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 52592); construct_situation(&a[..], &mut b[..], a.len(), 152592); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 152592); construct_situation(&a[..], &mut b[..], a.len(), 252591); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 252591); construct_situation(&a[..], &mut b[..], a.len(), 131072); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 131072); construct_situation(&a[..], &mut b[..], a.len(), 131073); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 131073); construct_situation(&a[..], &mut b[..], a.len(), 131072 + 64 + 32 + 16 + 8); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 131072 + 64 + 32 + 16 + 8); construct_situation(&a[..], &mut b[..], a.len(), 272144 + 64 + 32 + 16 + 8 + 1); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 272144 + 64 + 32 + 16 + 8 + 1); construct_situation(&a[..], &mut b[..], a.len(), 2*272144 + 64 + 32 + 16 + 8); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), 2*272144 + 64 + 32 + 16 + 8); construct_situation(&a[..], &mut b[..], a.len(), a.len()); assert_eq!(super::FindMatchLengthWithLimit(&a[..], &b[..], a.len()), a.len()); } } #[allow(unused)] pub fn slowFindMatchLengthWithLimit(s1: &[u8], s2: &[u8], limit: usize) -> usize { for (index, it) in s1[..limit].iter().zip(s2[..limit].iter()).enumerate() { if it.0 != it.1 { return index; } } return limit; } pub fn IsMatch(dictionary: &BrotliDictionary, w: DictWord, data: &[u8], max_length: usize) -> i32 { if w.l as (usize) > max_length { 0i32 } else { let offset: usize = ((*dictionary).offsets_by_length[w.l as (usize)] as (usize)) .wrapping_add((w.len() as (usize)).wrapping_mul(w.idx() as (usize))); let dict = &(*dictionary).data.split_at(offset).1; if w.transform() as (i32) == 0i32 { if !!(FindMatchLengthWithLimit(dict, data, w.l as (usize)) == w.l as (usize)) { 1i32 } else { 0i32 } } else if w.transform() as (i32) == 10i32 { if !!(dict[(0usize)] as (i32) >= b'a' as (i32) && (dict[(0usize)] as (i32) <= b'z' as (i32)) && (dict[(0usize)] as (i32) ^ 32i32 == data[(0usize)] as (i32)) && (FindMatchLengthWithLimit(&dict.split_at(1).1, &data.split_at(1).1, (w.len() as (u32)).wrapping_sub(1u32) as (usize)) == (w.len() as (u32)).wrapping_sub(1u32) as (usize))) { 1i32 } else { 0i32 } } else { let mut i: usize; i = 0usize; while i < w.len() as (usize) { { if dict[(i as (usize))] as (i32) >= b'a' as (i32) && (dict[(i as (usize))] as (i32) <= b'z' as (i32)) { if dict[(i as (usize))] as (i32) ^ 32i32 != data[(i as (usize))] as (i32) { return 0i32; } } else if dict[(i as (usize))] as (i32) != data[(i as (usize))] as (i32) { return 0i32; } } i = i.wrapping_add(1 as (usize)); } 1i32 } } } #[allow(unused)] fn brotli_min_uint32_t(a: u32, b: u32) -> u32 { if a < b { a } else { b } } #[allow(unused)] fn AddMatch(distance: usize, len: usize, len_code: usize, mut matches: &mut [u32]) { let match_: u32 = (distance << 5i32).wrapping_add(len_code) as (u32); matches[len as (usize)] = brotli_min_uint32_t(matches[len as (usize)], match_); } #[allow(unused)] fn brotli_min_size_t(a: usize, b: usize) -> usize { if a < b { a } else { b } } #[allow(unused)] fn DictMatchLength(dictionary: &BrotliDictionary, data: &[u8], id: usize, len: usize, maxlen: usize) -> usize { let offset: usize = ((*dictionary).offsets_by_length[len] as (usize)) .wrapping_add(len.wrapping_mul(id)); FindMatchLengthWithLimit(&(*dictionary).data.split_at(offset).1, data, brotli_min_size_t(len, maxlen)) } #[allow(unused)] fn brotli_max_size_t(a: usize, b: usize) -> usize { if a > b { a } else { b } } #[allow(unused)] pub fn BrotliFindAllStaticDictionaryMatches(dictionary: &BrotliDictionary, data: &[u8], min_length: usize, max_length: usize, mut matches: &mut [u32]) -> i32 { let mut has_found_match: i32 = 0i32; { let mut offset: usize = kStaticDictionaryBuckets[Hash(data) as (usize)] as (usize); let mut end: i32 = (offset == 0) as (i32); while end == 0 { let mut w: DictWord = kStaticDictionaryWords[{ let _old = offset; offset = offset.wrapping_add(1 as (usize)); _old }]; let l: usize = (w.len() as (i32) & 0x1fi32) as (usize); let n: usize = 1usize << (*dictionary).size_bits_by_length[l] as (i32); let id: usize = w.idx() as (usize); end = !(w.len() as (i32) & 0x80i32 == 0) as (i32); w.l = l as (u8); if w.transform() as (i32) == 0i32 { let matchlen: usize = DictMatchLength(dictionary, data, id, l, max_length); let s: &[u8]; let mut minlen: usize; let maxlen: usize; let mut len: usize; if matchlen == l { //eprint!("Adding match {} {} {}\n", w.len(), w.transform(), w.idx()); AddMatch(id, l, l, matches); has_found_match = 1i32; } if matchlen >= l.wrapping_sub(1usize) { //eprint!("Bdding match {} {} {}\n", w.len(), w.transform(), w.idx()); AddMatch(id.wrapping_add((12usize).wrapping_mul(n)), l.wrapping_sub(1usize), l, matches); if l.wrapping_add(2usize) < max_length && (data[(l.wrapping_sub(1usize) as (usize))] as (i32) == b'i' as (i32)) && (data[(l as (usize))] as (i32) == b'n' as (i32)) && (data[(l.wrapping_add(1usize) as (usize))] as (i32) == b'g' as (i32)) && (data[(l.wrapping_add(2usize) as (usize))] as (i32) == b' ' as (i32)) { //eprint!("Cdding match {} {} {}\n", w.len(), w.transform(), w.idx()); AddMatch(id.wrapping_add((49usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } has_found_match = 1i32; } minlen = min_length; if l > 9usize { minlen = brotli_max_size_t(minlen, l.wrapping_sub(9usize)); } maxlen = brotli_min_size_t(matchlen, l.wrapping_sub(2usize)); len = minlen; while len <= maxlen { { //eprint!("Ddding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((kOmitLastNTransforms[l.wrapping_sub(len)] as (usize)) .wrapping_mul(n)), len, l, matches); has_found_match = 1i32; } len = len.wrapping_add(1 as (usize)); } if matchlen < l || l.wrapping_add(6usize) >= max_length { { continue; } } s = &data.split_at(l as (usize)).1; if s[(0usize)] as (i32) == b' ' as (i32) { //eprint!("Edding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add(n), l.wrapping_add(1usize), l, matches); if s[(1usize)] as (i32) == b'a' as (i32) { if s[(2usize)] as (i32) == b' ' as (i32) { //eprint!("Fdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((28usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } else if s[(2usize)] as (i32) == b's' as (i32) { if s[(3usize)] as (i32) == b' ' as (i32) { //eprint!("Gdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((46usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } else if s[(2usize)] as (i32) == b't' as (i32) { if s[(3usize)] as (i32) == b' ' as (i32) { //eprint!("Hdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((60usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } else if s[(2usize)] as (i32) == b'n' as (i32) { if s[(3usize)] as (i32) == b'd' as (i32) && (s[(4usize)] as (i32) == b' ' as (i32)) { //eprint!("Idding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((10usize).wrapping_mul(n)), l.wrapping_add(5usize), l, matches); } } } else if s[(1usize)] as (i32) == b'b' as (i32) { if s[(2usize)] as (i32) == b'y' as (i32) && (s[(3usize)] as (i32) == b' ' as (i32)) { //eprint!("Jdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((38usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } else if s[(1usize)] as (i32) == b'i' as (i32) { if s[(2usize)] as (i32) == b'n' as (i32) { if s[(3usize)] as (i32) == b' ' as (i32) { //eprint!("Kdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((16usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } else if s[(2usize)] as (i32) == b's' as (i32) { if s[(3usize)] as (i32) == b' ' as (i32) { //eprint!("Ldding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((47usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } } else if s[(1usize)] as (i32) == b'f' as (i32) { if s[(2usize)] as (i32) == b'o' as (i32) { if s[(3usize)] as (i32) == b'r' as (i32) && (s[(4usize)] as (i32) == b' ' as (i32)) { //eprint!("Mdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((25usize).wrapping_mul(n)), l.wrapping_add(5usize), l, matches); } } else if s[(2usize)] as (i32) == b'r' as (i32) { if s[(3usize)] as (i32) == b'o' as (i32) && (s[(4usize)] as (i32) == b'm' as (i32)) && (s[(5usize)] as (i32) == b' ' as (i32)) { //eprint!("Ndding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((37usize).wrapping_mul(n)), l.wrapping_add(6usize), l, matches); } } } else if s[(1usize)] as (i32) == b'o' as (i32) { if s[(2usize)] as (i32) == b'f' as (i32) { if s[(3usize)] as (i32) == b' ' as (i32) { //eprint!("Odding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((8usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } else if s[(2usize)] as (i32) == b'n' as (i32) { if s[(3usize)] as (i32) == b' ' as (i32) { //eprint!("Pdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((45usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } } else if s[(1usize)] as (i32) == b'n' as (i32) { if s[(2usize)] as (i32) == b'o' as (i32) && (s[(3usize)] as (i32) == b't' as (i32)) && (s[(4usize)] as (i32) == b' ' as (i32)) { //eprint!("Qdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((80usize).wrapping_mul(n)), l.wrapping_add(5usize), l, matches); } } else if s[(1usize)] as (i32) == b't' as (i32) { if s[(2usize)] as (i32) == b'h' as (i32) { if s[(3usize)] as (i32) == b'e' as (i32) { if s[(4usize)] as (i32) == b' ' as (i32) { //eprint!("Rdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((5usize).wrapping_mul(n)), l.wrapping_add(5usize), l, matches); } } else if s[(3usize)] as (i32) == b'a' as (i32) { if s[(4usize)] as (i32) == b't' as (i32) && (s[(5usize)] as (i32) == b' ' as (i32)) { //eprint!("Sdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((29usize).wrapping_mul(n)), l.wrapping_add(6usize), l, matches); } } } else if s[(2usize)] as (i32) == b'o' as (i32) { if s[(3usize)] as (i32) == b' ' as (i32) { //eprint!("Tdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((17usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } } else if s[(1usize)] as (i32) == b'w' as (i32) { if s[(2usize)] as (i32) == b'i' as (i32) && (s[(3usize)] as (i32) == b't' as (i32)) && (s[(4usize)] as (i32) == b'h' as (i32)) && (s[(5usize)] as (i32) == b' ' as (i32)) { //eprint!("Udding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((35usize).wrapping_mul(n)), l.wrapping_add(6usize), l, matches); } } } else if s[(0usize)] as (i32) == b'\"' as (i32) { //eprint!("Vdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((19usize).wrapping_mul(n)), l.wrapping_add(1usize), l, matches); if s[(1usize)] as (i32) == b'>' as (i32) { //eprint!("Wdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((21usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } } else if s[(0usize)] as (i32) == b'.' as (i32) { //eprint!("Xdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((20usize).wrapping_mul(n)), l.wrapping_add(1usize), l, matches); if s[(1usize)] as (i32) == b' ' as (i32) { //eprint!("Ydding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((31usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); if s[(2usize)] as (i32) == b'T' as (i32) && (s[(3usize)] as (i32) == b'h' as (i32)) { if s[(4usize)] as (i32) == b'e' as (i32) { if s[(5usize)] as (i32) == b' ' as (i32) { //eprint!("Zdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((43usize).wrapping_mul(n)), l.wrapping_add(6usize), l, matches); } } else if s[(4usize)] as (i32) == b'i' as (i32) { if s[(5usize)] as (i32) == b's' as (i32) && (s[(6usize)] as (i32) == b' ' as (i32)) { //eprint!("AAdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((75usize).wrapping_mul(n)), l.wrapping_add(7usize), l, matches); } } } } } else if s[(0usize)] as (i32) == b',' as (i32) { //eprint!("ABdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((76usize).wrapping_mul(n)), l.wrapping_add(1usize), l, matches); if s[(1usize)] as (i32) == b' ' as (i32) { //eprint!("ACdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((14usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } } else if s[(0usize)] as (i32) == b'\n' as (i32) { //eprint!("ADdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((22usize).wrapping_mul(n)), l.wrapping_add(1usize), l, matches); if s[(1usize)] as (i32) == b'\t' as (i32) { //eprint!("AEdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((50usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } } else if s[(0usize)] as (i32) == b']' as (i32) { //eprint!("AFdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((24usize).wrapping_mul(n)), l.wrapping_add(1usize), l, matches); } else if s[(0usize)] as (i32) == b'\'' as (i32) { //eprint!("AGdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((36usize).wrapping_mul(n)), l.wrapping_add(1usize), l, matches); } else if s[(0usize)] as (i32) == b':' as (i32) { //eprint!("AHdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((51usize).wrapping_mul(n)), l.wrapping_add(1usize), l, matches); } else if s[(0usize)] as (i32) == b'(' as (i32) { //eprint!("AIdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((57usize).wrapping_mul(n)), l.wrapping_add(1usize), l, matches); } else if s[(0usize)] as (i32) == b'=' as (i32) { if s[(1usize)] as (i32) == b'\"' as (i32) { //eprint!("AJdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((70usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } else if s[(1usize)] as (i32) == b'\'' as (i32) { //eprint!("AKdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((86usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } } else if s[(0usize)] as (i32) == b'a' as (i32) { if s[(1usize)] as (i32) == b'l' as (i32) && (s[(2usize)] as (i32) == b' ' as (i32)) { //eprint!("ALdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((84usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } else if s[(0usize)] as (i32) == b'e' as (i32) { if s[(1usize)] as (i32) == b'd' as (i32) { if s[(2usize)] as (i32) == b' ' as (i32) { //eprint!("AMdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((53usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } else if s[(1usize)] as (i32) == b'r' as (i32) { if s[(2usize)] as (i32) == b' ' as (i32) { //eprint!("ANdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((82usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } else if s[(1usize)] as (i32) == b's' as (i32) { if s[(2usize)] as (i32) == b't' as (i32) && (s[(3usize)] as (i32) == b' ' as (i32)) { //eprint!("AOdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((95usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } } else if s[(0usize)] as (i32) == b'f' as (i32) { if s[(1usize)] as (i32) == b'u' as (i32) && (s[(2usize)] as (i32) == b'l' as (i32)) && (s[(3usize)] as (i32) == b' ' as (i32)) { //eprint!("APdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((90usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } else if s[(0usize)] as (i32) == b'i' as (i32) { if s[(1usize)] as (i32) == b'v' as (i32) { if s[(2usize)] as (i32) == b'e' as (i32) && (s[(3usize)] as (i32) == b' ' as (i32)) { //eprint!("AQdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((92usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } else if s[(1usize)] as (i32) == b'z' as (i32) { if s[(2usize)] as (i32) == b'e' as (i32) && (s[(3usize)] as (i32) == b' ' as (i32)) { //eprint!("ARdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((100usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } } else if s[(0usize)] as (i32) == b'l' as (i32) { if s[(1usize)] as (i32) == b'e' as (i32) { if s[(2usize)] as (i32) == b's' as (i32) && (s[(3usize)] as (i32) == b's' as (i32)) && (s[(4usize)] as (i32) == b' ' as (i32)) { //eprint!("ASdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((93usize).wrapping_mul(n)), l.wrapping_add(5usize), l, matches); } } else if s[(1usize)] as (i32) == b'y' as (i32) { if s[(2usize)] as (i32) == b' ' as (i32) { //eprint!("ATdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((61usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } } else if s[(0usize)] as (i32) == b'o' as (i32) { if s[(1usize)] as (i32) == b'u' as (i32) && (s[(2usize)] as (i32) == b's' as (i32)) && (s[(3usize)] as (i32) == b' ' as (i32)) { //eprint!("AUdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), len); AddMatch(id.wrapping_add((106usize).wrapping_mul(n)), l.wrapping_add(4usize), l, matches); } } } else { let is_all_caps: i32 = if !!(w.transform() as (i32) != kUppercaseFirst as (i32)) { 1i32 } else { 0i32 }; let s: &[u8]; if IsMatch(dictionary, w, data, max_length) == 0 { { continue; } } //eprint!("AVdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 44i32 } else { 9i32 } as (usize)) .wrapping_mul(n)), l, l, matches); has_found_match = 1i32; if l.wrapping_add(1usize) >= max_length { { continue; } } s = &data.split_at(l as (usize)).1; if s[(0usize)] as (i32) == b' ' as (i32) { //eprint!("AWdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 68i32 } else { 4i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(1usize), l, matches); } else if s[(0usize)] as (i32) == b'\"' as (i32) { //eprint!("AXdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 87i32 } else { 66i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(1usize), l, matches); if s[(1usize)] as (i32) == b'>' as (i32) { //eprint!("AYdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 97i32 } else { 69i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } } else if s[(0usize)] as (i32) == b'.' as (i32) { //eprint!("AZdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 101i32 } else { 79i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(1usize), l, matches); if s[(1usize)] as (i32) == b' ' as (i32) { //eprint!("BAdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 114i32 } else { 88i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } } else if s[(0usize)] as (i32) == b',' as (i32) { //eprint!("BBdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 112i32 } else { 99i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(1usize), l, matches); if s[(1usize)] as (i32) == b' ' as (i32) { //eprint!("BCdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 107i32 } else { 58i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } } else if s[(0usize)] as (i32) == b'\'' as (i32) { //eprint!("BDdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 94i32 } else { 74i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(1usize), l, matches); } else if s[(0usize)] as (i32) == b'(' as (i32) { //eprint!("BEdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 113i32 } else { 78i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(1usize), l, matches); } else if s[(0usize)] as (i32) == b'=' as (i32) { if s[(1usize)] as (i32) == b'\"' as (i32) { //eprint!("BFdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 105i32 } else { 104i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } else if s[(1usize)] as (i32) == b'\'' as (i32) { //eprint!("BGdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 116i32 } else { 108i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } } } } } if max_length >= 5usize && (data[(0usize)] as (i32) == b' ' as (i32) || data[(0usize)] as (i32) == b'.' as (i32)) { let is_space: i32 = if !!(data[(0usize)] as (i32) == b' ' as (i32)) { 1i32 } else { 0i32 }; let mut offset: usize = kStaticDictionaryBuckets[Hash(&data.split_at(1).1) as (usize)] as (usize); let mut end: i32 = (offset == 0) as (i32); while end == 0 { let mut w: DictWord = kStaticDictionaryWords[{ let _old = offset; offset = offset.wrapping_add(1 as (usize)); _old }]; let l: usize = (w.len() as (i32) & 0x1fi32) as (usize); let n: usize = 1usize << (*dictionary).size_bits_by_length[l] as (i32); let id: usize = w.idx() as (usize); end = !(w.len() as (i32) & 0x80i32 == 0) as (i32); w.l = l as (u8); if w.transform() as (i32) == 0i32 { let s: &[u8]; if IsMatch(dictionary, w, &data.split_at(1).1, max_length.wrapping_sub(1usize)) == 0 { { continue; } } //eprint!("BHdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_space != 0 { 6i32 } else { 32i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(1usize), l, matches); has_found_match = 1i32; if l.wrapping_add(2usize) >= max_length { { continue; } } s = &data.split_at(l.wrapping_add(1usize) as (usize)).1; if s[(0usize)] as (i32) == b' ' as (i32) { //eprint!("BIdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_space != 0 { 2i32 } else { 77i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } else if s[(0usize)] as (i32) == b'(' as (i32) { //eprint!("BJdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_space != 0 { 89i32 } else { 67i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } else if is_space != 0 { if s[(0usize)] as (i32) == b',' as (i32) { //eprint!("BKdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((103usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); if s[(1usize)] as (i32) == b' ' as (i32) { //eprint!("BLdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((33usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } else if s[(0usize)] as (i32) == b'.' as (i32) { //eprint!("BMdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((71usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); if s[(1usize)] as (i32) == b' ' as (i32) { //eprint!("BNdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((52usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } else if s[(0usize)] as (i32) == b'=' as (i32) { if s[(1usize)] as (i32) == b'\"' as (i32) { //eprint!("BOdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((81usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } else if s[(1usize)] as (i32) == b'\'' as (i32) { //eprint!("BPdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((98usize).wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } } } else if is_space != 0 { let is_all_caps: i32 = if !!(w.transform() as (i32) != kUppercaseFirst as (i32)) { 1i32 } else { 0i32 }; let s: &[u8]; if IsMatch(dictionary, w, &data.split_at(1).1, max_length.wrapping_sub(1usize)) == 0 { { continue; } } //eprint!("CAdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 85i32 } else { 30i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(1usize), l, matches); has_found_match = 1i32; if l.wrapping_add(2usize) >= max_length { { continue; } } s = &data.split_at(l.wrapping_add(1)).1; if s[(0usize)] as (i32) == b' ' as (i32) { //eprint!("CBdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 83i32 } else { 15i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } else if s[(0usize)] as (i32) == b',' as (i32) { if is_all_caps == 0 { //eprint!("CCdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((109usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); } if s[(1usize)] as (i32) == b' ' as (i32) { //eprint!("CDdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 111i32 } else { 65i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } else if s[(0usize)] as (i32) == b'.' as (i32) { //eprint!("CEdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 115i32 } else { 96i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(2usize), l, matches); if s[(1usize)] as (i32) == b' ' as (i32) { //eprint!("CFdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 117i32 } else { 91i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } else if s[(0usize)] as (i32) == b'=' as (i32) { if s[(1usize)] as (i32) == b'\"' as (i32) { //eprint!("CGdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 110i32 } else { 118i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } else if s[(1usize)] as (i32) == b'\'' as (i32) { //eprint!("CHdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if is_all_caps != 0 { 119i32 } else { 120i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(3usize), l, matches); } } } } } if max_length >= 6usize { if data[(1usize)] as (i32) == b' ' as (i32) && (data[(0usize)] as (i32) == b'e' as (i32) || data[(0usize)] as (i32) == b's' as (i32) || data[(0usize)] as (i32) == b',' as (i32)) || data[(0usize)] as (i32) == 0xc2i32 && (data[(1usize)] as (i32) == 0xa0i32) { let mut offset: usize = kStaticDictionaryBuckets[Hash(&data.split_at(2).1) as (usize)] as (usize); let mut end: i32 = (offset == 0) as (i32); while end == 0 { let mut w: DictWord = kStaticDictionaryWords[{ let _old = offset; offset = offset.wrapping_add(1 as (usize)); _old }]; let l: usize = (w.len() as (i32) & 0x1fi32) as (usize); let n: usize = 1usize << (*dictionary).size_bits_by_length[l] as (i32); let id: usize = w.idx() as (usize); end = !(w.len() as (i32) & 0x80i32 == 0) as (i32); w.l = l as (u8); if w.transform() as (i32) == 0i32 && (IsMatch(dictionary, w, &data.split_at(2).1, max_length.wrapping_sub(2usize)) != 0) { if data[(0usize)] as (i32) == 0xc2i32 { //eprint!("CIdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((102usize).wrapping_mul(n)), l.wrapping_add(2usize), l, matches); has_found_match = 1i32; } else if l.wrapping_add(2usize) < max_length && (data[(l.wrapping_add(2usize) as (usize))] as (i32) == b' ' as (i32)) { let t: usize = (if data[(0usize)] as (i32) == b'e' as (i32) { 18i32 } else if data[(0usize)] as (i32) == b's' as (i32) { 7i32 } else { 13i32 }) as (usize); //eprint!("CJdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add(t.wrapping_mul(n)), l.wrapping_add(3usize), l, matches); has_found_match = 1i32; } } } } } if max_length >= 9usize { if data[(0usize)] as (i32) == b' ' as (i32) && (data[(1usize)] as (i32) == b't' as (i32)) && (data[(2usize)] as (i32) == b'h' as (i32)) && (data[(3usize)] as (i32) == b'e' as (i32)) && (data[(4usize)] as (i32) == b' ' as (i32)) || data[(0usize)] as (i32) == b'.' as (i32) && (data[(1usize)] as (i32) == b'c' as (i32)) && (data[(2usize)] as (i32) == b'o' as (i32)) && (data[(3usize)] as (i32) == b'm' as (i32)) && (data[(4usize)] as (i32) == b'/' as (i32)) { let mut offset: usize = kStaticDictionaryBuckets[Hash(&data.split_at(5).1) as (usize)] as (usize); let mut end: i32 = (offset == 0) as (i32); while end == 0 { let mut w: DictWord = kStaticDictionaryWords[{ let _old = offset; offset = offset.wrapping_add(1 as (usize)); _old }]; let l: usize = (w.len() as (i32) & 0x1fi32) as (usize); let n: usize = 1usize << (*dictionary).size_bits_by_length[l] as (i32); let id: usize = w.idx() as (usize); end = !(w.len() as (i32) & 0x80i32 == 0) as (i32); w.l = l as (u8); if w.transform() as (i32) == 0i32 && (IsMatch(dictionary, w, &data.split_at(5).1, max_length.wrapping_sub(5usize)) != 0) { //eprint!("CKdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((if data[(0usize)] as (i32) == b' ' as (i32) { 41i32 } else { 72i32 } as (usize)) .wrapping_mul(n)), l.wrapping_add(5usize), l, matches); has_found_match = 1i32; if l.wrapping_add(5usize) < max_length { let s: &[u8] = &data.split_at(l.wrapping_add(5usize) as (usize)).1; if data[(0usize)] as (i32) == b' ' as (i32) { if l.wrapping_add(8usize) < max_length && (s[(0usize)] as (i32) == b' ' as (i32)) && (s[(1usize)] as (i32) == b'o' as (i32)) && (s[(2usize)] as (i32) == b'f' as (i32)) && (s[(3usize)] as (i32) == b' ' as (i32)) { //eprint!("CLdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((62usize).wrapping_mul(n)), l.wrapping_add(9usize), l, matches); if l.wrapping_add(12usize) < max_length && (s[(4usize)] as (i32) == b't' as (i32)) && (s[(5usize)] as (i32) == b'h' as (i32)) && (s[(6usize)] as (i32) == b'e' as (i32)) && (s[(7usize)] as (i32) == b' ' as (i32)) { //eprint!("BQdding match {} {} {} {}\n", w.len(), w.transform(), w.idx(), 666); AddMatch(id.wrapping_add((73usize).wrapping_mul(n)), l.wrapping_add(13usize), l, matches); } } } } } } } } has_found_match } brotli-3.4.0/src/enc/static_dict_lut.rs000075500000000000000000026036231046102023000162220ustar 00000000000000#![allow(dead_code)] pub static kInvalidMatch: u32 = 0xfffffff; pub static kDictNumBits: i32 = 15; pub static kDictHashMul32: u32 = 0x1e35a7bd; pub static kStaticDictionaryBuckets: [u16; 32768] = [1,0,0,0,0,0,0,0,0,3,6,0,0,0,0,0,20,0,0,0,21,0,22,0,0,0,0,0,0,0,0, 23,0,0,25,0,29,0,53,0,0,0,0,0,0,55,0,0,0,0,0,0,61,76,0,0,0,94,0,0, 0,0,0,0,96,0,97,0,98,0,0,0,0,0,0,0,99,101,106,108,0,0,0,0,0,110,0, 111,112,0,113,118,124,0,0,0,0,0,125,128,0,0,0,0,129,0,0,131,0,0,0,0,0, 0,132,0,0,135,0,0,0,137,0,0,0,0,0,138,139,0,0,0,0,0,0,0,142,143,144, 0,0,0,0,0,145,0,0,0,146,149,151,152,0,0,153,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,154,0,0,0,0,0,0,155,0,0,0,0,160,182,0,0,0,0,0,0,183,0,0,0,188, 189,0,0,192,0,0,0,0,0,0,194,0,0,0,0,0,0,0,0,197,202,209,0,0,210,0, 224,0,0,0,225,0,0,0,0,0,0,0,0,0,0,231,0,0,0,232,0,240,0,0,242,0,0,0, 0,0,0,0,0,0,0,0,244,0,0,0,246,0,0,249,251,253,0,0,0,0,0,258,0,0,261, 263,0,0,0,267,0,0,268,0,269,0,0,0,0,0,0,0,0,0,271,0,0,0,0,0,0,272,0, 273,0,277,0,278,286,0,0,0,0,287,0,289,290,291,0,0,0,295,0,0,296,297,0, 0,0,0,0,0,0,0,0,0,298,0,0,0,299,0,0,305,0,324,0,0,0,0,0,327,0,328, 329,0,0,0,0,336,0,0,340,0,341,342,343,0,0,346,0,348,0,0,0,0,0,0,349, 351,0,0,355,0,363,0,364,0,368,369,0,370,0,0,0,0,0,0,0,372,0,0,0,0,0, 0,0,0,0,0,0,373,0,375,0,0,0,0,376,377,0,0,394,395,396,0,0,398,0,0,0, 0,400,0,0,408,0,0,0,0,420,0,0,0,0,0,0,421,0,0,422,423,0,0,429,435,436, 442,0,0,443,0,444,445,453,456,0,457,0,0,0,0,0,458,0,0,0,459,0,0,0,460, 0,462,463,465,0,0,0,0,0,0,466,469,0,0,0,0,0,0,470,0,0,0,474,0,476,0, 0,0,0,483,0,485,0,0,0,486,0,0,488,491,492,0,0,497,499,500,0,501,0,0,0, 505,0,0,506,0,0,0,507,0,0,0,509,0,0,0,0,511,512,519,0,0,0,0,0,0,529, 530,0,0,0,534,0,0,0,0,543,0,0,0,0,0,0,0,0,0,553,0,0,0,0,557,560,0,0, 0,0,0,0,561,0,564,0,0,0,0,0,0,565,566,0,575,0,619,0,620,0,0,623,624,0, 0,0,625,0,0,626,627,0,0,628,0,0,0,0,630,0,631,0,0,0,0,0,0,0,0,0,641, 0,0,0,0,643,656,668,0,0,0,673,0,0,0,674,0,0,0,0,0,0,0,0,682,0,687,0, 690,0,693,699,700,0,0,0,0,0,0,704,705,0,0,0,0,707,710,0,711,0,0,0,0, 726,0,0,729,0,0,0,730,731,0,0,0,0,0,752,0,0,0,762,0,763,0,0,767,0,0, 0,770,774,0,0,775,0,0,0,0,0,0,0,0,0,0,776,0,0,0,777,783,0,0,0,785, 788,0,0,0,0,790,0,0,0,793,0,0,0,0,794,0,0,804,819,821,0,827,0,0,0,834, 0,0,835,0,0,0,841,0,844,0,850,851,859,0,860,0,0,0,0,0,0,0,874,0,876,0, 877,890,0,0,0,0,0,0,0,0,893,894,898,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 899,0,0,0,900,904,906,0,0,0,907,0,908,909,0,910,0,0,0,0,911,0,0,0,0,0, 916,0,0,0,922,925,0,930,0,934,0,0,0,0,0,943,0,0,944,0,953,954,0,0,0,0, 0,0,955,0,962,963,0,0,976,0,0,977,978,979,980,0,981,0,0,0,0,984,0,0, 985,0,0,987,989,991,0,0,0,0,0,0,0,0,0,992,0,0,0,993,0,0,0,0,0,0,996, 0,0,0,1000,0,0,0,0,0,1002,0,0,0,0,1005,1007,0,0,0,1009,0,0,0,1010,0,0, 0,0,0,0,1011,0,1012,0,0,0,0,1014,1016,0,0,0,1020,0,1021,0,0,0,0,1022,0, 0,0,1024,0,0,0,0,0,0,1025,0,0,1026,1027,0,0,0,0,0,1031,0,1033,0,0,0,0, 1034,0,0,0,1037,1040,0,0,0,1042,1043,0,0,1053,0,1054,0,0,1057,0,0,0,1058, 0,0,1060,0,0,0,0,0,0,0,1061,0,0,1062,0,0,0,0,1063,0,0,0,0,1064,0,0,0, 0,0,1065,0,0,0,0,1066,1067,0,0,0,1069,1070,1072,0,0,0,0,0,0,1073,0,1075, 0,0,0,0,0,0,1080,1084,0,0,0,0,1088,0,0,0,0,0,0,1094,0,1095,0,1107,0,0, 0,1112,1114,0,1119,0,1122,0,0,1126,0,1129,0,1130,0,0,0,0,0,1132,0,0,0,0, 0,0,1144,0,0,1145,1146,0,1148,1149,0,0,1150,1151,0,0,0,0,1152,0,1153,0,0, 0,0,0,1154,0,1163,0,0,0,1164,0,0,0,0,0,1165,0,1167,0,1170,0,0,0,0,0, 1171,1172,0,0,0,0,0,0,0,0,1173,1175,1177,0,1186,0,0,0,0,0,0,0,0,0,0, 1195,0,0,1221,0,0,1224,0,0,1227,0,0,0,0,0,1228,1229,0,0,1230,0,0,0,0,0, 0,0,0,0,1231,0,0,0,1233,0,0,1243,1244,1246,1248,0,0,0,0,1254,1255,1258, 1259,0,0,0,1260,0,0,1261,0,0,0,1262,1264,0,0,1265,0,0,0,0,0,0,0,0,0,0, 0,0,1266,0,1267,0,0,0,0,1273,1274,1276,1289,0,0,1291,1292,1293,0,0,1294, 1295,1296,0,0,0,0,1302,0,1304,0,0,0,0,0,0,0,0,0,1311,1312,0,1314,0,1316, 1320,1321,0,0,0,0,0,0,0,1322,1323,1324,0,1335,0,1336,0,0,0,0,1341,1342,0, 1346,0,1357,0,0,0,1358,1360,0,0,0,0,0,0,1361,0,0,0,1362,1365,0,1366,0,0, 0,0,0,0,0,1379,0,0,0,0,0,0,0,0,0,0,0,0,1386,0,1388,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1395,0,0,0,0,1403,0,1405,0,0,1407,0,0,0,0,0,1408,1409,0, 1410,0,0,0,1412,1413,1416,0,0,1429,1451,0,0,1454,0,0,0,0,0,0,0,1455,0,0, 0,0,0,0,0,1456,0,0,0,0,1459,1460,1461,1475,0,0,0,0,0,0,1477,0,1480,0, 1481,0,0,1486,0,0,1495,0,0,0,1496,0,0,1498,1499,1501,1520,1521,0,0,0,1526, 0,0,0,0,1528,1529,0,1533,1536,0,0,0,1537,1538,1549,0,1550,1558,1559,1572,0, 1573,0,0,0,0,0,0,0,0,0,1575,0,0,0,0,0,1579,0,1599,0,1603,0,1604,0,1605, 0,0,0,0,0,1608,1610,0,0,0,0,1611,0,1615,0,1616,1618,0,1619,0,0,1622,0,0, 0,0,1634,0,0,0,1635,0,0,0,1641,0,0,0,0,0,0,0,0,0,1643,0,0,0,1650,0,0, 1652,0,0,0,0,0,1653,0,0,0,1654,0,0,0,0,1655,0,1662,0,0,1663,1664,0,0, 1668,0,0,1669,1670,0,1672,1673,0,0,0,0,0,1674,0,0,0,1675,1676,1680,0,1682, 0,0,1687,0,0,0,0,0,1704,0,0,1705,0,0,1721,0,0,0,0,1734,1735,0,0,0,0, 1737,0,0,0,0,1739,0,0,1740,0,0,0,0,0,0,0,0,0,0,1741,1743,0,0,0,0,1745, 0,0,0,1749,0,0,0,1751,0,0,0,0,0,0,1760,0,0,0,0,1765,0,0,0,0,0,1784,0, 1785,1787,0,0,0,0,1788,1789,0,0,0,0,1790,1791,1793,0,1798,1799,0,0,0,0, 1801,0,1803,1805,0,0,0,1806,1811,0,1812,1814,0,1821,0,0,0,0,0,1822,1833,0, 0,0,0,0,0,1848,0,0,0,0,0,0,1857,0,0,0,1859,0,0,0,0,1861,0,0,0,0,0,0, 0,1866,0,1921,1925,0,0,0,1929,1930,0,0,0,0,0,0,0,0,0,1931,0,0,0,0,1932, 0,0,0,1934,0,0,0,0,0,0,0,0,1946,0,0,1948,0,0,0,0,1950,0,1957,0,1958,0, 0,0,0,0,1965,1967,0,0,0,0,1968,0,1969,0,1971,1972,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1973,0,0,0,0,1975,0,0,0,0,1976,1979,0,1982,0,0,0,0,1984,1988, 0,0,0,0,1990,2004,2008,0,0,0,2012,2013,0,0,0,0,0,0,0,0,0,0,2015,0,2016, 2017,0,0,0,0,2021,0,0,2025,0,0,0,0,0,2029,2036,2040,0,2042,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,2043,0,0,0,0,0,2045,0,0,0,0,0,0,0,2046,2047,0,2048, 2049,0,2059,0,0,2063,0,2064,2065,0,0,2066,0,0,0,0,0,0,2069,0,0,0,0,2070, 0,2071,0,2072,0,0,0,0,2080,2082,2083,0,0,0,0,0,2085,0,2086,2088,2089,2105, 0,0,0,0,2107,0,0,2116,2117,0,2120,0,0,2122,0,0,0,0,0,2123,0,0,2125,2127, 2128,0,0,0,2130,0,0,0,2137,2139,2140,2141,0,0,0,0,0,0,0,0,0,2144,2145,0, 0,2146,2149,0,0,0,0,2150,0,0,2151,2158,0,2159,0,2160,0,0,0,0,0,0,2161, 2162,0,0,2194,2202,0,0,0,0,0,0,2205,2217,0,2220,0,2221,0,2222,2224,0,0,0, 0,2237,0,0,0,0,0,2238,0,2239,2241,0,0,2242,0,0,0,0,0,2243,0,0,0,0,0,0, 2252,0,0,2253,0,0,0,2257,2258,0,0,0,2260,0,0,0,0,0,0,0,2262,0,2264,0,0, 0,0,0,2269,2270,0,0,0,0,0,0,0,0,0,2271,0,2273,0,0,0,0,2277,0,0,0,0, 2278,0,0,0,0,2279,0,2280,0,2283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2287,0,0,0,0,0,0,0,2289,2290,0,0,0,0,2291,0,2292,0,0,0,2293,2295,2296,0, 0,0,0,0,0,0,2298,0,0,0,0,0,2303,0,2305,0,0,2306,0,2307,0,0,0,0,0,0,0, 0,0,0,0,0,2313,2314,2315,2316,0,0,2318,0,2319,0,2322,0,0,2323,0,2324,0, 2326,0,0,0,0,0,0,0,2335,0,2336,2338,2339,0,2340,0,0,0,2355,0,2375,0,2382, 2386,0,2387,0,0,2394,0,0,0,0,2395,0,2397,0,0,0,0,0,2398,0,0,0,0,0,0,0, 2399,2402,2404,2408,2411,0,0,0,2413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2415,0, 0,2416,2417,2419,0,2420,0,0,0,0,0,2425,0,0,0,2426,0,0,0,0,0,0,0,0,0,0, 0,0,2427,2428,0,2429,0,0,2430,2434,0,2436,0,0,0,0,0,0,2441,2442,0,2445,0, 0,2446,2457,0,2459,0,0,2462,0,2464,0,2477,0,2478,2486,0,0,0,2491,0,0,2493, 0,0,2494,0,2495,0,2513,2523,0,0,0,0,2524,0,0,0,0,0,0,2528,2529,2530,0,0, 2531,0,2533,0,0,2534,2535,0,2536,2537,0,2538,0,2539,2540,0,0,0,2545,2546,0, 0,0,0,0,0,0,2548,0,0,2549,0,2550,2555,0,0,0,0,0,2557,0,2560,0,0,0,0,0, 0,0,0,0,0,0,2561,0,2576,0,0,0,0,0,0,0,0,0,2577,2578,0,0,0,2579,0,0,0, 0,0,0,0,2580,0,0,0,0,2581,0,0,0,0,2583,0,2584,0,2588,2590,0,0,0,2591,0, 0,0,0,2593,2594,0,2595,0,2601,2602,0,0,2603,0,2605,0,0,0,2606,2607,2611,0, 2615,0,0,0,2617,0,0,0,0,0,0,0,0,0,0,0,0,0,2619,0,0,2620,0,0,0,2621,0, 2623,0,2625,0,0,2628,2629,0,0,2635,2636,2637,0,0,2639,0,0,0,2642,0,0,0,0, 2643,0,2644,0,2649,0,0,0,0,0,0,2655,2656,0,0,2657,0,0,0,0,0,2658,0,0,0, 0,0,2659,0,0,0,0,2664,2685,0,2687,0,2688,0,0,2689,0,0,2694,0,2695,0,0, 2698,0,2701,2706,0,0,0,2707,0,2709,2710,2711,0,0,0,2720,2730,2735,0,0,0,0, 2738,2740,0,0,0,0,2747,0,0,0,0,0,0,2748,0,0,2749,0,0,0,0,0,2750,0,0, 2752,2754,0,0,0,0,0,2758,0,0,0,0,2762,0,0,0,0,2763,0,0,0,0,0,0,0,2764, 2767,0,0,0,0,2768,0,0,2770,0,0,0,0,0,0,0,2771,0,0,0,0,0,0,0,0,0,2772, 0,0,0,0,0,2773,2776,0,0,2783,0,0,2784,0,2789,0,2790,0,0,0,2792,0,0,0,0, 0,0,0,0,0,0,2793,2795,0,0,0,0,0,0,2796,0,0,0,0,0,0,2797,2799,0,0,0,0, 2803,0,0,0,0,2806,0,2807,2808,2817,2819,0,0,0,0,0,2821,0,0,0,0,2822,2823, 0,0,0,0,0,0,0,2824,0,0,2828,0,2834,0,0,0,0,0,0,2836,0,2838,0,0,2839,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2841,0,0,0,2842,0,0,0,0,0,2843,2844, 0,0,0,0,2846,0,0,2847,0,2849,0,2853,0,0,0,0,0,2857,0,0,0,0,2858,0,2859, 0,0,2860,0,2862,2868,0,0,0,0,2875,0,2876,0,0,2877,2878,2884,2889,2890,0,0, 2891,0,0,2892,0,0,0,2906,2912,0,2913,0,0,0,0,0,0,0,0,2916,0,2934,0,0,0, 0,0,2935,0,0,0,0,2939,0,2940,0,0,0,0,0,0,0,2941,0,0,0,2946,0,2949,0,0, 2950,2954,2955,0,0,0,2959,2961,0,0,2962,0,2963,0,0,0,0,0,0,2964,2965,2966, 2967,0,0,0,0,0,0,0,2969,0,0,0,0,0,2970,2975,0,2982,2983,2984,0,0,0,0,0, 2989,0,0,2990,0,0,0,0,0,0,0,2991,0,0,0,0,0,0,0,0,2998,0,3000,3001,0,0, 3002,0,0,0,3003,0,0,3012,0,0,3022,0,0,3024,0,0,3025,3027,0,0,0,3030,0,0, 0,0,3034,3035,0,0,3036,0,3039,0,3049,0,0,3050,0,0,0,0,0,0,3051,0,3053,0, 0,0,0,3057,0,3058,0,0,0,0,0,0,0,0,3063,0,0,3073,3074,3078,3079,0,3080, 3086,0,0,0,0,0,0,0,0,3087,0,3092,0,3095,0,3099,0,0,0,3100,0,3101,3102,0, 3122,0,0,0,3124,0,3125,0,0,0,0,0,0,3132,3134,0,0,3136,0,0,0,0,0,0,0, 3147,0,0,3149,0,0,0,0,0,3150,3151,3152,0,0,0,0,3158,0,0,3160,0,0,3161,0, 0,3162,0,3163,3166,3168,0,0,3169,3170,0,0,3171,0,0,0,0,0,0,0,3182,0,3184, 0,0,3188,0,0,3194,0,0,0,0,0,0,3204,0,0,0,0,3209,0,0,0,0,0,0,0,0,0,0, 0,3216,3217,0,0,0,0,0,0,0,3219,0,0,3220,3222,0,3223,0,0,0,0,3224,0,3225, 3226,0,3228,3233,0,3239,3241,3242,0,0,3251,3252,3253,3255,0,0,0,0,0,0,0,0, 3260,0,0,3261,0,0,0,3267,0,0,0,0,0,0,0,0,3271,0,0,0,3278,0,3282,0,0,0, 3284,0,0,0,3285,3286,0,0,0,0,0,0,0,3287,3292,0,0,0,0,3294,3296,0,0,3299, 3300,3301,0,3302,0,0,0,0,0,3304,3306,0,0,0,0,0,0,3308,0,0,0,0,0,0,0,0, 0,3311,0,0,0,0,0,0,0,0,3312,3314,3315,0,3318,0,0,0,0,0,0,0,0,3319,0,0, 0,0,0,3321,0,0,0,0,0,0,0,0,0,3322,0,0,3324,3325,0,0,3326,0,0,3328,3329, 3331,0,0,3335,0,0,3337,0,3338,0,0,0,0,3343,3347,0,0,0,3348,0,0,3351,0,0, 0,0,0,0,3354,0,0,0,0,0,0,0,0,0,0,3355,0,0,3365,3366,3367,0,0,0,0,0,0, 3368,3369,0,3370,0,0,3373,0,0,3376,0,0,3377,0,3379,3387,0,0,0,0,0,3390,0, 0,0,0,0,0,0,3402,0,3403,3436,3437,3439,0,0,3441,0,0,0,3442,0,0,3449,0,0, 0,3450,0,0,0,0,0,0,0,3451,0,0,3452,0,3453,3456,0,3457,0,0,3458,0,3459,0, 0,0,0,0,0,0,0,0,3460,0,0,3469,3470,0,0,3475,0,0,0,3480,3487,3489,0,3490, 0,0,3491,3499,0,3500,0,0,3501,0,0,0,3502,0,3514,0,0,0,3516,3517,0,0,0, 3518,0,0,0,0,3520,3521,3522,0,0,3526,3530,0,0,0,0,3531,0,0,0,0,3536,0,0, 0,0,0,0,0,3539,3541,0,0,3542,3544,0,3547,3548,0,0,3550,0,3553,0,0,0,0,0, 0,0,3554,0,3555,0,3558,0,3559,0,0,0,0,0,0,0,0,3563,0,3581,0,0,0,3599,0, 0,0,3600,0,3601,0,3602,3603,0,0,3606,3608,0,3610,3611,0,0,0,0,0,0,0,0,0, 3612,3616,3619,0,0,0,0,0,0,0,0,0,0,0,0,0,3624,3628,0,3629,3634,3635,0,0, 0,0,0,0,3636,0,3637,0,0,3638,3651,0,0,0,0,0,0,3652,3653,0,0,0,0,3656, 3657,0,0,0,0,0,3658,0,0,0,0,3659,0,3661,3663,3664,0,3665,0,3692,0,0,0, 3694,3696,0,0,0,0,0,0,0,0,0,0,0,0,3698,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3700,0,0,3701,0,0,0,3708,3709,0,0,0,3711,3712,0,0,0,0,0,3723,0,3724, 3725,0,0,3726,0,0,0,0,0,0,3728,3729,0,3734,3735,3737,0,0,0,3743,0,3745,0, 0,3746,0,0,3747,3748,0,3757,0,3759,3766,3767,0,3768,0,0,0,0,3769,0,0,3771, 0,3774,0,0,0,0,0,0,3775,0,0,0,0,0,0,3776,0,3777,3786,0,3788,3789,0,0,0, 0,0,0,0,0,0,3791,0,3811,0,0,0,0,0,3814,3815,3816,3820,0,0,0,0,0,0,0, 3821,0,0,3825,0,0,0,0,3835,0,0,3848,3849,0,0,0,0,3850,3851,3853,0,0,0,0, 3859,0,3860,3862,0,0,0,0,0,3863,0,0,0,0,0,0,0,0,3873,0,3874,0,3875,3886, 0,3887,0,0,0,0,3892,3913,0,3914,0,0,0,3925,3931,0,0,0,0,3934,3941,3942,0, 0,0,0,3943,0,0,0,3944,0,0,0,0,0,3945,0,3947,0,0,0,3956,3957,0,0,0,0,0, 0,0,0,0,3958,0,3959,3965,0,0,0,0,3966,0,0,0,3967,0,0,0,3968,3974,0,0,0, 0,0,3975,3977,3978,0,0,0,0,3980,0,3985,0,0,0,0,0,0,0,0,3986,4011,0,0, 4017,0,0,0,0,0,0,0,0,0,0,0,4018,0,0,0,0,4019,0,4023,0,0,0,4027,4028,0, 0,0,0,0,0,0,0,4031,4034,0,0,4035,4037,4039,4040,0,0,0,0,0,4059,0,4060, 4061,0,4062,4063,4066,0,0,4072,0,0,0,0,0,0,0,0,0,0,0,0,0,4088,0,0,0,0, 0,4091,0,0,0,0,4094,4095,0,0,4096,0,0,0,0,0,4098,4099,0,0,0,4101,0,4104, 0,0,0,4105,4108,0,4113,0,0,4115,4116,0,4126,0,0,4127,0,0,0,0,0,0,0,4128, 4132,4133,0,4134,0,0,0,4137,0,0,4141,0,0,0,0,4144,4146,4147,0,0,0,0,4148, 0,0,4311,0,0,0,4314,4329,0,4331,4332,0,4333,0,4334,0,0,0,4335,0,4336,0,0, 0,4337,0,0,0,4342,4345,4346,4350,0,4351,4352,0,4354,4355,0,0,4364,0,0,0,0, 4369,0,0,0,4373,0,4374,0,0,0,0,4377,0,0,0,0,4378,0,0,0,4380,0,0,0,4381, 4382,0,0,0,0,0,0,0,4384,0,0,0,0,4385,0,0,0,4386,0,0,0,4391,4398,0,0,0, 0,4407,4409,0,0,0,0,4410,0,0,4411,0,4414,4415,4418,0,4427,4428,4430,0,4431, 0,4448,0,0,0,0,0,4449,0,0,0,4451,4452,0,4453,4454,0,4456,0,0,0,0,0,0,0, 4459,0,4463,0,0,0,0,0,4466,0,4467,0,4469,0,0,0,0,0,0,0,0,0,0,0,0,0, 4470,4471,0,4473,0,0,4475,0,0,0,0,4477,4478,0,0,0,4479,4481,0,4482,0,4484, 0,0,0,0,0,0,0,4486,0,0,4488,0,0,4497,0,4508,0,0,4510,4511,0,4520,4523,0, 4524,0,4525,0,4527,0,0,4528,0,0,0,0,4530,0,4531,0,0,4532,0,0,0,4533,0,0, 0,0,0,4535,0,0,0,4536,0,0,0,0,0,4541,4543,4544,4545,4547,0,4548,0,0,0,0, 4550,4551,0,4553,0,0,0,0,4562,0,0,4571,0,0,0,4574,0,0,0,4575,0,4576,0, 4577,0,0,0,4581,0,0,0,0,0,4582,0,0,4586,0,0,0,4588,0,0,4597,0,4598,0,0, 0,0,4616,4617,0,4618,0,0,0,0,4619,0,4620,0,0,4621,0,4624,0,0,0,0,0,4625, 0,0,0,0,4657,0,4659,0,4667,0,0,0,4668,4670,0,4672,0,0,0,0,0,4673,4676,0, 0,0,0,4687,0,0,0,0,4697,0,0,0,0,4699,0,4701,0,0,0,0,4702,0,0,4706,0,0, 4713,0,0,0,4714,4715,4716,0,0,0,0,0,0,0,0,0,0,0,0,4717,0,0,4720,0,4721, 4729,4735,0,0,0,4737,0,0,0,4739,0,0,0,4740,0,0,0,4741,0,0,0,0,0,4742,0, 4745,4746,4747,0,0,0,0,0,0,0,0,4748,0,0,0,4749,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,4751,4786,0,4787,0,4788,4796,0,0,4797,4798,0,4799, 4806,4807,0,0,0,0,4809,4810,0,0,0,0,0,0,4811,0,0,0,0,0,4812,0,4813,0,0, 4815,0,4821,4822,0,0,0,0,4823,0,0,0,0,0,0,0,0,0,0,4824,0,0,0,0,4826,0, 0,0,4828,0,4829,0,0,0,4843,0,0,4847,0,4853,4855,4858,0,0,0,0,0,4859,0, 4864,0,0,4879,0,0,0,0,4880,0,0,0,0,4881,0,4882,0,0,0,0,0,0,0,0,0,4883, 0,0,0,0,4884,0,0,0,0,0,4886,4887,4888,4894,4896,0,4902,0,0,4905,0,0,4915, 0,0,0,0,0,0,0,4916,4917,4919,4921,0,0,0,0,0,4926,0,0,0,0,4927,0,0,0,0, 0,0,0,0,4929,0,4930,4931,0,4938,0,4952,0,4953,4957,4960,4964,0,0,0,0,0,0, 0,5019,5020,5022,0,0,0,0,0,5023,0,0,0,5024,0,0,0,5025,0,0,0,0,5028,0,0, 0,0,5029,5030,5031,0,5033,0,0,0,0,0,0,0,0,0,5034,5035,0,5036,0,0,5037,0, 0,0,0,5038,0,0,5039,0,0,0,5041,5042,0,0,0,0,5044,5049,5054,0,5055,0,5057, 0,0,0,5060,0,0,0,0,0,5063,0,5064,5065,0,5067,0,0,0,5068,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,5076,0,0,0,0,0,0,0,5077,0,0,5078,5080,0,0, 5083,0,0,0,0,0,0,0,0,5085,0,0,0,0,0,0,5098,5099,5101,5105,5107,0,5108,0, 5109,0,0,0,0,0,0,0,5110,0,0,0,0,0,5117,5118,0,5121,0,5122,0,0,5130,0,0, 0,5137,0,0,0,5148,0,0,0,0,0,0,0,5151,5154,0,0,0,5155,0,0,5156,5159,5161, 0,0,0,0,5162,0,0,0,0,5163,5164,0,5166,0,0,0,0,0,0,0,0,0,0,5167,0,0,0, 5172,0,0,0,0,0,0,5178,5179,0,0,5190,0,0,5191,5192,5194,0,0,5198,5201,0,0, 0,0,0,5203,0,5206,5209,0,0,0,0,0,0,5213,0,5214,5216,0,0,0,0,0,5217,0,0, 0,0,0,0,0,0,5218,5219,0,5231,0,0,5244,5249,0,5254,0,5255,0,0,5257,0,0,0, 0,0,5258,0,5260,5270,0,5277,0,0,0,0,0,0,5280,5281,5282,5283,0,0,0,0,0, 5284,0,5285,0,0,0,0,0,5287,5288,0,0,0,0,0,0,0,0,0,0,5289,5291,0,0,5294, 0,0,5295,0,0,0,0,0,0,0,5304,0,0,5306,5307,5308,0,5309,0,0,5310,0,0,0,0, 5311,5312,0,5313,0,0,0,0,0,5316,0,0,0,5317,0,0,0,0,0,0,0,0,0,5325,0,0, 0,0,0,0,5326,0,5327,5329,0,5332,0,0,0,0,5338,0,0,0,0,0,0,0,0,5340,0,0, 5341,0,0,0,5342,0,5343,5344,0,0,5345,0,0,0,0,0,0,5347,5348,0,0,0,0,0,0, 0,0,0,5349,0,5350,0,5354,0,0,0,0,5358,0,0,5359,0,0,5361,0,0,5365,0,5367, 0,5373,0,0,0,5379,0,0,0,5380,0,0,0,5382,0,5384,0,0,0,0,0,0,5385,0,0,0, 0,5387,0,0,0,0,0,0,5388,5390,5393,0,0,0,0,0,0,0,0,0,0,0,5396,0,0,0,0, 5397,5402,0,0,0,0,0,5403,0,0,0,5404,5405,0,0,0,0,0,0,0,0,0,0,0,0,5406, 0,0,0,0,5410,0,0,5411,0,5415,0,0,0,0,5416,5434,0,0,0,0,0,0,0,0,0,0,0, 5438,0,5440,0,0,0,0,0,0,5441,5442,0,0,0,5443,5444,5447,0,0,5448,5449,5451, 0,0,0,5456,5457,0,0,0,5459,0,0,0,5461,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 5464,0,5466,0,0,5467,0,5470,0,0,5473,0,0,5474,0,0,5476,0,0,0,0,0,0,0,0, 0,0,0,5477,0,0,0,0,0,0,0,5484,0,0,5485,5486,0,0,0,0,0,5488,0,0,0,0,0, 0,0,5489,0,0,0,0,0,5507,0,0,0,5510,0,5511,0,0,5512,0,0,0,5513,0,5515,0, 0,5516,5517,0,5518,0,0,5522,0,0,0,0,0,5534,5535,0,0,5536,0,5538,0,0,5543, 0,5544,0,0,5545,0,5547,0,5557,0,0,5558,0,5560,5567,0,0,0,0,5568,0,0,0, 5571,5573,0,5574,0,5575,0,0,0,0,5577,0,0,5598,0,0,0,0,0,0,0,0,0,5600, 5609,0,0,0,0,5610,0,0,5612,0,5624,0,5625,0,0,0,5629,0,5641,0,5642,5643,0, 0,0,0,0,0,5651,0,0,0,5652,5653,0,5661,5662,5678,0,5679,0,0,0,0,5685,5686, 0,0,0,0,0,5690,5692,0,5703,0,0,0,0,0,5706,0,0,0,0,5707,0,0,0,0,0,0, 5708,0,0,5709,0,5710,0,0,0,5712,0,5733,0,5734,5735,0,0,5744,5751,0,0,0,0, 0,0,0,0,0,0,0,0,5752,0,5754,0,0,0,0,0,0,5757,5758,0,5760,5761,0,0,0,0, 5763,5764,5765,0,5766,0,5767,5768,0,5770,0,0,0,0,5776,5780,0,0,0,0,5782,0, 0,0,0,5784,0,0,5788,0,0,0,0,0,0,0,0,0,0,0,5797,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,5799,0,0,5801,0,0,0,5811,0,0,0,0,0,0,5816,0,0,5827,0,0,0,0, 0,0,0,0,5830,5831,0,0,5832,0,0,5833,0,5835,5844,5845,0,5846,0,0,0,0,0, 5850,0,0,0,0,0,5852,0,5855,5857,0,0,5859,0,5861,0,0,5863,0,5865,0,0,0, 5873,5875,0,0,0,5877,0,5879,0,0,0,5888,0,0,5889,5891,0,5894,0,0,0,0,0,0, 5895,0,5897,0,0,0,0,0,0,5907,0,5911,0,0,5912,0,5913,5922,5924,0,5927,5928, 0,0,0,0,5929,5930,0,5933,0,0,0,0,5949,0,0,5951,0,0,0,0,0,0,0,0,5953,0, 0,5954,0,5959,5960,5961,0,5964,0,0,0,5976,5978,5987,5990,0,0,0,0,0,5991,0, 5992,0,0,0,5994,5995,0,0,5996,0,0,6001,6003,0,0,0,0,6007,0,0,0,0,0,6008, 0,0,6009,0,6010,0,0,0,6011,6015,0,6017,0,6019,0,6023,0,0,0,0,0,0,0,6025, 0,0,0,0,0,0,0,0,0,0,6026,0,6030,0,0,6032,0,0,0,6033,6038,6040,0,0,0, 6041,6045,0,0,6046,0,0,6053,0,0,6054,0,6055,0,0,0,0,0,0,6057,0,6063,0,0, 0,6064,0,6066,6071,6072,0,0,0,0,0,0,6075,6076,0,0,6077,0,0,0,0,0,0,0,0, 0,6078,6079,0,0,0,0,0,0,0,0,6080,0,6083,0,0,0,0,0,6084,0,0,6088,0,6089, 0,0,6093,6105,0,0,6107,0,6110,0,0,0,6111,6125,6126,0,0,0,6129,0,0,0,0, 6130,0,0,0,6131,6134,0,0,0,0,0,0,6142,0,0,0,0,0,6144,0,0,6146,6151,6153, 0,6156,0,6163,0,6180,6181,0,0,0,0,0,6182,0,0,0,0,6184,6195,0,0,6206,0, 6208,0,0,6212,6213,6214,0,6215,0,0,0,6228,0,0,0,6234,0,0,0,0,0,0,6235, 6240,0,6242,6243,6244,0,6250,6255,0,0,0,0,0,6257,0,0,0,6258,6278,0,6284,0, 0,0,6285,0,0,0,0,0,0,0,0,6286,0,0,0,6320,0,0,6322,6332,0,0,0,0,0,0,0, 0,6334,0,0,0,0,0,0,0,6335,0,0,6337,0,6338,0,6339,6340,0,0,6356,6357,6369, 0,0,0,6370,6371,6372,0,6373,0,0,0,0,0,6376,0,0,0,0,0,6382,6383,6384,0,0, 0,0,6386,0,6389,6397,6400,6411,0,6414,0,0,0,0,0,0,0,6415,6416,0,0,0,0,0, 0,6417,0,0,0,0,6418,0,0,0,0,0,0,0,6420,0,6421,6423,6425,0,6429,6430,0, 6433,6438,0,0,0,0,0,0,0,0,0,0,6439,6440,0,0,6441,0,0,6444,0,0,0,0,6446, 0,0,0,0,6447,6448,0,0,6450,0,0,0,6454,0,0,6455,0,6461,0,0,0,0,0,0,6462, 0,0,6463,0,6464,0,6465,6467,0,0,0,6468,0,6479,6480,0,0,0,0,0,0,0,6481,0, 0,6485,6487,0,0,0,0,0,0,6493,0,0,0,0,0,0,0,0,6494,6495,6496,0,0,0,0,0, 6498,0,0,0,6507,6508,0,0,0,0,0,0,0,0,0,0,6511,6512,0,0,0,0,6513,0,0,0, 6514,0,0,0,0,0,6516,0,0,6517,6518,0,0,0,6519,6520,6521,0,6523,0,0,0,0, 6524,6528,0,6530,0,0,6532,0,6578,0,0,0,6583,0,6584,0,0,0,6587,0,0,0,6590, 0,6591,0,0,0,0,0,6592,0,0,0,0,6593,6594,0,0,0,0,0,6599,6600,0,0,6601, 6602,6604,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6608,0,0,0,0,0,0,0,0,6610,6611, 0,6615,0,6616,6618,6620,0,6637,0,0,0,0,6639,0,0,0,0,6641,0,6642,0,0,0, 6647,0,6660,6663,0,6664,0,6666,6669,0,6675,6676,6677,0,0,0,0,0,0,0,0,0, 6678,0,0,0,6679,0,6680,0,0,0,0,0,0,0,6693,0,0,0,0,0,0,0,0,0,6704,6705, 6706,0,0,6711,6713,0,0,0,0,0,6716,0,0,0,6717,0,6719,6724,0,0,0,0,0,0,0, 0,6725,6726,0,0,0,0,0,6728,6729,6735,0,6737,6742,0,0,6743,6750,0,6751,0,0, 6752,6753,0,0,0,0,0,0,6754,0,0,0,0,0,6756,0,0,0,0,0,0,6763,0,0,6764, 6765,0,0,0,6770,0,0,0,6776,6780,0,6781,0,0,0,6783,0,6784,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,6785,0,0,0,6792,0,0,0,6793,0,0,6802,0,0,0,0, 0,6803,0,0,0,6804,0,0,0,6812,0,0,6823,0,6824,6839,0,0,0,0,6852,0,0,6854, 0,6856,6857,0,0,0,0,0,0,0,0,0,6867,0,6868,6870,6872,0,0,0,6873,6874,0,0, 0,0,0,6875,0,0,6877,0,0,0,0,0,0,0,6878,0,0,0,6879,0,6880,0,0,0,0,0,0, 0,0,0,0,6887,0,6888,6891,6893,0,6895,0,0,0,0,0,0,0,0,6899,0,0,0,0,6901, 0,0,0,0,6910,0,6911,0,0,6912,0,0,6913,6914,0,0,0,6915,0,0,0,6916,6919,0, 0,0,0,0,0,6924,0,6925,0,0,0,6926,6927,6928,0,6929,0,6930,0,0,6931,6935,0, 6936,0,0,0,0,6939,6940,6941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6942,6948, 6949,0,0,0,0,0,0,0,6952,6954,6963,6965,6966,0,0,6967,6968,0,0,0,0,0,0,0, 0,0,6969,0,0,6970,6979,0,0,6980,0,0,6983,0,0,0,0,0,6984,0,0,0,0,0,0,0, 6988,6990,6992,0,0,0,0,0,0,0,6995,0,0,0,7012,0,0,0,0,0,0,0,0,0,7019,0, 0,0,0,0,0,0,0,7021,0,0,7022,7023,7028,0,7030,7033,0,0,0,0,0,0,7038,0,0, 0,0,0,0,0,0,0,0,7039,0,0,0,0,0,7046,0,7047,0,0,0,0,0,0,0,0,0,0,0, 7048,7052,0,0,0,0,0,7054,0,7060,0,0,0,0,7061,0,7065,0,0,0,0,7067,7069,0, 7070,7071,7072,0,0,7078,0,7080,7081,0,7083,0,0,0,7084,7087,7088,0,0,7090,0, 7093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7107,0,0,7108,0,0,0,0,0,0,0,0, 7110,0,7114,0,0,0,0,0,0,0,7115,0,7116,0,0,0,0,0,7117,0,0,7118,0,0,7124, 0,7125,0,0,7126,0,0,0,0,7128,0,0,0,0,0,7129,0,7130,0,7132,7133,0,0,7134, 0,0,7139,0,7148,7150,0,0,0,0,7152,0,0,0,7153,7156,7157,0,0,0,0,0,7158,0, 0,0,0,0,0,0,0,0,0,7163,7165,7169,0,7171,0,0,0,0,0,0,0,0,0,7172,0,7173, 7181,0,0,0,0,0,7182,7185,0,0,0,0,7187,0,7201,7204,0,0,0,0,0,7206,7207,0, 0,0,0,7211,7216,0,7218,0,0,0,0,7226,7228,7230,7232,7233,7235,7237,0,0,0,0, 7238,7241,0,7242,0,0,7247,0,0,0,7266,0,0,0,0,0,0,0,7289,0,0,7290,7291,0, 0,7292,0,7297,0,0,0,0,0,0,0,0,0,0,7300,0,7301,0,0,0,0,0,0,0,0,0,0,0, 0,7302,0,0,0,0,7305,0,0,0,0,7307,0,7308,0,7310,0,7335,0,0,0,0,0,0,0, 7337,0,7343,7347,0,0,0,0,0,7348,0,7349,7350,7352,7354,0,0,0,0,7357,0,7358, 7366,0,7367,7368,0,0,7373,0,0,0,7374,0,0,0,0,0,0,0,7376,0,0,0,7377,0,0, 0,0,0,7378,0,7379,7380,0,0,0,0,0,7383,0,0,7386,0,0,0,0,7398,0,0,0,7399, 7400,0,7401,0,0,0,0,0,0,0,7402,0,0,0,0,0,7405,0,0,0,0,0,7406,0,0,0,0, 0,0,0,0,7421,7427,7429,0,0,0,7435,0,0,7436,0,0,0,7437,0,0,0,0,0,0,7438, 7443,0,7446,0,7448,0,0,0,0,0,0,0,0,0,0,7456,0,0,0,0,0,7457,0,0,7461,0, 0,0,0,0,7462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7463,7466,7472,0,7476,0,0, 7490,0,7491,0,0,7493,0,0,0,7498,7499,0,0,7508,0,0,0,0,0,7512,0,0,0,7513, 7514,7516,0,0,0,0,7518,0,0,7519,7521,7522,0,0,0,7526,0,0,7529,0,0,7531,0, 7536,0,7538,0,7539,0,0,7541,7542,7546,0,0,0,0,0,7547,0,7548,0,0,0,0,0, 7550,0,0,7552,7553,0,0,0,0,0,0,0,0,0,0,7554,7563,0,7573,0,0,0,0,0,0, 7574,7576,0,7578,7581,7583,0,0,0,7584,0,7587,0,0,0,0,0,7589,0,0,0,7594,0, 0,7595,0,0,7600,7602,7610,0,0,0,0,0,7612,0,7613,7614,0,0,7615,0,0,7616,0, 7620,0,7621,7622,0,7623,0,0,0,0,7626,0,0,0,0,7627,7629,7631,0,0,7633,0,0, 0,0,0,7639,0,7640,7642,0,0,7643,0,0,0,0,7644,0,0,0,0,0,0,0,7645,0,0,0, 0,0,7661,7662,7663,7665,0,7666,0,7667,0,7684,7688,7690,0,7691,0,0,0,0,0,0, 7692,0,0,7700,0,7707,0,7708,0,7709,0,7721,0,0,0,7722,0,7724,0,0,0,0,0,0, 7729,7731,0,7732,0,7733,7735,0,0,0,0,0,0,0,7739,0,0,7741,7745,0,7748,0,0, 0,7751,0,0,0,7752,0,0,0,0,0,0,0,7753,0,0,7756,0,7757,0,7759,0,7760,0,0, 0,0,7761,7768,0,0,7769,0,0,7770,0,0,7771,0,0,7772,0,0,7773,0,0,0,0,0, 7778,7783,0,0,0,0,0,7784,7785,0,7790,0,0,0,0,7792,0,7798,0,0,0,0,0,7799, 0,7810,0,0,7813,0,7814,0,7816,0,7818,7824,7825,7826,0,7828,7830,0,0,0,7840, 0,7842,0,7843,0,0,0,0,7844,0,0,0,0,0,0,0,7846,0,0,0,0,0,7856,7857,7858, 7862,0,7865,0,0,7866,0,0,7913,0,0,0,0,7914,0,0,7915,7917,7918,7919,0,7920, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7921,7922,0,7924,0,0,7925,0,0,7927,0, 7930,7935,0,0,7937,0,0,0,0,0,0,7939,0,7940,0,0,0,0,0,7941,0,0,0,0,7945, 0,0,0,0,7949,0,0,0,0,0,0,0,0,7950,0,7953,0,0,0,0,0,0,0,7968,0,0,0,0, 7969,7972,7992,0,7993,0,0,0,0,0,0,0,0,0,0,0,7994,0,0,0,0,8007,8008,0,0, 0,0,0,0,0,0,0,0,0,0,8010,0,0,0,8012,0,0,0,0,0,0,0,0,8018,0,8028,8029, 0,0,8030,0,0,8032,8033,0,0,8034,8036,0,0,0,0,0,0,0,0,0,0,8037,0,0,0, 8043,8052,8059,8060,0,0,8061,0,0,0,8062,0,8063,0,8064,0,8066,8068,0,0,0, 8080,8081,0,8089,0,0,0,0,0,8092,0,0,0,0,0,0,8093,8110,0,0,0,0,0,0,0, 8111,0,0,0,0,0,8112,8115,0,8117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8120, 8121,8122,8128,8129,8130,8131,0,0,8139,0,0,8144,0,0,0,0,8145,8146,8153,0,0, 0,0,0,0,0,0,8154,0,8157,8160,8162,0,8164,8165,0,0,0,0,8166,8167,0,0,8179, 0,0,0,8185,0,0,0,8186,0,0,8187,0,0,0,8188,0,0,0,0,0,8204,0,0,0,0,8210, 0,0,0,0,0,8213,0,8214,0,0,8215,0,0,0,0,0,0,8218,0,0,0,0,0,0,0,0,0, 8219,0,8221,0,0,8222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8225,0,0,0,8233, 0,0,8242,0,0,0,0,0,0,0,0,0,0,0,8247,0,8248,8252,0,8256,8257,0,0,8261,0, 8264,8265,0,0,0,0,8267,0,0,0,8269,0,0,0,0,0,0,0,0,0,8270,0,0,0,8278,0, 8279,8283,0,0,8285,8286,8289,8292,0,0,0,0,8293,8295,8299,8300,8301,0,0,0,0, 0,0,8304,8307,0,0,0,0,0,0,0,8321,0,0,0,8322,8323,8325,8326,8327,0,0,8332, 8338,0,0,8340,0,0,0,0,0,8350,0,0,8351,0,8354,8355,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,8360,8372,0,0,0,0,0,0,0,0,8377,0,0,0,0,8380,0,0,0,8383,0,8384, 0,0,0,0,8386,8392,0,0,8394,0,0,0,0,0,0,0,8396,8397,0,8398,0,8399,0,0,0, 0,0,8400,0,8401,8410,8411,0,8412,8413,8422,0,0,0,0,8423,0,0,0,0,8424,0,0, 8425,0,0,0,0,0,0,0,8441,8442,0,0,0,0,0,0,8443,0,0,8444,0,8447,0,0,0,0, 8451,0,8458,0,8462,0,0,8468,0,8469,0,0,0,8470,0,8473,8479,8480,0,0,0,0, 8481,8483,0,0,0,0,0,0,0,0,0,8484,0,0,8490,0,0,0,0,0,0,8491,8493,8494,0, 8528,0,0,0,0,0,0,0,8530,0,0,0,0,0,0,0,0,8534,8538,8540,0,0,8541,0,0, 8545,0,8557,0,0,8569,8570,0,0,8571,8574,8575,8579,0,8583,0,0,0,0,8591,0,0, 0,0,0,0,0,0,8606,0,8607,0,0,0,0,0,0,0,0,0,8608,0,0,8609,0,0,0,8610,0, 0,0,8611,0,0,8613,8617,8621,0,0,8622,0,8623,0,8624,8625,0,0,0,0,0,0,0,0, 0,8637,8638,8639,8650,0,0,0,0,8652,8654,8655,0,0,0,0,0,0,0,0,0,0,8656,0, 0,0,0,0,8657,0,0,0,0,0,0,0,0,0,8658,0,0,8659,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,8660,0,0,0,0,0,0,8661,8663,8664,0,0,0,0,8665,0,8669, 0,0,0,0,0,0,0,8671,8674,0,8684,0,8686,0,0,0,8689,0,0,0,8690,0,8706,0,0, 0,0,0,0,0,0,0,0,0,8710,0,8711,8713,8714,8724,8727,8728,8733,8736,0,8737, 8739,0,0,0,0,8742,8743,8745,8754,0,0,0,0,8756,0,0,0,0,0,0,8757,8760,0,0, 0,0,0,8762,8763,8764,0,8766,8769,8770,8773,0,8774,0,8779,0,0,0,0,8780,0,0, 8781,0,0,8783,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8784,0,0, 0,0,0,0,0,0,8785,0,0,0,0,8786,0,0,0,0,8788,8790,0,0,0,8803,0,8813,8814, 0,0,0,0,0,8815,8816,0,0,0,0,8818,0,0,0,0,8822,8828,8829,0,8831,0,0,0,0, 8833,0,0,0,8834,0,0,0,8835,0,8836,0,0,0,8837,0,0,0,0,0,0,8838,8839,0,0, 0,0,0,0,0,0,0,0,0,8840,0,0,0,8841,0,8842,0,0,0,8846,0,0,0,0,0,0,0, 8847,0,8848,0,0,8864,0,0,8866,0,0,8870,8872,0,0,8873,8874,0,0,0,0,0,0, 8875,0,8876,0,0,0,0,8896,8900,0,0,0,0,8901,0,0,0,0,0,8904,0,8907,0,0,0, 0,8911,8912,8913,0,0,0,8914,0,8915,0,0,0,0,0,0,0,0,0,0,0,0,8916,0,0,0, 8929,0,0,0,0,0,0,0,0,0,0,8930,0,8932,0,8943,0,0,0,8945,8947,0,0,0,0, 8949,0,8950,0,8954,8957,0,0,8970,0,0,0,0,8971,0,8996,0,0,0,0,8997,9000,0, 0,0,0,9001,9002,0,9004,9009,9024,0,0,0,0,0,0,0,0,0,0,0,0,9027,9082,0,0, 9083,9089,0,0,0,0,0,0,9090,0,0,0,9092,0,0,9093,0,9095,0,0,9096,9097,9101, 9102,0,0,0,0,0,0,0,0,9112,0,0,0,0,0,0,9114,0,0,9120,0,9121,9122,0,0,0, 9123,9124,0,0,9125,0,0,9126,0,9127,0,0,9129,9131,0,0,0,9132,0,0,9136,0, 9144,0,0,9148,0,0,0,0,0,0,9149,0,9152,9163,0,0,9165,0,0,0,0,0,0,0,0,0, 0,0,0,0,9166,0,9169,0,0,0,0,0,0,0,9170,0,0,0,0,9172,0,9174,9175,9176,0, 9177,0,0,0,0,0,0,0,0,9186,0,9187,0,0,0,9188,9189,0,0,9190,0,0,0,0,9191, 0,0,0,9193,0,0,0,0,9197,9198,0,0,0,9208,9211,0,0,0,0,9216,9217,0,9220,0, 0,0,0,9221,9222,9223,0,9224,9225,0,0,9227,0,9228,9229,0,0,9230,0,9232,0, 9233,0,0,0,0,0,9234,9235,0,0,9237,0,0,0,0,0,0,0,0,9238,9240,0,0,9241,0, 0,0,0,9244,0,0,0,0,9247,0,0,0,0,0,0,0,0,0,0,9248,0,0,0,9249,0,0,0,0, 0,9250,0,0,0,0,9251,0,0,9252,9255,0,0,0,9256,0,0,0,0,0,0,0,9257,0,0, 9258,0,0,0,0,0,0,9259,0,0,0,0,0,9262,9263,0,0,9265,9266,0,0,0,0,0,0,0, 0,9268,9271,0,0,0,0,0,0,0,0,0,9273,0,0,0,9276,9277,9279,0,0,0,0,0,0,0, 9280,0,0,9293,0,0,0,0,0,9297,9301,0,0,0,0,0,0,0,0,0,0,0,9308,9309,9313, 9321,9322,0,9326,9327,0,0,9477,0,9479,0,0,0,0,9482,0,0,0,9483,0,9484,0,0, 0,0,0,0,0,0,0,9485,0,0,9486,0,0,0,9489,0,0,0,0,9490,9491,0,0,0,0,9493, 0,9495,9496,0,0,0,0,0,0,0,0,9500,0,9502,0,0,0,0,0,9504,9507,0,9509,0, 9511,0,0,9513,0,0,0,0,0,0,0,0,9515,0,0,0,0,0,0,9516,9517,0,0,0,0,9532, 0,0,9533,0,0,9538,0,9539,9540,0,0,0,0,9541,0,0,0,9542,0,0,0,0,0,0,0,0, 9544,9545,0,9546,0,0,0,0,0,0,9547,9548,0,0,0,9550,0,9557,0,9558,0,9561,0, 9563,9570,0,9572,9574,9575,0,0,0,9577,9592,0,0,9596,0,0,0,9598,0,9600,0, 9601,0,0,0,0,0,0,9608,0,9638,9639,0,0,0,0,0,0,0,9641,0,0,9643,9644,9645, 9646,0,0,0,9648,0,0,0,0,0,0,0,9650,9654,0,0,0,0,0,0,0,0,9655,0,0,0,0, 0,9656,0,9657,0,0,0,0,9658,0,0,9659,0,0,9664,0,0,9665,0,9667,9669,0,0,0, 0,0,0,0,0,0,0,0,0,9671,0,9673,9681,0,0,0,0,9682,9683,9684,0,0,0,0,9686, 9698,0,0,9700,9701,9702,0,9703,9717,0,0,0,0,9718,0,9726,0,0,0,0,9727,0,0, 0,9728,0,9742,0,9744,0,0,0,9750,0,9754,9755,0,0,0,0,0,9756,0,9757,9768,0, 9769,0,0,0,9770,9771,0,9773,0,9774,0,9775,0,0,0,9776,9777,9784,0,0,0,9786, 0,9789,0,0,0,0,9793,9794,0,0,0,9808,0,0,0,0,0,9811,0,0,0,0,0,0,0,0,0, 0,0,0,9812,0,9820,0,9823,0,9828,0,0,0,0,9830,0,0,9833,9836,0,0,0,9840,0, 0,0,9841,0,0,9842,0,9845,0,0,0,9847,9848,0,0,9855,0,0,0,0,0,0,9856,9863, 9865,0,0,0,0,0,0,0,0,9866,9867,9868,9873,9875,0,0,0,0,0,0,9880,0,9886,0, 0,0,9887,0,0,9891,0,0,0,0,0,0,0,9906,9907,9908,0,0,0,9909,0,0,0,0,0,0, 9910,0,0,0,0,9913,0,0,0,0,9914,0,0,0,0,0,9922,0,0,0,0,9923,9925,0,0,0, 0,0,0,9930,0,0,0,9931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9932,0,9939,0,0, 9940,9962,9966,0,9969,9970,0,0,9974,0,9979,9981,9982,0,0,0,9985,0,0,0,0,0, 0,9987,0,0,0,0,0,0,0,9988,9993,0,0,9994,0,0,0,9997,0,10004,0,0,0,0,0, 10007,10019,10020,10022,0,0,0,10031,0,0,0,0,0,10032,0,0,10034,0,10036,0,0, 0,0,10038,0,10039,10040,10041,10042,0,0,0,0,0,10043,0,0,0,0,0,10045,10054, 0,0,0,0,10055,0,0,10057,10058,0,0,0,0,0,0,10059,0,0,0,0,0,0,0,10060,0, 0,0,0,0,0,0,10063,0,10066,0,0,0,10070,0,10072,0,0,10076,10077,0,0,10084, 0,10087,10090,10091,0,0,0,10094,10097,0,0,0,0,0,0,10098,0,0,0,0,0,0, 10103,0,10104,0,10108,0,0,0,0,0,0,0,0,10120,0,0,0,10122,0,0,10125,0,0,0, 0,10127,10128,0,0,10134,0,10135,10136,0,10137,0,0,10147,0,10149,10150,0,0, 10156,0,10158,10159,10160,10168,0,0,10171,0,10173,0,0,0,10176,0,0,0,0,10177, 0,0,0,0,10178,0,0,0,0,10194,0,10202,0,0,10203,10204,0,10205,10206,0,10207, 0,0,0,0,10209,0,0,0,0,0,0,0,10213,0,0,0,0,0,0,10217,0,10229,0,10230, 10231,0,0,10232,0,0,10237,10238,10244,0,0,0,0,0,10250,0,10252,0,0,0,0,0, 0,10255,0,0,10257,0,0,0,0,0,0,10258,0,10259,0,0,0,0,0,0,0,0,10260,0,0, 0,0,0,0,0,10284,10288,10289,0,0,0,10290,0,10296,0,0,0,0,0,10297,0,0,0,0, 0,0,10298,0,0,0,0,10299,10303,0,0,0,0,0,10306,0,0,0,10307,0,10308,0,0,0, 0,10311,0,0,0,0,0,0,0,10315,10317,0,0,0,10318,10319,0,10321,0,10326,0, 10328,0,0,0,0,10329,0,0,10331,0,10332,0,0,0,0,0,0,10334,0,0,10335,10338, 0,0,0,0,0,10339,10349,0,0,0,0,0,0,10351,0,10353,0,0,0,0,0,0,10362,0, 10368,0,10369,0,0,0,10372,10373,0,0,0,0,0,10374,0,0,0,10375,0,10376,0,0, 10386,10388,10390,0,0,0,0,0,0,0,10391,0,0,10392,10394,0,0,10396,0,10397,0, 10403,0,0,0,0,0,0,0,0,10404,0,10405,10410,0,0,10411,0,10412,0,0,0,0,0,0, 0,10421,10422,10423,0,0,0,0,0,0,0,0,0,10425,0,0,10427,0,0,10430,0,0,0,0, 0,10432,0,10433,10434,0,0,0,0,10436,10437,0,10438,0,10439,0,10444,10446,0,0, 0,0,0,10448,0,0,0,0,0,10449,0,0,0,0,0,0,0,10451,0,10453,0,0,0,10454, 10457,0,0,10459,0,10469,0,0,0,0,0,10472,10481,0,0,0,0,0,10482,10483,0, 10492,0,0,0,0,0,0,0,0,0,0,10499,0,0,0,10502,0,0,10510,0,10521,10524,0,0, 10525,10526,10528,0,0,0,0,0,0,0,0,10530,0,0,0,0,10533,0,10534,0,0,0,0,0, 0,0,0,0,0,10535,10536,0,0,10544,0,10553,10556,0,10557,10559,0,0,0,0,0, 10562,10563,10564,0,10565,0,0,0,10566,0,10567,0,0,0,0,10575,0,0,10576,0, 10578,0,0,0,0,0,0,0,0,0,0,10585,10586,10587,10589,0,10590,0,0,10594,0,0, 0,0,0,10598,0,0,10601,0,0,0,10602,0,10603,0,10604,0,10605,0,0,10607,0, 10626,0,10627,0,0,0,0,0,10629,10630,10631,0,0,0,10646,0,0,0,10647,0,10650, 0,10651,0,0,0,10652,10653,10655,0,10658,0,0,10659,0,10667,0,0,0,0,10669,0, 0,0,0,0,0,0,0,0,10670,0,0,0,10671,0,0,0,0,10672,10673,0,10674,0,0,0, 10676,0,0,0,0,0,0,10678,0,10682,0,0,10692,0,10697,0,0,0,0,10698,0,0,0, 10700,0,0,0,0,0,10703,0,10704,0,0,0,0,0,0,0,10705,0,10715,10718,10720,0, 0,10722,0,0,0,0,0,0,0,0,10723,0,0,0,0,10726,0,0,0,0,0,10727,10730,10743, 0,0,0,0,0,0,10744,0,0,10745,0,0,0,0,0,0,10748,0,0,0,0,10750,0,0,10752, 10753,0,0,0,10756,0,0,0,0,0,0,10758,0,0,0,10759,0,10769,0,0,10772,0,0,0, 0,0,0,10773,0,0,0,10777,0,0,10779,0,0,0,0,0,0,0,0,10780,10784,0,0,0, 10789,0,0,0,10791,0,0,0,0,0,0,0,0,0,10795,0,0,10796,0,10808,0,10809,0,0, 0,10810,0,0,0,10812,0,0,10814,0,0,0,0,0,0,0,0,0,10815,0,0,0,0,10816, 10817,0,0,0,0,10819,0,10820,0,0,0,0,10821,10822,10823,0,10826,10849,0,0,0, 0,10850,0,0,10852,0,10853,0,0,10856,0,0,10857,10858,10859,10860,0,0,0,0,0, 0,10863,0,10866,10867,10872,10890,0,0,10891,10892,0,0,0,0,0,10893,0,0,0, 10896,10899,0,0,10900,10902,0,0,0,0,0,10903,0,0,0,0,0,0,0,0,0,0,0,0, 10905,0,10906,0,0,0,0,10908,10911,0,10912,0,0,10916,0,0,0,0,0,10917,0, 10918,0,0,0,10923,0,0,0,0,0,10924,0,0,10928,10929,0,0,10930,0,0,0,10932, 0,0,0,0,10939,0,0,10945,0,0,0,10947,0,0,10948,0,0,0,0,0,0,0,0,0,0,0, 0,10958,0,10960,10962,0,0,10964,0,0,0,10966,0,0,0,0,0,0,0,0,0,0,10967,0, 0,0,10968,0,0,0,10973,0,0,0,0,0,10975,0,0,0,10976,10978,0,0,10982,10984, 10987,0,0,10988,0,10989,0,0,10991,0,0,0,0,10992,0,0,0,10993,0,10995,0,0, 0,10996,10997,0,0,0,10998,0,10999,0,11001,0,0,0,0,0,0,11010,11012,0,11013, 11016,11017,0,0,11019,11020,11021,0,0,0,0,0,0,0,0,0,0,0,0,11022,0,0, 11023,11029,0,0,0,0,11031,0,0,0,11034,0,0,0,0,11055,0,0,0,0,0,11056, 11060,0,0,0,0,0,0,11061,0,0,11064,11065,0,11066,0,11069,0,11085,0,0,0,0, 0,11086,0,0,0,11088,0,0,0,11094,0,0,0,11095,11096,0,0,0,0,0,0,11097, 11098,0,0,0,0,0,0,11099,0,0,11102,11108,0,0,0,11109,0,11114,11119,0,11131, 0,0,0,11142,0,0,11143,0,11146,0,11147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 11148,0,11149,11152,11153,11154,0,11156,0,11157,0,0,0,11158,0,0,11159,11160, 0,0,0,0,0,0,0,0,0,0,0,0,11163,0,0,11164,11166,0,0,0,11172,11174,0,0,0, 11176,0,0,0,0,0,11182,11183,0,0,0,11184,11187,0,0,11188,11189,0,0,0,0,0, 0,11194,0,0,0,0,0,0,0,11200,11202,0,0,0,0,0,0,11203,0,11204,0,0,0,0,0, 11205,0,0,0,11206,0,11207,0,0,11209,0,11211,0,11214,0,0,11231,0,0,0,11293, 11295,0,0,11296,11297,11302,0,0,0,11307,0,0,0,0,11309,11310,0,11311,0,0,0, 11313,0,11314,0,0,0,0,11334,0,11338,0,0,0,11339,0,0,0,0,0,11340,0,11341, 11342,0,11344,0,11345,0,0,0,11348,11349,0,0,11350,0,0,0,11355,0,0,0,0,0, 0,11356,0,11357,11370,0,0,11371,0,11374,11376,0,0,0,11377,0,0,11378,11383,0, 11386,11399,0,11400,11406,0,0,0,11408,0,0,11409,11412,0,0,0,0,11417,0,0,0, 11418,0,11421,0,11426,11429,0,0,0,0,0,11430,0,11437,0,11438,0,0,0,0,0, 11440,11453,0,0,0,0,0,0,11454,0,0,0,0,11455,0,0,11456,11460,11461,11463,0, 11469,0,11473,0,0,0,0,11474,0,0,0,11475,0,11476,11477,11480,0,0,0,0,11481, 0,0,11484,0,0,11487,0,0,0,0,0,0,0,0,0,0,11497,0,0,11502,0,11509,0,0, 11510,11511,11513,0,0,0,0,0,0,0,0,0,0,11515,0,0,0,0,11516,0,11520,11521, 0,0,0,0,0,0,0,0,0,0,0,11529,11530,11531,11534,0,0,11543,0,0,0,0,0,11547, 0,11548,0,0,0,0,0,11552,11556,0,11557,0,0,11559,0,11560,0,0,0,0,0,0, 11561,0,0,11563,11564,0,11565,0,0,0,0,11567,0,0,0,11569,0,11574,0,11575,0, 0,0,11577,0,11578,0,0,0,11580,11581,0,0,0,11582,11584,0,0,0,0,0,0,0, 11587,0,11588,11591,0,11595,0,0,0,0,0,0,0,0,11596,0,11597,0,0,0,0,11598, 11601,0,0,0,11602,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11603,11604,0, 11606,0,0,11608,0,0,0,0,11610,0,0,11611,0,0,0,0,11613,0,11622,0,0,0, 11623,0,0,0,0,11625,0,0,11626,11627,11628,11630,0,0,0,0,0,0,11639,0,0, 11646,0,11648,11649,0,11650,0,0,0,0,0,0,0,0,0,11651,0,0,11652,11653,11656, 0,0,11677,11679,0,0,0,0,11680,0,0,11681,0,11685,0,0,0,0,0,0,0,0,11688,0, 0,0,11716,0,11719,0,0,0,0,0,11721,0,0,11724,11743,0,0,0,0,0,0,0,0,11745, 11748,11750,0,0,0,0,0,11751,0,0,0,11752,11754,0,11755,0,0,0,0,0,0,0, 11759,0,0,0,0,0,0,11760,0,0,0,11761,0,0,0,0,0,0,11766,11767,0,11772, 11773,0,11774,0,0,11775,0,11777,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,11778,11780,0,0,0,0,0,0,0,11783,0,11784,0,0,0,11785,0,0,0,11786,0,0,0, 0,11788,0,0,11789,11791,11792,0,0,0,0,11795,11834,11835,11836,0,0,11837,0,0, 0,11838,0,0,11846,11851,0,11852,0,11869,0,0,0,11871,0,0,0,11872,11874,0,0, 0,0,0,0,11875,0,11876,11877,0,0,0,0,0,0,0,0,0,0,11883,0,0,0,0,0,0,0, 11884,0,11885,0,11886,0,0,11887,0,11894,11895,11897,11909,11910,0,11912,11918, 0,0,11920,0,11922,11924,11927,11928,0,0,0,0,11929,0,11934,0,0,0,0,0,11941, 11943,11944,0,11945,0,0,0,0,11948,11949,0,0,0,0,11953,0,11954,0,11955,0, 11956,0,0,0,0,0,11957,0,0,11959,0,0,0,0,0,0,0,0,11961,0,0,0,0,0,11978, 0,0,0,11979,11980,11986,11987,0,11992,0,0,0,0,0,11993,0,0,0,11994,0,11999, 12004,12005,12006,0,0,0,0,0,12011,0,0,12012,12014,0,0,12015,0,0,12019,12028, 0,0,12029,0,0,12032,12033,0,0,0,0,12034,0,12041,12043,0,0,12044,0,0,0,0, 0,0,0,12046,0,0,0,0,0,0,0,12054,12055,0,12056,0,0,0,12060,12064,0,0,0,0, 0,12065,12067,12068,0,0,0,0,0,0,0,0,12074,0,0,0,12075,12076,0,0,0,12079, 0,12081,12086,12087,0,0,12088,0,0,0,0,12089,0,12092,0,0,0,0,12097,0,0,0, 0,0,0,0,0,12098,0,0,0,0,0,0,0,0,0,0,0,0,0,12102,12103,12104,12111,0,0, 12114,12116,0,0,0,12118,0,0,0,12119,12120,12128,0,0,0,0,12130,0,0,0,0,0, 0,12131,0,0,0,12132,12134,0,0,0,0,12137,0,12139,0,12141,0,0,12142,0,0,0, 12144,0,0,0,0,0,12145,0,12148,0,12153,0,0,0,0,12154,12171,12173,0,0,0, 12175,0,0,0,0,12178,0,0,0,0,0,0,0,12183,0,0,0,0,0,0,0,0,12184,0,0,0, 12186,0,0,0,0,0,12187,12188,0,0,12189,0,12196,0,12197,0,0,12198,0,12201,0, 0,0,0,12203,0,12209,0,0,0,0,12210,12211,12212,12213,0,12217,12218,0,0,0,0, 0,0,0,0,0,12222,0,0,0,0,0,0,0,12223,0,0,12229,0,0,0,0,12233,0,0,0,0, 12234,0,0,12236,12242,0,0,0,12243,0,0,0,12244,12253,0,12254,12256,0,12257,0, 0,12275,0,0,0,0,0,12277,0,0,0,0,0,12278,0,12289,0,0,12290,0,12292,12293, 0,0,12294,0,12295,0,0,12296,0,12297,0,12298,0,0,0,0,12301,0,0,0,0,0,0,0, 0,0,0,0,0,0,12309,0,12338,12340,0,0,0,0,12341,0,0,0,0,0,0,0,0,12342, 12343,0,12344,0,0,0,0,0,0,0,0,0,12345,0,0,0,0,0,0,0,0,12346,0,0,0,0, 12348,0,0,0,0,0,0,0,0,0,0,0,0,12350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 12351,0,12355,12356,12357,0,0,12367,12370,12371,0,0,0,0,0,12372,12376,0,0,0, 0,0,0,0,0,12379,0,12382,0,12383,0,0,12384,0,0,0,0,12393,0,0,12394,0,0,0, 0,12398,12403,0,0,12404,0,0,0,0,0,0,0,0,0,0,0,0,0,12410,0,0,0,12411,0, 0,0,12412,0,0,0,0,12420,0,12421,0,0,0,0,0,12423,0,12425,12429,0,0,0, 12431,12432,0,0,0,0,0,0,0,0,0,0,0,0,12434,0,0,0,0,0,12435,12436,0,0,0, 0,0,0,0,0,12437,0,0,0,0,0,12438,0,0,0,0,0,0,0,0,12445,0,0,0,12450, 12451,0,0,0,0,0,0,0,0,12452,12475,0,0,12493,12494,0,0,0,12495,0,0,0,0, 12496,12502,12509,0,0,0,0,12510,0,12512,12513,0,0,0,0,12514,0,0,0,12515,0, 12520,0,0,0,12524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12527,0,0,0,12528, 0,0,0,12529,0,0,0,0,0,12530,0,12535,0,0,12536,0,12538,0,0,0,0,0,0,0,0, 0,0,0,0,12540,0,12548,0,0,0,0,0,12550,0,0,0,12551,12552,0,0,0,12554,0,0, 0,0,0,0,0,0,12555,0,0,12562,0,12565,0,12566,0,0,0,0,0,0,0,0,0,0,0,0, 12569,0,0,0,12571,12574,0,0,0,0,0,0,0,12577,0,0,0,0,0,0,0,12578,12579, 12603,0,12608,0,0,12611,0,12612,0,12615,0,12625,0,0,0,0,12627,12646,0,12648, 0,0,12657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12670,0,0,12671,0,12673,12677,0, 0,0,0,0,0,0,0,0,0,0,12679,0,12681,0,12682,12693,0,12694,0,12697,0,12701, 0,0,0,12703,12704,0,0,0,0,12707,12737,0,0,12739,0,0,12740,0,0,12742,12743, 0,0,0,0,0,0,0,0,0,12745,0,12746,12747,0,12748,0,0,12759,12767,0,0,0,0, 12773,0,12774,12778,0,0,0,0,0,0,0,12779,0,0,0,0,0,12780,12793,0,12824,0, 12825,0,12836,0,0,0,0,12839,0,12842,0,0,0,0,0,0,0,0,0,0,0,0,12843,12845, 0,12846,0,0,0,0,12847,0,0,12850,12852,12853,0,0,0,12854,0,0,0,12855,0, 12856,0,12858,0,0,12859,0,12862,0,12863,0,0,12866,0,12869,12872,12873,0,0,0, 0,0,0,0,0,0,12875,0,12877,0,0,12878,0,0,0,0,0,0,0,0,0,12884,12885,12888, 0,12889,0,0,0,0,12893,0,0,0,12895,12896,12898,0,0,0,0,0,0,0,12902,0, 12909,12910,0,12926,0,12928,0,0,0,12929,0,12930,0,0,0,0,12931,0,12932,12933, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12934,0,12942,0,0,0,0,12944,0,0,0,0, 0,0,0,0,12946,0,0,12948,0,0,12949,0,0,0,0,12950,0,0,0,0,12951,0,12952,0, 12953,0,0,0,12954,12958,12959,0,0,0,0,0,12960,12964,0,0,0,0,0,12966,0,0, 0,0,0,0,0,0,12970,0,12971,0,0,0,0,0,0,12972,0,0,12982,0,0,0,12984,12985, 0,12986,12996,12997,13001,13002,0,0,0,0,13004,0,0,13005,0,0,13007,13009,0, 13017,0,0,0,13020,0,13021,0,0,0,0,0,0,0,0,0,0,13022,0,0,0,0,0,0,0,0, 13024,13027,0,0,0,0,0,13028,0,0,13029,0,0,0,0,0,0,0,13032,0,13037,0,0,0, 0,0,0,13040,0,0,13041,0,0,0,13043,13044,13046,0,0,0,0,13047,0,0,0,0,0,0, 0,13049,13054,0,13056,0,0,13060,13061,0,0,0,0,0,13067,0,0,13068,0,13071,0, 0,0,0,0,13077,13078,0,0,0,0,0,13079,13080,13081,0,13082,0,0,0,13085,0,0, 0,0,0,0,0,13086,0,13087,13088,0,0,0,0,0,13094,0,13099,0,13100,0,0,0, 13101,0,13125,13126,13128,13129,0,0,13130,0,13131,0,0,0,0,0,0,13134,0,0,0, 0,0,0,0,0,0,0,0,13150,0,13168,0,0,0,0,0,0,0,0,0,13169,0,0,13170,0,0, 0,0,13174,0,0,0,13176,0,0,0,0,0,13177,0,13178,13183,13187,0,0,0,13189,0, 0,13190,0,0,13191,0,0,13206,0,0,0,13207,0,0,0,0,0,0,0,0,0,0,13212,0,0, 13219,13232,0,0,0,13241,0,13249,13253,0,0,0,0,0,13255,13259,0,13260,13261,0, 13262,0,13272,0,0,0,0,13276,0,0,0,0,13277,13299,0,0,13301,13302,0,0,13303, 0,0,13305,0,13310,0,0,0,13311,0,0,0,0,13325,0,13328,0,0,0,13329,0,0,0,0, 0,0,13330,0,0,13331,0,13335,0,0,13342,0,0,0,0,0,13343,0,13354,0,13362,0, 13366,13367,13369,0,0,13371,13372,0,13373,13374,0,13376,0,13380,13381,13386,0, 13387,13388,0,13389,13391,13395,0,0,0,0,0,13401,13409,0,13410,0,0,0,0,13420, 0,0,0,0,0,13422,0,0,0,0,13423,0,0,0,0,13425,0,0,0,0,0,13427,0,0,0, 13428,0,0,13430,13438,0,13439,0,13445,0,13448,13449,0,0,0,0,0,0,13451,0, 13457,0,0,0,0,13458,13459,0,13460,0,0,0,0,13464,13465,13466,13470,0,13471, 13472,13474,13475,0,13476,0,0,13478,13479,0,13481,0,0,0,0,13487,0,13490,0, 13493,0,0,13494,0,0,13495,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13496,13497,0, 13500,0,0,13516,13522,0,0,13525,13528,0,0,0,13530,13535,0,13537,13539,0, 13540,0,13543,0,13544,0,0,0,0,0,0,13545,0,0,0,0,0,0,13547,0,0,0,13549, 13555,0,0,0,13556,13557,0,0,0,0,0,0,0,13558,0,13563,0,0,0,0,13564,0,0,0, 0,0,0,0,0,13566,0,0,0,0,0,0,13569,0,0,13571,0,0,0,0,13573,0,0,0,0,0, 0,13578,0,0,0,0,0,0,0,0,0,0,13581,0,13586,0,13595,0,13600,0,0,0,0,0,0, 0,0,13601,13603,0,13604,13605,13606,13607,0,0,13617,13618,0,0,0,0,0,0,0, 13623,0,13625,13627,0,0,0,0,0,0,0,0,13629,0,0,0,13634,0,0,0,13638,0,0,0, 0,0,0,0,0,13654,0,0,0,0,0,0,0,0,0,0,13656,0,13659,0,0,13660,0,0,13662, 0,0,0,13663,0,13664,0,0,0,0,0,13668,0,13669,13671,0,0,13672,0,0,0,0,0,0, 13675,13685,0,13686,0,0,0,13687,0,0,0,13692,13694,13697,0,0,0,13702,0,0,0, 0,0,13705,0,0,0,0,13707,0,0,0,13714,0,0,0,0,0,0,0,0,0,13715,0,13716, 13717,0,0,13719,13724,13730,13731,0,0,0,0,0,0,0,0,13732,0,0,0,0,0,0,0, 13734,0,13736,0,0,13737,13738,13747,0,13751,0,0,13752,0,0,0,13753,0,13757,0, 0,13762,13763,0,13764,13765,0,13766,0,0,13767,0,0,0,13768,0,0,0,0,0,0,0, 13769,0,0,13772,0,13775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13776, 13778,13787,0,0,0,13797,0,13798,0,13801,0,13804,13806,0,0,0,0,13816,13817,0, 0,0,0,0,0,0,0,0,0,0,0,0,13834,0,13836,0,0,13838,0,0,13839,0,13840,0,0, 0,0,13842,0,0,0,0,0,0,13843,0,0,0,0,0,0,0,0,0,13845,0,0,0,0,0,13858, 0,0,13860,0,0,13861,0,0,13862,13863,0,13868,0,13869,13870,0,0,0,0,0,0,0, 0,0,0,13872,0,0,0,0,13873,13878,0,0,0,0,0,0,0,0,0,0,13886,0,13888,13889, 13890,0,0,13891,13894,0,13897,13899,13900,13904,0,0,13906,0,0,0,13909,0,0,0, 13910,0,0,0,13911,0,0,0,0,0,13912,13917,0,0,0,0,13918,0,13919,0,0,13920, 0,0,0,13921,0,0,13922,0,0,0,0,0,0,0,13924,0,13927,0,0,0,0,0,13932,0, 13933,0,13934,0,0,13935,0,13944,0,0,0,13954,0,0,13955,0,0,0,0,13956,0, 13957,0,13967,13969,0,0,0,0,0,0,0,0,0,0,0,0,13970,13990,0,13991,13994,0, 13995,0,0,0,0,13996,0,0,13999,0,0,0,14018,0,14019,0,14021,0,0,0,0,0,0, 14041,0,0,0,0,0,0,0,0,14043,0,0,0,0,14046,0,0,0,14048,14049,0,0,0,0,0, 0,0,0,0,0,14051,0,0,14052,14056,0,14063,0,14064,14066,0,0,14067,0,0,0,0, 0,0,0,0,0,14068,0,0,0,14072,0,14074,14075,0,14076,14079,14085,14086,14087, 14093,0,0,0,0,14095,0,0,0,0,0,0,14096,14097,0,0,0,0,0,0,0,14098,0,14102, 0,0,0,0,0,14103,0,0,0,14104,0,0,14105,0,0,0,14107,14108,0,0,14109,0,0,0, 0,0,0,0,0,14117,0,0,0,0,14118,0,0,0,0,14119,0,0,14120,0,0,14121,0,14122, 14127,0,14128,14136,0,0,14138,0,14140,0,0,0,14141,14142,0,0,0,0,14146,0,0, 14149,0,14151,0,0,0,14152,0,0,14153,0,0,0,0,0,0,0,0,0,14154,0,14156, 14157,0,0,14159,0,14161,0,0,0,0,14162,0,0,0,0,0,0,14163,0,0,14173,0,0,0, 0,0,0,14174,0,0,14176,0,0,14178,0,0,14179,14181,0,0,14182,14185,14187,0, 14190,0,0,14197,0,0,0,0,0,0,0,0,0,0,0,0,14198,0,0,0,0,0,0,14199,14200, 0,0,0,14204,0,0,14208,0,0,0,0,0,0,0,0,0,0,0,14231,0,0,0,0,0,0,0,0,0, 14234,0,0,14235,0,0,0,14240,14241,0,0,0,14246,0,0,0,14247,0,14250,0,0, 14251,0,0,14254,0,0,14256,0,0,0,14260,0,14261,0,0,0,0,14262,14267,14269,0, 0,14277,0,0,14278,0,14279,14282,0,0,0,14283,0,0,0,14284,14285,0,0,0,0, 14286,0,0,0,14288,0,0,0,14289,0,14290,0,14293,14301,14302,14304,14305,0, 14307,0,14308,14309,0,0,0,0,0,0,0,0,0,0,0,14311,14312,0,0,14317,0,0,0,0, 0,0,0,14318,0,0,0,0,14320,0,0,0,0,14321,14322,0,0,0,0,0,14326,14329,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,14330,14331,0,0,0,0,14332,0,0,0,14333,0,0, 14337,14340,0,14341,0,0,14342,0,14345,14346,0,0,14347,0,14362,0,0,0,0,0, 14364,14365,14371,0,14373,0,0,14374,0,14379,0,14400,0,0,0,0,0,14401,0,0, 14405,0,14406,0,14408,14409,0,0,0,14417,0,0,14424,0,0,0,0,0,0,0,0,0, 14430,0,0,0,14431,0,0,14435,0,14440,0,0,0,0,0,0,14442,0,0,14443,0,0,0,0, 0,14446,0,0,0,0,0,0,0,14454,0,14457,0,14460,0,0,14466,0,0,0,0,0,14467,0, 0,0,0,0,0,14469,0,14477,0,0,0,0,0,0,14478,14482,0,0,0,14483,0,0,0,14485, 14486,0,0,0,14487,14488,14489,14492,14493,14494,14495,14496,14497,0,14499,0, 14501,0,0,0,0,0,0,0,0,0,0,14502,0,14507,14512,14513,14514,0,0,0,0,0,0,0, 0,0,0,0,14515,14526,14530,0,14537,0,14544,0,14547,0,0,14548,14550,14551,0,0, 14552,0,0,0,14553,0,14554,0,0,0,0,14556,14564,0,0,14565,14566,0,0,0,0,0, 0,14568,0,0,14569,0,0,0,14571,14576,0,0,14577,14578,14579,0,0,14580,0,0,0, 0,14582,0,0,0,0,0,0,0,0,0,0,0,0,14583,0,0,0,0,0,14587,0,14588,0,0, 14600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14601,0,0,14604,14605, 14611,0,14613,0,0,0,0,14615,0,0,0,0,0,0,14627,0,14628,0,0,0,0,14631,0, 14633,14634,0,0,0,0,14635,0,0,0,0,0,0,0,0,14636,0,0,14639,14642,0,0,0,0, 14644,0,0,0,0,14645,14646,0,14653,0,0,14654,0,14658,0,14661,0,0,0,14665,0, 0,0,14668,0,0,0,0,0,0,0,0,0,14669,0,0,14670,0,0,0,14680,0,0,14681,0,0, 0,0,0,14682,14683,0,0,0,0,14686,0,0,0,0,14687,14697,0,0,0,0,14699,14705, 14711,0,0,0,0,0,0,0,0,0,0,14712,0,0,0,14713,0,0,0,0,14719,0,14720,14721, 14726,0,0,0,14728,14729,0,0,0,0,14731,0,0,0,0,0,0,0,14733,14736,14737,0, 0,14740,14742,0,0,0,14744,14753,0,0,0,0,14755,14758,14760,0,0,0,0,0,14761, 14762,14765,14771,0,14772,0,14773,14774,0,0,14775,0,0,14776,0,0,0,0,14777,0, 14779,0,0,14782,0,0,14785,14786,14788,0,0,0,0,0,14795,0,0,0,0,0,0,14798, 0,14803,14804,14806,0,0,0,14809,0,0,0,0,0,0,14810,0,0,0,0,14811,0,14812, 0,0,0,0,0,14815,0,0,0,0,0,0,0,0,14816,0,14818,0,0,0,0,0,0,14819,0, 14820,0,14823,0,0,0,14824,0,0,14826,14827,0,0,0,0,0,0,0,0,0,0,0,0,14830, 0,0,0,0,0,14833,0,14845,0,0,0,0,0,14846,0,0,14847,14871,0,14873,0,14876, 0,14877,14878,14880,0,0,0,0,0,14881,0,14882,14894,0,0,0,0,14895,0,14907,0, 14908,0,0,0,0,0,0,0,14911,0,0,0,0,14920,0,0,14931,0,14932,14934,14935,0, 0,14936,0,14945,0,0,0,0,0,0,0,14947,0,0,14948,14949,14951,0,0,14952,0,0, 0,14964,14973,0,0,14990,0,0,0,0,14995,0,0,14998,15001,0,0,15002,15020,0,0, 0,0,0,0,15021,0,15022,0,0,0,0,15023,0,0,15025,15029,15033,0,0,0,15034,0, 0,0,15035,0,0,0,0,0,15043,15044,0,0,0,15045,15046,15048,15050,0,15065,0,0, 0,0,15066,0,0,15075,15082,15084,0,0,15085,15086,0,0,0,0,0,0,0,0,15088,0, 0,0,15089,0,0,0,0,15094,0,15096,0,15097,0,15100,0,0,15102,0,0,0,0,0,0,0, 0,15105,0,0,15106,0,15109,15113,0,0,0,15115,0,15118,0,0,0,0,0,0,15119,0, 0,15120,0,0,0,0,0,15123,15129,0,0,0,15130,0,15131,0,0,15134,0,15135,0,0, 0,15137,15138,0,0,0,0,0,0,15139,0,0,0,0,0,15140,0,0,15154,15162,0,15169, 15170,0,15175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15177,0,15178,15179,0,0,0, 0,0,15183,0,0,0,0,0,0,0,0,0,0,0,0,15185,15187,0,15194,15195,15196,0,0,0, 0,0,0,0,15204,0,0,0,0,15206,0,0,0,0,0,15207,0,0,0,0,0,0,0,0,0,15213, 0,15214,0,0,0,0,0,0,0,15232,0,0,0,0,15234,0,15238,15240,0,15248,0,0,0,0, 15250,15251,0,0,0,0,0,0,0,15252,0,0,0,15255,15262,15266,0,0,0,15267,0,0, 0,15277,15279,0,0,0,15280,15281,15282,0,0,0,0,0,15285,0,0,0,0,15289,0,0, 15291,0,0,0,0,0,0,0,15296,15297,0,0,15304,0,0,0,0,15306,0,0,0,0,0,0, 15307,15308,0,15309,0,0,15311,0,0,15312,15313,0,0,0,0,0,0,0,0,0,0,0,0, 15314,15317,0,0,0,15318,15319,0,0,0,0,15320,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,15321,0,0,0,0,0,15324,0,15325,15326,0,15330,0,0,0,0,15334,0,15335, 0,15341,0,0,15342,0,0,15343,15344,0,0,0,0,15345,0,0,0,0,15347,0,0,15348, 15349,15350,0,15356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15357,0,15358,0,0, 0,0,0,0,0,15359,15360,15364,0,15380,0,0,0,0,0,15392,0,0,15393,0,15395,0, 0,0,0,0,0,0,0,15396,0,0,15397,15398,0,0,0,0,0,0,0,0,0,15399,0,15400,0, 0,0,15402,0,15405,15410,0,0,0,0,15411,0,0,0,15412,0,15416,0,0,0,0,0,0,0, 15428,0,15435,0,0,15438,0,0,0,0,15439,0,0,0,15440,0,0,0,15441,15449,15451, 0,0,0,0,0,0,0,15452,0,0,15455,0,0,0,15456,0,0,15458,0,15460,15461,0,0,0, 0,0,15462,15464,0,15465,0,0,15466,0,0,15467,0,0,0,0,0,15468,0,0,0,0, 15481,0,0,15484,0,15485,15486,0,0,0,15487,0,0,0,0,0,15488,0,15492,15498,0, 0,0,15499,0,0,0,15500,0,15501,0,0,15512,0,15522,0,0,0,15524,0,15525,15526, 0,0,15527,0,0,15545,15546,0,15548,15552,0,15553,0,0,0,15554,0,15555,0,15557, 15565,15573,15577,15578,0,15582,0,15583,0,0,0,0,0,0,0,0,0,0,0,0,0,15586, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,15588,0,0,0,0,0,15589,0,0,0,0,0,0,0, 15593,15594,0,0,0,0,15595,0,0,0,0,0,0,15596,0,0,0,15597,0,0,0,0,15600,0, 0,15601,0,0,0,0,15602,15603,0,0,0,0,0,0,15604,0,15609,0,0,15612,0,0, 15613,0,0,15615,15617,15618,0,0,15620,0,15636,15637,0,0,15649,0,0,0,0,0,0, 0,15650,0,0,15651,0,0,0,15656,0,15658,0,0,0,15664,0,0,15665,0,0,15668,0, 0,0,0,0,15669,0,0,15674,0,0,15675,0,0,0,0,15676,0,0,0,0,0,0,0,0,0,0, 0,15677,0,0,0,0,15678,0,0,0,0,0,15679,0,0,15681,0,15686,0,0,0,0,15687,0, 15688,0,0,15690,0,0,0,15697,0,15699,15700,0,0,0,0,0,0,0,0,0,15701,0, 15702,15703,0,15704,0,15705,0,15707,0,15709,0,15712,15716,0,15717,0,15718, 15720,0,0,0,0,0,15724,0,0,0,15725,0,15726,0,0,0,15740,0,15745,15746,0,0, 15747,0,15748,0,0,0,0,0,15749,0,0,0,15752,0,15753,0,0,0,0,0,0,15759,0,0, 0,15765,0,0,0,0,0,0,0,0,0,15767,0,0,0,15771,0,0,15784,0,0,0,0,15785, 15790,15791,0,0,15792,0,0,0,15807,0,15811,0,0,0,0,0,0,0,0,0,0,0,0,15818, 0,0,0,15819,0,0,0,0,15821,0,0,0,0,0,15822,15824,0,0,15827,0,0,15829, 15831,0,15832,0,0,15833,0,15835,15838,15839,15843,0,0,0,0,0,0,0,0,0,0,0, 15844,0,0,0,0,15845,15851,15856,0,0,0,0,0,0,0,15858,15860,0,15861,0,0,0, 15864,0,0,0,0,15865,0,0,0,0,0,0,15866,0,15872,0,0,15876,0,0,0,0,15877, 15878,15883,15885,0,0,15888,0,0,0,0,0,15889,15890,0,0,0,0,0,0,0,0,15892, 0,0,0,0,0,0,0,15893,0,0,15894,0,0,0,15895,0,15896,15897,0,15898,15901, 15902,0,15911,15915,0,15916,0,15924,15935,0,15937,0,0,0,0,0,15950,0,0,0,0, 0,0,0,15958,0,0,0,15961,0,0,15966,0,15967,0,0,15977,0,0,15978,0,0,15981, 15982,15983,0,0,0,0,0,0,0,15986,0,0,0,15990,0,15991,15995,15998,0,15999,0, 16000,0,0,0,0,16008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16009, 16011,0,16013,0,0,0,0,0,0,0,0,16014,0,0,16015,16023,16024,16025,0,0,16026, 0,16030,0,16032,0,16033,0,0,0,0,0,0,16035,16036,16037,0,0,0,0,0,16039,0, 0,0,0,16041,0,0,0,0,0,16043,16044,0,0,16047,0,0,0,16048,0,0,16049,16050, 16052,0,0,0,0,0,16055,0,0,0,0,0,0,0,0,16056,0,0,0,0,0,0,0,16058,16060, 16061,0,0,16063,0,0,16064,0,0,0,16067,16068,0,0,16069,16078,0,0,0,16079,0, 0,0,16080,0,16081,0,0,0,16088,0,0,0,0,0,0,0,0,0,0,0,16089,16093,0,16097, 0,16103,0,16104,16105,0,0,16256,0,0,16259,0,0,0,0,0,0,0,16260,16261,0,0, 16262,0,0,16263,0,16268,0,0,0,0,0,0,0,16269,0,0,16270,16273,0,16274,0,0, 0,0,16275,16276,16277,16280,0,0,0,16281,16284,0,0,0,16286,0,16289,0,0,0,0, 0,0,0,0,0,16290,0,0,0,0,16291,0,0,0,0,0,0,0,16292,0,0,0,0,0,0,0,0, 16293,16295,16297,0,16302,0,16304,0,16305,0,16306,0,0,0,0,0,0,0,0,0,0,0, 0,16307,16308,16312,0,0,0,0,0,0,16313,16315,0,16318,0,0,0,16321,0,0,0,0, 0,0,0,16326,16333,16336,0,0,0,0,16337,16340,0,0,0,0,0,16345,0,0,16346,0, 0,0,0,0,0,0,0,0,16347,0,0,16348,0,0,0,0,16349,0,0,0,16350,0,16357,0,0, 0,0,16359,16360,0,0,0,0,16362,16363,16364,16365,0,0,16366,0,0,0,0,16367, 16368,0,16369,16374,0,0,0,0,0,0,0,16376,0,0,0,0,16378,16379,0,16380,0,0, 0,16381,16383,0,0,0,0,0,16390,0,0,0,16399,0,16402,16404,16406,16407,0,0,0, 16409,16411,0,0,0,0,16412,0,16413,16415,16423,0,0,0,0,0,16424,0,0,0,16428, 16434,16435,16449,0,16450,16451,0,0,0,16453,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,16454,0,0,16456,16458,0,0,16459,0,0,16460,0,0,0,0,16462,0,16463,0,0, 16466,0,0,0,0,0,16479,0,0,16480,0,16481,16484,0,0,0,0,0,0,0,0,0,0,16485, 0,0,0,0,0,0,16489,0,0,0,0,0,16491,0,0,16498,0,0,16503,0,16505,0,0,0,0, 0,0,0,0,16506,0,0,0,16508,16509,0,0,0,0,0,0,0,0,16511,16513,0,0,0,16516, 0,16517,0,16519,0,16529,0,0,16531,0,0,0,0,0,0,16534,0,0,16541,16542,0,0, 0,0,0,0,0,0,0,16543,16547,16548,0,0,0,16551,0,16552,0,0,0,16553,0,0, 16558,0,0,16562,16565,0,0,0,16570,0,0,0,16573,16585,0,0,0,16586,16587,16595, 0,16596,0,16598,0,0,0,16600,0,0,0,0,0,0,0,0,0,0,0,0,0,16601,0,0,0,0, 16603,0,0,0,0,0,0,0,16604,16612,0,0,0,0,16613,0,16618,0,0,0,16640,0,0, 16641,0,0,0,0,0,0,16645,0,0,0,0,16646,0,0,0,0,0,0,16651,0,0,0,0,16653, 16654,0,0,0,16655,0,0,16656,16667,0,0,0,0,16671,0,16672,0,0,0,16673,0,0, 0,0,0,16676,0,16686,0,0,0,0,16689,0,16690,0,16692,0,16693,0,16694,0,16696, 0,0,0,16705,0,0,0,0,0,0,16707,0,0,0,16709,0,0,0,0,16711,0,16712,16713,0, 0,0,16715,0,0,0,0,16716,0,0,0,0,0,0,0,0,0,16718,16724,0,0,16726,16727,0, 0,0,0,0,0,0,16728,0,16729,0,0,16730,0,0,0,0,0,16731,0,0,0,16732,0,0,0, 0,16734,16738,0,0,0,0,0,0,0,0,16743,0,0,16745,0,0,0,0,0,16749,0,16752,0, 0,0,0,16756,0,0,16758,0,16759,0,0,0,0,0,16760,0,0,0,0,0,0,0,16762,0, 16769,0,16770,0,16772,0,0,0,16777,16780,0,0,0,0,0,0,16781,0,0,16782,0, 16784,0,0,16785,16787,16792,0,0,16794,0,0,0,16798,0,0,16809,0,0,16814,16816, 16817,0,16819,0,0,0,0,0,0,0,0,0,0,16820,0,0,16836,16839,0,0,16841,16851, 16857,0,0,16858,16859,0,0,16860,0,0,0,0,0,0,0,0,16862,0,16863,0,0,0,0,0, 0,0,16864,0,0,0,0,0,0,0,16876,0,16881,16882,0,16885,16886,0,16887,0,0,0, 16889,16891,0,0,0,0,0,16894,16895,0,0,0,0,0,0,0,0,0,0,0,16897,0,16898,0, 0,0,0,0,16913,0,0,16924,16925,16926,0,0,16927,0,0,0,16937,16938,0,0,0, 16940,16941,0,0,0,16942,16945,0,16946,16949,16950,0,0,0,16952,16955,0,0,0, 16965,0,16969,0,0,16975,0,0,16976,0,0,0,0,16978,0,0,16981,0,16983,16989,0, 0,0,0,16990,0,0,16991,0,0,0,16993,0,16994,16996,17000,0,0,0,0,0,17002, 17004,0,17006,0,0,17007,0,0,0,0,17008,17013,17014,0,0,0,0,0,0,0,0,0, 17021,0,17031,0,0,0,0,0,17033,17036,0,17038,0,0,17039,0,17045,0,0,17046, 17047,0,0,0,0,17048,0,17049,17050,0,17051,17053,0,17054,0,17055,0,0,0,0,0, 17063,0,0,17064,0,0,0,0,0,0,0,17065,0,0,17068,0,0,0,0,0,17072,0,0,0,0, 0,0,17073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17074,0,17080,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17081,17083,17084,0,0,0,17085,0,0, 0,0,17092,0,0,0,0,0,0,0,0,0,17093,0,17095,17102,0,0,0,0,0,0,17103,0,0, 17105,0,17107,0,0,0,0,17114,0,0,0,0,0,17115,17125,17127,0,0,17128,0,0,0, 17129,17130,0,17131,0,0,0,0,0,17132,17135,17145,0,0,0,0,0,0,0,0,17146,0, 17147,0,17148,0,0,0,0,0,0,17149,17150,0,17151,17153,0,17155,0,0,0,0,17163, 17171,0,17174,0,0,0,0,17179,0,0,17182,17185,0,0,0,0,0,17186,0,0,17188,0, 0,0,0,0,0,0,17189,17191,0,17194,0,0,0,0,0,0,0,0,0,17195,17196,17203, 17204,0,0,17205,17217,0,0,0,0,0,17218,0,0,0,0,17219,0,17220,0,17221,0,0, 17230,0,0,0,0,0,17236,0,17238,17239,0,0,0,17241,17244,0,0,17245,0,17248,0, 0,17251,0,17252,0,0,17264,0,17266,0,0,0,17268,0,0,0,0,17271,17272,0,17273, 0,17295,0,17302,0,17305,0,0,0,17306,0,0,0,0,0,0,0,17308,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,17309,0,17310,17313,0,0,0,0,17314,17315,0,17317,0,0,0, 0,17318,0,0,0,0,0,0,0,17320,0,0,0,0,0,0,17334,0,17344,17348,0,0,0,17350, 17351,0,0,17353,0,0,17354,0,0,0,0,0,0,0,0,0,17355,0,0,0,0,0,0,17356, 17357,0,0,17359,0,0,0,17371,0,17372,0,0,0,17393,0,0,0,0,17394,0,0,0,0,0, 17395,0,0,17399,0,0,0,17401,17417,0,17418,0,17419,0,0,0,0,0,17422,17423,0, 0,0,0,0,17424,0,0,0,0,0,17428,17429,17433,0,0,0,17437,0,0,17441,0,0, 17442,0,0,17453,0,0,0,0,0,0,0,0,17454,17456,17462,0,0,17466,0,0,17468,0, 0,17469,0,0,0,0,17470,0,17475,0,0,0,0,0,17479,0,0,0,17483,17484,0,17485, 0,17486,0,17491,17492,0,0,17493,0,17494,17495,0,0,0,17496,0,0,0,17497,0,0, 0,17502,0,0,0,0,0,17503,0,17505,0,17507,0,0,0,17512,17513,17514,0,0,17515, 0,0,0,17519,0,0,0,17522,0,0,17523,0,0,0,0,0,0,0,0,0,17527,0,0,0,17528, 0,0,0,17534,0,0,0,0,17536,0,0,0,17539,0,17540,17543,17549,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,17556,0,0,17558,0,17559,0,0,17560,0,0,0,17563,0,0,0, 0,0,0,17564,0,0,17565,17566,0,17567,0,0,0,0,0,0,17569,17570,0,17575,0,0, 0,0,0,0,0,0,0,0,0,17581,0,0,0,17582,17583,0,17586,0,0,17587,0,0,0,0,0, 0,0,17588,0,0,0,0,17596,17597,0,0,17598,17600,0,0,0,0,0,0,17601,0,0,0, 17604,0,0,17605,0,0,17607,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 17612,0,0,17618,0,17621,17622,0,0,0,0,17623,0,0,17624,0,0,17630,0,0,17631, 17633,17634,0,0,0,0,0,0,0,17635,0,0,17636,0,0,17637,0,17638,0,17640,0,0, 0,0,0,0,0,0,0,0,17641,0,0,0,0,0,0,0,0,0,0,17643,0,0,0,0,17645,0,0,0, 0,0,0,0,0,17646,17662,0,0,0,0,0,0,0,0,0,17663,17664,0,17665,17666,0,0,0, 17669,17671,17673,0,17679,0,0,0,0,0,0,0,17684,0,0,0,17686,0,17714,0,0, 17720,17722,17726,0,0,17728,0,0,17729,0,0,0,17732,0,17733,0,17734,0,0,0, 17735,0,0,0,0,17737,0,0,0,0,17739,0,0,0,17741,17742,0,0,0,0,17743,17744, 17745,0,0,0,17749,0,17750,17751,17752,17754,17761,17762,0,17763,0,17766,0, 17772,0,0,0,0,0,17775,0,0,0,0,0,0,0,17776,0,0,17777,0,0,17778,17779,0, 17782,17783,0,0,0,0,0,0,0,0,0,0,17784,0,0,0,0,0,0,0,17821,0,0,0,17822, 0,0,0,17823,17825,0,0,0,0,0,17826,17831,17832,17833,0,0,17845,0,0,0,17846, 0,0,0,17848,17850,17854,0,17855,0,0,17859,0,0,0,0,0,0,17860,17861,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17870,17871,0,0,0,0,0,0,17872,0,0,0, 17879,0,0,0,17881,17883,0,17884,0,17885,0,0,17886,0,0,17887,17891,17953,0,0, 0,0,17954,0,0,17955,0,17968,0,0,17972,0,0,0,0,0,17974,0,0,0,0,17976, 17978,0,0,17983,0,0,0,0,18003,0,0,0,0,0,18007,0,0,0,0,0,18009,0,0,0,0, 0,0,0,18010,0,0,0,0,0,0,18012,0,0,18014,0,0,0,18015,0,0,0,18016,0,18017, 0,0,0,18030,0,0,0,0,0,0,0,18031,0,0,18036,18037,18038,0,0,18049,18056,0, 18057,18058,0,18059,0,0,0,0,0,0,0,0,18062,0,0,0,0,18064,0,0,0,0,0,0,0, 0,18067,0,0,0,18068,0,0,18075,0,0,18078,18093,18094,0,0,0,0,0,0,0,0, 18097,0,0,0,0,0,18098,18100,0,0,0,18108,0,18111,0,0,18112,0,18113,0,0, 18115,18116,0,18118,0,0,0,0,18121,0,0,0,0,18123,0,0,0,0,0,0,0,0,0,18124, 0,0,0,0,18125,18126,0,18127,0,0,18128,18135,0,0,0,0,0,0,0,0,0,18150,0,0, 0,0,0,18151,18152,0,0,18156,18164,0,18166,18171,0,0,0,0,0,0,0,0,0,18172, 18183,0,18184,0,0,0,0,18185,0,18187,0,0,0,0,0,18188,0,0,0,0,0,0,0,0, 18189,0,0,18190,0,0,18191,18192,0,0,18194,18195,18196,0,0,0,18197,0,18203,0, 18204,0,0,0,0,18205,0,0,0,18207,18208,0,0,18214,0,0,0,18215,18216,0,0,0, 18220,0,0,18222,0,0,0,0,0,18223,0,18225,18231,0,18234,0,18235,0,0,0,0, 18240,0,0,18241,18242,0,0,0,0,0,18243,18251,0,18253,0,18254,0,0,0,18266,0, 0,0,0,0,0,18269,18270,18271,18273,18281,0,0,0,0,0,0,0,0,0,0,0,0,18282,0, 18283,0,18284,0,0,0,0,0,0,18285,0,18287,18289,0,0,18290,0,0,0,0,18308,0, 0,0,18310,0,0,0,0,0,0,0,0,0,0,0,0,18311,0,18312,18313,0,18315,0,0,18316, 18320,0,18331,0,18332,0,18336,0,0,0,0,18337,0,18340,0,0,0,0,0,0,0,0,0, 18341,0,18344,18345,0,18346,0,0,0,0,0,18348,0,18351,0,0,18356,0,0,0,0,0, 0,18357,0,0,0,0,0,18367,0,0,0,18368,0,18369,0,18370,18371,0,0,0,18437, 18444,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18445,18450,0,0,0,0,18451,0,18452,0, 0,0,18453,0,0,0,0,0,18455,0,0,0,18456,0,18457,0,18460,0,0,18461,0,0,0,0, 0,0,0,0,18466,0,0,18467,0,0,0,0,18473,0,0,0,18476,0,18477,0,0,0,18478, 18479,18480,0,0,0,18485,0,0,0,18486,0,0,0,0,0,0,18488,18490,0,0,0,0,0,0, 18491,0,0,0,0,0,18495,0,0,18496,0,0,0,0,0,0,18505,0,18521,0,18522,18523, 0,0,0,18525,18526,0,0,0,0,0,18527,0,0,0,0,18532,18533,0,18534,0,0,0,0,0, 0,18535,18537,0,18538,0,0,0,0,0,0,18540,18541,18542,18543,0,18546,0,0,0,0, 18553,18556,0,0,18558,0,0,18569,18571,0,0,0,18572,0,18574,0,0,0,0,18586,0, 0,0,0,0,18588,0,0,18589,0,0,0,0,0,0,18590,0,18592,0,0,0,0,18594,0,0,0, 18596,0,0,18597,18598,0,0,18601,0,0,0,0,18602,0,0,0,18603,18604,0,18605,0, 0,0,0,18608,0,0,18611,0,0,0,0,0,0,0,0,0,18612,0,18616,0,0,18617,18619,0, 0,0,18628,0,0,0,18629,0,0,18630,0,0,0,0,0,0,0,18631,0,18632,0,0,18635, 18637,0,0,0,0,0,0,18641,18643,18648,0,18652,0,0,18653,0,18655,18656,0,0,0, 18657,0,0,18666,18674,0,0,0,0,18677,18684,18685,0,0,18686,0,0,18690,0,0,0, 0,0,0,0,18695,18696,0,0,0,0,0,0,0,0,0,0,18697,0,0,18700,0,0,0,0,0,0, 18702,0,18708,0,0,18709,0,18710,0,0,18711,0,18714,0,0,18718,0,0,0,0,0,0, 18719,0,0,18722,0,18726,0,0,0,0,0,0,0,0,0,0,0,0,0,18731,0,0,0,0,0, 18739,18741,0,0,18742,0,18743,18744,18746,18748,0,18752,18753,0,0,18754,18763, 0,18765,0,0,0,18766,0,0,0,18769,0,0,0,0,0,18773,18778,18779,18781,0,0, 18784,18787,0,18788,0,18793,0,0,0,0,0,0,18795,0,0,18800,0,0,0,0,0,18801, 18804,0,0,0,0,0,0,0,18806,0,0,0,18811,18815,18816,0,0,0,0,18825,0,0, 18827,18829,0,0,18830,0,0,0,0,18831,0,0,18832,0,0,0,0,18833,0,18840,0, 18841,0,18842,0,0,0,0,18843,0,18844,0,0,0,0,0,0,18845,18846,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,18848,0,0,0,18853,18860,0,0,18862,18866,0,0, 18867,18869,0,0,18874,18881,18891,0,0,0,0,0,0,0,0,0,0,18892,0,0,0,0,0,0, 0,0,18895,0,18896,0,0,0,18900,0,0,0,18901,0,18902,18915,18916,0,0,0,0,0, 0,0,0,18919,0,0,0,0,0,18920,0,0,0,18921,18929,0,0,0,0,18930,0,0,0,0,0, 0,18932,0,0,0,0,18934,18942,0,0,0,18951,18957,0,0,0,0,18958,0,0,0,0, 18959,18960,0,0,18961,0,0,18962,0,0,0,0,18963,18964,0,0,0,18965,0,18967,0, 0,0,0,0,0,0,0,0,18968,0,18969,0,18970,18973,18976,0,0,0,0,0,0,18977,0,0, 0,18981,0,0,0,18990,0,18998,0,0,0,0,0,18999,19003,0,0,19005,0,0,0,19006, 0,0,0,0,0,0,19008,19011,0,0,19018,0,0,19019,0,19024,0,19031,19032,0,19039, 0,19041,19050,0,0,0,19051,19055,19056,0,19059,19063,19064,0,0,19088,0,0,0, 19093,19094,0,0,0,0,19095,0,19096,0,0,0,19097,0,0,19098,0,19099,19100,0,0, 19103,0,0,0,0,0,0,0,19111,0,0,0,0,0,0,19112,0,0,0,19116,19117,0,19121, 19122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19123,19124,0,0,0, 0,0,0,0,19125,19126,0,19128,0,0,0,0,0,0,0,0,0,0,19129,19130,19131,19132, 0,0,19146,0,0,19147,19156,19158,0,0,0,0,0,0,0,0,19182,19185,0,0,19187,0, 0,0,19193,0,0,0,0,0,19194,0,19197,0,0,0,0,19198,0,0,0,0,0,0,0,0,0,0, 19202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19203,0,19205, 19210,0,0,0,19213,0,19218,0,0,0,19223,19229,0,0,19230,0,0,19231,19232,19233, 19239,0,0,0,0,0,19240,0,19248,19249,0,0,0,0,19254,0,19256,19258,19259,0,0, 19261,0,19266,0,0,0,19272,0,19278,19281,19282,0,0,0,0,0,0,0,0,0,0,0,0, 19283,0,0,19284,0,0,19285,19287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19288,19291, 0,19292,0,0,0,0,19297,0,19298,0,0,0,0,19302,19303,0,0,0,0,19304,19305,0, 0,0,0,19314,0,0,19315,0,0,19321,0,0,0,0,0,0,0,19322,0,19333,0,19334, 19335,0,19336,19337,0,0,0,0,0,0,0,0,0,0,0,19346,0,0,19353,0,19354,19362, 0,19366,19367,0,0,19369,0,19375,0,19377,19380,19388,0,0,0,0,0,19389,19390,0, 0,0,0,19392,0,0,0,0,0,19402,0,0,0,0,0,0,0,0,19412,0,0,19413,19422,0, 19424,0,0,0,19425,0,0,0,19428,0,0,0,0,19431,0,0,0,0,0,19432,0,0,0,0,0, 19448,19459,0,0,19461,0,19462,19463,0,19467,19474,19482,0,0,0,0,19494,0,0,0, 0,19501,0,0,0,0,0,0,0,0,0,0,19502,19504,0,0,0,0,0,0,0,19505,0,0,0,0, 19506,19507,0,0,0,19508,0,0,19511,0,0,19514,0,19515,0,19516,0,19518,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19530,0,19537,19538,0,19543,19546,0,19547, 19551,0,0,0,0,0,0,19552,19553,0,0,0,0,0,0,0,0,0,0,0,0,19555,0,0,19556, 0,0,0,0,0,0,0,0,0,0,0,0,19560,19561,0,0,19562,0,0,0,0,0,0,19565,19567, 0,19568,0,0,0,19569,19570,0,19578,0,0,0,0,19580,0,0,0,0,19581,19584,0,0, 0,0,0,0,0,19585,19586,0,0,0,19587,19588,0,19589,0,0,0,0,0,0,19592,19593, 19599,0,19600,0,0,19604,0,0,19605,0,19606,19608,19610,0,19613,19614,0,0,0,0, 0,0,19616,19617,0,0,19618,0,0,19619,0,0,0,19620,19621,19631,0,0,19632,19634, 19636,0,19643,0,0,19644,19658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,19659,0,0,0,0,0,0,0,0,0,0,0,19675,19677,0,0,0,0,19679,0,19683,0,19684, 0,0,0,0,0,0,19687,0,0,0,0,0,0,0,0,19688,19689,19692,0,0,0,0,0,0,0, 19695,19697,0,0,0,0,0,19698,19699,0,0,19700,0,19702,0,0,19703,0,0,0,0,0, 0,19704,19708,0,19710,0,19713,0,0,0,19715,0,0,0,0,19718,0,0,0,0,0,0,0, 19720,0,19722,0,0,19725,0,0,0,0,0,0,0,0,0,0,0,0,0,19730,0,0,0,0,0, 19731,0,19734,19735,19739,0,0,19740,0,19741,0,0,0,19746,0,0,19747,0,19771,0, 0,0,0,0,0,0,0,19772,19775,0,0,0,0,0,0,19778,0,0,0,0,0,19779,0,0,19780, 19790,0,19791,0,0,19792,0,0,0,19793,0,0,19796,19797,0,0,0,19799,0,0,0, 19801,0,0,0,0,19803,0,19804,0,19805,0,0,19807,0,0,0,19808,0,0,0,0,0,0, 19809,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19816,0,19821,0,19822,19830, 19831,0,0,0,19833,0,0,0,0,0,0,0,0,0,0,19838,0,0,0,0,19839,0,0,19843,0, 0,0,0,19845,0,0,0,0,19847,0,0,19848,0,19849,0,0,0,0,0,0,0,19851,0,0,0, 19854,0,0,0,0,0,0,0,0,0,19864,0,19865,0,19866,0,0,0,0,0,0,0,19868,0,0, 19870,0,0,19871,0,0,19872,19873,19875,0,19880,19882,19884,0,0,19885,19886, 19888,0,0,0,0,0,0,0,0,0,0,0,0,19890,19892,19893,0,0,19894,0,0,0,19895,0, 19896,19902,0,0,19903,0,0,19905,0,0,0,19906,0,19908,0,19909,19911,0,0,0, 19913,19920,0,19938,19939,19940,0,0,0,0,0,0,0,19942,0,19943,0,19945,0,0,0, 19951,19952,19954,19960,0,19965,0,19971,0,0,0,0,0,19975,0,19976,0,19990,0,0, 19991,0,19993,0,19995,0,0,0,19998,19999,20001,0,20003,20005,0,20011,20012,0, 0,0,0,0,0,20014,0,20020,0,0,0,0,20021,0,0,0,0,0,20023,20024,0,0,0,0,0, 20025,0,0,20027,0,0,20029,0,0,20032,0,0,0,0,20044,20045,0,20048,20049,0,0, 20050,0,20052,0,0,20054,20057,0,0,0,0,0,0,0,0,0,20059,0,0,20061,0,20062, 0,20064,0,0,20066,0,0,20067,0,0,0,0,20069,0,0,0,0,0,0,20070,20071,0,0,0, 0,0,0,0,0,0,0,0,20072,0,0,20073,20074,0,0,0,0,0,20075,0,20078,0,0,0,0, 20080,0,20081,0,0,0,0,0,0,20095,0,20098,0,0,0,0,0,0,0,20107,0,0,0,0,0, 0,0,0,20112,0,0,0,20113,20114,0,0,0,20115,20123,20124,0,0,0,20131,20133, 20134,0,0,0,0,20136,0,0,20137,20138,20150,0,20152,0,0,0,20153,0,0,20154,0, 0,0,20158,0,20163,0,0,20164,0,0,0,0,0,0,0,20166,0,20168,0,20170,0,20175, 0,0,20178,0,0,0,0,20223,0,0,0,0,20224,0,20226,0,0,20230,0,20231,0,0,0,0, 20232,0,0,20233,20234,0,20244,0,20247,0,0,0,0,0,0,20249,0,0,0,20250,0,0, 0,0,20251,0,20253,0,20254,0,0,0,0,20256,0,0,20264,0,0,0,0,20266,0,0,0, 20278,0,0,20279,20282,0,0,0,0,0,20283,0,20284,0,20285,0,20287,20290,0,0,0, 0,20292,0,0,0,0,20293,20297,0,0,0,0,0,0,20299,0,20300,20303,0,0,0,0,0,0, 20307,0,0,20308,0,20309,0,20310,0,0,0,0,0,0,20312,0,0,0,20314,0,0,0,0, 20315,20316,0,20322,0,0,0,0,0,0,20339,0,0,0,20342,0,0,0,0,20352,0,0,0,0, 0,0,0,0,0,0,20362,0,0,20365,0,20375,20377,0,0,0,0,0,0,0,0,0,0,0,20378, 20379,0,20380,0,0,20381,0,20382,0,20383,0,20388,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,20390,20392,20393,0,0,20395,0,0,0,0,0,20396,0,0,0,0,0,0,0,0,20398, 20415,0,0,0,20417,0,0,20420,0,0,20426,20428,0,20431,0,0,20432,0,20433,20434, 20435,0,0,0,0,20440,0,0,0,0,0,20442,0,20443,0,20446,0,0,0,0,20448,0, 20451,0,0,0,0,0,0,0,0,0,20452,20453,0,0,20454,0,0,0,0,0,0,20457,0,20458, 0,0,0,20465,0,0,0,0,0,20469,0,0,0,20473,0,20476,0,0,0,0,0,0,0,0,20477, 0,0,20485,0,0,20486,0,0,20487,0,20496,0,20497,0,0,20498,0,0,0,0,0,0,0,0, 0,0,20499,20500,0,20501,0,0,0,0,0,20520,20527,0,20529,0,0,0,0,20539,0,0, 20540,0,0,0,20543,0,0,0,20546,0,0,0,0,0,20548,0,0,20563,0,0,20564,0, 20566,0,0,0,0,0,20589,0,0,0,0,20590,0,0,20593,20594,0,0,0,0,20595,0, 20597,20598,0,0,0,20618,20620,0,0,0,0,20621,0,0,0,0,20627,0,0,0,0,0, 20628,0,0,0,20629,0,20630,0,0,20639,0,0,0,0,0,20707,0,0,20709,0,0,0, 20713,20714,0,0,0,0,0,20724,20725,0,0,0,0,20726,20728,20729,0,20733,0,20734, 0,20735,20736,0,20737,0,0,20744,0,20745,0,20748,0,0,20749,0,0,0,0,0,0,0, 0,20750,0,0,0,0,20754,0,0,0,20761,0,0,20763,0,0,0,0,0,0,0,20766,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,20767,0,0,0,0,20768,0,20769,20777,0,0,0,0,0,0, 20785,0,0,0,20786,20795,20801,0,20802,0,20807,0,0,20808,0,0,20810,0,0,20811, 0,20812,0,0,0,0,0,20813,0,0,20818,20820,20821,0,0,0,20822,0,20823,0,0,0, 20826,0,0,0,0,0,0,0,20829,20830,20831,0,20832,20836,0,0,20839,0,0,20840, 20842,0,20843,0,20844,0,20854,0,0,0,20855,0,0,0,0,20856,0,0,0,20869,0,0, 20871,0,0,0,0,0,0,0,20873,0,0,0,0,0,20876,0,0,0,0,0,20880,0,0,20882,0, 0,0,0,20883,20884,0,0,20890,0,0,0,0,0,0,0,0,0,20891,0,0,0,0,0,20905,0, 20906,20910,0,0,20912,20915,0,0,0,0,0,20916,0,20917,0,20919,20920,20922,0, 20927,0,20928,20929,20930,0,0,20935,0,0,20939,0,0,20941,0,0,0,20943,0,0,0, 20946,20947,0,0,0,0,0,20950,0,20954,0,0,20955,20964,0,0,20967,0,0,0,0,0, 20973,20975,0,0,0,20984,0,20987,20988,0,0,0,0,0,20989,0,0,0,20995,0,20998, 0,20999,0,0,0,0,21000,21001,0,0,0,0,21008,0,21010,0,21016,0,0,0,21017, 21018,0,0,0,0,0,21021,21026,21027,21028,0,0,21029,0,0,0,0,0,21030,0,0,0, 0,0,0,0,0,0,0,0,0,0,21031,21032,0,0,0,0,0,21037,0,0,21038,0,0,0,0,0, 0,0,0,0,21039,0,21041,0,21046,21047,0,0,0,21049,21053,0,0,21057,21064,21065, 0,0,21066,21067,0,0,0,21069,0,0,0,21071,21072,0,0,21073,0,21074,0,0,21078, 0,0,0,0,21079,0,0,21080,21081,0,0,21086,21087,0,21089,0,0,0,0,0,0,0, 21091,0,21093,0,21094,0,0,0,0,0,0,0,0,21095,0,0,0,0,0,21096,0,21098,0,0, 0,0,0,0,0,21099,0,0,21100,21101,21102,0,0,0,0,0,21103,0,21104,0,0,0,0,0, 21105,21108,21109,0,0,21112,21113,0,0,0,0,0,0,21115,21122,21123,0,0,0,0,0, 21125,0,0,0,0,0,0,0,0,21129,21131,0,0,21134,0,0,0,21137,21142,0,21143,0, 0,21144,0,21145,21146,0,21152,21154,21155,21156,0,0,0,21160,0,0,0,0,0,0, 21161,0,21164,0,21166,0,0,0,0,21170,0,0,0,0,21171,0,0,21172,0,21174,0, 21175,0,0,0,0,0,21176,21179,21188,0,0,0,21189,0,0,21190,0,0,0,21192,0,0, 21193,0,0,0,21198,0,21212,0,0,21213,0,0,0,0,0,0,21215,21216,0,0,21223, 21225,0,21226,0,0,0,0,21227,21228,0,0,21229,0,0,0,0,21230,21236,0,0,0,0, 0,0,0,0,0,0,0,0,0,21237,0,0,21238,21239,0,0,0,0,21256,0,0,0,0,0,21257, 0,0,0,0,0,0,0,21259,0,0,0,21263,0,21272,0,21274,0,21282,0,0,0,0,0,0,0, 0,21283,0,0,0,0,0,0,0,0,21294,0,0,21297,0,0,0,0,21298,0,0,0,21299,0, 21300,21302,0,21316,0,21318,21322,21323,0,21324,0,21326,0,0,0,21327,21328,0, 0,0,21352,0,0,21354,21361,0,0,0,0,0,0,0,0,0,0,0,0,0,21362,0,0,0,21363, 0,0,0,0,0,0,0,0,0,21366,0,0,21367,21372,21374,0,0,0,21375,21377,0,21378, 0,0,0,21380,0,0,0,0,0,0,0,0,0,0,21381,0,0,0,0,0,0,21382,0,21383,0,0, 21384,0,0,21385,0,0,0,0,21389,21390,0,0,0,0,0,0,0,0,0,0,0,0,0,21397, 21398,0,0,0,0,0,0,0,0,0,0,21399,0,21400,0,0,0,0,21402,0,0,0,21403,21404, 0,21405,21406,0,0,0,21407,0,0,0,0,0,0,0,0,0,0,0,0,21408,0,0,0,0,21409, 0,21421,0,21422,0,0,0,21425,21428,0,0,0,0,21429,0,0,0,0,0,21433,0,0,0,0, 0,0,0,0,0,0,21434,0,21443,0,21444,21449,0,21452,0,21453,21454,0,0,0,21457, 0,0,21458,0,0,0,21460,21461,0,0,21464,0,0,0,21473,21478,0,0,21479,0,0, 21481,21483,0,0,0,0,0,0,0,0,21484,0,0,21485,21486,0,0,21488,0,0,0,0,0,0, 21523,0,0,21525,0,0,0,0,0,0,0,21526,0,0,0,0,0,0,21529,21530,0,0,21531,0, 0,21533,0,0,21539,21564,0,21567,0,0,0,0,0,0,0,0,21575,0,0,0,0,21577,0,0, 0,0,0,21591,0,0,21604,0,0,0,0,0,0,0,0,0,21605,0,21606,0,0,21617,21618, 21619,21620,0,0,0,0,0,0,0,0,0,0,0,0,0,21623,0,0,0,0,21631,0,21635,0,0, 0,0,21639,21646,21653,21662,0,0,21663,21664,0,21666,0,0,21667,0,21670,21672, 21673,0,21674,21683,0,0,0,0,0,21684,0,21694,0,0,0,0,21695,21700,0,21703,0, 21704,0,0,21709,0,0,0,21710,0,0,0,0,0,0,0,0,21711,0,0,0,21712,0,21717,0, 21730,0,0,0,21731,21733,0,0,0,0,21737,21741,21742,0,21747,0,0,0,21749,0,0, 0,0,0,0,0,0,0,0,0,0,0,21750,0,0,0,0,0,21752,0,0,0,0,21753,0,0,0,0,0, 0,21755,21756,0,21757,0,0,0,0,0,0,21760,0,0,21763,0,0,0,0,0,0,0,0,0, 21764,0,0,21766,0,0,21767,0,0,0,0,0,0,0,0,0,21773,0,21774,0,0,21775,0,0, 0,0,21776,0,0,21777,0,0,0,0,0,0,0,0,0,21780,21787,21788,21791,0,0,0, 21797,0,0,0,0,0,21805,0,0,0,0,21806,0,21807,21809,0,21810,21811,0,21817, 21819,21820,0,21823,0,21824,0,0,21825,0,0,21826,21832,0,0,0,0,0,21833,21848, 21849,0,0,21867,21870,21871,21873,0,0,0,21874,0,0,0,0,0,0,0,0,0,21875,0, 21878,0,0,0,21879,0,21881,21886,0,0,0,0,21887,0,0,21888,21894,21895,21897,0, 21901,0,21904,0,0,21906,0,0,0,21909,21910,21911,0,0,21912,0,0,21913,21914, 21915,0,21919,0,0,0,0,0,0,0,21921,0,0,21922,21933,21939,0,0,0,0,0,0,0,0, 0,0,0,21944,0,0,0,0,0,21945,0,21947,0,0,0,0,0,0,0,0,0,0,21949,0,0,0, 21950,0,0,0,0,0,0,0,0,0,0,0,0,0,21951,0,21952,0,0,0,0,0,0,0,0,0, 21954,21957,0,0,0,0,21958,0,21959,0,0,0,0,0,0,21962,21963,0,0,0,0,0,0,0, 0,21964,21965,0,0,21969,21970,0,0,0,21974,0,0,21980,21981,0,21982,0,0,0,0, 0,21985,0,21988,0,21992,0,21999,0,0,0,0,0,0,22001,0,22002,0,0,0,0,0,0, 22003,0,0,0,0,0,22004,0,0,0,22008,0,22009,22015,0,0,22016,0,0,0,22017, 22019,0,0,0,0,0,0,0,0,0,22020,0,0,0,0,0,0,0,0,0,0,22021,22037,0,22039, 0,0,0,22040,0,0,0,22048,22049,0,0,22053,22055,22056,22059,0,0,22060,22061,0, 0,22064,0,0,0,0,22066,0,0,0,0,0,0,0,22073,0,0,0,22074,22075,0,0,0,0,0, 0,0,22076,0,0,0,0,22077,22084,22099,0,0,0,0,0,0,0,22104,0,0,22107,0, 22108,0,22109,0,22110,0,0,0,0,0,0,0,22111,22119,0,22120,22122,0,0,0,0, 22125,0,0,0,22128,22129,0,0,0,0,0,0,22141,0,0,0,22142,0,0,22144,22146,0, 22148,22149,22151,22154,0,0,0,22162,0,0,0,0,22164,22177,0,0,0,0,22179,0, 22182,22183,0,0,22184,22188,0,0,0,0,0,0,0,0,22190,0,22194,22201,0,0,22208, 0,22209,0,22212,0,0,22215,0,22223,22231,0,0,22232,0,22234,0,0,22235,22236,0, 22237,0,22240,0,0,0,0,0,22241,0,0,0,22242,22246,22247,0,0,0,22259,22268,0, 22269,0,0,0,0,0,0,0,22270,0,0,0,0,22271,0,22272,0,22277,0,0,0,0,0,22278, 22280,22283,22286,0,0,22287,22289,0,0,22290,0,22293,0,0,0,0,0,0,0,0,0,0, 22295,0,22301,22302,0,0,0,22305,0,22308,0,0,0,0,0,0,0,0,0,0,22315,0,0,0, 22317,0,22334,0,0,0,22335,0,0,0,0,0,22336,0,22338,22344,0,22347,22349,0, 22350,0,0,0,0,0,0,0,22357,0,0,0,0,0,22358,0,0,0,0,0,0,0,0,0,0,22359, 22360,0,0,0,0,0,0,0,0,22361,22366,0,0,22369,0,22370,22373,0,0,0,0,0, 22375,0,22377,0,0,0,0,0,22378,0,0,0,0,22381,0,0,0,0,22382,0,22383,0,0,0, 0,0,0,0,0,0,22391,0,0,22392,22395,22396,22402,0,0,0,0,0,0,0,0,0,0,0,0, 0,22405,0,0,22406,0,0,22408,0,0,22409,22410,0,0,0,0,0,0,22424,0,0,0,0, 22426,0,0,0,22427,0,22428,0,22432,0,22435,22442,22443,0,0,0,0,22444,0,0,0, 0,0,22446,0,22454,0,22455,0,0,0,22465,0,22470,0,22471,0,0,0,0,22472,22473, 0,22487,0,0,0,22488,0,0,0,0,22489,0,0,22499,0,0,0,0,0,0,22514,0,0,22515, 0,0,0,0,0,0,0,22516,0,0,0,22517,22520,0,0,0,22534,0,0,22535,0,0,22536,0, 22540,22553,0,22555,0,0,0,0,22561,0,0,22562,0,0,0,0,0,0,0,0,0,0,0,22566, 0,0,0,0,22567,22568,0,0,22575,0,22579,0,22582,22583,22585,0,0,0,0,0,22586, 0,0,22587,0,0,22590,0,0,0,0,0,22591,0,22592,0,0,0,0,0,22593,0,22602,0,0, 22604,0,0,22609,0,0,22618,0,0,0,0,0,0,22619,0,22624,22625,0,0,22638,0,0, 0,0,0,22639,0,0,22640,0,0,0,0,0,0,0,22644,0,22645,22647,0,0,0,0,22652, 22653,0,0,0,22654,0,22655,0,0,0,22656,0,0,0,0,0,0,0,0,0,0,22673,22675, 22676,0,0,22678,22679,0,22691,0,0,0,0,0,0,0,22693,0,0,22696,0,22699,22707, 22708,0,0,0,0,0,0,0,0,22718,0,22719,0,0,0,0,22723,0,0,0,22724,22725,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,22726,22728,0,0,0,0,0,0,0,0,22729,0,0,22731, 0,0,0,0,22732,22735,22736,0,0,0,0,22739,0,22749,0,0,22751,0,0,0,0,0,0,0, 0,0,0,0,22758,0,0,0,0,0,22760,0,0,0,0,0,22764,22765,22766,0,22768,0,0,0, 0,0,22769,22770,0,0,0,0,0,0,22771,0,0,22772,22775,0,22776,22777,22780,0,0, 22782,22784,0,22787,0,22789,22796,0,0,0,0,0,22798,0,0,0,0,0,0,22802,0, 22803,22804,0,0,0,0,0,0,0,0,0,0,22805,0,0,22810,22811,22814,22816,0,22825, 22826,0,22831,22833,0,0,0,0,0,0,0,0,0,22834,0,22836,22838,0,22839,0,0,0, 0,0,22840,0,22847,0,0,0,0,0,22856,22857,0,22858,22859,0,0,22862,0,0,22864, 0,0,0,0,22865,0,0,0,0,0,0,0,0,0,0,0,22866,0,22867,22868,0,0,0,0,22869, 0,22871,0,22872,0,22873,22881,22882,22884,22885,0,0,0,0,0,0,0,22886,22887,0, 22894,0,22895,0,0,0,22900,0,22901,0,0,0,0,22904,0,0,0,0,22905,22907,0,0, 0,22915,22917,0,0,22918,0,0,0,22920,0,0,0,22929,22930,0,0,0,22941,22942,0, 0,0,22943,0,0,0,22944,0,0,0,0,0,0,0,22946,0,22947,0,0,22954,0,22956,0,0, 22962,0,0,0,0,0,0,0,22963,0,0,22964,0,0,0,0,0,0,0,22965,0,22968,0,0,0, 22969,0,0,0,0,0,22970,0,22971,0,0,0,0,0,22978,0,0,22979,0,22987,0,0, 22989,0,0,0,0,0,0,22990,0,23005,0,0,0,0,0,0,0,23006,23007,23008,0,0, 23023,23024,23029,0,0,0,0,23030,0,0,0,0,0,23032,0,0,0,0,0,23035,0,0,0,0, 23038,0,0,0,23048,0,23049,23052,23053,23060,23061,0,23063,0,0,0,0,23067, 23068,0,0,0,23069,23073,0,0,0,23127,0,23128,0,0,0,0,0,23129,0,23138,23141, 0,23149,0,0,23150,0,0,0,23152,0,0,0,0,0,0,0,0,23154,0,0,0,0,23157,23159, 23160,0,0,0,0,0,0,0,0,0,0,0,0,23180,0,0,0,0,23181,0,0,23188,0,23189,0, 0,0,0,0,0,0,0,0,0,0,0,23195,0,0,23196,23199,0,0,0,0,0,0,0,0,0,23202, 0,23204,0,23207,0,23209,23210,0,0,0,0,0,0,23227,23229,0,0,23230,23234,23238, 0,0,0,23245,23246,23248,0,0,0,0,23249,23254,0,0,0,23265,0,0,0,0,0,0,0, 23268,0,23276,0,0,0,0,23277,0,23297,0,23298,0,0,0,0,23299,0,23302,0,0, 23303,23312,0,0,23314,0,23320,0,0,0,0,23324,0,23325,0,23328,0,23334,0,0,0, 23337,0,0,0,0,23343,23344,23346,0,23348,0,0,0,0,0,0,0,0,23353,0,0,0,0, 23355,0,23356,23358,0,0,0,23359,23360,0,23361,0,23367,0,23369,0,0,23373,0, 23378,23379,0,23382,23383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23387,0,0,0,0,0, 0,23388,23390,0,0,23393,23398,0,0,0,23399,0,0,0,23400,0,0,0,0,23401,0,0, 0,23415,0,0,0,0,0,0,0,0,23416,0,23422,0,23443,23444,0,0,0,0,23448,0, 23454,0,0,0,0,0,0,23456,0,0,23458,23464,0,0,0,0,0,0,23465,0,0,0,23470, 23471,0,0,23472,0,0,0,23473,23496,0,0,0,0,0,0,0,0,23497,0,23499,0,0, 23502,0,0,23503,0,0,23513,0,0,23515,0,0,0,23517,0,0,0,0,23518,23519,23521, 23524,0,23525,23528,23539,0,0,0,0,0,23541,0,0,23544,0,0,23556,0,0,23557,0, 0,0,0,0,0,0,0,0,0,0,0,0,23559,0,23560,0,0,23561,0,0,23566,0,0,0,0,0, 23568,23569,23570,0,0,0,0,23571,0,23574,0,0,0,0,0,0,0,0,0,0,0,23575,0, 23579,0,0,23581,0,0,0,0,0,0,23587,0,0,0,0,0,0,0,23596,23598,0,0,0,0, 23602,23606,0,0,23607,0,23608,0,0,0,23614,23616,0,0,0,0,0,23618,0,0,23619, 0,0,0,0,23621,23626,0,23627,0,0,0,0,0,0,0,23629,0,23630,0,0,0,0,23634,0, 23636,0,0,0,0,0,0,23638,0,0,0,0,23640,23667,0,23669,0,0,0,23681,0,0,0,0, 0,0,0,23682,0,23683,0,0,0,0,0,23684,0,0,0,23685,23689,0,23693,23694,23700, 0,23702,0,23709,0,0,0,0,0,0,0,23712,0,0,0,0,0,23714,0,0,23715,0,0,0,0, 23718,0,0,23720,0,0,0,0,23722,0,0,0,23726,23729,0,23741,23746,0,23748,0,0, 0,0,23749,0,0,0,0,0,23750,0,0,0,0,23751,0,23753,0,0,0,0,23757,23765,0,0, 0,23770,0,0,0,0,0,0,0,23771,0,23772,23781,0,0,23796,0,0,0,0,23798,0, 23799,0,0,0,23802,0,0,23806,0,23807,0,0,23808,0,23809,0,23819,0,0,0,23821, 0,23827,0,0,0,23829,0,0,0,0,0,0,0,23830,0,0,0,0,0,0,23832,23833,23834, 23835,0,0,0,0,23837,23838,0,0,0,0,0,23846,0,0,0,0,0,0,23847,0,0,0,0,0, 23879,23881,0,0,23882,23883,23895,0,23899,0,0,0,0,23901,0,0,0,0,0,0,23902, 0,0,0,0,0,23903,23905,0,23906,0,23907,23918,23919,23920,0,23922,0,23924,0, 23927,0,23934,0,23937,23941,0,23942,23946,0,0,0,0,0,23955,23956,23958,0,0,0, 0,0,0,23959,0,23962,23965,0,23966,0,0,0,0,23967,23968,0,0,23973,0,0,23974, 0,0,0,0,23975,0,23976,0,0,0,0,0,0,0,0,0,0,0,0,0,23977,0,0,0,0,0,0,0, 0,23980,0,0,23984,0,23985,0,0,23987,0,0,23988,23990,23991,0,0,0,0,0,0, 23992,0,0,0,0,0,0,0,0,23994,0,0,0,23998,0,0,0,0,0,0,0,0,0,23999,0,0, 24003,0,24004,0,24006,0,0,0,24007,0,0,24008,0,0,0,0,0,0,0,24009,0,0, 24010,0,0,24011,0,0,24013,24014,0,0,24015,24016,24027,0,24028,24029,0,24030, 0,0,0,0,0,24033,24034,0,24035,0,0,24036,0,0,24044,0,24048,24049,24063,24067, 0,24068,24070,0,0,24071,24078,24087,0,24090,0,0,0,24095,0,24098,24101,24104, 24106,0,24107,0,0,0,24108,0,0,0,0,24110,24111,0,24113,0,0,24115,24120,0,0, 0,0,0,0,24124,0,24125,0,24126,0,24127,0,0,0,0,0,24135,0,0,24136,0,24137, 24142,0,0,0,24146,0,0,24147,24149,24154,0,24163,0,0,0,24165,24166,24167,0,0, 0,0,0,0,0,0,0,0,24169,24170,24175,0,0,0,24178,0,0,24179,0,0,24181,0, 24184,24197,0,24201,24204,0,0,0,0,0,0,24206,24212,24220,0,0,0,24224,0,0,0, 0,0,0,0,0,24226,0,24234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24235,0, 24236,0,0,0,0,0,24239,24240,24241,0,0,24248,0,0,24249,0,24251,0,0,0,0,0, 0,24253,0,24268,0,0,0,24269,0,24271,24272,0,0,0,0,24273,0,0,24274,0,0, 24279,0,0,0,0,0,0,0,24280,0,24293,24294,0,0,0,0,0,0,24296,0,0,24323,0,0, 0,24329,24330,24331,24339,0,24351,0,0,24369,24370,0,0,0,24371,0,0,0,0,24372, 24373,24374,0,0,0,0,0,24378,0,0,0,0,24379,0,24381,0,24383,24389,0,24390,0, 0,24394,24395,24400,0,0,0,24401,24402,0,24406,0,0,0,24411,0,0,0,24415,0, 24416,0,0,0,0,0,24417,0,24419,0,24422,0,24423,24428,0,24435,0,0,0,24439,0, 0,0,24440,24442,24446,0,0,0,24447,24448,24449,24452,0,0,0,0,24453,24457,0,0, 24458,24459,24460,0,24465,0,0,0,0,0,0,0,24470,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,24471,0,24473,24474,24475,24476,0,24478,0,0,0,0,24480,0,0,0, 0,0,0,0,0,0,0,24481,0,0,0,0,0,0,0,0,0,0,24482,24485,0,0,0,0,24486,0, 0,0,24488,0,0,0,24494,0,0,0,0,24497,0,0,24498,0,0,0,24499,24506,0,0,0, 24507,0,0,24511,0,0,24513,24514,0,0,0,0,0,24517,0,24518,0,24520,0,24521, 24524,24525,0,0,0,0,0,24527,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24528,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,24537,24539,0,24540,0,0,0,24548,0,0,0,0,0, 24549,24550,0,0,0,24553,24554,0,24555,0,24556,0,24558,0,0,0,0,0,24560,0,0, 0,24561,0,0,0,0,0,24562,0,0,0,0,0,0,0,0,0,0,0,0,0,24567,0,0,0,0,0, 24569,0,0,0,24574,0,24575,0,0,0,0,0,0,0,0,0,0,0,24577,24581,0,24584,0,0, 0,0,0,24585,0,0,0,0,0,24586,0,0,24587,0,24588,0,0,0,0,0,0,0,0,0,0, 24590,24591,0,0,0,0,24592,0,0,0,0,0,0,0,24594,0,0,0,0,0,0,0,24596,24597, 0,0,0,0,24602,24603,0,0,0,0,24604,0,0,24605,0,24610,0,0,24611,0,0,0,0, 24612,24615,24616,24624,0,0,0,24627,0,24638,24639,0,0,0,0,24640,0,0,0,24655, 24656,24657,0,0,0,0,0,0,0,0,24662,0,24663,24664,0,0,0,0,0,24665,0,0,0,0, 24667,0,0,0,0,0,0,24668,24669,0,24670,24674,0,0,0,24675,0,24678,0,0,24679, 0,0,0,24681,0,24683,0,0,0,0,24684,0,24685,0,0,24686,0,0,24688,24689,0,0, 0,0,24690,24691,0,0,0,0,0,0,0,24697,0,24698,0,0,0,0,0,0,0,0,24709,0,0, 0,0,0,24710,0,24712,0,0,0,0,0,0,24713,24714,0,24715,0,24716,24718,0,24719, 0,0,0,0,24720,0,0,24725,0,0,24738,0,24749,24750,0,0,0,24752,0,0,0,24753, 0,0,0,24758,0,0,0,0,0,24762,0,24763,0,0,0,0,0,0,0,24764,0,0,0,0,0, 24765,24767,24768,0,24772,0,0,0,0,24773,0,0,0,0,24777,0,0,0,0,0,24785,0, 24786,24788,0,0,0,24789,0,0,0,0,24794,24798,0,24799,24800,0,0,0,24803,0, 24804,24806,0,24807,0,0,0,24810,0,0,0,0,0,0,24827,24828,0,24835,0,0,0,0, 0,0,24836,0,0,0,0,0,24839,0,24843,24844,0,0,0,0,0,0,0,0,0,0,24847,0,0, 24848,0,0,0,0,0,0,24849,0,24850,24851,0,0,0,24852,0,24853,0,0,0,0,0,0,0, 0,0,24854,0,24855,0,0,24868,0,0,0,24883,0,0,0,24884,0,24895,24897,0,0,0, 0,0,24899,0,0,0,0,0,24900,0,24913,0,0,0,0,0,0,24914,0,0,24917,24930, 24931,0,0,0,24932,0,0,24939,0,0,24942,0,0,0,0,0,0,0,0,0,24945,24950,0, 24951,0,0,24953,0,0,0,24954,0,24959,0,0,0,24961,0,0,24962,0,24964,24968, 24970,24972,0,0,0,0,0,24976,0,0,0,24977,0,24982,0,0,24983,0,0,24984,0,0, 0,24993,0,0,0,24994,0,0,25001,0,0,0,25003,0,0,25018,0,0,25023,0,0,0, 25034,0,0,25035,25036,0,25037,0,0,0,0,0,0,0,25039,0,0,0,0,0,25040,0,0,0, 0,0,0,0,25042,0,0,25043,25045,0,0,0,0,0,0,25049,0,0,25051,0,25052,25053, 0,0,25054,0,0,0,25055,0,0,0,0,25057,25059,0,0,25060,25064,0,25065,25069, 25070,0,0,0,0,25072,0,25073,0,25090,0,0,25092,25093,25101,0,0,0,0,0,0, 25105,25108,0,0,25113,0,0,25115,25116,0,0,0,0,0,0,25117,0,0,0,25120,25121, 0,0,0,0,0,0,0,25125,0,0,0,25126,0,25130,25134,0,25139,0,25143,0,0,0, 25151,0,25161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25163,0,0,0,0,0, 0,0,25174,0,25175,0,25207,0,0,0,25209,0,0,0,0,25213,0,25219,0,25223,0, 25225,0,0,0,25227,0,0,0,25228,0,0,0,25229,0,0,0,0,0,0,0,25231,25233,0,0, 0,0,25237,25239,0,0,0,25243,0,0,0,25252,0,25257,25258,0,0,0,0,25260,25265, 0,25268,0,0,25273,25324,0,25325,0,25326,0,0,0,0,0,0,0,0,25327,0,0,0,0,0, 25328,0,0,0,0,0,0,25332,0,0,0,25333,0,0,0,25336,25337,25338,0,0,25343,0, 25350,0,0,0,0,0,0,0,25352,0,25354,0,25375,0,25379,0,0,0,0,25384,0,0,0,0, 0,0,0,0,0,25386,0,25388,0,25390,0,0,25399,0,0,25401,0,0,0,25402,0,0,0, 25407,0,0,0,0,0,0,0,0,0,0,0,25413,25415,0,0,25417,0,0,0,0,0,0,0,25419, 0,0,0,25421,0,0,0,25424,0,0,0,0,25433,0,0,0,0,0,0,0,0,0,25435,0,0,0, 0,0,0,25436,0,0,0,25437,0,0,25440,0,0,0,0,0,0,25442,0,0,25443,0,25446,0, 0,25449,0,0,0,25450,0,0,0,0,25452,0,25453,25454,25455,0,0,0,25456,0,25457, 0,0,0,25459,0,25461,0,25468,0,0,0,0,0,0,0,0,25469,0,0,0,0,0,25471,0,0, 0,0,0,25474,0,0,0,0,0,0,0,0,25475,0,0,0,0,25477,0,0,0,0,25483,0,0,0, 0,0,25484,0,0,0,0,0,0,0,0,0,0,0,0,25485,0,25497,0,0,25498,0,25504,0, 25510,0,25512,0,0,25513,25514,0,0,0,0,0,0,25517,25518,25519,0,25520,0,0,0, 0,0,0,0,25521,0,25522,25527,25534,0,25536,0,25537,0,0,25548,25550,0,0,25551, 0,25552,0,0,0,0,0,25554,0,25555,0,25556,25557,25568,0,0,0,25570,25571,0,0, 0,0,0,0,25574,0,0,0,0,25579,0,0,0,25581,0,0,0,25582,0,0,0,0,0,0,0,0, 0,25588,0,0,0,0,25589,0,0,0,0,25590,0,25591,25592,25593,0,25594,0,0,0, 25596,0,25597,25615,0,0,0,0,0,25618,0,0,0,0,25619,25623,0,0,25629,0,0, 25631,0,0,0,25635,25636,0,0,25649,0,0,0,0,25654,0,0,0,25661,25663,0,0, 25671,0,0,25678,25698,0,25699,25702,25703,0,0,0,0,0,0,0,0,25704,0,0,0,0, 0,25706,0,0,25710,0,25711,0,25712,0,25715,25716,25717,0,0,25718,25728,25732, 0,0,0,25734,0,0,0,0,0,0,0,0,0,25737,0,0,25739,0,0,0,25740,0,25741,25745, 0,25746,0,25748,25772,25778,0,0,0,0,0,25780,0,0,0,0,25781,0,25782,25784, 25785,0,0,0,25789,0,0,0,0,0,0,25797,25801,0,0,0,25808,25809,0,0,25811, 25814,25815,0,0,25817,0,0,0,0,0,0,0,0,25820,0,0,0,0,25832,25833,0,0,0, 25846,0,0,0,25847,25848,0,0,0,0,0,0,0,0,0,25849,25850,0,0,25851,0,0, 25852,0,25862,0,0,0,25863,25865,0,0,0,0,0,0,0,25867,25868,0,25869,25874,0, 25875,0,25876,25877,0,0,0,0,25878,25902,0,0,0,0,0,0,0,25903,25904,25905,0, 0,0,25908,25909,0,0,0,0,25910,0,0,0,0,0,0,0,25912,0,25913,0,0,0,0,0,0, 0,0,25914,0,0,25916,0,0,0,0,0,25917,25927,0,0,0,0,25928,0,0,25930,0,0,0, 25933,0,0,25938,25942,0,0,0,0,0,0,0,25945,0,25950,0,25956,0,0,25961,25962, 0,0,25963,0,25964,25965,25966,0,0,0,0,0,25967,0,0,0,0,25968,0,0,0,25969, 25971,0,0,0,0,0,25973,25975,0,0,0,0,0,0,0,25978,0,25981,0,0,0,25982,0,0, 0,25984,0,0,0,0,0,0,0,25993,0,0,0,0,0,0,0,0,0,0,0,0,0,26002,0,0,0, 26005,0,0,0,26006,26007,0,0,26014,26015,26016,0,0,0,0,0,0,26017,26018,26020, 0,26022,26023,0,0,0,26024,26028,0,26029,26033,26034,26044,0,0,0,0,0,26046,0, 0,26047,0,0,26049,0,26050,0,26051,0,0,0,0,0,26053,0,0,0,0,26054,26059,0, 0,0,0,0,0,26060,0,26066,0,0,0,0,0,0,0,0,0,0,0,0,26067,0,26069,0,0, 26071,0,0,0,26073,0,26074,26077,0,0,0,0,26078,0,0,0,26079,0,26090,0,0, 26094,0,0,0,0,0,0,0,0,26095,0,0,0,0,0,0,0,0,0,0,0,26096,26101,0,26107, 26122,0,26124,0,0,26125,0,0,0,0,0,0,26136,26141,26155,0,0,0,0,0,0,0,0,0, 26164,26166,0,0,0,26167,0,26170,26171,0,0,26172,0,0,26174,0,0,0,0,0,0,0, 0,0,0,0,0,0,26175,0,0,0,26176,26177,0,26321,26322,0,26323,0,0,26324,0,0, 0,0,0,0,0,26325,0,26331,0,0,0,0,0,0,26335,0,0,0,26350,0,0,0,26379,0,0, 26382,26383,26385,0,0,26392,26406,0,0,0,0,26411,0,0,0,0,0,26412,0,0,26420, 0,0,26423,0,26424,26426,26432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26435,0, 26436,0,0,0,0,0,26441,0,26444,0,0,0,26446,0,0,0,0,26447,0,0,0,0,26449,0, 26450,26452,0,26453,26454,0,0,0,26455,0,0,0,26456,0,0,26458,0,0,26460,0, 26463,0,0,0,0,0,0,0,0,26464,26470,0,0,0,0,0,0,0,0,0,26473,0,0,26474,0, 0,0,0,0,0,0,26475,0,0,0,0,0,0,0,26477,0,26485,0,0,26486,0,26487,0,0, 26488,26493,26494,0,0,26495,0,26497,26504,26506,0,0,0,0,0,26507,0,0,0,0,0, 26509,0,0,26510,0,0,0,0,0,0,0,0,0,0,0,0,0,26512,0,26513,26515,0,0,0, 26518,0,0,0,26519,0,26524,26526,0,0,0,26527,0,26532,0,26533,26537,26558,0,0, 0,26559,0,0,0,26571,0,0,26573,0,26588,0,26593,0,0,0,0,0,0,26603,0,26604, 0,0,0,0,0,0,0,0,0,0,26606,0,0,0,0,0,0,0,26607,26609,26611,26614,0,0,0, 26616,26620,0,26621,0,0,0,0,0,26627,0,26629,0,0,26630,0,0,26632,26643,0,0, 0,26644,0,0,0,0,0,0,0,0,0,26646,26647,0,0,0,26650,0,0,26656,0,0,0,0, 26663,26670,26671,0,0,0,26685,26686,26687,0,26689,0,0,0,0,26744,0,26745,0, 26747,26748,0,26749,26750,26751,0,0,0,0,26752,26755,0,0,0,26756,26769,0,0,0, 26774,0,0,0,0,0,26775,0,26777,26778,0,26786,0,0,0,26787,0,0,0,0,0,0,0,0, 0,0,0,0,0,26788,0,0,26789,0,0,0,0,0,26791,0,26792,26793,0,0,0,26794,0, 26797,26798,0,0,0,26800,0,0,26803,0,26804,0,0,0,0,0,0,0,0,0,26805,0,0, 26808,0,0,26809,0,0,0,0,0,0,0,26812,0,26825,0,0,0,0,0,0,0,26826,0,0, 26827,26829,26834,0,0,0,0,26835,0,0,26849,0,26851,0,0,0,0,0,0,0,0,0, 26852,0,26853,26857,0,26858,0,26859,0,0,0,0,0,0,0,26876,0,26878,26882,26883, 0,0,0,0,26890,26894,0,0,0,0,26895,26896,0,0,0,0,0,26900,0,0,0,0,0,0,0, 26911,26913,26914,26915,26916,26919,0,0,0,26921,26922,0,0,26925,0,0,0,26928, 0,0,26929,26930,0,0,0,26931,0,26932,0,0,0,0,0,26933,0,0,0,0,0,0,26937,0, 0,26943,0,0,26944,0,0,0,26946,0,0,0,0,0,0,0,26956,0,26958,0,0,26963,0,0, 0,0,0,0,0,26965,0,26969,26970,26972,0,0,0,0,0,26973,0,26974,0,26978,0, 26980,0,0,0,0,0,0,26982,0,26986,26987,0,26990,0,0,0,0,27003,27006,0,0, 27007,27010,27012,27013,0,0,0,0,0,0,0,0,27014,27015,27018,0,27019,0,0,0,0, 0,27025,0,0,0,27026,0,0,0,0,27029,27030,27031,27034,0,0,27036,27037,0,0,0, 27038,27042,0,0,0,27044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27045,0,0,0,0,0, 0,0,27046,0,0,0,0,0,0,0,27047,27049,0,27050,0,0,0,27051,27052,0,27055,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27056,27058,27059,0,27061,0,27064, 0,0,0,0,0,27069,0,0,27070,0,0,0,0,0,0,0,27072,0,0,0,0,0,0,0,0,27076, 0,0,0,0,0,27078,0,27079,0,0,0,27081,0,0,0,0,0,0,27082,0,27083,27086,0,0, 0,0,27087,0,0,0,0,0,27088,27090,0,27094,0,0,27095,0,27099,27102,0,0,0, 27103,0,0,0,0,27105,0,0,0,27106,0,0,0,0,0,0,27107,0,0,0,0,27108,27117,0, 0,0,0,27118,0,0,27124,0,27126,0,0,27130,27131,0,0,0,0,0,0,27147,0,0,0,0, 27148,27149,0,0,0,0,27150,27151,0,27152,0,27159,0,0,0,27164,0,0,0,0,0,0, 0,27175,0,27189,0,0,27191,0,27193,0,27195,0,27198,0,0,0,0,0,27200,0,0,0, 0,27202,0,0,0,0,27203,0,0,27204,0,0,27206,0,27207,0,0,0,0,27209,0,0,0, 27213,0,0,27216,27219,27220,27222,27223,0,27224,0,27225,27226,0,0,27233,0,0, 0,0,27235,0,27237,0,27238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27239,0,27242, 27243,0,27250,0,0,0,27251,0,27253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,27254,27255,27258,0,0,0,27259,0,0,0,0,0,0,27267,0,27276,27278,0, 0,0,0,0,0,0,0,0,27296,27297,27301,0,0,0,0,0,0,27302,0,0,0,0,0,0,27312, 27313,0,0,0,0,0,27318,0,27320,0,27329,0,27330,27331,0,27332,0,0,0,0,27340, 0,0,0,27348,0,0,0,0,0,0,27350,0,27351,0,0,0,0,27355,0,0,27358,27359, 27361,0,0,0,27365,0,27367,0,27376,27378,0,0,27379,0,0,0,0,0,0,27396,0, 27397,27404,0,0,0,0,0,27408,0,0,0,0,27453,0,0,0,27456,0,0,0,27458,0,0,0, 0,0,0,0,27459,0,0,0,27460,0,0,27461,0,27465,27467,0,0,27469,0,27470,0, 27471,0,27477,27482,0,0,0,0,0,0,27484,0,0,0,0,0,0,27485,0,0,0,0,0,27493, 0,27494,27502,0,0,0,0,0,0,0,0,0,0,0,0,27511,27532,0,0,0,27533,27545,0,0, 0,27546,0,0,0,0,0,0,0,0,0,0,27547,0,0,27549,27550,0,27551,0,0,0,0,0,0, 0,27555,0,0,27571,0,27573,27574,27575,27577,0,27578,0,0,27579,27585,0,0,0,0, 0,27586,0,0,27588,27589,0,0,0,0,27596,0,0,27600,0,0,0,0,0,0,0,0,0,0,0, 27608,0,0,0,0,0,0,0,0,0,0,0,27610,0,0,0,27618,0,0,27620,0,0,0,27631,0, 0,27632,27634,0,27636,27638,0,0,0,27643,0,27644,27649,0,0,0,0,0,0,0,0,0, 0,0,0,0,27651,27660,0,27661,0,0,0,0,0,0,0,27662,0,0,27664,0,27665,0,0,0, 27669,0,27671,0,0,0,27673,27674,0,0,0,27682,0,0,0,27711,0,27712,27713,27719, 27720,0,0,27728,0,27729,0,0,0,0,0,0,0,0,0,27731,0,0,27732,0,27733,0, 27738,0,0,0,27742,0,0,0,27743,27744,0,0,0,0,0,0,27745,27746,0,0,0,27747, 27748,27751,27752,0,0,0,27768,27770,0,0,0,27774,27775,0,27776,27777,0,0, 27781,0,27784,0,27786,0,0,27791,0,27792,27793,27804,0,27812,27813,0,0,0,0,0, 0,0,0,27814,0,27825,0,27827,0,0,0,0,27828,27861,27862,0,0,0,27864,0,0,0, 27865,27884,0,27889,0,0,0,0,0,27890,0,27891,0,0,0,27892,0,0,0,0,0,27897, 27898,0,0,27899,0,0,0,27901,27905,0,0,27920,0,0,27921,0,27922,0,0,0,27931, 27934,0,0,0,0,0,0,0,0,0,0,27941,0,27942,0,27945,0,27947,27954,0,0,0,0, 27960,27963,0,0,0,0,0,0,0,0,27964,27965,0,0,0,27967,0,27969,27975,0,27976, 27977,0,27981,0,27983,28051,28052,0,0,0,0,0,28056,0,0,0,0,0,0,28058,28059, 0,0,28061,0,0,0,0,0,0,0,28063,0,0,0,0,0,0,28066,0,0,0,0,0,0,28069, 28070,28072,0,28073,0,0,28074,0,0,0,0,28075,0,0,0,0,0,0,0,28078,0,0,0,0, 28085,0,0,0,0,28086,0,0,0,0,0,0,28088,0,0,0,0,0,0,0,0,28090,0,28097, 28114,28115,0,0,0,0,0,0,0,28116,0,0,0,0,0,28118,0,28129,0,28131,0,0, 28135,0,0,0,28140,28141,0,0,0,28146,0,0,0,0,28152,0,0,0,0,28155,28157, 28161,0,0,0,0,28166,0,28167,0,0,0,0,0,0,0,0,0,0,0,28172,0,0,0,0,0,0, 28173,0,0,28175,0,0,0,0,0,0,0,0,0,28178,28188,0,28190,0,0,0,0,0,28191,0, 28193,28206,0,0,28207,28209,0,28211,0,28213,0,0,0,28215,28216,28217,0,28222, 0,28223,28225,0,0,0,28226,0,28227,28229,28232,0,0,0,0,0,0,0,0,0,28235,0, 28241,0,0,28242,0,0,0,0,28243,0,0,0,28245,0,0,0,28248,28250,0,28251,28252, 0,0,0,0,0,0,28253,0,0,28254,28255,0,0,28256,0,0,28258,0,0,0,0,0,28259,0, 0,28260,0,0,28261,0,0,0,0,28262,28263,0,0,28264,0,0,0,28266,0,28268,28269, 0,28270,28272,28274,0,28277,28278,0,0,0,28279,0,28280,28281,28283,0,28292,0, 28294,0,28297,0,0,0,0,28299,0,0,0,0,0,28300,0,0,0,0,0,0,0,28301,0,0,0, 0,0,0,0,0,0,0,0,0,0,28302,28303,0,0,0,0,28304,0,0,28305,0,28312,0,28313, 28314,0,0,0,0,0,0,28315,0,0,0,28320,28321,0,0,28328,0,0,0,28329,28338,0, 28339,0,0,28344,0,0,0,0,0,0,0,0,28347,0,0,0,0,0,0,0,0,28348,0,0,0,0, 0,28411,0,28412,28413,0,28416,0,0,0,28420,0,0,0,0,0,28421,0,0,0,0,28423, 0,0,0,28424,0,0,28428,0,0,0,0,0,28429,0,0,0,28431,28434,0,28458,0,0,0,0, 0,0,0,0,0,0,0,28464,0,0,0,0,28465,0,28467,0,0,0,0,0,0,28471,0,0,0,0, 28474,0,28480,0,28481,0,0,28485,0,0,0,0,28486,28488,0,0,28489,0,0,0,0, 28492,0,0,0,28495,0,28497,0,28499,0,0,0,0,28500,0,0,28502,28503,0,0,0, 28508,0,0,0,28510,0,0,28512,28513,28514,28521,0,28526,0,28527,28528,0,0,0,0, 28529,0,0,28532,0,0,28537,28538,0,0,0,28539,0,28548,0,28553,28554,0,0,0,0, 0,0,0,0,0,0,0,0,28560,28563,0,0,28564,0,0,0,0,28565,0,0,0,0,0,0,0, 28566,28568,0,0,0,0,0,0,28569,0,0,0,28570,0,28572,28573,0,0,0,0,28575,0, 0,0,0,28576,28581,28588,0,0,28589,0,0,0,28590,28595,0,28598,0,0,28601,0,0, 28605,0,0,0,0,28614,28615,28619,0,0,0,0,0,0,28620,0,28626,0,0,28628,0, 28631,0,28632,0,0,0,0,0,0,28635,0,0,0,28637,28638,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,28639,0,28643,0,0,28652,0,0,0,28662,0,28670,28671, 0,0,0,0,0,0,0,0,0,28672,28673,28675,28676,0,0,0,0,0,0,0,28691,0,0,0, 28695,0,0,0,28696,0,28697,28698,0,28705,0,28707,28708,28710,0,0,0,0,0,0,0, 28711,28728,0,0,0,28736,0,0,0,28737,0,0,0,0,0,0,0,0,0,28738,0,28739,0, 28741,0,0,28742,0,0,0,0,0,0,0,0,0,0,0,28745,0,0,0,0,0,0,28749,28750, 28752,28754,28756,0,28757,0,0,0,0,28759,28760,0,0,0,0,0,0,28762,0,0,0, 28764,0,0,0,0,0,0,28766,0,28767,28768,0,0,0,0,28769,28770,0,0,0,0,0,0,0, 0,0,0,0,0,0,28771,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28772,0,28773,0, 28782,0,0,0,0,0,0,28784,0,28785,0,28786,0,0,0,28787,0,0,0,28797,0,0,0,0, 0,0,28799,0,0,28801,0,0,0,0,28802,0,28805,0,0,28806,0,0,28807,0,0,0,0,0, 0,0,28808,0,0,0,0,0,28810,28812,0,0,28816,28819,0,0,28821,0,28826,0,0,0, 28842,28852,0,0,28853,0,28854,28855,0,0,0,28857,0,0,0,28858,0,28867,28868, 28869,0,0,0,28874,28880,28882,28890,28892,0,0,0,0,0,0,0,28895,0,0,0,28898, 28899,0,0,0,28900,0,0,28904,0,28906,0,0,0,0,28907,0,0,0,0,0,0,28908,0,0, 0,28910,0,28914,0,0,0,0,0,0,0,28915,28916,28919,0,0,28920,0,28921,0,0,0, 0,0,0,0,0,28924,0,0,0,0,28926,28929,0,0,0,28930,0,28936,0,28939,0,0,0,0, 28942,0,0,0,0,0,0,28956,0,0,0,28966,0,0,0,0,28967,0,0,0,0,0,0,0,0,0, 28968,0,28971,0,28975,28976,0,28982,28983,0,0,28984,28989,28996,28997,28998,0, 0,0,0,0,0,28999,0,0,0,0,0,29000,0,29001,0,0,0,29009,0,0,29011,0,0,29021, 0,0,0,0,29024,0,29025,0,0,0,0,0,29026,0,0,0,29036,0,0,0,29037,0,0,0,0, 29038,0,29045,0,29047,0,0,0,0,0,0,0,0,0,29051,0,0,0,29054,29056,29062,0, 29070,29082,0,0,0,29083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29084,0,0,0, 0,29085,29088,0,0,0,0,0,0,0,29090,29097,0,0,0,29103,0,0,0,0,0,0,0,0, 29105,0,0,0,0,0,29107,0,29109,0,0,0,29115,0,0,29120,0,0,29138,29140,0,0, 0,0,0,0,0,0,0,29152,0,29160,29174,0,29176,0,0,29180,0,29181,0,0,0,0,0,0, 0,0,29228,0,0,29229,0,0,29230,0,0,0,0,0,0,0,0,0,0,29234,0,0,0,29241,0, 29245,0,29248,0,29250,29256,29280,0,29282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 29285,0,0,29286,29291,29292,0,0,0,0,29294,0,29295,0,0,0,0,0,29296,29297, 29298,29300,0,29302,0,0,29304,29307,0,29312,0,0,0,29322,0,0,29323,0,0,29324, 29326,29328,0,29335,0,0,0,0,0,0,0,29338,29339,0,0,0,0,0,29341,29343,0,0, 0,0,29344,0,0,0,0,0,29345,0,0,0,0,29346,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,29347,29348,29349,0,0,29354,0,0,29355,0,0,0,0,0,0,0,0,29357,0,0,0,0, 29364,0,29365,0,0,0,0,0,0,0,29366,0,0,29368,0,0,0,0,0,0,0,0,29378,0, 29381,0,0,0,0,0,0,0,0,29386,0,0,0,0,0,0,29389,0,0,0,29390,0,0,29391, 29397,0,29398,29412,29414,29418,29419,0,0,0,0,0,0,0,29420,0,0,0,0,0,0,0, 29423,0,0,0,29435,0,0,0,29437,0,0,29439,0,29441,0,0,0,0,29443,0,29446, 29450,29452,0,0,0,0,0,29456,0,0,0,0,0,29461,0,0,0,29464,0,0,0,0,0,0,0, 0,29468,0,29473,0,0,0,29486,0,0,0,29490,0,0,0,29491,29492,0,0,29497,0,0, 0,29498,0,29499,0,29502,29505,0,29509,0,0,0,29510,0,0,0,29512,0,0,0,29516, 0,0,0,0,0,0,0,0,29518,0,29519,0,0,0,0,0,29520,29521,29529,0,0,0,0,0,0, 0,0,29530,0,0,29531,29538,0,29540,0,0,0,29542,0,29543,29544,29547,0,0,29548, 0,0,0,29549,0,0,0,29550,0,0,29552,0,0,0,0,29558,29561,0,29562,29564,0,0, 29565,0,0,29566,0,0,0,0,0,0,0,0,0,0,29578,29584,29586,29591,0,0,0,0, 29593,29594,0,0,29597,0,0,29613,0,29614,0,29615,0,0,0,0,29616,29617,0,0, 29625,0,0,0,29632,0,0,0,0,0,0,0,29633,0,0,0,0,0,29634,29635,29637,0, 29638,0,29641,29643,0,0,0,0,0,0,29644,0,29645,0,29649,0,0,0,29650,0,29653, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,29656,29659,0,0,29660,0,0,0,29661,0,0,0, 0,0,29664,0,0,0,29671,29673,0,0,0,0,0,0,0,29675,0,29677,29679,0,0,29684, 0,0,0,0,0,29685,0,0,0,29687,0,0,0,29688,0,29689,29690,29700,0,29701,0,0, 0,29702,0,29706,0,0,0,0,0,0,0,29720,0,29721,0,29727,0,29733,29734,0,29750, 29761,0,29763,0,0,0,0,0,29764,0,0,29765,0,0,0,29771,0,0,0,0,0,0,0,0,0, 0,0,0,29772,0,0,0,29773,29774,29775,0,0,0,0,0,0,0,0,0,0,0,29822,0,0,0, 29824,0,29825,0,0,0,0,0,29827,0,0,0,0,0,0,0,0,29829,0,29832,29834,0,0, 29835,0,0,29837,29838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29843,0,0, 0,0,29844,29845,0,0,0,0,0,0,0,0,0,29849,0,0,29869,29872,29890,29905,0,0, 0,0,0,29907,29921,0,29922,0,0,29923,29926,29944,29946,0,0,0,0,0,0,0,29947, 29948,0,0,0,29951,0,0,0,0,0,29953,0,0,29956,0,29957,0,0,29962,0,0,0,0, 29971,0,0,0,29972,0,0,0,0,0,29978,0,29979,29992,30007,30008,30010,0,0,0, 30013,0,0,0,0,30014,30016,0,0,0,0,0,0,0,0,0,0,0,30017,0,0,0,0,0,30023, 30031,0,0,30033,0,0,0,0,0,0,0,0,0,0,30034,0,30038,0,30039,0,30040,0,0,0, 0,0,0,30067,30068,0,0,0,30069,0,30072,0,0,0,30073,0,0,0,0,30075,0,0,0,0, 0,0,30079,0,0,30080,0,0,0,0,0,30082,0,0,0,0,0,0,0,0,0,0,0,30084,30090, 0,0,30091,0,0,0,0,30098,30118,0,30119,0,30121,30130,0,0,0,0,0,0,0,0,0,0, 0,0,0,30131,30132,30133,0,0,0,0,0,0,30135,0,0,0,0,0,0,0,0,0,0,0,30136, 0,0,30137,30138,0,0,0,30139,30146,0,0,0,0,0,30147,0,0,30148,30151,0,0,0, 30168,0,30172,30173,0,0,0,0,0,0,0,0,30180,30181,0,30192,0,0,0,0,0,0,0, 30194,30196,0,0,30199,0,0,30202,0,0,0,0,30203,0,0,0,0,0,0,0,0,0,0,30213, 0,0,0,30216,0,0,30217,0,0,0,30218,0,0,0,0,30219,0,30220,0,30222,30227,0, 0,0,0,0,30231,0,0,30233,30235,0,0,0,0,30238,0,30240,30243,30245,0,30250, 30252,0,0,0,30269,0,0,30271,30272,0,0,0,30278,30280,0,0,30282,0,30284,0, 30294,0,0,0,0,30295,30296,0,0,0,0,0,30298,30299,30302,30304,30306,0,0,0,0, 0,0,30316,30317,0,0,0,30318,0,0,0,30319,0,30320,30322,30326,0,0,0,0,0, 30327,0,30332,30348,30349,0,0,30356,0,0,0,0,0,0,0,0,30357,0,30358,0,30359, 30360,0,0,30365,30366,30378,0,0,0,0,30379,0,0,30381,0,30385,0,30388,30397,0, 0,0,30401,0,0,0,0,30403,0,0,0,0,0,30404,0,0,30405,0,30406,30408,0,30409, 0,30410,0,0,0,30417,0,0,30418,30419,0,30420,0,30424,0,0,0,30427,30430,30432, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30433,0,0,0,0,0,0,0,30436,0, 30437,30438,0,30441,30442,0,0,0,30445,0,0,0,0,30452,30456,30457,0,0,0,30458, 0,30464,0,0,0,0,0,0,30467,0,30469,0,0,0,0,0,30477,0,0,30484,0,0,0,0,0, 30485,0,0,0,0,0,30486,30487,30497,30498,0,0,0,0,0,0,0,0,0,0,30505,0, 30508,0,0,0,30509,30510,0,30514,30516,0,0,0,0,0,0,0,0,0,0,0,30523,0, 30524,0,30525,0,0,0,0,30537,0,0,30538,0,0,0,0,0,30553,0,0,30555,30556, 30558,30559,30560,0,0,30561,0,30562,0,0,0,0,0,0,0,0,30563,30570,30571,0, 30586,30587,0,0,30590,0,0,30594,0,0,0,0,30611,30612,30623,30634,0,0,30636, 30640,30655,30656,0,30657,0,0,30658,30669,0,30670,0,30676,30678,0,0,0,0,0,0, 0,30679,0,0,0,0,0,0,0,0,0,0,0,30695,0,0,30698,0,0,0,0,30700,0,0,0,0, 30701,0,30702,30703,0,0,0,0,30707,0,0,0,30709,0,0,30710,30719,30729,0,0,0, 0,0,0,0,0,0,30731,0,0,30733,0,0,0,30734,0,0,0,0,0,30736,30737,0,0,0, 30740,0,0,0,30743,0,30746,0,30747,30748,0,0,30751,30752,30753,0,0,0,30754,0, 0,30760,0,0,0,0,0,0,0,30763,0,30764,0,0,30766,0,30769,30770,30771,30774, 30777,0,0,30779,30780,30781,0,0,0,0,30790,0,0,0,30792,0,0,0,0,30810,0,0, 0,0,0,0,0,30812,30819,0,0,30823,30824,0,30825,0,30827,0,0,0,0,0,0,30828, 0,0,30830,0,0,0,30834,0,30835,0,30837,30838,0,30845,0,0,0,0,0,30846,30847, 0,0,30849,0,30851,0,0,0,0,0,30852,30858,0,0,30859,0,30865,0,0,30866,0,0, 30868,0,0,30869,0,0,0,30881,30883,0,0,0,0,0,30889,0,30891,0,0,0,0,30894, 0,30895,0,30897,0,30898,0,0,0,30904,30906,0,30909,0,0,0,0,0,0,30910,0,0, 0,30915,30933,30942,0,0,0,0,30943,0,0,30945,0,0,0,0,0,0,30946,0,0,30947, 0,0,30955,30956,0,0,30960,0,0,30961,30962,30966,0,0,30969,30974,0,0,0,30976, 0,0,30977,0,30978,30982,0,0,0,0,0,0,0,30994,30995,30998,0,31000,0,0,31001, 0,0,31003,31005,0,0,31006,31011,0,0,31014,0,31016,0,0,0,0,31018,0,0,31020, 31023,31024,31025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31027,31028,31029,0,0,0,0, 0,0,31032,0,0,0,0,0,0,0,0,0,0,0,31036,31037,31038,0,0,0,31041,31043, 31045,0,31047,0,0,0,31048,0,31049,0,0,0,31053,31054,31055,0,0,31063,0,0,0, 0,0,31066,0,31068,31071,0,0,0,31072,31073,0,0,0,0,31075,0,0,31076,0,0,0, 31077,31079,0,31080,0,0,0,0,0,0,0,0,0,0,31087,0,31142,0,31144,0,0,31145, 31146,31147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31149,0,31151,31152,0,0,0,0,0, 0,0,31162,31171,31174,31175,0,0,0,31176,0,0,0,0,0,0,0,31179,0,0,0,31186, 0,0,0,31192,31195,0,0,31196,0,0,0,0,0,0,0,0,31198,0,0,0,0,0,31199,0,0, 0,31205,0,0,0,0,31211,31215,0,0,0,0,31231,0,31232,0,0,0,0,0,0,0,0,0,0, 31233,31236,31253,0,31254,0,0,0,0,0,0,31255,0,0,31257,0,0,0,0,0,0,0,0,0, 31258,31259,0,0,31260,0,31261,0,0,0,0,0,31262,31263,0,0,31264,0,31266,0, 31267,0,0,0,0,0,31281,0,31282,0,31284,0,0,31285,31287,31288,0,0,31290,0,0, 0,31292,31295,0,31299,0,31300,0,0,0,0,0,31302,0,0,0,0,31303,0,0,0,0,0,0, 31304,0,0,0,0,0,31305,31308,31309,31315,0,31317,0,0,0,0,0,31323,0,31324,0, 0,0,0,0,31325,31327,0,0,31331,0,0,0,0,0,31333,0,0,0,0,0,31336,0,0,31337, 0,0,0,0,0,0,31338,0,0,0,0,0,0,0,0,0,0,0,0,31339,0,0,0,0,0,0,0,31342, 0,0,0,0,31345,0,0,0,0,0,0,0,0,31347,0,0,0,0,0,0,31348,0,0,31350,31351, 0,31352,0,0,31354,0,0,0,0,31355,0,0,31356,0,0,0,0,0,0,0,0,0,0,31363,0, 31372,0,0,31373,0,0,0,0,0,0,0,0,0,31376,0,31388,0,31389,0,31392,0,31401, 0,31405,31407,31408,0,31409,0,0,0,0,0,0,31413,31415,0,0,0,31416,31418,0,0, 0,0,0,0,31422,31423,0,0,31424,0,31425,31432,0,0,0,0,0,0,0,0,0,31433,0,0, 0,0,0,0,0,0,31434,0,0,0,0,0,0,31435,0,0,0,0,31438,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,31442,0,31444,0,31448,0,0,31451,0,0,0,0,31452,0,31461, 31465,0,0,31466,0,0,31467,0,0,31468,0,0,0,31469,31473,0,31476,0,0,0,0, 31489,31490,0,0,0,0,0,0,0,31492,31493,31494,0,0,0,0,31501,31504,31505,0,0, 0,0,0,0,0,0,0,31509,0,0,0,0,31510,0,0,31511,0,0,31513,0,0,0,0,0,0,0, 0,0,31514,0,31522,31536,31539,31540,0,31541,0,0,0,0,0,0,31546,31553,31559,0, 0,0,31560,31561,31562,0,0,31564,31567,0,31569,0,0,0,31570,0,0,0,0,31571,0, 0,0,0,0,0,31572,31574,31580,31581,0,0,31582,31584,31585,31586,31595,0,31596, 0,0,0,0,31597,0,31599,0,31600,31601,0,0,31603,31604,0,0,31608,31610,0,0,0, 31611,0,31615,0,0,0,0,31616,0,0,0,0,0,0,31617,0,0,0,0,0,31618,0,0,0,0, 0,0,31621,0,0,0,0,0,0,0,0,0,31622,31625,0,0,0,0,31627,0,31641,0,0,31642, 0,0,31643,0,0,0,0,0,0,0,0,0,31644,0,31646,0,0,0,0,31648,0,0,0,31652,0, 0,0,31657,0,0,31676,0,0,0,0,0,0,0,31689,31691,31692,0,31694,0,0,0,31696, 0,31702,0,31703,0]; #[derive(Clone,Copy)] #[repr(C)] pub struct DictWord { pub l: u8, pub t: u8, pub i: u16, } impl DictWord { #[inline(always)] pub fn len(self) -> u8 { self.l } #[inline(always)] pub fn transform(self) -> u8 { self.t } #[inline(always)] pub fn idx(self) -> u16 { self.i } } type D=DictWord; pub static kStaticDictionaryWords: [DictWord; 31705] = [ D{l:0,t:0,i:0}, D{l:8,t:0,i:1002}, D{l:136,t:0,i:1015}, D{l:4,t:0,i:683}, D{l:4,t:10,i:325}, D{l:138,t:10,i:125}, D{l:7,t:11,i:572}, D{l:9,t:11,i:592}, D{l:11,t:11,i:680}, D{l:11,t:11,i:842}, D{l:11,t:11,i:924}, D{l:12,t:11,i:356}, D{l:12,t:11,i:550}, D{l:13,t:11,i:317}, D{l:13,t:11,i:370}, D{l:13,t:11,i:469}, D{l:13,t:11,i:471}, D{l:14,t:11,i:397}, D{l:18,t:11,i:69}, D{l:146,t:11,i:145}, D{l:134,t:0,i:1265}, D{l:136,t:11,i:534}, D{l:134,t:0,i:1431}, D{l:11,t:0,i:138}, D{l:140,t:0,i:40}, D{l:4,t:0,i:155}, D{l:7,t:0,i:1689}, D{l:4,t:10,i:718}, D{l:135,t:10,i:1216}, D{l:4,t:0,i:245}, D{l:5,t:0,i:151}, D{l:5,t:0,i:741}, D{l:6,t:0,i:1147}, D{l:7,t:0,i:498}, D{l:7,t:0,i:870}, D{l:7,t:0,i:1542}, D{l:12,t:0,i:213}, D{l:14,t:0,i:36}, D{l:14,t:0,i:391}, D{l:17,t:0,i:111}, D{l:18,t:0,i:6}, D{l:18,t:0,i:46}, D{l:18,t:0,i:151}, D{l:19,t:0,i:36}, D{l:20,t:0,i:32}, D{l:20,t:0,i:56}, D{l:20,t:0,i:69}, D{l:20,t:0,i:102}, D{l:21,t:0,i:4}, D{l:22,t:0,i:8}, D{l:22,t:0,i:10}, D{l:22,t:0,i:14}, D{l:150,t:0,i:31}, D{l:4,t:0,i:624}, D{l:135,t:0,i:1752}, D{l:5,t:10,i:124}, D{l:5,t:10,i:144}, D{l:6,t:10,i:548}, D{l:7,t:10,i:15}, D{l:7,t:10,i:153}, D{l:137,t:10,i:629}, D{l:6,t:0,i:503}, D{l:9,t:0,i:586}, D{l:13,t:0,i:468}, D{l:14,t:0,i:66}, D{l:16,t:0,i:58}, D{l:7,t:10,i:1531}, D{l:8,t:10,i:416}, D{l:9,t:10,i:275}, D{l:10,t:10,i:100}, D{l:11,t:10,i:658}, D{l:11,t:10,i:979}, D{l:12,t:10,i:86}, D{l:14,t:10,i:207}, D{l:15,t:10,i:20}, D{l:143,t:10,i:25}, D{l:5,t:0,i:603}, D{l:7,t:0,i:1212}, D{l:9,t:0,i:565}, D{l:14,t:0,i:301}, D{l:5,t:10,i:915}, D{l:6,t:10,i:1783}, D{l:7,t:10,i:211}, D{l:7,t:10,i:1353}, D{l:9,t:10,i:83}, D{l:10,t:10,i:376}, D{l:10,t:10,i:431}, D{l:11,t:10,i:543}, D{l:12,t:10,i:664}, D{l:13,t:10,i:280}, D{l:13,t:10,i:428}, D{l:14,t:10,i:128}, D{l:17,t:10,i:52}, D{l:145,t:10,i:81}, D{l:4,t:0,i:492}, D{l:133,t:0,i:451}, D{l:135,t:0,i:835}, D{l:141,t:0,i:70}, D{l:132,t:0,i:539}, D{l:7,t:11,i:748}, D{l:139,t:11,i:700}, D{l:7,t:11,i:1517}, D{l:11,t:11,i:597}, D{l:14,t:11,i:76}, D{l:14,t:11,i:335}, D{l:148,t:11,i:33}, D{l:6,t:0,i:113}, D{l:135,t:0,i:436}, D{l:4,t:10,i:338}, D{l:133,t:10,i:400}, D{l:136,t:0,i:718}, D{l:133,t:11,i:127}, D{l:133,t:11,i:418}, D{l:6,t:0,i:1505}, D{l:7,t:0,i:520}, D{l:6,t:11,i:198}, D{l:11,t:10,i:892}, D{l:140,t:11,i:83}, D{l:4,t:10,i:221}, D{l:5,t:10,i:659}, D{l:5,t:10,i:989}, D{l:7,t:10,i:697}, D{l:7,t:10,i:1211}, D{l:138,t:10,i:284}, D{l:135,t:0,i:1070}, D{l:5,t:11,i:276}, D{l:6,t:11,i:55}, D{l:135,t:11,i:1369}, D{l:134,t:0,i:1515}, D{l:6,t:11,i:1752}, D{l:136,t:11,i:726}, D{l:138,t:10,i:507}, D{l:15,t:0,i:78}, D{l:4,t:10,i:188}, D{l:135,t:10,i:805}, D{l:5,t:10,i:884}, D{l:139,t:10,i:991}, D{l:133,t:11,i:764}, D{l:134,t:10,i:1653}, D{l:6,t:11,i:309}, D{l:7,t:11,i:331}, D{l:138,t:11,i:550}, D{l:135,t:11,i:1861}, D{l:132,t:11,i:348}, D{l:135,t:11,i:986}, D{l:135,t:11,i:1573}, D{l:12,t:0,i:610}, D{l:13,t:0,i:431}, D{l:144,t:0,i:59}, D{l:9,t:11,i:799}, D{l:140,t:10,i:166}, D{l:134,t:0,i:1530}, D{l:132,t:0,i:750}, D{l:132,t:0,i:307}, D{l:133,t:0,i:964}, D{l:6,t:11,i:194}, D{l:7,t:11,i:133}, D{l:10,t:11,i:493}, D{l:10,t:11,i:570}, D{l:139,t:11,i:664}, D{l:5,t:11,i:24}, D{l:5,t:11,i:569}, D{l:6,t:11,i:3}, D{l:6,t:11,i:119}, D{l:6,t:11,i:143}, D{l:6,t:11,i:440}, D{l:7,t:11,i:295}, D{l:7,t:11,i:599}, D{l:7,t:11,i:1686}, D{l:7,t:11,i:1854}, D{l:8,t:11,i:424}, D{l:9,t:11,i:43}, D{l:9,t:11,i:584}, D{l:9,t:11,i:760}, D{l:10,t:11,i:148}, D{l:10,t:11,i:328}, D{l:11,t:11,i:159}, D{l:11,t:11,i:253}, D{l:11,t:11,i:506}, D{l:12,t:11,i:487}, D{l:12,t:11,i:531}, D{l:144,t:11,i:33}, D{l:136,t:10,i:760}, D{l:5,t:11,i:14}, D{l:5,t:11,i:892}, D{l:6,t:11,i:283}, D{l:7,t:11,i:234}, D{l:136,t:11,i:537}, D{l:135,t:11,i:1251}, D{l:4,t:11,i:126}, D{l:8,t:11,i:635}, D{l:147,t:11,i:34}, D{l:4,t:11,i:316}, D{l:135,t:11,i:1561}, D{l:6,t:0,i:999}, D{l:6,t:0,i:1310}, D{l:137,t:11,i:861}, D{l:4,t:11,i:64}, D{l:5,t:11,i:352}, D{l:5,t:11,i:720}, D{l:6,t:11,i:368}, D{l:139,t:11,i:359}, D{l:4,t:0,i:75}, D{l:5,t:0,i:180}, D{l:6,t:0,i:500}, D{l:7,t:0,i:58}, D{l:7,t:0,i:710}, D{l:10,t:0,i:645}, D{l:136,t:10,i:770}, D{l:133,t:0,i:649}, D{l:6,t:0,i:276}, D{l:7,t:0,i:282}, D{l:7,t:0,i:879}, D{l:7,t:0,i:924}, D{l:8,t:0,i:459}, D{l:9,t:0,i:599}, D{l:9,t:0,i:754}, D{l:11,t:0,i:574}, D{l:12,t:0,i:128}, D{l:12,t:0,i:494}, D{l:13,t:0,i:52}, D{l:13,t:0,i:301}, D{l:15,t:0,i:30}, D{l:143,t:0,i:132}, D{l:132,t:0,i:200}, D{l:4,t:10,i:89}, D{l:5,t:10,i:489}, D{l:6,t:10,i:315}, D{l:7,t:10,i:553}, D{l:7,t:10,i:1745}, D{l:138,t:10,i:243}, D{l:135,t:11,i:1050}, D{l:7,t:0,i:1621}, D{l:6,t:10,i:1658}, D{l:9,t:10,i:3}, D{l:10,t:10,i:154}, D{l:11,t:10,i:641}, D{l:13,t:10,i:85}, D{l:13,t:10,i:201}, D{l:141,t:10,i:346}, D{l:6,t:11,i:175}, D{l:137,t:11,i:289}, D{l:5,t:11,i:432}, D{l:133,t:11,i:913}, D{l:6,t:0,i:225}, D{l:137,t:0,i:211}, D{l:7,t:0,i:718}, D{l:8,t:0,i:687}, D{l:139,t:0,i:374}, D{l:4,t:10,i:166}, D{l:133,t:10,i:505}, D{l:9,t:0,i:110}, D{l:134,t:10,i:1670}, D{l:8,t:0,i:58}, D{l:9,t:0,i:724}, D{l:11,t:0,i:809}, D{l:13,t:0,i:113}, D{l:145,t:0,i:72}, D{l:6,t:0,i:345}, D{l:7,t:0,i:1247}, D{l:144,t:11,i:82}, D{l:5,t:11,i:931}, D{l:134,t:11,i:1698}, D{l:8,t:0,i:767}, D{l:8,t:0,i:803}, D{l:9,t:0,i:301}, D{l:137,t:0,i:903}, D{l:139,t:0,i:203}, D{l:134,t:0,i:1154}, D{l:7,t:0,i:1949}, D{l:136,t:0,i:674}, D{l:134,t:0,i:259}, D{l:135,t:0,i:1275}, D{l:5,t:11,i:774}, D{l:6,t:11,i:1637}, D{l:6,t:11,i:1686}, D{l:134,t:11,i:1751}, D{l:134,t:0,i:1231}, D{l:7,t:10,i:445}, D{l:8,t:10,i:307}, D{l:8,t:10,i:704}, D{l:10,t:10,i:41}, D{l:10,t:10,i:439}, D{l:11,t:10,i:237}, D{l:11,t:10,i:622}, D{l:140,t:10,i:201}, D{l:136,t:0,i:254}, D{l:6,t:11,i:260}, D{l:135,t:11,i:1484}, D{l:139,t:0,i:277}, D{l:135,t:10,i:1977}, D{l:4,t:10,i:189}, D{l:5,t:10,i:713}, D{l:6,t:11,i:573}, D{l:136,t:10,i:57}, D{l:138,t:10,i:371}, D{l:132,t:10,i:552}, D{l:134,t:11,i:344}, D{l:133,t:0,i:248}, D{l:9,t:0,i:800}, D{l:10,t:0,i:693}, D{l:11,t:0,i:482}, D{l:11,t:0,i:734}, D{l:11,t:0,i:789}, D{l:134,t:11,i:240}, D{l:4,t:0,i:116}, D{l:5,t:0,i:95}, D{l:5,t:0,i:445}, D{l:7,t:0,i:1688}, D{l:8,t:0,i:29}, D{l:9,t:0,i:272}, D{l:11,t:0,i:509}, D{l:11,t:0,i:915}, D{l:4,t:11,i:292}, D{l:4,t:11,i:736}, D{l:5,t:11,i:871}, D{l:6,t:11,i:171}, D{l:6,t:11,i:1689}, D{l:7,t:11,i:1324}, D{l:7,t:11,i:1944}, D{l:9,t:11,i:415}, D{l:9,t:11,i:580}, D{l:14,t:11,i:230}, D{l:146,t:11,i:68}, D{l:7,t:0,i:490}, D{l:13,t:0,i:100}, D{l:143,t:0,i:75}, D{l:135,t:0,i:1641}, D{l:133,t:0,i:543}, D{l:7,t:11,i:209}, D{l:8,t:11,i:661}, D{l:10,t:11,i:42}, D{l:11,t:11,i:58}, D{l:12,t:11,i:58}, D{l:12,t:11,i:118}, D{l:141,t:11,i:32}, D{l:5,t:0,i:181}, D{l:8,t:0,i:41}, D{l:6,t:11,i:63}, D{l:135,t:11,i:920}, D{l:133,t:0,i:657}, D{l:133,t:11,i:793}, D{l:138,t:0,i:709}, D{l:7,t:0,i:25}, D{l:8,t:0,i:202}, D{l:138,t:0,i:536}, D{l:5,t:11,i:665}, D{l:135,t:10,i:1788}, D{l:145,t:10,i:49}, D{l:9,t:0,i:423}, D{l:140,t:0,i:89}, D{l:5,t:11,i:67}, D{l:6,t:11,i:62}, D{l:6,t:11,i:374}, D{l:135,t:11,i:1391}, D{l:8,t:0,i:113}, D{l:9,t:0,i:877}, D{l:10,t:0,i:554}, D{l:11,t:0,i:83}, D{l:12,t:0,i:136}, D{l:19,t:0,i:109}, D{l:9,t:11,i:790}, D{l:140,t:11,i:47}, D{l:138,t:10,i:661}, D{l:4,t:0,i:963}, D{l:10,t:0,i:927}, D{l:14,t:0,i:442}, D{l:135,t:10,i:1945}, D{l:133,t:0,i:976}, D{l:132,t:0,i:206}, D{l:4,t:11,i:391}, D{l:135,t:11,i:1169}, D{l:134,t:0,i:2002}, D{l:6,t:0,i:696}, D{l:134,t:0,i:1008}, D{l:134,t:0,i:1170}, D{l:132,t:11,i:271}, D{l:7,t:0,i:13}, D{l:8,t:0,i:226}, D{l:10,t:0,i:537}, D{l:11,t:0,i:570}, D{l:11,t:0,i:605}, D{l:11,t:0,i:799}, D{l:11,t:0,i:804}, D{l:12,t:0,i:85}, D{l:12,t:0,i:516}, D{l:12,t:0,i:623}, D{l:13,t:0,i:112}, D{l:13,t:0,i:361}, D{l:14,t:0,i:77}, D{l:14,t:0,i:78}, D{l:17,t:0,i:28}, D{l:19,t:0,i:110}, D{l:140,t:11,i:314}, D{l:132,t:0,i:769}, D{l:134,t:0,i:1544}, D{l:4,t:0,i:551}, D{l:137,t:0,i:678}, D{l:5,t:10,i:84}, D{l:134,t:10,i:163}, D{l:9,t:0,i:57}, D{l:9,t:0,i:459}, D{l:10,t:0,i:425}, D{l:11,t:0,i:119}, D{l:12,t:0,i:184}, D{l:12,t:0,i:371}, D{l:13,t:0,i:358}, D{l:145,t:0,i:51}, D{l:5,t:0,i:188}, D{l:5,t:0,i:814}, D{l:8,t:0,i:10}, D{l:9,t:0,i:421}, D{l:9,t:0,i:729}, D{l:10,t:0,i:609}, D{l:11,t:0,i:689}, D{l:4,t:11,i:253}, D{l:5,t:10,i:410}, D{l:5,t:11,i:544}, D{l:7,t:11,i:300}, D{l:137,t:11,i:340}, D{l:134,t:0,i:624}, D{l:138,t:11,i:321}, D{l:135,t:0,i:1941}, D{l:18,t:0,i:130}, D{l:5,t:10,i:322}, D{l:8,t:10,i:186}, D{l:9,t:10,i:262}, D{l:10,t:10,i:187}, D{l:142,t:10,i:208}, D{l:5,t:11,i:53}, D{l:5,t:11,i:541}, D{l:6,t:11,i:94}, D{l:6,t:11,i:499}, D{l:7,t:11,i:230}, D{l:139,t:11,i:321}, D{l:133,t:10,i:227}, D{l:4,t:0,i:378}, D{l:4,t:11,i:920}, D{l:5,t:11,i:25}, D{l:5,t:11,i:790}, D{l:6,t:11,i:457}, D{l:135,t:11,i:853}, D{l:137,t:0,i:269}, D{l:132,t:0,i:528}, D{l:134,t:0,i:1146}, D{l:7,t:10,i:1395}, D{l:8,t:10,i:486}, D{l:9,t:10,i:236}, D{l:9,t:10,i:878}, D{l:10,t:10,i:218}, D{l:11,t:10,i:95}, D{l:19,t:10,i:17}, D{l:147,t:10,i:31}, D{l:7,t:10,i:2043}, D{l:8,t:10,i:672}, D{l:141,t:10,i:448}, D{l:134,t:0,i:1105}, D{l:134,t:0,i:1616}, D{l:134,t:11,i:1765}, D{l:140,t:11,i:163}, D{l:5,t:10,i:412}, D{l:133,t:11,i:822}, D{l:132,t:11,i:634}, D{l:6,t:0,i:656}, D{l:134,t:11,i:1730}, D{l:134,t:0,i:1940}, D{l:5,t:0,i:104}, D{l:6,t:0,i:173}, D{l:135,t:0,i:1631}, D{l:136,t:10,i:562}, D{l:6,t:11,i:36}, D{l:7,t:11,i:658}, D{l:8,t:11,i:454}, D{l:147,t:11,i:86}, D{l:5,t:0,i:457}, D{l:134,t:10,i:1771}, D{l:7,t:0,i:810}, D{l:8,t:0,i:138}, D{l:8,t:0,i:342}, D{l:9,t:0,i:84}, D{l:10,t:0,i:193}, D{l:11,t:0,i:883}, D{l:140,t:0,i:359}, D{l:9,t:0,i:620}, D{l:135,t:10,i:1190}, D{l:137,t:10,i:132}, D{l:7,t:11,i:975}, D{l:137,t:11,i:789}, D{l:6,t:0,i:95}, D{l:6,t:0,i:1934}, D{l:136,t:0,i:967}, D{l:141,t:11,i:335}, D{l:6,t:0,i:406}, D{l:10,t:0,i:409}, D{l:10,t:0,i:447}, D{l:11,t:0,i:44}, D{l:140,t:0,i:100}, D{l:4,t:10,i:317}, D{l:135,t:10,i:1279}, D{l:132,t:0,i:477}, D{l:134,t:0,i:1268}, D{l:6,t:0,i:1941}, D{l:8,t:0,i:944}, D{l:5,t:10,i:63}, D{l:133,t:10,i:509}, D{l:132,t:0,i:629}, D{l:132,t:11,i:104}, D{l:4,t:0,i:246}, D{l:133,t:0,i:375}, D{l:6,t:0,i:1636}, D{l:132,t:10,i:288}, D{l:135,t:11,i:1614}, D{l:9,t:0,i:49}, D{l:10,t:0,i:774}, D{l:8,t:10,i:89}, D{l:8,t:10,i:620}, D{l:11,t:10,i:628}, D{l:12,t:10,i:322}, D{l:143,t:10,i:124}, D{l:4,t:0,i:282}, D{l:7,t:0,i:1034}, D{l:11,t:0,i:398}, D{l:11,t:0,i:634}, D{l:12,t:0,i:1}, D{l:12,t:0,i:79}, D{l:12,t:0,i:544}, D{l:14,t:0,i:237}, D{l:17,t:0,i:10}, D{l:146,t:0,i:20}, D{l:132,t:0,i:824}, D{l:7,t:11,i:45}, D{l:9,t:11,i:542}, D{l:9,t:11,i:566}, D{l:138,t:11,i:728}, D{l:5,t:0,i:118}, D{l:5,t:0,i:499}, D{l:6,t:0,i:476}, D{l:6,t:0,i:665}, D{l:6,t:0,i:1176}, D{l:6,t:0,i:1196}, D{l:7,t:0,i:600}, D{l:7,t:0,i:888}, D{l:135,t:0,i:1096}, D{l:7,t:0,i:296}, D{l:7,t:0,i:596}, D{l:8,t:0,i:560}, D{l:8,t:0,i:586}, D{l:9,t:0,i:612}, D{l:11,t:0,i:304}, D{l:12,t:0,i:46}, D{l:13,t:0,i:89}, D{l:14,t:0,i:112}, D{l:145,t:0,i:122}, D{l:5,t:0,i:894}, D{l:6,t:0,i:1772}, D{l:9,t:0,i:1009}, D{l:138,t:10,i:120}, D{l:5,t:11,i:533}, D{l:7,t:11,i:755}, D{l:138,t:11,i:780}, D{l:151,t:10,i:1}, D{l:6,t:0,i:1474}, D{l:7,t:11,i:87}, D{l:142,t:11,i:288}, D{l:139,t:0,i:366}, D{l:137,t:10,i:461}, D{l:7,t:11,i:988}, D{l:7,t:11,i:1939}, D{l:9,t:11,i:64}, D{l:9,t:11,i:502}, D{l:12,t:11,i:7}, D{l:12,t:11,i:34}, D{l:13,t:11,i:12}, D{l:13,t:11,i:234}, D{l:147,t:11,i:77}, D{l:7,t:0,i:1599}, D{l:7,t:0,i:1723}, D{l:8,t:0,i:79}, D{l:8,t:0,i:106}, D{l:8,t:0,i:190}, D{l:8,t:0,i:302}, D{l:8,t:0,i:383}, D{l:8,t:0,i:713}, D{l:9,t:0,i:119}, D{l:9,t:0,i:233}, D{l:9,t:0,i:419}, D{l:9,t:0,i:471}, D{l:10,t:0,i:181}, D{l:10,t:0,i:406}, D{l:11,t:0,i:57}, D{l:11,t:0,i:85}, D{l:11,t:0,i:120}, D{l:11,t:0,i:177}, D{l:11,t:0,i:296}, D{l:11,t:0,i:382}, D{l:11,t:0,i:454}, D{l:11,t:0,i:758}, D{l:11,t:0,i:999}, D{l:12,t:0,i:27}, D{l:12,t:0,i:98}, D{l:12,t:0,i:131}, D{l:12,t:0,i:245}, D{l:12,t:0,i:312}, D{l:12,t:0,i:446}, D{l:12,t:0,i:454}, D{l:13,t:0,i:25}, D{l:13,t:0,i:98}, D{l:13,t:0,i:426}, D{l:13,t:0,i:508}, D{l:14,t:0,i:70}, D{l:14,t:0,i:163}, D{l:14,t:0,i:272}, D{l:14,t:0,i:277}, D{l:14,t:0,i:370}, D{l:15,t:0,i:95}, D{l:15,t:0,i:138}, D{l:15,t:0,i:167}, D{l:17,t:0,i:38}, D{l:148,t:0,i:96}, D{l:135,t:10,i:1346}, D{l:10,t:0,i:200}, D{l:19,t:0,i:2}, D{l:151,t:0,i:22}, D{l:135,t:11,i:141}, D{l:134,t:10,i:85}, D{l:134,t:0,i:1759}, D{l:138,t:0,i:372}, D{l:145,t:0,i:16}, D{l:8,t:0,i:943}, D{l:132,t:11,i:619}, D{l:139,t:11,i:88}, D{l:5,t:11,i:246}, D{l:8,t:11,i:189}, D{l:9,t:11,i:355}, D{l:9,t:11,i:512}, D{l:10,t:11,i:124}, D{l:10,t:11,i:453}, D{l:11,t:11,i:143}, D{l:11,t:11,i:416}, D{l:11,t:11,i:859}, D{l:141,t:11,i:341}, D{l:5,t:0,i:258}, D{l:134,t:0,i:719}, D{l:6,t:0,i:1798}, D{l:6,t:0,i:1839}, D{l:8,t:0,i:900}, D{l:10,t:0,i:874}, D{l:10,t:0,i:886}, D{l:12,t:0,i:698}, D{l:12,t:0,i:732}, D{l:12,t:0,i:770}, D{l:16,t:0,i:106}, D{l:18,t:0,i:163}, D{l:18,t:0,i:170}, D{l:18,t:0,i:171}, D{l:152,t:0,i:20}, D{l:9,t:0,i:707}, D{l:11,t:0,i:326}, D{l:11,t:0,i:339}, D{l:12,t:0,i:423}, D{l:12,t:0,i:502}, D{l:20,t:0,i:62}, D{l:9,t:11,i:707}, D{l:11,t:11,i:326}, D{l:11,t:11,i:339}, D{l:12,t:11,i:423}, D{l:12,t:11,i:502}, D{l:148,t:11,i:62}, D{l:5,t:0,i:30}, D{l:7,t:0,i:495}, D{l:8,t:0,i:134}, D{l:9,t:0,i:788}, D{l:140,t:0,i:438}, D{l:133,t:11,i:678}, D{l:5,t:10,i:279}, D{l:6,t:10,i:235}, D{l:7,t:10,i:468}, D{l:8,t:10,i:446}, D{l:9,t:10,i:637}, D{l:10,t:10,i:717}, D{l:11,t:10,i:738}, D{l:140,t:10,i:514}, D{l:5,t:11,i:35}, D{l:6,t:11,i:287}, D{l:7,t:11,i:862}, D{l:7,t:11,i:1886}, D{l:138,t:11,i:179}, D{l:7,t:0,i:1948}, D{l:7,t:0,i:2004}, D{l:132,t:11,i:517}, D{l:5,t:10,i:17}, D{l:6,t:10,i:371}, D{l:137,t:10,i:528}, D{l:4,t:0,i:115}, D{l:5,t:0,i:669}, D{l:6,t:0,i:407}, D{l:8,t:0,i:311}, D{l:11,t:0,i:10}, D{l:141,t:0,i:5}, D{l:137,t:0,i:381}, D{l:5,t:0,i:50}, D{l:6,t:0,i:439}, D{l:7,t:0,i:780}, D{l:135,t:0,i:1040}, D{l:136,t:11,i:667}, D{l:11,t:11,i:403}, D{l:146,t:11,i:83}, D{l:5,t:0,i:1}, D{l:6,t:0,i:81}, D{l:138,t:0,i:520}, D{l:134,t:0,i:738}, D{l:5,t:0,i:482}, D{l:8,t:0,i:98}, D{l:9,t:0,i:172}, D{l:10,t:0,i:360}, D{l:10,t:0,i:700}, D{l:10,t:0,i:822}, D{l:11,t:0,i:302}, D{l:11,t:0,i:778}, D{l:12,t:0,i:50}, D{l:12,t:0,i:127}, D{l:12,t:0,i:396}, D{l:13,t:0,i:62}, D{l:13,t:0,i:328}, D{l:14,t:0,i:122}, D{l:147,t:0,i:72}, D{l:9,t:11,i:157}, D{l:10,t:11,i:131}, D{l:140,t:11,i:72}, D{l:135,t:11,i:714}, D{l:135,t:11,i:539}, D{l:5,t:0,i:2}, D{l:6,t:0,i:512}, D{l:7,t:0,i:797}, D{l:7,t:0,i:1494}, D{l:8,t:0,i:253}, D{l:8,t:0,i:589}, D{l:9,t:0,i:77}, D{l:10,t:0,i:1}, D{l:10,t:0,i:129}, D{l:10,t:0,i:225}, D{l:11,t:0,i:118}, D{l:11,t:0,i:226}, D{l:11,t:0,i:251}, D{l:11,t:0,i:430}, D{l:11,t:0,i:701}, D{l:11,t:0,i:974}, D{l:11,t:0,i:982}, D{l:12,t:0,i:64}, D{l:12,t:0,i:260}, D{l:12,t:0,i:488}, D{l:140,t:0,i:690}, D{l:5,t:11,i:394}, D{l:7,t:11,i:367}, D{l:7,t:11,i:487}, D{l:7,t:11,i:857}, D{l:7,t:11,i:1713}, D{l:8,t:11,i:246}, D{l:9,t:11,i:537}, D{l:10,t:11,i:165}, D{l:12,t:11,i:219}, D{l:140,t:11,i:561}, D{l:136,t:0,i:557}, D{l:5,t:10,i:779}, D{l:5,t:10,i:807}, D{l:6,t:10,i:1655}, D{l:134,t:10,i:1676}, D{l:4,t:10,i:196}, D{l:5,t:10,i:558}, D{l:133,t:10,i:949}, D{l:11,t:11,i:827}, D{l:12,t:11,i:56}, D{l:14,t:11,i:34}, D{l:143,t:11,i:148}, D{l:137,t:0,i:347}, D{l:133,t:0,i:572}, D{l:134,t:0,i:832}, D{l:4,t:0,i:12}, D{l:7,t:0,i:504}, D{l:7,t:0,i:522}, D{l:7,t:0,i:809}, D{l:8,t:0,i:797}, D{l:141,t:0,i:88}, D{l:4,t:10,i:752}, D{l:133,t:11,i:449}, D{l:7,t:11,i:86}, D{l:8,t:11,i:103}, D{l:145,t:11,i:69}, D{l:7,t:11,i:2028}, D{l:138,t:11,i:641}, D{l:5,t:0,i:528}, D{l:6,t:11,i:1}, D{l:142,t:11,i:2}, D{l:134,t:0,i:861}, D{l:10,t:0,i:294}, D{l:4,t:10,i:227}, D{l:5,t:10,i:159}, D{l:5,t:10,i:409}, D{l:7,t:10,i:80}, D{l:10,t:10,i:479}, D{l:12,t:10,i:418}, D{l:14,t:10,i:50}, D{l:14,t:10,i:249}, D{l:142,t:10,i:295}, D{l:7,t:10,i:1470}, D{l:8,t:10,i:66}, D{l:8,t:10,i:137}, D{l:8,t:10,i:761}, D{l:9,t:10,i:638}, D{l:11,t:10,i:80}, D{l:11,t:10,i:212}, D{l:11,t:10,i:368}, D{l:11,t:10,i:418}, D{l:12,t:10,i:8}, D{l:13,t:10,i:15}, D{l:16,t:10,i:61}, D{l:17,t:10,i:59}, D{l:19,t:10,i:28}, D{l:148,t:10,i:84}, D{l:20,t:0,i:109}, D{l:135,t:11,i:1148}, D{l:6,t:11,i:277}, D{l:7,t:11,i:1274}, D{l:7,t:11,i:1386}, D{l:7,t:11,i:1392}, D{l:12,t:11,i:129}, D{l:146,t:11,i:87}, D{l:6,t:11,i:187}, D{l:7,t:11,i:39}, D{l:7,t:11,i:1203}, D{l:8,t:11,i:380}, D{l:8,t:11,i:542}, D{l:14,t:11,i:117}, D{l:149,t:11,i:28}, D{l:134,t:0,i:1187}, D{l:5,t:0,i:266}, D{l:9,t:0,i:290}, D{l:9,t:0,i:364}, D{l:10,t:0,i:293}, D{l:11,t:0,i:606}, D{l:142,t:0,i:45}, D{l:6,t:11,i:297}, D{l:7,t:11,i:793}, D{l:139,t:11,i:938}, D{l:4,t:0,i:50}, D{l:6,t:0,i:594}, D{l:9,t:0,i:121}, D{l:10,t:0,i:49}, D{l:10,t:0,i:412}, D{l:139,t:0,i:834}, D{l:136,t:0,i:748}, D{l:7,t:11,i:464}, D{l:8,t:11,i:438}, D{l:11,t:11,i:105}, D{l:11,t:11,i:363}, D{l:12,t:11,i:231}, D{l:14,t:11,i:386}, D{l:15,t:11,i:102}, D{l:148,t:11,i:75}, D{l:132,t:0,i:466}, D{l:13,t:0,i:399}, D{l:14,t:0,i:337}, D{l:6,t:10,i:38}, D{l:7,t:10,i:1220}, D{l:8,t:10,i:185}, D{l:8,t:10,i:256}, D{l:9,t:10,i:22}, D{l:9,t:10,i:331}, D{l:10,t:10,i:738}, D{l:11,t:10,i:205}, D{l:11,t:10,i:540}, D{l:11,t:10,i:746}, D{l:13,t:10,i:465}, D{l:142,t:10,i:194}, D{l:9,t:0,i:378}, D{l:141,t:0,i:162}, D{l:137,t:0,i:519}, D{l:4,t:10,i:159}, D{l:6,t:10,i:115}, D{l:7,t:10,i:252}, D{l:7,t:10,i:257}, D{l:7,t:10,i:1928}, D{l:8,t:10,i:69}, D{l:9,t:10,i:384}, D{l:10,t:10,i:91}, D{l:10,t:10,i:615}, D{l:12,t:10,i:375}, D{l:14,t:10,i:235}, D{l:18,t:10,i:117}, D{l:147,t:10,i:123}, D{l:5,t:11,i:604}, D{l:5,t:10,i:911}, D{l:136,t:10,i:278}, D{l:132,t:0,i:667}, D{l:8,t:0,i:351}, D{l:9,t:0,i:322}, D{l:4,t:10,i:151}, D{l:135,t:10,i:1567}, D{l:134,t:0,i:902}, D{l:133,t:10,i:990}, D{l:12,t:0,i:180}, D{l:5,t:10,i:194}, D{l:7,t:10,i:1662}, D{l:137,t:10,i:90}, D{l:4,t:0,i:869}, D{l:134,t:0,i:1996}, D{l:134,t:0,i:813}, D{l:133,t:10,i:425}, D{l:137,t:11,i:761}, D{l:132,t:0,i:260}, D{l:133,t:10,i:971}, D{l:5,t:11,i:20}, D{l:6,t:11,i:298}, D{l:7,t:11,i:659}, D{l:7,t:11,i:1366}, D{l:137,t:11,i:219}, D{l:4,t:0,i:39}, D{l:5,t:0,i:36}, D{l:7,t:0,i:1843}, D{l:8,t:0,i:407}, D{l:11,t:0,i:144}, D{l:140,t:0,i:523}, D{l:4,t:0,i:510}, D{l:10,t:0,i:587}, D{l:139,t:10,i:752}, D{l:7,t:0,i:29}, D{l:7,t:0,i:66}, D{l:7,t:0,i:1980}, D{l:10,t:0,i:487}, D{l:138,t:0,i:809}, D{l:13,t:0,i:260}, D{l:14,t:0,i:82}, D{l:18,t:0,i:63}, D{l:137,t:10,i:662}, D{l:5,t:10,i:72}, D{l:6,t:10,i:264}, D{l:7,t:10,i:21}, D{l:7,t:10,i:46}, D{l:7,t:10,i:2013}, D{l:8,t:10,i:215}, D{l:8,t:10,i:513}, D{l:10,t:10,i:266}, D{l:139,t:10,i:22}, D{l:134,t:0,i:570}, D{l:6,t:0,i:565}, D{l:7,t:0,i:1667}, D{l:4,t:11,i:439}, D{l:10,t:10,i:95}, D{l:11,t:10,i:603}, D{l:12,t:11,i:242}, D{l:13,t:10,i:443}, D{l:14,t:10,i:160}, D{l:143,t:10,i:4}, D{l:134,t:0,i:1464}, D{l:134,t:10,i:431}, D{l:9,t:0,i:372}, D{l:15,t:0,i:2}, D{l:19,t:0,i:10}, D{l:19,t:0,i:18}, D{l:5,t:10,i:874}, D{l:6,t:10,i:1677}, D{l:143,t:10,i:0}, D{l:132,t:0,i:787}, D{l:6,t:0,i:380}, D{l:12,t:0,i:399}, D{l:21,t:0,i:19}, D{l:7,t:10,i:939}, D{l:7,t:10,i:1172}, D{l:7,t:10,i:1671}, D{l:9,t:10,i:540}, D{l:10,t:10,i:696}, D{l:11,t:10,i:265}, D{l:11,t:10,i:732}, D{l:11,t:10,i:928}, D{l:11,t:10,i:937}, D{l:141,t:10,i:438}, D{l:137,t:0,i:200}, D{l:132,t:11,i:233}, D{l:132,t:0,i:516}, D{l:134,t:11,i:577}, D{l:132,t:0,i:844}, D{l:11,t:0,i:887}, D{l:14,t:0,i:365}, D{l:142,t:0,i:375}, D{l:132,t:11,i:482}, D{l:8,t:0,i:821}, D{l:140,t:0,i:44}, D{l:7,t:0,i:1655}, D{l:136,t:0,i:305}, D{l:5,t:10,i:682}, D{l:135,t:10,i:1887}, D{l:135,t:11,i:346}, D{l:132,t:10,i:696}, D{l:4,t:0,i:10}, D{l:7,t:0,i:917}, D{l:139,t:0,i:786}, D{l:5,t:11,i:795}, D{l:6,t:11,i:1741}, D{l:8,t:11,i:417}, D{l:137,t:11,i:782}, D{l:4,t:0,i:1016}, D{l:134,t:0,i:2031}, D{l:5,t:0,i:684}, D{l:4,t:10,i:726}, D{l:133,t:10,i:630}, D{l:6,t:0,i:1021}, D{l:134,t:0,i:1480}, D{l:8,t:10,i:802}, D{l:136,t:10,i:838}, D{l:134,t:0,i:27}, D{l:134,t:0,i:395}, D{l:135,t:11,i:622}, D{l:7,t:11,i:625}, D{l:135,t:11,i:1750}, D{l:4,t:11,i:203}, D{l:135,t:11,i:1936}, D{l:6,t:10,i:118}, D{l:7,t:10,i:215}, D{l:7,t:10,i:1521}, D{l:140,t:10,i:11}, D{l:132,t:0,i:813}, D{l:136,t:0,i:511}, D{l:7,t:10,i:615}, D{l:138,t:10,i:251}, D{l:135,t:10,i:1044}, D{l:145,t:0,i:56}, D{l:133,t:10,i:225}, D{l:6,t:0,i:342}, D{l:6,t:0,i:496}, D{l:8,t:0,i:275}, D{l:137,t:0,i:206}, D{l:4,t:0,i:909}, D{l:133,t:0,i:940}, D{l:132,t:0,i:891}, D{l:7,t:11,i:311}, D{l:9,t:11,i:308}, D{l:140,t:11,i:255}, D{l:4,t:10,i:370}, D{l:5,t:10,i:756}, D{l:135,t:10,i:1326}, D{l:4,t:0,i:687}, D{l:134,t:0,i:1596}, D{l:134,t:0,i:1342}, D{l:6,t:10,i:1662}, D{l:7,t:10,i:48}, D{l:8,t:10,i:771}, D{l:10,t:10,i:116}, D{l:13,t:10,i:104}, D{l:14,t:10,i:105}, D{l:14,t:10,i:184}, D{l:15,t:10,i:168}, D{l:19,t:10,i:92}, D{l:148,t:10,i:68}, D{l:138,t:10,i:209}, D{l:4,t:11,i:400}, D{l:5,t:11,i:267}, D{l:135,t:11,i:232}, D{l:151,t:11,i:12}, D{l:6,t:0,i:41}, D{l:141,t:0,i:160}, D{l:141,t:11,i:314}, D{l:134,t:0,i:1718}, D{l:136,t:0,i:778}, D{l:142,t:11,i:261}, D{l:134,t:0,i:1610}, D{l:133,t:0,i:115}, D{l:132,t:0,i:294}, D{l:14,t:0,i:314}, D{l:132,t:10,i:120}, D{l:132,t:0,i:983}, D{l:5,t:0,i:193}, D{l:140,t:0,i:178}, D{l:138,t:10,i:429}, D{l:5,t:10,i:820}, D{l:135,t:10,i:931}, D{l:6,t:0,i:994}, D{l:6,t:0,i:1051}, D{l:6,t:0,i:1439}, D{l:7,t:0,i:174}, D{l:133,t:11,i:732}, D{l:4,t:11,i:100}, D{l:7,t:11,i:679}, D{l:8,t:11,i:313}, D{l:138,t:10,i:199}, D{l:6,t:10,i:151}, D{l:6,t:10,i:1675}, D{l:7,t:10,i:383}, D{l:151,t:10,i:10}, D{l:6,t:0,i:1796}, D{l:8,t:0,i:848}, D{l:8,t:0,i:867}, D{l:8,t:0,i:907}, D{l:10,t:0,i:855}, D{l:140,t:0,i:703}, D{l:140,t:0,i:221}, D{l:4,t:0,i:122}, D{l:5,t:0,i:796}, D{l:5,t:0,i:952}, D{l:6,t:0,i:1660}, D{l:6,t:0,i:1671}, D{l:8,t:0,i:567}, D{l:9,t:0,i:687}, D{l:9,t:0,i:742}, D{l:10,t:0,i:686}, D{l:11,t:0,i:682}, D{l:11,t:0,i:909}, D{l:140,t:0,i:281}, D{l:5,t:11,i:362}, D{l:5,t:11,i:443}, D{l:6,t:11,i:318}, D{l:7,t:11,i:1019}, D{l:139,t:11,i:623}, D{l:5,t:11,i:463}, D{l:136,t:11,i:296}, D{l:11,t:0,i:583}, D{l:13,t:0,i:262}, D{l:6,t:10,i:1624}, D{l:12,t:10,i:422}, D{l:142,t:10,i:360}, D{l:5,t:0,i:179}, D{l:7,t:0,i:1095}, D{l:135,t:0,i:1213}, D{l:4,t:10,i:43}, D{l:4,t:11,i:454}, D{l:5,t:10,i:344}, D{l:133,t:10,i:357}, D{l:4,t:0,i:66}, D{l:7,t:0,i:722}, D{l:135,t:0,i:904}, D{l:134,t:0,i:773}, D{l:7,t:0,i:352}, D{l:133,t:10,i:888}, D{l:5,t:11,i:48}, D{l:5,t:11,i:404}, D{l:6,t:11,i:557}, D{l:7,t:11,i:458}, D{l:8,t:11,i:597}, D{l:10,t:11,i:455}, D{l:10,t:11,i:606}, D{l:11,t:11,i:49}, D{l:11,t:11,i:548}, D{l:12,t:11,i:476}, D{l:13,t:11,i:18}, D{l:141,t:11,i:450}, D{l:134,t:11,i:418}, D{l:132,t:10,i:711}, D{l:5,t:11,i:442}, D{l:135,t:11,i:1984}, D{l:141,t:0,i:35}, D{l:137,t:0,i:152}, D{l:134,t:0,i:1197}, D{l:135,t:11,i:1093}, D{l:137,t:11,i:203}, D{l:137,t:10,i:440}, D{l:10,t:0,i:592}, D{l:10,t:0,i:753}, D{l:12,t:0,i:317}, D{l:12,t:0,i:355}, D{l:12,t:0,i:465}, D{l:12,t:0,i:469}, D{l:12,t:0,i:560}, D{l:12,t:0,i:578}, D{l:141,t:0,i:243}, D{l:133,t:0,i:564}, D{l:134,t:0,i:797}, D{l:5,t:10,i:958}, D{l:133,t:10,i:987}, D{l:5,t:11,i:55}, D{l:7,t:11,i:376}, D{l:140,t:11,i:161}, D{l:133,t:11,i:450}, D{l:134,t:0,i:556}, D{l:134,t:0,i:819}, D{l:11,t:10,i:276}, D{l:142,t:10,i:293}, D{l:7,t:0,i:544}, D{l:138,t:0,i:61}, D{l:8,t:0,i:719}, D{l:4,t:10,i:65}, D{l:5,t:10,i:479}, D{l:5,t:10,i:1004}, D{l:7,t:10,i:1913}, D{l:8,t:10,i:317}, D{l:9,t:10,i:302}, D{l:10,t:10,i:612}, D{l:141,t:10,i:22}, D{l:4,t:0,i:5}, D{l:5,t:0,i:498}, D{l:8,t:0,i:637}, D{l:9,t:0,i:521}, D{l:4,t:11,i:213}, D{l:4,t:10,i:261}, D{l:7,t:11,i:223}, D{l:7,t:10,i:510}, D{l:136,t:11,i:80}, D{l:5,t:0,i:927}, D{l:7,t:0,i:101}, D{l:4,t:10,i:291}, D{l:7,t:11,i:381}, D{l:7,t:11,i:806}, D{l:7,t:11,i:820}, D{l:8,t:11,i:354}, D{l:8,t:11,i:437}, D{l:8,t:11,i:787}, D{l:9,t:10,i:515}, D{l:9,t:11,i:657}, D{l:10,t:11,i:58}, D{l:10,t:11,i:339}, D{l:10,t:11,i:749}, D{l:11,t:11,i:914}, D{l:12,t:10,i:152}, D{l:12,t:11,i:162}, D{l:12,t:10,i:443}, D{l:13,t:11,i:75}, D{l:13,t:10,i:392}, D{l:14,t:11,i:106}, D{l:14,t:11,i:198}, D{l:14,t:11,i:320}, D{l:14,t:10,i:357}, D{l:14,t:11,i:413}, D{l:146,t:11,i:43}, D{l:6,t:0,i:1153}, D{l:7,t:0,i:1441}, D{l:136,t:11,i:747}, D{l:4,t:0,i:893}, D{l:5,t:0,i:780}, D{l:133,t:0,i:893}, D{l:138,t:11,i:654}, D{l:133,t:11,i:692}, D{l:133,t:0,i:238}, D{l:134,t:11,i:191}, D{l:4,t:10,i:130}, D{l:135,t:10,i:843}, D{l:6,t:0,i:1296}, D{l:5,t:10,i:42}, D{l:5,t:10,i:879}, D{l:7,t:10,i:245}, D{l:7,t:10,i:324}, D{l:7,t:10,i:1532}, D{l:11,t:10,i:463}, D{l:11,t:10,i:472}, D{l:13,t:10,i:363}, D{l:144,t:10,i:52}, D{l:134,t:0,i:1729}, D{l:6,t:0,i:1999}, D{l:136,t:0,i:969}, D{l:4,t:10,i:134}, D{l:133,t:10,i:372}, D{l:4,t:0,i:60}, D{l:7,t:0,i:941}, D{l:7,t:0,i:1800}, D{l:8,t:0,i:314}, D{l:9,t:0,i:700}, D{l:139,t:0,i:487}, D{l:134,t:0,i:1144}, D{l:6,t:11,i:162}, D{l:7,t:11,i:1960}, D{l:136,t:11,i:831}, D{l:132,t:11,i:706}, D{l:135,t:0,i:1147}, D{l:138,t:11,i:426}, D{l:138,t:11,i:89}, D{l:7,t:0,i:1853}, D{l:138,t:0,i:437}, D{l:136,t:0,i:419}, D{l:135,t:10,i:1634}, D{l:133,t:0,i:828}, D{l:5,t:0,i:806}, D{l:7,t:0,i:176}, D{l:7,t:0,i:178}, D{l:7,t:0,i:1240}, D{l:7,t:0,i:1976}, D{l:132,t:10,i:644}, D{l:135,t:11,i:1877}, D{l:5,t:11,i:420}, D{l:135,t:11,i:1449}, D{l:4,t:0,i:51}, D{l:5,t:0,i:39}, D{l:6,t:0,i:4}, D{l:7,t:0,i:591}, D{l:7,t:0,i:849}, D{l:7,t:0,i:951}, D{l:7,t:0,i:1613}, D{l:7,t:0,i:1760}, D{l:7,t:0,i:1988}, D{l:9,t:0,i:434}, D{l:10,t:0,i:754}, D{l:11,t:0,i:25}, D{l:139,t:0,i:37}, D{l:10,t:11,i:57}, D{l:138,t:11,i:277}, D{l:135,t:10,i:540}, D{l:132,t:11,i:204}, D{l:135,t:0,i:159}, D{l:139,t:11,i:231}, D{l:133,t:0,i:902}, D{l:7,t:0,i:928}, D{l:7,t:11,i:366}, D{l:9,t:11,i:287}, D{l:12,t:11,i:199}, D{l:12,t:11,i:556}, D{l:140,t:11,i:577}, D{l:6,t:10,i:623}, D{l:136,t:10,i:789}, D{l:4,t:10,i:908}, D{l:5,t:10,i:359}, D{l:5,t:10,i:508}, D{l:6,t:10,i:1723}, D{l:7,t:10,i:343}, D{l:7,t:10,i:1996}, D{l:135,t:10,i:2026}, D{l:134,t:0,i:270}, D{l:4,t:10,i:341}, D{l:135,t:10,i:480}, D{l:5,t:11,i:356}, D{l:135,t:11,i:224}, D{l:11,t:11,i:588}, D{l:11,t:11,i:864}, D{l:11,t:11,i:968}, D{l:143,t:11,i:160}, D{l:132,t:0,i:556}, D{l:137,t:0,i:801}, D{l:132,t:0,i:416}, D{l:142,t:0,i:372}, D{l:5,t:0,i:152}, D{l:5,t:0,i:197}, D{l:7,t:0,i:340}, D{l:7,t:0,i:867}, D{l:10,t:0,i:548}, D{l:10,t:0,i:581}, D{l:11,t:0,i:6}, D{l:12,t:0,i:3}, D{l:12,t:0,i:19}, D{l:14,t:0,i:110}, D{l:142,t:0,i:289}, D{l:139,t:0,i:369}, D{l:7,t:11,i:630}, D{l:9,t:11,i:567}, D{l:11,t:11,i:150}, D{l:11,t:11,i:444}, D{l:141,t:11,i:119}, D{l:134,t:11,i:539}, D{l:7,t:10,i:1995}, D{l:8,t:10,i:299}, D{l:11,t:10,i:890}, D{l:140,t:10,i:674}, D{l:7,t:0,i:34}, D{l:7,t:0,i:190}, D{l:8,t:0,i:28}, D{l:8,t:0,i:141}, D{l:8,t:0,i:444}, D{l:8,t:0,i:811}, D{l:9,t:0,i:468}, D{l:11,t:0,i:334}, D{l:12,t:0,i:24}, D{l:12,t:0,i:386}, D{l:140,t:0,i:576}, D{l:133,t:0,i:757}, D{l:7,t:0,i:1553}, D{l:136,t:0,i:898}, D{l:133,t:0,i:721}, D{l:136,t:0,i:1012}, D{l:4,t:0,i:789}, D{l:5,t:0,i:647}, D{l:135,t:0,i:1102}, D{l:132,t:0,i:898}, D{l:10,t:0,i:183}, D{l:4,t:10,i:238}, D{l:5,t:10,i:503}, D{l:6,t:10,i:179}, D{l:7,t:10,i:2003}, D{l:8,t:10,i:381}, D{l:8,t:10,i:473}, D{l:9,t:10,i:149}, D{l:10,t:10,i:788}, D{l:15,t:10,i:45}, D{l:15,t:10,i:86}, D{l:20,t:10,i:110}, D{l:150,t:10,i:57}, D{l:9,t:0,i:136}, D{l:19,t:0,i:107}, D{l:4,t:10,i:121}, D{l:5,t:10,i:156}, D{l:5,t:10,i:349}, D{l:10,t:10,i:605}, D{l:142,t:10,i:342}, D{l:4,t:11,i:235}, D{l:135,t:11,i:255}, D{l:4,t:11,i:194}, D{l:5,t:11,i:584}, D{l:6,t:11,i:384}, D{l:7,t:11,i:583}, D{l:10,t:11,i:761}, D{l:11,t:11,i:760}, D{l:139,t:11,i:851}, D{l:6,t:10,i:80}, D{l:6,t:10,i:1694}, D{l:7,t:10,i:173}, D{l:7,t:10,i:1974}, D{l:9,t:10,i:547}, D{l:10,t:10,i:730}, D{l:14,t:10,i:18}, D{l:150,t:10,i:39}, D{l:4,t:10,i:923}, D{l:134,t:10,i:1711}, D{l:5,t:0,i:277}, D{l:141,t:0,i:247}, D{l:132,t:0,i:435}, D{l:133,t:11,i:562}, D{l:134,t:0,i:1311}, D{l:5,t:11,i:191}, D{l:137,t:11,i:271}, D{l:132,t:10,i:595}, D{l:7,t:11,i:1537}, D{l:14,t:11,i:96}, D{l:143,t:11,i:73}, D{l:5,t:0,i:437}, D{l:7,t:0,i:502}, D{l:7,t:0,i:519}, D{l:7,t:0,i:1122}, D{l:7,t:0,i:1751}, D{l:14,t:0,i:211}, D{l:6,t:10,i:459}, D{l:7,t:10,i:1753}, D{l:7,t:10,i:1805}, D{l:8,t:10,i:658}, D{l:9,t:10,i:1}, D{l:11,t:10,i:959}, D{l:141,t:10,i:446}, D{l:6,t:0,i:814}, D{l:4,t:11,i:470}, D{l:5,t:11,i:473}, D{l:6,t:11,i:153}, D{l:7,t:11,i:1503}, D{l:7,t:11,i:1923}, D{l:10,t:11,i:701}, D{l:11,t:11,i:132}, D{l:11,t:11,i:168}, D{l:11,t:11,i:227}, D{l:11,t:11,i:320}, D{l:11,t:11,i:436}, D{l:11,t:11,i:525}, D{l:11,t:11,i:855}, D{l:12,t:11,i:41}, D{l:12,t:11,i:286}, D{l:13,t:11,i:103}, D{l:13,t:11,i:284}, D{l:14,t:11,i:255}, D{l:14,t:11,i:262}, D{l:15,t:11,i:117}, D{l:143,t:11,i:127}, D{l:5,t:0,i:265}, D{l:6,t:0,i:212}, D{l:135,t:0,i:28}, D{l:138,t:0,i:750}, D{l:133,t:11,i:327}, D{l:6,t:11,i:552}, D{l:7,t:11,i:1754}, D{l:137,t:11,i:604}, D{l:134,t:0,i:2012}, D{l:132,t:0,i:702}, D{l:5,t:11,i:80}, D{l:6,t:11,i:405}, D{l:7,t:11,i:403}, D{l:7,t:11,i:1502}, D{l:7,t:11,i:1626}, D{l:8,t:11,i:456}, D{l:9,t:11,i:487}, D{l:9,t:11,i:853}, D{l:9,t:11,i:889}, D{l:10,t:11,i:309}, D{l:11,t:11,i:721}, D{l:11,t:11,i:994}, D{l:12,t:11,i:430}, D{l:141,t:11,i:165}, D{l:5,t:0,i:808}, D{l:135,t:0,i:2045}, D{l:5,t:0,i:166}, D{l:8,t:0,i:739}, D{l:140,t:0,i:511}, D{l:134,t:10,i:490}, D{l:4,t:11,i:453}, D{l:5,t:11,i:887}, D{l:6,t:11,i:535}, D{l:8,t:11,i:6}, D{l:136,t:11,i:543}, D{l:4,t:0,i:119}, D{l:5,t:0,i:170}, D{l:5,t:0,i:447}, D{l:7,t:0,i:1708}, D{l:7,t:0,i:1889}, D{l:9,t:0,i:357}, D{l:9,t:0,i:719}, D{l:12,t:0,i:486}, D{l:140,t:0,i:596}, D{l:137,t:0,i:500}, D{l:7,t:10,i:250}, D{l:136,t:10,i:507}, D{l:132,t:10,i:158}, D{l:6,t:0,i:809}, D{l:134,t:0,i:1500}, D{l:9,t:0,i:327}, D{l:11,t:0,i:350}, D{l:11,t:0,i:831}, D{l:13,t:0,i:352}, D{l:4,t:10,i:140}, D{l:7,t:10,i:362}, D{l:8,t:10,i:209}, D{l:9,t:10,i:10}, D{l:9,t:10,i:503}, D{l:9,t:10,i:614}, D{l:10,t:10,i:689}, D{l:11,t:10,i:327}, D{l:11,t:10,i:725}, D{l:12,t:10,i:252}, D{l:12,t:10,i:583}, D{l:13,t:10,i:192}, D{l:14,t:10,i:269}, D{l:14,t:10,i:356}, D{l:148,t:10,i:50}, D{l:135,t:11,i:741}, D{l:4,t:0,i:450}, D{l:7,t:0,i:1158}, D{l:19,t:10,i:1}, D{l:19,t:10,i:26}, D{l:150,t:10,i:9}, D{l:6,t:0,i:597}, D{l:135,t:0,i:1318}, D{l:134,t:0,i:1602}, D{l:6,t:10,i:228}, D{l:7,t:10,i:1341}, D{l:9,t:10,i:408}, D{l:138,t:10,i:343}, D{l:7,t:0,i:1375}, D{l:7,t:0,i:1466}, D{l:138,t:0,i:331}, D{l:132,t:0,i:754}, D{l:132,t:10,i:557}, D{l:5,t:11,i:101}, D{l:6,t:11,i:88}, D{l:6,t:11,i:543}, D{l:7,t:11,i:1677}, D{l:9,t:11,i:100}, D{l:10,t:11,i:677}, D{l:14,t:11,i:169}, D{l:14,t:11,i:302}, D{l:14,t:11,i:313}, D{l:15,t:11,i:48}, D{l:143,t:11,i:84}, D{l:134,t:0,i:1368}, D{l:4,t:11,i:310}, D{l:9,t:11,i:795}, D{l:10,t:11,i:733}, D{l:11,t:11,i:451}, D{l:12,t:11,i:249}, D{l:14,t:11,i:115}, D{l:14,t:11,i:286}, D{l:143,t:11,i:100}, D{l:132,t:10,i:548}, D{l:10,t:0,i:557}, D{l:7,t:10,i:197}, D{l:8,t:10,i:142}, D{l:8,t:10,i:325}, D{l:9,t:10,i:150}, D{l:9,t:10,i:596}, D{l:10,t:10,i:353}, D{l:11,t:10,i:74}, D{l:11,t:10,i:315}, D{l:12,t:10,i:662}, D{l:12,t:10,i:681}, D{l:14,t:10,i:423}, D{l:143,t:10,i:141}, D{l:133,t:11,i:587}, D{l:5,t:0,i:850}, D{l:136,t:0,i:799}, D{l:10,t:0,i:908}, D{l:12,t:0,i:701}, D{l:12,t:0,i:757}, D{l:142,t:0,i:466}, D{l:4,t:0,i:62}, D{l:5,t:0,i:275}, D{l:18,t:0,i:19}, D{l:6,t:10,i:399}, D{l:6,t:10,i:579}, D{l:7,t:10,i:692}, D{l:7,t:10,i:846}, D{l:7,t:10,i:1015}, D{l:7,t:10,i:1799}, D{l:8,t:10,i:403}, D{l:9,t:10,i:394}, D{l:10,t:10,i:133}, D{l:12,t:10,i:4}, D{l:12,t:10,i:297}, D{l:12,t:10,i:452}, D{l:16,t:10,i:81}, D{l:18,t:10,i:25}, D{l:21,t:10,i:14}, D{l:22,t:10,i:12}, D{l:151,t:10,i:18}, D{l:12,t:0,i:459}, D{l:7,t:10,i:1546}, D{l:11,t:10,i:299}, D{l:142,t:10,i:407}, D{l:132,t:10,i:177}, D{l:132,t:11,i:498}, D{l:7,t:11,i:217}, D{l:8,t:11,i:140}, D{l:138,t:11,i:610}, D{l:5,t:10,i:411}, D{l:135,t:10,i:653}, D{l:134,t:0,i:1802}, D{l:7,t:10,i:439}, D{l:10,t:10,i:727}, D{l:11,t:10,i:260}, D{l:139,t:10,i:684}, D{l:133,t:11,i:905}, D{l:11,t:11,i:580}, D{l:142,t:11,i:201}, D{l:134,t:0,i:1397}, D{l:5,t:10,i:208}, D{l:7,t:10,i:753}, D{l:135,t:10,i:1528}, D{l:7,t:0,i:238}, D{l:7,t:0,i:2033}, D{l:8,t:0,i:120}, D{l:8,t:0,i:188}, D{l:8,t:0,i:659}, D{l:9,t:0,i:598}, D{l:10,t:0,i:466}, D{l:12,t:0,i:342}, D{l:12,t:0,i:588}, D{l:13,t:0,i:503}, D{l:14,t:0,i:246}, D{l:143,t:0,i:92}, D{l:135,t:11,i:1041}, D{l:4,t:11,i:456}, D{l:7,t:11,i:105}, D{l:7,t:11,i:358}, D{l:7,t:11,i:1637}, D{l:8,t:11,i:643}, D{l:139,t:11,i:483}, D{l:6,t:0,i:1318}, D{l:134,t:0,i:1324}, D{l:4,t:0,i:201}, D{l:7,t:0,i:1744}, D{l:8,t:0,i:602}, D{l:11,t:0,i:247}, D{l:11,t:0,i:826}, D{l:17,t:0,i:65}, D{l:133,t:10,i:242}, D{l:8,t:0,i:164}, D{l:146,t:0,i:62}, D{l:133,t:10,i:953}, D{l:139,t:10,i:802}, D{l:133,t:0,i:615}, D{l:7,t:11,i:1566}, D{l:8,t:11,i:269}, D{l:9,t:11,i:212}, D{l:9,t:11,i:718}, D{l:14,t:11,i:15}, D{l:14,t:11,i:132}, D{l:142,t:11,i:227}, D{l:133,t:10,i:290}, D{l:132,t:10,i:380}, D{l:5,t:10,i:52}, D{l:7,t:10,i:277}, D{l:9,t:10,i:368}, D{l:139,t:10,i:791}, D{l:135,t:0,i:1243}, D{l:133,t:11,i:539}, D{l:11,t:11,i:919}, D{l:141,t:11,i:409}, D{l:136,t:0,i:968}, D{l:133,t:11,i:470}, D{l:134,t:0,i:882}, D{l:132,t:0,i:907}, D{l:5,t:0,i:100}, D{l:10,t:0,i:329}, D{l:12,t:0,i:416}, D{l:149,t:0,i:29}, D{l:10,t:10,i:138}, D{l:139,t:10,i:476}, D{l:5,t:10,i:725}, D{l:5,t:10,i:727}, D{l:6,t:11,i:91}, D{l:7,t:11,i:435}, D{l:135,t:10,i:1811}, D{l:4,t:11,i:16}, D{l:5,t:11,i:316}, D{l:5,t:11,i:842}, D{l:6,t:11,i:370}, D{l:6,t:11,i:1778}, D{l:8,t:11,i:166}, D{l:11,t:11,i:812}, D{l:12,t:11,i:206}, D{l:12,t:11,i:351}, D{l:14,t:11,i:418}, D{l:16,t:11,i:15}, D{l:16,t:11,i:34}, D{l:18,t:11,i:3}, D{l:19,t:11,i:3}, D{l:19,t:11,i:7}, D{l:20,t:11,i:4}, D{l:149,t:11,i:21}, D{l:132,t:0,i:176}, D{l:5,t:0,i:636}, D{l:5,t:0,i:998}, D{l:7,t:0,i:9}, D{l:7,t:0,i:1508}, D{l:8,t:0,i:26}, D{l:9,t:0,i:317}, D{l:9,t:0,i:358}, D{l:10,t:0,i:210}, D{l:10,t:0,i:292}, D{l:10,t:0,i:533}, D{l:11,t:0,i:555}, D{l:12,t:0,i:526}, D{l:12,t:0,i:607}, D{l:13,t:0,i:263}, D{l:13,t:0,i:459}, D{l:142,t:0,i:271}, D{l:6,t:0,i:256}, D{l:8,t:0,i:265}, D{l:4,t:10,i:38}, D{l:7,t:10,i:307}, D{l:7,t:10,i:999}, D{l:7,t:10,i:1481}, D{l:7,t:10,i:1732}, D{l:7,t:10,i:1738}, D{l:9,t:10,i:414}, D{l:11,t:10,i:316}, D{l:12,t:10,i:52}, D{l:13,t:10,i:420}, D{l:147,t:10,i:100}, D{l:135,t:10,i:1296}, D{l:4,t:11,i:611}, D{l:133,t:11,i:606}, D{l:4,t:0,i:643}, D{l:142,t:11,i:21}, D{l:133,t:11,i:715}, D{l:133,t:10,i:723}, D{l:6,t:0,i:610}, D{l:135,t:11,i:597}, D{l:10,t:0,i:127}, D{l:141,t:0,i:27}, D{l:6,t:0,i:1995}, D{l:6,t:0,i:2001}, D{l:8,t:0,i:119}, D{l:136,t:0,i:973}, D{l:4,t:11,i:149}, D{l:138,t:11,i:368}, D{l:12,t:0,i:522}, D{l:4,t:11,i:154}, D{l:5,t:10,i:109}, D{l:6,t:10,i:1784}, D{l:7,t:11,i:1134}, D{l:7,t:10,i:1895}, D{l:8,t:11,i:105}, D{l:12,t:10,i:296}, D{l:140,t:10,i:302}, D{l:4,t:11,i:31}, D{l:6,t:11,i:429}, D{l:7,t:11,i:962}, D{l:9,t:11,i:458}, D{l:139,t:11,i:691}, D{l:10,t:0,i:553}, D{l:11,t:0,i:876}, D{l:13,t:0,i:193}, D{l:13,t:0,i:423}, D{l:14,t:0,i:166}, D{l:19,t:0,i:84}, D{l:4,t:11,i:312}, D{l:5,t:10,i:216}, D{l:7,t:10,i:1879}, D{l:9,t:10,i:141}, D{l:9,t:10,i:270}, D{l:9,t:10,i:679}, D{l:10,t:10,i:159}, D{l:11,t:10,i:197}, D{l:12,t:10,i:538}, D{l:12,t:10,i:559}, D{l:14,t:10,i:144}, D{l:14,t:10,i:167}, D{l:143,t:10,i:67}, D{l:134,t:0,i:1582}, D{l:7,t:0,i:1578}, D{l:135,t:11,i:1578}, D{l:137,t:10,i:81}, D{l:132,t:11,i:236}, D{l:134,t:10,i:391}, D{l:134,t:0,i:795}, D{l:7,t:10,i:322}, D{l:136,t:10,i:249}, D{l:5,t:11,i:836}, D{l:5,t:11,i:857}, D{l:6,t:11,i:1680}, D{l:7,t:11,i:59}, D{l:147,t:11,i:53}, D{l:135,t:0,i:432}, D{l:10,t:11,i:68}, D{l:139,t:11,i:494}, D{l:4,t:11,i:81}, D{l:139,t:11,i:867}, D{l:7,t:0,i:126}, D{l:136,t:0,i:84}, D{l:142,t:11,i:280}, D{l:5,t:11,i:282}, D{l:8,t:11,i:650}, D{l:9,t:11,i:295}, D{l:9,t:11,i:907}, D{l:138,t:11,i:443}, D{l:136,t:0,i:790}, D{l:5,t:10,i:632}, D{l:138,t:10,i:526}, D{l:6,t:0,i:64}, D{l:12,t:0,i:377}, D{l:13,t:0,i:309}, D{l:14,t:0,i:141}, D{l:14,t:0,i:429}, D{l:14,t:11,i:141}, D{l:142,t:11,i:429}, D{l:134,t:0,i:1529}, D{l:6,t:0,i:321}, D{l:7,t:0,i:1857}, D{l:9,t:0,i:530}, D{l:19,t:0,i:99}, D{l:7,t:10,i:948}, D{l:7,t:10,i:1042}, D{l:8,t:10,i:235}, D{l:8,t:10,i:461}, D{l:9,t:10,i:453}, D{l:10,t:10,i:354}, D{l:145,t:10,i:77}, D{l:7,t:0,i:1104}, D{l:11,t:0,i:269}, D{l:11,t:0,i:539}, D{l:11,t:0,i:627}, D{l:11,t:0,i:706}, D{l:11,t:0,i:975}, D{l:12,t:0,i:248}, D{l:12,t:0,i:434}, D{l:12,t:0,i:600}, D{l:12,t:0,i:622}, D{l:13,t:0,i:297}, D{l:13,t:0,i:485}, D{l:14,t:0,i:69}, D{l:14,t:0,i:409}, D{l:143,t:0,i:108}, D{l:4,t:10,i:362}, D{l:7,t:10,i:52}, D{l:7,t:10,i:303}, D{l:10,t:11,i:70}, D{l:12,t:11,i:26}, D{l:14,t:11,i:17}, D{l:14,t:11,i:178}, D{l:15,t:11,i:34}, D{l:149,t:11,i:12}, D{l:11,t:0,i:977}, D{l:141,t:0,i:507}, D{l:9,t:0,i:34}, D{l:139,t:0,i:484}, D{l:5,t:10,i:196}, D{l:6,t:10,i:486}, D{l:7,t:10,i:212}, D{l:8,t:10,i:309}, D{l:136,t:10,i:346}, D{l:6,t:0,i:1700}, D{l:7,t:0,i:26}, D{l:7,t:0,i:293}, D{l:7,t:0,i:382}, D{l:7,t:0,i:1026}, D{l:7,t:0,i:1087}, D{l:7,t:0,i:2027}, D{l:8,t:0,i:24}, D{l:8,t:0,i:114}, D{l:8,t:0,i:252}, D{l:8,t:0,i:727}, D{l:8,t:0,i:729}, D{l:9,t:0,i:30}, D{l:9,t:0,i:199}, D{l:9,t:0,i:231}, D{l:9,t:0,i:251}, D{l:9,t:0,i:334}, D{l:9,t:0,i:361}, D{l:9,t:0,i:712}, D{l:10,t:0,i:55}, D{l:10,t:0,i:60}, D{l:10,t:0,i:232}, D{l:10,t:0,i:332}, D{l:10,t:0,i:384}, D{l:10,t:0,i:396}, D{l:10,t:0,i:504}, D{l:10,t:0,i:542}, D{l:10,t:0,i:652}, D{l:11,t:0,i:20}, D{l:11,t:0,i:48}, D{l:11,t:0,i:207}, D{l:11,t:0,i:291}, D{l:11,t:0,i:298}, D{l:11,t:0,i:342}, D{l:11,t:0,i:365}, D{l:11,t:0,i:394}, D{l:11,t:0,i:620}, D{l:11,t:0,i:705}, D{l:11,t:0,i:1017}, D{l:12,t:0,i:123}, D{l:12,t:0,i:340}, D{l:12,t:0,i:406}, D{l:12,t:0,i:643}, D{l:13,t:0,i:61}, D{l:13,t:0,i:269}, D{l:13,t:0,i:311}, D{l:13,t:0,i:319}, D{l:13,t:0,i:486}, D{l:14,t:0,i:234}, D{l:15,t:0,i:62}, D{l:15,t:0,i:85}, D{l:16,t:0,i:71}, D{l:18,t:0,i:119}, D{l:20,t:0,i:105}, D{l:135,t:10,i:1912}, D{l:4,t:11,i:71}, D{l:5,t:11,i:376}, D{l:7,t:11,i:119}, D{l:138,t:11,i:665}, D{l:10,t:0,i:918}, D{l:10,t:0,i:926}, D{l:4,t:10,i:686}, D{l:136,t:11,i:55}, D{l:138,t:10,i:625}, D{l:136,t:10,i:706}, D{l:132,t:11,i:479}, D{l:4,t:10,i:30}, D{l:133,t:10,i:43}, D{l:6,t:0,i:379}, D{l:7,t:0,i:270}, D{l:8,t:0,i:176}, D{l:8,t:0,i:183}, D{l:9,t:0,i:432}, D{l:9,t:0,i:661}, D{l:12,t:0,i:247}, D{l:12,t:0,i:617}, D{l:18,t:0,i:125}, D{l:7,t:11,i:607}, D{l:8,t:11,i:99}, D{l:152,t:11,i:4}, D{l:5,t:0,i:792}, D{l:133,t:0,i:900}, D{l:4,t:11,i:612}, D{l:133,t:11,i:561}, D{l:4,t:11,i:41}, D{l:4,t:10,i:220}, D{l:5,t:11,i:74}, D{l:7,t:10,i:1535}, D{l:7,t:11,i:1627}, D{l:11,t:11,i:871}, D{l:140,t:11,i:619}, D{l:135,t:0,i:1920}, D{l:7,t:11,i:94}, D{l:11,t:11,i:329}, D{l:11,t:11,i:965}, D{l:12,t:11,i:241}, D{l:14,t:11,i:354}, D{l:15,t:11,i:22}, D{l:148,t:11,i:63}, D{l:9,t:11,i:209}, D{l:137,t:11,i:300}, D{l:134,t:0,i:771}, D{l:135,t:0,i:1979}, D{l:4,t:0,i:901}, D{l:133,t:0,i:776}, D{l:142,t:0,i:254}, D{l:133,t:11,i:98}, D{l:9,t:11,i:16}, D{l:141,t:11,i:386}, D{l:133,t:11,i:984}, D{l:4,t:11,i:182}, D{l:6,t:11,i:205}, D{l:135,t:11,i:220}, D{l:7,t:10,i:1725}, D{l:7,t:10,i:1774}, D{l:138,t:10,i:393}, D{l:5,t:10,i:263}, D{l:134,t:10,i:414}, D{l:4,t:11,i:42}, D{l:9,t:11,i:205}, D{l:9,t:11,i:786}, D{l:138,t:11,i:659}, D{l:14,t:0,i:140}, D{l:148,t:0,i:41}, D{l:8,t:0,i:440}, D{l:10,t:0,i:359}, D{l:6,t:10,i:178}, D{l:6,t:11,i:289}, D{l:6,t:10,i:1750}, D{l:7,t:11,i:1670}, D{l:9,t:10,i:690}, D{l:10,t:10,i:155}, D{l:10,t:10,i:373}, D{l:11,t:10,i:698}, D{l:12,t:11,i:57}, D{l:13,t:10,i:155}, D{l:20,t:10,i:93}, D{l:151,t:11,i:4}, D{l:4,t:0,i:37}, D{l:5,t:0,i:334}, D{l:7,t:0,i:1253}, D{l:151,t:11,i:25}, D{l:4,t:0,i:508}, D{l:4,t:11,i:635}, D{l:5,t:10,i:97}, D{l:137,t:10,i:393}, D{l:139,t:11,i:533}, D{l:4,t:0,i:640}, D{l:133,t:0,i:513}, D{l:134,t:10,i:1639}, D{l:132,t:11,i:371}, D{l:4,t:11,i:272}, D{l:7,t:11,i:836}, D{l:7,t:11,i:1651}, D{l:145,t:11,i:89}, D{l:5,t:11,i:825}, D{l:6,t:11,i:444}, D{l:6,t:11,i:1640}, D{l:136,t:11,i:308}, D{l:4,t:10,i:191}, D{l:7,t:10,i:934}, D{l:8,t:10,i:647}, D{l:145,t:10,i:97}, D{l:12,t:0,i:246}, D{l:15,t:0,i:162}, D{l:19,t:0,i:64}, D{l:20,t:0,i:8}, D{l:20,t:0,i:95}, D{l:22,t:0,i:24}, D{l:152,t:0,i:17}, D{l:4,t:0,i:533}, D{l:5,t:10,i:165}, D{l:9,t:10,i:346}, D{l:138,t:10,i:655}, D{l:5,t:11,i:737}, D{l:139,t:10,i:885}, D{l:133,t:10,i:877}, D{l:8,t:10,i:128}, D{l:139,t:10,i:179}, D{l:137,t:11,i:307}, D{l:140,t:0,i:752}, D{l:133,t:0,i:920}, D{l:135,t:0,i:1048}, D{l:5,t:0,i:153}, D{l:6,t:0,i:580}, D{l:6,t:10,i:1663}, D{l:7,t:10,i:132}, D{l:7,t:10,i:1154}, D{l:7,t:10,i:1415}, D{l:7,t:10,i:1507}, D{l:12,t:10,i:493}, D{l:15,t:10,i:105}, D{l:151,t:10,i:15}, D{l:5,t:10,i:459}, D{l:7,t:10,i:1073}, D{l:8,t:10,i:241}, D{l:136,t:10,i:334}, D{l:138,t:0,i:391}, D{l:135,t:0,i:1952}, D{l:133,t:11,i:525}, D{l:8,t:11,i:641}, D{l:11,t:11,i:388}, D{l:140,t:11,i:580}, D{l:142,t:0,i:126}, D{l:134,t:0,i:640}, D{l:132,t:0,i:483}, D{l:7,t:0,i:1616}, D{l:9,t:0,i:69}, D{l:6,t:10,i:324}, D{l:6,t:10,i:520}, D{l:7,t:10,i:338}, D{l:7,t:10,i:1729}, D{l:8,t:10,i:228}, D{l:139,t:10,i:750}, D{l:5,t:11,i:493}, D{l:134,t:11,i:528}, D{l:135,t:0,i:734}, D{l:4,t:11,i:174}, D{l:135,t:11,i:911}, D{l:138,t:0,i:480}, D{l:9,t:0,i:495}, D{l:146,t:0,i:104}, D{l:135,t:10,i:705}, D{l:9,t:0,i:472}, D{l:4,t:10,i:73}, D{l:6,t:10,i:612}, D{l:7,t:10,i:927}, D{l:7,t:10,i:1330}, D{l:7,t:10,i:1822}, D{l:8,t:10,i:217}, D{l:9,t:10,i:765}, D{l:9,t:10,i:766}, D{l:10,t:10,i:408}, D{l:11,t:10,i:51}, D{l:11,t:10,i:793}, D{l:12,t:10,i:266}, D{l:15,t:10,i:158}, D{l:20,t:10,i:89}, D{l:150,t:10,i:32}, D{l:7,t:11,i:548}, D{l:137,t:11,i:58}, D{l:4,t:11,i:32}, D{l:5,t:11,i:215}, D{l:6,t:11,i:269}, D{l:7,t:11,i:1782}, D{l:7,t:11,i:1892}, D{l:10,t:11,i:16}, D{l:11,t:11,i:822}, D{l:11,t:11,i:954}, D{l:141,t:11,i:481}, D{l:132,t:0,i:874}, D{l:9,t:0,i:229}, D{l:5,t:10,i:389}, D{l:136,t:10,i:636}, D{l:7,t:11,i:1749}, D{l:136,t:11,i:477}, D{l:134,t:0,i:948}, D{l:5,t:11,i:308}, D{l:135,t:11,i:1088}, D{l:4,t:0,i:748}, D{l:139,t:0,i:1009}, D{l:136,t:10,i:21}, D{l:6,t:0,i:555}, D{l:135,t:0,i:485}, D{l:5,t:11,i:126}, D{l:8,t:11,i:297}, D{l:9,t:11,i:366}, D{l:9,t:11,i:445}, D{l:12,t:11,i:53}, D{l:12,t:11,i:374}, D{l:141,t:11,i:492}, D{l:7,t:11,i:1551}, D{l:139,t:11,i:361}, D{l:136,t:0,i:193}, D{l:136,t:0,i:472}, D{l:8,t:0,i:653}, D{l:13,t:0,i:93}, D{l:147,t:0,i:14}, D{l:132,t:0,i:984}, D{l:132,t:11,i:175}, D{l:5,t:0,i:172}, D{l:6,t:0,i:1971}, D{l:132,t:11,i:685}, D{l:149,t:11,i:8}, D{l:133,t:11,i:797}, D{l:13,t:0,i:83}, D{l:5,t:10,i:189}, D{l:7,t:10,i:442}, D{l:7,t:10,i:443}, D{l:8,t:10,i:281}, D{l:12,t:10,i:174}, D{l:141,t:10,i:261}, D{l:134,t:0,i:1568}, D{l:133,t:11,i:565}, D{l:139,t:0,i:384}, D{l:133,t:0,i:260}, D{l:7,t:0,i:758}, D{l:7,t:0,i:880}, D{l:7,t:0,i:1359}, D{l:9,t:0,i:164}, D{l:9,t:0,i:167}, D{l:10,t:0,i:156}, D{l:10,t:0,i:588}, D{l:12,t:0,i:101}, D{l:14,t:0,i:48}, D{l:15,t:0,i:70}, D{l:6,t:10,i:2}, D{l:7,t:10,i:1262}, D{l:7,t:10,i:1737}, D{l:8,t:10,i:22}, D{l:8,t:10,i:270}, D{l:8,t:10,i:612}, D{l:9,t:10,i:312}, D{l:9,t:10,i:436}, D{l:10,t:10,i:311}, D{l:10,t:10,i:623}, D{l:11,t:10,i:72}, D{l:11,t:10,i:330}, D{l:11,t:10,i:455}, D{l:12,t:10,i:321}, D{l:12,t:10,i:504}, D{l:12,t:10,i:530}, D{l:12,t:10,i:543}, D{l:13,t:10,i:17}, D{l:13,t:10,i:156}, D{l:13,t:10,i:334}, D{l:17,t:10,i:60}, D{l:148,t:10,i:64}, D{l:4,t:11,i:252}, D{l:7,t:11,i:1068}, D{l:10,t:11,i:434}, D{l:11,t:11,i:228}, D{l:11,t:11,i:426}, D{l:13,t:11,i:231}, D{l:18,t:11,i:106}, D{l:148,t:11,i:87}, D{l:7,t:10,i:354}, D{l:10,t:10,i:410}, D{l:139,t:10,i:815}, D{l:6,t:0,i:367}, D{l:7,t:10,i:670}, D{l:7,t:10,i:1327}, D{l:8,t:10,i:411}, D{l:8,t:10,i:435}, D{l:9,t:10,i:653}, D{l:9,t:10,i:740}, D{l:10,t:10,i:385}, D{l:11,t:10,i:222}, D{l:11,t:10,i:324}, D{l:11,t:10,i:829}, D{l:140,t:10,i:611}, D{l:7,t:0,i:1174}, D{l:6,t:10,i:166}, D{l:135,t:10,i:374}, D{l:146,t:0,i:121}, D{l:132,t:0,i:828}, D{l:5,t:11,i:231}, D{l:138,t:11,i:509}, D{l:7,t:11,i:601}, D{l:9,t:11,i:277}, D{l:9,t:11,i:674}, D{l:10,t:11,i:178}, D{l:10,t:11,i:257}, D{l:10,t:11,i:418}, D{l:11,t:11,i:531}, D{l:11,t:11,i:544}, D{l:11,t:11,i:585}, D{l:12,t:11,i:113}, D{l:12,t:11,i:475}, D{l:13,t:11,i:99}, D{l:142,t:11,i:428}, D{l:134,t:0,i:1541}, D{l:135,t:11,i:1779}, D{l:5,t:0,i:343}, D{l:134,t:10,i:398}, D{l:135,t:10,i:50}, D{l:135,t:11,i:1683}, D{l:4,t:0,i:440}, D{l:7,t:0,i:57}, D{l:8,t:0,i:167}, D{l:8,t:0,i:375}, D{l:9,t:0,i:82}, D{l:9,t:0,i:561}, D{l:9,t:0,i:744}, D{l:10,t:0,i:620}, D{l:137,t:11,i:744}, D{l:134,t:0,i:926}, D{l:6,t:10,i:517}, D{l:7,t:10,i:1159}, D{l:10,t:10,i:621}, D{l:139,t:10,i:192}, D{l:137,t:0,i:827}, D{l:8,t:0,i:194}, D{l:136,t:0,i:756}, D{l:10,t:10,i:223}, D{l:139,t:10,i:645}, D{l:7,t:10,i:64}, D{l:136,t:10,i:245}, D{l:4,t:11,i:399}, D{l:5,t:11,i:119}, D{l:5,t:11,i:494}, D{l:7,t:11,i:751}, D{l:137,t:11,i:556}, D{l:132,t:0,i:808}, D{l:135,t:0,i:22}, D{l:7,t:10,i:1763}, D{l:140,t:10,i:310}, D{l:5,t:0,i:639}, D{l:7,t:0,i:1249}, D{l:11,t:0,i:896}, D{l:134,t:11,i:584}, D{l:134,t:0,i:1614}, D{l:135,t:0,i:860}, D{l:135,t:11,i:1121}, D{l:5,t:10,i:129}, D{l:6,t:10,i:61}, D{l:135,t:10,i:947}, D{l:4,t:0,i:102}, D{l:7,t:0,i:815}, D{l:7,t:0,i:1699}, D{l:139,t:0,i:964}, D{l:13,t:10,i:505}, D{l:141,t:10,i:506}, D{l:139,t:10,i:1000}, D{l:132,t:11,i:679}, D{l:132,t:0,i:899}, D{l:132,t:0,i:569}, D{l:5,t:11,i:694}, D{l:137,t:11,i:714}, D{l:136,t:0,i:795}, D{l:6,t:0,i:2045}, D{l:139,t:11,i:7}, D{l:6,t:0,i:52}, D{l:9,t:0,i:104}, D{l:9,t:0,i:559}, D{l:12,t:0,i:308}, D{l:147,t:0,i:87}, D{l:4,t:0,i:301}, D{l:132,t:0,i:604}, D{l:133,t:10,i:637}, D{l:136,t:0,i:779}, D{l:5,t:11,i:143}, D{l:5,t:11,i:769}, D{l:6,t:11,i:1760}, D{l:7,t:11,i:682}, D{l:7,t:11,i:1992}, D{l:136,t:11,i:736}, D{l:137,t:10,i:590}, D{l:147,t:0,i:32}, D{l:137,t:11,i:527}, D{l:5,t:10,i:280}, D{l:135,t:10,i:1226}, D{l:134,t:0,i:494}, D{l:6,t:0,i:677}, D{l:6,t:0,i:682}, D{l:134,t:0,i:1044}, D{l:133,t:10,i:281}, D{l:135,t:10,i:1064}, D{l:7,t:0,i:508}, D{l:133,t:11,i:860}, D{l:6,t:11,i:422}, D{l:7,t:11,i:0}, D{l:7,t:11,i:1544}, D{l:9,t:11,i:577}, D{l:11,t:11,i:990}, D{l:12,t:11,i:141}, D{l:12,t:11,i:453}, D{l:13,t:11,i:47}, D{l:141,t:11,i:266}, D{l:134,t:0,i:1014}, D{l:5,t:11,i:515}, D{l:137,t:11,i:131}, D{l:134,t:0,i:957}, D{l:132,t:11,i:646}, D{l:6,t:0,i:310}, D{l:7,t:0,i:1849}, D{l:8,t:0,i:72}, D{l:8,t:0,i:272}, D{l:8,t:0,i:431}, D{l:9,t:0,i:12}, D{l:9,t:0,i:376}, D{l:10,t:0,i:563}, D{l:10,t:0,i:630}, D{l:10,t:0,i:796}, D{l:10,t:0,i:810}, D{l:11,t:0,i:367}, D{l:11,t:0,i:599}, D{l:11,t:0,i:686}, D{l:140,t:0,i:672}, D{l:7,t:0,i:570}, D{l:4,t:11,i:396}, D{l:7,t:10,i:120}, D{l:7,t:11,i:728}, D{l:8,t:10,i:489}, D{l:9,t:11,i:117}, D{l:9,t:10,i:319}, D{l:10,t:10,i:820}, D{l:11,t:10,i:1004}, D{l:12,t:10,i:379}, D{l:12,t:10,i:679}, D{l:13,t:10,i:117}, D{l:13,t:11,i:202}, D{l:13,t:10,i:412}, D{l:14,t:10,i:25}, D{l:15,t:10,i:52}, D{l:15,t:10,i:161}, D{l:16,t:10,i:47}, D{l:20,t:11,i:51}, D{l:149,t:10,i:2}, D{l:6,t:11,i:121}, D{l:6,t:11,i:124}, D{l:6,t:11,i:357}, D{l:7,t:11,i:1138}, D{l:7,t:11,i:1295}, D{l:8,t:11,i:162}, D{l:139,t:11,i:655}, D{l:8,t:0,i:449}, D{l:4,t:10,i:937}, D{l:5,t:10,i:801}, D{l:136,t:11,i:449}, D{l:139,t:11,i:958}, D{l:6,t:0,i:181}, D{l:7,t:0,i:537}, D{l:8,t:0,i:64}, D{l:9,t:0,i:127}, D{l:10,t:0,i:496}, D{l:12,t:0,i:510}, D{l:141,t:0,i:384}, D{l:138,t:11,i:253}, D{l:4,t:0,i:244}, D{l:135,t:0,i:233}, D{l:133,t:11,i:237}, D{l:132,t:10,i:365}, D{l:6,t:0,i:1650}, D{l:10,t:0,i:702}, D{l:139,t:0,i:245}, D{l:5,t:10,i:7}, D{l:139,t:10,i:774}, D{l:13,t:0,i:463}, D{l:20,t:0,i:49}, D{l:13,t:11,i:463}, D{l:148,t:11,i:49}, D{l:4,t:10,i:734}, D{l:5,t:10,i:662}, D{l:134,t:10,i:430}, D{l:4,t:10,i:746}, D{l:135,t:10,i:1090}, D{l:5,t:10,i:360}, D{l:136,t:10,i:237}, D{l:137,t:0,i:338}, D{l:143,t:11,i:10}, D{l:7,t:11,i:571}, D{l:138,t:11,i:366}, D{l:134,t:0,i:1279}, D{l:9,t:11,i:513}, D{l:10,t:11,i:22}, D{l:10,t:11,i:39}, D{l:12,t:11,i:122}, D{l:140,t:11,i:187}, D{l:133,t:0,i:896}, D{l:146,t:0,i:178}, D{l:134,t:0,i:695}, D{l:137,t:0,i:808}, D{l:134,t:11,i:587}, D{l:7,t:11,i:107}, D{l:7,t:11,i:838}, D{l:8,t:11,i:550}, D{l:138,t:11,i:401}, D{l:7,t:0,i:1117}, D{l:136,t:0,i:539}, D{l:4,t:10,i:277}, D{l:5,t:10,i:608}, D{l:6,t:10,i:493}, D{l:7,t:10,i:457}, D{l:140,t:10,i:384}, D{l:133,t:11,i:768}, D{l:12,t:0,i:257}, D{l:7,t:10,i:27}, D{l:135,t:10,i:316}, D{l:140,t:0,i:1003}, D{l:4,t:0,i:207}, D{l:5,t:0,i:586}, D{l:5,t:0,i:676}, D{l:6,t:0,i:448}, D{l:8,t:0,i:244}, D{l:11,t:0,i:1}, D{l:13,t:0,i:3}, D{l:16,t:0,i:54}, D{l:17,t:0,i:4}, D{l:18,t:0,i:13}, D{l:133,t:10,i:552}, D{l:4,t:10,i:401}, D{l:137,t:10,i:264}, D{l:5,t:0,i:516}, D{l:7,t:0,i:1883}, D{l:135,t:11,i:1883}, D{l:12,t:0,i:960}, D{l:132,t:11,i:894}, D{l:5,t:0,i:4}, D{l:5,t:0,i:810}, D{l:6,t:0,i:13}, D{l:6,t:0,i:538}, D{l:6,t:0,i:1690}, D{l:6,t:0,i:1726}, D{l:7,t:0,i:499}, D{l:7,t:0,i:1819}, D{l:8,t:0,i:148}, D{l:8,t:0,i:696}, D{l:8,t:0,i:791}, D{l:12,t:0,i:125}, D{l:143,t:0,i:9}, D{l:135,t:0,i:1268}, D{l:11,t:0,i:30}, D{l:14,t:0,i:315}, D{l:9,t:10,i:543}, D{l:10,t:10,i:524}, D{l:12,t:10,i:524}, D{l:16,t:10,i:18}, D{l:20,t:10,i:26}, D{l:148,t:10,i:65}, D{l:6,t:0,i:748}, D{l:4,t:10,i:205}, D{l:5,t:10,i:623}, D{l:7,t:10,i:104}, D{l:136,t:10,i:519}, D{l:11,t:0,i:542}, D{l:139,t:0,i:852}, D{l:140,t:0,i:6}, D{l:132,t:0,i:848}, D{l:7,t:0,i:1385}, D{l:11,t:0,i:582}, D{l:11,t:0,i:650}, D{l:11,t:0,i:901}, D{l:11,t:0,i:949}, D{l:12,t:0,i:232}, D{l:12,t:0,i:236}, D{l:13,t:0,i:413}, D{l:13,t:0,i:501}, D{l:18,t:0,i:116}, D{l:7,t:10,i:579}, D{l:9,t:10,i:41}, D{l:9,t:10,i:244}, D{l:9,t:10,i:669}, D{l:10,t:10,i:5}, D{l:11,t:10,i:861}, D{l:11,t:10,i:951}, D{l:139,t:10,i:980}, D{l:4,t:0,i:945}, D{l:6,t:0,i:1811}, D{l:6,t:0,i:1845}, D{l:6,t:0,i:1853}, D{l:6,t:0,i:1858}, D{l:8,t:0,i:862}, D{l:12,t:0,i:782}, D{l:12,t:0,i:788}, D{l:18,t:0,i:160}, D{l:148,t:0,i:117}, D{l:132,t:10,i:717}, D{l:4,t:0,i:925}, D{l:5,t:0,i:803}, D{l:8,t:0,i:698}, D{l:138,t:0,i:828}, D{l:134,t:0,i:1416}, D{l:132,t:0,i:610}, D{l:139,t:0,i:992}, D{l:6,t:0,i:878}, D{l:134,t:0,i:1477}, D{l:135,t:0,i:1847}, D{l:138,t:11,i:531}, D{l:137,t:11,i:539}, D{l:134,t:11,i:272}, D{l:133,t:0,i:383}, D{l:134,t:0,i:1404}, D{l:132,t:10,i:489}, D{l:4,t:11,i:9}, D{l:5,t:11,i:128}, D{l:7,t:11,i:368}, D{l:11,t:11,i:480}, D{l:148,t:11,i:3}, D{l:136,t:0,i:986}, D{l:9,t:0,i:660}, D{l:138,t:0,i:347}, D{l:135,t:10,i:892}, D{l:136,t:11,i:682}, D{l:7,t:0,i:572}, D{l:9,t:0,i:592}, D{l:11,t:0,i:680}, D{l:12,t:0,i:356}, D{l:140,t:0,i:550}, D{l:7,t:0,i:1411}, D{l:138,t:11,i:527}, D{l:4,t:11,i:2}, D{l:7,t:11,i:545}, D{l:135,t:11,i:894}, D{l:137,t:10,i:473}, D{l:11,t:0,i:64}, D{l:7,t:11,i:481}, D{l:7,t:10,i:819}, D{l:9,t:10,i:26}, D{l:9,t:10,i:392}, D{l:9,t:11,i:792}, D{l:10,t:10,i:152}, D{l:10,t:10,i:226}, D{l:12,t:10,i:276}, D{l:12,t:10,i:426}, D{l:12,t:10,i:589}, D{l:13,t:10,i:460}, D{l:15,t:10,i:97}, D{l:19,t:10,i:48}, D{l:148,t:10,i:104}, D{l:135,t:10,i:51}, D{l:136,t:11,i:445}, D{l:136,t:11,i:646}, D{l:135,t:0,i:606}, D{l:132,t:10,i:674}, D{l:6,t:0,i:1829}, D{l:134,t:0,i:1830}, D{l:132,t:10,i:770}, D{l:5,t:10,i:79}, D{l:7,t:10,i:1027}, D{l:7,t:10,i:1477}, D{l:139,t:10,i:52}, D{l:5,t:11,i:530}, D{l:142,t:11,i:113}, D{l:134,t:10,i:1666}, D{l:7,t:0,i:748}, D{l:139,t:0,i:700}, D{l:134,t:10,i:195}, D{l:133,t:10,i:789}, D{l:9,t:0,i:87}, D{l:10,t:0,i:365}, D{l:4,t:10,i:251}, D{l:4,t:10,i:688}, D{l:7,t:10,i:513}, D{l:135,t:10,i:1284}, D{l:136,t:11,i:111}, D{l:133,t:0,i:127}, D{l:6,t:0,i:198}, D{l:140,t:0,i:83}, D{l:133,t:11,i:556}, D{l:133,t:10,i:889}, D{l:4,t:10,i:160}, D{l:5,t:10,i:330}, D{l:7,t:10,i:1434}, D{l:136,t:10,i:174}, D{l:5,t:0,i:276}, D{l:6,t:0,i:55}, D{l:7,t:0,i:1369}, D{l:138,t:0,i:864}, D{l:8,t:11,i:16}, D{l:140,t:11,i:568}, D{l:6,t:0,i:1752}, D{l:136,t:0,i:726}, D{l:135,t:0,i:1066}, D{l:133,t:0,i:764}, D{l:6,t:11,i:186}, D{l:137,t:11,i:426}, D{l:11,t:0,i:683}, D{l:139,t:11,i:683}, D{l:6,t:0,i:309}, D{l:7,t:0,i:331}, D{l:138,t:0,i:550}, D{l:133,t:10,i:374}, D{l:6,t:0,i:1212}, D{l:6,t:0,i:1852}, D{l:7,t:0,i:1062}, D{l:8,t:0,i:874}, D{l:8,t:0,i:882}, D{l:138,t:0,i:936}, D{l:132,t:11,i:585}, D{l:134,t:0,i:1364}, D{l:7,t:0,i:986}, D{l:133,t:10,i:731}, D{l:6,t:0,i:723}, D{l:6,t:0,i:1408}, D{l:138,t:0,i:381}, D{l:135,t:0,i:1573}, D{l:134,t:0,i:1025}, D{l:4,t:10,i:626}, D{l:5,t:10,i:642}, D{l:6,t:10,i:425}, D{l:10,t:10,i:202}, D{l:139,t:10,i:141}, D{l:4,t:11,i:93}, D{l:5,t:11,i:252}, D{l:6,t:11,i:229}, D{l:7,t:11,i:291}, D{l:9,t:11,i:550}, D{l:139,t:11,i:644}, D{l:137,t:11,i:749}, D{l:137,t:11,i:162}, D{l:132,t:11,i:381}, D{l:135,t:0,i:1559}, D{l:6,t:0,i:194}, D{l:7,t:0,i:133}, D{l:10,t:0,i:493}, D{l:10,t:0,i:570}, D{l:139,t:0,i:664}, D{l:5,t:0,i:24}, D{l:5,t:0,i:569}, D{l:6,t:0,i:3}, D{l:6,t:0,i:119}, D{l:6,t:0,i:143}, D{l:6,t:0,i:440}, D{l:7,t:0,i:295}, D{l:7,t:0,i:599}, D{l:7,t:0,i:1686}, D{l:7,t:0,i:1854}, D{l:8,t:0,i:424}, D{l:9,t:0,i:43}, D{l:9,t:0,i:584}, D{l:9,t:0,i:760}, D{l:10,t:0,i:148}, D{l:10,t:0,i:328}, D{l:11,t:0,i:159}, D{l:11,t:0,i:253}, D{l:11,t:0,i:506}, D{l:12,t:0,i:487}, D{l:140,t:0,i:531}, D{l:6,t:0,i:661}, D{l:134,t:0,i:1517}, D{l:136,t:10,i:835}, D{l:151,t:10,i:17}, D{l:5,t:0,i:14}, D{l:5,t:0,i:892}, D{l:6,t:0,i:283}, D{l:7,t:0,i:234}, D{l:136,t:0,i:537}, D{l:139,t:0,i:541}, D{l:4,t:0,i:126}, D{l:8,t:0,i:635}, D{l:147,t:0,i:34}, D{l:4,t:0,i:316}, D{l:4,t:0,i:495}, D{l:135,t:0,i:1561}, D{l:4,t:11,i:187}, D{l:5,t:11,i:184}, D{l:5,t:11,i:690}, D{l:7,t:11,i:1869}, D{l:138,t:11,i:756}, D{l:139,t:11,i:783}, D{l:4,t:0,i:998}, D{l:137,t:0,i:861}, D{l:136,t:0,i:1009}, D{l:139,t:11,i:292}, D{l:5,t:11,i:21}, D{l:6,t:11,i:77}, D{l:6,t:11,i:157}, D{l:7,t:11,i:974}, D{l:7,t:11,i:1301}, D{l:7,t:11,i:1339}, D{l:7,t:11,i:1490}, D{l:7,t:11,i:1873}, D{l:137,t:11,i:628}, D{l:7,t:11,i:1283}, D{l:9,t:11,i:227}, D{l:9,t:11,i:499}, D{l:10,t:11,i:341}, D{l:11,t:11,i:325}, D{l:11,t:11,i:408}, D{l:14,t:11,i:180}, D{l:15,t:11,i:144}, D{l:18,t:11,i:47}, D{l:147,t:11,i:49}, D{l:4,t:0,i:64}, D{l:5,t:0,i:352}, D{l:5,t:0,i:720}, D{l:6,t:0,i:368}, D{l:139,t:0,i:359}, D{l:5,t:10,i:384}, D{l:8,t:10,i:455}, D{l:140,t:10,i:48}, D{l:5,t:10,i:264}, D{l:134,t:10,i:184}, D{l:7,t:0,i:1577}, D{l:10,t:0,i:304}, D{l:10,t:0,i:549}, D{l:12,t:0,i:365}, D{l:13,t:0,i:220}, D{l:13,t:0,i:240}, D{l:142,t:0,i:33}, D{l:134,t:0,i:1107}, D{l:134,t:0,i:929}, D{l:135,t:0,i:1142}, D{l:6,t:0,i:175}, D{l:137,t:0,i:289}, D{l:5,t:0,i:432}, D{l:133,t:0,i:913}, D{l:6,t:0,i:279}, D{l:7,t:0,i:219}, D{l:5,t:10,i:633}, D{l:135,t:10,i:1323}, D{l:7,t:0,i:785}, D{l:7,t:10,i:359}, D{l:8,t:10,i:243}, D{l:140,t:10,i:175}, D{l:139,t:0,i:595}, D{l:132,t:10,i:105}, D{l:8,t:11,i:398}, D{l:9,t:11,i:681}, D{l:139,t:11,i:632}, D{l:140,t:0,i:80}, D{l:5,t:0,i:931}, D{l:134,t:0,i:1698}, D{l:142,t:11,i:241}, D{l:134,t:11,i:20}, D{l:134,t:0,i:1323}, D{l:11,t:0,i:526}, D{l:11,t:0,i:939}, D{l:141,t:0,i:290}, D{l:5,t:0,i:774}, D{l:6,t:0,i:780}, D{l:6,t:0,i:1637}, D{l:6,t:0,i:1686}, D{l:6,t:0,i:1751}, D{l:8,t:0,i:559}, D{l:141,t:0,i:109}, D{l:141,t:0,i:127}, D{l:7,t:0,i:1167}, D{l:11,t:0,i:934}, D{l:13,t:0,i:391}, D{l:17,t:0,i:76}, D{l:135,t:11,i:709}, D{l:135,t:0,i:963}, D{l:6,t:0,i:260}, D{l:135,t:0,i:1484}, D{l:134,t:0,i:573}, D{l:4,t:10,i:758}, D{l:139,t:11,i:941}, D{l:135,t:10,i:1649}, D{l:145,t:11,i:36}, D{l:4,t:0,i:292}, D{l:137,t:0,i:580}, D{l:4,t:0,i:736}, D{l:5,t:0,i:871}, D{l:6,t:0,i:1689}, D{l:135,t:0,i:1944}, D{l:7,t:11,i:945}, D{l:11,t:11,i:713}, D{l:139,t:11,i:744}, D{l:134,t:0,i:1164}, D{l:135,t:11,i:937}, D{l:6,t:0,i:1922}, D{l:9,t:0,i:982}, D{l:15,t:0,i:173}, D{l:15,t:0,i:178}, D{l:15,t:0,i:200}, D{l:18,t:0,i:189}, D{l:18,t:0,i:207}, D{l:21,t:0,i:47}, D{l:135,t:11,i:1652}, D{l:7,t:0,i:1695}, D{l:139,t:10,i:128}, D{l:6,t:0,i:63}, D{l:135,t:0,i:920}, D{l:133,t:0,i:793}, D{l:143,t:11,i:134}, D{l:133,t:10,i:918}, D{l:5,t:0,i:67}, D{l:6,t:0,i:62}, D{l:6,t:0,i:374}, D{l:135,t:0,i:1391}, D{l:9,t:0,i:790}, D{l:12,t:0,i:47}, D{l:4,t:11,i:579}, D{l:5,t:11,i:226}, D{l:5,t:11,i:323}, D{l:135,t:11,i:960}, D{l:10,t:11,i:784}, D{l:141,t:11,i:191}, D{l:4,t:0,i:391}, D{l:135,t:0,i:1169}, D{l:137,t:0,i:443}, D{l:13,t:11,i:232}, D{l:146,t:11,i:35}, D{l:132,t:10,i:340}, D{l:132,t:0,i:271}, D{l:137,t:11,i:313}, D{l:5,t:11,i:973}, D{l:137,t:11,i:659}, D{l:134,t:0,i:1140}, D{l:6,t:11,i:135}, D{l:135,t:11,i:1176}, D{l:4,t:0,i:253}, D{l:5,t:0,i:544}, D{l:7,t:0,i:300}, D{l:137,t:0,i:340}, D{l:7,t:0,i:897}, D{l:5,t:10,i:985}, D{l:7,t:10,i:509}, D{l:145,t:10,i:96}, D{l:138,t:11,i:735}, D{l:135,t:10,i:1919}, D{l:138,t:0,i:890}, D{l:5,t:0,i:818}, D{l:134,t:0,i:1122}, D{l:5,t:0,i:53}, D{l:5,t:0,i:541}, D{l:6,t:0,i:94}, D{l:6,t:0,i:499}, D{l:7,t:0,i:230}, D{l:139,t:0,i:321}, D{l:4,t:0,i:920}, D{l:5,t:0,i:25}, D{l:5,t:0,i:790}, D{l:6,t:0,i:457}, D{l:7,t:0,i:853}, D{l:8,t:0,i:788}, D{l:142,t:11,i:31}, D{l:132,t:10,i:247}, D{l:135,t:11,i:314}, D{l:132,t:0,i:468}, D{l:7,t:0,i:243}, D{l:6,t:10,i:337}, D{l:7,t:10,i:494}, D{l:8,t:10,i:27}, D{l:8,t:10,i:599}, D{l:138,t:10,i:153}, D{l:4,t:10,i:184}, D{l:5,t:10,i:390}, D{l:7,t:10,i:618}, D{l:7,t:10,i:1456}, D{l:139,t:10,i:710}, D{l:134,t:0,i:870}, D{l:134,t:0,i:1238}, D{l:134,t:0,i:1765}, D{l:10,t:0,i:853}, D{l:10,t:0,i:943}, D{l:14,t:0,i:437}, D{l:14,t:0,i:439}, D{l:14,t:0,i:443}, D{l:14,t:0,i:446}, D{l:14,t:0,i:452}, D{l:14,t:0,i:469}, D{l:14,t:0,i:471}, D{l:14,t:0,i:473}, D{l:16,t:0,i:93}, D{l:16,t:0,i:102}, D{l:16,t:0,i:110}, D{l:148,t:0,i:121}, D{l:4,t:0,i:605}, D{l:7,t:0,i:518}, D{l:7,t:0,i:1282}, D{l:7,t:0,i:1918}, D{l:10,t:0,i:180}, D{l:139,t:0,i:218}, D{l:133,t:0,i:822}, D{l:4,t:0,i:634}, D{l:11,t:0,i:916}, D{l:142,t:0,i:419}, D{l:6,t:11,i:281}, D{l:7,t:11,i:6}, D{l:8,t:11,i:282}, D{l:8,t:11,i:480}, D{l:8,t:11,i:499}, D{l:9,t:11,i:198}, D{l:10,t:11,i:143}, D{l:10,t:11,i:169}, D{l:10,t:11,i:211}, D{l:10,t:11,i:417}, D{l:10,t:11,i:574}, D{l:11,t:11,i:147}, D{l:11,t:11,i:395}, D{l:12,t:11,i:75}, D{l:12,t:11,i:407}, D{l:12,t:11,i:608}, D{l:13,t:11,i:500}, D{l:142,t:11,i:251}, D{l:134,t:0,i:898}, D{l:6,t:0,i:36}, D{l:7,t:0,i:658}, D{l:8,t:0,i:454}, D{l:150,t:11,i:48}, D{l:133,t:11,i:674}, D{l:135,t:11,i:1776}, D{l:4,t:11,i:419}, D{l:10,t:10,i:227}, D{l:11,t:10,i:497}, D{l:11,t:10,i:709}, D{l:140,t:10,i:415}, D{l:6,t:10,i:360}, D{l:7,t:10,i:1664}, D{l:136,t:10,i:478}, D{l:137,t:0,i:806}, D{l:12,t:11,i:508}, D{l:14,t:11,i:102}, D{l:14,t:11,i:226}, D{l:144,t:11,i:57}, D{l:135,t:11,i:1123}, D{l:4,t:11,i:138}, D{l:7,t:11,i:1012}, D{l:7,t:11,i:1280}, D{l:137,t:11,i:76}, D{l:5,t:11,i:29}, D{l:140,t:11,i:638}, D{l:136,t:10,i:699}, D{l:134,t:0,i:1326}, D{l:132,t:0,i:104}, D{l:135,t:11,i:735}, D{l:132,t:10,i:739}, D{l:134,t:0,i:1331}, D{l:7,t:0,i:260}, D{l:135,t:11,i:260}, D{l:135,t:11,i:1063}, D{l:7,t:0,i:45}, D{l:9,t:0,i:542}, D{l:9,t:0,i:566}, D{l:10,t:0,i:728}, D{l:137,t:10,i:869}, D{l:4,t:10,i:67}, D{l:5,t:10,i:422}, D{l:7,t:10,i:1037}, D{l:7,t:10,i:1289}, D{l:7,t:10,i:1555}, D{l:9,t:10,i:741}, D{l:145,t:10,i:108}, D{l:139,t:0,i:263}, D{l:134,t:0,i:1516}, D{l:14,t:0,i:146}, D{l:15,t:0,i:42}, D{l:16,t:0,i:23}, D{l:17,t:0,i:86}, D{l:146,t:0,i:17}, D{l:138,t:0,i:468}, D{l:136,t:0,i:1005}, D{l:4,t:11,i:17}, D{l:5,t:11,i:23}, D{l:7,t:11,i:995}, D{l:11,t:11,i:383}, D{l:11,t:11,i:437}, D{l:12,t:11,i:460}, D{l:140,t:11,i:532}, D{l:7,t:0,i:87}, D{l:142,t:0,i:288}, D{l:138,t:10,i:96}, D{l:135,t:11,i:626}, D{l:144,t:10,i:26}, D{l:7,t:0,i:988}, D{l:7,t:0,i:1939}, D{l:9,t:0,i:64}, D{l:9,t:0,i:502}, D{l:12,t:0,i:22}, D{l:12,t:0,i:34}, D{l:13,t:0,i:12}, D{l:13,t:0,i:234}, D{l:147,t:0,i:77}, D{l:13,t:0,i:133}, D{l:8,t:10,i:203}, D{l:11,t:10,i:823}, D{l:11,t:10,i:846}, D{l:12,t:10,i:482}, D{l:13,t:10,i:277}, D{l:13,t:10,i:302}, D{l:13,t:10,i:464}, D{l:14,t:10,i:205}, D{l:142,t:10,i:221}, D{l:4,t:10,i:449}, D{l:133,t:10,i:718}, D{l:135,t:0,i:141}, D{l:6,t:0,i:1842}, D{l:136,t:0,i:872}, D{l:8,t:11,i:70}, D{l:12,t:11,i:171}, D{l:141,t:11,i:272}, D{l:4,t:10,i:355}, D{l:6,t:10,i:311}, D{l:9,t:10,i:256}, D{l:138,t:10,i:404}, D{l:132,t:0,i:619}, D{l:137,t:0,i:261}, D{l:10,t:11,i:233}, D{l:10,t:10,i:758}, D{l:139,t:11,i:76}, D{l:5,t:0,i:246}, D{l:8,t:0,i:189}, D{l:9,t:0,i:355}, D{l:9,t:0,i:512}, D{l:10,t:0,i:124}, D{l:10,t:0,i:453}, D{l:11,t:0,i:143}, D{l:11,t:0,i:416}, D{l:11,t:0,i:859}, D{l:141,t:0,i:341}, D{l:134,t:11,i:442}, D{l:133,t:10,i:827}, D{l:5,t:10,i:64}, D{l:140,t:10,i:581}, D{l:4,t:10,i:442}, D{l:7,t:10,i:1047}, D{l:7,t:10,i:1352}, D{l:135,t:10,i:1643}, D{l:134,t:11,i:1709}, D{l:5,t:0,i:678}, D{l:6,t:0,i:305}, D{l:7,t:0,i:775}, D{l:7,t:0,i:1065}, D{l:133,t:10,i:977}, D{l:11,t:11,i:69}, D{l:12,t:11,i:105}, D{l:12,t:11,i:117}, D{l:13,t:11,i:213}, D{l:14,t:11,i:13}, D{l:14,t:11,i:62}, D{l:14,t:11,i:177}, D{l:14,t:11,i:421}, D{l:15,t:11,i:19}, D{l:146,t:11,i:141}, D{l:137,t:11,i:309}, D{l:5,t:0,i:35}, D{l:7,t:0,i:862}, D{l:7,t:0,i:1886}, D{l:138,t:0,i:179}, D{l:136,t:0,i:285}, D{l:132,t:0,i:517}, D{l:7,t:11,i:976}, D{l:9,t:11,i:146}, D{l:10,t:11,i:206}, D{l:10,t:11,i:596}, D{l:13,t:11,i:218}, D{l:142,t:11,i:153}, D{l:132,t:10,i:254}, D{l:6,t:0,i:214}, D{l:12,t:0,i:540}, D{l:4,t:10,i:275}, D{l:7,t:10,i:1219}, D{l:140,t:10,i:376}, D{l:8,t:0,i:667}, D{l:11,t:0,i:403}, D{l:146,t:0,i:83}, D{l:12,t:0,i:74}, D{l:10,t:11,i:648}, D{l:11,t:11,i:671}, D{l:143,t:11,i:46}, D{l:135,t:0,i:125}, D{l:134,t:10,i:1753}, D{l:133,t:0,i:761}, D{l:6,t:0,i:912}, D{l:4,t:11,i:518}, D{l:6,t:10,i:369}, D{l:6,t:10,i:502}, D{l:7,t:10,i:1036}, D{l:7,t:11,i:1136}, D{l:8,t:10,i:348}, D{l:9,t:10,i:452}, D{l:10,t:10,i:26}, D{l:11,t:10,i:224}, D{l:11,t:10,i:387}, D{l:11,t:10,i:772}, D{l:12,t:10,i:95}, D{l:12,t:10,i:629}, D{l:13,t:10,i:195}, D{l:13,t:10,i:207}, D{l:13,t:10,i:241}, D{l:14,t:10,i:260}, D{l:14,t:10,i:270}, D{l:143,t:10,i:140}, D{l:10,t:0,i:131}, D{l:140,t:0,i:72}, D{l:132,t:10,i:269}, D{l:5,t:10,i:480}, D{l:7,t:10,i:532}, D{l:7,t:10,i:1197}, D{l:7,t:10,i:1358}, D{l:8,t:10,i:291}, D{l:11,t:10,i:349}, D{l:142,t:10,i:396}, D{l:8,t:11,i:689}, D{l:137,t:11,i:863}, D{l:8,t:0,i:333}, D{l:138,t:0,i:182}, D{l:4,t:11,i:18}, D{l:7,t:11,i:145}, D{l:7,t:11,i:444}, D{l:7,t:11,i:1278}, D{l:8,t:11,i:49}, D{l:8,t:11,i:400}, D{l:9,t:11,i:71}, D{l:9,t:11,i:250}, D{l:10,t:11,i:459}, D{l:12,t:11,i:160}, D{l:144,t:11,i:24}, D{l:14,t:11,i:35}, D{l:142,t:11,i:191}, D{l:135,t:11,i:1864}, D{l:135,t:0,i:1338}, D{l:148,t:10,i:15}, D{l:14,t:0,i:94}, D{l:15,t:0,i:65}, D{l:16,t:0,i:4}, D{l:16,t:0,i:77}, D{l:16,t:0,i:80}, D{l:145,t:0,i:5}, D{l:12,t:11,i:82}, D{l:143,t:11,i:36}, D{l:133,t:11,i:1010}, D{l:133,t:0,i:449}, D{l:133,t:0,i:646}, D{l:7,t:0,i:86}, D{l:8,t:0,i:103}, D{l:135,t:10,i:657}, D{l:7,t:0,i:2028}, D{l:138,t:0,i:641}, D{l:136,t:10,i:533}, D{l:134,t:0,i:1}, D{l:139,t:11,i:970}, D{l:5,t:11,i:87}, D{l:7,t:11,i:313}, D{l:7,t:11,i:1103}, D{l:10,t:11,i:112}, D{l:10,t:11,i:582}, D{l:11,t:11,i:389}, D{l:11,t:11,i:813}, D{l:12,t:11,i:385}, D{l:13,t:11,i:286}, D{l:14,t:11,i:124}, D{l:146,t:11,i:108}, D{l:6,t:0,i:869}, D{l:132,t:11,i:267}, D{l:6,t:0,i:277}, D{l:7,t:0,i:1274}, D{l:7,t:0,i:1386}, D{l:146,t:0,i:87}, D{l:6,t:0,i:187}, D{l:7,t:0,i:39}, D{l:7,t:0,i:1203}, D{l:8,t:0,i:380}, D{l:14,t:0,i:117}, D{l:149,t:0,i:28}, D{l:4,t:10,i:211}, D{l:4,t:10,i:332}, D{l:5,t:10,i:335}, D{l:6,t:10,i:238}, D{l:7,t:10,i:269}, D{l:7,t:10,i:811}, D{l:7,t:10,i:1797}, D{l:8,t:10,i:836}, D{l:9,t:10,i:507}, D{l:141,t:10,i:242}, D{l:4,t:0,i:785}, D{l:5,t:0,i:368}, D{l:6,t:0,i:297}, D{l:7,t:0,i:793}, D{l:139,t:0,i:938}, D{l:7,t:0,i:464}, D{l:8,t:0,i:558}, D{l:11,t:0,i:105}, D{l:12,t:0,i:231}, D{l:14,t:0,i:386}, D{l:15,t:0,i:102}, D{l:148,t:0,i:75}, D{l:133,t:10,i:1009}, D{l:8,t:0,i:877}, D{l:140,t:0,i:731}, D{l:139,t:11,i:289}, D{l:10,t:11,i:249}, D{l:139,t:11,i:209}, D{l:132,t:11,i:561}, D{l:134,t:0,i:1608}, D{l:132,t:11,i:760}, D{l:134,t:0,i:1429}, D{l:9,t:11,i:154}, D{l:140,t:11,i:485}, D{l:5,t:10,i:228}, D{l:6,t:10,i:203}, D{l:7,t:10,i:156}, D{l:8,t:10,i:347}, D{l:137,t:10,i:265}, D{l:7,t:0,i:1010}, D{l:11,t:0,i:733}, D{l:11,t:0,i:759}, D{l:13,t:0,i:34}, D{l:14,t:0,i:427}, D{l:146,t:0,i:45}, D{l:7,t:10,i:1131}, D{l:135,t:10,i:1468}, D{l:136,t:11,i:255}, D{l:7,t:0,i:1656}, D{l:9,t:0,i:369}, D{l:10,t:0,i:338}, D{l:10,t:0,i:490}, D{l:11,t:0,i:154}, D{l:11,t:0,i:545}, D{l:11,t:0,i:775}, D{l:13,t:0,i:77}, D{l:141,t:0,i:274}, D{l:133,t:11,i:621}, D{l:134,t:0,i:1038}, D{l:4,t:11,i:368}, D{l:135,t:11,i:641}, D{l:6,t:0,i:2010}, D{l:8,t:0,i:979}, D{l:8,t:0,i:985}, D{l:10,t:0,i:951}, D{l:138,t:0,i:1011}, D{l:134,t:0,i:1005}, D{l:19,t:0,i:121}, D{l:5,t:10,i:291}, D{l:5,t:10,i:318}, D{l:7,t:10,i:765}, D{l:9,t:10,i:389}, D{l:140,t:10,i:548}, D{l:5,t:0,i:20}, D{l:6,t:0,i:298}, D{l:7,t:0,i:659}, D{l:137,t:0,i:219}, D{l:7,t:0,i:1440}, D{l:11,t:0,i:854}, D{l:11,t:0,i:872}, D{l:11,t:0,i:921}, D{l:12,t:0,i:551}, D{l:13,t:0,i:472}, D{l:142,t:0,i:367}, D{l:5,t:0,i:490}, D{l:6,t:0,i:615}, D{l:6,t:0,i:620}, D{l:135,t:0,i:683}, D{l:6,t:0,i:1070}, D{l:134,t:0,i:1597}, D{l:139,t:0,i:522}, D{l:132,t:0,i:439}, D{l:136,t:0,i:669}, D{l:6,t:0,i:766}, D{l:6,t:0,i:1143}, D{l:6,t:0,i:1245}, D{l:10,t:10,i:525}, D{l:139,t:10,i:82}, D{l:9,t:11,i:92}, D{l:147,t:11,i:91}, D{l:6,t:0,i:668}, D{l:134,t:0,i:1218}, D{l:6,t:11,i:525}, D{l:9,t:11,i:876}, D{l:140,t:11,i:284}, D{l:132,t:0,i:233}, D{l:136,t:0,i:547}, D{l:132,t:10,i:422}, D{l:5,t:10,i:355}, D{l:145,t:10,i:0}, D{l:6,t:11,i:300}, D{l:135,t:11,i:1515}, D{l:4,t:0,i:482}, D{l:137,t:10,i:905}, D{l:4,t:0,i:886}, D{l:7,t:0,i:346}, D{l:133,t:11,i:594}, D{l:133,t:10,i:865}, D{l:5,t:10,i:914}, D{l:134,t:10,i:1625}, D{l:135,t:0,i:334}, D{l:5,t:0,i:795}, D{l:6,t:0,i:1741}, D{l:133,t:10,i:234}, D{l:135,t:10,i:1383}, D{l:6,t:11,i:1641}, D{l:136,t:11,i:820}, D{l:135,t:0,i:371}, D{l:7,t:11,i:1313}, D{l:138,t:11,i:660}, D{l:135,t:10,i:1312}, D{l:135,t:0,i:622}, D{l:7,t:0,i:625}, D{l:135,t:0,i:1750}, D{l:135,t:0,i:339}, D{l:4,t:0,i:203}, D{l:135,t:0,i:1936}, D{l:15,t:0,i:29}, D{l:16,t:0,i:38}, D{l:15,t:11,i:29}, D{l:144,t:11,i:38}, D{l:5,t:0,i:338}, D{l:135,t:0,i:1256}, D{l:135,t:10,i:1493}, D{l:10,t:0,i:130}, D{l:6,t:10,i:421}, D{l:7,t:10,i:61}, D{l:7,t:10,i:1540}, D{l:138,t:10,i:501}, D{l:6,t:11,i:389}, D{l:7,t:11,i:149}, D{l:9,t:11,i:142}, D{l:138,t:11,i:94}, D{l:137,t:10,i:341}, D{l:11,t:0,i:678}, D{l:12,t:0,i:307}, D{l:142,t:10,i:98}, D{l:6,t:11,i:8}, D{l:7,t:11,i:1881}, D{l:136,t:11,i:91}, D{l:135,t:0,i:2044}, D{l:6,t:0,i:770}, D{l:6,t:0,i:802}, D{l:6,t:0,i:812}, D{l:7,t:0,i:311}, D{l:9,t:0,i:308}, D{l:12,t:0,i:255}, D{l:6,t:10,i:102}, D{l:7,t:10,i:72}, D{l:15,t:10,i:142}, D{l:147,t:10,i:67}, D{l:151,t:10,i:30}, D{l:135,t:10,i:823}, D{l:135,t:0,i:1266}, D{l:135,t:11,i:1746}, D{l:135,t:10,i:1870}, D{l:4,t:0,i:400}, D{l:5,t:0,i:267}, D{l:135,t:0,i:232}, D{l:7,t:11,i:24}, D{l:11,t:11,i:542}, D{l:139,t:11,i:852}, D{l:135,t:11,i:1739}, D{l:4,t:11,i:503}, D{l:135,t:11,i:1661}, D{l:5,t:11,i:130}, D{l:7,t:11,i:1314}, D{l:9,t:11,i:610}, D{l:10,t:11,i:718}, D{l:11,t:11,i:601}, D{l:11,t:11,i:819}, D{l:11,t:11,i:946}, D{l:140,t:11,i:536}, D{l:10,t:11,i:149}, D{l:11,t:11,i:280}, D{l:142,t:11,i:336}, D{l:7,t:0,i:739}, D{l:11,t:0,i:690}, D{l:7,t:11,i:1946}, D{l:8,t:10,i:48}, D{l:8,t:10,i:88}, D{l:8,t:10,i:582}, D{l:8,t:10,i:681}, D{l:9,t:10,i:373}, D{l:9,t:10,i:864}, D{l:11,t:10,i:157}, D{l:11,t:10,i:843}, D{l:148,t:10,i:27}, D{l:134,t:0,i:990}, D{l:4,t:10,i:88}, D{l:5,t:10,i:137}, D{l:5,t:10,i:174}, D{l:5,t:10,i:777}, D{l:6,t:10,i:1664}, D{l:6,t:10,i:1725}, D{l:7,t:10,i:77}, D{l:7,t:10,i:426}, D{l:7,t:10,i:1317}, D{l:7,t:10,i:1355}, D{l:8,t:10,i:126}, D{l:8,t:10,i:563}, D{l:9,t:10,i:523}, D{l:9,t:10,i:750}, D{l:10,t:10,i:310}, D{l:10,t:10,i:836}, D{l:11,t:10,i:42}, D{l:11,t:10,i:318}, D{l:11,t:10,i:731}, D{l:12,t:10,i:68}, D{l:12,t:10,i:92}, D{l:12,t:10,i:507}, D{l:12,t:10,i:692}, D{l:13,t:10,i:81}, D{l:13,t:10,i:238}, D{l:13,t:10,i:374}, D{l:14,t:10,i:436}, D{l:18,t:10,i:138}, D{l:19,t:10,i:78}, D{l:19,t:10,i:111}, D{l:20,t:10,i:55}, D{l:20,t:10,i:77}, D{l:148,t:10,i:92}, D{l:141,t:10,i:418}, D{l:7,t:0,i:1831}, D{l:132,t:10,i:938}, D{l:6,t:0,i:776}, D{l:134,t:0,i:915}, D{l:138,t:10,i:351}, D{l:5,t:11,i:348}, D{l:6,t:11,i:522}, D{l:6,t:10,i:1668}, D{l:7,t:10,i:1499}, D{l:8,t:10,i:117}, D{l:9,t:10,i:314}, D{l:138,t:10,i:174}, D{l:135,t:10,i:707}, D{l:132,t:0,i:613}, D{l:133,t:10,i:403}, D{l:132,t:11,i:392}, D{l:5,t:11,i:433}, D{l:9,t:11,i:633}, D{l:139,t:11,i:629}, D{l:133,t:0,i:763}, D{l:132,t:0,i:878}, D{l:132,t:0,i:977}, D{l:132,t:0,i:100}, D{l:6,t:0,i:463}, D{l:4,t:10,i:44}, D{l:5,t:10,i:311}, D{l:7,t:10,i:639}, D{l:7,t:10,i:762}, D{l:7,t:10,i:1827}, D{l:9,t:10,i:8}, D{l:9,t:10,i:462}, D{l:148,t:10,i:83}, D{l:134,t:11,i:234}, D{l:4,t:10,i:346}, D{l:7,t:10,i:115}, D{l:9,t:10,i:180}, D{l:9,t:10,i:456}, D{l:138,t:10,i:363}, D{l:5,t:0,i:362}, D{l:5,t:0,i:443}, D{l:6,t:0,i:318}, D{l:7,t:0,i:1019}, D{l:139,t:0,i:623}, D{l:5,t:0,i:463}, D{l:8,t:0,i:296}, D{l:7,t:11,i:140}, D{l:7,t:11,i:1950}, D{l:8,t:11,i:680}, D{l:11,t:11,i:817}, D{l:147,t:11,i:88}, D{l:7,t:11,i:1222}, D{l:138,t:11,i:386}, D{l:142,t:0,i:137}, D{l:132,t:0,i:454}, D{l:7,t:0,i:1914}, D{l:6,t:11,i:5}, D{l:7,t:10,i:1051}, D{l:9,t:10,i:545}, D{l:11,t:11,i:249}, D{l:12,t:11,i:313}, D{l:16,t:11,i:66}, D{l:145,t:11,i:26}, D{l:135,t:0,i:1527}, D{l:145,t:0,i:58}, D{l:148,t:11,i:59}, D{l:5,t:0,i:48}, D{l:5,t:0,i:404}, D{l:6,t:0,i:557}, D{l:7,t:0,i:458}, D{l:8,t:0,i:597}, D{l:10,t:0,i:455}, D{l:10,t:0,i:606}, D{l:11,t:0,i:49}, D{l:11,t:0,i:548}, D{l:12,t:0,i:476}, D{l:13,t:0,i:18}, D{l:141,t:0,i:450}, D{l:5,t:11,i:963}, D{l:134,t:11,i:1773}, D{l:133,t:0,i:729}, D{l:138,t:11,i:586}, D{l:5,t:0,i:442}, D{l:135,t:0,i:1984}, D{l:134,t:0,i:449}, D{l:144,t:0,i:40}, D{l:4,t:0,i:853}, D{l:7,t:11,i:180}, D{l:8,t:11,i:509}, D{l:136,t:11,i:792}, D{l:6,t:10,i:185}, D{l:7,t:10,i:1899}, D{l:9,t:10,i:875}, D{l:139,t:10,i:673}, D{l:134,t:11,i:524}, D{l:12,t:0,i:227}, D{l:4,t:10,i:327}, D{l:5,t:10,i:478}, D{l:7,t:10,i:1332}, D{l:136,t:10,i:753}, D{l:6,t:0,i:1491}, D{l:5,t:10,i:1020}, D{l:133,t:10,i:1022}, D{l:4,t:10,i:103}, D{l:133,t:10,i:401}, D{l:132,t:11,i:931}, D{l:4,t:10,i:499}, D{l:135,t:10,i:1421}, D{l:5,t:0,i:55}, D{l:7,t:0,i:376}, D{l:140,t:0,i:161}, D{l:133,t:0,i:450}, D{l:6,t:0,i:1174}, D{l:134,t:0,i:1562}, D{l:10,t:0,i:62}, D{l:13,t:0,i:400}, D{l:135,t:11,i:1837}, D{l:140,t:0,i:207}, D{l:135,t:0,i:869}, D{l:4,t:11,i:773}, D{l:5,t:11,i:618}, D{l:137,t:11,i:756}, D{l:132,t:10,i:96}, D{l:4,t:0,i:213}, D{l:7,t:0,i:223}, D{l:8,t:0,i:80}, D{l:135,t:10,i:968}, D{l:4,t:11,i:90}, D{l:5,t:11,i:337}, D{l:5,t:11,i:545}, D{l:7,t:11,i:754}, D{l:9,t:11,i:186}, D{l:10,t:11,i:72}, D{l:10,t:11,i:782}, D{l:11,t:11,i:513}, D{l:11,t:11,i:577}, D{l:11,t:11,i:610}, D{l:11,t:11,i:889}, D{l:11,t:11,i:961}, D{l:12,t:11,i:354}, D{l:12,t:11,i:362}, D{l:12,t:11,i:461}, D{l:12,t:11,i:595}, D{l:13,t:11,i:79}, D{l:143,t:11,i:121}, D{l:7,t:0,i:381}, D{l:7,t:0,i:806}, D{l:7,t:0,i:820}, D{l:8,t:0,i:354}, D{l:8,t:0,i:437}, D{l:8,t:0,i:787}, D{l:9,t:0,i:657}, D{l:10,t:0,i:58}, D{l:10,t:0,i:339}, D{l:10,t:0,i:749}, D{l:11,t:0,i:914}, D{l:12,t:0,i:162}, D{l:13,t:0,i:75}, D{l:14,t:0,i:106}, D{l:14,t:0,i:198}, D{l:14,t:0,i:320}, D{l:14,t:0,i:413}, D{l:146,t:0,i:43}, D{l:136,t:0,i:747}, D{l:136,t:0,i:954}, D{l:134,t:0,i:1073}, D{l:135,t:0,i:556}, D{l:7,t:11,i:151}, D{l:9,t:11,i:329}, D{l:139,t:11,i:254}, D{l:5,t:0,i:692}, D{l:134,t:0,i:1395}, D{l:6,t:10,i:563}, D{l:137,t:10,i:224}, D{l:134,t:0,i:191}, D{l:132,t:0,i:804}, D{l:9,t:11,i:187}, D{l:10,t:11,i:36}, D{l:17,t:11,i:44}, D{l:146,t:11,i:64}, D{l:7,t:11,i:165}, D{l:7,t:11,i:919}, D{l:136,t:11,i:517}, D{l:4,t:11,i:506}, D{l:5,t:11,i:295}, D{l:7,t:11,i:1680}, D{l:15,t:11,i:14}, D{l:144,t:11,i:5}, D{l:4,t:0,i:706}, D{l:6,t:0,i:162}, D{l:7,t:0,i:1960}, D{l:136,t:0,i:831}, D{l:135,t:11,i:1376}, D{l:7,t:11,i:987}, D{l:9,t:11,i:688}, D{l:10,t:11,i:522}, D{l:11,t:11,i:788}, D{l:140,t:11,i:566}, D{l:150,t:0,i:35}, D{l:138,t:0,i:426}, D{l:135,t:0,i:1235}, D{l:135,t:11,i:1741}, D{l:7,t:11,i:389}, D{l:7,t:11,i:700}, D{l:7,t:11,i:940}, D{l:8,t:11,i:514}, D{l:9,t:11,i:116}, D{l:9,t:11,i:535}, D{l:10,t:11,i:118}, D{l:11,t:11,i:107}, D{l:11,t:11,i:148}, D{l:11,t:11,i:922}, D{l:12,t:11,i:254}, D{l:12,t:11,i:421}, D{l:142,t:11,i:238}, D{l:134,t:0,i:1234}, D{l:132,t:11,i:743}, D{l:4,t:10,i:910}, D{l:5,t:10,i:832}, D{l:135,t:11,i:1335}, D{l:141,t:0,i:96}, D{l:135,t:11,i:185}, D{l:146,t:0,i:149}, D{l:4,t:0,i:204}, D{l:137,t:0,i:902}, D{l:4,t:11,i:784}, D{l:133,t:11,i:745}, D{l:136,t:0,i:833}, D{l:136,t:0,i:949}, D{l:7,t:0,i:366}, D{l:9,t:0,i:287}, D{l:12,t:0,i:199}, D{l:12,t:0,i:556}, D{l:12,t:0,i:577}, D{l:5,t:11,i:81}, D{l:7,t:11,i:146}, D{l:7,t:11,i:1342}, D{l:7,t:11,i:1446}, D{l:8,t:11,i:53}, D{l:8,t:11,i:561}, D{l:8,t:11,i:694}, D{l:8,t:11,i:754}, D{l:9,t:11,i:97}, D{l:9,t:11,i:115}, D{l:9,t:11,i:894}, D{l:10,t:11,i:462}, D{l:10,t:11,i:813}, D{l:11,t:11,i:230}, D{l:11,t:11,i:657}, D{l:11,t:11,i:699}, D{l:11,t:11,i:748}, D{l:12,t:11,i:119}, D{l:12,t:11,i:200}, D{l:12,t:11,i:283}, D{l:14,t:11,i:273}, D{l:145,t:11,i:15}, D{l:5,t:11,i:408}, D{l:137,t:11,i:747}, D{l:9,t:11,i:498}, D{l:140,t:11,i:181}, D{l:6,t:0,i:2020}, D{l:136,t:0,i:992}, D{l:5,t:0,i:356}, D{l:135,t:0,i:224}, D{l:134,t:0,i:784}, D{l:7,t:0,i:630}, D{l:9,t:0,i:567}, D{l:11,t:0,i:150}, D{l:11,t:0,i:444}, D{l:13,t:0,i:119}, D{l:8,t:10,i:528}, D{l:137,t:10,i:348}, D{l:134,t:0,i:539}, D{l:4,t:10,i:20}, D{l:133,t:10,i:616}, D{l:142,t:0,i:27}, D{l:7,t:11,i:30}, D{l:8,t:11,i:86}, D{l:8,t:11,i:315}, D{l:8,t:11,i:700}, D{l:9,t:11,i:576}, D{l:9,t:11,i:858}, D{l:11,t:11,i:310}, D{l:11,t:11,i:888}, D{l:11,t:11,i:904}, D{l:12,t:11,i:361}, D{l:141,t:11,i:248}, D{l:138,t:11,i:839}, D{l:134,t:0,i:755}, D{l:134,t:0,i:1063}, D{l:7,t:10,i:1091}, D{l:135,t:10,i:1765}, D{l:134,t:11,i:428}, D{l:7,t:11,i:524}, D{l:8,t:11,i:169}, D{l:8,t:11,i:234}, D{l:9,t:11,i:480}, D{l:138,t:11,i:646}, D{l:139,t:0,i:814}, D{l:7,t:11,i:1462}, D{l:139,t:11,i:659}, D{l:4,t:10,i:26}, D{l:5,t:10,i:429}, D{l:6,t:10,i:245}, D{l:7,t:10,i:704}, D{l:7,t:10,i:1379}, D{l:135,t:10,i:1474}, D{l:7,t:11,i:1205}, D{l:138,t:11,i:637}, D{l:139,t:11,i:803}, D{l:132,t:10,i:621}, D{l:136,t:0,i:987}, D{l:4,t:11,i:266}, D{l:8,t:11,i:4}, D{l:9,t:11,i:39}, D{l:10,t:11,i:166}, D{l:11,t:11,i:918}, D{l:12,t:11,i:635}, D{l:20,t:11,i:10}, D{l:22,t:11,i:27}, D{l:150,t:11,i:43}, D{l:4,t:0,i:235}, D{l:135,t:0,i:255}, D{l:4,t:0,i:194}, D{l:5,t:0,i:584}, D{l:6,t:0,i:384}, D{l:7,t:0,i:583}, D{l:10,t:0,i:761}, D{l:11,t:0,i:760}, D{l:139,t:0,i:851}, D{l:133,t:10,i:542}, D{l:134,t:0,i:1086}, D{l:133,t:10,i:868}, D{l:8,t:0,i:1016}, D{l:136,t:0,i:1018}, D{l:7,t:0,i:1396}, D{l:7,t:11,i:1396}, D{l:136,t:10,i:433}, D{l:135,t:10,i:1495}, D{l:138,t:10,i:215}, D{l:141,t:10,i:124}, D{l:7,t:11,i:157}, D{l:8,t:11,i:279}, D{l:9,t:11,i:759}, D{l:16,t:11,i:31}, D{l:16,t:11,i:39}, D{l:16,t:11,i:75}, D{l:18,t:11,i:24}, D{l:20,t:11,i:42}, D{l:152,t:11,i:1}, D{l:5,t:0,i:562}, D{l:134,t:11,i:604}, D{l:134,t:0,i:913}, D{l:5,t:0,i:191}, D{l:137,t:0,i:271}, D{l:4,t:0,i:470}, D{l:6,t:0,i:153}, D{l:7,t:0,i:1503}, D{l:7,t:0,i:1923}, D{l:10,t:0,i:701}, D{l:11,t:0,i:132}, D{l:11,t:0,i:227}, D{l:11,t:0,i:320}, D{l:11,t:0,i:436}, D{l:11,t:0,i:525}, D{l:11,t:0,i:855}, D{l:11,t:0,i:873}, D{l:12,t:0,i:41}, D{l:12,t:0,i:286}, D{l:13,t:0,i:103}, D{l:13,t:0,i:284}, D{l:14,t:0,i:255}, D{l:14,t:0,i:262}, D{l:15,t:0,i:117}, D{l:143,t:0,i:127}, D{l:7,t:0,i:475}, D{l:12,t:0,i:45}, D{l:147,t:10,i:112}, D{l:132,t:11,i:567}, D{l:137,t:11,i:859}, D{l:6,t:0,i:713}, D{l:6,t:0,i:969}, D{l:6,t:0,i:1290}, D{l:134,t:0,i:1551}, D{l:133,t:0,i:327}, D{l:6,t:0,i:552}, D{l:6,t:0,i:1292}, D{l:7,t:0,i:1754}, D{l:137,t:0,i:604}, D{l:4,t:0,i:223}, D{l:6,t:0,i:359}, D{l:11,t:0,i:3}, D{l:13,t:0,i:108}, D{l:14,t:0,i:89}, D{l:16,t:0,i:22}, D{l:5,t:11,i:762}, D{l:7,t:11,i:1880}, D{l:9,t:11,i:680}, D{l:139,t:11,i:798}, D{l:5,t:0,i:80}, D{l:6,t:0,i:405}, D{l:7,t:0,i:403}, D{l:7,t:0,i:1502}, D{l:8,t:0,i:456}, D{l:9,t:0,i:487}, D{l:9,t:0,i:853}, D{l:9,t:0,i:889}, D{l:10,t:0,i:309}, D{l:11,t:0,i:721}, D{l:11,t:0,i:994}, D{l:12,t:0,i:430}, D{l:141,t:0,i:165}, D{l:133,t:11,i:298}, D{l:132,t:10,i:647}, D{l:134,t:0,i:2016}, D{l:18,t:10,i:10}, D{l:146,t:11,i:10}, D{l:4,t:0,i:453}, D{l:5,t:0,i:887}, D{l:6,t:0,i:535}, D{l:8,t:0,i:6}, D{l:8,t:0,i:543}, D{l:136,t:0,i:826}, D{l:136,t:0,i:975}, D{l:10,t:0,i:961}, D{l:138,t:0,i:962}, D{l:138,t:10,i:220}, D{l:6,t:0,i:1891}, D{l:6,t:0,i:1893}, D{l:9,t:0,i:916}, D{l:9,t:0,i:965}, D{l:9,t:0,i:972}, D{l:12,t:0,i:801}, D{l:12,t:0,i:859}, D{l:12,t:0,i:883}, D{l:15,t:0,i:226}, D{l:149,t:0,i:51}, D{l:132,t:10,i:109}, D{l:135,t:11,i:267}, D{l:7,t:11,i:92}, D{l:7,t:11,i:182}, D{l:8,t:11,i:453}, D{l:9,t:11,i:204}, D{l:11,t:11,i:950}, D{l:12,t:11,i:94}, D{l:12,t:11,i:644}, D{l:16,t:11,i:20}, D{l:16,t:11,i:70}, D{l:16,t:11,i:90}, D{l:147,t:11,i:55}, D{l:134,t:10,i:1746}, D{l:6,t:11,i:71}, D{l:7,t:11,i:845}, D{l:7,t:11,i:1308}, D{l:8,t:11,i:160}, D{l:137,t:11,i:318}, D{l:5,t:0,i:101}, D{l:6,t:0,i:88}, D{l:7,t:0,i:263}, D{l:7,t:0,i:628}, D{l:7,t:0,i:1677}, D{l:8,t:0,i:349}, D{l:9,t:0,i:100}, D{l:10,t:0,i:677}, D{l:14,t:0,i:169}, D{l:14,t:0,i:302}, D{l:14,t:0,i:313}, D{l:15,t:0,i:48}, D{l:15,t:0,i:84}, D{l:7,t:11,i:237}, D{l:8,t:11,i:664}, D{l:9,t:11,i:42}, D{l:9,t:11,i:266}, D{l:9,t:11,i:380}, D{l:9,t:11,i:645}, D{l:10,t:11,i:177}, D{l:138,t:11,i:276}, D{l:138,t:11,i:69}, D{l:4,t:0,i:310}, D{l:7,t:0,i:708}, D{l:7,t:0,i:996}, D{l:9,t:0,i:795}, D{l:10,t:0,i:390}, D{l:10,t:0,i:733}, D{l:11,t:0,i:451}, D{l:12,t:0,i:249}, D{l:14,t:0,i:115}, D{l:14,t:0,i:286}, D{l:143,t:0,i:100}, D{l:5,t:0,i:587}, D{l:4,t:10,i:40}, D{l:10,t:10,i:67}, D{l:11,t:10,i:117}, D{l:11,t:10,i:768}, D{l:139,t:10,i:935}, D{l:6,t:0,i:1942}, D{l:7,t:0,i:512}, D{l:136,t:0,i:983}, D{l:7,t:10,i:992}, D{l:8,t:10,i:301}, D{l:9,t:10,i:722}, D{l:12,t:10,i:63}, D{l:13,t:10,i:29}, D{l:14,t:10,i:161}, D{l:143,t:10,i:18}, D{l:136,t:11,i:76}, D{l:139,t:10,i:923}, D{l:134,t:0,i:645}, D{l:134,t:0,i:851}, D{l:4,t:0,i:498}, D{l:132,t:11,i:293}, D{l:7,t:0,i:217}, D{l:8,t:0,i:140}, D{l:10,t:0,i:610}, D{l:14,t:11,i:352}, D{l:17,t:11,i:53}, D{l:18,t:11,i:146}, D{l:18,t:11,i:152}, D{l:19,t:11,i:11}, D{l:150,t:11,i:54}, D{l:134,t:0,i:1448}, D{l:138,t:11,i:841}, D{l:133,t:0,i:905}, D{l:4,t:11,i:605}, D{l:7,t:11,i:518}, D{l:7,t:11,i:1282}, D{l:7,t:11,i:1918}, D{l:10,t:11,i:180}, D{l:139,t:11,i:218}, D{l:139,t:11,i:917}, D{l:135,t:10,i:825}, D{l:140,t:10,i:328}, D{l:4,t:0,i:456}, D{l:7,t:0,i:105}, D{l:7,t:0,i:358}, D{l:7,t:0,i:1637}, D{l:8,t:0,i:643}, D{l:139,t:0,i:483}, D{l:134,t:0,i:792}, D{l:6,t:11,i:96}, D{l:135,t:11,i:1426}, D{l:137,t:11,i:691}, D{l:4,t:11,i:651}, D{l:133,t:11,i:289}, D{l:7,t:11,i:688}, D{l:8,t:11,i:35}, D{l:9,t:11,i:511}, D{l:10,t:11,i:767}, D{l:147,t:11,i:118}, D{l:150,t:0,i:56}, D{l:5,t:0,i:243}, D{l:5,t:0,i:535}, D{l:6,t:10,i:204}, D{l:10,t:10,i:320}, D{l:10,t:10,i:583}, D{l:13,t:10,i:502}, D{l:14,t:10,i:72}, D{l:14,t:10,i:274}, D{l:14,t:10,i:312}, D{l:14,t:10,i:344}, D{l:15,t:10,i:159}, D{l:16,t:10,i:62}, D{l:16,t:10,i:69}, D{l:17,t:10,i:30}, D{l:18,t:10,i:42}, D{l:18,t:10,i:53}, D{l:18,t:10,i:84}, D{l:18,t:10,i:140}, D{l:19,t:10,i:68}, D{l:19,t:10,i:85}, D{l:20,t:10,i:5}, D{l:20,t:10,i:45}, D{l:20,t:10,i:101}, D{l:22,t:10,i:7}, D{l:150,t:10,i:20}, D{l:4,t:10,i:558}, D{l:6,t:10,i:390}, D{l:7,t:10,i:162}, D{l:7,t:10,i:689}, D{l:9,t:10,i:360}, D{l:138,t:10,i:653}, D{l:146,t:11,i:23}, D{l:135,t:0,i:1748}, D{l:5,t:10,i:856}, D{l:6,t:10,i:1672}, D{l:6,t:10,i:1757}, D{l:134,t:10,i:1781}, D{l:5,t:0,i:539}, D{l:5,t:0,i:754}, D{l:6,t:0,i:876}, D{l:132,t:11,i:704}, D{l:135,t:11,i:1078}, D{l:5,t:10,i:92}, D{l:10,t:10,i:736}, D{l:140,t:10,i:102}, D{l:17,t:0,i:91}, D{l:5,t:10,i:590}, D{l:137,t:10,i:213}, D{l:134,t:0,i:1565}, D{l:6,t:0,i:91}, D{l:135,t:0,i:435}, D{l:4,t:0,i:939}, D{l:140,t:0,i:792}, D{l:134,t:0,i:1399}, D{l:4,t:0,i:16}, D{l:5,t:0,i:316}, D{l:5,t:0,i:842}, D{l:6,t:0,i:370}, D{l:6,t:0,i:1778}, D{l:8,t:0,i:166}, D{l:11,t:0,i:812}, D{l:12,t:0,i:206}, D{l:12,t:0,i:351}, D{l:14,t:0,i:418}, D{l:16,t:0,i:15}, D{l:16,t:0,i:34}, D{l:18,t:0,i:3}, D{l:19,t:0,i:3}, D{l:19,t:0,i:7}, D{l:20,t:0,i:4}, D{l:21,t:0,i:21}, D{l:4,t:11,i:720}, D{l:133,t:11,i:306}, D{l:144,t:0,i:95}, D{l:133,t:11,i:431}, D{l:132,t:11,i:234}, D{l:135,t:0,i:551}, D{l:4,t:0,i:999}, D{l:6,t:0,i:1966}, D{l:134,t:0,i:2042}, D{l:7,t:0,i:619}, D{l:10,t:0,i:547}, D{l:11,t:0,i:122}, D{l:12,t:0,i:601}, D{l:15,t:0,i:7}, D{l:148,t:0,i:20}, D{l:5,t:11,i:464}, D{l:6,t:11,i:236}, D{l:7,t:11,i:276}, D{l:7,t:11,i:696}, D{l:7,t:11,i:914}, D{l:7,t:11,i:1108}, D{l:7,t:11,i:1448}, D{l:9,t:11,i:15}, D{l:9,t:11,i:564}, D{l:10,t:11,i:14}, D{l:12,t:11,i:565}, D{l:13,t:11,i:449}, D{l:14,t:11,i:53}, D{l:15,t:11,i:13}, D{l:16,t:11,i:64}, D{l:145,t:11,i:41}, D{l:6,t:0,i:884}, D{l:6,t:0,i:1019}, D{l:134,t:0,i:1150}, D{l:6,t:11,i:1767}, D{l:12,t:11,i:194}, D{l:145,t:11,i:107}, D{l:136,t:10,i:503}, D{l:133,t:11,i:840}, D{l:7,t:0,i:671}, D{l:134,t:10,i:466}, D{l:132,t:0,i:888}, D{l:4,t:0,i:149}, D{l:138,t:0,i:368}, D{l:4,t:0,i:154}, D{l:7,t:0,i:1134}, D{l:136,t:0,i:105}, D{l:135,t:0,i:983}, D{l:9,t:11,i:642}, D{l:11,t:11,i:236}, D{l:142,t:11,i:193}, D{l:4,t:0,i:31}, D{l:6,t:0,i:429}, D{l:7,t:0,i:962}, D{l:9,t:0,i:458}, D{l:139,t:0,i:691}, D{l:6,t:0,i:643}, D{l:134,t:0,i:1102}, D{l:132,t:0,i:312}, D{l:4,t:11,i:68}, D{l:5,t:11,i:634}, D{l:6,t:11,i:386}, D{l:7,t:11,i:794}, D{l:8,t:11,i:273}, D{l:9,t:11,i:563}, D{l:10,t:11,i:105}, D{l:10,t:11,i:171}, D{l:11,t:11,i:94}, D{l:139,t:11,i:354}, D{l:133,t:0,i:740}, D{l:135,t:0,i:1642}, D{l:4,t:11,i:95}, D{l:7,t:11,i:416}, D{l:8,t:11,i:211}, D{l:139,t:11,i:830}, D{l:132,t:0,i:236}, D{l:138,t:10,i:241}, D{l:7,t:11,i:731}, D{l:13,t:11,i:20}, D{l:143,t:11,i:11}, D{l:5,t:0,i:836}, D{l:5,t:0,i:857}, D{l:6,t:0,i:1680}, D{l:135,t:0,i:59}, D{l:10,t:0,i:68}, D{l:11,t:0,i:494}, D{l:152,t:11,i:6}, D{l:4,t:0,i:81}, D{l:139,t:0,i:867}, D{l:135,t:0,i:795}, D{l:133,t:11,i:689}, D{l:4,t:0,i:1001}, D{l:5,t:0,i:282}, D{l:6,t:0,i:1932}, D{l:6,t:0,i:1977}, D{l:6,t:0,i:1987}, D{l:6,t:0,i:1992}, D{l:8,t:0,i:650}, D{l:8,t:0,i:919}, D{l:8,t:0,i:920}, D{l:8,t:0,i:923}, D{l:8,t:0,i:926}, D{l:8,t:0,i:927}, D{l:8,t:0,i:931}, D{l:8,t:0,i:939}, D{l:8,t:0,i:947}, D{l:8,t:0,i:956}, D{l:8,t:0,i:997}, D{l:9,t:0,i:907}, D{l:10,t:0,i:950}, D{l:10,t:0,i:953}, D{l:10,t:0,i:954}, D{l:10,t:0,i:956}, D{l:10,t:0,i:958}, D{l:10,t:0,i:959}, D{l:10,t:0,i:964}, D{l:10,t:0,i:970}, D{l:10,t:0,i:972}, D{l:10,t:0,i:973}, D{l:10,t:0,i:975}, D{l:10,t:0,i:976}, D{l:10,t:0,i:980}, D{l:10,t:0,i:981}, D{l:10,t:0,i:984}, D{l:10,t:0,i:988}, D{l:10,t:0,i:990}, D{l:10,t:0,i:995}, D{l:10,t:0,i:999}, D{l:10,t:0,i:1002}, D{l:10,t:0,i:1003}, D{l:10,t:0,i:1005}, D{l:10,t:0,i:1006}, D{l:10,t:0,i:1008}, D{l:10,t:0,i:1009}, D{l:10,t:0,i:1012}, D{l:10,t:0,i:1014}, D{l:10,t:0,i:1015}, D{l:10,t:0,i:1019}, D{l:10,t:0,i:1020}, D{l:10,t:0,i:1022}, D{l:12,t:0,i:959}, D{l:12,t:0,i:961}, D{l:12,t:0,i:962}, D{l:12,t:0,i:963}, D{l:12,t:0,i:964}, D{l:12,t:0,i:965}, D{l:12,t:0,i:967}, D{l:12,t:0,i:968}, D{l:12,t:0,i:969}, D{l:12,t:0,i:970}, D{l:12,t:0,i:971}, D{l:12,t:0,i:972}, D{l:12,t:0,i:973}, D{l:12,t:0,i:974}, D{l:12,t:0,i:975}, D{l:12,t:0,i:976}, D{l:12,t:0,i:977}, D{l:12,t:0,i:979}, D{l:12,t:0,i:981}, D{l:12,t:0,i:982}, D{l:12,t:0,i:983}, D{l:12,t:0,i:984}, D{l:12,t:0,i:985}, D{l:12,t:0,i:986}, D{l:12,t:0,i:987}, D{l:12,t:0,i:989}, D{l:12,t:0,i:990}, D{l:12,t:0,i:992}, D{l:12,t:0,i:993}, D{l:12,t:0,i:995}, D{l:12,t:0,i:998}, D{l:12,t:0,i:999}, D{l:12,t:0,i:1000}, D{l:12,t:0,i:1001}, D{l:12,t:0,i:1002}, D{l:12,t:0,i:1004}, D{l:12,t:0,i:1005}, D{l:12,t:0,i:1006}, D{l:12,t:0,i:1007}, D{l:12,t:0,i:1008}, D{l:12,t:0,i:1009}, D{l:12,t:0,i:1010}, D{l:12,t:0,i:1011}, D{l:12,t:0,i:1012}, D{l:12,t:0,i:1014}, D{l:12,t:0,i:1015}, D{l:12,t:0,i:1016}, D{l:12,t:0,i:1017}, D{l:12,t:0,i:1018}, D{l:12,t:0,i:1019}, D{l:12,t:0,i:1022}, D{l:12,t:0,i:1023}, D{l:14,t:0,i:475}, D{l:14,t:0,i:477}, D{l:14,t:0,i:478}, D{l:14,t:0,i:479}, D{l:14,t:0,i:480}, D{l:14,t:0,i:482}, D{l:14,t:0,i:483}, D{l:14,t:0,i:484}, D{l:14,t:0,i:485}, D{l:14,t:0,i:486}, D{l:14,t:0,i:487}, D{l:14,t:0,i:488}, D{l:14,t:0,i:489}, D{l:14,t:0,i:490}, D{l:14,t:0,i:491}, D{l:14,t:0,i:492}, D{l:14,t:0,i:493}, D{l:14,t:0,i:494}, D{l:14,t:0,i:495}, D{l:14,t:0,i:496}, D{l:14,t:0,i:497}, D{l:14,t:0,i:498}, D{l:14,t:0,i:499}, D{l:14,t:0,i:500}, D{l:14,t:0,i:501}, D{l:14,t:0,i:502}, D{l:14,t:0,i:503}, D{l:14,t:0,i:504}, D{l:14,t:0,i:506}, D{l:14,t:0,i:507}, D{l:14,t:0,i:508}, D{l:14,t:0,i:509}, D{l:14,t:0,i:510}, D{l:14,t:0,i:511}, D{l:16,t:0,i:113}, D{l:16,t:0,i:114}, D{l:16,t:0,i:115}, D{l:16,t:0,i:117}, D{l:16,t:0,i:118}, D{l:16,t:0,i:119}, D{l:16,t:0,i:121}, D{l:16,t:0,i:122}, D{l:16,t:0,i:123}, D{l:16,t:0,i:124}, D{l:16,t:0,i:125}, D{l:16,t:0,i:126}, D{l:16,t:0,i:127}, D{l:18,t:0,i:242}, D{l:18,t:0,i:243}, D{l:18,t:0,i:244}, D{l:18,t:0,i:245}, D{l:18,t:0,i:248}, D{l:18,t:0,i:249}, D{l:18,t:0,i:250}, D{l:18,t:0,i:251}, D{l:18,t:0,i:252}, D{l:18,t:0,i:253}, D{l:18,t:0,i:254}, D{l:18,t:0,i:255}, D{l:20,t:0,i:125}, D{l:20,t:0,i:126}, D{l:148,t:0,i:127}, D{l:7,t:11,i:1717}, D{l:7,t:11,i:1769}, D{l:138,t:11,i:546}, D{l:7,t:11,i:1127}, D{l:7,t:11,i:1572}, D{l:10,t:11,i:297}, D{l:10,t:11,i:422}, D{l:11,t:11,i:764}, D{l:11,t:11,i:810}, D{l:12,t:11,i:264}, D{l:13,t:11,i:102}, D{l:13,t:11,i:300}, D{l:13,t:11,i:484}, D{l:14,t:11,i:147}, D{l:14,t:11,i:229}, D{l:17,t:11,i:71}, D{l:18,t:11,i:118}, D{l:147,t:11,i:120}, D{l:6,t:0,i:1148}, D{l:134,t:0,i:1586}, D{l:132,t:0,i:775}, D{l:135,t:10,i:954}, D{l:133,t:11,i:864}, D{l:133,t:11,i:928}, D{l:138,t:11,i:189}, D{l:135,t:10,i:1958}, D{l:6,t:10,i:549}, D{l:8,t:10,i:34}, D{l:8,t:10,i:283}, D{l:9,t:10,i:165}, D{l:138,t:10,i:475}, D{l:5,t:10,i:652}, D{l:5,t:10,i:701}, D{l:135,t:10,i:449}, D{l:135,t:11,i:695}, D{l:4,t:10,i:655}, D{l:7,t:10,i:850}, D{l:17,t:10,i:75}, D{l:146,t:10,i:137}, D{l:140,t:11,i:682}, D{l:133,t:11,i:523}, D{l:8,t:0,i:970}, D{l:136,t:10,i:670}, D{l:136,t:11,i:555}, D{l:7,t:11,i:76}, D{l:8,t:11,i:44}, D{l:9,t:11,i:884}, D{l:10,t:11,i:580}, D{l:11,t:11,i:399}, D{l:11,t:11,i:894}, D{l:15,t:11,i:122}, D{l:18,t:11,i:144}, D{l:147,t:11,i:61}, D{l:6,t:10,i:159}, D{l:6,t:10,i:364}, D{l:7,t:10,i:516}, D{l:7,t:10,i:1439}, D{l:137,t:10,i:518}, D{l:4,t:0,i:71}, D{l:5,t:0,i:376}, D{l:7,t:0,i:119}, D{l:138,t:0,i:665}, D{l:141,t:10,i:151}, D{l:11,t:0,i:827}, D{l:14,t:0,i:34}, D{l:143,t:0,i:148}, D{l:133,t:11,i:518}, D{l:4,t:0,i:479}, D{l:135,t:11,i:1787}, D{l:135,t:11,i:1852}, D{l:135,t:10,i:993}, D{l:7,t:0,i:607}, D{l:136,t:0,i:99}, D{l:134,t:0,i:1960}, D{l:132,t:0,i:793}, D{l:4,t:0,i:41}, D{l:5,t:0,i:74}, D{l:7,t:0,i:1627}, D{l:11,t:0,i:871}, D{l:140,t:0,i:619}, D{l:7,t:0,i:94}, D{l:11,t:0,i:329}, D{l:11,t:0,i:965}, D{l:12,t:0,i:241}, D{l:14,t:0,i:354}, D{l:15,t:0,i:22}, D{l:148,t:0,i:63}, D{l:7,t:10,i:501}, D{l:9,t:10,i:111}, D{l:10,t:10,i:141}, D{l:11,t:10,i:332}, D{l:13,t:10,i:43}, D{l:13,t:10,i:429}, D{l:14,t:10,i:130}, D{l:14,t:10,i:415}, D{l:145,t:10,i:102}, D{l:9,t:0,i:209}, D{l:137,t:0,i:300}, D{l:134,t:0,i:1497}, D{l:138,t:11,i:255}, D{l:4,t:11,i:934}, D{l:5,t:11,i:138}, D{l:136,t:11,i:610}, D{l:133,t:0,i:98}, D{l:6,t:0,i:1316}, D{l:10,t:11,i:804}, D{l:138,t:11,i:832}, D{l:8,t:11,i:96}, D{l:9,t:11,i:36}, D{l:10,t:11,i:607}, D{l:11,t:11,i:423}, D{l:11,t:11,i:442}, D{l:12,t:11,i:309}, D{l:14,t:11,i:199}, D{l:15,t:11,i:90}, D{l:145,t:11,i:110}, D{l:132,t:0,i:463}, D{l:5,t:10,i:149}, D{l:136,t:10,i:233}, D{l:133,t:10,i:935}, D{l:4,t:11,i:652}, D{l:8,t:11,i:320}, D{l:9,t:11,i:13}, D{l:9,t:11,i:398}, D{l:9,t:11,i:727}, D{l:10,t:11,i:75}, D{l:10,t:11,i:184}, D{l:10,t:11,i:230}, D{l:10,t:11,i:564}, D{l:10,t:11,i:569}, D{l:11,t:11,i:973}, D{l:12,t:11,i:70}, D{l:12,t:11,i:189}, D{l:13,t:11,i:57}, D{l:13,t:11,i:257}, D{l:22,t:11,i:6}, D{l:150,t:11,i:16}, D{l:142,t:0,i:291}, D{l:12,t:10,i:582}, D{l:146,t:10,i:131}, D{l:136,t:10,i:801}, D{l:133,t:0,i:984}, D{l:145,t:11,i:116}, D{l:4,t:11,i:692}, D{l:133,t:11,i:321}, D{l:4,t:0,i:182}, D{l:6,t:0,i:205}, D{l:135,t:0,i:220}, D{l:4,t:0,i:42}, D{l:9,t:0,i:205}, D{l:9,t:0,i:786}, D{l:138,t:0,i:659}, D{l:6,t:0,i:801}, D{l:11,t:11,i:130}, D{l:140,t:11,i:609}, D{l:132,t:0,i:635}, D{l:5,t:11,i:345}, D{l:135,t:11,i:1016}, D{l:139,t:0,i:533}, D{l:132,t:0,i:371}, D{l:4,t:0,i:272}, D{l:135,t:0,i:836}, D{l:6,t:0,i:1282}, D{l:135,t:11,i:1100}, D{l:5,t:0,i:825}, D{l:134,t:0,i:1640}, D{l:135,t:11,i:1325}, D{l:133,t:11,i:673}, D{l:4,t:11,i:287}, D{l:133,t:11,i:1018}, D{l:135,t:0,i:357}, D{l:6,t:0,i:467}, D{l:137,t:0,i:879}, D{l:7,t:0,i:317}, D{l:135,t:0,i:569}, D{l:6,t:0,i:924}, D{l:134,t:0,i:1588}, D{l:5,t:11,i:34}, D{l:5,t:10,i:406}, D{l:10,t:11,i:724}, D{l:12,t:11,i:444}, D{l:13,t:11,i:354}, D{l:18,t:11,i:32}, D{l:23,t:11,i:24}, D{l:23,t:11,i:31}, D{l:152,t:11,i:5}, D{l:6,t:0,i:1795}, D{l:6,t:0,i:1835}, D{l:6,t:0,i:1836}, D{l:6,t:0,i:1856}, D{l:8,t:0,i:844}, D{l:8,t:0,i:849}, D{l:8,t:0,i:854}, D{l:8,t:0,i:870}, D{l:8,t:0,i:887}, D{l:10,t:0,i:852}, D{l:138,t:0,i:942}, D{l:6,t:10,i:69}, D{l:135,t:10,i:117}, D{l:137,t:0,i:307}, D{l:4,t:0,i:944}, D{l:6,t:0,i:1799}, D{l:6,t:0,i:1825}, D{l:10,t:0,i:848}, D{l:10,t:0,i:875}, D{l:10,t:0,i:895}, D{l:10,t:0,i:899}, D{l:10,t:0,i:902}, D{l:140,t:0,i:773}, D{l:11,t:0,i:43}, D{l:13,t:0,i:72}, D{l:141,t:0,i:142}, D{l:135,t:10,i:1830}, D{l:134,t:11,i:382}, D{l:4,t:10,i:432}, D{l:135,t:10,i:824}, D{l:132,t:11,i:329}, D{l:7,t:0,i:1820}, D{l:139,t:11,i:124}, D{l:133,t:10,i:826}, D{l:133,t:0,i:525}, D{l:132,t:11,i:906}, D{l:7,t:11,i:1940}, D{l:136,t:11,i:366}, D{l:138,t:11,i:10}, D{l:4,t:11,i:123}, D{l:4,t:11,i:649}, D{l:5,t:11,i:605}, D{l:7,t:11,i:1509}, D{l:136,t:11,i:36}, D{l:6,t:0,i:110}, D{l:135,t:0,i:1681}, D{l:133,t:0,i:493}, D{l:133,t:11,i:767}, D{l:4,t:0,i:174}, D{l:135,t:0,i:911}, D{l:138,t:11,i:786}, D{l:8,t:0,i:417}, D{l:137,t:0,i:782}, D{l:133,t:10,i:1000}, D{l:7,t:0,i:733}, D{l:137,t:0,i:583}, D{l:4,t:10,i:297}, D{l:6,t:10,i:529}, D{l:7,t:10,i:152}, D{l:7,t:10,i:713}, D{l:7,t:10,i:1845}, D{l:8,t:10,i:710}, D{l:8,t:10,i:717}, D{l:12,t:10,i:639}, D{l:140,t:10,i:685}, D{l:4,t:0,i:32}, D{l:5,t:0,i:215}, D{l:6,t:0,i:269}, D{l:7,t:0,i:1782}, D{l:7,t:0,i:1892}, D{l:10,t:0,i:16}, D{l:11,t:0,i:822}, D{l:11,t:0,i:954}, D{l:141,t:0,i:481}, D{l:4,t:11,i:273}, D{l:5,t:11,i:658}, D{l:133,t:11,i:995}, D{l:136,t:0,i:477}, D{l:134,t:11,i:72}, D{l:135,t:11,i:1345}, D{l:5,t:0,i:308}, D{l:7,t:0,i:1088}, D{l:4,t:10,i:520}, D{l:135,t:10,i:575}, D{l:133,t:11,i:589}, D{l:5,t:0,i:126}, D{l:8,t:0,i:297}, D{l:9,t:0,i:366}, D{l:140,t:0,i:374}, D{l:7,t:0,i:1551}, D{l:139,t:0,i:361}, D{l:5,t:11,i:117}, D{l:6,t:11,i:514}, D{l:6,t:11,i:541}, D{l:7,t:11,i:1164}, D{l:7,t:11,i:1436}, D{l:8,t:11,i:220}, D{l:8,t:11,i:648}, D{l:10,t:11,i:688}, D{l:139,t:11,i:560}, D{l:133,t:11,i:686}, D{l:4,t:0,i:946}, D{l:6,t:0,i:1807}, D{l:8,t:0,i:871}, D{l:10,t:0,i:854}, D{l:10,t:0,i:870}, D{l:10,t:0,i:888}, D{l:10,t:0,i:897}, D{l:10,t:0,i:920}, D{l:12,t:0,i:722}, D{l:12,t:0,i:761}, D{l:12,t:0,i:763}, D{l:12,t:0,i:764}, D{l:14,t:0,i:454}, D{l:14,t:0,i:465}, D{l:16,t:0,i:107}, D{l:18,t:0,i:167}, D{l:18,t:0,i:168}, D{l:146,t:0,i:172}, D{l:132,t:0,i:175}, D{l:135,t:0,i:1307}, D{l:132,t:0,i:685}, D{l:135,t:11,i:1834}, D{l:133,t:0,i:797}, D{l:6,t:0,i:745}, D{l:6,t:0,i:858}, D{l:134,t:0,i:963}, D{l:133,t:0,i:565}, D{l:5,t:10,i:397}, D{l:6,t:10,i:154}, D{l:7,t:11,i:196}, D{l:7,t:10,i:676}, D{l:8,t:10,i:443}, D{l:8,t:10,i:609}, D{l:9,t:10,i:24}, D{l:9,t:10,i:325}, D{l:10,t:10,i:35}, D{l:10,t:11,i:765}, D{l:11,t:11,i:347}, D{l:11,t:10,i:535}, D{l:11,t:11,i:552}, D{l:11,t:11,i:576}, D{l:11,t:10,i:672}, D{l:11,t:11,i:790}, D{l:11,t:10,i:1018}, D{l:12,t:11,i:263}, D{l:12,t:10,i:637}, D{l:13,t:11,i:246}, D{l:13,t:11,i:270}, D{l:13,t:11,i:395}, D{l:14,t:11,i:74}, D{l:14,t:11,i:176}, D{l:14,t:11,i:190}, D{l:14,t:11,i:398}, D{l:14,t:11,i:412}, D{l:15,t:11,i:32}, D{l:15,t:11,i:63}, D{l:16,t:10,i:30}, D{l:16,t:11,i:88}, D{l:147,t:11,i:105}, D{l:13,t:11,i:84}, D{l:141,t:11,i:122}, D{l:4,t:0,i:252}, D{l:7,t:0,i:1068}, D{l:10,t:0,i:434}, D{l:11,t:0,i:228}, D{l:11,t:0,i:426}, D{l:13,t:0,i:231}, D{l:18,t:0,i:106}, D{l:148,t:0,i:87}, D{l:137,t:0,i:826}, D{l:4,t:11,i:589}, D{l:139,t:11,i:282}, D{l:5,t:11,i:381}, D{l:135,t:11,i:1792}, D{l:132,t:0,i:791}, D{l:5,t:0,i:231}, D{l:10,t:0,i:509}, D{l:133,t:10,i:981}, D{l:7,t:0,i:601}, D{l:9,t:0,i:277}, D{l:9,t:0,i:674}, D{l:10,t:0,i:178}, D{l:10,t:0,i:418}, D{l:10,t:0,i:571}, D{l:11,t:0,i:531}, D{l:12,t:0,i:113}, D{l:12,t:0,i:475}, D{l:13,t:0,i:99}, D{l:142,t:0,i:428}, D{l:4,t:10,i:56}, D{l:7,t:11,i:616}, D{l:7,t:10,i:1791}, D{l:8,t:10,i:607}, D{l:8,t:10,i:651}, D{l:10,t:11,i:413}, D{l:11,t:10,i:465}, D{l:11,t:10,i:835}, D{l:12,t:10,i:337}, D{l:141,t:10,i:480}, D{l:7,t:0,i:1591}, D{l:144,t:0,i:43}, D{l:9,t:10,i:158}, D{l:138,t:10,i:411}, D{l:135,t:0,i:1683}, D{l:8,t:0,i:289}, D{l:11,t:0,i:45}, D{l:12,t:0,i:278}, D{l:140,t:0,i:537}, D{l:6,t:11,i:120}, D{l:7,t:11,i:1188}, D{l:7,t:11,i:1710}, D{l:8,t:11,i:286}, D{l:9,t:11,i:667}, D{l:11,t:11,i:592}, D{l:139,t:11,i:730}, D{l:136,t:10,i:617}, D{l:135,t:0,i:1120}, D{l:135,t:11,i:1146}, D{l:139,t:10,i:563}, D{l:4,t:11,i:352}, D{l:4,t:10,i:369}, D{l:135,t:11,i:687}, D{l:143,t:11,i:38}, D{l:4,t:0,i:399}, D{l:5,t:0,i:119}, D{l:5,t:0,i:494}, D{l:7,t:0,i:751}, D{l:9,t:0,i:556}, D{l:14,t:11,i:179}, D{l:15,t:11,i:151}, D{l:150,t:11,i:11}, D{l:4,t:11,i:192}, D{l:5,t:11,i:49}, D{l:6,t:11,i:200}, D{l:6,t:11,i:293}, D{l:6,t:11,i:1696}, D{l:135,t:11,i:488}, D{l:4,t:0,i:398}, D{l:133,t:0,i:660}, D{l:7,t:0,i:1030}, D{l:134,t:10,i:622}, D{l:135,t:11,i:595}, D{l:141,t:0,i:168}, D{l:132,t:11,i:147}, D{l:7,t:0,i:973}, D{l:10,t:10,i:624}, D{l:142,t:10,i:279}, D{l:132,t:10,i:363}, D{l:132,t:0,i:642}, D{l:133,t:11,i:934}, D{l:134,t:0,i:1615}, D{l:7,t:11,i:505}, D{l:135,t:11,i:523}, D{l:7,t:0,i:594}, D{l:7,t:0,i:851}, D{l:7,t:0,i:1858}, D{l:9,t:0,i:411}, D{l:9,t:0,i:574}, D{l:9,t:0,i:666}, D{l:9,t:0,i:737}, D{l:10,t:0,i:346}, D{l:10,t:0,i:712}, D{l:11,t:0,i:246}, D{l:11,t:0,i:432}, D{l:11,t:0,i:517}, D{l:11,t:0,i:647}, D{l:11,t:0,i:679}, D{l:11,t:0,i:727}, D{l:12,t:0,i:304}, D{l:12,t:0,i:305}, D{l:12,t:0,i:323}, D{l:12,t:0,i:483}, D{l:12,t:0,i:572}, D{l:12,t:0,i:593}, D{l:12,t:0,i:602}, D{l:13,t:0,i:95}, D{l:13,t:0,i:101}, D{l:13,t:0,i:171}, D{l:13,t:0,i:315}, D{l:13,t:0,i:378}, D{l:13,t:0,i:425}, D{l:13,t:0,i:475}, D{l:14,t:0,i:63}, D{l:14,t:0,i:380}, D{l:14,t:0,i:384}, D{l:15,t:0,i:133}, D{l:18,t:0,i:112}, D{l:148,t:0,i:72}, D{l:135,t:0,i:1093}, D{l:132,t:0,i:679}, D{l:8,t:0,i:913}, D{l:10,t:0,i:903}, D{l:10,t:0,i:915}, D{l:12,t:0,i:648}, D{l:12,t:0,i:649}, D{l:14,t:0,i:455}, D{l:16,t:0,i:112}, D{l:138,t:11,i:438}, D{l:137,t:0,i:203}, D{l:134,t:10,i:292}, D{l:134,t:0,i:1492}, D{l:7,t:0,i:1374}, D{l:8,t:0,i:540}, D{l:5,t:10,i:177}, D{l:6,t:10,i:616}, D{l:7,t:10,i:827}, D{l:9,t:10,i:525}, D{l:138,t:10,i:656}, D{l:135,t:0,i:1486}, D{l:9,t:0,i:714}, D{l:138,t:10,i:31}, D{l:136,t:0,i:825}, D{l:134,t:0,i:1511}, D{l:132,t:11,i:637}, D{l:134,t:0,i:952}, D{l:4,t:10,i:161}, D{l:133,t:10,i:631}, D{l:5,t:0,i:143}, D{l:5,t:0,i:769}, D{l:6,t:0,i:1760}, D{l:7,t:0,i:682}, D{l:7,t:0,i:1992}, D{l:136,t:0,i:736}, D{l:132,t:0,i:700}, D{l:134,t:0,i:1540}, D{l:132,t:11,i:777}, D{l:9,t:11,i:867}, D{l:138,t:11,i:837}, D{l:7,t:0,i:1557}, D{l:135,t:10,i:1684}, D{l:133,t:0,i:860}, D{l:6,t:0,i:422}, D{l:7,t:0,i:0}, D{l:7,t:0,i:1544}, D{l:9,t:0,i:605}, D{l:11,t:0,i:990}, D{l:12,t:0,i:235}, D{l:12,t:0,i:453}, D{l:13,t:0,i:47}, D{l:13,t:0,i:266}, D{l:9,t:10,i:469}, D{l:9,t:10,i:709}, D{l:12,t:10,i:512}, D{l:14,t:10,i:65}, D{l:145,t:10,i:12}, D{l:11,t:0,i:807}, D{l:10,t:10,i:229}, D{l:11,t:10,i:73}, D{l:139,t:10,i:376}, D{l:6,t:11,i:170}, D{l:7,t:11,i:1080}, D{l:8,t:11,i:395}, D{l:8,t:11,i:487}, D{l:11,t:11,i:125}, D{l:141,t:11,i:147}, D{l:5,t:0,i:515}, D{l:137,t:0,i:131}, D{l:7,t:0,i:1605}, D{l:11,t:0,i:962}, D{l:146,t:0,i:139}, D{l:132,t:0,i:646}, D{l:4,t:0,i:396}, D{l:7,t:0,i:728}, D{l:9,t:0,i:117}, D{l:13,t:0,i:202}, D{l:148,t:0,i:51}, D{l:6,t:0,i:121}, D{l:6,t:0,i:124}, D{l:6,t:0,i:357}, D{l:7,t:0,i:1138}, D{l:7,t:0,i:1295}, D{l:8,t:0,i:162}, D{l:8,t:0,i:508}, D{l:11,t:0,i:655}, D{l:4,t:11,i:535}, D{l:6,t:10,i:558}, D{l:7,t:10,i:651}, D{l:8,t:11,i:618}, D{l:9,t:10,i:0}, D{l:10,t:10,i:34}, D{l:139,t:10,i:1008}, D{l:135,t:11,i:1245}, D{l:138,t:0,i:357}, D{l:150,t:11,i:23}, D{l:133,t:0,i:237}, D{l:135,t:0,i:1784}, D{l:7,t:10,i:1832}, D{l:138,t:10,i:374}, D{l:132,t:0,i:713}, D{l:132,t:11,i:46}, D{l:6,t:0,i:1536}, D{l:10,t:0,i:348}, D{l:5,t:11,i:811}, D{l:6,t:11,i:1679}, D{l:6,t:11,i:1714}, D{l:135,t:11,i:2032}, D{l:11,t:11,i:182}, D{l:142,t:11,i:195}, D{l:6,t:0,i:523}, D{l:7,t:0,i:738}, D{l:7,t:10,i:771}, D{l:7,t:10,i:1731}, D{l:9,t:10,i:405}, D{l:138,t:10,i:421}, D{l:7,t:11,i:1458}, D{l:9,t:11,i:407}, D{l:139,t:11,i:15}, D{l:6,t:11,i:34}, D{l:7,t:11,i:69}, D{l:7,t:11,i:640}, D{l:7,t:11,i:1089}, D{l:8,t:11,i:708}, D{l:8,t:11,i:721}, D{l:9,t:11,i:363}, D{l:9,t:11,i:643}, D{l:10,t:11,i:628}, D{l:148,t:11,i:98}, D{l:133,t:0,i:434}, D{l:135,t:0,i:1877}, D{l:7,t:0,i:571}, D{l:138,t:0,i:366}, D{l:5,t:10,i:881}, D{l:133,t:10,i:885}, D{l:9,t:0,i:513}, D{l:10,t:0,i:25}, D{l:10,t:0,i:39}, D{l:12,t:0,i:122}, D{l:140,t:0,i:187}, D{l:132,t:0,i:580}, D{l:5,t:10,i:142}, D{l:134,t:10,i:546}, D{l:132,t:11,i:462}, D{l:137,t:0,i:873}, D{l:5,t:10,i:466}, D{l:11,t:10,i:571}, D{l:12,t:10,i:198}, D{l:13,t:10,i:283}, D{l:14,t:10,i:186}, D{l:15,t:10,i:21}, D{l:143,t:10,i:103}, D{l:7,t:0,i:171}, D{l:4,t:10,i:185}, D{l:5,t:10,i:257}, D{l:5,t:10,i:839}, D{l:5,t:10,i:936}, D{l:9,t:10,i:399}, D{l:10,t:10,i:258}, D{l:10,t:10,i:395}, D{l:10,t:10,i:734}, D{l:11,t:10,i:1014}, D{l:12,t:10,i:23}, D{l:13,t:10,i:350}, D{l:14,t:10,i:150}, D{l:147,t:10,i:6}, D{l:134,t:0,i:625}, D{l:7,t:0,i:107}, D{l:7,t:0,i:838}, D{l:8,t:0,i:550}, D{l:138,t:0,i:401}, D{l:5,t:11,i:73}, D{l:6,t:11,i:23}, D{l:134,t:11,i:338}, D{l:4,t:0,i:943}, D{l:6,t:0,i:1850}, D{l:12,t:0,i:713}, D{l:142,t:0,i:434}, D{l:11,t:0,i:588}, D{l:11,t:0,i:864}, D{l:11,t:0,i:936}, D{l:11,t:0,i:968}, D{l:12,t:0,i:73}, D{l:12,t:0,i:343}, D{l:12,t:0,i:394}, D{l:13,t:0,i:275}, D{l:14,t:0,i:257}, D{l:15,t:0,i:160}, D{l:7,t:10,i:404}, D{l:7,t:10,i:1377}, D{l:7,t:10,i:1430}, D{l:7,t:10,i:2017}, D{l:8,t:10,i:149}, D{l:8,t:10,i:239}, D{l:8,t:10,i:512}, D{l:8,t:10,i:793}, D{l:8,t:10,i:818}, D{l:9,t:10,i:474}, D{l:9,t:10,i:595}, D{l:10,t:10,i:122}, D{l:10,t:10,i:565}, D{l:10,t:10,i:649}, D{l:10,t:10,i:783}, D{l:11,t:10,i:239}, D{l:11,t:10,i:295}, D{l:11,t:10,i:447}, D{l:11,t:10,i:528}, D{l:11,t:10,i:639}, D{l:11,t:10,i:800}, D{l:12,t:10,i:25}, D{l:12,t:10,i:157}, D{l:12,t:10,i:316}, D{l:12,t:10,i:390}, D{l:12,t:10,i:391}, D{l:12,t:10,i:395}, D{l:12,t:10,i:478}, D{l:12,t:10,i:503}, D{l:12,t:10,i:592}, D{l:12,t:10,i:680}, D{l:13,t:10,i:50}, D{l:13,t:10,i:53}, D{l:13,t:10,i:132}, D{l:13,t:10,i:198}, D{l:13,t:10,i:322}, D{l:13,t:10,i:415}, D{l:13,t:10,i:511}, D{l:14,t:10,i:71}, D{l:14,t:10,i:395}, D{l:15,t:10,i:71}, D{l:15,t:10,i:136}, D{l:17,t:10,i:123}, D{l:18,t:10,i:93}, D{l:147,t:10,i:58}, D{l:133,t:0,i:768}, D{l:11,t:0,i:103}, D{l:142,t:0,i:0}, D{l:136,t:10,i:712}, D{l:132,t:0,i:799}, D{l:132,t:0,i:894}, D{l:7,t:11,i:725}, D{l:8,t:11,i:498}, D{l:139,t:11,i:268}, D{l:135,t:11,i:1798}, D{l:135,t:11,i:773}, D{l:141,t:11,i:360}, D{l:4,t:10,i:377}, D{l:152,t:10,i:13}, D{l:135,t:0,i:1673}, D{l:132,t:11,i:583}, D{l:134,t:0,i:1052}, D{l:133,t:11,i:220}, D{l:140,t:11,i:69}, D{l:132,t:11,i:544}, D{l:4,t:10,i:180}, D{l:135,t:10,i:1906}, D{l:134,t:0,i:272}, D{l:4,t:0,i:441}, D{l:134,t:0,i:1421}, D{l:4,t:0,i:9}, D{l:5,t:0,i:128}, D{l:7,t:0,i:368}, D{l:11,t:0,i:480}, D{l:148,t:0,i:3}, D{l:5,t:11,i:176}, D{l:6,t:11,i:437}, D{l:6,t:11,i:564}, D{l:11,t:11,i:181}, D{l:141,t:11,i:183}, D{l:132,t:10,i:491}, D{l:7,t:0,i:1182}, D{l:141,t:11,i:67}, D{l:6,t:0,i:1346}, D{l:4,t:10,i:171}, D{l:138,t:10,i:234}, D{l:4,t:10,i:586}, D{l:7,t:10,i:1186}, D{l:138,t:10,i:631}, D{l:136,t:0,i:682}, D{l:134,t:0,i:1004}, D{l:15,t:0,i:24}, D{l:143,t:11,i:24}, D{l:134,t:0,i:968}, D{l:4,t:0,i:2}, D{l:6,t:0,i:742}, D{l:6,t:0,i:793}, D{l:7,t:0,i:545}, D{l:7,t:0,i:894}, D{l:9,t:10,i:931}, D{l:10,t:10,i:334}, D{l:148,t:10,i:71}, D{l:136,t:11,i:600}, D{l:133,t:10,i:765}, D{l:9,t:0,i:769}, D{l:140,t:0,i:185}, D{l:4,t:11,i:790}, D{l:5,t:11,i:273}, D{l:134,t:11,i:394}, D{l:7,t:0,i:474}, D{l:137,t:0,i:578}, D{l:4,t:11,i:135}, D{l:6,t:11,i:127}, D{l:7,t:11,i:1185}, D{l:7,t:11,i:1511}, D{l:8,t:11,i:613}, D{l:11,t:11,i:5}, D{l:12,t:11,i:133}, D{l:12,t:11,i:495}, D{l:12,t:11,i:586}, D{l:14,t:11,i:385}, D{l:15,t:11,i:118}, D{l:17,t:11,i:20}, D{l:146,t:11,i:98}, D{l:133,t:10,i:424}, D{l:5,t:0,i:530}, D{l:142,t:0,i:113}, D{l:6,t:11,i:230}, D{l:7,t:11,i:961}, D{l:7,t:11,i:1085}, D{l:136,t:11,i:462}, D{l:7,t:11,i:1954}, D{l:137,t:11,i:636}, D{l:136,t:10,i:714}, D{l:149,t:11,i:6}, D{l:135,t:10,i:685}, D{l:9,t:10,i:420}, D{l:10,t:10,i:269}, D{l:10,t:10,i:285}, D{l:10,t:10,i:576}, D{l:11,t:10,i:397}, D{l:13,t:10,i:175}, D{l:145,t:10,i:90}, D{l:132,t:10,i:429}, D{l:5,t:0,i:556}, D{l:5,t:11,i:162}, D{l:136,t:11,i:68}, D{l:132,t:11,i:654}, D{l:4,t:11,i:156}, D{l:7,t:11,i:998}, D{l:7,t:11,i:1045}, D{l:7,t:11,i:1860}, D{l:9,t:11,i:48}, D{l:9,t:11,i:692}, D{l:11,t:11,i:419}, D{l:139,t:11,i:602}, D{l:6,t:0,i:1317}, D{l:8,t:0,i:16}, D{l:9,t:0,i:825}, D{l:12,t:0,i:568}, D{l:7,t:11,i:1276}, D{l:8,t:11,i:474}, D{l:137,t:11,i:652}, D{l:18,t:0,i:97}, D{l:7,t:10,i:18}, D{l:7,t:10,i:699}, D{l:7,t:10,i:1966}, D{l:8,t:10,i:752}, D{l:9,t:10,i:273}, D{l:9,t:10,i:412}, D{l:9,t:10,i:703}, D{l:10,t:10,i:71}, D{l:10,t:10,i:427}, D{l:138,t:10,i:508}, D{l:10,t:0,i:703}, D{l:7,t:11,i:1454}, D{l:138,t:11,i:703}, D{l:4,t:10,i:53}, D{l:5,t:10,i:186}, D{l:135,t:10,i:752}, D{l:134,t:0,i:892}, D{l:134,t:0,i:1571}, D{l:8,t:10,i:575}, D{l:10,t:10,i:289}, D{l:139,t:10,i:319}, D{l:6,t:0,i:186}, D{l:137,t:0,i:426}, D{l:134,t:0,i:1101}, D{l:132,t:10,i:675}, D{l:132,t:0,i:585}, D{l:6,t:0,i:1870}, D{l:137,t:0,i:937}, D{l:152,t:11,i:10}, D{l:9,t:11,i:197}, D{l:10,t:11,i:300}, D{l:12,t:11,i:473}, D{l:13,t:11,i:90}, D{l:141,t:11,i:405}, D{l:4,t:0,i:93}, D{l:5,t:0,i:252}, D{l:6,t:0,i:229}, D{l:7,t:0,i:291}, D{l:9,t:0,i:550}, D{l:139,t:0,i:644}, D{l:137,t:0,i:749}, D{l:9,t:0,i:162}, D{l:6,t:10,i:209}, D{l:8,t:10,i:468}, D{l:9,t:10,i:210}, D{l:11,t:10,i:36}, D{l:12,t:10,i:28}, D{l:12,t:10,i:630}, D{l:13,t:10,i:21}, D{l:13,t:10,i:349}, D{l:14,t:10,i:7}, D{l:145,t:10,i:13}, D{l:132,t:0,i:381}, D{l:132,t:11,i:606}, D{l:4,t:10,i:342}, D{l:135,t:10,i:1179}, D{l:7,t:11,i:1587}, D{l:7,t:11,i:1707}, D{l:10,t:11,i:528}, D{l:139,t:11,i:504}, D{l:12,t:11,i:39}, D{l:13,t:11,i:265}, D{l:141,t:11,i:439}, D{l:4,t:10,i:928}, D{l:133,t:10,i:910}, D{l:7,t:10,i:1838}, D{l:7,t:11,i:1978}, D{l:136,t:11,i:676}, D{l:6,t:0,i:762}, D{l:6,t:0,i:796}, D{l:134,t:0,i:956}, D{l:4,t:10,i:318}, D{l:4,t:10,i:496}, D{l:7,t:10,i:856}, D{l:139,t:10,i:654}, D{l:137,t:11,i:242}, D{l:4,t:11,i:361}, D{l:133,t:11,i:315}, D{l:132,t:11,i:461}, D{l:132,t:11,i:472}, D{l:132,t:0,i:857}, D{l:5,t:0,i:21}, D{l:6,t:0,i:77}, D{l:6,t:0,i:157}, D{l:7,t:0,i:974}, D{l:7,t:0,i:1301}, D{l:7,t:0,i:1339}, D{l:7,t:0,i:1490}, D{l:7,t:0,i:1873}, D{l:9,t:0,i:628}, D{l:7,t:10,i:915}, D{l:8,t:10,i:247}, D{l:147,t:10,i:0}, D{l:4,t:10,i:202}, D{l:5,t:10,i:382}, D{l:6,t:10,i:454}, D{l:7,t:10,i:936}, D{l:7,t:10,i:1803}, D{l:8,t:10,i:758}, D{l:9,t:10,i:375}, D{l:9,t:10,i:895}, D{l:10,t:10,i:743}, D{l:10,t:10,i:792}, D{l:11,t:10,i:978}, D{l:11,t:10,i:1012}, D{l:142,t:10,i:109}, D{l:7,t:11,i:617}, D{l:10,t:11,i:498}, D{l:11,t:11,i:501}, D{l:12,t:11,i:16}, D{l:140,t:11,i:150}, D{l:7,t:10,i:1150}, D{l:7,t:10,i:1425}, D{l:7,t:10,i:1453}, D{l:10,t:11,i:747}, D{l:140,t:10,i:513}, D{l:133,t:11,i:155}, D{l:11,t:0,i:919}, D{l:141,t:0,i:409}, D{l:138,t:10,i:791}, D{l:10,t:0,i:633}, D{l:139,t:11,i:729}, D{l:7,t:11,i:163}, D{l:8,t:11,i:319}, D{l:9,t:11,i:402}, D{l:10,t:11,i:24}, D{l:10,t:11,i:681}, D{l:11,t:11,i:200}, D{l:11,t:11,i:567}, D{l:12,t:11,i:253}, D{l:12,t:11,i:410}, D{l:142,t:11,i:219}, D{l:5,t:11,i:475}, D{l:7,t:11,i:1780}, D{l:9,t:11,i:230}, D{l:11,t:11,i:297}, D{l:11,t:11,i:558}, D{l:14,t:11,i:322}, D{l:147,t:11,i:76}, D{l:7,t:0,i:332}, D{l:6,t:10,i:445}, D{l:137,t:10,i:909}, D{l:135,t:11,i:1956}, D{l:136,t:11,i:274}, D{l:134,t:10,i:578}, D{l:135,t:0,i:1489}, D{l:135,t:11,i:1848}, D{l:5,t:11,i:944}, D{l:134,t:11,i:1769}, D{l:132,t:11,i:144}, D{l:136,t:10,i:766}, D{l:4,t:0,i:832}, D{l:135,t:10,i:541}, D{l:8,t:0,i:398}, D{l:9,t:0,i:681}, D{l:139,t:0,i:632}, D{l:136,t:0,i:645}, D{l:9,t:0,i:791}, D{l:10,t:0,i:93}, D{l:16,t:0,i:13}, D{l:17,t:0,i:23}, D{l:18,t:0,i:135}, D{l:19,t:0,i:12}, D{l:20,t:0,i:1}, D{l:20,t:0,i:12}, D{l:148,t:0,i:14}, D{l:6,t:11,i:247}, D{l:137,t:11,i:555}, D{l:134,t:0,i:20}, D{l:132,t:0,i:800}, D{l:135,t:0,i:1841}, D{l:139,t:10,i:983}, D{l:137,t:10,i:768}, D{l:132,t:10,i:584}, D{l:141,t:11,i:51}, D{l:6,t:0,i:1993}, D{l:4,t:11,i:620}, D{l:138,t:11,i:280}, D{l:136,t:0,i:769}, D{l:11,t:0,i:290}, D{l:11,t:0,i:665}, D{l:7,t:11,i:1810}, D{l:11,t:11,i:866}, D{l:12,t:11,i:103}, D{l:13,t:11,i:495}, D{l:17,t:11,i:67}, D{l:147,t:11,i:74}, D{l:134,t:0,i:1426}, D{l:139,t:0,i:60}, D{l:4,t:10,i:326}, D{l:135,t:10,i:1770}, D{l:7,t:0,i:1874}, D{l:9,t:0,i:641}, D{l:132,t:10,i:226}, D{l:6,t:0,i:644}, D{l:5,t:10,i:426}, D{l:8,t:10,i:30}, D{l:9,t:10,i:2}, D{l:11,t:10,i:549}, D{l:147,t:10,i:122}, D{l:5,t:11,i:428}, D{l:138,t:11,i:442}, D{l:135,t:11,i:1871}, D{l:135,t:0,i:1757}, D{l:147,t:10,i:117}, D{l:135,t:0,i:937}, D{l:135,t:0,i:1652}, D{l:6,t:0,i:654}, D{l:134,t:0,i:1476}, D{l:133,t:11,i:99}, D{l:135,t:0,i:527}, D{l:132,t:10,i:345}, D{l:4,t:10,i:385}, D{l:4,t:11,i:397}, D{l:7,t:10,i:265}, D{l:135,t:10,i:587}, D{l:4,t:0,i:579}, D{l:5,t:0,i:226}, D{l:5,t:0,i:323}, D{l:135,t:0,i:960}, D{l:134,t:0,i:1486}, D{l:8,t:11,i:502}, D{l:144,t:11,i:9}, D{l:4,t:10,i:347}, D{l:5,t:10,i:423}, D{l:5,t:10,i:996}, D{l:135,t:10,i:1329}, D{l:7,t:11,i:727}, D{l:146,t:11,i:73}, D{l:4,t:11,i:485}, D{l:7,t:11,i:353}, D{l:7,t:10,i:1259}, D{l:7,t:11,i:1523}, D{l:9,t:10,i:125}, D{l:139,t:10,i:65}, D{l:6,t:0,i:325}, D{l:5,t:10,i:136}, D{l:6,t:11,i:366}, D{l:7,t:11,i:1384}, D{l:7,t:11,i:1601}, D{l:136,t:10,i:644}, D{l:138,t:11,i:160}, D{l:6,t:0,i:1345}, D{l:137,t:11,i:282}, D{l:18,t:0,i:91}, D{l:147,t:0,i:70}, D{l:136,t:0,i:404}, D{l:4,t:11,i:157}, D{l:133,t:11,i:471}, D{l:133,t:0,i:973}, D{l:6,t:0,i:135}, D{l:135,t:0,i:1176}, D{l:8,t:11,i:116}, D{l:11,t:11,i:551}, D{l:142,t:11,i:159}, D{l:4,t:0,i:549}, D{l:4,t:10,i:433}, D{l:133,t:10,i:719}, D{l:136,t:0,i:976}, D{l:5,t:11,i:160}, D{l:7,t:11,i:363}, D{l:7,t:11,i:589}, D{l:10,t:11,i:170}, D{l:141,t:11,i:55}, D{l:144,t:0,i:21}, D{l:144,t:0,i:51}, D{l:135,t:0,i:314}, D{l:135,t:10,i:1363}, D{l:4,t:11,i:108}, D{l:7,t:11,i:405}, D{l:10,t:11,i:491}, D{l:139,t:11,i:498}, D{l:146,t:0,i:4}, D{l:4,t:10,i:555}, D{l:8,t:10,i:536}, D{l:10,t:10,i:288}, D{l:139,t:10,i:1005}, D{l:135,t:11,i:1005}, D{l:6,t:0,i:281}, D{l:7,t:0,i:6}, D{l:8,t:0,i:282}, D{l:8,t:0,i:480}, D{l:8,t:0,i:499}, D{l:9,t:0,i:198}, D{l:10,t:0,i:143}, D{l:10,t:0,i:169}, D{l:10,t:0,i:211}, D{l:10,t:0,i:417}, D{l:10,t:0,i:574}, D{l:11,t:0,i:147}, D{l:11,t:0,i:395}, D{l:12,t:0,i:75}, D{l:12,t:0,i:407}, D{l:12,t:0,i:608}, D{l:13,t:0,i:500}, D{l:142,t:0,i:251}, D{l:6,t:0,i:1093}, D{l:6,t:0,i:1405}, D{l:9,t:10,i:370}, D{l:138,t:10,i:90}, D{l:4,t:11,i:926}, D{l:133,t:11,i:983}, D{l:135,t:0,i:1776}, D{l:134,t:0,i:1528}, D{l:132,t:0,i:419}, D{l:132,t:11,i:538}, D{l:6,t:11,i:294}, D{l:7,t:11,i:1267}, D{l:136,t:11,i:624}, D{l:135,t:11,i:1772}, D{l:138,t:11,i:301}, D{l:4,t:10,i:257}, D{l:135,t:10,i:2031}, D{l:4,t:0,i:138}, D{l:7,t:0,i:1012}, D{l:7,t:0,i:1280}, D{l:9,t:0,i:76}, D{l:135,t:10,i:1768}, D{l:132,t:11,i:757}, D{l:5,t:0,i:29}, D{l:140,t:0,i:638}, D{l:7,t:11,i:655}, D{l:135,t:11,i:1844}, D{l:7,t:0,i:1418}, D{l:6,t:11,i:257}, D{l:135,t:11,i:1522}, D{l:8,t:11,i:469}, D{l:138,t:11,i:47}, D{l:142,t:11,i:278}, D{l:6,t:10,i:83}, D{l:6,t:10,i:1733}, D{l:135,t:10,i:1389}, D{l:11,t:11,i:204}, D{l:11,t:11,i:243}, D{l:140,t:11,i:293}, D{l:135,t:11,i:1875}, D{l:6,t:0,i:1710}, D{l:135,t:0,i:2038}, D{l:137,t:11,i:299}, D{l:4,t:0,i:17}, D{l:5,t:0,i:23}, D{l:7,t:0,i:995}, D{l:11,t:0,i:383}, D{l:11,t:0,i:437}, D{l:12,t:0,i:460}, D{l:140,t:0,i:532}, D{l:133,t:0,i:862}, D{l:137,t:10,i:696}, D{l:6,t:0,i:592}, D{l:138,t:0,i:946}, D{l:138,t:11,i:599}, D{l:7,t:10,i:1718}, D{l:9,t:10,i:95}, D{l:9,t:10,i:274}, D{l:10,t:10,i:279}, D{l:10,t:10,i:317}, D{l:10,t:10,i:420}, D{l:11,t:10,i:303}, D{l:11,t:10,i:808}, D{l:12,t:10,i:134}, D{l:12,t:10,i:367}, D{l:13,t:10,i:149}, D{l:13,t:10,i:347}, D{l:14,t:10,i:349}, D{l:14,t:10,i:406}, D{l:18,t:10,i:22}, D{l:18,t:10,i:89}, D{l:18,t:10,i:122}, D{l:147,t:10,i:47}, D{l:8,t:0,i:70}, D{l:12,t:0,i:171}, D{l:141,t:0,i:272}, D{l:133,t:10,i:26}, D{l:132,t:10,i:550}, D{l:137,t:0,i:812}, D{l:10,t:0,i:233}, D{l:139,t:0,i:76}, D{l:134,t:0,i:988}, D{l:134,t:0,i:442}, D{l:136,t:10,i:822}, D{l:7,t:0,i:896}, D{l:4,t:10,i:902}, D{l:5,t:10,i:809}, D{l:134,t:10,i:122}, D{l:5,t:11,i:150}, D{l:7,t:11,i:106}, D{l:8,t:11,i:603}, D{l:9,t:11,i:593}, D{l:9,t:11,i:634}, D{l:10,t:11,i:44}, D{l:10,t:11,i:173}, D{l:11,t:11,i:462}, D{l:11,t:11,i:515}, D{l:13,t:11,i:216}, D{l:13,t:11,i:288}, D{l:142,t:11,i:400}, D{l:136,t:0,i:483}, D{l:135,t:10,i:262}, D{l:6,t:0,i:1709}, D{l:133,t:10,i:620}, D{l:4,t:10,i:34}, D{l:5,t:10,i:574}, D{l:7,t:10,i:279}, D{l:7,t:10,i:1624}, D{l:136,t:10,i:601}, D{l:137,t:10,i:170}, D{l:147,t:0,i:119}, D{l:12,t:11,i:108}, D{l:141,t:11,i:291}, D{l:11,t:0,i:69}, D{l:12,t:0,i:105}, D{l:12,t:0,i:117}, D{l:13,t:0,i:213}, D{l:14,t:0,i:13}, D{l:14,t:0,i:62}, D{l:14,t:0,i:177}, D{l:14,t:0,i:421}, D{l:15,t:0,i:19}, D{l:146,t:0,i:141}, D{l:137,t:0,i:309}, D{l:11,t:11,i:278}, D{l:142,t:11,i:73}, D{l:7,t:0,i:608}, D{l:7,t:0,i:976}, D{l:9,t:0,i:146}, D{l:10,t:0,i:206}, D{l:10,t:0,i:596}, D{l:13,t:0,i:218}, D{l:142,t:0,i:153}, D{l:133,t:10,i:332}, D{l:6,t:10,i:261}, D{l:8,t:10,i:182}, D{l:139,t:10,i:943}, D{l:4,t:11,i:493}, D{l:144,t:11,i:55}, D{l:134,t:10,i:1721}, D{l:132,t:0,i:768}, D{l:4,t:10,i:933}, D{l:133,t:10,i:880}, D{l:7,t:11,i:555}, D{l:7,t:11,i:1316}, D{l:7,t:11,i:1412}, D{l:7,t:11,i:1839}, D{l:9,t:11,i:192}, D{l:9,t:11,i:589}, D{l:11,t:11,i:241}, D{l:11,t:11,i:676}, D{l:11,t:11,i:811}, D{l:11,t:11,i:891}, D{l:12,t:11,i:140}, D{l:12,t:11,i:346}, D{l:12,t:11,i:479}, D{l:13,t:11,i:30}, D{l:13,t:11,i:49}, D{l:13,t:11,i:381}, D{l:14,t:11,i:188}, D{l:15,t:11,i:150}, D{l:16,t:11,i:76}, D{l:18,t:11,i:30}, D{l:148,t:11,i:52}, D{l:4,t:0,i:518}, D{l:135,t:0,i:1136}, D{l:6,t:11,i:568}, D{l:7,t:11,i:112}, D{l:7,t:11,i:1804}, D{l:8,t:11,i:362}, D{l:8,t:11,i:410}, D{l:8,t:11,i:830}, D{l:9,t:11,i:514}, D{l:11,t:11,i:649}, D{l:142,t:11,i:157}, D{l:135,t:11,i:673}, D{l:8,t:0,i:689}, D{l:137,t:0,i:863}, D{l:4,t:0,i:18}, D{l:7,t:0,i:145}, D{l:7,t:0,i:444}, D{l:7,t:0,i:1278}, D{l:8,t:0,i:49}, D{l:8,t:0,i:400}, D{l:9,t:0,i:71}, D{l:9,t:0,i:250}, D{l:10,t:0,i:459}, D{l:12,t:0,i:160}, D{l:16,t:0,i:24}, D{l:132,t:11,i:625}, D{l:140,t:0,i:1020}, D{l:4,t:0,i:997}, D{l:6,t:0,i:1946}, D{l:6,t:0,i:1984}, D{l:134,t:0,i:1998}, D{l:6,t:11,i:16}, D{l:6,t:11,i:158}, D{l:7,t:11,i:43}, D{l:7,t:11,i:129}, D{l:7,t:11,i:181}, D{l:8,t:11,i:276}, D{l:8,t:11,i:377}, D{l:10,t:11,i:523}, D{l:11,t:11,i:816}, D{l:12,t:11,i:455}, D{l:13,t:11,i:303}, D{l:142,t:11,i:135}, D{l:133,t:10,i:812}, D{l:134,t:0,i:658}, D{l:4,t:11,i:1}, D{l:7,t:11,i:1143}, D{l:7,t:11,i:1463}, D{l:8,t:11,i:61}, D{l:9,t:11,i:207}, D{l:9,t:11,i:390}, D{l:9,t:11,i:467}, D{l:139,t:11,i:836}, D{l:150,t:11,i:26}, D{l:140,t:0,i:106}, D{l:6,t:0,i:1827}, D{l:10,t:0,i:931}, D{l:18,t:0,i:166}, D{l:20,t:0,i:114}, D{l:4,t:10,i:137}, D{l:7,t:10,i:1178}, D{l:7,t:11,i:1319}, D{l:135,t:10,i:1520}, D{l:133,t:0,i:1010}, D{l:4,t:11,i:723}, D{l:5,t:11,i:895}, D{l:7,t:11,i:1031}, D{l:8,t:11,i:199}, D{l:8,t:11,i:340}, D{l:9,t:11,i:153}, D{l:9,t:11,i:215}, D{l:10,t:11,i:21}, D{l:10,t:11,i:59}, D{l:10,t:11,i:80}, D{l:10,t:11,i:224}, D{l:11,t:11,i:229}, D{l:11,t:11,i:652}, D{l:12,t:11,i:192}, D{l:13,t:11,i:146}, D{l:142,t:11,i:91}, D{l:132,t:11,i:295}, D{l:6,t:11,i:619}, D{l:7,t:11,i:898}, D{l:7,t:11,i:1092}, D{l:8,t:11,i:485}, D{l:18,t:11,i:28}, D{l:147,t:11,i:116}, D{l:137,t:11,i:51}, D{l:6,t:10,i:1661}, D{l:7,t:10,i:1975}, D{l:7,t:10,i:2009}, D{l:135,t:10,i:2011}, D{l:5,t:11,i:309}, D{l:140,t:11,i:211}, D{l:5,t:0,i:87}, D{l:7,t:0,i:313}, D{l:7,t:0,i:1103}, D{l:10,t:0,i:208}, D{l:10,t:0,i:582}, D{l:11,t:0,i:389}, D{l:11,t:0,i:813}, D{l:12,t:0,i:385}, D{l:13,t:0,i:286}, D{l:14,t:0,i:124}, D{l:146,t:0,i:108}, D{l:5,t:11,i:125}, D{l:8,t:11,i:77}, D{l:138,t:11,i:15}, D{l:132,t:0,i:267}, D{l:133,t:0,i:703}, D{l:137,t:11,i:155}, D{l:133,t:11,i:439}, D{l:11,t:11,i:164}, D{l:140,t:11,i:76}, D{l:9,t:0,i:496}, D{l:5,t:10,i:89}, D{l:7,t:10,i:1915}, D{l:9,t:10,i:185}, D{l:9,t:10,i:235}, D{l:10,t:10,i:64}, D{l:10,t:10,i:270}, D{l:10,t:10,i:403}, D{l:10,t:10,i:469}, D{l:10,t:10,i:529}, D{l:10,t:10,i:590}, D{l:11,t:10,i:140}, D{l:11,t:10,i:860}, D{l:13,t:10,i:1}, D{l:13,t:10,i:422}, D{l:14,t:10,i:341}, D{l:14,t:10,i:364}, D{l:17,t:10,i:93}, D{l:18,t:10,i:113}, D{l:19,t:10,i:97}, D{l:147,t:10,i:113}, D{l:133,t:10,i:695}, D{l:135,t:0,i:1121}, D{l:5,t:10,i:6}, D{l:6,t:10,i:183}, D{l:7,t:10,i:680}, D{l:7,t:10,i:978}, D{l:7,t:10,i:1013}, D{l:7,t:10,i:1055}, D{l:12,t:10,i:230}, D{l:13,t:10,i:172}, D{l:146,t:10,i:29}, D{l:4,t:11,i:8}, D{l:7,t:11,i:1152}, D{l:7,t:11,i:1153}, D{l:7,t:11,i:1715}, D{l:9,t:11,i:374}, D{l:10,t:11,i:478}, D{l:139,t:11,i:648}, D{l:135,t:11,i:1099}, D{l:6,t:10,i:29}, D{l:139,t:10,i:63}, D{l:4,t:0,i:561}, D{l:10,t:0,i:249}, D{l:139,t:0,i:209}, D{l:132,t:0,i:760}, D{l:7,t:11,i:799}, D{l:138,t:11,i:511}, D{l:136,t:11,i:87}, D{l:9,t:0,i:154}, D{l:140,t:0,i:485}, D{l:136,t:0,i:255}, D{l:132,t:0,i:323}, D{l:140,t:0,i:419}, D{l:132,t:10,i:311}, D{l:134,t:10,i:1740}, D{l:4,t:0,i:368}, D{l:135,t:0,i:641}, D{l:7,t:10,i:170}, D{l:8,t:10,i:90}, D{l:8,t:10,i:177}, D{l:8,t:10,i:415}, D{l:11,t:10,i:714}, D{l:142,t:10,i:281}, D{l:4,t:11,i:69}, D{l:5,t:11,i:122}, D{l:9,t:11,i:656}, D{l:138,t:11,i:464}, D{l:5,t:11,i:849}, D{l:134,t:11,i:1633}, D{l:8,t:0,i:522}, D{l:142,t:0,i:328}, D{l:11,t:10,i:91}, D{l:13,t:10,i:129}, D{l:15,t:10,i:101}, D{l:145,t:10,i:125}, D{l:7,t:0,i:562}, D{l:8,t:0,i:551}, D{l:4,t:10,i:494}, D{l:6,t:10,i:74}, D{l:7,t:10,i:44}, D{l:11,t:11,i:499}, D{l:12,t:10,i:17}, D{l:15,t:10,i:5}, D{l:148,t:10,i:11}, D{l:4,t:10,i:276}, D{l:133,t:10,i:296}, D{l:9,t:0,i:92}, D{l:147,t:0,i:91}, D{l:4,t:10,i:7}, D{l:5,t:10,i:90}, D{l:5,t:10,i:158}, D{l:6,t:10,i:542}, D{l:7,t:10,i:221}, D{l:7,t:10,i:1574}, D{l:9,t:10,i:490}, D{l:10,t:10,i:540}, D{l:11,t:10,i:443}, D{l:139,t:10,i:757}, D{l:6,t:0,i:525}, D{l:6,t:0,i:1976}, D{l:8,t:0,i:806}, D{l:9,t:0,i:876}, D{l:140,t:0,i:284}, D{l:5,t:11,i:859}, D{l:7,t:10,i:588}, D{l:7,t:11,i:1160}, D{l:8,t:11,i:107}, D{l:9,t:10,i:175}, D{l:9,t:11,i:291}, D{l:9,t:11,i:439}, D{l:10,t:10,i:530}, D{l:10,t:11,i:663}, D{l:11,t:11,i:609}, D{l:140,t:11,i:197}, D{l:7,t:11,i:168}, D{l:13,t:11,i:196}, D{l:141,t:11,i:237}, D{l:139,t:0,i:958}, D{l:133,t:0,i:594}, D{l:135,t:10,i:580}, D{l:7,t:10,i:88}, D{l:136,t:10,i:627}, D{l:6,t:0,i:479}, D{l:6,t:0,i:562}, D{l:7,t:0,i:1060}, D{l:13,t:0,i:6}, D{l:5,t:10,i:872}, D{l:6,t:10,i:57}, D{l:7,t:10,i:471}, D{l:9,t:10,i:447}, D{l:137,t:10,i:454}, D{l:136,t:11,i:413}, D{l:145,t:11,i:19}, D{l:4,t:11,i:117}, D{l:6,t:11,i:372}, D{l:7,t:11,i:1905}, D{l:142,t:11,i:323}, D{l:4,t:11,i:722}, D{l:139,t:11,i:471}, D{l:17,t:0,i:61}, D{l:5,t:10,i:31}, D{l:134,t:10,i:614}, D{l:8,t:10,i:330}, D{l:140,t:10,i:477}, D{l:7,t:10,i:1200}, D{l:138,t:10,i:460}, D{l:6,t:10,i:424}, D{l:135,t:10,i:1866}, D{l:6,t:0,i:1641}, D{l:136,t:0,i:820}, D{l:6,t:0,i:1556}, D{l:134,t:0,i:1618}, D{l:9,t:11,i:5}, D{l:12,t:11,i:216}, D{l:12,t:11,i:294}, D{l:12,t:11,i:298}, D{l:12,t:11,i:400}, D{l:12,t:11,i:518}, D{l:13,t:11,i:229}, D{l:143,t:11,i:139}, D{l:15,t:11,i:155}, D{l:144,t:11,i:79}, D{l:4,t:0,i:302}, D{l:135,t:0,i:1766}, D{l:5,t:10,i:13}, D{l:134,t:10,i:142}, D{l:6,t:0,i:148}, D{l:7,t:0,i:1313}, D{l:7,t:10,i:116}, D{l:8,t:10,i:322}, D{l:8,t:10,i:755}, D{l:9,t:10,i:548}, D{l:10,t:10,i:714}, D{l:11,t:10,i:884}, D{l:141,t:10,i:324}, D{l:137,t:0,i:676}, D{l:9,t:11,i:88}, D{l:139,t:11,i:270}, D{l:5,t:11,i:12}, D{l:7,t:11,i:375}, D{l:137,t:11,i:438}, D{l:134,t:0,i:1674}, D{l:7,t:10,i:1472}, D{l:135,t:10,i:1554}, D{l:11,t:0,i:178}, D{l:7,t:10,i:1071}, D{l:7,t:10,i:1541}, D{l:7,t:10,i:1767}, D{l:7,t:10,i:1806}, D{l:11,t:10,i:162}, D{l:11,t:10,i:242}, D{l:12,t:10,i:605}, D{l:15,t:10,i:26}, D{l:144,t:10,i:44}, D{l:6,t:0,i:389}, D{l:7,t:0,i:149}, D{l:9,t:0,i:142}, D{l:138,t:0,i:94}, D{l:140,t:11,i:71}, D{l:145,t:10,i:115}, D{l:6,t:0,i:8}, D{l:7,t:0,i:1881}, D{l:8,t:0,i:91}, D{l:11,t:11,i:966}, D{l:12,t:11,i:287}, D{l:13,t:11,i:342}, D{l:13,t:11,i:402}, D{l:15,t:11,i:110}, D{l:143,t:11,i:163}, D{l:4,t:11,i:258}, D{l:136,t:11,i:639}, D{l:6,t:11,i:22}, D{l:7,t:11,i:903}, D{l:138,t:11,i:577}, D{l:133,t:11,i:681}, D{l:135,t:10,i:1111}, D{l:135,t:11,i:1286}, D{l:9,t:0,i:112}, D{l:8,t:10,i:1}, D{l:138,t:10,i:326}, D{l:5,t:10,i:488}, D{l:6,t:10,i:527}, D{l:7,t:10,i:489}, D{l:7,t:10,i:1636}, D{l:8,t:10,i:121}, D{l:8,t:10,i:144}, D{l:8,t:10,i:359}, D{l:9,t:10,i:193}, D{l:9,t:10,i:241}, D{l:9,t:10,i:336}, D{l:9,t:10,i:882}, D{l:11,t:10,i:266}, D{l:11,t:10,i:372}, D{l:11,t:10,i:944}, D{l:12,t:10,i:401}, D{l:140,t:10,i:641}, D{l:4,t:11,i:664}, D{l:133,t:11,i:804}, D{l:6,t:0,i:747}, D{l:134,t:0,i:1015}, D{l:135,t:0,i:1746}, D{l:9,t:10,i:31}, D{l:10,t:10,i:244}, D{l:10,t:10,i:699}, D{l:12,t:10,i:149}, D{l:141,t:10,i:497}, D{l:133,t:10,i:377}, D{l:135,t:0,i:24}, D{l:6,t:0,i:1352}, D{l:5,t:11,i:32}, D{l:145,t:10,i:101}, D{l:7,t:0,i:1530}, D{l:10,t:0,i:158}, D{l:13,t:0,i:13}, D{l:13,t:0,i:137}, D{l:13,t:0,i:258}, D{l:14,t:0,i:111}, D{l:14,t:0,i:225}, D{l:14,t:0,i:253}, D{l:14,t:0,i:304}, D{l:14,t:0,i:339}, D{l:14,t:0,i:417}, D{l:146,t:0,i:33}, D{l:4,t:0,i:503}, D{l:135,t:0,i:1661}, D{l:5,t:0,i:130}, D{l:6,t:0,i:845}, D{l:7,t:0,i:1314}, D{l:9,t:0,i:610}, D{l:10,t:0,i:718}, D{l:11,t:0,i:601}, D{l:11,t:0,i:819}, D{l:11,t:0,i:946}, D{l:140,t:0,i:536}, D{l:10,t:0,i:149}, D{l:11,t:0,i:280}, D{l:142,t:0,i:336}, D{l:134,t:0,i:1401}, D{l:135,t:0,i:1946}, D{l:8,t:0,i:663}, D{l:144,t:0,i:8}, D{l:134,t:0,i:1607}, D{l:135,t:10,i:2023}, D{l:4,t:11,i:289}, D{l:7,t:11,i:629}, D{l:7,t:11,i:1698}, D{l:7,t:11,i:1711}, D{l:140,t:11,i:215}, D{l:6,t:11,i:450}, D{l:136,t:11,i:109}, D{l:10,t:0,i:882}, D{l:10,t:0,i:883}, D{l:10,t:0,i:914}, D{l:138,t:0,i:928}, D{l:133,t:10,i:843}, D{l:136,t:11,i:705}, D{l:132,t:10,i:554}, D{l:133,t:10,i:536}, D{l:5,t:0,i:417}, D{l:9,t:10,i:79}, D{l:11,t:10,i:625}, D{l:145,t:10,i:7}, D{l:7,t:11,i:1238}, D{l:142,t:11,i:37}, D{l:4,t:0,i:392}, D{l:135,t:0,i:1597}, D{l:5,t:0,i:433}, D{l:9,t:0,i:633}, D{l:11,t:0,i:629}, D{l:132,t:10,i:424}, D{l:7,t:10,i:336}, D{l:136,t:10,i:785}, D{l:134,t:11,i:355}, D{l:6,t:0,i:234}, D{l:7,t:0,i:769}, D{l:9,t:0,i:18}, D{l:138,t:0,i:358}, D{l:4,t:10,i:896}, D{l:134,t:10,i:1777}, D{l:138,t:11,i:323}, D{l:7,t:0,i:140}, D{l:7,t:0,i:1950}, D{l:8,t:0,i:680}, D{l:11,t:0,i:817}, D{l:147,t:0,i:88}, D{l:7,t:0,i:1222}, D{l:138,t:0,i:386}, D{l:139,t:11,i:908}, D{l:11,t:0,i:249}, D{l:12,t:0,i:313}, D{l:16,t:0,i:66}, D{l:145,t:0,i:26}, D{l:134,t:0,i:5}, D{l:7,t:10,i:750}, D{l:9,t:10,i:223}, D{l:11,t:10,i:27}, D{l:11,t:10,i:466}, D{l:12,t:10,i:624}, D{l:14,t:10,i:265}, D{l:146,t:10,i:61}, D{l:134,t:11,i:26}, D{l:134,t:0,i:1216}, D{l:5,t:0,i:963}, D{l:134,t:0,i:1773}, D{l:4,t:11,i:414}, D{l:5,t:11,i:467}, D{l:9,t:11,i:654}, D{l:10,t:11,i:451}, D{l:12,t:11,i:59}, D{l:141,t:11,i:375}, D{l:135,t:11,i:17}, D{l:4,t:10,i:603}, D{l:133,t:10,i:661}, D{l:4,t:10,i:11}, D{l:6,t:10,i:128}, D{l:7,t:10,i:231}, D{l:7,t:10,i:1533}, D{l:138,t:10,i:725}, D{l:135,t:11,i:955}, D{l:7,t:0,i:180}, D{l:8,t:0,i:509}, D{l:136,t:0,i:792}, D{l:132,t:10,i:476}, D{l:132,t:0,i:1002}, D{l:133,t:11,i:538}, D{l:135,t:10,i:1807}, D{l:132,t:0,i:931}, D{l:7,t:0,i:943}, D{l:11,t:0,i:614}, D{l:140,t:0,i:747}, D{l:135,t:0,i:1837}, D{l:9,t:10,i:20}, D{l:10,t:10,i:324}, D{l:10,t:10,i:807}, D{l:139,t:10,i:488}, D{l:134,t:0,i:641}, D{l:6,t:11,i:280}, D{l:10,t:11,i:502}, D{l:11,t:11,i:344}, D{l:140,t:11,i:38}, D{l:5,t:11,i:45}, D{l:7,t:11,i:1161}, D{l:11,t:11,i:448}, D{l:11,t:11,i:880}, D{l:13,t:11,i:139}, D{l:13,t:11,i:407}, D{l:15,t:11,i:16}, D{l:17,t:11,i:95}, D{l:18,t:11,i:66}, D{l:18,t:11,i:88}, D{l:18,t:11,i:123}, D{l:149,t:11,i:7}, D{l:9,t:0,i:280}, D{l:138,t:0,i:134}, D{l:22,t:0,i:22}, D{l:23,t:0,i:5}, D{l:151,t:0,i:29}, D{l:136,t:11,i:777}, D{l:4,t:0,i:90}, D{l:5,t:0,i:545}, D{l:7,t:0,i:754}, D{l:9,t:0,i:186}, D{l:10,t:0,i:72}, D{l:10,t:0,i:782}, D{l:11,t:0,i:577}, D{l:11,t:0,i:610}, D{l:11,t:0,i:960}, D{l:12,t:0,i:354}, D{l:12,t:0,i:362}, D{l:12,t:0,i:595}, D{l:4,t:11,i:410}, D{l:135,t:11,i:521}, D{l:135,t:11,i:1778}, D{l:5,t:10,i:112}, D{l:6,t:10,i:103}, D{l:134,t:10,i:150}, D{l:138,t:10,i:356}, D{l:132,t:0,i:742}, D{l:7,t:0,i:151}, D{l:9,t:0,i:329}, D{l:139,t:0,i:254}, D{l:8,t:0,i:853}, D{l:8,t:0,i:881}, D{l:8,t:0,i:911}, D{l:8,t:0,i:912}, D{l:10,t:0,i:872}, D{l:12,t:0,i:741}, D{l:12,t:0,i:742}, D{l:152,t:0,i:18}, D{l:4,t:11,i:573}, D{l:136,t:11,i:655}, D{l:6,t:0,i:921}, D{l:134,t:0,i:934}, D{l:9,t:0,i:187}, D{l:10,t:0,i:36}, D{l:11,t:0,i:1016}, D{l:17,t:0,i:44}, D{l:146,t:0,i:64}, D{l:7,t:0,i:833}, D{l:136,t:0,i:517}, D{l:4,t:0,i:506}, D{l:5,t:0,i:295}, D{l:135,t:0,i:1680}, D{l:4,t:10,i:708}, D{l:8,t:10,i:15}, D{l:9,t:10,i:50}, D{l:9,t:10,i:386}, D{l:11,t:10,i:18}, D{l:11,t:10,i:529}, D{l:140,t:10,i:228}, D{l:7,t:0,i:251}, D{l:7,t:0,i:1701}, D{l:8,t:0,i:436}, D{l:4,t:10,i:563}, D{l:7,t:10,i:592}, D{l:7,t:10,i:637}, D{l:7,t:10,i:770}, D{l:8,t:10,i:463}, D{l:9,t:10,i:60}, D{l:9,t:10,i:335}, D{l:9,t:10,i:904}, D{l:10,t:10,i:73}, D{l:11,t:10,i:434}, D{l:12,t:10,i:585}, D{l:13,t:10,i:331}, D{l:18,t:10,i:110}, D{l:148,t:10,i:60}, D{l:132,t:10,i:502}, D{l:136,t:0,i:584}, D{l:6,t:10,i:347}, D{l:138,t:10,i:161}, D{l:7,t:0,i:987}, D{l:9,t:0,i:688}, D{l:10,t:0,i:522}, D{l:11,t:0,i:788}, D{l:12,t:0,i:137}, D{l:12,t:0,i:566}, D{l:14,t:0,i:9}, D{l:14,t:0,i:24}, D{l:14,t:0,i:64}, D{l:7,t:11,i:899}, D{l:142,t:11,i:325}, D{l:4,t:0,i:214}, D{l:5,t:0,i:500}, D{l:5,t:10,i:102}, D{l:6,t:10,i:284}, D{l:7,t:10,i:1079}, D{l:7,t:10,i:1423}, D{l:7,t:10,i:1702}, D{l:8,t:10,i:470}, D{l:9,t:10,i:554}, D{l:9,t:10,i:723}, D{l:139,t:10,i:333}, D{l:7,t:10,i:246}, D{l:135,t:10,i:840}, D{l:6,t:10,i:10}, D{l:8,t:10,i:571}, D{l:9,t:10,i:739}, D{l:143,t:10,i:91}, D{l:133,t:10,i:626}, D{l:146,t:0,i:195}, D{l:134,t:0,i:1775}, D{l:7,t:0,i:389}, D{l:7,t:0,i:700}, D{l:7,t:0,i:940}, D{l:8,t:0,i:514}, D{l:9,t:0,i:116}, D{l:9,t:0,i:535}, D{l:10,t:0,i:118}, D{l:11,t:0,i:107}, D{l:11,t:0,i:148}, D{l:11,t:0,i:922}, D{l:12,t:0,i:254}, D{l:12,t:0,i:421}, D{l:142,t:0,i:238}, D{l:5,t:10,i:18}, D{l:6,t:10,i:526}, D{l:13,t:10,i:24}, D{l:13,t:10,i:110}, D{l:19,t:10,i:5}, D{l:147,t:10,i:44}, D{l:132,t:0,i:743}, D{l:11,t:0,i:292}, D{l:4,t:10,i:309}, D{l:5,t:10,i:462}, D{l:7,t:10,i:970}, D{l:135,t:10,i:1097}, D{l:22,t:10,i:30}, D{l:150,t:10,i:33}, D{l:139,t:11,i:338}, D{l:135,t:11,i:1598}, D{l:7,t:0,i:1283}, D{l:9,t:0,i:227}, D{l:11,t:0,i:325}, D{l:11,t:0,i:408}, D{l:14,t:0,i:180}, D{l:146,t:0,i:47}, D{l:4,t:0,i:953}, D{l:6,t:0,i:1805}, D{l:6,t:0,i:1814}, D{l:6,t:0,i:1862}, D{l:140,t:0,i:774}, D{l:6,t:11,i:611}, D{l:135,t:11,i:1733}, D{l:135,t:11,i:1464}, D{l:5,t:0,i:81}, D{l:7,t:0,i:146}, D{l:7,t:0,i:1342}, D{l:8,t:0,i:53}, D{l:8,t:0,i:561}, D{l:8,t:0,i:694}, D{l:8,t:0,i:754}, D{l:9,t:0,i:115}, D{l:9,t:0,i:179}, D{l:9,t:0,i:894}, D{l:10,t:0,i:462}, D{l:10,t:0,i:813}, D{l:11,t:0,i:230}, D{l:11,t:0,i:657}, D{l:11,t:0,i:699}, D{l:11,t:0,i:748}, D{l:12,t:0,i:119}, D{l:12,t:0,i:200}, D{l:12,t:0,i:283}, D{l:142,t:0,i:273}, D{l:5,t:0,i:408}, D{l:6,t:0,i:789}, D{l:6,t:0,i:877}, D{l:6,t:0,i:1253}, D{l:6,t:0,i:1413}, D{l:137,t:0,i:747}, D{l:134,t:10,i:1704}, D{l:135,t:11,i:663}, D{l:6,t:0,i:1910}, D{l:6,t:0,i:1915}, D{l:6,t:0,i:1923}, D{l:9,t:0,i:913}, D{l:9,t:0,i:928}, D{l:9,t:0,i:950}, D{l:9,t:0,i:954}, D{l:9,t:0,i:978}, D{l:9,t:0,i:993}, D{l:12,t:0,i:812}, D{l:12,t:0,i:819}, D{l:12,t:0,i:831}, D{l:12,t:0,i:833}, D{l:12,t:0,i:838}, D{l:12,t:0,i:909}, D{l:12,t:0,i:928}, D{l:12,t:0,i:931}, D{l:12,t:0,i:950}, D{l:15,t:0,i:186}, D{l:15,t:0,i:187}, D{l:15,t:0,i:195}, D{l:15,t:0,i:196}, D{l:15,t:0,i:209}, D{l:15,t:0,i:215}, D{l:15,t:0,i:236}, D{l:15,t:0,i:241}, D{l:15,t:0,i:249}, D{l:15,t:0,i:253}, D{l:18,t:0,i:180}, D{l:18,t:0,i:221}, D{l:18,t:0,i:224}, D{l:18,t:0,i:227}, D{l:18,t:0,i:229}, D{l:149,t:0,i:60}, D{l:7,t:0,i:1826}, D{l:135,t:0,i:1938}, D{l:11,t:0,i:490}, D{l:18,t:0,i:143}, D{l:5,t:10,i:86}, D{l:7,t:10,i:743}, D{l:9,t:10,i:85}, D{l:10,t:10,i:281}, D{l:10,t:10,i:432}, D{l:12,t:10,i:251}, D{l:13,t:10,i:118}, D{l:142,t:10,i:378}, D{l:5,t:10,i:524}, D{l:133,t:10,i:744}, D{l:141,t:11,i:442}, D{l:10,t:10,i:107}, D{l:140,t:10,i:436}, D{l:135,t:11,i:503}, D{l:134,t:0,i:1162}, D{l:132,t:10,i:927}, D{l:7,t:0,i:30}, D{l:8,t:0,i:86}, D{l:8,t:0,i:315}, D{l:8,t:0,i:700}, D{l:9,t:0,i:576}, D{l:9,t:0,i:858}, D{l:10,t:0,i:414}, D{l:11,t:0,i:310}, D{l:11,t:0,i:888}, D{l:11,t:0,i:904}, D{l:12,t:0,i:361}, D{l:13,t:0,i:248}, D{l:13,t:0,i:371}, D{l:14,t:0,i:142}, D{l:12,t:10,i:670}, D{l:146,t:10,i:94}, D{l:134,t:0,i:721}, D{l:4,t:11,i:113}, D{l:5,t:11,i:163}, D{l:5,t:11,i:735}, D{l:7,t:11,i:1009}, D{l:7,t:10,i:1149}, D{l:9,t:11,i:9}, D{l:9,t:10,i:156}, D{l:9,t:11,i:771}, D{l:12,t:11,i:90}, D{l:13,t:11,i:138}, D{l:13,t:11,i:410}, D{l:143,t:11,i:128}, D{l:138,t:0,i:839}, D{l:133,t:10,i:778}, D{l:137,t:0,i:617}, D{l:133,t:10,i:502}, D{l:8,t:10,i:196}, D{l:10,t:10,i:283}, D{l:139,t:10,i:406}, D{l:6,t:0,i:428}, D{l:7,t:0,i:524}, D{l:8,t:0,i:169}, D{l:8,t:0,i:234}, D{l:9,t:0,i:480}, D{l:138,t:0,i:646}, D{l:133,t:10,i:855}, D{l:134,t:0,i:1648}, D{l:7,t:0,i:1205}, D{l:138,t:0,i:637}, D{l:7,t:0,i:1596}, D{l:4,t:11,i:935}, D{l:133,t:11,i:823}, D{l:5,t:11,i:269}, D{l:7,t:11,i:434}, D{l:7,t:11,i:891}, D{l:8,t:11,i:339}, D{l:9,t:11,i:702}, D{l:11,t:11,i:594}, D{l:11,t:11,i:718}, D{l:145,t:11,i:100}, D{l:7,t:11,i:878}, D{l:9,t:11,i:485}, D{l:141,t:11,i:264}, D{l:4,t:0,i:266}, D{l:8,t:0,i:4}, D{l:9,t:0,i:39}, D{l:10,t:0,i:166}, D{l:11,t:0,i:918}, D{l:12,t:0,i:635}, D{l:20,t:0,i:10}, D{l:22,t:0,i:27}, D{l:22,t:0,i:43}, D{l:22,t:0,i:52}, D{l:134,t:11,i:1713}, D{l:7,t:10,i:1400}, D{l:9,t:10,i:446}, D{l:138,t:10,i:45}, D{l:135,t:11,i:900}, D{l:132,t:0,i:862}, D{l:134,t:0,i:1554}, D{l:135,t:11,i:1033}, D{l:19,t:0,i:16}, D{l:147,t:11,i:16}, D{l:135,t:11,i:1208}, D{l:7,t:0,i:157}, D{l:136,t:0,i:279}, D{l:6,t:0,i:604}, D{l:136,t:0,i:391}, D{l:13,t:10,i:455}, D{l:15,t:10,i:99}, D{l:15,t:10,i:129}, D{l:144,t:10,i:68}, D{l:135,t:10,i:172}, D{l:7,t:0,i:945}, D{l:11,t:0,i:713}, D{l:139,t:0,i:744}, D{l:4,t:0,i:973}, D{l:10,t:0,i:877}, D{l:10,t:0,i:937}, D{l:10,t:0,i:938}, D{l:140,t:0,i:711}, D{l:139,t:0,i:1022}, D{l:132,t:10,i:568}, D{l:142,t:11,i:143}, D{l:4,t:0,i:567}, D{l:9,t:0,i:859}, D{l:132,t:10,i:732}, D{l:7,t:0,i:1846}, D{l:136,t:0,i:628}, D{l:136,t:10,i:733}, D{l:133,t:0,i:762}, D{l:4,t:10,i:428}, D{l:135,t:10,i:1789}, D{l:10,t:0,i:784}, D{l:13,t:0,i:191}, D{l:7,t:10,i:2015}, D{l:140,t:10,i:665}, D{l:133,t:0,i:298}, D{l:7,t:0,i:633}, D{l:7,t:0,i:905}, D{l:7,t:0,i:909}, D{l:7,t:0,i:1538}, D{l:9,t:0,i:767}, D{l:140,t:0,i:636}, D{l:138,t:10,i:806}, D{l:132,t:0,i:795}, D{l:139,t:0,i:301}, D{l:135,t:0,i:1970}, D{l:5,t:11,i:625}, D{l:135,t:11,i:1617}, D{l:135,t:11,i:275}, D{l:7,t:11,i:37}, D{l:8,t:11,i:425}, D{l:8,t:11,i:693}, D{l:9,t:11,i:720}, D{l:10,t:11,i:380}, D{l:10,t:11,i:638}, D{l:11,t:11,i:273}, D{l:11,t:11,i:307}, D{l:11,t:11,i:473}, D{l:12,t:11,i:61}, D{l:143,t:11,i:43}, D{l:135,t:11,i:198}, D{l:134,t:0,i:1236}, D{l:7,t:0,i:369}, D{l:12,t:0,i:644}, D{l:12,t:0,i:645}, D{l:144,t:0,i:90}, D{l:19,t:0,i:15}, D{l:149,t:0,i:27}, D{l:6,t:0,i:71}, D{l:7,t:0,i:845}, D{l:8,t:0,i:160}, D{l:9,t:0,i:318}, D{l:6,t:10,i:1623}, D{l:134,t:10,i:1681}, D{l:134,t:0,i:1447}, D{l:134,t:0,i:1255}, D{l:138,t:0,i:735}, D{l:8,t:0,i:76}, D{l:132,t:11,i:168}, D{l:6,t:10,i:1748}, D{l:8,t:10,i:715}, D{l:9,t:10,i:802}, D{l:10,t:10,i:46}, D{l:10,t:10,i:819}, D{l:13,t:10,i:308}, D{l:14,t:10,i:351}, D{l:14,t:10,i:363}, D{l:146,t:10,i:67}, D{l:135,t:11,i:91}, D{l:6,t:0,i:474}, D{l:4,t:10,i:63}, D{l:133,t:10,i:347}, D{l:133,t:10,i:749}, D{l:138,t:0,i:841}, D{l:133,t:10,i:366}, D{l:6,t:0,i:836}, D{l:132,t:11,i:225}, D{l:135,t:0,i:1622}, D{l:135,t:10,i:89}, D{l:140,t:0,i:735}, D{l:134,t:0,i:1601}, D{l:138,t:11,i:145}, D{l:6,t:0,i:1390}, D{l:137,t:0,i:804}, D{l:142,t:0,i:394}, D{l:6,t:11,i:15}, D{l:7,t:11,i:70}, D{l:10,t:11,i:240}, D{l:147,t:11,i:93}, D{l:6,t:0,i:96}, D{l:135,t:0,i:1426}, D{l:4,t:0,i:651}, D{l:133,t:0,i:289}, D{l:7,t:11,i:956}, D{l:7,t:10,i:977}, D{l:7,t:11,i:1157}, D{l:7,t:11,i:1506}, D{l:7,t:11,i:1606}, D{l:7,t:11,i:1615}, D{l:7,t:11,i:1619}, D{l:7,t:11,i:1736}, D{l:7,t:11,i:1775}, D{l:8,t:11,i:590}, D{l:9,t:11,i:324}, D{l:9,t:11,i:736}, D{l:9,t:11,i:774}, D{l:9,t:11,i:776}, D{l:9,t:11,i:784}, D{l:10,t:11,i:567}, D{l:10,t:11,i:708}, D{l:11,t:11,i:518}, D{l:11,t:11,i:613}, D{l:11,t:11,i:695}, D{l:11,t:11,i:716}, D{l:11,t:11,i:739}, D{l:11,t:11,i:770}, D{l:11,t:11,i:771}, D{l:11,t:11,i:848}, D{l:11,t:11,i:857}, D{l:11,t:11,i:931}, D{l:11,t:11,i:947}, D{l:12,t:11,i:326}, D{l:12,t:11,i:387}, D{l:12,t:11,i:484}, D{l:12,t:11,i:528}, D{l:12,t:11,i:552}, D{l:12,t:11,i:613}, D{l:13,t:11,i:189}, D{l:13,t:11,i:256}, D{l:13,t:11,i:340}, D{l:13,t:11,i:432}, D{l:13,t:11,i:436}, D{l:13,t:11,i:440}, D{l:13,t:11,i:454}, D{l:14,t:11,i:174}, D{l:14,t:11,i:220}, D{l:14,t:11,i:284}, D{l:14,t:11,i:390}, D{l:145,t:11,i:121}, D{l:7,t:0,i:688}, D{l:8,t:0,i:35}, D{l:9,t:0,i:511}, D{l:10,t:0,i:767}, D{l:147,t:0,i:118}, D{l:134,t:0,i:667}, D{l:4,t:0,i:513}, D{l:5,t:10,i:824}, D{l:133,t:10,i:941}, D{l:7,t:10,i:440}, D{l:8,t:10,i:230}, D{l:139,t:10,i:106}, D{l:134,t:0,i:2034}, D{l:135,t:11,i:1399}, D{l:143,t:11,i:66}, D{l:135,t:11,i:1529}, D{l:4,t:11,i:145}, D{l:6,t:11,i:176}, D{l:7,t:11,i:395}, D{l:9,t:11,i:562}, D{l:144,t:11,i:28}, D{l:132,t:11,i:501}, D{l:132,t:0,i:704}, D{l:134,t:0,i:1524}, D{l:7,t:0,i:1078}, D{l:134,t:11,i:464}, D{l:6,t:11,i:509}, D{l:10,t:11,i:82}, D{l:20,t:11,i:91}, D{l:151,t:11,i:13}, D{l:4,t:0,i:720}, D{l:133,t:0,i:306}, D{l:133,t:0,i:431}, D{l:7,t:0,i:1196}, D{l:4,t:10,i:914}, D{l:5,t:10,i:800}, D{l:133,t:10,i:852}, D{l:135,t:11,i:1189}, D{l:10,t:0,i:54}, D{l:141,t:10,i:115}, D{l:7,t:10,i:564}, D{l:142,t:10,i:168}, D{l:5,t:0,i:464}, D{l:6,t:0,i:236}, D{l:7,t:0,i:696}, D{l:7,t:0,i:914}, D{l:7,t:0,i:1108}, D{l:7,t:0,i:1448}, D{l:9,t:0,i:15}, D{l:9,t:0,i:564}, D{l:10,t:0,i:14}, D{l:12,t:0,i:565}, D{l:13,t:0,i:449}, D{l:14,t:0,i:53}, D{l:15,t:0,i:13}, D{l:16,t:0,i:64}, D{l:17,t:0,i:41}, D{l:4,t:10,i:918}, D{l:133,t:10,i:876}, D{l:6,t:0,i:1418}, D{l:134,t:10,i:1764}, D{l:4,t:10,i:92}, D{l:133,t:10,i:274}, D{l:134,t:0,i:907}, D{l:4,t:11,i:114}, D{l:8,t:10,i:501}, D{l:9,t:11,i:492}, D{l:13,t:11,i:462}, D{l:142,t:11,i:215}, D{l:4,t:11,i:77}, D{l:5,t:11,i:361}, D{l:6,t:11,i:139}, D{l:6,t:11,i:401}, D{l:6,t:11,i:404}, D{l:7,t:11,i:413}, D{l:7,t:11,i:715}, D{l:7,t:11,i:1716}, D{l:11,t:11,i:279}, D{l:12,t:11,i:179}, D{l:12,t:11,i:258}, D{l:13,t:11,i:244}, D{l:142,t:11,i:358}, D{l:6,t:0,i:1767}, D{l:12,t:0,i:194}, D{l:145,t:0,i:107}, D{l:134,t:11,i:1717}, D{l:5,t:10,i:743}, D{l:142,t:11,i:329}, D{l:4,t:10,i:49}, D{l:7,t:10,i:280}, D{l:135,t:10,i:1633}, D{l:5,t:0,i:840}, D{l:7,t:11,i:1061}, D{l:8,t:11,i:82}, D{l:11,t:11,i:250}, D{l:12,t:11,i:420}, D{l:141,t:11,i:184}, D{l:135,t:11,i:724}, D{l:134,t:0,i:900}, D{l:136,t:10,i:47}, D{l:134,t:0,i:1436}, D{l:144,t:11,i:0}, D{l:6,t:0,i:675}, D{l:7,t:0,i:1008}, D{l:7,t:0,i:1560}, D{l:9,t:0,i:642}, D{l:11,t:0,i:236}, D{l:14,t:0,i:193}, D{l:5,t:10,i:272}, D{l:5,t:10,i:908}, D{l:5,t:10,i:942}, D{l:8,t:10,i:197}, D{l:9,t:10,i:47}, D{l:11,t:10,i:538}, D{l:139,t:10,i:742}, D{l:4,t:0,i:68}, D{l:5,t:0,i:628}, D{l:5,t:0,i:634}, D{l:6,t:0,i:386}, D{l:7,t:0,i:794}, D{l:8,t:0,i:273}, D{l:9,t:0,i:563}, D{l:10,t:0,i:105}, D{l:10,t:0,i:171}, D{l:11,t:0,i:94}, D{l:139,t:0,i:354}, D{l:135,t:10,i:1911}, D{l:137,t:10,i:891}, D{l:4,t:0,i:95}, D{l:6,t:0,i:1297}, D{l:6,t:0,i:1604}, D{l:7,t:0,i:416}, D{l:139,t:0,i:830}, D{l:6,t:11,i:513}, D{l:135,t:11,i:1052}, D{l:7,t:0,i:731}, D{l:13,t:0,i:20}, D{l:143,t:0,i:11}, D{l:137,t:11,i:899}, D{l:10,t:0,i:850}, D{l:140,t:0,i:697}, D{l:4,t:0,i:662}, D{l:7,t:11,i:1417}, D{l:12,t:11,i:382}, D{l:17,t:11,i:48}, D{l:152,t:11,i:12}, D{l:133,t:0,i:736}, D{l:132,t:0,i:861}, D{l:4,t:10,i:407}, D{l:132,t:10,i:560}, D{l:141,t:10,i:490}, D{l:6,t:11,i:545}, D{l:7,t:11,i:565}, D{l:7,t:11,i:1669}, D{l:10,t:11,i:114}, D{l:11,t:11,i:642}, D{l:140,t:11,i:618}, D{l:6,t:0,i:871}, D{l:134,t:0,i:1000}, D{l:5,t:0,i:864}, D{l:10,t:0,i:648}, D{l:11,t:0,i:671}, D{l:15,t:0,i:46}, D{l:133,t:11,i:5}, D{l:133,t:0,i:928}, D{l:11,t:0,i:90}, D{l:13,t:0,i:7}, D{l:4,t:10,i:475}, D{l:11,t:10,i:35}, D{l:13,t:10,i:71}, D{l:13,t:10,i:177}, D{l:142,t:10,i:422}, D{l:136,t:0,i:332}, D{l:135,t:11,i:192}, D{l:134,t:0,i:1055}, D{l:136,t:11,i:763}, D{l:11,t:0,i:986}, D{l:140,t:0,i:682}, D{l:7,t:0,i:76}, D{l:8,t:0,i:44}, D{l:9,t:0,i:884}, D{l:10,t:0,i:580}, D{l:11,t:0,i:399}, D{l:11,t:0,i:894}, D{l:143,t:0,i:122}, D{l:135,t:11,i:1237}, D{l:135,t:10,i:636}, D{l:11,t:0,i:300}, D{l:6,t:10,i:222}, D{l:7,t:10,i:1620}, D{l:8,t:10,i:409}, D{l:137,t:10,i:693}, D{l:4,t:11,i:87}, D{l:5,t:11,i:250}, D{l:10,t:11,i:601}, D{l:13,t:11,i:298}, D{l:13,t:11,i:353}, D{l:141,t:11,i:376}, D{l:5,t:0,i:518}, D{l:10,t:0,i:340}, D{l:11,t:0,i:175}, D{l:149,t:0,i:16}, D{l:140,t:0,i:771}, D{l:6,t:0,i:1108}, D{l:137,t:0,i:831}, D{l:132,t:0,i:836}, D{l:135,t:0,i:1852}, D{l:4,t:0,i:957}, D{l:6,t:0,i:1804}, D{l:8,t:0,i:842}, D{l:8,t:0,i:843}, D{l:8,t:0,i:851}, D{l:8,t:0,i:855}, D{l:140,t:0,i:767}, D{l:135,t:11,i:814}, D{l:4,t:11,i:57}, D{l:7,t:11,i:1195}, D{l:7,t:11,i:1438}, D{l:7,t:11,i:1548}, D{l:7,t:11,i:1835}, D{l:7,t:11,i:1904}, D{l:9,t:11,i:757}, D{l:10,t:11,i:604}, D{l:139,t:11,i:519}, D{l:133,t:10,i:882}, D{l:138,t:0,i:246}, D{l:4,t:0,i:934}, D{l:5,t:0,i:202}, D{l:8,t:0,i:610}, D{l:7,t:11,i:1897}, D{l:12,t:11,i:290}, D{l:13,t:11,i:80}, D{l:13,t:11,i:437}, D{l:145,t:11,i:74}, D{l:8,t:0,i:96}, D{l:9,t:0,i:36}, D{l:10,t:0,i:607}, D{l:10,t:0,i:804}, D{l:10,t:0,i:832}, D{l:11,t:0,i:423}, D{l:11,t:0,i:442}, D{l:12,t:0,i:309}, D{l:14,t:0,i:199}, D{l:15,t:0,i:90}, D{l:145,t:0,i:110}, D{l:132,t:10,i:426}, D{l:7,t:0,i:654}, D{l:8,t:0,i:240}, D{l:6,t:10,i:58}, D{l:7,t:10,i:745}, D{l:7,t:10,i:1969}, D{l:8,t:10,i:675}, D{l:9,t:10,i:479}, D{l:9,t:10,i:731}, D{l:10,t:10,i:330}, D{l:10,t:10,i:593}, D{l:10,t:10,i:817}, D{l:11,t:10,i:32}, D{l:11,t:10,i:133}, D{l:11,t:10,i:221}, D{l:145,t:10,i:68}, D{l:9,t:0,i:13}, D{l:9,t:0,i:398}, D{l:9,t:0,i:727}, D{l:10,t:0,i:75}, D{l:10,t:0,i:184}, D{l:10,t:0,i:230}, D{l:10,t:0,i:564}, D{l:10,t:0,i:569}, D{l:11,t:0,i:973}, D{l:12,t:0,i:70}, D{l:12,t:0,i:189}, D{l:13,t:0,i:57}, D{l:141,t:0,i:257}, D{l:4,t:11,i:209}, D{l:135,t:11,i:902}, D{l:7,t:0,i:391}, D{l:137,t:10,i:538}, D{l:134,t:0,i:403}, D{l:6,t:11,i:303}, D{l:7,t:11,i:335}, D{l:7,t:11,i:1437}, D{l:7,t:11,i:1668}, D{l:8,t:11,i:553}, D{l:8,t:11,i:652}, D{l:8,t:11,i:656}, D{l:9,t:11,i:558}, D{l:11,t:11,i:743}, D{l:149,t:11,i:18}, D{l:132,t:11,i:559}, D{l:11,t:0,i:75}, D{l:142,t:0,i:267}, D{l:6,t:0,i:815}, D{l:141,t:11,i:2}, D{l:141,t:0,i:366}, D{l:137,t:0,i:631}, D{l:133,t:11,i:1017}, D{l:5,t:0,i:345}, D{l:135,t:0,i:1016}, D{l:133,t:11,i:709}, D{l:134,t:11,i:1745}, D{l:133,t:10,i:566}, D{l:7,t:0,i:952}, D{l:6,t:10,i:48}, D{l:9,t:10,i:139}, D{l:10,t:10,i:399}, D{l:11,t:10,i:469}, D{l:12,t:10,i:634}, D{l:141,t:10,i:223}, D{l:133,t:0,i:673}, D{l:9,t:0,i:850}, D{l:7,t:11,i:8}, D{l:136,t:11,i:206}, D{l:6,t:0,i:662}, D{l:149,t:0,i:35}, D{l:4,t:0,i:287}, D{l:133,t:0,i:1018}, D{l:6,t:10,i:114}, D{l:7,t:10,i:1224}, D{l:7,t:10,i:1556}, D{l:136,t:10,i:3}, D{l:8,t:10,i:576}, D{l:137,t:10,i:267}, D{l:4,t:0,i:884}, D{l:5,t:0,i:34}, D{l:10,t:0,i:724}, D{l:12,t:0,i:444}, D{l:13,t:0,i:354}, D{l:18,t:0,i:32}, D{l:23,t:0,i:24}, D{l:23,t:0,i:31}, D{l:152,t:0,i:5}, D{l:133,t:10,i:933}, D{l:132,t:11,i:776}, D{l:138,t:0,i:151}, D{l:136,t:0,i:427}, D{l:134,t:0,i:382}, D{l:132,t:0,i:329}, D{l:9,t:0,i:846}, D{l:10,t:0,i:827}, D{l:138,t:11,i:33}, D{l:9,t:0,i:279}, D{l:10,t:0,i:407}, D{l:14,t:0,i:84}, D{l:22,t:0,i:18}, D{l:135,t:11,i:1297}, D{l:136,t:11,i:406}, D{l:132,t:0,i:906}, D{l:136,t:0,i:366}, D{l:134,t:0,i:843}, D{l:134,t:0,i:1443}, D{l:135,t:0,i:1372}, D{l:138,t:0,i:992}, D{l:4,t:0,i:123}, D{l:5,t:0,i:605}, D{l:7,t:0,i:1509}, D{l:136,t:0,i:36}, D{l:132,t:0,i:649}, D{l:8,t:11,i:175}, D{l:10,t:11,i:168}, D{l:138,t:11,i:573}, D{l:133,t:0,i:767}, D{l:134,t:0,i:1018}, D{l:135,t:11,i:1305}, D{l:12,t:10,i:30}, D{l:13,t:10,i:148}, D{l:14,t:10,i:87}, D{l:14,t:10,i:182}, D{l:16,t:10,i:42}, D{l:148,t:10,i:70}, D{l:134,t:11,i:607}, D{l:4,t:0,i:273}, D{l:5,t:0,i:658}, D{l:133,t:0,i:995}, D{l:6,t:0,i:72}, D{l:139,t:11,i:174}, D{l:10,t:0,i:483}, D{l:12,t:0,i:368}, D{l:7,t:10,i:56}, D{l:7,t:10,i:1989}, D{l:8,t:10,i:337}, D{l:8,t:10,i:738}, D{l:9,t:10,i:600}, D{l:13,t:10,i:447}, D{l:142,t:10,i:92}, D{l:5,t:11,i:784}, D{l:138,t:10,i:666}, D{l:135,t:0,i:1345}, D{l:139,t:11,i:882}, D{l:134,t:0,i:1293}, D{l:133,t:0,i:589}, D{l:134,t:0,i:1988}, D{l:5,t:0,i:117}, D{l:6,t:0,i:514}, D{l:6,t:0,i:541}, D{l:7,t:0,i:1164}, D{l:7,t:0,i:1436}, D{l:8,t:0,i:220}, D{l:8,t:0,i:648}, D{l:10,t:0,i:688}, D{l:139,t:0,i:560}, D{l:136,t:0,i:379}, D{l:5,t:0,i:686}, D{l:7,t:10,i:866}, D{l:135,t:10,i:1163}, D{l:132,t:10,i:328}, D{l:9,t:11,i:14}, D{l:9,t:11,i:441}, D{l:10,t:11,i:306}, D{l:139,t:11,i:9}, D{l:4,t:10,i:101}, D{l:135,t:10,i:1171}, D{l:5,t:10,i:833}, D{l:136,t:10,i:744}, D{l:5,t:11,i:161}, D{l:7,t:11,i:839}, D{l:135,t:11,i:887}, D{l:7,t:0,i:196}, D{l:10,t:0,i:765}, D{l:11,t:0,i:347}, D{l:11,t:0,i:552}, D{l:11,t:0,i:790}, D{l:12,t:0,i:263}, D{l:13,t:0,i:246}, D{l:13,t:0,i:270}, D{l:13,t:0,i:395}, D{l:14,t:0,i:176}, D{l:14,t:0,i:190}, D{l:14,t:0,i:398}, D{l:14,t:0,i:412}, D{l:15,t:0,i:32}, D{l:15,t:0,i:63}, D{l:16,t:0,i:88}, D{l:147,t:0,i:105}, D{l:6,t:10,i:9}, D{l:6,t:10,i:397}, D{l:7,t:10,i:53}, D{l:7,t:10,i:1742}, D{l:10,t:10,i:632}, D{l:11,t:10,i:828}, D{l:140,t:10,i:146}, D{l:5,t:0,i:381}, D{l:135,t:0,i:1792}, D{l:134,t:0,i:1452}, D{l:135,t:11,i:429}, D{l:8,t:0,i:367}, D{l:10,t:0,i:760}, D{l:14,t:0,i:79}, D{l:20,t:0,i:17}, D{l:152,t:0,i:0}, D{l:7,t:0,i:616}, D{l:138,t:0,i:413}, D{l:11,t:10,i:417}, D{l:12,t:10,i:223}, D{l:140,t:10,i:265}, D{l:7,t:11,i:1611}, D{l:13,t:11,i:14}, D{l:15,t:11,i:44}, D{l:19,t:11,i:13}, D{l:148,t:11,i:76}, D{l:135,t:0,i:1229}, D{l:6,t:0,i:120}, D{l:7,t:0,i:1188}, D{l:7,t:0,i:1710}, D{l:8,t:0,i:286}, D{l:9,t:0,i:667}, D{l:11,t:0,i:592}, D{l:139,t:0,i:730}, D{l:135,t:11,i:1814}, D{l:135,t:0,i:1146}, D{l:4,t:10,i:186}, D{l:5,t:10,i:157}, D{l:8,t:10,i:168}, D{l:138,t:10,i:6}, D{l:4,t:0,i:352}, D{l:135,t:0,i:687}, D{l:4,t:0,i:192}, D{l:5,t:0,i:49}, D{l:6,t:0,i:200}, D{l:6,t:0,i:293}, D{l:6,t:0,i:1696}, D{l:135,t:0,i:1151}, D{l:133,t:10,i:875}, D{l:5,t:10,i:773}, D{l:5,t:10,i:991}, D{l:6,t:10,i:1635}, D{l:134,t:10,i:1788}, D{l:7,t:10,i:111}, D{l:136,t:10,i:581}, D{l:6,t:0,i:935}, D{l:134,t:0,i:1151}, D{l:134,t:0,i:1050}, D{l:132,t:0,i:650}, D{l:132,t:0,i:147}, D{l:11,t:0,i:194}, D{l:12,t:0,i:62}, D{l:12,t:0,i:88}, D{l:11,t:11,i:194}, D{l:12,t:11,i:62}, D{l:140,t:11,i:88}, D{l:6,t:0,i:339}, D{l:135,t:0,i:923}, D{l:134,t:10,i:1747}, D{l:7,t:11,i:643}, D{l:136,t:11,i:236}, D{l:133,t:0,i:934}, D{l:7,t:10,i:1364}, D{l:7,t:10,i:1907}, D{l:141,t:10,i:158}, D{l:132,t:10,i:659}, D{l:4,t:10,i:404}, D{l:135,t:10,i:675}, D{l:7,t:11,i:581}, D{l:9,t:11,i:644}, D{l:137,t:11,i:699}, D{l:13,t:0,i:211}, D{l:14,t:0,i:133}, D{l:14,t:0,i:204}, D{l:15,t:0,i:64}, D{l:15,t:0,i:69}, D{l:15,t:0,i:114}, D{l:16,t:0,i:10}, D{l:19,t:0,i:23}, D{l:19,t:0,i:35}, D{l:19,t:0,i:39}, D{l:19,t:0,i:51}, D{l:19,t:0,i:71}, D{l:19,t:0,i:75}, D{l:152,t:0,i:15}, D{l:133,t:10,i:391}, D{l:5,t:11,i:54}, D{l:135,t:11,i:1513}, D{l:7,t:0,i:222}, D{l:8,t:0,i:341}, D{l:5,t:10,i:540}, D{l:134,t:10,i:1697}, D{l:134,t:10,i:78}, D{l:132,t:11,i:744}, D{l:136,t:0,i:293}, D{l:137,t:11,i:701}, D{l:7,t:11,i:930}, D{l:10,t:11,i:402}, D{l:10,t:11,i:476}, D{l:13,t:11,i:452}, D{l:18,t:11,i:55}, D{l:147,t:11,i:104}, D{l:132,t:0,i:637}, D{l:133,t:10,i:460}, D{l:8,t:11,i:50}, D{l:137,t:11,i:624}, D{l:132,t:11,i:572}, D{l:134,t:0,i:1159}, D{l:4,t:10,i:199}, D{l:139,t:10,i:34}, D{l:134,t:0,i:847}, D{l:134,t:10,i:388}, D{l:6,t:11,i:43}, D{l:7,t:11,i:38}, D{l:8,t:11,i:248}, D{l:9,t:11,i:504}, D{l:138,t:11,i:513}, D{l:9,t:0,i:683}, D{l:4,t:10,i:511}, D{l:6,t:10,i:608}, D{l:9,t:10,i:333}, D{l:10,t:10,i:602}, D{l:11,t:10,i:441}, D{l:11,t:10,i:723}, D{l:11,t:10,i:976}, D{l:140,t:10,i:357}, D{l:9,t:0,i:867}, D{l:138,t:0,i:837}, D{l:6,t:0,i:944}, D{l:135,t:11,i:326}, D{l:135,t:0,i:1809}, D{l:5,t:10,i:938}, D{l:7,t:11,i:783}, D{l:136,t:10,i:707}, D{l:133,t:11,i:766}, D{l:133,t:11,i:363}, D{l:6,t:0,i:170}, D{l:7,t:0,i:1080}, D{l:8,t:0,i:395}, D{l:8,t:0,i:487}, D{l:141,t:0,i:147}, D{l:6,t:11,i:258}, D{l:140,t:11,i:409}, D{l:4,t:0,i:535}, D{l:8,t:0,i:618}, D{l:5,t:11,i:249}, D{l:148,t:11,i:82}, D{l:6,t:0,i:1379}, D{l:149,t:11,i:15}, D{l:135,t:0,i:1625}, D{l:150,t:0,i:23}, D{l:5,t:11,i:393}, D{l:6,t:11,i:378}, D{l:7,t:11,i:1981}, D{l:9,t:11,i:32}, D{l:9,t:11,i:591}, D{l:10,t:11,i:685}, D{l:10,t:11,i:741}, D{l:142,t:11,i:382}, D{l:133,t:11,i:788}, D{l:7,t:11,i:1968}, D{l:10,t:11,i:19}, D{l:139,t:11,i:911}, D{l:7,t:11,i:1401}, D{l:135,t:11,i:1476}, D{l:4,t:11,i:61}, D{l:5,t:11,i:58}, D{l:5,t:11,i:171}, D{l:5,t:11,i:635}, D{l:5,t:11,i:683}, D{l:5,t:11,i:700}, D{l:6,t:11,i:291}, D{l:6,t:11,i:566}, D{l:7,t:11,i:1650}, D{l:11,t:11,i:523}, D{l:12,t:11,i:273}, D{l:12,t:11,i:303}, D{l:15,t:11,i:39}, D{l:143,t:11,i:111}, D{l:6,t:10,i:469}, D{l:7,t:10,i:1709}, D{l:138,t:10,i:515}, D{l:4,t:0,i:778}, D{l:134,t:11,i:589}, D{l:132,t:0,i:46}, D{l:5,t:0,i:811}, D{l:6,t:0,i:1679}, D{l:6,t:0,i:1714}, D{l:135,t:0,i:2032}, D{l:7,t:0,i:1458}, D{l:9,t:0,i:407}, D{l:11,t:0,i:15}, D{l:12,t:0,i:651}, D{l:149,t:0,i:37}, D{l:7,t:0,i:938}, D{l:132,t:10,i:500}, D{l:6,t:0,i:34}, D{l:7,t:0,i:69}, D{l:7,t:0,i:1089}, D{l:7,t:0,i:1281}, D{l:8,t:0,i:708}, D{l:8,t:0,i:721}, D{l:9,t:0,i:363}, D{l:148,t:0,i:98}, D{l:10,t:11,i:231}, D{l:147,t:11,i:124}, D{l:7,t:11,i:726}, D{l:152,t:11,i:9}, D{l:5,t:10,i:68}, D{l:134,t:10,i:383}, D{l:136,t:11,i:583}, D{l:4,t:11,i:917}, D{l:133,t:11,i:1005}, D{l:11,t:10,i:216}, D{l:139,t:10,i:340}, D{l:135,t:11,i:1675}, D{l:8,t:0,i:441}, D{l:10,t:0,i:314}, D{l:143,t:0,i:3}, D{l:132,t:11,i:919}, D{l:4,t:10,i:337}, D{l:6,t:10,i:353}, D{l:7,t:10,i:1934}, D{l:8,t:10,i:488}, D{l:137,t:10,i:429}, D{l:7,t:0,i:889}, D{l:7,t:10,i:1795}, D{l:8,t:10,i:259}, D{l:9,t:10,i:135}, D{l:9,t:10,i:177}, D{l:9,t:10,i:860}, D{l:10,t:10,i:825}, D{l:11,t:10,i:115}, D{l:11,t:10,i:370}, D{l:11,t:10,i:405}, D{l:11,t:10,i:604}, D{l:12,t:10,i:10}, D{l:12,t:10,i:667}, D{l:12,t:10,i:669}, D{l:13,t:10,i:76}, D{l:14,t:10,i:310}, D{l:15,t:10,i:76}, D{l:15,t:10,i:147}, D{l:148,t:10,i:23}, D{l:4,t:10,i:15}, D{l:4,t:11,i:255}, D{l:5,t:10,i:22}, D{l:5,t:11,i:302}, D{l:6,t:11,i:132}, D{l:6,t:10,i:244}, D{l:7,t:10,i:40}, D{l:7,t:11,i:128}, D{l:7,t:10,i:200}, D{l:7,t:11,i:283}, D{l:7,t:10,i:906}, D{l:7,t:10,i:1199}, D{l:7,t:11,i:1299}, D{l:9,t:10,i:616}, D{l:10,t:11,i:52}, D{l:10,t:11,i:514}, D{l:10,t:10,i:716}, D{l:11,t:10,i:635}, D{l:11,t:10,i:801}, D{l:11,t:11,i:925}, D{l:12,t:10,i:458}, D{l:13,t:11,i:92}, D{l:142,t:11,i:309}, D{l:132,t:0,i:462}, D{l:137,t:11,i:173}, D{l:135,t:10,i:1735}, D{l:8,t:0,i:525}, D{l:5,t:10,i:598}, D{l:7,t:10,i:791}, D{l:8,t:10,i:108}, D{l:137,t:10,i:123}, D{l:5,t:0,i:73}, D{l:6,t:0,i:23}, D{l:134,t:0,i:338}, D{l:132,t:0,i:676}, D{l:132,t:10,i:683}, D{l:7,t:0,i:725}, D{l:8,t:0,i:498}, D{l:139,t:0,i:268}, D{l:12,t:0,i:21}, D{l:151,t:0,i:7}, D{l:135,t:0,i:773}, D{l:4,t:10,i:155}, D{l:135,t:10,i:1689}, D{l:4,t:0,i:164}, D{l:5,t:0,i:730}, D{l:5,t:10,i:151}, D{l:5,t:10,i:741}, D{l:6,t:11,i:210}, D{l:7,t:10,i:498}, D{l:7,t:10,i:870}, D{l:7,t:10,i:1542}, D{l:12,t:10,i:213}, D{l:14,t:10,i:36}, D{l:14,t:10,i:391}, D{l:17,t:10,i:111}, D{l:18,t:10,i:6}, D{l:18,t:10,i:46}, D{l:18,t:10,i:151}, D{l:19,t:10,i:36}, D{l:20,t:10,i:32}, D{l:20,t:10,i:56}, D{l:20,t:10,i:69}, D{l:20,t:10,i:102}, D{l:21,t:10,i:4}, D{l:22,t:10,i:8}, D{l:22,t:10,i:10}, D{l:22,t:10,i:14}, D{l:150,t:10,i:31}, D{l:4,t:10,i:624}, D{l:135,t:10,i:1752}, D{l:4,t:0,i:583}, D{l:9,t:0,i:936}, D{l:15,t:0,i:214}, D{l:18,t:0,i:199}, D{l:24,t:0,i:26}, D{l:134,t:11,i:588}, D{l:7,t:0,i:1462}, D{l:11,t:0,i:659}, D{l:4,t:11,i:284}, D{l:134,t:11,i:223}, D{l:133,t:0,i:220}, D{l:139,t:0,i:803}, D{l:132,t:0,i:544}, D{l:4,t:10,i:492}, D{l:133,t:10,i:451}, D{l:16,t:0,i:98}, D{l:148,t:0,i:119}, D{l:4,t:11,i:218}, D{l:7,t:11,i:526}, D{l:143,t:11,i:137}, D{l:135,t:10,i:835}, D{l:4,t:11,i:270}, D{l:5,t:11,i:192}, D{l:6,t:11,i:332}, D{l:7,t:11,i:1322}, D{l:13,t:11,i:9}, D{l:13,t:10,i:70}, D{l:14,t:11,i:104}, D{l:142,t:11,i:311}, D{l:132,t:10,i:539}, D{l:140,t:11,i:661}, D{l:5,t:0,i:176}, D{l:6,t:0,i:437}, D{l:6,t:0,i:564}, D{l:11,t:0,i:181}, D{l:141,t:0,i:183}, D{l:135,t:0,i:1192}, D{l:6,t:10,i:113}, D{l:135,t:10,i:436}, D{l:136,t:10,i:718}, D{l:135,t:10,i:520}, D{l:135,t:0,i:1878}, D{l:140,t:11,i:196}, D{l:7,t:11,i:379}, D{l:8,t:11,i:481}, D{l:137,t:11,i:377}, D{l:5,t:11,i:1003}, D{l:6,t:11,i:149}, D{l:137,t:11,i:746}, D{l:8,t:11,i:262}, D{l:9,t:11,i:627}, D{l:10,t:11,i:18}, D{l:11,t:11,i:214}, D{l:11,t:11,i:404}, D{l:11,t:11,i:457}, D{l:11,t:11,i:780}, D{l:11,t:11,i:849}, D{l:11,t:11,i:913}, D{l:13,t:11,i:330}, D{l:13,t:11,i:401}, D{l:142,t:11,i:200}, D{l:149,t:0,i:26}, D{l:136,t:11,i:304}, D{l:132,t:11,i:142}, D{l:135,t:0,i:944}, D{l:4,t:0,i:790}, D{l:5,t:0,i:273}, D{l:134,t:0,i:394}, D{l:134,t:0,i:855}, D{l:4,t:0,i:135}, D{l:6,t:0,i:127}, D{l:7,t:0,i:1185}, D{l:7,t:0,i:1511}, D{l:8,t:0,i:613}, D{l:11,t:0,i:5}, D{l:12,t:0,i:336}, D{l:12,t:0,i:495}, D{l:12,t:0,i:586}, D{l:12,t:0,i:660}, D{l:12,t:0,i:668}, D{l:14,t:0,i:385}, D{l:15,t:0,i:118}, D{l:17,t:0,i:20}, D{l:146,t:0,i:98}, D{l:6,t:0,i:230}, D{l:9,t:0,i:752}, D{l:18,t:0,i:109}, D{l:12,t:10,i:610}, D{l:13,t:10,i:431}, D{l:144,t:10,i:59}, D{l:7,t:0,i:1954}, D{l:135,t:11,i:925}, D{l:4,t:11,i:471}, D{l:5,t:11,i:51}, D{l:6,t:11,i:602}, D{l:8,t:11,i:484}, D{l:10,t:11,i:195}, D{l:140,t:11,i:159}, D{l:132,t:10,i:307}, D{l:136,t:11,i:688}, D{l:132,t:11,i:697}, D{l:7,t:11,i:812}, D{l:7,t:11,i:1261}, D{l:7,t:11,i:1360}, D{l:9,t:11,i:632}, D{l:140,t:11,i:352}, D{l:5,t:0,i:162}, D{l:8,t:0,i:68}, D{l:133,t:10,i:964}, D{l:4,t:0,i:654}, D{l:136,t:11,i:212}, D{l:4,t:0,i:156}, D{l:7,t:0,i:998}, D{l:7,t:0,i:1045}, D{l:7,t:0,i:1860}, D{l:9,t:0,i:48}, D{l:9,t:0,i:692}, D{l:11,t:0,i:419}, D{l:139,t:0,i:602}, D{l:133,t:11,i:221}, D{l:4,t:11,i:373}, D{l:5,t:11,i:283}, D{l:6,t:11,i:480}, D{l:135,t:11,i:609}, D{l:142,t:11,i:216}, D{l:132,t:0,i:240}, D{l:6,t:11,i:192}, D{l:9,t:11,i:793}, D{l:145,t:11,i:55}, D{l:4,t:10,i:75}, D{l:5,t:10,i:180}, D{l:6,t:10,i:500}, D{l:7,t:10,i:58}, D{l:7,t:10,i:710}, D{l:138,t:10,i:645}, D{l:4,t:11,i:132}, D{l:5,t:11,i:69}, D{l:5,t:10,i:649}, D{l:135,t:11,i:1242}, D{l:6,t:10,i:276}, D{l:7,t:10,i:282}, D{l:7,t:10,i:879}, D{l:7,t:10,i:924}, D{l:8,t:10,i:459}, D{l:9,t:10,i:599}, D{l:9,t:10,i:754}, D{l:11,t:10,i:574}, D{l:12,t:10,i:128}, D{l:12,t:10,i:494}, D{l:13,t:10,i:52}, D{l:13,t:10,i:301}, D{l:15,t:10,i:30}, D{l:143,t:10,i:132}, D{l:132,t:10,i:200}, D{l:4,t:11,i:111}, D{l:135,t:11,i:302}, D{l:9,t:0,i:197}, D{l:10,t:0,i:300}, D{l:12,t:0,i:473}, D{l:13,t:0,i:90}, D{l:141,t:0,i:405}, D{l:132,t:11,i:767}, D{l:6,t:11,i:42}, D{l:7,t:11,i:1416}, D{l:7,t:11,i:1590}, D{l:7,t:11,i:2005}, D{l:8,t:11,i:131}, D{l:8,t:11,i:466}, D{l:9,t:11,i:672}, D{l:13,t:11,i:252}, D{l:148,t:11,i:103}, D{l:8,t:0,i:958}, D{l:8,t:0,i:999}, D{l:10,t:0,i:963}, D{l:138,t:0,i:1001}, D{l:135,t:10,i:1621}, D{l:135,t:0,i:858}, D{l:4,t:0,i:606}, D{l:137,t:11,i:444}, D{l:6,t:11,i:44}, D{l:136,t:11,i:368}, D{l:139,t:11,i:172}, D{l:4,t:11,i:570}, D{l:133,t:11,i:120}, D{l:139,t:11,i:624}, D{l:7,t:0,i:1978}, D{l:8,t:0,i:676}, D{l:6,t:10,i:225}, D{l:137,t:10,i:211}, D{l:7,t:0,i:972}, D{l:11,t:0,i:102}, D{l:136,t:10,i:687}, D{l:6,t:11,i:227}, D{l:135,t:11,i:1589}, D{l:8,t:10,i:58}, D{l:9,t:10,i:724}, D{l:11,t:10,i:809}, D{l:13,t:10,i:113}, D{l:145,t:10,i:72}, D{l:4,t:0,i:361}, D{l:133,t:0,i:315}, D{l:132,t:0,i:461}, D{l:6,t:10,i:345}, D{l:135,t:10,i:1247}, D{l:132,t:0,i:472}, D{l:8,t:10,i:767}, D{l:8,t:10,i:803}, D{l:9,t:10,i:301}, D{l:137,t:10,i:903}, D{l:135,t:11,i:1333}, D{l:135,t:11,i:477}, D{l:7,t:10,i:1949}, D{l:136,t:10,i:674}, D{l:6,t:0,i:905}, D{l:138,t:0,i:747}, D{l:133,t:0,i:155}, D{l:134,t:10,i:259}, D{l:7,t:0,i:163}, D{l:8,t:0,i:319}, D{l:9,t:0,i:402}, D{l:10,t:0,i:24}, D{l:10,t:0,i:681}, D{l:11,t:0,i:200}, D{l:12,t:0,i:253}, D{l:12,t:0,i:410}, D{l:142,t:0,i:219}, D{l:5,t:0,i:475}, D{l:7,t:0,i:1780}, D{l:9,t:0,i:230}, D{l:11,t:0,i:297}, D{l:11,t:0,i:558}, D{l:14,t:0,i:322}, D{l:19,t:0,i:76}, D{l:6,t:11,i:1667}, D{l:7,t:11,i:2036}, D{l:138,t:11,i:600}, D{l:136,t:10,i:254}, D{l:6,t:0,i:848}, D{l:135,t:0,i:1956}, D{l:6,t:11,i:511}, D{l:140,t:11,i:132}, D{l:5,t:11,i:568}, D{l:6,t:11,i:138}, D{l:135,t:11,i:1293}, D{l:6,t:0,i:631}, D{l:137,t:0,i:838}, D{l:149,t:0,i:36}, D{l:4,t:11,i:565}, D{l:8,t:11,i:23}, D{l:136,t:11,i:827}, D{l:5,t:0,i:944}, D{l:134,t:0,i:1769}, D{l:4,t:0,i:144}, D{l:6,t:0,i:842}, D{l:6,t:0,i:1400}, D{l:4,t:11,i:922}, D{l:133,t:11,i:1023}, D{l:133,t:10,i:248}, D{l:9,t:10,i:800}, D{l:10,t:10,i:693}, D{l:11,t:10,i:482}, D{l:11,t:10,i:734}, D{l:139,t:10,i:789}, D{l:7,t:11,i:1002}, D{l:139,t:11,i:145}, D{l:4,t:10,i:116}, D{l:5,t:10,i:95}, D{l:5,t:10,i:445}, D{l:7,t:10,i:1688}, D{l:8,t:10,i:29}, D{l:9,t:10,i:272}, D{l:11,t:10,i:509}, D{l:139,t:10,i:915}, D{l:14,t:0,i:369}, D{l:146,t:0,i:72}, D{l:135,t:10,i:1641}, D{l:132,t:11,i:740}, D{l:133,t:10,i:543}, D{l:140,t:11,i:116}, D{l:6,t:0,i:247}, D{l:9,t:0,i:555}, D{l:5,t:10,i:181}, D{l:136,t:10,i:41}, D{l:133,t:10,i:657}, D{l:136,t:0,i:996}, D{l:138,t:10,i:709}, D{l:7,t:0,i:189}, D{l:8,t:10,i:202}, D{l:138,t:10,i:536}, D{l:136,t:11,i:402}, D{l:4,t:11,i:716}, D{l:141,t:11,i:31}, D{l:10,t:0,i:280}, D{l:138,t:0,i:797}, D{l:9,t:10,i:423}, D{l:140,t:10,i:89}, D{l:8,t:10,i:113}, D{l:9,t:10,i:877}, D{l:10,t:10,i:554}, D{l:11,t:10,i:83}, D{l:12,t:10,i:136}, D{l:147,t:10,i:109}, D{l:133,t:10,i:976}, D{l:7,t:0,i:746}, D{l:132,t:10,i:206}, D{l:136,t:0,i:526}, D{l:139,t:0,i:345}, D{l:136,t:0,i:1017}, D{l:8,t:11,i:152}, D{l:9,t:11,i:53}, D{l:9,t:11,i:268}, D{l:9,t:11,i:901}, D{l:10,t:11,i:518}, D{l:10,t:11,i:829}, D{l:11,t:11,i:188}, D{l:13,t:11,i:74}, D{l:14,t:11,i:46}, D{l:15,t:11,i:17}, D{l:15,t:11,i:33}, D{l:17,t:11,i:40}, D{l:18,t:11,i:36}, D{l:19,t:11,i:20}, D{l:22,t:11,i:1}, D{l:152,t:11,i:2}, D{l:133,t:11,i:736}, D{l:136,t:11,i:532}, D{l:5,t:0,i:428}, D{l:138,t:0,i:651}, D{l:135,t:11,i:681}, D{l:135,t:0,i:1162}, D{l:7,t:0,i:327}, D{l:13,t:0,i:230}, D{l:17,t:0,i:113}, D{l:8,t:10,i:226}, D{l:10,t:10,i:537}, D{l:11,t:10,i:570}, D{l:11,t:10,i:605}, D{l:11,t:10,i:799}, D{l:11,t:10,i:804}, D{l:12,t:10,i:85}, D{l:12,t:10,i:516}, D{l:12,t:10,i:623}, D{l:12,t:11,i:677}, D{l:13,t:10,i:361}, D{l:14,t:10,i:77}, D{l:14,t:10,i:78}, D{l:147,t:10,i:110}, D{l:4,t:0,i:792}, D{l:7,t:0,i:1717}, D{l:10,t:0,i:546}, D{l:132,t:10,i:769}, D{l:4,t:11,i:684}, D{l:136,t:11,i:384}, D{l:132,t:10,i:551}, D{l:134,t:0,i:1203}, D{l:9,t:10,i:57}, D{l:9,t:10,i:459}, D{l:10,t:10,i:425}, D{l:11,t:10,i:119}, D{l:12,t:10,i:184}, D{l:12,t:10,i:371}, D{l:13,t:10,i:358}, D{l:145,t:10,i:51}, D{l:5,t:0,i:672}, D{l:5,t:10,i:814}, D{l:8,t:10,i:10}, D{l:9,t:10,i:421}, D{l:9,t:10,i:729}, D{l:10,t:10,i:609}, D{l:139,t:10,i:689}, D{l:138,t:0,i:189}, D{l:134,t:10,i:624}, D{l:7,t:11,i:110}, D{l:7,t:11,i:188}, D{l:8,t:11,i:290}, D{l:8,t:11,i:591}, D{l:9,t:11,i:382}, D{l:9,t:11,i:649}, D{l:11,t:11,i:71}, D{l:11,t:11,i:155}, D{l:11,t:11,i:313}, D{l:12,t:11,i:5}, D{l:13,t:11,i:325}, D{l:142,t:11,i:287}, D{l:133,t:0,i:99}, D{l:6,t:0,i:1053}, D{l:135,t:0,i:298}, D{l:7,t:11,i:360}, D{l:7,t:11,i:425}, D{l:9,t:11,i:66}, D{l:9,t:11,i:278}, D{l:138,t:11,i:644}, D{l:4,t:0,i:397}, D{l:136,t:0,i:555}, D{l:137,t:10,i:269}, D{l:132,t:10,i:528}, D{l:4,t:11,i:900}, D{l:133,t:11,i:861}, D{l:6,t:0,i:1157}, D{l:5,t:11,i:254}, D{l:7,t:11,i:985}, D{l:136,t:11,i:73}, D{l:7,t:11,i:1959}, D{l:136,t:11,i:683}, D{l:12,t:0,i:398}, D{l:20,t:0,i:39}, D{l:21,t:0,i:11}, D{l:150,t:0,i:41}, D{l:4,t:0,i:485}, D{l:7,t:0,i:353}, D{l:135,t:0,i:1523}, D{l:6,t:0,i:366}, D{l:7,t:0,i:1384}, D{l:135,t:0,i:1601}, D{l:138,t:0,i:787}, D{l:137,t:0,i:282}, D{l:5,t:10,i:104}, D{l:6,t:10,i:173}, D{l:135,t:10,i:1631}, D{l:139,t:11,i:146}, D{l:4,t:0,i:157}, D{l:133,t:0,i:471}, D{l:134,t:0,i:941}, D{l:132,t:11,i:725}, D{l:7,t:0,i:1336}, D{l:8,t:10,i:138}, D{l:8,t:10,i:342}, D{l:9,t:10,i:84}, D{l:10,t:10,i:193}, D{l:11,t:10,i:883}, D{l:140,t:10,i:359}, D{l:134,t:11,i:196}, D{l:136,t:0,i:116}, D{l:133,t:11,i:831}, D{l:134,t:0,i:787}, D{l:134,t:10,i:95}, D{l:6,t:10,i:406}, D{l:10,t:10,i:409}, D{l:10,t:10,i:447}, D{l:11,t:10,i:44}, D{l:140,t:10,i:100}, D{l:5,t:0,i:160}, D{l:7,t:0,i:363}, D{l:7,t:0,i:589}, D{l:10,t:0,i:170}, D{l:141,t:0,i:55}, D{l:134,t:0,i:1815}, D{l:132,t:0,i:866}, D{l:6,t:0,i:889}, D{l:6,t:0,i:1067}, D{l:6,t:0,i:1183}, D{l:4,t:11,i:321}, D{l:134,t:11,i:569}, D{l:5,t:11,i:848}, D{l:134,t:11,i:66}, D{l:4,t:11,i:36}, D{l:6,t:10,i:1636}, D{l:7,t:11,i:1387}, D{l:10,t:11,i:205}, D{l:11,t:11,i:755}, D{l:141,t:11,i:271}, D{l:132,t:0,i:689}, D{l:9,t:0,i:820}, D{l:4,t:10,i:282}, D{l:7,t:10,i:1034}, D{l:11,t:10,i:398}, D{l:11,t:10,i:634}, D{l:12,t:10,i:1}, D{l:12,t:10,i:79}, D{l:12,t:10,i:544}, D{l:14,t:10,i:237}, D{l:17,t:10,i:10}, D{l:146,t:10,i:20}, D{l:4,t:0,i:108}, D{l:7,t:0,i:804}, D{l:139,t:0,i:498}, D{l:132,t:11,i:887}, D{l:6,t:0,i:1119}, D{l:135,t:11,i:620}, D{l:6,t:11,i:165}, D{l:138,t:11,i:388}, D{l:5,t:0,i:244}, D{l:5,t:10,i:499}, D{l:6,t:10,i:476}, D{l:7,t:10,i:600}, D{l:7,t:10,i:888}, D{l:135,t:10,i:1096}, D{l:140,t:0,i:609}, D{l:135,t:0,i:1005}, D{l:4,t:0,i:412}, D{l:133,t:0,i:581}, D{l:4,t:11,i:719}, D{l:135,t:11,i:155}, D{l:7,t:10,i:296}, D{l:7,t:10,i:596}, D{l:8,t:10,i:560}, D{l:8,t:10,i:586}, D{l:9,t:10,i:612}, D{l:11,t:10,i:304}, D{l:12,t:10,i:46}, D{l:13,t:10,i:89}, D{l:14,t:10,i:112}, D{l:145,t:10,i:122}, D{l:4,t:0,i:895}, D{l:133,t:0,i:772}, D{l:142,t:11,i:307}, D{l:135,t:0,i:1898}, D{l:4,t:0,i:926}, D{l:133,t:0,i:983}, D{l:4,t:11,i:353}, D{l:6,t:11,i:146}, D{l:6,t:11,i:1789}, D{l:7,t:11,i:288}, D{l:7,t:11,i:990}, D{l:7,t:11,i:1348}, D{l:9,t:11,i:665}, D{l:9,t:11,i:898}, D{l:11,t:11,i:893}, D{l:142,t:11,i:212}, D{l:132,t:0,i:538}, D{l:133,t:11,i:532}, D{l:6,t:0,i:294}, D{l:7,t:0,i:1267}, D{l:8,t:0,i:624}, D{l:141,t:0,i:496}, D{l:7,t:0,i:1325}, D{l:4,t:11,i:45}, D{l:135,t:11,i:1257}, D{l:138,t:0,i:301}, D{l:9,t:0,i:298}, D{l:12,t:0,i:291}, D{l:13,t:0,i:276}, D{l:14,t:0,i:6}, D{l:17,t:0,i:18}, D{l:21,t:0,i:32}, D{l:7,t:10,i:1599}, D{l:7,t:10,i:1723}, D{l:8,t:10,i:79}, D{l:8,t:10,i:106}, D{l:8,t:10,i:190}, D{l:8,t:10,i:302}, D{l:8,t:10,i:383}, D{l:8,t:10,i:713}, D{l:9,t:10,i:119}, D{l:9,t:10,i:233}, D{l:9,t:10,i:419}, D{l:9,t:10,i:471}, D{l:10,t:10,i:181}, D{l:10,t:10,i:406}, D{l:11,t:10,i:57}, D{l:11,t:10,i:85}, D{l:11,t:10,i:120}, D{l:11,t:10,i:177}, D{l:11,t:10,i:296}, D{l:11,t:10,i:382}, D{l:11,t:10,i:454}, D{l:11,t:10,i:758}, D{l:11,t:10,i:999}, D{l:12,t:10,i:27}, D{l:12,t:10,i:131}, D{l:12,t:10,i:245}, D{l:12,t:10,i:312}, D{l:12,t:10,i:446}, D{l:12,t:10,i:454}, D{l:13,t:10,i:98}, D{l:13,t:10,i:426}, D{l:13,t:10,i:508}, D{l:14,t:10,i:163}, D{l:14,t:10,i:272}, D{l:14,t:10,i:277}, D{l:14,t:10,i:370}, D{l:15,t:10,i:95}, D{l:15,t:10,i:138}, D{l:15,t:10,i:167}, D{l:17,t:10,i:38}, D{l:148,t:10,i:96}, D{l:132,t:0,i:757}, D{l:134,t:0,i:1263}, D{l:4,t:0,i:820}, D{l:134,t:10,i:1759}, D{l:133,t:0,i:722}, D{l:136,t:11,i:816}, D{l:138,t:10,i:372}, D{l:145,t:10,i:16}, D{l:134,t:0,i:1039}, D{l:4,t:0,i:991}, D{l:134,t:0,i:2028}, D{l:133,t:10,i:258}, D{l:7,t:0,i:1875}, D{l:139,t:0,i:124}, D{l:6,t:11,i:559}, D{l:6,t:11,i:1691}, D{l:135,t:11,i:586}, D{l:5,t:0,i:324}, D{l:7,t:0,i:881}, D{l:8,t:10,i:134}, D{l:9,t:10,i:788}, D{l:140,t:10,i:438}, D{l:7,t:11,i:1823}, D{l:139,t:11,i:693}, D{l:6,t:0,i:1348}, D{l:134,t:0,i:1545}, D{l:134,t:0,i:911}, D{l:132,t:0,i:954}, D{l:8,t:0,i:329}, D{l:8,t:0,i:414}, D{l:7,t:10,i:1948}, D{l:135,t:10,i:2004}, D{l:5,t:0,i:517}, D{l:6,t:10,i:439}, D{l:7,t:10,i:780}, D{l:135,t:10,i:1040}, D{l:132,t:0,i:816}, D{l:5,t:10,i:1}, D{l:6,t:10,i:81}, D{l:138,t:10,i:520}, D{l:9,t:0,i:713}, D{l:10,t:0,i:222}, D{l:5,t:10,i:482}, D{l:8,t:10,i:98}, D{l:10,t:10,i:700}, D{l:10,t:10,i:822}, D{l:11,t:10,i:302}, D{l:11,t:10,i:778}, D{l:12,t:10,i:50}, D{l:12,t:10,i:127}, D{l:12,t:10,i:396}, D{l:13,t:10,i:62}, D{l:13,t:10,i:328}, D{l:14,t:10,i:122}, D{l:147,t:10,i:72}, D{l:137,t:0,i:33}, D{l:5,t:10,i:2}, D{l:7,t:10,i:1494}, D{l:136,t:10,i:589}, D{l:6,t:10,i:512}, D{l:7,t:10,i:797}, D{l:8,t:10,i:253}, D{l:9,t:10,i:77}, D{l:10,t:10,i:1}, D{l:10,t:11,i:108}, D{l:10,t:10,i:129}, D{l:10,t:10,i:225}, D{l:11,t:11,i:116}, D{l:11,t:10,i:118}, D{l:11,t:10,i:226}, D{l:11,t:10,i:251}, D{l:11,t:10,i:430}, D{l:11,t:10,i:701}, D{l:11,t:10,i:974}, D{l:11,t:10,i:982}, D{l:12,t:10,i:64}, D{l:12,t:10,i:260}, D{l:12,t:10,i:488}, D{l:140,t:10,i:690}, D{l:134,t:11,i:456}, D{l:133,t:11,i:925}, D{l:5,t:0,i:150}, D{l:7,t:0,i:106}, D{l:7,t:0,i:774}, D{l:8,t:0,i:603}, D{l:9,t:0,i:593}, D{l:9,t:0,i:634}, D{l:10,t:0,i:44}, D{l:10,t:0,i:173}, D{l:11,t:0,i:462}, D{l:11,t:0,i:515}, D{l:13,t:0,i:216}, D{l:13,t:0,i:288}, D{l:142,t:0,i:400}, D{l:137,t:10,i:347}, D{l:5,t:0,i:748}, D{l:134,t:0,i:553}, D{l:12,t:0,i:108}, D{l:141,t:0,i:291}, D{l:7,t:0,i:420}, D{l:4,t:10,i:12}, D{l:7,t:10,i:522}, D{l:7,t:10,i:809}, D{l:8,t:10,i:797}, D{l:141,t:10,i:88}, D{l:6,t:11,i:193}, D{l:7,t:11,i:240}, D{l:7,t:11,i:1682}, D{l:10,t:11,i:51}, D{l:10,t:11,i:640}, D{l:11,t:11,i:410}, D{l:13,t:11,i:82}, D{l:14,t:11,i:247}, D{l:14,t:11,i:331}, D{l:142,t:11,i:377}, D{l:133,t:10,i:528}, D{l:135,t:0,i:1777}, D{l:4,t:0,i:493}, D{l:144,t:0,i:55}, D{l:136,t:11,i:633}, D{l:139,t:0,i:81}, D{l:6,t:0,i:980}, D{l:136,t:0,i:321}, D{l:148,t:10,i:109}, D{l:5,t:10,i:266}, D{l:9,t:10,i:290}, D{l:9,t:10,i:364}, D{l:10,t:10,i:293}, D{l:11,t:10,i:606}, D{l:142,t:10,i:45}, D{l:6,t:0,i:568}, D{l:7,t:0,i:112}, D{l:7,t:0,i:1804}, D{l:8,t:0,i:362}, D{l:8,t:0,i:410}, D{l:8,t:0,i:830}, D{l:9,t:0,i:514}, D{l:11,t:0,i:649}, D{l:142,t:0,i:157}, D{l:4,t:0,i:74}, D{l:6,t:0,i:510}, D{l:6,t:10,i:594}, D{l:9,t:10,i:121}, D{l:10,t:10,i:49}, D{l:10,t:10,i:412}, D{l:139,t:10,i:834}, D{l:134,t:0,i:838}, D{l:136,t:10,i:748}, D{l:132,t:10,i:466}, D{l:132,t:0,i:625}, D{l:135,t:11,i:1443}, D{l:4,t:11,i:237}, D{l:135,t:11,i:514}, D{l:9,t:10,i:378}, D{l:141,t:10,i:162}, D{l:6,t:0,i:16}, D{l:6,t:0,i:158}, D{l:7,t:0,i:43}, D{l:7,t:0,i:129}, D{l:7,t:0,i:181}, D{l:8,t:0,i:276}, D{l:8,t:0,i:377}, D{l:10,t:0,i:523}, D{l:11,t:0,i:816}, D{l:12,t:0,i:455}, D{l:13,t:0,i:303}, D{l:142,t:0,i:135}, D{l:135,t:0,i:281}, D{l:4,t:0,i:1}, D{l:7,t:0,i:1143}, D{l:7,t:0,i:1463}, D{l:8,t:0,i:61}, D{l:9,t:0,i:207}, D{l:9,t:0,i:390}, D{l:9,t:0,i:467}, D{l:139,t:0,i:836}, D{l:6,t:11,i:392}, D{l:7,t:11,i:65}, D{l:135,t:11,i:2019}, D{l:132,t:10,i:667}, D{l:4,t:0,i:723}, D{l:5,t:0,i:895}, D{l:7,t:0,i:1031}, D{l:8,t:0,i:199}, D{l:8,t:0,i:340}, D{l:9,t:0,i:153}, D{l:9,t:0,i:215}, D{l:10,t:0,i:21}, D{l:10,t:0,i:59}, D{l:10,t:0,i:80}, D{l:10,t:0,i:224}, D{l:10,t:0,i:838}, D{l:11,t:0,i:229}, D{l:11,t:0,i:652}, D{l:12,t:0,i:192}, D{l:13,t:0,i:146}, D{l:142,t:0,i:91}, D{l:132,t:0,i:295}, D{l:137,t:0,i:51}, D{l:9,t:11,i:222}, D{l:10,t:11,i:43}, D{l:139,t:11,i:900}, D{l:5,t:0,i:309}, D{l:140,t:0,i:211}, D{l:5,t:0,i:125}, D{l:8,t:0,i:77}, D{l:138,t:0,i:15}, D{l:136,t:11,i:604}, D{l:138,t:0,i:789}, D{l:5,t:0,i:173}, D{l:4,t:10,i:39}, D{l:7,t:10,i:1843}, D{l:8,t:10,i:407}, D{l:11,t:10,i:144}, D{l:140,t:10,i:523}, D{l:138,t:11,i:265}, D{l:133,t:0,i:439}, D{l:132,t:10,i:510}, D{l:7,t:0,i:648}, D{l:7,t:0,i:874}, D{l:11,t:0,i:164}, D{l:12,t:0,i:76}, D{l:18,t:0,i:9}, D{l:7,t:10,i:1980}, D{l:10,t:10,i:487}, D{l:138,t:10,i:809}, D{l:12,t:0,i:111}, D{l:14,t:0,i:294}, D{l:19,t:0,i:45}, D{l:13,t:10,i:260}, D{l:146,t:10,i:63}, D{l:133,t:11,i:549}, D{l:134,t:10,i:570}, D{l:4,t:0,i:8}, D{l:7,t:0,i:1152}, D{l:7,t:0,i:1153}, D{l:7,t:0,i:1715}, D{l:9,t:0,i:374}, D{l:10,t:0,i:478}, D{l:139,t:0,i:648}, D{l:135,t:0,i:1099}, D{l:5,t:0,i:575}, D{l:6,t:0,i:354}, D{l:135,t:0,i:701}, D{l:7,t:11,i:36}, D{l:8,t:11,i:201}, D{l:136,t:11,i:605}, D{l:4,t:10,i:787}, D{l:136,t:11,i:156}, D{l:6,t:0,i:518}, D{l:149,t:11,i:13}, D{l:140,t:11,i:224}, D{l:134,t:0,i:702}, D{l:132,t:10,i:516}, D{l:5,t:11,i:724}, D{l:10,t:11,i:305}, D{l:11,t:11,i:151}, D{l:12,t:11,i:33}, D{l:12,t:11,i:121}, D{l:12,t:11,i:381}, D{l:17,t:11,i:3}, D{l:17,t:11,i:27}, D{l:17,t:11,i:78}, D{l:18,t:11,i:18}, D{l:19,t:11,i:54}, D{l:149,t:11,i:5}, D{l:8,t:0,i:87}, D{l:4,t:11,i:523}, D{l:5,t:11,i:638}, D{l:11,t:10,i:887}, D{l:14,t:10,i:365}, D{l:142,t:10,i:375}, D{l:138,t:0,i:438}, D{l:136,t:10,i:821}, D{l:135,t:11,i:1908}, D{l:6,t:11,i:242}, D{l:7,t:11,i:227}, D{l:7,t:11,i:1581}, D{l:8,t:11,i:104}, D{l:9,t:11,i:113}, D{l:9,t:11,i:220}, D{l:9,t:11,i:427}, D{l:10,t:11,i:74}, D{l:10,t:11,i:239}, D{l:11,t:11,i:579}, D{l:11,t:11,i:1023}, D{l:13,t:11,i:4}, D{l:13,t:11,i:204}, D{l:13,t:11,i:316}, D{l:18,t:11,i:95}, D{l:148,t:11,i:86}, D{l:4,t:0,i:69}, D{l:5,t:0,i:122}, D{l:5,t:0,i:849}, D{l:6,t:0,i:1633}, D{l:9,t:0,i:656}, D{l:138,t:0,i:464}, D{l:7,t:0,i:1802}, D{l:4,t:10,i:10}, D{l:139,t:10,i:786}, D{l:135,t:11,i:861}, D{l:139,t:0,i:499}, D{l:7,t:0,i:476}, D{l:7,t:0,i:1592}, D{l:138,t:0,i:87}, D{l:133,t:10,i:684}, D{l:4,t:0,i:840}, D{l:134,t:10,i:27}, D{l:142,t:0,i:283}, D{l:6,t:0,i:1620}, D{l:7,t:11,i:1328}, D{l:136,t:11,i:494}, D{l:5,t:0,i:859}, D{l:7,t:0,i:1160}, D{l:8,t:0,i:107}, D{l:9,t:0,i:291}, D{l:9,t:0,i:439}, D{l:10,t:0,i:663}, D{l:11,t:0,i:609}, D{l:140,t:0,i:197}, D{l:7,t:11,i:1306}, D{l:8,t:11,i:505}, D{l:9,t:11,i:482}, D{l:10,t:11,i:126}, D{l:11,t:11,i:225}, D{l:12,t:11,i:347}, D{l:12,t:11,i:449}, D{l:13,t:11,i:19}, D{l:142,t:11,i:218}, D{l:5,t:11,i:268}, D{l:10,t:11,i:764}, D{l:12,t:11,i:120}, D{l:13,t:11,i:39}, D{l:145,t:11,i:127}, D{l:145,t:10,i:56}, D{l:7,t:11,i:1672}, D{l:10,t:11,i:472}, D{l:11,t:11,i:189}, D{l:143,t:11,i:51}, D{l:6,t:10,i:342}, D{l:6,t:10,i:496}, D{l:8,t:10,i:275}, D{l:137,t:10,i:206}, D{l:133,t:0,i:600}, D{l:4,t:0,i:117}, D{l:6,t:0,i:372}, D{l:7,t:0,i:1905}, D{l:142,t:0,i:323}, D{l:4,t:10,i:909}, D{l:5,t:10,i:940}, D{l:135,t:11,i:1471}, D{l:132,t:10,i:891}, D{l:4,t:0,i:722}, D{l:139,t:0,i:471}, D{l:4,t:11,i:384}, D{l:135,t:11,i:1022}, D{l:132,t:10,i:687}, D{l:9,t:0,i:5}, D{l:12,t:0,i:216}, D{l:12,t:0,i:294}, D{l:12,t:0,i:298}, D{l:12,t:0,i:400}, D{l:12,t:0,i:518}, D{l:13,t:0,i:229}, D{l:143,t:0,i:139}, D{l:135,t:11,i:1703}, D{l:7,t:11,i:1602}, D{l:10,t:11,i:698}, D{l:12,t:11,i:212}, D{l:141,t:11,i:307}, D{l:6,t:10,i:41}, D{l:141,t:10,i:160}, D{l:135,t:11,i:1077}, D{l:9,t:11,i:159}, D{l:11,t:11,i:28}, D{l:140,t:11,i:603}, D{l:4,t:0,i:514}, D{l:7,t:0,i:1304}, D{l:138,t:0,i:477}, D{l:134,t:0,i:1774}, D{l:9,t:0,i:88}, D{l:139,t:0,i:270}, D{l:5,t:0,i:12}, D{l:7,t:0,i:375}, D{l:9,t:0,i:438}, D{l:134,t:10,i:1718}, D{l:132,t:11,i:515}, D{l:136,t:10,i:778}, D{l:8,t:11,i:632}, D{l:8,t:11,i:697}, D{l:137,t:11,i:854}, D{l:6,t:0,i:362}, D{l:6,t:0,i:997}, D{l:146,t:0,i:51}, D{l:7,t:0,i:816}, D{l:7,t:0,i:1241}, D{l:9,t:0,i:283}, D{l:9,t:0,i:520}, D{l:10,t:0,i:213}, D{l:10,t:0,i:307}, D{l:10,t:0,i:463}, D{l:10,t:0,i:671}, D{l:10,t:0,i:746}, D{l:11,t:0,i:401}, D{l:11,t:0,i:794}, D{l:12,t:0,i:517}, D{l:18,t:0,i:107}, D{l:147,t:0,i:115}, D{l:133,t:10,i:115}, D{l:150,t:11,i:28}, D{l:4,t:11,i:136}, D{l:133,t:11,i:551}, D{l:142,t:10,i:314}, D{l:132,t:0,i:258}, D{l:6,t:0,i:22}, D{l:7,t:0,i:903}, D{l:7,t:0,i:1963}, D{l:8,t:0,i:639}, D{l:138,t:0,i:577}, D{l:5,t:0,i:681}, D{l:8,t:0,i:782}, D{l:13,t:0,i:130}, D{l:17,t:0,i:84}, D{l:5,t:10,i:193}, D{l:140,t:10,i:178}, D{l:9,t:11,i:17}, D{l:138,t:11,i:291}, D{l:7,t:11,i:1287}, D{l:9,t:11,i:44}, D{l:10,t:11,i:552}, D{l:10,t:11,i:642}, D{l:11,t:11,i:839}, D{l:12,t:11,i:274}, D{l:12,t:11,i:275}, D{l:12,t:11,i:372}, D{l:13,t:11,i:91}, D{l:142,t:11,i:125}, D{l:135,t:10,i:174}, D{l:4,t:0,i:664}, D{l:5,t:0,i:804}, D{l:139,t:0,i:1013}, D{l:134,t:0,i:942}, D{l:6,t:0,i:1349}, D{l:6,t:0,i:1353}, D{l:6,t:0,i:1450}, D{l:7,t:11,i:1518}, D{l:139,t:11,i:694}, D{l:11,t:0,i:356}, D{l:4,t:10,i:122}, D{l:5,t:10,i:796}, D{l:5,t:10,i:952}, D{l:6,t:10,i:1660}, D{l:6,t:10,i:1671}, D{l:8,t:10,i:567}, D{l:9,t:10,i:687}, D{l:9,t:10,i:742}, D{l:10,t:10,i:686}, D{l:11,t:10,i:682}, D{l:140,t:10,i:281}, D{l:5,t:0,i:32}, D{l:6,t:11,i:147}, D{l:7,t:11,i:886}, D{l:9,t:11,i:753}, D{l:138,t:11,i:268}, D{l:5,t:10,i:179}, D{l:7,t:10,i:1095}, D{l:135,t:10,i:1213}, D{l:4,t:10,i:66}, D{l:7,t:10,i:722}, D{l:135,t:10,i:904}, D{l:135,t:10,i:352}, D{l:9,t:11,i:245}, D{l:138,t:11,i:137}, D{l:4,t:0,i:289}, D{l:7,t:0,i:629}, D{l:7,t:0,i:1698}, D{l:7,t:0,i:1711}, D{l:12,t:0,i:215}, D{l:133,t:11,i:414}, D{l:6,t:0,i:1975}, D{l:135,t:11,i:1762}, D{l:6,t:0,i:450}, D{l:136,t:0,i:109}, D{l:141,t:10,i:35}, D{l:134,t:11,i:599}, D{l:136,t:0,i:705}, D{l:133,t:0,i:664}, D{l:134,t:11,i:1749}, D{l:11,t:11,i:402}, D{l:12,t:11,i:109}, D{l:12,t:11,i:431}, D{l:13,t:11,i:179}, D{l:13,t:11,i:206}, D{l:14,t:11,i:175}, D{l:14,t:11,i:217}, D{l:16,t:11,i:3}, D{l:148,t:11,i:53}, D{l:135,t:0,i:1238}, D{l:134,t:11,i:1627}, D{l:132,t:11,i:488}, D{l:13,t:0,i:318}, D{l:10,t:10,i:592}, D{l:10,t:10,i:753}, D{l:12,t:10,i:317}, D{l:12,t:10,i:355}, D{l:12,t:10,i:465}, D{l:12,t:10,i:469}, D{l:12,t:10,i:560}, D{l:140,t:10,i:578}, D{l:133,t:10,i:564}, D{l:132,t:11,i:83}, D{l:140,t:11,i:676}, D{l:6,t:0,i:1872}, D{l:6,t:0,i:1906}, D{l:6,t:0,i:1907}, D{l:9,t:0,i:934}, D{l:9,t:0,i:956}, D{l:9,t:0,i:960}, D{l:9,t:0,i:996}, D{l:12,t:0,i:794}, D{l:12,t:0,i:876}, D{l:12,t:0,i:880}, D{l:12,t:0,i:918}, D{l:15,t:0,i:230}, D{l:18,t:0,i:234}, D{l:18,t:0,i:238}, D{l:21,t:0,i:38}, D{l:149,t:0,i:62}, D{l:134,t:10,i:556}, D{l:134,t:11,i:278}, D{l:137,t:0,i:103}, D{l:7,t:10,i:544}, D{l:8,t:10,i:719}, D{l:138,t:10,i:61}, D{l:4,t:10,i:5}, D{l:5,t:10,i:498}, D{l:8,t:10,i:637}, D{l:137,t:10,i:521}, D{l:7,t:0,i:777}, D{l:12,t:0,i:229}, D{l:12,t:0,i:239}, D{l:15,t:0,i:12}, D{l:12,t:11,i:229}, D{l:12,t:11,i:239}, D{l:143,t:11,i:12}, D{l:6,t:0,i:26}, D{l:7,t:11,i:388}, D{l:7,t:11,i:644}, D{l:139,t:11,i:781}, D{l:7,t:11,i:229}, D{l:8,t:11,i:59}, D{l:9,t:11,i:190}, D{l:9,t:11,i:257}, D{l:10,t:11,i:378}, D{l:140,t:11,i:191}, D{l:133,t:10,i:927}, D{l:135,t:10,i:1441}, D{l:4,t:10,i:893}, D{l:5,t:10,i:780}, D{l:133,t:10,i:893}, D{l:4,t:0,i:414}, D{l:5,t:0,i:467}, D{l:9,t:0,i:654}, D{l:10,t:0,i:451}, D{l:12,t:0,i:59}, D{l:141,t:0,i:375}, D{l:142,t:0,i:173}, D{l:135,t:0,i:17}, D{l:7,t:0,i:1350}, D{l:133,t:10,i:238}, D{l:135,t:0,i:955}, D{l:4,t:0,i:960}, D{l:10,t:0,i:887}, D{l:12,t:0,i:753}, D{l:18,t:0,i:161}, D{l:18,t:0,i:162}, D{l:152,t:0,i:19}, D{l:136,t:11,i:344}, D{l:6,t:10,i:1729}, D{l:137,t:11,i:288}, D{l:132,t:11,i:660}, D{l:4,t:0,i:217}, D{l:5,t:0,i:710}, D{l:7,t:0,i:760}, D{l:7,t:0,i:1926}, D{l:9,t:0,i:428}, D{l:9,t:0,i:708}, D{l:10,t:0,i:254}, D{l:10,t:0,i:296}, D{l:10,t:0,i:720}, D{l:11,t:0,i:109}, D{l:11,t:0,i:255}, D{l:12,t:0,i:165}, D{l:12,t:0,i:315}, D{l:13,t:0,i:107}, D{l:13,t:0,i:203}, D{l:14,t:0,i:54}, D{l:14,t:0,i:99}, D{l:14,t:0,i:114}, D{l:14,t:0,i:388}, D{l:16,t:0,i:85}, D{l:17,t:0,i:9}, D{l:17,t:0,i:33}, D{l:20,t:0,i:25}, D{l:20,t:0,i:28}, D{l:20,t:0,i:29}, D{l:21,t:0,i:9}, D{l:21,t:0,i:10}, D{l:21,t:0,i:34}, D{l:22,t:0,i:17}, D{l:4,t:10,i:60}, D{l:7,t:10,i:1800}, D{l:8,t:10,i:314}, D{l:9,t:10,i:700}, D{l:139,t:10,i:487}, D{l:7,t:11,i:1035}, D{l:138,t:11,i:737}, D{l:7,t:11,i:690}, D{l:9,t:11,i:217}, D{l:9,t:11,i:587}, D{l:140,t:11,i:521}, D{l:6,t:0,i:919}, D{l:7,t:11,i:706}, D{l:7,t:11,i:1058}, D{l:138,t:11,i:538}, D{l:7,t:10,i:1853}, D{l:138,t:10,i:437}, D{l:136,t:10,i:419}, D{l:6,t:0,i:280}, D{l:10,t:0,i:502}, D{l:11,t:0,i:344}, D{l:140,t:0,i:38}, D{l:5,t:0,i:45}, D{l:7,t:0,i:1161}, D{l:11,t:0,i:448}, D{l:11,t:0,i:880}, D{l:13,t:0,i:139}, D{l:13,t:0,i:407}, D{l:15,t:0,i:16}, D{l:17,t:0,i:95}, D{l:18,t:0,i:66}, D{l:18,t:0,i:88}, D{l:18,t:0,i:123}, D{l:149,t:0,i:7}, D{l:11,t:11,i:92}, D{l:11,t:11,i:196}, D{l:11,t:11,i:409}, D{l:11,t:11,i:450}, D{l:11,t:11,i:666}, D{l:11,t:11,i:777}, D{l:12,t:11,i:262}, D{l:13,t:11,i:385}, D{l:13,t:11,i:393}, D{l:15,t:11,i:115}, D{l:16,t:11,i:45}, D{l:145,t:11,i:82}, D{l:136,t:0,i:777}, D{l:134,t:11,i:1744}, D{l:4,t:0,i:410}, D{l:7,t:0,i:521}, D{l:133,t:10,i:828}, D{l:134,t:0,i:673}, D{l:7,t:0,i:1110}, D{l:7,t:0,i:1778}, D{l:7,t:10,i:176}, D{l:135,t:10,i:178}, D{l:5,t:10,i:806}, D{l:7,t:11,i:268}, D{l:7,t:10,i:1976}, D{l:136,t:11,i:569}, D{l:4,t:11,i:733}, D{l:9,t:11,i:194}, D{l:10,t:11,i:92}, D{l:11,t:11,i:198}, D{l:12,t:11,i:84}, D{l:12,t:11,i:87}, D{l:13,t:11,i:128}, D{l:144,t:11,i:74}, D{l:5,t:0,i:341}, D{l:7,t:0,i:1129}, D{l:11,t:0,i:414}, D{l:4,t:10,i:51}, D{l:6,t:10,i:4}, D{l:7,t:10,i:591}, D{l:7,t:10,i:849}, D{l:7,t:10,i:951}, D{l:7,t:10,i:1613}, D{l:7,t:10,i:1760}, D{l:7,t:10,i:1988}, D{l:9,t:10,i:434}, D{l:10,t:10,i:754}, D{l:11,t:10,i:25}, D{l:139,t:10,i:37}, D{l:133,t:10,i:902}, D{l:135,t:10,i:928}, D{l:135,t:0,i:787}, D{l:132,t:0,i:436}, D{l:134,t:10,i:270}, D{l:7,t:0,i:1587}, D{l:135,t:0,i:1707}, D{l:6,t:0,i:377}, D{l:7,t:0,i:1025}, D{l:9,t:0,i:613}, D{l:145,t:0,i:104}, D{l:7,t:11,i:982}, D{l:7,t:11,i:1361}, D{l:10,t:11,i:32}, D{l:143,t:11,i:56}, D{l:139,t:0,i:96}, D{l:132,t:0,i:451}, D{l:132,t:10,i:416}, D{l:142,t:10,i:372}, D{l:5,t:10,i:152}, D{l:5,t:10,i:197}, D{l:7,t:11,i:306}, D{l:7,t:10,i:340}, D{l:7,t:10,i:867}, D{l:10,t:10,i:548}, D{l:10,t:10,i:581}, D{l:11,t:10,i:6}, D{l:12,t:10,i:3}, D{l:12,t:10,i:19}, D{l:14,t:10,i:110}, D{l:142,t:10,i:289}, D{l:134,t:0,i:680}, D{l:134,t:11,i:609}, D{l:7,t:0,i:483}, D{l:7,t:10,i:190}, D{l:8,t:10,i:28}, D{l:8,t:10,i:141}, D{l:8,t:10,i:444}, D{l:8,t:10,i:811}, D{l:9,t:10,i:468}, D{l:11,t:10,i:334}, D{l:12,t:10,i:24}, D{l:12,t:10,i:386}, D{l:140,t:10,i:576}, D{l:10,t:0,i:916}, D{l:133,t:10,i:757}, D{l:5,t:10,i:721}, D{l:135,t:10,i:1553}, D{l:133,t:11,i:178}, D{l:134,t:0,i:937}, D{l:132,t:10,i:898}, D{l:133,t:0,i:739}, D{l:147,t:0,i:82}, D{l:135,t:0,i:663}, D{l:146,t:0,i:128}, D{l:5,t:10,i:277}, D{l:141,t:10,i:247}, D{l:134,t:0,i:1087}, D{l:132,t:10,i:435}, D{l:6,t:11,i:381}, D{l:7,t:11,i:645}, D{l:7,t:11,i:694}, D{l:136,t:11,i:546}, D{l:7,t:0,i:503}, D{l:135,t:0,i:1885}, D{l:6,t:0,i:1965}, D{l:8,t:0,i:925}, D{l:138,t:0,i:955}, D{l:4,t:0,i:113}, D{l:5,t:0,i:163}, D{l:5,t:0,i:735}, D{l:7,t:0,i:1009}, D{l:9,t:0,i:9}, D{l:9,t:0,i:771}, D{l:12,t:0,i:90}, D{l:13,t:0,i:138}, D{l:13,t:0,i:410}, D{l:143,t:0,i:128}, D{l:4,t:0,i:324}, D{l:138,t:0,i:104}, D{l:7,t:0,i:460}, D{l:5,t:10,i:265}, D{l:134,t:10,i:212}, D{l:133,t:11,i:105}, D{l:7,t:11,i:261}, D{l:7,t:11,i:1107}, D{l:7,t:11,i:1115}, D{l:7,t:11,i:1354}, D{l:7,t:11,i:1588}, D{l:7,t:11,i:1705}, D{l:7,t:11,i:1902}, D{l:9,t:11,i:465}, D{l:10,t:11,i:248}, D{l:10,t:11,i:349}, D{l:10,t:11,i:647}, D{l:11,t:11,i:527}, D{l:11,t:11,i:660}, D{l:11,t:11,i:669}, D{l:12,t:11,i:529}, D{l:141,t:11,i:305}, D{l:5,t:11,i:438}, D{l:9,t:11,i:694}, D{l:12,t:11,i:627}, D{l:141,t:11,i:210}, D{l:152,t:11,i:11}, D{l:4,t:0,i:935}, D{l:133,t:0,i:823}, D{l:132,t:10,i:702}, D{l:5,t:0,i:269}, D{l:7,t:0,i:434}, D{l:7,t:0,i:891}, D{l:8,t:0,i:339}, D{l:9,t:0,i:702}, D{l:11,t:0,i:594}, D{l:11,t:0,i:718}, D{l:17,t:0,i:100}, D{l:5,t:10,i:808}, D{l:135,t:10,i:2045}, D{l:7,t:0,i:1014}, D{l:9,t:0,i:485}, D{l:141,t:0,i:264}, D{l:134,t:0,i:1713}, D{l:7,t:0,i:1810}, D{l:11,t:0,i:866}, D{l:12,t:0,i:103}, D{l:13,t:0,i:495}, D{l:140,t:11,i:233}, D{l:4,t:0,i:423}, D{l:10,t:0,i:949}, D{l:138,t:0,i:1013}, D{l:135,t:0,i:900}, D{l:8,t:11,i:25}, D{l:138,t:11,i:826}, D{l:5,t:10,i:166}, D{l:8,t:10,i:739}, D{l:140,t:10,i:511}, D{l:134,t:0,i:2018}, D{l:7,t:11,i:1270}, D{l:139,t:11,i:612}, D{l:4,t:10,i:119}, D{l:5,t:10,i:170}, D{l:5,t:10,i:447}, D{l:7,t:10,i:1708}, D{l:7,t:10,i:1889}, D{l:9,t:10,i:357}, D{l:9,t:10,i:719}, D{l:12,t:10,i:486}, D{l:140,t:10,i:596}, D{l:12,t:0,i:574}, D{l:140,t:11,i:574}, D{l:132,t:11,i:308}, D{l:6,t:0,i:964}, D{l:6,t:0,i:1206}, D{l:134,t:0,i:1302}, D{l:4,t:10,i:450}, D{l:135,t:10,i:1158}, D{l:135,t:11,i:150}, D{l:136,t:11,i:649}, D{l:14,t:0,i:213}, D{l:148,t:0,i:38}, D{l:9,t:11,i:45}, D{l:9,t:11,i:311}, D{l:141,t:11,i:42}, D{l:134,t:11,i:521}, D{l:7,t:10,i:1375}, D{l:7,t:10,i:1466}, D{l:138,t:10,i:331}, D{l:132,t:10,i:754}, D{l:5,t:11,i:339}, D{l:7,t:11,i:1442}, D{l:14,t:11,i:3}, D{l:15,t:11,i:41}, D{l:147,t:11,i:66}, D{l:136,t:11,i:378}, D{l:134,t:0,i:1022}, D{l:5,t:10,i:850}, D{l:136,t:10,i:799}, D{l:142,t:0,i:143}, D{l:135,t:0,i:2029}, D{l:134,t:11,i:1628}, D{l:8,t:0,i:523}, D{l:150,t:0,i:34}, D{l:5,t:0,i:625}, D{l:135,t:0,i:1617}, D{l:7,t:0,i:275}, D{l:7,t:10,i:238}, D{l:7,t:10,i:2033}, D{l:8,t:10,i:120}, D{l:8,t:10,i:188}, D{l:8,t:10,i:659}, D{l:9,t:10,i:598}, D{l:10,t:10,i:466}, D{l:12,t:10,i:342}, D{l:12,t:10,i:588}, D{l:13,t:10,i:503}, D{l:14,t:10,i:246}, D{l:143,t:10,i:92}, D{l:7,t:0,i:37}, D{l:8,t:0,i:425}, D{l:8,t:0,i:693}, D{l:9,t:0,i:720}, D{l:10,t:0,i:380}, D{l:10,t:0,i:638}, D{l:11,t:0,i:273}, D{l:11,t:0,i:473}, D{l:12,t:0,i:61}, D{l:143,t:0,i:43}, D{l:135,t:11,i:829}, D{l:135,t:0,i:1943}, D{l:132,t:0,i:765}, D{l:5,t:11,i:486}, D{l:135,t:11,i:1349}, D{l:7,t:11,i:1635}, D{l:8,t:11,i:17}, D{l:10,t:11,i:217}, D{l:138,t:11,i:295}, D{l:4,t:10,i:201}, D{l:7,t:10,i:1744}, D{l:8,t:10,i:602}, D{l:11,t:10,i:247}, D{l:11,t:10,i:826}, D{l:145,t:10,i:65}, D{l:138,t:11,i:558}, D{l:11,t:0,i:551}, D{l:142,t:0,i:159}, D{l:8,t:10,i:164}, D{l:146,t:10,i:62}, D{l:139,t:11,i:176}, D{l:132,t:0,i:168}, D{l:136,t:0,i:1010}, D{l:134,t:0,i:1994}, D{l:135,t:0,i:91}, D{l:138,t:0,i:532}, D{l:135,t:10,i:1243}, D{l:135,t:0,i:1884}, D{l:132,t:10,i:907}, D{l:5,t:10,i:100}, D{l:10,t:10,i:329}, D{l:12,t:10,i:416}, D{l:149,t:10,i:29}, D{l:134,t:11,i:447}, D{l:132,t:10,i:176}, D{l:5,t:10,i:636}, D{l:5,t:10,i:998}, D{l:7,t:10,i:9}, D{l:7,t:10,i:1508}, D{l:8,t:10,i:26}, D{l:9,t:10,i:317}, D{l:9,t:10,i:358}, D{l:10,t:10,i:210}, D{l:10,t:10,i:292}, D{l:10,t:10,i:533}, D{l:11,t:10,i:555}, D{l:12,t:10,i:526}, D{l:12,t:10,i:607}, D{l:13,t:10,i:263}, D{l:13,t:10,i:459}, D{l:142,t:10,i:271}, D{l:4,t:11,i:609}, D{l:135,t:11,i:756}, D{l:6,t:0,i:15}, D{l:7,t:0,i:70}, D{l:10,t:0,i:240}, D{l:147,t:0,i:93}, D{l:4,t:11,i:930}, D{l:133,t:11,i:947}, D{l:134,t:0,i:1227}, D{l:134,t:0,i:1534}, D{l:133,t:11,i:939}, D{l:133,t:11,i:962}, D{l:5,t:11,i:651}, D{l:8,t:11,i:170}, D{l:9,t:11,i:61}, D{l:9,t:11,i:63}, D{l:10,t:11,i:23}, D{l:10,t:11,i:37}, D{l:10,t:11,i:834}, D{l:11,t:11,i:4}, D{l:11,t:11,i:187}, D{l:11,t:11,i:281}, D{l:11,t:11,i:503}, D{l:11,t:11,i:677}, D{l:12,t:11,i:96}, D{l:12,t:11,i:130}, D{l:12,t:11,i:244}, D{l:14,t:11,i:5}, D{l:14,t:11,i:40}, D{l:14,t:11,i:162}, D{l:14,t:11,i:202}, D{l:146,t:11,i:133}, D{l:4,t:11,i:406}, D{l:5,t:11,i:579}, D{l:12,t:11,i:492}, D{l:150,t:11,i:15}, D{l:139,t:0,i:392}, D{l:6,t:10,i:610}, D{l:10,t:10,i:127}, D{l:141,t:10,i:27}, D{l:7,t:0,i:655}, D{l:7,t:0,i:1844}, D{l:136,t:10,i:119}, D{l:4,t:0,i:145}, D{l:6,t:0,i:176}, D{l:7,t:0,i:395}, D{l:137,t:0,i:562}, D{l:132,t:0,i:501}, D{l:140,t:11,i:145}, D{l:136,t:0,i:1019}, D{l:134,t:0,i:509}, D{l:139,t:0,i:267}, D{l:6,t:11,i:17}, D{l:7,t:11,i:16}, D{l:7,t:11,i:1001}, D{l:7,t:11,i:1982}, D{l:9,t:11,i:886}, D{l:10,t:11,i:489}, D{l:10,t:11,i:800}, D{l:11,t:11,i:782}, D{l:12,t:11,i:320}, D{l:13,t:11,i:467}, D{l:14,t:11,i:145}, D{l:14,t:11,i:387}, D{l:143,t:11,i:119}, D{l:145,t:11,i:17}, D{l:6,t:0,i:1099}, D{l:133,t:11,i:458}, D{l:7,t:11,i:1983}, D{l:8,t:11,i:0}, D{l:8,t:11,i:171}, D{l:9,t:11,i:120}, D{l:9,t:11,i:732}, D{l:10,t:11,i:473}, D{l:11,t:11,i:656}, D{l:11,t:11,i:998}, D{l:18,t:11,i:0}, D{l:18,t:11,i:2}, D{l:147,t:11,i:21}, D{l:12,t:11,i:427}, D{l:146,t:11,i:38}, D{l:10,t:0,i:948}, D{l:138,t:0,i:968}, D{l:7,t:10,i:126}, D{l:136,t:10,i:84}, D{l:136,t:10,i:790}, D{l:4,t:0,i:114}, D{l:9,t:0,i:492}, D{l:13,t:0,i:462}, D{l:142,t:0,i:215}, D{l:6,t:10,i:64}, D{l:12,t:10,i:377}, D{l:141,t:10,i:309}, D{l:4,t:0,i:77}, D{l:5,t:0,i:361}, D{l:6,t:0,i:139}, D{l:6,t:0,i:401}, D{l:6,t:0,i:404}, D{l:7,t:0,i:413}, D{l:7,t:0,i:715}, D{l:7,t:0,i:1716}, D{l:11,t:0,i:279}, D{l:12,t:0,i:179}, D{l:12,t:0,i:258}, D{l:13,t:0,i:244}, D{l:142,t:0,i:358}, D{l:134,t:0,i:1717}, D{l:7,t:0,i:772}, D{l:7,t:0,i:1061}, D{l:7,t:0,i:1647}, D{l:8,t:0,i:82}, D{l:11,t:0,i:250}, D{l:11,t:0,i:607}, D{l:12,t:0,i:311}, D{l:12,t:0,i:420}, D{l:13,t:0,i:184}, D{l:13,t:0,i:367}, D{l:7,t:10,i:1104}, D{l:11,t:10,i:269}, D{l:11,t:10,i:539}, D{l:11,t:10,i:627}, D{l:11,t:10,i:706}, D{l:11,t:10,i:975}, D{l:12,t:10,i:248}, D{l:12,t:10,i:434}, D{l:12,t:10,i:600}, D{l:12,t:10,i:622}, D{l:13,t:10,i:297}, D{l:13,t:10,i:485}, D{l:14,t:10,i:69}, D{l:14,t:10,i:409}, D{l:143,t:10,i:108}, D{l:135,t:0,i:724}, D{l:4,t:11,i:512}, D{l:4,t:11,i:519}, D{l:133,t:11,i:342}, D{l:134,t:0,i:1133}, D{l:145,t:11,i:29}, D{l:11,t:10,i:977}, D{l:141,t:10,i:507}, D{l:6,t:0,i:841}, D{l:6,t:0,i:1042}, D{l:6,t:0,i:1194}, D{l:10,t:0,i:993}, D{l:140,t:0,i:1021}, D{l:6,t:11,i:31}, D{l:7,t:11,i:491}, D{l:7,t:11,i:530}, D{l:8,t:11,i:592}, D{l:9,t:10,i:34}, D{l:11,t:11,i:53}, D{l:11,t:10,i:484}, D{l:11,t:11,i:779}, D{l:12,t:11,i:167}, D{l:12,t:11,i:411}, D{l:14,t:11,i:14}, D{l:14,t:11,i:136}, D{l:15,t:11,i:72}, D{l:16,t:11,i:17}, D{l:144,t:11,i:72}, D{l:4,t:0,i:1021}, D{l:6,t:0,i:2037}, D{l:133,t:11,i:907}, D{l:7,t:0,i:373}, D{l:8,t:0,i:335}, D{l:8,t:0,i:596}, D{l:9,t:0,i:488}, D{l:6,t:10,i:1700}, D{l:7,t:10,i:293}, D{l:7,t:10,i:382}, D{l:7,t:10,i:1026}, D{l:7,t:10,i:1087}, D{l:7,t:10,i:2027}, D{l:8,t:10,i:252}, D{l:8,t:10,i:727}, D{l:8,t:10,i:729}, D{l:9,t:10,i:30}, D{l:9,t:10,i:199}, D{l:9,t:10,i:231}, D{l:9,t:10,i:251}, D{l:9,t:10,i:334}, D{l:9,t:10,i:361}, D{l:9,t:10,i:712}, D{l:10,t:10,i:55}, D{l:10,t:10,i:60}, D{l:10,t:10,i:232}, D{l:10,t:10,i:332}, D{l:10,t:10,i:384}, D{l:10,t:10,i:396}, D{l:10,t:10,i:504}, D{l:10,t:10,i:542}, D{l:10,t:10,i:652}, D{l:11,t:10,i:20}, D{l:11,t:10,i:48}, D{l:11,t:10,i:207}, D{l:11,t:10,i:291}, D{l:11,t:10,i:298}, D{l:11,t:10,i:342}, D{l:11,t:10,i:365}, D{l:11,t:10,i:394}, D{l:11,t:10,i:620}, D{l:11,t:10,i:705}, D{l:11,t:10,i:1017}, D{l:12,t:10,i:123}, D{l:12,t:10,i:340}, D{l:12,t:10,i:406}, D{l:12,t:10,i:643}, D{l:13,t:10,i:61}, D{l:13,t:10,i:269}, D{l:13,t:10,i:311}, D{l:13,t:10,i:319}, D{l:13,t:10,i:486}, D{l:14,t:10,i:234}, D{l:15,t:10,i:62}, D{l:15,t:10,i:85}, D{l:16,t:10,i:71}, D{l:18,t:10,i:119}, D{l:148,t:10,i:105}, D{l:150,t:0,i:37}, D{l:4,t:11,i:208}, D{l:5,t:11,i:106}, D{l:6,t:11,i:531}, D{l:8,t:11,i:408}, D{l:9,t:11,i:188}, D{l:138,t:11,i:572}, D{l:132,t:0,i:564}, D{l:6,t:0,i:513}, D{l:135,t:0,i:1052}, D{l:132,t:0,i:825}, D{l:9,t:0,i:899}, D{l:140,t:11,i:441}, D{l:134,t:0,i:778}, D{l:133,t:11,i:379}, D{l:7,t:0,i:1417}, D{l:12,t:0,i:382}, D{l:17,t:0,i:48}, D{l:152,t:0,i:12}, D{l:132,t:11,i:241}, D{l:7,t:0,i:1116}, D{l:6,t:10,i:379}, D{l:7,t:10,i:270}, D{l:8,t:10,i:176}, D{l:8,t:10,i:183}, D{l:9,t:10,i:432}, D{l:9,t:10,i:661}, D{l:12,t:10,i:247}, D{l:12,t:10,i:617}, D{l:146,t:10,i:125}, D{l:5,t:10,i:792}, D{l:133,t:10,i:900}, D{l:6,t:0,i:545}, D{l:7,t:0,i:565}, D{l:7,t:0,i:1669}, D{l:10,t:0,i:114}, D{l:11,t:0,i:642}, D{l:140,t:0,i:618}, D{l:133,t:0,i:5}, D{l:138,t:11,i:7}, D{l:132,t:11,i:259}, D{l:135,t:0,i:192}, D{l:134,t:0,i:701}, D{l:136,t:0,i:763}, D{l:135,t:10,i:1979}, D{l:4,t:10,i:901}, D{l:133,t:10,i:776}, D{l:10,t:0,i:755}, D{l:147,t:0,i:29}, D{l:133,t:0,i:759}, D{l:4,t:11,i:173}, D{l:5,t:11,i:312}, D{l:5,t:11,i:512}, D{l:135,t:11,i:1285}, D{l:7,t:11,i:1603}, D{l:7,t:11,i:1691}, D{l:9,t:11,i:464}, D{l:11,t:11,i:195}, D{l:12,t:11,i:279}, D{l:12,t:11,i:448}, D{l:14,t:11,i:11}, D{l:147,t:11,i:102}, D{l:7,t:0,i:370}, D{l:7,t:0,i:1007}, D{l:7,t:0,i:1177}, D{l:135,t:0,i:1565}, D{l:135,t:0,i:1237}, D{l:4,t:0,i:87}, D{l:5,t:0,i:250}, D{l:141,t:0,i:298}, D{l:4,t:11,i:452}, D{l:5,t:11,i:583}, D{l:5,t:11,i:817}, D{l:6,t:11,i:433}, D{l:7,t:11,i:593}, D{l:7,t:11,i:720}, D{l:7,t:11,i:1378}, D{l:8,t:11,i:161}, D{l:9,t:11,i:284}, D{l:10,t:11,i:313}, D{l:139,t:11,i:886}, D{l:4,t:11,i:547}, D{l:135,t:11,i:1409}, D{l:136,t:11,i:722}, D{l:4,t:10,i:37}, D{l:5,t:10,i:334}, D{l:135,t:10,i:1253}, D{l:132,t:10,i:508}, D{l:12,t:0,i:107}, D{l:146,t:0,i:31}, D{l:8,t:11,i:420}, D{l:139,t:11,i:193}, D{l:135,t:0,i:814}, D{l:135,t:11,i:409}, D{l:140,t:0,i:991}, D{l:4,t:0,i:57}, D{l:7,t:0,i:1195}, D{l:7,t:0,i:1438}, D{l:7,t:0,i:1548}, D{l:7,t:0,i:1835}, D{l:7,t:0,i:1904}, D{l:9,t:0,i:757}, D{l:10,t:0,i:604}, D{l:139,t:0,i:519}, D{l:132,t:0,i:540}, D{l:138,t:11,i:308}, D{l:132,t:10,i:533}, D{l:136,t:0,i:608}, D{l:144,t:11,i:65}, D{l:4,t:0,i:1014}, D{l:134,t:0,i:2029}, D{l:4,t:0,i:209}, D{l:7,t:0,i:902}, D{l:5,t:11,i:1002}, D{l:136,t:11,i:745}, D{l:134,t:0,i:2030}, D{l:6,t:0,i:303}, D{l:7,t:0,i:335}, D{l:7,t:0,i:1437}, D{l:7,t:0,i:1668}, D{l:8,t:0,i:553}, D{l:8,t:0,i:652}, D{l:8,t:0,i:656}, D{l:9,t:0,i:558}, D{l:11,t:0,i:743}, D{l:149,t:0,i:18}, D{l:5,t:11,i:575}, D{l:6,t:11,i:354}, D{l:135,t:11,i:701}, D{l:4,t:11,i:239}, D{l:6,t:11,i:477}, D{l:7,t:11,i:1607}, D{l:11,t:11,i:68}, D{l:139,t:11,i:617}, D{l:132,t:0,i:559}, D{l:8,t:0,i:527}, D{l:18,t:0,i:60}, D{l:147,t:0,i:24}, D{l:133,t:10,i:920}, D{l:138,t:0,i:511}, D{l:133,t:0,i:1017}, D{l:133,t:0,i:675}, D{l:138,t:10,i:391}, D{l:11,t:0,i:156}, D{l:135,t:10,i:1952}, D{l:138,t:11,i:369}, D{l:132,t:11,i:367}, D{l:133,t:0,i:709}, D{l:6,t:0,i:698}, D{l:134,t:0,i:887}, D{l:142,t:10,i:126}, D{l:134,t:0,i:1745}, D{l:132,t:10,i:483}, D{l:13,t:11,i:299}, D{l:142,t:11,i:75}, D{l:133,t:0,i:714}, D{l:7,t:0,i:8}, D{l:136,t:0,i:206}, D{l:138,t:10,i:480}, D{l:4,t:11,i:694}, D{l:9,t:10,i:495}, D{l:146,t:10,i:104}, D{l:7,t:11,i:1248}, D{l:11,t:11,i:621}, D{l:139,t:11,i:702}, D{l:140,t:11,i:687}, D{l:132,t:0,i:776}, D{l:139,t:10,i:1009}, D{l:135,t:0,i:1272}, D{l:134,t:0,i:1059}, D{l:8,t:10,i:653}, D{l:13,t:10,i:93}, D{l:147,t:10,i:14}, D{l:135,t:11,i:213}, D{l:136,t:0,i:406}, D{l:133,t:10,i:172}, D{l:132,t:0,i:947}, D{l:8,t:0,i:175}, D{l:10,t:0,i:168}, D{l:138,t:0,i:573}, D{l:132,t:0,i:870}, D{l:6,t:0,i:1567}, D{l:151,t:11,i:28}, D{l:134,t:11,i:472}, D{l:5,t:10,i:260}, D{l:136,t:11,i:132}, D{l:4,t:11,i:751}, D{l:11,t:11,i:390}, D{l:140,t:11,i:32}, D{l:4,t:11,i:409}, D{l:133,t:11,i:78}, D{l:12,t:0,i:554}, D{l:6,t:11,i:473}, D{l:145,t:11,i:105}, D{l:133,t:0,i:784}, D{l:8,t:0,i:908}, D{l:136,t:11,i:306}, D{l:139,t:0,i:882}, D{l:6,t:0,i:358}, D{l:7,t:0,i:1393}, D{l:8,t:0,i:396}, D{l:10,t:0,i:263}, D{l:14,t:0,i:154}, D{l:16,t:0,i:48}, D{l:17,t:0,i:8}, D{l:7,t:11,i:1759}, D{l:8,t:11,i:396}, D{l:10,t:11,i:263}, D{l:14,t:11,i:154}, D{l:16,t:11,i:48}, D{l:145,t:11,i:8}, D{l:13,t:11,i:163}, D{l:13,t:11,i:180}, D{l:18,t:11,i:78}, D{l:148,t:11,i:35}, D{l:14,t:0,i:32}, D{l:18,t:0,i:85}, D{l:20,t:0,i:2}, D{l:152,t:0,i:16}, D{l:7,t:0,i:228}, D{l:10,t:0,i:770}, D{l:8,t:10,i:167}, D{l:8,t:10,i:375}, D{l:9,t:10,i:82}, D{l:9,t:10,i:561}, D{l:138,t:10,i:620}, D{l:132,t:0,i:845}, D{l:9,t:0,i:14}, D{l:9,t:0,i:441}, D{l:10,t:0,i:306}, D{l:139,t:0,i:9}, D{l:11,t:0,i:966}, D{l:12,t:0,i:287}, D{l:13,t:0,i:342}, D{l:13,t:0,i:402}, D{l:15,t:0,i:110}, D{l:15,t:0,i:163}, D{l:8,t:10,i:194}, D{l:136,t:10,i:756}, D{l:134,t:0,i:1578}, D{l:4,t:0,i:967}, D{l:6,t:0,i:1820}, D{l:6,t:0,i:1847}, D{l:140,t:0,i:716}, D{l:136,t:0,i:594}, D{l:7,t:0,i:1428}, D{l:7,t:0,i:1640}, D{l:7,t:0,i:1867}, D{l:9,t:0,i:169}, D{l:9,t:0,i:182}, D{l:9,t:0,i:367}, D{l:9,t:0,i:478}, D{l:9,t:0,i:506}, D{l:9,t:0,i:551}, D{l:9,t:0,i:557}, D{l:9,t:0,i:648}, D{l:9,t:0,i:697}, D{l:9,t:0,i:705}, D{l:9,t:0,i:725}, D{l:9,t:0,i:787}, D{l:9,t:0,i:794}, D{l:10,t:0,i:198}, D{l:10,t:0,i:214}, D{l:10,t:0,i:267}, D{l:10,t:0,i:275}, D{l:10,t:0,i:456}, D{l:10,t:0,i:551}, D{l:10,t:0,i:561}, D{l:10,t:0,i:613}, D{l:10,t:0,i:627}, D{l:10,t:0,i:668}, D{l:10,t:0,i:675}, D{l:10,t:0,i:691}, D{l:10,t:0,i:695}, D{l:10,t:0,i:707}, D{l:10,t:0,i:715}, D{l:11,t:0,i:183}, D{l:11,t:0,i:201}, D{l:11,t:0,i:244}, D{l:11,t:0,i:262}, D{l:11,t:0,i:352}, D{l:11,t:0,i:439}, D{l:11,t:0,i:493}, D{l:11,t:0,i:572}, D{l:11,t:0,i:591}, D{l:11,t:0,i:608}, D{l:11,t:0,i:611}, D{l:11,t:0,i:646}, D{l:11,t:0,i:674}, D{l:11,t:0,i:711}, D{l:11,t:0,i:751}, D{l:11,t:0,i:761}, D{l:11,t:0,i:776}, D{l:11,t:0,i:785}, D{l:11,t:0,i:850}, D{l:11,t:0,i:853}, D{l:11,t:0,i:862}, D{l:11,t:0,i:865}, D{l:11,t:0,i:868}, D{l:11,t:0,i:875}, D{l:11,t:0,i:898}, D{l:11,t:0,i:902}, D{l:11,t:0,i:903}, D{l:11,t:0,i:910}, D{l:11,t:0,i:932}, D{l:11,t:0,i:942}, D{l:11,t:0,i:957}, D{l:11,t:0,i:967}, D{l:11,t:0,i:972}, D{l:12,t:0,i:148}, D{l:12,t:0,i:195}, D{l:12,t:0,i:220}, D{l:12,t:0,i:237}, D{l:12,t:0,i:318}, D{l:12,t:0,i:339}, D{l:12,t:0,i:393}, D{l:12,t:0,i:445}, D{l:12,t:0,i:450}, D{l:12,t:0,i:474}, D{l:12,t:0,i:505}, D{l:12,t:0,i:509}, D{l:12,t:0,i:533}, D{l:12,t:0,i:591}, D{l:12,t:0,i:594}, D{l:12,t:0,i:597}, D{l:12,t:0,i:621}, D{l:12,t:0,i:633}, D{l:12,t:0,i:642}, D{l:13,t:0,i:59}, D{l:13,t:0,i:60}, D{l:13,t:0,i:145}, D{l:13,t:0,i:239}, D{l:13,t:0,i:250}, D{l:13,t:0,i:329}, D{l:13,t:0,i:344}, D{l:13,t:0,i:365}, D{l:13,t:0,i:372}, D{l:13,t:0,i:387}, D{l:13,t:0,i:403}, D{l:13,t:0,i:414}, D{l:13,t:0,i:456}, D{l:13,t:0,i:470}, D{l:13,t:0,i:478}, D{l:13,t:0,i:483}, D{l:13,t:0,i:489}, D{l:14,t:0,i:55}, D{l:14,t:0,i:57}, D{l:14,t:0,i:81}, D{l:14,t:0,i:90}, D{l:14,t:0,i:148}, D{l:14,t:0,i:239}, D{l:14,t:0,i:266}, D{l:14,t:0,i:321}, D{l:14,t:0,i:326}, D{l:14,t:0,i:327}, D{l:14,t:0,i:330}, D{l:14,t:0,i:347}, D{l:14,t:0,i:355}, D{l:14,t:0,i:401}, D{l:14,t:0,i:404}, D{l:14,t:0,i:411}, D{l:14,t:0,i:414}, D{l:14,t:0,i:416}, D{l:14,t:0,i:420}, D{l:15,t:0,i:61}, D{l:15,t:0,i:74}, D{l:15,t:0,i:87}, D{l:15,t:0,i:88}, D{l:15,t:0,i:94}, D{l:15,t:0,i:96}, D{l:15,t:0,i:116}, D{l:15,t:0,i:149}, D{l:15,t:0,i:154}, D{l:16,t:0,i:50}, D{l:16,t:0,i:63}, D{l:16,t:0,i:73}, D{l:17,t:0,i:2}, D{l:17,t:0,i:66}, D{l:17,t:0,i:92}, D{l:17,t:0,i:103}, D{l:17,t:0,i:112}, D{l:17,t:0,i:120}, D{l:18,t:0,i:50}, D{l:18,t:0,i:54}, D{l:18,t:0,i:82}, D{l:18,t:0,i:86}, D{l:18,t:0,i:90}, D{l:18,t:0,i:111}, D{l:18,t:0,i:115}, D{l:18,t:0,i:156}, D{l:19,t:0,i:40}, D{l:19,t:0,i:79}, D{l:20,t:0,i:78}, D{l:21,t:0,i:22}, D{l:135,t:11,i:883}, D{l:5,t:0,i:161}, D{l:135,t:0,i:839}, D{l:4,t:0,i:782}, D{l:13,t:11,i:293}, D{l:142,t:11,i:56}, D{l:133,t:11,i:617}, D{l:139,t:11,i:50}, D{l:135,t:10,i:22}, D{l:145,t:0,i:64}, D{l:5,t:10,i:639}, D{l:7,t:10,i:1249}, D{l:139,t:10,i:896}, D{l:138,t:0,i:998}, D{l:135,t:11,i:2042}, D{l:4,t:11,i:546}, D{l:142,t:11,i:233}, D{l:6,t:0,i:1043}, D{l:134,t:0,i:1574}, D{l:134,t:0,i:1496}, D{l:4,t:10,i:102}, D{l:7,t:10,i:815}, D{l:7,t:10,i:1699}, D{l:139,t:10,i:964}, D{l:12,t:0,i:781}, D{l:142,t:0,i:461}, D{l:4,t:11,i:313}, D{l:133,t:11,i:577}, D{l:6,t:0,i:639}, D{l:6,t:0,i:1114}, D{l:137,t:0,i:817}, D{l:8,t:11,i:184}, D{l:141,t:11,i:433}, D{l:7,t:0,i:1814}, D{l:135,t:11,i:935}, D{l:10,t:0,i:997}, D{l:140,t:0,i:958}, D{l:4,t:0,i:812}, D{l:137,t:11,i:625}, D{l:132,t:10,i:899}, D{l:136,t:10,i:795}, D{l:5,t:11,i:886}, D{l:6,t:11,i:46}, D{l:6,t:11,i:1790}, D{l:7,t:11,i:14}, D{l:7,t:11,i:732}, D{l:7,t:11,i:1654}, D{l:8,t:11,i:95}, D{l:8,t:11,i:327}, D{l:8,t:11,i:616}, D{l:10,t:11,i:598}, D{l:10,t:11,i:769}, D{l:11,t:11,i:134}, D{l:11,t:11,i:747}, D{l:12,t:11,i:378}, D{l:142,t:11,i:97}, D{l:136,t:0,i:139}, D{l:6,t:10,i:52}, D{l:9,t:10,i:104}, D{l:9,t:10,i:559}, D{l:12,t:10,i:308}, D{l:147,t:10,i:87}, D{l:133,t:11,i:1021}, D{l:132,t:10,i:604}, D{l:132,t:10,i:301}, D{l:136,t:10,i:779}, D{l:7,t:0,i:643}, D{l:136,t:0,i:236}, D{l:132,t:11,i:153}, D{l:134,t:0,i:1172}, D{l:147,t:10,i:32}, D{l:133,t:11,i:798}, D{l:6,t:0,i:1338}, D{l:132,t:11,i:587}, D{l:6,t:11,i:598}, D{l:7,t:11,i:42}, D{l:8,t:11,i:695}, D{l:10,t:11,i:212}, D{l:11,t:11,i:158}, D{l:14,t:11,i:196}, D{l:145,t:11,i:85}, D{l:135,t:10,i:508}, D{l:5,t:11,i:957}, D{l:5,t:11,i:1008}, D{l:135,t:11,i:249}, D{l:4,t:11,i:129}, D{l:135,t:11,i:465}, D{l:5,t:0,i:54}, D{l:7,t:11,i:470}, D{l:7,t:11,i:1057}, D{l:7,t:11,i:1201}, D{l:9,t:11,i:755}, D{l:11,t:11,i:906}, D{l:140,t:11,i:527}, D{l:7,t:11,i:908}, D{l:146,t:11,i:7}, D{l:5,t:11,i:148}, D{l:136,t:11,i:450}, D{l:144,t:11,i:1}, D{l:4,t:0,i:256}, D{l:135,t:0,i:1488}, D{l:9,t:0,i:351}, D{l:6,t:10,i:310}, D{l:7,t:10,i:1849}, D{l:8,t:10,i:72}, D{l:8,t:10,i:272}, D{l:8,t:10,i:431}, D{l:9,t:10,i:12}, D{l:10,t:10,i:563}, D{l:10,t:10,i:630}, D{l:10,t:10,i:796}, D{l:10,t:10,i:810}, D{l:11,t:10,i:367}, D{l:11,t:10,i:599}, D{l:11,t:10,i:686}, D{l:140,t:10,i:672}, D{l:6,t:0,i:1885}, D{l:6,t:0,i:1898}, D{l:6,t:0,i:1899}, D{l:140,t:0,i:955}, D{l:4,t:0,i:714}, D{l:133,t:0,i:469}, D{l:6,t:0,i:1270}, D{l:134,t:0,i:1456}, D{l:132,t:0,i:744}, D{l:6,t:0,i:313}, D{l:7,t:10,i:537}, D{l:8,t:10,i:64}, D{l:9,t:10,i:127}, D{l:10,t:10,i:496}, D{l:12,t:10,i:510}, D{l:141,t:10,i:384}, D{l:4,t:11,i:217}, D{l:4,t:10,i:244}, D{l:5,t:11,i:710}, D{l:7,t:10,i:233}, D{l:7,t:11,i:1926}, D{l:9,t:11,i:428}, D{l:9,t:11,i:708}, D{l:10,t:11,i:254}, D{l:10,t:11,i:296}, D{l:10,t:11,i:720}, D{l:11,t:11,i:109}, D{l:11,t:11,i:255}, D{l:12,t:11,i:165}, D{l:12,t:11,i:315}, D{l:13,t:11,i:107}, D{l:13,t:11,i:203}, D{l:14,t:11,i:54}, D{l:14,t:11,i:99}, D{l:14,t:11,i:114}, D{l:14,t:11,i:388}, D{l:16,t:11,i:85}, D{l:17,t:11,i:9}, D{l:17,t:11,i:33}, D{l:20,t:11,i:25}, D{l:20,t:11,i:28}, D{l:20,t:11,i:29}, D{l:21,t:11,i:9}, D{l:21,t:11,i:10}, D{l:21,t:11,i:34}, D{l:150,t:11,i:17}, D{l:138,t:0,i:402}, D{l:7,t:0,i:969}, D{l:146,t:0,i:55}, D{l:8,t:0,i:50}, D{l:137,t:0,i:624}, D{l:134,t:0,i:1355}, D{l:132,t:0,i:572}, D{l:134,t:10,i:1650}, D{l:10,t:10,i:702}, D{l:139,t:10,i:245}, D{l:10,t:0,i:847}, D{l:142,t:0,i:445}, D{l:6,t:0,i:43}, D{l:7,t:0,i:38}, D{l:8,t:0,i:248}, D{l:138,t:0,i:513}, D{l:133,t:0,i:369}, D{l:137,t:10,i:338}, D{l:133,t:0,i:766}, D{l:133,t:0,i:363}, D{l:133,t:10,i:896}, D{l:8,t:11,i:392}, D{l:11,t:11,i:54}, D{l:13,t:11,i:173}, D{l:13,t:11,i:294}, D{l:148,t:11,i:7}, D{l:134,t:0,i:678}, D{l:7,t:11,i:1230}, D{l:136,t:11,i:531}, D{l:6,t:0,i:258}, D{l:140,t:0,i:409}, D{l:5,t:0,i:249}, D{l:148,t:0,i:82}, D{l:7,t:10,i:1117}, D{l:136,t:10,i:539}, D{l:5,t:0,i:393}, D{l:6,t:0,i:378}, D{l:7,t:0,i:1981}, D{l:9,t:0,i:32}, D{l:9,t:0,i:591}, D{l:10,t:0,i:685}, D{l:10,t:0,i:741}, D{l:142,t:0,i:382}, D{l:133,t:0,i:788}, D{l:134,t:0,i:1281}, D{l:134,t:0,i:1295}, D{l:7,t:0,i:1968}, D{l:141,t:0,i:509}, D{l:4,t:0,i:61}, D{l:5,t:0,i:58}, D{l:5,t:0,i:171}, D{l:5,t:0,i:683}, D{l:6,t:0,i:291}, D{l:6,t:0,i:566}, D{l:7,t:0,i:1650}, D{l:11,t:0,i:523}, D{l:12,t:0,i:273}, D{l:12,t:0,i:303}, D{l:15,t:0,i:39}, D{l:143,t:0,i:111}, D{l:6,t:0,i:706}, D{l:134,t:0,i:1283}, D{l:134,t:0,i:589}, D{l:135,t:11,i:1433}, D{l:133,t:11,i:435}, D{l:7,t:0,i:1059}, D{l:13,t:0,i:54}, D{l:5,t:10,i:4}, D{l:5,t:10,i:810}, D{l:6,t:10,i:13}, D{l:6,t:10,i:538}, D{l:6,t:10,i:1690}, D{l:6,t:10,i:1726}, D{l:7,t:10,i:1819}, D{l:8,t:10,i:148}, D{l:8,t:10,i:696}, D{l:8,t:10,i:791}, D{l:12,t:10,i:125}, D{l:143,t:10,i:9}, D{l:135,t:10,i:1268}, D{l:5,t:11,i:85}, D{l:6,t:11,i:419}, D{l:7,t:11,i:134}, D{l:7,t:11,i:305}, D{l:7,t:11,i:361}, D{l:7,t:11,i:1337}, D{l:8,t:11,i:71}, D{l:140,t:11,i:519}, D{l:137,t:0,i:824}, D{l:140,t:11,i:688}, D{l:5,t:11,i:691}, D{l:7,t:11,i:345}, D{l:7,t:10,i:1385}, D{l:9,t:11,i:94}, D{l:11,t:10,i:582}, D{l:11,t:10,i:650}, D{l:11,t:10,i:901}, D{l:11,t:10,i:949}, D{l:12,t:11,i:169}, D{l:12,t:10,i:232}, D{l:12,t:10,i:236}, D{l:13,t:10,i:413}, D{l:13,t:10,i:501}, D{l:146,t:10,i:116}, D{l:4,t:0,i:917}, D{l:133,t:0,i:1005}, D{l:7,t:0,i:1598}, D{l:5,t:11,i:183}, D{l:6,t:11,i:582}, D{l:9,t:11,i:344}, D{l:10,t:11,i:679}, D{l:140,t:11,i:435}, D{l:4,t:10,i:925}, D{l:5,t:10,i:803}, D{l:8,t:10,i:698}, D{l:138,t:10,i:828}, D{l:132,t:0,i:919}, D{l:135,t:11,i:511}, D{l:139,t:10,i:992}, D{l:4,t:0,i:255}, D{l:5,t:0,i:302}, D{l:6,t:0,i:132}, D{l:7,t:0,i:128}, D{l:7,t:0,i:283}, D{l:7,t:0,i:1299}, D{l:10,t:0,i:52}, D{l:10,t:0,i:514}, D{l:11,t:0,i:925}, D{l:13,t:0,i:92}, D{l:142,t:0,i:309}, D{l:134,t:0,i:1369}, D{l:135,t:10,i:1847}, D{l:134,t:0,i:328}, D{l:7,t:11,i:1993}, D{l:136,t:11,i:684}, D{l:133,t:10,i:383}, D{l:137,t:0,i:173}, D{l:134,t:11,i:583}, D{l:134,t:0,i:1411}, D{l:19,t:0,i:65}, D{l:5,t:11,i:704}, D{l:8,t:11,i:357}, D{l:10,t:11,i:745}, D{l:14,t:11,i:426}, D{l:17,t:11,i:94}, D{l:147,t:11,i:57}, D{l:9,t:10,i:660}, D{l:138,t:10,i:347}, D{l:4,t:11,i:179}, D{l:5,t:11,i:198}, D{l:133,t:11,i:697}, D{l:7,t:11,i:347}, D{l:7,t:11,i:971}, D{l:8,t:11,i:181}, D{l:138,t:11,i:711}, D{l:141,t:0,i:442}, D{l:11,t:0,i:842}, D{l:11,t:0,i:924}, D{l:13,t:0,i:317}, D{l:13,t:0,i:370}, D{l:13,t:0,i:469}, D{l:13,t:0,i:471}, D{l:14,t:0,i:397}, D{l:18,t:0,i:69}, D{l:18,t:0,i:145}, D{l:7,t:10,i:572}, D{l:9,t:10,i:592}, D{l:11,t:10,i:680}, D{l:12,t:10,i:356}, D{l:140,t:10,i:550}, D{l:14,t:11,i:19}, D{l:14,t:11,i:28}, D{l:144,t:11,i:29}, D{l:136,t:0,i:534}, D{l:4,t:11,i:243}, D{l:5,t:11,i:203}, D{l:7,t:11,i:19}, D{l:7,t:11,i:71}, D{l:7,t:11,i:113}, D{l:10,t:11,i:405}, D{l:11,t:11,i:357}, D{l:142,t:11,i:240}, D{l:6,t:0,i:210}, D{l:10,t:0,i:845}, D{l:138,t:0,i:862}, D{l:7,t:11,i:1351}, D{l:9,t:11,i:581}, D{l:10,t:11,i:639}, D{l:11,t:11,i:453}, D{l:140,t:11,i:584}, D{l:7,t:11,i:1450}, D{l:139,t:11,i:99}, D{l:10,t:0,i:892}, D{l:12,t:0,i:719}, D{l:144,t:0,i:105}, D{l:4,t:0,i:284}, D{l:6,t:0,i:223}, D{l:134,t:11,i:492}, D{l:5,t:11,i:134}, D{l:6,t:11,i:408}, D{l:6,t:11,i:495}, D{l:135,t:11,i:1593}, D{l:136,t:0,i:529}, D{l:137,t:0,i:807}, D{l:4,t:0,i:218}, D{l:7,t:0,i:526}, D{l:143,t:0,i:137}, D{l:6,t:0,i:1444}, D{l:142,t:11,i:4}, D{l:132,t:11,i:665}, D{l:4,t:0,i:270}, D{l:5,t:0,i:192}, D{l:6,t:0,i:332}, D{l:7,t:0,i:1322}, D{l:4,t:11,i:248}, D{l:7,t:11,i:137}, D{l:137,t:11,i:349}, D{l:140,t:0,i:661}, D{l:7,t:0,i:1517}, D{l:11,t:0,i:597}, D{l:14,t:0,i:76}, D{l:14,t:0,i:335}, D{l:20,t:0,i:33}, D{l:7,t:10,i:748}, D{l:139,t:10,i:700}, D{l:5,t:11,i:371}, D{l:135,t:11,i:563}, D{l:146,t:11,i:57}, D{l:133,t:10,i:127}, D{l:133,t:0,i:418}, D{l:4,t:11,i:374}, D{l:7,t:11,i:547}, D{l:7,t:11,i:1700}, D{l:7,t:11,i:1833}, D{l:139,t:11,i:858}, D{l:6,t:10,i:198}, D{l:140,t:10,i:83}, D{l:7,t:11,i:1812}, D{l:13,t:11,i:259}, D{l:13,t:11,i:356}, D{l:14,t:11,i:242}, D{l:147,t:11,i:114}, D{l:7,t:0,i:379}, D{l:8,t:0,i:481}, D{l:9,t:0,i:377}, D{l:5,t:10,i:276}, D{l:6,t:10,i:55}, D{l:135,t:10,i:1369}, D{l:138,t:11,i:286}, D{l:5,t:0,i:1003}, D{l:6,t:0,i:149}, D{l:6,t:10,i:1752}, D{l:136,t:10,i:726}, D{l:8,t:0,i:262}, D{l:9,t:0,i:627}, D{l:10,t:0,i:18}, D{l:11,t:0,i:214}, D{l:11,t:0,i:404}, D{l:11,t:0,i:457}, D{l:11,t:0,i:780}, D{l:11,t:0,i:913}, D{l:13,t:0,i:401}, D{l:14,t:0,i:200}, D{l:6,t:11,i:1647}, D{l:7,t:11,i:1552}, D{l:7,t:11,i:2010}, D{l:9,t:11,i:494}, D{l:137,t:11,i:509}, D{l:135,t:0,i:742}, D{l:136,t:0,i:304}, D{l:132,t:0,i:142}, D{l:133,t:10,i:764}, D{l:6,t:10,i:309}, D{l:7,t:10,i:331}, D{l:138,t:10,i:550}, D{l:135,t:10,i:1062}, D{l:6,t:11,i:123}, D{l:7,t:11,i:214}, D{l:7,t:10,i:986}, D{l:9,t:11,i:728}, D{l:10,t:11,i:157}, D{l:11,t:11,i:346}, D{l:11,t:11,i:662}, D{l:143,t:11,i:106}, D{l:135,t:10,i:1573}, D{l:7,t:0,i:925}, D{l:137,t:0,i:799}, D{l:4,t:0,i:471}, D{l:5,t:0,i:51}, D{l:6,t:0,i:602}, D{l:8,t:0,i:484}, D{l:138,t:0,i:195}, D{l:136,t:0,i:688}, D{l:132,t:0,i:697}, D{l:6,t:0,i:1169}, D{l:6,t:0,i:1241}, D{l:6,t:10,i:194}, D{l:7,t:10,i:133}, D{l:10,t:10,i:493}, D{l:10,t:10,i:570}, D{l:139,t:10,i:664}, D{l:140,t:0,i:751}, D{l:7,t:0,i:929}, D{l:10,t:0,i:452}, D{l:11,t:0,i:878}, D{l:16,t:0,i:33}, D{l:5,t:10,i:24}, D{l:5,t:10,i:569}, D{l:6,t:10,i:3}, D{l:6,t:10,i:119}, D{l:6,t:10,i:143}, D{l:6,t:10,i:440}, D{l:7,t:10,i:599}, D{l:7,t:10,i:1686}, D{l:7,t:10,i:1854}, D{l:8,t:10,i:424}, D{l:9,t:10,i:43}, D{l:9,t:10,i:584}, D{l:9,t:10,i:760}, D{l:10,t:10,i:328}, D{l:11,t:10,i:159}, D{l:11,t:10,i:253}, D{l:12,t:10,i:487}, D{l:140,t:10,i:531}, D{l:4,t:11,i:707}, D{l:13,t:11,i:106}, D{l:18,t:11,i:49}, D{l:147,t:11,i:41}, D{l:5,t:0,i:221}, D{l:5,t:11,i:588}, D{l:134,t:11,i:393}, D{l:134,t:0,i:1437}, D{l:6,t:11,i:211}, D{l:7,t:11,i:1690}, D{l:11,t:11,i:486}, D{l:140,t:11,i:369}, D{l:5,t:10,i:14}, D{l:5,t:10,i:892}, D{l:6,t:10,i:283}, D{l:7,t:10,i:234}, D{l:136,t:10,i:537}, D{l:4,t:0,i:988}, D{l:136,t:0,i:955}, D{l:135,t:0,i:1251}, D{l:4,t:10,i:126}, D{l:8,t:10,i:635}, D{l:147,t:10,i:34}, D{l:4,t:10,i:316}, D{l:135,t:10,i:1561}, D{l:137,t:10,i:861}, D{l:4,t:10,i:64}, D{l:5,t:10,i:352}, D{l:5,t:10,i:720}, D{l:6,t:10,i:368}, D{l:139,t:10,i:359}, D{l:134,t:0,i:192}, D{l:4,t:0,i:132}, D{l:5,t:0,i:69}, D{l:135,t:0,i:1242}, D{l:7,t:10,i:1577}, D{l:10,t:10,i:304}, D{l:10,t:10,i:549}, D{l:12,t:10,i:365}, D{l:13,t:10,i:220}, D{l:13,t:10,i:240}, D{l:142,t:10,i:33}, D{l:4,t:0,i:111}, D{l:7,t:0,i:865}, D{l:134,t:11,i:219}, D{l:5,t:11,i:582}, D{l:6,t:11,i:1646}, D{l:7,t:11,i:99}, D{l:7,t:11,i:1962}, D{l:7,t:11,i:1986}, D{l:8,t:11,i:515}, D{l:8,t:11,i:773}, D{l:9,t:11,i:23}, D{l:9,t:11,i:491}, D{l:12,t:11,i:620}, D{l:14,t:11,i:52}, D{l:145,t:11,i:50}, D{l:132,t:0,i:767}, D{l:7,t:11,i:568}, D{l:148,t:11,i:21}, D{l:6,t:0,i:42}, D{l:7,t:0,i:1416}, D{l:7,t:0,i:2005}, D{l:8,t:0,i:131}, D{l:8,t:0,i:466}, D{l:9,t:0,i:672}, D{l:13,t:0,i:252}, D{l:20,t:0,i:103}, D{l:133,t:11,i:851}, D{l:135,t:0,i:1050}, D{l:6,t:10,i:175}, D{l:137,t:10,i:289}, D{l:5,t:10,i:432}, D{l:133,t:10,i:913}, D{l:6,t:0,i:44}, D{l:136,t:0,i:368}, D{l:135,t:11,i:784}, D{l:132,t:0,i:570}, D{l:133,t:0,i:120}, D{l:139,t:10,i:595}, D{l:140,t:0,i:29}, D{l:6,t:0,i:227}, D{l:135,t:0,i:1589}, D{l:4,t:11,i:98}, D{l:7,t:11,i:1365}, D{l:9,t:11,i:422}, D{l:9,t:11,i:670}, D{l:10,t:11,i:775}, D{l:11,t:11,i:210}, D{l:13,t:11,i:26}, D{l:13,t:11,i:457}, D{l:141,t:11,i:476}, D{l:140,t:10,i:80}, D{l:5,t:10,i:931}, D{l:134,t:10,i:1698}, D{l:133,t:0,i:522}, D{l:134,t:0,i:1120}, D{l:135,t:0,i:1529}, D{l:12,t:0,i:739}, D{l:14,t:0,i:448}, D{l:142,t:0,i:467}, D{l:11,t:10,i:526}, D{l:11,t:10,i:939}, D{l:141,t:10,i:290}, D{l:5,t:10,i:774}, D{l:6,t:10,i:1637}, D{l:6,t:10,i:1686}, D{l:134,t:10,i:1751}, D{l:6,t:0,i:1667}, D{l:135,t:0,i:2036}, D{l:7,t:10,i:1167}, D{l:11,t:10,i:934}, D{l:13,t:10,i:391}, D{l:145,t:10,i:76}, D{l:137,t:11,i:147}, D{l:6,t:10,i:260}, D{l:7,t:10,i:1484}, D{l:11,t:11,i:821}, D{l:12,t:11,i:110}, D{l:12,t:11,i:153}, D{l:18,t:11,i:41}, D{l:150,t:11,i:19}, D{l:6,t:0,i:511}, D{l:12,t:0,i:132}, D{l:134,t:10,i:573}, D{l:5,t:0,i:568}, D{l:6,t:0,i:138}, D{l:135,t:0,i:1293}, D{l:132,t:0,i:1020}, D{l:8,t:0,i:258}, D{l:9,t:0,i:208}, D{l:137,t:0,i:359}, D{l:4,t:0,i:565}, D{l:8,t:0,i:23}, D{l:136,t:0,i:827}, D{l:134,t:0,i:344}, D{l:4,t:0,i:922}, D{l:5,t:0,i:1023}, D{l:13,t:11,i:477}, D{l:14,t:11,i:120}, D{l:148,t:11,i:61}, D{l:134,t:0,i:240}, D{l:5,t:11,i:209}, D{l:6,t:11,i:30}, D{l:11,t:11,i:56}, D{l:139,t:11,i:305}, D{l:6,t:0,i:171}, D{l:7,t:0,i:1002}, D{l:7,t:0,i:1324}, D{l:9,t:0,i:415}, D{l:14,t:0,i:230}, D{l:18,t:0,i:68}, D{l:4,t:10,i:292}, D{l:4,t:10,i:736}, D{l:5,t:10,i:871}, D{l:6,t:10,i:1689}, D{l:7,t:10,i:1944}, D{l:137,t:10,i:580}, D{l:9,t:11,i:635}, D{l:139,t:11,i:559}, D{l:4,t:11,i:150}, D{l:5,t:11,i:303}, D{l:134,t:11,i:327}, D{l:6,t:10,i:63}, D{l:135,t:10,i:920}, D{l:133,t:10,i:793}, D{l:8,t:11,i:192}, D{l:10,t:11,i:78}, D{l:10,t:11,i:555}, D{l:11,t:11,i:308}, D{l:13,t:11,i:359}, D{l:147,t:11,i:95}, D{l:135,t:11,i:786}, D{l:135,t:11,i:1712}, D{l:136,t:0,i:402}, D{l:6,t:0,i:754}, D{l:6,t:11,i:1638}, D{l:7,t:11,i:79}, D{l:7,t:11,i:496}, D{l:9,t:11,i:138}, D{l:10,t:11,i:336}, D{l:11,t:11,i:12}, D{l:12,t:11,i:412}, D{l:12,t:11,i:440}, D{l:142,t:11,i:305}, D{l:4,t:0,i:716}, D{l:141,t:0,i:31}, D{l:133,t:0,i:982}, D{l:8,t:0,i:691}, D{l:8,t:0,i:731}, D{l:5,t:10,i:67}, D{l:6,t:10,i:62}, D{l:6,t:10,i:374}, D{l:135,t:10,i:1391}, D{l:9,t:10,i:790}, D{l:140,t:10,i:47}, D{l:139,t:11,i:556}, D{l:151,t:11,i:1}, D{l:7,t:11,i:204}, D{l:7,t:11,i:415}, D{l:8,t:11,i:42}, D{l:10,t:11,i:85}, D{l:11,t:11,i:33}, D{l:11,t:11,i:564}, D{l:12,t:11,i:571}, D{l:149,t:11,i:1}, D{l:8,t:0,i:888}, D{l:7,t:11,i:610}, D{l:135,t:11,i:1501}, D{l:4,t:10,i:391}, D{l:135,t:10,i:1169}, D{l:5,t:0,i:847}, D{l:9,t:0,i:840}, D{l:138,t:0,i:803}, D{l:137,t:0,i:823}, D{l:134,t:0,i:785}, D{l:8,t:0,i:152}, D{l:9,t:0,i:53}, D{l:9,t:0,i:268}, D{l:9,t:0,i:901}, D{l:10,t:0,i:518}, D{l:10,t:0,i:829}, D{l:11,t:0,i:188}, D{l:13,t:0,i:74}, D{l:14,t:0,i:46}, D{l:15,t:0,i:17}, D{l:15,t:0,i:33}, D{l:17,t:0,i:40}, D{l:18,t:0,i:36}, D{l:19,t:0,i:20}, D{l:22,t:0,i:1}, D{l:152,t:0,i:2}, D{l:4,t:11,i:3}, D{l:5,t:11,i:247}, D{l:5,t:11,i:644}, D{l:7,t:11,i:744}, D{l:7,t:11,i:1207}, D{l:7,t:11,i:1225}, D{l:7,t:11,i:1909}, D{l:146,t:11,i:147}, D{l:136,t:0,i:532}, D{l:135,t:0,i:681}, D{l:132,t:10,i:271}, D{l:140,t:0,i:314}, D{l:140,t:0,i:677}, D{l:4,t:0,i:684}, D{l:136,t:0,i:384}, D{l:5,t:11,i:285}, D{l:9,t:11,i:67}, D{l:13,t:11,i:473}, D{l:143,t:11,i:82}, D{l:4,t:10,i:253}, D{l:5,t:10,i:544}, D{l:7,t:10,i:300}, D{l:137,t:10,i:340}, D{l:7,t:0,i:110}, D{l:7,t:0,i:447}, D{l:8,t:0,i:290}, D{l:8,t:0,i:591}, D{l:9,t:0,i:382}, D{l:9,t:0,i:649}, D{l:11,t:0,i:71}, D{l:11,t:0,i:155}, D{l:11,t:0,i:313}, D{l:12,t:0,i:5}, D{l:13,t:0,i:325}, D{l:142,t:0,i:287}, D{l:134,t:0,i:1818}, D{l:136,t:0,i:1007}, D{l:138,t:0,i:321}, D{l:7,t:0,i:360}, D{l:7,t:0,i:425}, D{l:9,t:0,i:66}, D{l:9,t:0,i:278}, D{l:138,t:0,i:644}, D{l:133,t:10,i:818}, D{l:5,t:0,i:385}, D{l:5,t:10,i:541}, D{l:6,t:10,i:94}, D{l:6,t:10,i:499}, D{l:7,t:10,i:230}, D{l:139,t:10,i:321}, D{l:4,t:10,i:920}, D{l:5,t:10,i:25}, D{l:5,t:10,i:790}, D{l:6,t:10,i:457}, D{l:7,t:10,i:853}, D{l:136,t:10,i:788}, D{l:4,t:0,i:900}, D{l:133,t:0,i:861}, D{l:5,t:0,i:254}, D{l:7,t:0,i:985}, D{l:136,t:0,i:73}, D{l:7,t:0,i:1959}, D{l:136,t:0,i:683}, D{l:134,t:10,i:1765}, D{l:133,t:10,i:822}, D{l:132,t:10,i:634}, D{l:4,t:11,i:29}, D{l:6,t:11,i:532}, D{l:7,t:11,i:1628}, D{l:7,t:11,i:1648}, D{l:9,t:11,i:303}, D{l:9,t:11,i:350}, D{l:10,t:11,i:433}, D{l:11,t:11,i:97}, D{l:11,t:11,i:557}, D{l:11,t:11,i:745}, D{l:12,t:11,i:289}, D{l:12,t:11,i:335}, D{l:12,t:11,i:348}, D{l:12,t:11,i:606}, D{l:13,t:11,i:116}, D{l:13,t:11,i:233}, D{l:13,t:11,i:466}, D{l:14,t:11,i:181}, D{l:14,t:11,i:209}, D{l:14,t:11,i:232}, D{l:14,t:11,i:236}, D{l:14,t:11,i:300}, D{l:16,t:11,i:41}, D{l:148,t:11,i:97}, D{l:19,t:0,i:86}, D{l:6,t:10,i:36}, D{l:7,t:10,i:658}, D{l:136,t:10,i:454}, D{l:135,t:11,i:1692}, D{l:132,t:0,i:725}, D{l:5,t:11,i:501}, D{l:7,t:11,i:1704}, D{l:9,t:11,i:553}, D{l:11,t:11,i:520}, D{l:12,t:11,i:557}, D{l:141,t:11,i:249}, D{l:134,t:0,i:196}, D{l:133,t:0,i:831}, D{l:136,t:0,i:723}, D{l:7,t:0,i:1897}, D{l:13,t:0,i:80}, D{l:13,t:0,i:437}, D{l:145,t:0,i:74}, D{l:4,t:0,i:992}, D{l:6,t:0,i:627}, D{l:136,t:0,i:994}, D{l:135,t:11,i:1294}, D{l:132,t:10,i:104}, D{l:5,t:0,i:848}, D{l:6,t:0,i:66}, D{l:136,t:0,i:764}, D{l:4,t:0,i:36}, D{l:7,t:0,i:1387}, D{l:10,t:0,i:205}, D{l:139,t:0,i:755}, D{l:6,t:0,i:1046}, D{l:134,t:0,i:1485}, D{l:134,t:0,i:950}, D{l:132,t:0,i:887}, D{l:14,t:0,i:450}, D{l:148,t:0,i:111}, D{l:7,t:0,i:620}, D{l:7,t:0,i:831}, D{l:9,t:10,i:542}, D{l:9,t:10,i:566}, D{l:138,t:10,i:728}, D{l:6,t:0,i:165}, D{l:138,t:0,i:388}, D{l:139,t:10,i:263}, D{l:4,t:0,i:719}, D{l:135,t:0,i:155}, D{l:138,t:10,i:468}, D{l:6,t:11,i:453}, D{l:144,t:11,i:36}, D{l:134,t:11,i:129}, D{l:5,t:0,i:533}, D{l:7,t:0,i:755}, D{l:138,t:0,i:780}, D{l:134,t:0,i:1465}, D{l:4,t:0,i:353}, D{l:6,t:0,i:146}, D{l:6,t:0,i:1789}, D{l:7,t:0,i:427}, D{l:7,t:0,i:990}, D{l:7,t:0,i:1348}, D{l:9,t:0,i:665}, D{l:9,t:0,i:898}, D{l:11,t:0,i:893}, D{l:142,t:0,i:212}, D{l:7,t:10,i:87}, D{l:142,t:10,i:288}, D{l:4,t:0,i:45}, D{l:135,t:0,i:1257}, D{l:12,t:0,i:7}, D{l:7,t:10,i:988}, D{l:7,t:10,i:1939}, D{l:9,t:10,i:64}, D{l:9,t:10,i:502}, D{l:12,t:10,i:34}, D{l:13,t:10,i:12}, D{l:13,t:10,i:234}, D{l:147,t:10,i:77}, D{l:4,t:0,i:607}, D{l:5,t:11,i:60}, D{l:6,t:11,i:504}, D{l:7,t:11,i:614}, D{l:7,t:11,i:1155}, D{l:140,t:11,i:0}, D{l:135,t:10,i:141}, D{l:8,t:11,i:198}, D{l:11,t:11,i:29}, D{l:140,t:11,i:534}, D{l:140,t:0,i:65}, D{l:136,t:0,i:816}, D{l:132,t:10,i:619}, D{l:139,t:0,i:88}, D{l:5,t:10,i:246}, D{l:8,t:10,i:189}, D{l:9,t:10,i:355}, D{l:9,t:10,i:512}, D{l:10,t:10,i:124}, D{l:10,t:10,i:453}, D{l:11,t:10,i:143}, D{l:11,t:10,i:416}, D{l:11,t:10,i:859}, D{l:141,t:10,i:341}, D{l:4,t:11,i:379}, D{l:135,t:11,i:1397}, D{l:4,t:0,i:600}, D{l:137,t:0,i:621}, D{l:133,t:0,i:367}, D{l:134,t:0,i:561}, D{l:6,t:0,i:559}, D{l:134,t:0,i:1691}, D{l:6,t:0,i:585}, D{l:134,t:11,i:585}, D{l:135,t:11,i:1228}, D{l:4,t:11,i:118}, D{l:5,t:10,i:678}, D{l:6,t:11,i:274}, D{l:6,t:11,i:361}, D{l:7,t:11,i:75}, D{l:141,t:11,i:441}, D{l:135,t:11,i:1818}, D{l:137,t:11,i:841}, D{l:5,t:0,i:573}, D{l:6,t:0,i:287}, D{l:7,t:10,i:862}, D{l:7,t:10,i:1886}, D{l:138,t:10,i:179}, D{l:132,t:10,i:517}, D{l:140,t:11,i:693}, D{l:5,t:11,i:314}, D{l:6,t:11,i:221}, D{l:7,t:11,i:419}, D{l:10,t:11,i:650}, D{l:11,t:11,i:396}, D{l:12,t:11,i:156}, D{l:13,t:11,i:369}, D{l:14,t:11,i:333}, D{l:145,t:11,i:47}, D{l:140,t:10,i:540}, D{l:136,t:10,i:667}, D{l:11,t:10,i:403}, D{l:146,t:10,i:83}, D{l:6,t:0,i:672}, D{l:133,t:10,i:761}, D{l:9,t:0,i:157}, D{l:10,t:10,i:131}, D{l:140,t:10,i:72}, D{l:7,t:0,i:714}, D{l:134,t:11,i:460}, D{l:134,t:0,i:456}, D{l:133,t:0,i:925}, D{l:5,t:11,i:682}, D{l:135,t:11,i:1887}, D{l:136,t:11,i:510}, D{l:136,t:11,i:475}, D{l:133,t:11,i:1016}, D{l:9,t:0,i:19}, D{l:7,t:11,i:602}, D{l:8,t:11,i:179}, D{l:10,t:11,i:781}, D{l:140,t:11,i:126}, D{l:6,t:11,i:329}, D{l:138,t:11,i:111}, D{l:6,t:0,i:822}, D{l:134,t:0,i:1473}, D{l:144,t:11,i:86}, D{l:11,t:0,i:113}, D{l:139,t:11,i:113}, D{l:5,t:11,i:821}, D{l:134,t:11,i:1687}, D{l:133,t:10,i:449}, D{l:7,t:0,i:463}, D{l:17,t:0,i:69}, D{l:136,t:10,i:103}, D{l:7,t:10,i:2028}, D{l:138,t:10,i:641}, D{l:6,t:0,i:193}, D{l:7,t:0,i:240}, D{l:7,t:0,i:1682}, D{l:10,t:0,i:51}, D{l:10,t:0,i:640}, D{l:11,t:0,i:410}, D{l:13,t:0,i:82}, D{l:14,t:0,i:247}, D{l:14,t:0,i:331}, D{l:142,t:0,i:377}, D{l:6,t:0,i:471}, D{l:11,t:0,i:411}, D{l:142,t:0,i:2}, D{l:5,t:11,i:71}, D{l:7,t:11,i:1407}, D{l:9,t:11,i:388}, D{l:9,t:11,i:704}, D{l:10,t:11,i:261}, D{l:10,t:11,i:619}, D{l:11,t:11,i:547}, D{l:11,t:11,i:619}, D{l:143,t:11,i:157}, D{l:136,t:0,i:633}, D{l:135,t:0,i:1148}, D{l:6,t:0,i:554}, D{l:7,t:0,i:1392}, D{l:12,t:0,i:129}, D{l:7,t:10,i:1274}, D{l:7,t:10,i:1386}, D{l:7,t:11,i:2008}, D{l:9,t:11,i:337}, D{l:10,t:11,i:517}, D{l:146,t:10,i:87}, D{l:7,t:0,i:803}, D{l:8,t:0,i:542}, D{l:6,t:10,i:187}, D{l:7,t:10,i:1203}, D{l:8,t:10,i:380}, D{l:14,t:10,i:117}, D{l:149,t:10,i:28}, D{l:6,t:10,i:297}, D{l:7,t:10,i:793}, D{l:139,t:10,i:938}, D{l:8,t:0,i:438}, D{l:11,t:0,i:363}, D{l:7,t:10,i:464}, D{l:11,t:10,i:105}, D{l:12,t:10,i:231}, D{l:14,t:10,i:386}, D{l:15,t:10,i:102}, D{l:148,t:10,i:75}, D{l:5,t:11,i:16}, D{l:6,t:11,i:86}, D{l:6,t:11,i:603}, D{l:7,t:11,i:292}, D{l:7,t:11,i:561}, D{l:8,t:11,i:257}, D{l:8,t:11,i:382}, D{l:9,t:11,i:721}, D{l:9,t:11,i:778}, D{l:11,t:11,i:581}, D{l:140,t:11,i:466}, D{l:6,t:0,i:717}, D{l:4,t:11,i:486}, D{l:133,t:11,i:491}, D{l:132,t:0,i:875}, D{l:132,t:11,i:72}, D{l:6,t:11,i:265}, D{l:135,t:11,i:847}, D{l:4,t:0,i:237}, D{l:135,t:0,i:514}, D{l:6,t:0,i:392}, D{l:7,t:0,i:65}, D{l:135,t:0,i:2019}, D{l:140,t:11,i:261}, D{l:135,t:11,i:922}, D{l:137,t:11,i:404}, D{l:12,t:0,i:563}, D{l:14,t:0,i:101}, D{l:18,t:0,i:129}, D{l:7,t:10,i:1010}, D{l:11,t:10,i:733}, D{l:11,t:10,i:759}, D{l:13,t:10,i:34}, D{l:146,t:10,i:45}, D{l:7,t:10,i:1656}, D{l:9,t:10,i:369}, D{l:10,t:10,i:338}, D{l:10,t:10,i:490}, D{l:11,t:10,i:154}, D{l:11,t:10,i:545}, D{l:11,t:10,i:775}, D{l:13,t:10,i:77}, D{l:141,t:10,i:274}, D{l:4,t:0,i:444}, D{l:10,t:0,i:146}, D{l:140,t:0,i:9}, D{l:139,t:11,i:163}, D{l:7,t:0,i:1260}, D{l:135,t:0,i:1790}, D{l:9,t:0,i:222}, D{l:10,t:0,i:43}, D{l:139,t:0,i:900}, D{l:137,t:11,i:234}, D{l:138,t:0,i:971}, D{l:137,t:0,i:761}, D{l:134,t:0,i:699}, D{l:136,t:11,i:434}, D{l:6,t:0,i:1116}, D{l:7,t:0,i:1366}, D{l:5,t:10,i:20}, D{l:6,t:11,i:197}, D{l:6,t:10,i:298}, D{l:7,t:10,i:659}, D{l:8,t:11,i:205}, D{l:137,t:10,i:219}, D{l:132,t:11,i:490}, D{l:11,t:11,i:820}, D{l:150,t:11,i:51}, D{l:7,t:10,i:1440}, D{l:11,t:10,i:854}, D{l:11,t:10,i:872}, D{l:11,t:10,i:921}, D{l:12,t:10,i:551}, D{l:13,t:10,i:472}, D{l:142,t:10,i:367}, D{l:140,t:11,i:13}, D{l:132,t:0,i:829}, D{l:12,t:0,i:242}, D{l:132,t:10,i:439}, D{l:136,t:10,i:669}, D{l:6,t:0,i:593}, D{l:6,t:11,i:452}, D{l:7,t:11,i:312}, D{l:138,t:11,i:219}, D{l:4,t:11,i:333}, D{l:9,t:11,i:176}, D{l:12,t:11,i:353}, D{l:141,t:11,i:187}, D{l:7,t:0,i:36}, D{l:8,t:0,i:201}, D{l:136,t:0,i:605}, D{l:140,t:0,i:224}, D{l:132,t:10,i:233}, D{l:134,t:0,i:1430}, D{l:134,t:0,i:1806}, D{l:4,t:0,i:523}, D{l:133,t:0,i:638}, D{l:6,t:0,i:1889}, D{l:9,t:0,i:958}, D{l:9,t:0,i:971}, D{l:9,t:0,i:976}, D{l:12,t:0,i:796}, D{l:12,t:0,i:799}, D{l:12,t:0,i:808}, D{l:12,t:0,i:835}, D{l:12,t:0,i:836}, D{l:12,t:0,i:914}, D{l:12,t:0,i:946}, D{l:15,t:0,i:216}, D{l:15,t:0,i:232}, D{l:18,t:0,i:183}, D{l:18,t:0,i:187}, D{l:18,t:0,i:194}, D{l:18,t:0,i:212}, D{l:18,t:0,i:232}, D{l:149,t:0,i:49}, D{l:132,t:10,i:482}, D{l:6,t:0,i:827}, D{l:134,t:0,i:1434}, D{l:135,t:10,i:346}, D{l:134,t:0,i:2043}, D{l:6,t:0,i:242}, D{l:7,t:0,i:227}, D{l:7,t:0,i:1581}, D{l:8,t:0,i:104}, D{l:9,t:0,i:113}, D{l:9,t:0,i:220}, D{l:9,t:0,i:427}, D{l:10,t:0,i:136}, D{l:10,t:0,i:239}, D{l:11,t:0,i:579}, D{l:11,t:0,i:1023}, D{l:13,t:0,i:4}, D{l:13,t:0,i:204}, D{l:13,t:0,i:316}, D{l:148,t:0,i:86}, D{l:134,t:11,i:1685}, D{l:7,t:0,i:148}, D{l:8,t:0,i:284}, D{l:141,t:0,i:63}, D{l:142,t:0,i:10}, D{l:135,t:11,i:584}, D{l:134,t:0,i:1249}, D{l:7,t:0,i:861}, D{l:135,t:10,i:334}, D{l:5,t:10,i:795}, D{l:6,t:10,i:1741}, D{l:137,t:11,i:70}, D{l:132,t:0,i:807}, D{l:7,t:11,i:135}, D{l:8,t:11,i:7}, D{l:8,t:11,i:62}, D{l:9,t:11,i:243}, D{l:10,t:11,i:658}, D{l:10,t:11,i:697}, D{l:11,t:11,i:456}, D{l:139,t:11,i:756}, D{l:9,t:11,i:395}, D{l:138,t:11,i:79}, D{l:137,t:11,i:108}, D{l:147,t:0,i:94}, D{l:136,t:0,i:494}, D{l:135,t:11,i:631}, D{l:135,t:10,i:622}, D{l:7,t:0,i:1510}, D{l:135,t:10,i:1750}, D{l:4,t:10,i:203}, D{l:135,t:10,i:1936}, D{l:7,t:11,i:406}, D{l:7,t:11,i:459}, D{l:8,t:11,i:606}, D{l:139,t:11,i:726}, D{l:7,t:0,i:1306}, D{l:8,t:0,i:505}, D{l:9,t:0,i:482}, D{l:10,t:0,i:126}, D{l:11,t:0,i:225}, D{l:12,t:0,i:347}, D{l:12,t:0,i:449}, D{l:13,t:0,i:19}, D{l:14,t:0,i:218}, D{l:142,t:0,i:435}, D{l:5,t:0,i:268}, D{l:10,t:0,i:764}, D{l:12,t:0,i:120}, D{l:13,t:0,i:39}, D{l:145,t:0,i:127}, D{l:142,t:11,i:68}, D{l:11,t:10,i:678}, D{l:140,t:10,i:307}, D{l:12,t:11,i:268}, D{l:12,t:11,i:640}, D{l:142,t:11,i:119}, D{l:135,t:10,i:2044}, D{l:133,t:11,i:612}, D{l:4,t:11,i:372}, D{l:7,t:11,i:482}, D{l:8,t:11,i:158}, D{l:9,t:11,i:602}, D{l:9,t:11,i:615}, D{l:10,t:11,i:245}, D{l:10,t:11,i:678}, D{l:10,t:11,i:744}, D{l:11,t:11,i:248}, D{l:139,t:11,i:806}, D{l:7,t:10,i:311}, D{l:9,t:10,i:308}, D{l:140,t:10,i:255}, D{l:4,t:0,i:384}, D{l:135,t:0,i:1022}, D{l:5,t:11,i:854}, D{l:135,t:11,i:1991}, D{l:135,t:10,i:1266}, D{l:4,t:10,i:400}, D{l:5,t:10,i:267}, D{l:135,t:10,i:232}, D{l:135,t:0,i:1703}, D{l:9,t:0,i:159}, D{l:11,t:0,i:661}, D{l:140,t:0,i:603}, D{l:4,t:0,i:964}, D{l:14,t:0,i:438}, D{l:14,t:0,i:444}, D{l:14,t:0,i:456}, D{l:22,t:0,i:60}, D{l:22,t:0,i:63}, D{l:9,t:11,i:106}, D{l:9,t:11,i:163}, D{l:9,t:11,i:296}, D{l:10,t:11,i:167}, D{l:10,t:11,i:172}, D{l:10,t:11,i:777}, D{l:139,t:11,i:16}, D{l:136,t:0,i:583}, D{l:132,t:0,i:515}, D{l:8,t:0,i:632}, D{l:8,t:0,i:697}, D{l:137,t:0,i:854}, D{l:5,t:11,i:195}, D{l:135,t:11,i:1685}, D{l:6,t:0,i:1123}, D{l:134,t:0,i:1365}, D{l:134,t:11,i:328}, D{l:7,t:11,i:1997}, D{l:8,t:11,i:730}, D{l:139,t:11,i:1006}, D{l:4,t:0,i:136}, D{l:133,t:0,i:551}, D{l:134,t:0,i:1782}, D{l:7,t:0,i:1287}, D{l:9,t:0,i:44}, D{l:10,t:0,i:552}, D{l:10,t:0,i:642}, D{l:11,t:0,i:839}, D{l:12,t:0,i:274}, D{l:12,t:0,i:275}, D{l:12,t:0,i:372}, D{l:13,t:0,i:91}, D{l:142,t:0,i:125}, D{l:5,t:11,i:751}, D{l:11,t:11,i:797}, D{l:140,t:11,i:203}, D{l:133,t:0,i:732}, D{l:7,t:0,i:679}, D{l:8,t:0,i:313}, D{l:4,t:10,i:100}, D{l:135,t:11,i:821}, D{l:10,t:0,i:361}, D{l:142,t:0,i:316}, D{l:134,t:0,i:595}, D{l:6,t:0,i:147}, D{l:7,t:0,i:886}, D{l:9,t:0,i:753}, D{l:138,t:0,i:268}, D{l:5,t:10,i:362}, D{l:5,t:10,i:443}, D{l:6,t:10,i:318}, D{l:7,t:10,i:1019}, D{l:139,t:10,i:623}, D{l:5,t:10,i:463}, D{l:136,t:10,i:296}, D{l:4,t:10,i:454}, D{l:5,t:11,i:950}, D{l:5,t:11,i:994}, D{l:134,t:11,i:351}, D{l:138,t:0,i:137}, D{l:5,t:10,i:48}, D{l:5,t:10,i:404}, D{l:6,t:10,i:557}, D{l:7,t:10,i:458}, D{l:8,t:10,i:597}, D{l:10,t:10,i:455}, D{l:10,t:10,i:606}, D{l:11,t:10,i:49}, D{l:11,t:10,i:548}, D{l:12,t:10,i:476}, D{l:13,t:10,i:18}, D{l:141,t:10,i:450}, D{l:133,t:0,i:414}, D{l:135,t:0,i:1762}, D{l:5,t:11,i:421}, D{l:135,t:11,i:47}, D{l:5,t:10,i:442}, D{l:135,t:10,i:1984}, D{l:134,t:0,i:599}, D{l:134,t:0,i:1749}, D{l:134,t:0,i:1627}, D{l:4,t:0,i:488}, D{l:132,t:11,i:350}, D{l:137,t:11,i:751}, D{l:132,t:0,i:83}, D{l:140,t:0,i:676}, D{l:133,t:11,i:967}, D{l:7,t:0,i:1639}, D{l:5,t:10,i:55}, D{l:140,t:10,i:161}, D{l:4,t:11,i:473}, D{l:7,t:11,i:623}, D{l:8,t:11,i:808}, D{l:9,t:11,i:871}, D{l:9,t:11,i:893}, D{l:11,t:11,i:38}, D{l:11,t:11,i:431}, D{l:12,t:11,i:112}, D{l:12,t:11,i:217}, D{l:12,t:11,i:243}, D{l:12,t:11,i:562}, D{l:12,t:11,i:683}, D{l:13,t:11,i:141}, D{l:13,t:11,i:197}, D{l:13,t:11,i:227}, D{l:13,t:11,i:406}, D{l:13,t:11,i:487}, D{l:14,t:11,i:156}, D{l:14,t:11,i:203}, D{l:14,t:11,i:224}, D{l:14,t:11,i:256}, D{l:18,t:11,i:58}, D{l:150,t:11,i:0}, D{l:133,t:10,i:450}, D{l:7,t:11,i:736}, D{l:139,t:11,i:264}, D{l:134,t:0,i:278}, D{l:4,t:11,i:222}, D{l:7,t:11,i:286}, D{l:136,t:11,i:629}, D{l:135,t:10,i:869}, D{l:140,t:0,i:97}, D{l:144,t:0,i:14}, D{l:134,t:0,i:1085}, D{l:4,t:10,i:213}, D{l:7,t:10,i:223}, D{l:136,t:10,i:80}, D{l:7,t:0,i:388}, D{l:7,t:0,i:644}, D{l:139,t:0,i:781}, D{l:132,t:0,i:849}, D{l:7,t:0,i:229}, D{l:8,t:0,i:59}, D{l:9,t:0,i:190}, D{l:10,t:0,i:378}, D{l:140,t:0,i:191}, D{l:7,t:10,i:381}, D{l:7,t:10,i:806}, D{l:7,t:10,i:820}, D{l:8,t:10,i:354}, D{l:8,t:10,i:437}, D{l:8,t:10,i:787}, D{l:9,t:10,i:657}, D{l:10,t:10,i:58}, D{l:10,t:10,i:339}, D{l:10,t:10,i:749}, D{l:11,t:10,i:914}, D{l:12,t:10,i:162}, D{l:13,t:10,i:75}, D{l:14,t:10,i:106}, D{l:14,t:10,i:198}, D{l:14,t:10,i:320}, D{l:14,t:10,i:413}, D{l:146,t:10,i:43}, D{l:141,t:11,i:306}, D{l:136,t:10,i:747}, D{l:134,t:0,i:1115}, D{l:16,t:0,i:94}, D{l:16,t:0,i:108}, D{l:136,t:11,i:146}, D{l:6,t:0,i:700}, D{l:6,t:0,i:817}, D{l:134,t:0,i:1002}, D{l:133,t:10,i:692}, D{l:4,t:11,i:465}, D{l:135,t:11,i:1663}, D{l:134,t:10,i:191}, D{l:6,t:0,i:1414}, D{l:135,t:11,i:913}, D{l:132,t:0,i:660}, D{l:7,t:0,i:1035}, D{l:138,t:0,i:737}, D{l:6,t:10,i:162}, D{l:7,t:10,i:1960}, D{l:136,t:10,i:831}, D{l:132,t:10,i:706}, D{l:7,t:0,i:690}, D{l:9,t:0,i:217}, D{l:9,t:0,i:587}, D{l:140,t:0,i:521}, D{l:138,t:10,i:426}, D{l:135,t:10,i:1235}, D{l:6,t:11,i:82}, D{l:7,t:11,i:138}, D{l:7,t:11,i:517}, D{l:9,t:11,i:673}, D{l:139,t:11,i:238}, D{l:138,t:0,i:272}, D{l:5,t:11,i:495}, D{l:7,t:11,i:834}, D{l:9,t:11,i:733}, D{l:139,t:11,i:378}, D{l:134,t:0,i:1744}, D{l:132,t:0,i:1011}, D{l:7,t:11,i:828}, D{l:142,t:11,i:116}, D{l:4,t:0,i:733}, D{l:9,t:0,i:194}, D{l:10,t:0,i:92}, D{l:11,t:0,i:198}, D{l:12,t:0,i:84}, D{l:13,t:0,i:128}, D{l:133,t:11,i:559}, D{l:10,t:0,i:57}, D{l:10,t:0,i:277}, D{l:6,t:11,i:21}, D{l:6,t:11,i:1737}, D{l:7,t:11,i:1444}, D{l:136,t:11,i:224}, D{l:4,t:10,i:204}, D{l:137,t:10,i:902}, D{l:136,t:10,i:833}, D{l:11,t:0,i:348}, D{l:12,t:0,i:99}, D{l:18,t:0,i:1}, D{l:18,t:0,i:11}, D{l:19,t:0,i:4}, D{l:7,t:10,i:366}, D{l:9,t:10,i:287}, D{l:12,t:10,i:199}, D{l:12,t:10,i:556}, D{l:140,t:10,i:577}, D{l:6,t:0,i:1981}, D{l:136,t:0,i:936}, D{l:21,t:0,i:33}, D{l:150,t:0,i:40}, D{l:5,t:11,i:519}, D{l:138,t:11,i:204}, D{l:5,t:10,i:356}, D{l:135,t:10,i:224}, D{l:134,t:0,i:775}, D{l:135,t:0,i:306}, D{l:7,t:10,i:630}, D{l:9,t:10,i:567}, D{l:11,t:10,i:150}, D{l:11,t:10,i:444}, D{l:141,t:10,i:119}, D{l:5,t:0,i:979}, D{l:134,t:10,i:539}, D{l:133,t:0,i:611}, D{l:4,t:11,i:402}, D{l:135,t:11,i:1679}, D{l:5,t:0,i:178}, D{l:7,t:11,i:2}, D{l:8,t:11,i:323}, D{l:136,t:11,i:479}, D{l:5,t:11,i:59}, D{l:135,t:11,i:672}, D{l:4,t:0,i:1010}, D{l:6,t:0,i:1969}, D{l:138,t:11,i:237}, D{l:133,t:11,i:412}, D{l:146,t:11,i:34}, D{l:7,t:11,i:1740}, D{l:146,t:11,i:48}, D{l:134,t:0,i:664}, D{l:139,t:10,i:814}, D{l:4,t:11,i:85}, D{l:135,t:11,i:549}, D{l:133,t:11,i:94}, D{l:133,t:11,i:457}, D{l:132,t:0,i:390}, D{l:134,t:0,i:1510}, D{l:4,t:10,i:235}, D{l:135,t:10,i:255}, D{l:4,t:10,i:194}, D{l:5,t:10,i:584}, D{l:6,t:11,i:11}, D{l:6,t:10,i:384}, D{l:7,t:11,i:187}, D{l:7,t:10,i:583}, D{l:10,t:10,i:761}, D{l:11,t:10,i:760}, D{l:139,t:10,i:851}, D{l:4,t:11,i:522}, D{l:139,t:11,i:802}, D{l:135,t:0,i:493}, D{l:10,t:11,i:776}, D{l:13,t:11,i:345}, D{l:142,t:11,i:425}, D{l:146,t:0,i:37}, D{l:4,t:11,i:52}, D{l:135,t:11,i:661}, D{l:134,t:0,i:724}, D{l:134,t:0,i:829}, D{l:133,t:11,i:520}, D{l:133,t:10,i:562}, D{l:4,t:11,i:281}, D{l:5,t:11,i:38}, D{l:7,t:11,i:194}, D{l:7,t:11,i:668}, D{l:7,t:11,i:1893}, D{l:137,t:11,i:397}, D{l:5,t:10,i:191}, D{l:137,t:10,i:271}, D{l:7,t:0,i:1537}, D{l:14,t:0,i:96}, D{l:143,t:0,i:73}, D{l:5,t:0,i:473}, D{l:11,t:0,i:168}, D{l:4,t:10,i:470}, D{l:6,t:10,i:153}, D{l:7,t:10,i:1503}, D{l:7,t:10,i:1923}, D{l:10,t:10,i:701}, D{l:11,t:10,i:132}, D{l:11,t:10,i:227}, D{l:11,t:10,i:320}, D{l:11,t:10,i:436}, D{l:11,t:10,i:525}, D{l:11,t:10,i:855}, D{l:12,t:10,i:41}, D{l:12,t:10,i:286}, D{l:13,t:10,i:103}, D{l:13,t:10,i:284}, D{l:14,t:10,i:255}, D{l:14,t:10,i:262}, D{l:15,t:10,i:117}, D{l:143,t:10,i:127}, D{l:133,t:0,i:105}, D{l:5,t:0,i:438}, D{l:9,t:0,i:694}, D{l:12,t:0,i:627}, D{l:141,t:0,i:210}, D{l:133,t:10,i:327}, D{l:6,t:10,i:552}, D{l:7,t:10,i:1754}, D{l:137,t:10,i:604}, D{l:134,t:0,i:1256}, D{l:152,t:0,i:11}, D{l:5,t:11,i:448}, D{l:11,t:11,i:98}, D{l:139,t:11,i:524}, D{l:7,t:0,i:1626}, D{l:5,t:10,i:80}, D{l:6,t:10,i:405}, D{l:7,t:10,i:403}, D{l:7,t:10,i:1502}, D{l:8,t:10,i:456}, D{l:9,t:10,i:487}, D{l:9,t:10,i:853}, D{l:9,t:10,i:889}, D{l:10,t:10,i:309}, D{l:11,t:10,i:721}, D{l:11,t:10,i:994}, D{l:12,t:10,i:430}, D{l:13,t:10,i:165}, D{l:14,t:11,i:16}, D{l:146,t:11,i:44}, D{l:132,t:0,i:779}, D{l:8,t:0,i:25}, D{l:138,t:0,i:826}, D{l:4,t:10,i:453}, D{l:5,t:10,i:887}, D{l:6,t:10,i:535}, D{l:8,t:10,i:6}, D{l:8,t:10,i:543}, D{l:136,t:10,i:826}, D{l:137,t:11,i:461}, D{l:140,t:11,i:632}, D{l:132,t:0,i:308}, D{l:135,t:0,i:741}, D{l:132,t:0,i:671}, D{l:7,t:0,i:150}, D{l:8,t:0,i:649}, D{l:136,t:0,i:1020}, D{l:9,t:0,i:99}, D{l:6,t:11,i:336}, D{l:8,t:11,i:552}, D{l:9,t:11,i:285}, D{l:10,t:11,i:99}, D{l:139,t:11,i:568}, D{l:134,t:0,i:521}, D{l:5,t:0,i:339}, D{l:14,t:0,i:3}, D{l:15,t:0,i:41}, D{l:15,t:0,i:166}, D{l:147,t:0,i:66}, D{l:6,t:11,i:423}, D{l:7,t:11,i:665}, D{l:7,t:11,i:1210}, D{l:9,t:11,i:218}, D{l:141,t:11,i:222}, D{l:6,t:0,i:543}, D{l:5,t:10,i:101}, D{l:5,t:11,i:256}, D{l:6,t:10,i:88}, D{l:7,t:10,i:1677}, D{l:9,t:10,i:100}, D{l:10,t:10,i:677}, D{l:14,t:10,i:169}, D{l:14,t:10,i:302}, D{l:14,t:10,i:313}, D{l:15,t:10,i:48}, D{l:143,t:10,i:84}, D{l:4,t:10,i:310}, D{l:7,t:10,i:708}, D{l:7,t:10,i:996}, D{l:9,t:10,i:795}, D{l:10,t:10,i:390}, D{l:10,t:10,i:733}, D{l:11,t:10,i:451}, D{l:12,t:10,i:249}, D{l:14,t:10,i:115}, D{l:14,t:10,i:286}, D{l:143,t:10,i:100}, D{l:133,t:10,i:587}, D{l:13,t:11,i:417}, D{l:14,t:11,i:129}, D{l:143,t:11,i:15}, D{l:134,t:0,i:1358}, D{l:136,t:11,i:554}, D{l:132,t:10,i:498}, D{l:7,t:10,i:217}, D{l:8,t:10,i:140}, D{l:138,t:10,i:610}, D{l:135,t:11,i:989}, D{l:135,t:11,i:634}, D{l:6,t:0,i:155}, D{l:140,t:0,i:234}, D{l:135,t:11,i:462}, D{l:132,t:11,i:618}, D{l:134,t:0,i:1628}, D{l:132,t:0,i:766}, D{l:4,t:11,i:339}, D{l:5,t:10,i:905}, D{l:135,t:11,i:259}, D{l:135,t:0,i:829}, D{l:4,t:11,i:759}, D{l:141,t:11,i:169}, D{l:7,t:0,i:1445}, D{l:4,t:10,i:456}, D{l:7,t:10,i:358}, D{l:7,t:10,i:1637}, D{l:8,t:10,i:643}, D{l:139,t:10,i:483}, D{l:5,t:0,i:486}, D{l:135,t:0,i:1349}, D{l:5,t:11,i:688}, D{l:135,t:11,i:712}, D{l:7,t:0,i:1635}, D{l:8,t:0,i:17}, D{l:10,t:0,i:217}, D{l:10,t:0,i:295}, D{l:12,t:0,i:2}, D{l:140,t:11,i:2}, D{l:138,t:0,i:558}, D{l:150,t:10,i:56}, D{l:4,t:11,i:278}, D{l:5,t:11,i:465}, D{l:135,t:11,i:1367}, D{l:136,t:11,i:482}, D{l:133,t:10,i:535}, D{l:6,t:0,i:1362}, D{l:6,t:0,i:1461}, D{l:10,t:11,i:274}, D{l:10,t:11,i:625}, D{l:139,t:11,i:530}, D{l:5,t:0,i:599}, D{l:5,t:11,i:336}, D{l:6,t:11,i:341}, D{l:6,t:11,i:478}, D{l:6,t:11,i:1763}, D{l:136,t:11,i:386}, D{l:7,t:10,i:1748}, D{l:137,t:11,i:151}, D{l:134,t:0,i:1376}, D{l:133,t:10,i:539}, D{l:135,t:11,i:73}, D{l:135,t:11,i:1971}, D{l:139,t:11,i:283}, D{l:9,t:0,i:93}, D{l:139,t:0,i:474}, D{l:6,t:10,i:91}, D{l:135,t:10,i:435}, D{l:6,t:0,i:447}, D{l:5,t:11,i:396}, D{l:134,t:11,i:501}, D{l:4,t:10,i:16}, D{l:5,t:10,i:316}, D{l:5,t:10,i:842}, D{l:6,t:10,i:370}, D{l:6,t:10,i:1778}, D{l:8,t:10,i:166}, D{l:11,t:10,i:812}, D{l:12,t:10,i:206}, D{l:12,t:10,i:351}, D{l:14,t:10,i:418}, D{l:16,t:10,i:15}, D{l:16,t:10,i:34}, D{l:18,t:10,i:3}, D{l:19,t:10,i:3}, D{l:19,t:10,i:7}, D{l:20,t:10,i:4}, D{l:149,t:10,i:21}, D{l:7,t:0,i:577}, D{l:7,t:0,i:1432}, D{l:9,t:0,i:475}, D{l:9,t:0,i:505}, D{l:9,t:0,i:526}, D{l:9,t:0,i:609}, D{l:9,t:0,i:689}, D{l:9,t:0,i:726}, D{l:9,t:0,i:735}, D{l:9,t:0,i:738}, D{l:10,t:0,i:556}, D{l:10,t:0,i:674}, D{l:10,t:0,i:684}, D{l:11,t:0,i:89}, D{l:11,t:0,i:202}, D{l:11,t:0,i:272}, D{l:11,t:0,i:380}, D{l:11,t:0,i:415}, D{l:11,t:0,i:505}, D{l:11,t:0,i:537}, D{l:11,t:0,i:550}, D{l:11,t:0,i:562}, D{l:11,t:0,i:640}, D{l:11,t:0,i:667}, D{l:11,t:0,i:688}, D{l:11,t:0,i:847}, D{l:11,t:0,i:927}, D{l:11,t:0,i:930}, D{l:11,t:0,i:940}, D{l:12,t:0,i:144}, D{l:12,t:0,i:325}, D{l:12,t:0,i:329}, D{l:12,t:0,i:389}, D{l:12,t:0,i:403}, D{l:12,t:0,i:451}, D{l:12,t:0,i:515}, D{l:12,t:0,i:604}, D{l:12,t:0,i:616}, D{l:12,t:0,i:626}, D{l:13,t:0,i:66}, D{l:13,t:0,i:131}, D{l:13,t:0,i:167}, D{l:13,t:0,i:236}, D{l:13,t:0,i:368}, D{l:13,t:0,i:411}, D{l:13,t:0,i:434}, D{l:13,t:0,i:453}, D{l:13,t:0,i:461}, D{l:13,t:0,i:474}, D{l:14,t:0,i:59}, D{l:14,t:0,i:60}, D{l:14,t:0,i:139}, D{l:14,t:0,i:152}, D{l:14,t:0,i:276}, D{l:14,t:0,i:353}, D{l:14,t:0,i:402}, D{l:15,t:0,i:28}, D{l:15,t:0,i:81}, D{l:15,t:0,i:123}, D{l:15,t:0,i:152}, D{l:18,t:0,i:136}, D{l:148,t:0,i:88}, D{l:4,t:11,i:929}, D{l:133,t:11,i:799}, D{l:136,t:11,i:46}, D{l:142,t:0,i:307}, D{l:4,t:0,i:609}, D{l:7,t:0,i:756}, D{l:9,t:0,i:544}, D{l:11,t:0,i:413}, D{l:144,t:0,i:25}, D{l:10,t:0,i:687}, D{l:7,t:10,i:619}, D{l:10,t:10,i:547}, D{l:11,t:10,i:122}, D{l:140,t:10,i:601}, D{l:4,t:0,i:930}, D{l:133,t:0,i:947}, D{l:133,t:0,i:939}, D{l:142,t:0,i:21}, D{l:4,t:11,i:892}, D{l:133,t:11,i:770}, D{l:133,t:0,i:962}, D{l:5,t:0,i:651}, D{l:8,t:0,i:170}, D{l:9,t:0,i:61}, D{l:9,t:0,i:63}, D{l:10,t:0,i:23}, D{l:10,t:0,i:37}, D{l:10,t:0,i:834}, D{l:11,t:0,i:4}, D{l:11,t:0,i:187}, D{l:11,t:0,i:281}, D{l:11,t:0,i:503}, D{l:11,t:0,i:677}, D{l:12,t:0,i:96}, D{l:12,t:0,i:130}, D{l:12,t:0,i:244}, D{l:14,t:0,i:5}, D{l:14,t:0,i:40}, D{l:14,t:0,i:162}, D{l:14,t:0,i:202}, D{l:146,t:0,i:133}, D{l:4,t:0,i:406}, D{l:5,t:0,i:579}, D{l:12,t:0,i:492}, D{l:150,t:0,i:15}, D{l:135,t:11,i:158}, D{l:135,t:0,i:597}, D{l:132,t:0,i:981}, D{l:132,t:10,i:888}, D{l:4,t:10,i:149}, D{l:138,t:10,i:368}, D{l:132,t:0,i:545}, D{l:4,t:10,i:154}, D{l:7,t:10,i:1134}, D{l:136,t:10,i:105}, D{l:135,t:11,i:2001}, D{l:134,t:0,i:1558}, D{l:4,t:10,i:31}, D{l:6,t:10,i:429}, D{l:7,t:10,i:962}, D{l:9,t:10,i:458}, D{l:139,t:10,i:691}, D{l:132,t:10,i:312}, D{l:135,t:10,i:1642}, D{l:6,t:0,i:17}, D{l:6,t:0,i:1304}, D{l:7,t:0,i:16}, D{l:7,t:0,i:1001}, D{l:9,t:0,i:886}, D{l:10,t:0,i:489}, D{l:10,t:0,i:800}, D{l:11,t:0,i:782}, D{l:12,t:0,i:320}, D{l:13,t:0,i:467}, D{l:14,t:0,i:145}, D{l:14,t:0,i:387}, D{l:143,t:0,i:119}, D{l:135,t:0,i:1982}, D{l:17,t:0,i:17}, D{l:7,t:11,i:1461}, D{l:140,t:11,i:91}, D{l:4,t:10,i:236}, D{l:132,t:11,i:602}, D{l:138,t:0,i:907}, D{l:136,t:0,i:110}, D{l:7,t:0,i:272}, D{l:19,t:0,i:53}, D{l:5,t:10,i:836}, D{l:5,t:10,i:857}, D{l:134,t:10,i:1680}, D{l:5,t:0,i:458}, D{l:7,t:11,i:1218}, D{l:136,t:11,i:303}, D{l:7,t:0,i:1983}, D{l:8,t:0,i:0}, D{l:8,t:0,i:171}, D{l:9,t:0,i:120}, D{l:9,t:0,i:732}, D{l:10,t:0,i:473}, D{l:11,t:0,i:656}, D{l:11,t:0,i:998}, D{l:18,t:0,i:0}, D{l:18,t:0,i:2}, D{l:19,t:0,i:21}, D{l:10,t:10,i:68}, D{l:139,t:10,i:494}, D{l:137,t:11,i:662}, D{l:4,t:11,i:13}, D{l:5,t:11,i:567}, D{l:7,t:11,i:1498}, D{l:9,t:11,i:124}, D{l:11,t:11,i:521}, D{l:140,t:11,i:405}, D{l:4,t:10,i:81}, D{l:139,t:10,i:867}, D{l:135,t:11,i:1006}, D{l:7,t:11,i:800}, D{l:7,t:11,i:1783}, D{l:138,t:11,i:12}, D{l:9,t:0,i:295}, D{l:10,t:0,i:443}, D{l:5,t:10,i:282}, D{l:8,t:10,i:650}, D{l:137,t:10,i:907}, D{l:132,t:11,i:735}, D{l:4,t:11,i:170}, D{l:4,t:10,i:775}, D{l:135,t:11,i:323}, D{l:6,t:0,i:1844}, D{l:10,t:0,i:924}, D{l:11,t:11,i:844}, D{l:12,t:11,i:104}, D{l:140,t:11,i:625}, D{l:5,t:11,i:304}, D{l:7,t:11,i:1403}, D{l:140,t:11,i:498}, D{l:134,t:0,i:1232}, D{l:4,t:0,i:519}, D{l:10,t:0,i:70}, D{l:12,t:0,i:26}, D{l:14,t:0,i:17}, D{l:14,t:0,i:178}, D{l:15,t:0,i:34}, D{l:149,t:0,i:12}, D{l:132,t:0,i:993}, D{l:4,t:11,i:148}, D{l:133,t:11,i:742}, D{l:6,t:0,i:31}, D{l:7,t:0,i:491}, D{l:7,t:0,i:530}, D{l:8,t:0,i:592}, D{l:11,t:0,i:53}, D{l:11,t:0,i:779}, D{l:12,t:0,i:167}, D{l:12,t:0,i:411}, D{l:14,t:0,i:14}, D{l:14,t:0,i:136}, D{l:15,t:0,i:72}, D{l:16,t:0,i:17}, D{l:144,t:0,i:72}, D{l:133,t:0,i:907}, D{l:134,t:0,i:733}, D{l:133,t:11,i:111}, D{l:4,t:10,i:71}, D{l:5,t:10,i:376}, D{l:7,t:10,i:119}, D{l:138,t:10,i:665}, D{l:136,t:0,i:55}, D{l:8,t:0,i:430}, D{l:136,t:11,i:430}, D{l:4,t:0,i:208}, D{l:5,t:0,i:106}, D{l:6,t:0,i:531}, D{l:8,t:0,i:408}, D{l:9,t:0,i:188}, D{l:138,t:0,i:572}, D{l:12,t:0,i:56}, D{l:11,t:10,i:827}, D{l:14,t:10,i:34}, D{l:143,t:10,i:148}, D{l:134,t:0,i:1693}, D{l:133,t:11,i:444}, D{l:132,t:10,i:479}, D{l:140,t:0,i:441}, D{l:9,t:0,i:449}, D{l:10,t:0,i:192}, D{l:138,t:0,i:740}, D{l:134,t:0,i:928}, D{l:4,t:0,i:241}, D{l:7,t:10,i:607}, D{l:136,t:10,i:99}, D{l:8,t:11,i:123}, D{l:15,t:11,i:6}, D{l:144,t:11,i:7}, D{l:6,t:11,i:285}, D{l:8,t:11,i:654}, D{l:11,t:11,i:749}, D{l:12,t:11,i:190}, D{l:12,t:11,i:327}, D{l:13,t:11,i:120}, D{l:13,t:11,i:121}, D{l:13,t:11,i:327}, D{l:15,t:11,i:47}, D{l:146,t:11,i:40}, D{l:4,t:10,i:41}, D{l:5,t:10,i:74}, D{l:7,t:10,i:1627}, D{l:11,t:10,i:871}, D{l:140,t:10,i:619}, D{l:7,t:0,i:1525}, D{l:11,t:10,i:329}, D{l:11,t:10,i:965}, D{l:12,t:10,i:241}, D{l:14,t:10,i:354}, D{l:15,t:10,i:22}, D{l:148,t:10,i:63}, D{l:132,t:0,i:259}, D{l:135,t:11,i:183}, D{l:9,t:10,i:209}, D{l:137,t:10,i:300}, D{l:5,t:11,i:937}, D{l:135,t:11,i:100}, D{l:133,t:10,i:98}, D{l:4,t:0,i:173}, D{l:5,t:0,i:312}, D{l:5,t:0,i:512}, D{l:135,t:0,i:1285}, D{l:141,t:0,i:185}, D{l:7,t:0,i:1603}, D{l:7,t:0,i:1691}, D{l:9,t:0,i:464}, D{l:11,t:0,i:195}, D{l:12,t:0,i:279}, D{l:12,t:0,i:448}, D{l:14,t:0,i:11}, D{l:147,t:0,i:102}, D{l:135,t:0,i:1113}, D{l:133,t:10,i:984}, D{l:4,t:0,i:452}, D{l:5,t:0,i:583}, D{l:135,t:0,i:720}, D{l:4,t:0,i:547}, D{l:5,t:0,i:817}, D{l:6,t:0,i:433}, D{l:7,t:0,i:593}, D{l:7,t:0,i:1378}, D{l:8,t:0,i:161}, D{l:9,t:0,i:284}, D{l:10,t:0,i:313}, D{l:139,t:0,i:886}, D{l:8,t:0,i:722}, D{l:4,t:10,i:182}, D{l:6,t:10,i:205}, D{l:135,t:10,i:220}, D{l:150,t:0,i:13}, D{l:4,t:10,i:42}, D{l:9,t:10,i:205}, D{l:9,t:10,i:786}, D{l:138,t:10,i:659}, D{l:6,t:0,i:289}, D{l:7,t:0,i:1670}, D{l:12,t:0,i:57}, D{l:151,t:0,i:4}, D{l:132,t:10,i:635}, D{l:14,t:0,i:43}, D{l:146,t:0,i:21}, D{l:139,t:10,i:533}, D{l:135,t:0,i:1694}, D{l:8,t:0,i:420}, D{l:139,t:0,i:193}, D{l:135,t:0,i:409}, D{l:132,t:10,i:371}, D{l:4,t:10,i:272}, D{l:135,t:10,i:836}, D{l:5,t:10,i:825}, D{l:134,t:10,i:1640}, D{l:5,t:11,i:251}, D{l:5,t:11,i:956}, D{l:8,t:11,i:268}, D{l:9,t:11,i:214}, D{l:146,t:11,i:142}, D{l:138,t:0,i:308}, D{l:6,t:0,i:1863}, D{l:141,t:11,i:37}, D{l:137,t:10,i:879}, D{l:7,t:10,i:317}, D{l:135,t:10,i:569}, D{l:132,t:11,i:294}, D{l:134,t:0,i:790}, D{l:5,t:0,i:1002}, D{l:136,t:0,i:745}, D{l:5,t:11,i:346}, D{l:5,t:11,i:711}, D{l:136,t:11,i:390}, D{l:135,t:0,i:289}, D{l:5,t:0,i:504}, D{l:11,t:0,i:68}, D{l:137,t:10,i:307}, D{l:4,t:0,i:239}, D{l:6,t:0,i:477}, D{l:7,t:0,i:1607}, D{l:139,t:0,i:617}, D{l:149,t:0,i:13}, D{l:133,t:0,i:609}, D{l:133,t:11,i:624}, D{l:5,t:11,i:783}, D{l:7,t:11,i:1998}, D{l:135,t:11,i:2047}, D{l:133,t:10,i:525}, D{l:132,t:0,i:367}, D{l:132,t:11,i:594}, D{l:6,t:0,i:528}, D{l:133,t:10,i:493}, D{l:4,t:10,i:174}, D{l:135,t:10,i:911}, D{l:8,t:10,i:417}, D{l:137,t:10,i:782}, D{l:132,t:0,i:694}, D{l:7,t:0,i:548}, D{l:137,t:0,i:58}, D{l:4,t:10,i:32}, D{l:5,t:10,i:215}, D{l:6,t:10,i:269}, D{l:7,t:10,i:1782}, D{l:7,t:10,i:1892}, D{l:10,t:10,i:16}, D{l:11,t:10,i:822}, D{l:11,t:10,i:954}, D{l:141,t:10,i:481}, D{l:140,t:0,i:687}, D{l:7,t:0,i:1749}, D{l:136,t:10,i:477}, D{l:132,t:11,i:569}, D{l:133,t:10,i:308}, D{l:135,t:10,i:1088}, D{l:4,t:0,i:661}, D{l:138,t:0,i:1004}, D{l:5,t:11,i:37}, D{l:6,t:11,i:39}, D{l:6,t:11,i:451}, D{l:7,t:11,i:218}, D{l:7,t:11,i:667}, D{l:7,t:11,i:1166}, D{l:7,t:11,i:1687}, D{l:8,t:11,i:662}, D{l:144,t:11,i:2}, D{l:9,t:0,i:445}, D{l:12,t:0,i:53}, D{l:13,t:0,i:492}, D{l:5,t:10,i:126}, D{l:8,t:10,i:297}, D{l:9,t:10,i:366}, D{l:140,t:10,i:374}, D{l:7,t:10,i:1551}, D{l:139,t:10,i:361}, D{l:148,t:0,i:74}, D{l:134,t:11,i:508}, D{l:135,t:0,i:213}, D{l:132,t:10,i:175}, D{l:132,t:10,i:685}, D{l:6,t:0,i:760}, D{l:6,t:0,i:834}, D{l:134,t:0,i:1248}, D{l:7,t:11,i:453}, D{l:7,t:11,i:635}, D{l:7,t:11,i:796}, D{l:8,t:11,i:331}, D{l:9,t:11,i:328}, D{l:9,t:11,i:330}, D{l:9,t:11,i:865}, D{l:10,t:11,i:119}, D{l:10,t:11,i:235}, D{l:11,t:11,i:111}, D{l:11,t:11,i:129}, D{l:11,t:11,i:240}, D{l:12,t:11,i:31}, D{l:12,t:11,i:66}, D{l:12,t:11,i:222}, D{l:12,t:11,i:269}, D{l:12,t:11,i:599}, D{l:12,t:11,i:689}, D{l:13,t:11,i:186}, D{l:13,t:11,i:364}, D{l:142,t:11,i:345}, D{l:7,t:0,i:1672}, D{l:139,t:0,i:189}, D{l:133,t:10,i:797}, D{l:133,t:10,i:565}, D{l:6,t:0,i:1548}, D{l:6,t:11,i:98}, D{l:7,t:11,i:585}, D{l:135,t:11,i:702}, D{l:9,t:0,i:968}, D{l:15,t:0,i:192}, D{l:149,t:0,i:56}, D{l:4,t:10,i:252}, D{l:6,t:11,i:37}, D{l:7,t:11,i:299}, D{l:7,t:10,i:1068}, D{l:7,t:11,i:1666}, D{l:8,t:11,i:195}, D{l:8,t:11,i:316}, D{l:9,t:11,i:178}, D{l:9,t:11,i:276}, D{l:9,t:11,i:339}, D{l:9,t:11,i:536}, D{l:10,t:11,i:102}, D{l:10,t:11,i:362}, D{l:10,t:10,i:434}, D{l:10,t:11,i:785}, D{l:11,t:11,i:55}, D{l:11,t:11,i:149}, D{l:11,t:10,i:228}, D{l:11,t:10,i:426}, D{l:11,t:11,i:773}, D{l:13,t:10,i:231}, D{l:13,t:11,i:416}, D{l:13,t:11,i:419}, D{l:14,t:11,i:38}, D{l:14,t:11,i:41}, D{l:14,t:11,i:210}, D{l:18,t:10,i:106}, D{l:148,t:10,i:87}, D{l:4,t:0,i:751}, D{l:11,t:0,i:390}, D{l:140,t:0,i:32}, D{l:4,t:0,i:409}, D{l:133,t:0,i:78}, D{l:11,t:11,i:458}, D{l:12,t:11,i:15}, D{l:140,t:11,i:432}, D{l:7,t:0,i:1602}, D{l:10,t:0,i:257}, D{l:10,t:0,i:698}, D{l:11,t:0,i:544}, D{l:11,t:0,i:585}, D{l:12,t:0,i:212}, D{l:13,t:0,i:307}, D{l:5,t:10,i:231}, D{l:7,t:10,i:601}, D{l:9,t:10,i:277}, D{l:9,t:10,i:674}, D{l:10,t:10,i:178}, D{l:10,t:10,i:418}, D{l:10,t:10,i:509}, D{l:11,t:10,i:531}, D{l:12,t:10,i:113}, D{l:12,t:10,i:475}, D{l:13,t:10,i:99}, D{l:142,t:10,i:428}, D{l:6,t:0,i:473}, D{l:145,t:0,i:105}, D{l:6,t:0,i:1949}, D{l:15,t:0,i:156}, D{l:133,t:11,i:645}, D{l:7,t:10,i:1591}, D{l:144,t:10,i:43}, D{l:135,t:0,i:1779}, D{l:135,t:10,i:1683}, D{l:4,t:11,i:290}, D{l:135,t:11,i:1356}, D{l:134,t:0,i:763}, D{l:6,t:11,i:70}, D{l:7,t:11,i:1292}, D{l:10,t:11,i:762}, D{l:139,t:11,i:288}, D{l:142,t:0,i:29}, D{l:140,t:11,i:428}, D{l:7,t:0,i:883}, D{l:7,t:11,i:131}, D{l:7,t:11,i:422}, D{l:8,t:11,i:210}, D{l:140,t:11,i:573}, D{l:134,t:0,i:488}, D{l:4,t:10,i:399}, D{l:5,t:10,i:119}, D{l:5,t:10,i:494}, D{l:7,t:10,i:751}, D{l:137,t:10,i:556}, D{l:133,t:0,i:617}, D{l:132,t:11,i:936}, D{l:139,t:0,i:50}, D{l:7,t:0,i:1518}, D{l:139,t:0,i:694}, D{l:137,t:0,i:785}, D{l:4,t:0,i:546}, D{l:135,t:0,i:2042}, D{l:7,t:11,i:716}, D{l:13,t:11,i:97}, D{l:141,t:11,i:251}, D{l:132,t:11,i:653}, D{l:145,t:0,i:22}, D{l:134,t:0,i:1016}, D{l:4,t:0,i:313}, D{l:133,t:0,i:577}, D{l:136,t:11,i:657}, D{l:8,t:0,i:184}, D{l:141,t:0,i:433}, D{l:135,t:0,i:935}, D{l:6,t:0,i:720}, D{l:9,t:0,i:114}, D{l:146,t:11,i:80}, D{l:12,t:0,i:186}, D{l:12,t:0,i:292}, D{l:14,t:0,i:100}, D{l:18,t:0,i:70}, D{l:7,t:10,i:594}, D{l:7,t:10,i:851}, D{l:7,t:10,i:1858}, D{l:9,t:10,i:411}, D{l:9,t:10,i:574}, D{l:9,t:10,i:666}, D{l:9,t:10,i:737}, D{l:10,t:10,i:346}, D{l:10,t:10,i:712}, D{l:11,t:10,i:246}, D{l:11,t:10,i:432}, D{l:11,t:10,i:517}, D{l:11,t:10,i:647}, D{l:11,t:10,i:679}, D{l:11,t:10,i:727}, D{l:12,t:10,i:304}, D{l:12,t:10,i:305}, D{l:12,t:10,i:323}, D{l:12,t:10,i:483}, D{l:12,t:10,i:572}, D{l:12,t:10,i:593}, D{l:12,t:10,i:602}, D{l:13,t:10,i:95}, D{l:13,t:10,i:101}, D{l:13,t:10,i:171}, D{l:13,t:10,i:315}, D{l:13,t:10,i:378}, D{l:13,t:10,i:425}, D{l:13,t:10,i:475}, D{l:14,t:10,i:63}, D{l:14,t:10,i:380}, D{l:14,t:10,i:384}, D{l:15,t:10,i:133}, D{l:18,t:10,i:112}, D{l:148,t:10,i:72}, D{l:135,t:10,i:1093}, D{l:135,t:11,i:1836}, D{l:132,t:10,i:679}, D{l:137,t:10,i:203}, D{l:11,t:0,i:402}, D{l:12,t:0,i:109}, D{l:12,t:0,i:431}, D{l:13,t:0,i:179}, D{l:13,t:0,i:206}, D{l:14,t:0,i:217}, D{l:16,t:0,i:3}, D{l:148,t:0,i:53}, D{l:7,t:11,i:1368}, D{l:8,t:11,i:232}, D{l:8,t:11,i:361}, D{l:10,t:11,i:682}, D{l:138,t:11,i:742}, D{l:137,t:10,i:714}, D{l:5,t:0,i:886}, D{l:6,t:0,i:46}, D{l:6,t:0,i:1790}, D{l:7,t:0,i:14}, D{l:7,t:0,i:732}, D{l:7,t:0,i:1654}, D{l:8,t:0,i:95}, D{l:8,t:0,i:327}, D{l:8,t:0,i:616}, D{l:9,t:0,i:892}, D{l:10,t:0,i:598}, D{l:10,t:0,i:769}, D{l:11,t:0,i:134}, D{l:11,t:0,i:747}, D{l:12,t:0,i:378}, D{l:14,t:0,i:97}, D{l:137,t:11,i:534}, D{l:4,t:0,i:969}, D{l:136,t:10,i:825}, D{l:137,t:11,i:27}, D{l:6,t:0,i:727}, D{l:142,t:11,i:12}, D{l:133,t:0,i:1021}, D{l:134,t:0,i:1190}, D{l:134,t:11,i:1657}, D{l:5,t:10,i:143}, D{l:5,t:10,i:769}, D{l:6,t:10,i:1760}, D{l:7,t:10,i:682}, D{l:7,t:10,i:1992}, D{l:136,t:10,i:736}, D{l:132,t:0,i:153}, D{l:135,t:11,i:127}, D{l:133,t:0,i:798}, D{l:132,t:0,i:587}, D{l:6,t:0,i:598}, D{l:7,t:0,i:42}, D{l:8,t:0,i:695}, D{l:10,t:0,i:212}, D{l:11,t:0,i:158}, D{l:14,t:0,i:196}, D{l:145,t:0,i:85}, D{l:133,t:10,i:860}, D{l:6,t:0,i:1929}, D{l:134,t:0,i:1933}, D{l:5,t:0,i:957}, D{l:5,t:0,i:1008}, D{l:9,t:0,i:577}, D{l:12,t:0,i:141}, D{l:6,t:10,i:422}, D{l:7,t:10,i:0}, D{l:7,t:10,i:1544}, D{l:8,t:11,i:364}, D{l:11,t:10,i:990}, D{l:12,t:10,i:453}, D{l:13,t:10,i:47}, D{l:141,t:10,i:266}, D{l:134,t:0,i:1319}, D{l:4,t:0,i:129}, D{l:135,t:0,i:465}, D{l:7,t:0,i:470}, D{l:7,t:0,i:1057}, D{l:7,t:0,i:1201}, D{l:9,t:0,i:755}, D{l:11,t:0,i:906}, D{l:140,t:0,i:527}, D{l:7,t:0,i:908}, D{l:146,t:0,i:7}, D{l:5,t:0,i:148}, D{l:136,t:0,i:450}, D{l:5,t:10,i:515}, D{l:137,t:10,i:131}, D{l:7,t:10,i:1605}, D{l:11,t:10,i:962}, D{l:146,t:10,i:139}, D{l:132,t:10,i:646}, D{l:134,t:0,i:1166}, D{l:4,t:10,i:396}, D{l:7,t:10,i:728}, D{l:9,t:10,i:117}, D{l:13,t:10,i:202}, D{l:148,t:10,i:51}, D{l:6,t:10,i:121}, D{l:6,t:10,i:124}, D{l:6,t:10,i:357}, D{l:7,t:10,i:1138}, D{l:7,t:10,i:1295}, D{l:8,t:10,i:162}, D{l:139,t:10,i:655}, D{l:14,t:0,i:374}, D{l:142,t:11,i:374}, D{l:138,t:0,i:253}, D{l:139,t:0,i:1003}, D{l:5,t:11,i:909}, D{l:9,t:11,i:849}, D{l:138,t:11,i:805}, D{l:133,t:10,i:237}, D{l:7,t:11,i:525}, D{l:7,t:11,i:1579}, D{l:8,t:11,i:497}, D{l:136,t:11,i:573}, D{l:137,t:0,i:46}, D{l:132,t:0,i:879}, D{l:134,t:0,i:806}, D{l:135,t:0,i:1868}, D{l:6,t:0,i:1837}, D{l:134,t:0,i:1846}, D{l:6,t:0,i:730}, D{l:134,t:0,i:881}, D{l:7,t:0,i:965}, D{l:7,t:0,i:1460}, D{l:7,t:0,i:1604}, D{l:7,t:11,i:193}, D{l:7,t:11,i:397}, D{l:7,t:11,i:1105}, D{l:8,t:11,i:124}, D{l:8,t:11,i:619}, D{l:9,t:11,i:305}, D{l:10,t:11,i:264}, D{l:11,t:11,i:40}, D{l:12,t:11,i:349}, D{l:13,t:11,i:134}, D{l:13,t:11,i:295}, D{l:14,t:11,i:155}, D{l:15,t:11,i:120}, D{l:146,t:11,i:105}, D{l:136,t:0,i:506}, D{l:143,t:0,i:10}, D{l:4,t:11,i:262}, D{l:7,t:11,i:342}, D{l:7,t:10,i:571}, D{l:7,t:10,i:1877}, D{l:10,t:10,i:366}, D{l:141,t:11,i:23}, D{l:133,t:11,i:641}, D{l:10,t:0,i:22}, D{l:9,t:10,i:513}, D{l:10,t:10,i:39}, D{l:12,t:10,i:122}, D{l:140,t:10,i:187}, D{l:135,t:11,i:1431}, D{l:150,t:11,i:49}, D{l:4,t:11,i:99}, D{l:6,t:11,i:250}, D{l:6,t:11,i:346}, D{l:8,t:11,i:127}, D{l:138,t:11,i:81}, D{l:6,t:0,i:2014}, D{l:8,t:0,i:928}, D{l:10,t:0,i:960}, D{l:10,t:0,i:979}, D{l:140,t:0,i:996}, D{l:134,t:0,i:296}, D{l:132,t:11,i:915}, D{l:5,t:11,i:75}, D{l:9,t:11,i:517}, D{l:10,t:11,i:470}, D{l:12,t:11,i:155}, D{l:141,t:11,i:224}, D{l:137,t:10,i:873}, D{l:4,t:0,i:854}, D{l:140,t:11,i:18}, D{l:134,t:0,i:587}, D{l:7,t:10,i:107}, D{l:7,t:10,i:838}, D{l:8,t:10,i:550}, D{l:138,t:10,i:401}, D{l:11,t:0,i:636}, D{l:15,t:0,i:145}, D{l:17,t:0,i:34}, D{l:19,t:0,i:50}, D{l:23,t:0,i:20}, D{l:11,t:10,i:588}, D{l:11,t:10,i:864}, D{l:11,t:10,i:968}, D{l:143,t:10,i:160}, D{l:135,t:11,i:216}, D{l:7,t:0,i:982}, D{l:10,t:0,i:32}, D{l:143,t:0,i:56}, D{l:133,t:10,i:768}, D{l:133,t:11,i:954}, D{l:6,t:11,i:304}, D{l:7,t:11,i:1114}, D{l:8,t:11,i:418}, D{l:10,t:11,i:345}, D{l:11,t:11,i:341}, D{l:11,t:11,i:675}, D{l:141,t:11,i:40}, D{l:9,t:11,i:410}, D{l:139,t:11,i:425}, D{l:136,t:0,i:941}, D{l:5,t:0,i:435}, D{l:132,t:10,i:894}, D{l:5,t:0,i:85}, D{l:6,t:0,i:419}, D{l:7,t:0,i:134}, D{l:7,t:0,i:305}, D{l:7,t:0,i:361}, D{l:7,t:0,i:1337}, D{l:8,t:0,i:71}, D{l:140,t:0,i:519}, D{l:140,t:0,i:688}, D{l:135,t:0,i:740}, D{l:5,t:0,i:691}, D{l:7,t:0,i:345}, D{l:9,t:0,i:94}, D{l:140,t:0,i:169}, D{l:5,t:0,i:183}, D{l:6,t:0,i:582}, D{l:10,t:0,i:679}, D{l:140,t:0,i:435}, D{l:134,t:11,i:14}, D{l:6,t:0,i:945}, D{l:135,t:0,i:511}, D{l:134,t:11,i:1708}, D{l:5,t:11,i:113}, D{l:6,t:11,i:243}, D{l:7,t:11,i:1865}, D{l:11,t:11,i:161}, D{l:16,t:11,i:37}, D{l:145,t:11,i:99}, D{l:132,t:11,i:274}, D{l:137,t:0,i:539}, D{l:7,t:0,i:1993}, D{l:8,t:0,i:684}, D{l:134,t:10,i:272}, D{l:6,t:0,i:659}, D{l:134,t:0,i:982}, D{l:4,t:10,i:9}, D{l:5,t:10,i:128}, D{l:7,t:10,i:368}, D{l:11,t:10,i:480}, D{l:148,t:10,i:3}, D{l:134,t:0,i:583}, D{l:132,t:0,i:803}, D{l:133,t:0,i:704}, D{l:4,t:0,i:179}, D{l:5,t:0,i:198}, D{l:133,t:0,i:697}, D{l:7,t:0,i:347}, D{l:7,t:0,i:971}, D{l:8,t:0,i:181}, D{l:10,t:0,i:711}, D{l:135,t:11,i:166}, D{l:136,t:10,i:682}, D{l:4,t:10,i:2}, D{l:7,t:10,i:545}, D{l:7,t:10,i:894}, D{l:136,t:11,i:521}, D{l:135,t:0,i:481}, D{l:132,t:0,i:243}, D{l:5,t:0,i:203}, D{l:7,t:0,i:19}, D{l:7,t:0,i:71}, D{l:7,t:0,i:113}, D{l:10,t:0,i:405}, D{l:11,t:0,i:357}, D{l:142,t:0,i:240}, D{l:5,t:11,i:725}, D{l:5,t:11,i:727}, D{l:135,t:11,i:1811}, D{l:6,t:0,i:826}, D{l:137,t:11,i:304}, D{l:7,t:0,i:1450}, D{l:139,t:0,i:99}, D{l:133,t:11,i:654}, D{l:134,t:0,i:492}, D{l:5,t:0,i:134}, D{l:6,t:0,i:408}, D{l:6,t:0,i:495}, D{l:7,t:0,i:1593}, D{l:6,t:11,i:273}, D{l:10,t:11,i:188}, D{l:13,t:11,i:377}, D{l:146,t:11,i:77}, D{l:9,t:10,i:769}, D{l:140,t:10,i:185}, D{l:135,t:11,i:410}, D{l:142,t:0,i:4}, D{l:4,t:0,i:665}, D{l:134,t:11,i:1785}, D{l:4,t:0,i:248}, D{l:7,t:0,i:137}, D{l:137,t:0,i:349}, D{l:5,t:10,i:530}, D{l:142,t:10,i:113}, D{l:7,t:0,i:1270}, D{l:139,t:0,i:612}, D{l:132,t:11,i:780}, D{l:5,t:0,i:371}, D{l:135,t:0,i:563}, D{l:135,t:0,i:826}, D{l:6,t:0,i:1535}, D{l:23,t:0,i:21}, D{l:151,t:0,i:23}, D{l:4,t:0,i:374}, D{l:7,t:0,i:547}, D{l:7,t:0,i:1700}, D{l:7,t:0,i:1833}, D{l:139,t:0,i:858}, D{l:133,t:10,i:556}, D{l:7,t:11,i:612}, D{l:8,t:11,i:545}, D{l:8,t:11,i:568}, D{l:8,t:11,i:642}, D{l:9,t:11,i:717}, D{l:10,t:11,i:541}, D{l:10,t:11,i:763}, D{l:11,t:11,i:449}, D{l:12,t:11,i:489}, D{l:13,t:11,i:153}, D{l:13,t:11,i:296}, D{l:14,t:11,i:138}, D{l:14,t:11,i:392}, D{l:15,t:11,i:50}, D{l:16,t:11,i:6}, D{l:16,t:11,i:12}, D{l:148,t:11,i:9}, D{l:9,t:0,i:311}, D{l:141,t:0,i:42}, D{l:8,t:10,i:16}, D{l:140,t:10,i:568}, D{l:6,t:0,i:1968}, D{l:6,t:0,i:2027}, D{l:138,t:0,i:991}, D{l:6,t:0,i:1647}, D{l:7,t:0,i:1552}, D{l:7,t:0,i:2010}, D{l:9,t:0,i:494}, D{l:137,t:0,i:509}, D{l:133,t:11,i:948}, D{l:6,t:10,i:186}, D{l:137,t:10,i:426}, D{l:134,t:0,i:769}, D{l:134,t:0,i:642}, D{l:132,t:10,i:585}, D{l:6,t:0,i:123}, D{l:7,t:0,i:214}, D{l:9,t:0,i:728}, D{l:10,t:0,i:157}, D{l:11,t:0,i:346}, D{l:11,t:0,i:662}, D{l:143,t:0,i:106}, D{l:142,t:11,i:381}, D{l:135,t:0,i:1435}, D{l:4,t:11,i:532}, D{l:5,t:11,i:706}, D{l:135,t:11,i:662}, D{l:5,t:11,i:837}, D{l:134,t:11,i:1651}, D{l:4,t:10,i:93}, D{l:5,t:10,i:252}, D{l:6,t:10,i:229}, D{l:7,t:10,i:291}, D{l:9,t:10,i:550}, D{l:139,t:10,i:644}, D{l:148,t:0,i:79}, D{l:137,t:10,i:749}, D{l:134,t:0,i:1425}, D{l:137,t:10,i:162}, D{l:4,t:11,i:362}, D{l:7,t:11,i:52}, D{l:7,t:11,i:303}, D{l:140,t:11,i:166}, D{l:132,t:10,i:381}, D{l:4,t:11,i:330}, D{l:7,t:11,i:933}, D{l:7,t:11,i:2012}, D{l:136,t:11,i:292}, D{l:135,t:11,i:767}, D{l:4,t:0,i:707}, D{l:5,t:0,i:588}, D{l:6,t:0,i:393}, D{l:13,t:0,i:106}, D{l:18,t:0,i:49}, D{l:147,t:0,i:41}, D{l:6,t:0,i:211}, D{l:7,t:0,i:1690}, D{l:11,t:0,i:486}, D{l:140,t:0,i:369}, D{l:137,t:11,i:883}, D{l:4,t:11,i:703}, D{l:135,t:11,i:207}, D{l:4,t:0,i:187}, D{l:5,t:0,i:184}, D{l:5,t:0,i:690}, D{l:7,t:0,i:1869}, D{l:10,t:0,i:756}, D{l:139,t:0,i:783}, D{l:132,t:11,i:571}, D{l:134,t:0,i:1382}, D{l:5,t:0,i:175}, D{l:6,t:10,i:77}, D{l:6,t:10,i:157}, D{l:7,t:10,i:974}, D{l:7,t:10,i:1301}, D{l:7,t:10,i:1339}, D{l:7,t:10,i:1490}, D{l:7,t:10,i:1873}, D{l:137,t:10,i:628}, D{l:134,t:0,i:1493}, D{l:5,t:11,i:873}, D{l:133,t:11,i:960}, D{l:134,t:0,i:1007}, D{l:12,t:11,i:93}, D{l:12,t:11,i:501}, D{l:13,t:11,i:362}, D{l:14,t:11,i:151}, D{l:15,t:11,i:40}, D{l:15,t:11,i:59}, D{l:16,t:11,i:46}, D{l:17,t:11,i:25}, D{l:18,t:11,i:14}, D{l:18,t:11,i:134}, D{l:19,t:11,i:25}, D{l:19,t:11,i:69}, D{l:20,t:11,i:16}, D{l:20,t:11,i:19}, D{l:20,t:11,i:66}, D{l:21,t:11,i:23}, D{l:21,t:11,i:25}, D{l:150,t:11,i:42}, D{l:11,t:10,i:919}, D{l:141,t:10,i:409}, D{l:134,t:0,i:219}, D{l:5,t:0,i:582}, D{l:6,t:0,i:1646}, D{l:7,t:0,i:99}, D{l:7,t:0,i:1962}, D{l:7,t:0,i:1986}, D{l:8,t:0,i:515}, D{l:8,t:0,i:773}, D{l:9,t:0,i:23}, D{l:9,t:0,i:491}, D{l:12,t:0,i:620}, D{l:142,t:0,i:93}, D{l:133,t:0,i:851}, D{l:5,t:11,i:33}, D{l:134,t:11,i:470}, D{l:135,t:11,i:1291}, D{l:134,t:0,i:1278}, D{l:135,t:11,i:1882}, D{l:135,t:10,i:1489}, D{l:132,t:0,i:1000}, D{l:138,t:0,i:982}, D{l:8,t:0,i:762}, D{l:8,t:0,i:812}, D{l:137,t:0,i:910}, D{l:6,t:11,i:47}, D{l:7,t:11,i:90}, D{l:7,t:11,i:664}, D{l:7,t:11,i:830}, D{l:7,t:11,i:1380}, D{l:7,t:11,i:2025}, D{l:8,t:11,i:448}, D{l:136,t:11,i:828}, D{l:4,t:0,i:98}, D{l:4,t:0,i:940}, D{l:6,t:0,i:1819}, D{l:6,t:0,i:1834}, D{l:6,t:0,i:1841}, D{l:7,t:0,i:1365}, D{l:8,t:0,i:859}, D{l:8,t:0,i:897}, D{l:8,t:0,i:918}, D{l:9,t:0,i:422}, D{l:9,t:0,i:670}, D{l:10,t:0,i:775}, D{l:10,t:0,i:894}, D{l:10,t:0,i:909}, D{l:10,t:0,i:910}, D{l:10,t:0,i:935}, D{l:11,t:0,i:210}, D{l:12,t:0,i:750}, D{l:12,t:0,i:755}, D{l:13,t:0,i:26}, D{l:13,t:0,i:457}, D{l:13,t:0,i:476}, D{l:16,t:0,i:100}, D{l:16,t:0,i:109}, D{l:18,t:0,i:173}, D{l:18,t:0,i:175}, D{l:8,t:10,i:398}, D{l:9,t:10,i:681}, D{l:139,t:10,i:632}, D{l:9,t:11,i:417}, D{l:137,t:11,i:493}, D{l:136,t:10,i:645}, D{l:138,t:0,i:906}, D{l:134,t:0,i:1730}, D{l:134,t:10,i:20}, D{l:133,t:11,i:1019}, D{l:134,t:0,i:1185}, D{l:10,t:0,i:40}, D{l:136,t:10,i:769}, D{l:9,t:0,i:147}, D{l:134,t:11,i:208}, D{l:140,t:0,i:650}, D{l:5,t:0,i:209}, D{l:6,t:0,i:30}, D{l:11,t:0,i:56}, D{l:139,t:0,i:305}, D{l:132,t:0,i:553}, D{l:138,t:11,i:344}, D{l:6,t:11,i:68}, D{l:7,t:11,i:398}, D{l:7,t:11,i:448}, D{l:7,t:11,i:1629}, D{l:7,t:11,i:1813}, D{l:8,t:11,i:387}, D{l:8,t:11,i:442}, D{l:9,t:11,i:710}, D{l:10,t:11,i:282}, D{l:138,t:11,i:722}, D{l:5,t:0,i:597}, D{l:14,t:0,i:20}, D{l:142,t:11,i:20}, D{l:135,t:0,i:1614}, D{l:135,t:10,i:1757}, D{l:4,t:0,i:150}, D{l:5,t:0,i:303}, D{l:6,t:0,i:327}, D{l:135,t:10,i:937}, D{l:16,t:0,i:49}, D{l:7,t:10,i:1652}, D{l:144,t:11,i:49}, D{l:8,t:0,i:192}, D{l:10,t:0,i:78}, D{l:141,t:0,i:359}, D{l:135,t:0,i:786}, D{l:143,t:0,i:134}, D{l:6,t:0,i:1638}, D{l:7,t:0,i:79}, D{l:7,t:0,i:496}, D{l:9,t:0,i:138}, D{l:10,t:0,i:336}, D{l:11,t:0,i:12}, D{l:12,t:0,i:412}, D{l:12,t:0,i:440}, D{l:142,t:0,i:305}, D{l:136,t:11,i:491}, D{l:4,t:10,i:579}, D{l:5,t:10,i:226}, D{l:5,t:10,i:323}, D{l:135,t:10,i:960}, D{l:7,t:0,i:204}, D{l:7,t:0,i:415}, D{l:8,t:0,i:42}, D{l:10,t:0,i:85}, D{l:139,t:0,i:564}, D{l:132,t:0,i:614}, D{l:4,t:11,i:403}, D{l:5,t:11,i:441}, D{l:7,t:11,i:450}, D{l:11,t:11,i:101}, D{l:12,t:11,i:193}, D{l:141,t:11,i:430}, D{l:135,t:11,i:1927}, D{l:135,t:11,i:1330}, D{l:4,t:0,i:3}, D{l:5,t:0,i:247}, D{l:5,t:0,i:644}, D{l:7,t:0,i:744}, D{l:7,t:0,i:1207}, D{l:7,t:0,i:1225}, D{l:7,t:0,i:1909}, D{l:146,t:0,i:147}, D{l:136,t:0,i:942}, D{l:4,t:0,i:1019}, D{l:134,t:0,i:2023}, D{l:5,t:11,i:679}, D{l:133,t:10,i:973}, D{l:5,t:0,i:285}, D{l:9,t:0,i:67}, D{l:13,t:0,i:473}, D{l:143,t:0,i:82}, D{l:7,t:11,i:328}, D{l:137,t:11,i:326}, D{l:151,t:0,i:8}, D{l:6,t:10,i:135}, D{l:135,t:10,i:1176}, D{l:135,t:11,i:1128}, D{l:134,t:0,i:1309}, D{l:135,t:11,i:1796}, D{l:135,t:10,i:314}, D{l:4,t:11,i:574}, D{l:7,t:11,i:350}, D{l:7,t:11,i:1024}, D{l:8,t:11,i:338}, D{l:9,t:11,i:677}, D{l:10,t:11,i:808}, D{l:139,t:11,i:508}, D{l:7,t:11,i:818}, D{l:17,t:11,i:14}, D{l:17,t:11,i:45}, D{l:18,t:11,i:75}, D{l:148,t:11,i:18}, D{l:146,t:10,i:4}, D{l:135,t:11,i:1081}, D{l:4,t:0,i:29}, D{l:6,t:0,i:532}, D{l:7,t:0,i:1628}, D{l:7,t:0,i:1648}, D{l:9,t:0,i:350}, D{l:10,t:0,i:433}, D{l:11,t:0,i:97}, D{l:11,t:0,i:557}, D{l:11,t:0,i:745}, D{l:12,t:0,i:289}, D{l:12,t:0,i:335}, D{l:12,t:0,i:348}, D{l:12,t:0,i:606}, D{l:13,t:0,i:116}, D{l:13,t:0,i:233}, D{l:13,t:0,i:466}, D{l:14,t:0,i:181}, D{l:14,t:0,i:209}, D{l:14,t:0,i:232}, D{l:14,t:0,i:236}, D{l:14,t:0,i:300}, D{l:16,t:0,i:41}, D{l:148,t:0,i:97}, D{l:7,t:0,i:318}, D{l:6,t:10,i:281}, D{l:8,t:10,i:282}, D{l:8,t:10,i:480}, D{l:8,t:10,i:499}, D{l:9,t:10,i:198}, D{l:10,t:10,i:143}, D{l:10,t:10,i:169}, D{l:10,t:10,i:211}, D{l:10,t:10,i:417}, D{l:10,t:10,i:574}, D{l:11,t:10,i:147}, D{l:11,t:10,i:395}, D{l:12,t:10,i:75}, D{l:12,t:10,i:407}, D{l:12,t:10,i:608}, D{l:13,t:10,i:500}, D{l:142,t:10,i:251}, D{l:135,t:11,i:1676}, D{l:135,t:11,i:2037}, D{l:135,t:0,i:1692}, D{l:5,t:0,i:501}, D{l:7,t:0,i:1704}, D{l:9,t:0,i:553}, D{l:11,t:0,i:520}, D{l:12,t:0,i:557}, D{l:141,t:0,i:249}, D{l:6,t:0,i:1527}, D{l:14,t:0,i:324}, D{l:15,t:0,i:55}, D{l:15,t:0,i:80}, D{l:14,t:11,i:324}, D{l:15,t:11,i:55}, D{l:143,t:11,i:80}, D{l:135,t:10,i:1776}, D{l:8,t:0,i:988}, D{l:137,t:11,i:297}, D{l:132,t:10,i:419}, D{l:142,t:0,i:223}, D{l:139,t:11,i:234}, D{l:7,t:0,i:1123}, D{l:12,t:0,i:508}, D{l:14,t:0,i:102}, D{l:14,t:0,i:226}, D{l:144,t:0,i:57}, D{l:4,t:10,i:138}, D{l:7,t:10,i:1012}, D{l:7,t:10,i:1280}, D{l:137,t:10,i:76}, D{l:7,t:0,i:1764}, D{l:5,t:10,i:29}, D{l:140,t:10,i:638}, D{l:134,t:0,i:2015}, D{l:134,t:0,i:1599}, D{l:138,t:11,i:56}, D{l:6,t:11,i:306}, D{l:7,t:11,i:1140}, D{l:7,t:11,i:1340}, D{l:8,t:11,i:133}, D{l:138,t:11,i:449}, D{l:139,t:11,i:1011}, D{l:6,t:10,i:1710}, D{l:135,t:10,i:2038}, D{l:7,t:11,i:1763}, D{l:140,t:11,i:310}, D{l:6,t:0,i:129}, D{l:4,t:10,i:17}, D{l:5,t:10,i:23}, D{l:7,t:10,i:995}, D{l:11,t:10,i:383}, D{l:11,t:10,i:437}, D{l:12,t:10,i:460}, D{l:140,t:10,i:532}, D{l:5,t:11,i:329}, D{l:136,t:11,i:260}, D{l:133,t:10,i:862}, D{l:132,t:0,i:534}, D{l:6,t:0,i:811}, D{l:135,t:0,i:626}, D{l:132,t:11,i:657}, D{l:4,t:0,i:25}, D{l:5,t:0,i:60}, D{l:6,t:0,i:504}, D{l:7,t:0,i:614}, D{l:7,t:0,i:1155}, D{l:12,t:0,i:0}, D{l:152,t:11,i:7}, D{l:7,t:0,i:1248}, D{l:11,t:0,i:621}, D{l:139,t:0,i:702}, D{l:137,t:0,i:321}, D{l:8,t:10,i:70}, D{l:12,t:10,i:171}, D{l:141,t:10,i:272}, D{l:10,t:10,i:233}, D{l:139,t:10,i:76}, D{l:4,t:0,i:379}, D{l:7,t:0,i:1397}, D{l:134,t:10,i:442}, D{l:5,t:11,i:66}, D{l:7,t:11,i:1896}, D{l:136,t:11,i:288}, D{l:134,t:11,i:1643}, D{l:134,t:10,i:1709}, D{l:4,t:11,i:21}, D{l:5,t:11,i:91}, D{l:5,t:11,i:570}, D{l:5,t:11,i:648}, D{l:5,t:11,i:750}, D{l:5,t:11,i:781}, D{l:6,t:11,i:54}, D{l:6,t:11,i:112}, D{l:6,t:11,i:402}, D{l:6,t:11,i:1732}, D{l:7,t:11,i:315}, D{l:7,t:11,i:749}, D{l:7,t:11,i:1347}, D{l:7,t:11,i:1900}, D{l:9,t:11,i:78}, D{l:9,t:11,i:508}, D{l:10,t:11,i:611}, D{l:11,t:11,i:510}, D{l:11,t:11,i:728}, D{l:13,t:11,i:36}, D{l:14,t:11,i:39}, D{l:16,t:11,i:83}, D{l:17,t:11,i:124}, D{l:148,t:11,i:30}, D{l:4,t:0,i:118}, D{l:6,t:0,i:274}, D{l:6,t:0,i:361}, D{l:7,t:0,i:75}, D{l:141,t:0,i:441}, D{l:10,t:11,i:322}, D{l:10,t:11,i:719}, D{l:139,t:11,i:407}, D{l:147,t:10,i:119}, D{l:12,t:11,i:549}, D{l:14,t:11,i:67}, D{l:147,t:11,i:60}, D{l:11,t:10,i:69}, D{l:12,t:10,i:105}, D{l:12,t:10,i:117}, D{l:13,t:10,i:213}, D{l:14,t:10,i:13}, D{l:14,t:10,i:62}, D{l:14,t:10,i:177}, D{l:14,t:10,i:421}, D{l:15,t:10,i:19}, D{l:146,t:10,i:141}, D{l:9,t:0,i:841}, D{l:137,t:10,i:309}, D{l:7,t:10,i:608}, D{l:7,t:10,i:976}, D{l:8,t:11,i:125}, D{l:8,t:11,i:369}, D{l:8,t:11,i:524}, D{l:9,t:10,i:146}, D{l:10,t:10,i:206}, D{l:10,t:11,i:486}, D{l:10,t:10,i:596}, D{l:11,t:11,i:13}, D{l:11,t:11,i:381}, D{l:11,t:11,i:736}, D{l:11,t:11,i:766}, D{l:11,t:11,i:845}, D{l:13,t:11,i:114}, D{l:13,t:10,i:218}, D{l:13,t:11,i:292}, D{l:14,t:11,i:47}, D{l:142,t:10,i:153}, D{l:12,t:0,i:693}, D{l:135,t:11,i:759}, D{l:5,t:0,i:314}, D{l:6,t:0,i:221}, D{l:7,t:0,i:419}, D{l:10,t:0,i:650}, D{l:11,t:0,i:396}, D{l:12,t:0,i:156}, D{l:13,t:0,i:369}, D{l:14,t:0,i:333}, D{l:145,t:0,i:47}, D{l:6,t:11,i:1684}, D{l:6,t:11,i:1731}, D{l:7,t:11,i:356}, D{l:7,t:11,i:1932}, D{l:8,t:11,i:54}, D{l:8,t:11,i:221}, D{l:9,t:11,i:225}, D{l:9,t:11,i:356}, D{l:10,t:11,i:77}, D{l:10,t:11,i:446}, D{l:10,t:11,i:731}, D{l:12,t:11,i:404}, D{l:141,t:11,i:491}, D{l:132,t:11,i:375}, D{l:4,t:10,i:518}, D{l:135,t:10,i:1136}, D{l:4,t:0,i:913}, D{l:4,t:11,i:411}, D{l:11,t:11,i:643}, D{l:140,t:11,i:115}, D{l:4,t:11,i:80}, D{l:133,t:11,i:44}, D{l:8,t:10,i:689}, D{l:137,t:10,i:863}, D{l:138,t:0,i:880}, D{l:4,t:10,i:18}, D{l:7,t:10,i:145}, D{l:7,t:10,i:444}, D{l:7,t:10,i:1278}, D{l:8,t:10,i:49}, D{l:8,t:10,i:400}, D{l:9,t:10,i:71}, D{l:9,t:10,i:250}, D{l:10,t:10,i:459}, D{l:12,t:10,i:160}, D{l:144,t:10,i:24}, D{l:136,t:0,i:475}, D{l:5,t:0,i:1016}, D{l:5,t:11,i:299}, D{l:135,t:11,i:1083}, D{l:7,t:0,i:602}, D{l:8,t:0,i:179}, D{l:10,t:0,i:781}, D{l:140,t:0,i:126}, D{l:6,t:0,i:329}, D{l:138,t:0,i:111}, D{l:135,t:0,i:1864}, D{l:4,t:11,i:219}, D{l:7,t:11,i:1761}, D{l:137,t:11,i:86}, D{l:6,t:0,i:1888}, D{l:6,t:0,i:1892}, D{l:6,t:0,i:1901}, D{l:6,t:0,i:1904}, D{l:9,t:0,i:953}, D{l:9,t:0,i:985}, D{l:9,t:0,i:991}, D{l:9,t:0,i:1001}, D{l:12,t:0,i:818}, D{l:12,t:0,i:846}, D{l:12,t:0,i:847}, D{l:12,t:0,i:861}, D{l:12,t:0,i:862}, D{l:12,t:0,i:873}, D{l:12,t:0,i:875}, D{l:12,t:0,i:877}, D{l:12,t:0,i:879}, D{l:12,t:0,i:881}, D{l:12,t:0,i:884}, D{l:12,t:0,i:903}, D{l:12,t:0,i:915}, D{l:12,t:0,i:926}, D{l:12,t:0,i:939}, D{l:15,t:0,i:182}, D{l:15,t:0,i:219}, D{l:15,t:0,i:255}, D{l:18,t:0,i:191}, D{l:18,t:0,i:209}, D{l:18,t:0,i:211}, D{l:149,t:0,i:41}, D{l:5,t:11,i:328}, D{l:135,t:11,i:918}, D{l:137,t:0,i:780}, D{l:12,t:0,i:82}, D{l:143,t:0,i:36}, D{l:133,t:10,i:1010}, D{l:5,t:0,i:821}, D{l:134,t:0,i:1687}, D{l:133,t:11,i:514}, D{l:132,t:0,i:956}, D{l:134,t:0,i:1180}, D{l:10,t:0,i:112}, D{l:5,t:10,i:87}, D{l:7,t:10,i:313}, D{l:7,t:10,i:1103}, D{l:10,t:10,i:582}, D{l:11,t:10,i:389}, D{l:11,t:10,i:813}, D{l:12,t:10,i:385}, D{l:13,t:10,i:286}, D{l:14,t:10,i:124}, D{l:146,t:10,i:108}, D{l:5,t:0,i:71}, D{l:7,t:0,i:1407}, D{l:9,t:0,i:704}, D{l:10,t:0,i:261}, D{l:10,t:0,i:619}, D{l:11,t:0,i:547}, D{l:11,t:0,i:619}, D{l:143,t:0,i:157}, D{l:4,t:0,i:531}, D{l:5,t:0,i:455}, D{l:5,t:11,i:301}, D{l:6,t:11,i:571}, D{l:14,t:11,i:49}, D{l:146,t:11,i:102}, D{l:132,t:10,i:267}, D{l:6,t:0,i:385}, D{l:7,t:0,i:2008}, D{l:9,t:0,i:337}, D{l:138,t:0,i:517}, D{l:133,t:11,i:726}, D{l:133,t:11,i:364}, D{l:4,t:11,i:76}, D{l:7,t:11,i:1550}, D{l:9,t:11,i:306}, D{l:9,t:11,i:430}, D{l:9,t:11,i:663}, D{l:10,t:11,i:683}, D{l:11,t:11,i:427}, D{l:11,t:11,i:753}, D{l:12,t:11,i:334}, D{l:12,t:11,i:442}, D{l:14,t:11,i:258}, D{l:14,t:11,i:366}, D{l:143,t:11,i:131}, D{l:6,t:0,i:1865}, D{l:6,t:0,i:1879}, D{l:6,t:0,i:1881}, D{l:6,t:0,i:1894}, D{l:6,t:0,i:1908}, D{l:9,t:0,i:915}, D{l:9,t:0,i:926}, D{l:9,t:0,i:940}, D{l:9,t:0,i:943}, D{l:9,t:0,i:966}, D{l:9,t:0,i:980}, D{l:9,t:0,i:989}, D{l:9,t:0,i:1005}, D{l:9,t:0,i:1010}, D{l:12,t:0,i:813}, D{l:12,t:0,i:817}, D{l:12,t:0,i:840}, D{l:12,t:0,i:843}, D{l:12,t:0,i:855}, D{l:12,t:0,i:864}, D{l:12,t:0,i:871}, D{l:12,t:0,i:872}, D{l:12,t:0,i:899}, D{l:12,t:0,i:905}, D{l:12,t:0,i:924}, D{l:15,t:0,i:171}, D{l:15,t:0,i:181}, D{l:15,t:0,i:224}, D{l:15,t:0,i:235}, D{l:15,t:0,i:251}, D{l:146,t:0,i:184}, D{l:137,t:11,i:52}, D{l:5,t:0,i:16}, D{l:6,t:0,i:86}, D{l:6,t:0,i:603}, D{l:7,t:0,i:292}, D{l:7,t:0,i:561}, D{l:8,t:0,i:257}, D{l:8,t:0,i:382}, D{l:9,t:0,i:721}, D{l:9,t:0,i:778}, D{l:11,t:0,i:581}, D{l:140,t:0,i:466}, D{l:4,t:0,i:486}, D{l:5,t:0,i:491}, D{l:135,t:10,i:1121}, D{l:4,t:0,i:72}, D{l:6,t:0,i:265}, D{l:135,t:0,i:1300}, D{l:135,t:11,i:1183}, D{l:10,t:10,i:249}, D{l:139,t:10,i:209}, D{l:132,t:10,i:561}, D{l:137,t:11,i:519}, D{l:4,t:11,i:656}, D{l:4,t:10,i:760}, D{l:135,t:11,i:779}, D{l:9,t:10,i:154}, D{l:140,t:10,i:485}, D{l:135,t:11,i:1793}, D{l:135,t:11,i:144}, D{l:136,t:10,i:255}, D{l:133,t:0,i:621}, D{l:4,t:10,i:368}, D{l:135,t:10,i:641}, D{l:135,t:11,i:1373}, D{l:7,t:11,i:554}, D{l:7,t:11,i:605}, D{l:141,t:11,i:10}, D{l:137,t:0,i:234}, D{l:5,t:0,i:815}, D{l:6,t:0,i:1688}, D{l:134,t:0,i:1755}, D{l:5,t:11,i:838}, D{l:5,t:11,i:841}, D{l:134,t:11,i:1649}, D{l:7,t:0,i:1987}, D{l:7,t:0,i:2040}, D{l:136,t:0,i:743}, D{l:133,t:11,i:1012}, D{l:6,t:0,i:197}, D{l:136,t:0,i:205}, D{l:6,t:0,i:314}, D{l:134,t:11,i:314}, D{l:144,t:11,i:53}, D{l:6,t:11,i:251}, D{l:7,t:11,i:365}, D{l:7,t:11,i:1357}, D{l:7,t:11,i:1497}, D{l:8,t:11,i:154}, D{l:141,t:11,i:281}, D{l:133,t:11,i:340}, D{l:6,t:0,i:452}, D{l:7,t:0,i:312}, D{l:138,t:0,i:219}, D{l:138,t:0,i:589}, D{l:4,t:0,i:333}, D{l:9,t:0,i:176}, D{l:12,t:0,i:353}, D{l:141,t:0,i:187}, D{l:9,t:10,i:92}, D{l:147,t:10,i:91}, D{l:134,t:0,i:1110}, D{l:11,t:0,i:47}, D{l:139,t:11,i:495}, D{l:6,t:10,i:525}, D{l:8,t:10,i:806}, D{l:9,t:10,i:876}, D{l:140,t:10,i:284}, D{l:8,t:11,i:261}, D{l:9,t:11,i:144}, D{l:9,t:11,i:466}, D{l:10,t:11,i:370}, D{l:12,t:11,i:470}, D{l:13,t:11,i:144}, D{l:142,t:11,i:348}, D{l:137,t:11,i:897}, D{l:8,t:0,i:863}, D{l:8,t:0,i:864}, D{l:8,t:0,i:868}, D{l:8,t:0,i:884}, D{l:10,t:0,i:866}, D{l:10,t:0,i:868}, D{l:10,t:0,i:873}, D{l:10,t:0,i:911}, D{l:10,t:0,i:912}, D{l:10,t:0,i:944}, D{l:12,t:0,i:727}, D{l:6,t:11,i:248}, D{l:9,t:11,i:546}, D{l:10,t:11,i:535}, D{l:11,t:11,i:681}, D{l:141,t:11,i:135}, D{l:6,t:0,i:300}, D{l:135,t:0,i:1515}, D{l:134,t:0,i:1237}, D{l:139,t:10,i:958}, D{l:133,t:10,i:594}, D{l:140,t:11,i:250}, D{l:134,t:0,i:1685}, D{l:134,t:11,i:567}, D{l:7,t:0,i:135}, D{l:8,t:0,i:7}, D{l:8,t:0,i:62}, D{l:9,t:0,i:243}, D{l:10,t:0,i:658}, D{l:10,t:0,i:697}, D{l:11,t:0,i:456}, D{l:139,t:0,i:756}, D{l:9,t:0,i:395}, D{l:138,t:0,i:79}, D{l:6,t:10,i:1641}, D{l:136,t:10,i:820}, D{l:4,t:10,i:302}, D{l:135,t:10,i:1766}, D{l:134,t:11,i:174}, D{l:135,t:10,i:1313}, D{l:135,t:0,i:631}, D{l:134,t:10,i:1674}, D{l:134,t:11,i:395}, D{l:138,t:0,i:835}, D{l:7,t:0,i:406}, D{l:7,t:0,i:459}, D{l:8,t:0,i:606}, D{l:139,t:0,i:726}, D{l:134,t:11,i:617}, D{l:134,t:0,i:979}, D{l:6,t:10,i:389}, D{l:7,t:10,i:149}, D{l:9,t:10,i:142}, D{l:138,t:10,i:94}, D{l:5,t:11,i:878}, D{l:133,t:11,i:972}, D{l:6,t:10,i:8}, D{l:7,t:10,i:1881}, D{l:8,t:10,i:91}, D{l:136,t:11,i:511}, D{l:133,t:0,i:612}, D{l:132,t:11,i:351}, D{l:4,t:0,i:372}, D{l:7,t:0,i:482}, D{l:8,t:0,i:158}, D{l:9,t:0,i:602}, D{l:9,t:0,i:615}, D{l:10,t:0,i:245}, D{l:10,t:0,i:678}, D{l:10,t:0,i:744}, D{l:11,t:0,i:248}, D{l:139,t:0,i:806}, D{l:5,t:0,i:854}, D{l:135,t:0,i:1991}, D{l:132,t:11,i:286}, D{l:135,t:11,i:344}, D{l:7,t:11,i:438}, D{l:7,t:11,i:627}, D{l:7,t:11,i:1516}, D{l:8,t:11,i:40}, D{l:9,t:11,i:56}, D{l:9,t:11,i:294}, D{l:10,t:11,i:30}, D{l:10,t:11,i:259}, D{l:11,t:11,i:969}, D{l:146,t:11,i:148}, D{l:135,t:0,i:1492}, D{l:5,t:11,i:259}, D{l:7,t:11,i:414}, D{l:7,t:11,i:854}, D{l:142,t:11,i:107}, D{l:135,t:10,i:1746}, D{l:6,t:0,i:833}, D{l:134,t:0,i:998}, D{l:135,t:10,i:24}, D{l:6,t:0,i:750}, D{l:135,t:0,i:1739}, D{l:4,t:10,i:503}, D{l:135,t:10,i:1661}, D{l:5,t:10,i:130}, D{l:7,t:10,i:1314}, D{l:9,t:10,i:610}, D{l:10,t:10,i:718}, D{l:11,t:10,i:601}, D{l:11,t:10,i:819}, D{l:11,t:10,i:946}, D{l:140,t:10,i:536}, D{l:10,t:10,i:149}, D{l:11,t:10,i:280}, D{l:142,t:10,i:336}, D{l:132,t:11,i:738}, D{l:135,t:10,i:1946}, D{l:5,t:0,i:195}, D{l:135,t:0,i:1685}, D{l:7,t:0,i:1997}, D{l:8,t:0,i:730}, D{l:139,t:0,i:1006}, D{l:151,t:11,i:17}, D{l:133,t:11,i:866}, D{l:14,t:0,i:463}, D{l:14,t:0,i:470}, D{l:150,t:0,i:61}, D{l:5,t:0,i:751}, D{l:8,t:0,i:266}, D{l:11,t:0,i:578}, D{l:4,t:10,i:392}, D{l:135,t:10,i:1597}, D{l:5,t:10,i:433}, D{l:9,t:10,i:633}, D{l:139,t:10,i:629}, D{l:135,t:0,i:821}, D{l:6,t:0,i:715}, D{l:134,t:0,i:1325}, D{l:133,t:11,i:116}, D{l:6,t:0,i:868}, D{l:132,t:11,i:457}, D{l:134,t:0,i:959}, D{l:6,t:10,i:234}, D{l:138,t:11,i:199}, D{l:7,t:0,i:1053}, D{l:7,t:10,i:1950}, D{l:8,t:10,i:680}, D{l:11,t:10,i:817}, D{l:147,t:10,i:88}, D{l:7,t:10,i:1222}, D{l:138,t:10,i:386}, D{l:5,t:0,i:950}, D{l:5,t:0,i:994}, D{l:6,t:0,i:351}, D{l:134,t:0,i:1124}, D{l:134,t:0,i:1081}, D{l:7,t:0,i:1595}, D{l:6,t:10,i:5}, D{l:11,t:10,i:249}, D{l:12,t:10,i:313}, D{l:16,t:10,i:66}, D{l:145,t:10,i:26}, D{l:148,t:0,i:59}, D{l:5,t:11,i:527}, D{l:6,t:11,i:189}, D{l:135,t:11,i:859}, D{l:5,t:10,i:963}, D{l:6,t:10,i:1773}, D{l:11,t:11,i:104}, D{l:11,t:11,i:554}, D{l:15,t:11,i:60}, D{l:143,t:11,i:125}, D{l:135,t:0,i:47}, D{l:137,t:0,i:684}, D{l:134,t:11,i:116}, D{l:134,t:0,i:1606}, D{l:134,t:0,i:777}, D{l:7,t:0,i:1020}, D{l:8,t:10,i:509}, D{l:136,t:10,i:792}, D{l:135,t:0,i:1094}, D{l:132,t:0,i:350}, D{l:133,t:11,i:487}, D{l:4,t:11,i:86}, D{l:5,t:11,i:667}, D{l:5,t:11,i:753}, D{l:6,t:11,i:316}, D{l:6,t:11,i:455}, D{l:135,t:11,i:946}, D{l:7,t:0,i:1812}, D{l:13,t:0,i:259}, D{l:13,t:0,i:356}, D{l:14,t:0,i:242}, D{l:147,t:0,i:114}, D{l:132,t:10,i:931}, D{l:133,t:0,i:967}, D{l:4,t:0,i:473}, D{l:7,t:0,i:623}, D{l:8,t:0,i:808}, D{l:9,t:0,i:871}, D{l:9,t:0,i:893}, D{l:11,t:0,i:38}, D{l:11,t:0,i:431}, D{l:12,t:0,i:112}, D{l:12,t:0,i:217}, D{l:12,t:0,i:243}, D{l:12,t:0,i:562}, D{l:12,t:0,i:663}, D{l:12,t:0,i:683}, D{l:13,t:0,i:141}, D{l:13,t:0,i:197}, D{l:13,t:0,i:227}, D{l:13,t:0,i:406}, D{l:13,t:0,i:487}, D{l:14,t:0,i:156}, D{l:14,t:0,i:203}, D{l:14,t:0,i:224}, D{l:14,t:0,i:256}, D{l:18,t:0,i:58}, D{l:150,t:0,i:0}, D{l:138,t:0,i:286}, D{l:7,t:10,i:943}, D{l:139,t:10,i:614}, D{l:135,t:10,i:1837}, D{l:150,t:11,i:45}, D{l:132,t:0,i:798}, D{l:4,t:0,i:222}, D{l:7,t:0,i:286}, D{l:136,t:0,i:629}, D{l:4,t:11,i:79}, D{l:7,t:11,i:1773}, D{l:10,t:11,i:450}, D{l:11,t:11,i:589}, D{l:13,t:11,i:332}, D{l:13,t:11,i:493}, D{l:14,t:11,i:183}, D{l:14,t:11,i:334}, D{l:14,t:11,i:362}, D{l:14,t:11,i:368}, D{l:14,t:11,i:376}, D{l:14,t:11,i:379}, D{l:19,t:11,i:90}, D{l:19,t:11,i:103}, D{l:19,t:11,i:127}, D{l:148,t:11,i:90}, D{l:5,t:0,i:337}, D{l:11,t:0,i:513}, D{l:11,t:0,i:889}, D{l:11,t:0,i:961}, D{l:12,t:0,i:461}, D{l:13,t:0,i:79}, D{l:15,t:0,i:121}, D{l:4,t:10,i:90}, D{l:5,t:10,i:545}, D{l:7,t:10,i:754}, D{l:9,t:10,i:186}, D{l:10,t:10,i:72}, D{l:10,t:10,i:782}, D{l:11,t:10,i:577}, D{l:11,t:10,i:610}, D{l:12,t:10,i:354}, D{l:12,t:10,i:362}, D{l:140,t:10,i:595}, D{l:141,t:0,i:306}, D{l:136,t:0,i:146}, D{l:7,t:0,i:1646}, D{l:9,t:10,i:329}, D{l:11,t:10,i:254}, D{l:141,t:11,i:124}, D{l:4,t:0,i:465}, D{l:135,t:0,i:1663}, D{l:132,t:0,i:525}, D{l:133,t:11,i:663}, D{l:10,t:0,i:299}, D{l:18,t:0,i:74}, D{l:9,t:10,i:187}, D{l:11,t:10,i:1016}, D{l:145,t:10,i:44}, D{l:7,t:0,i:165}, D{l:7,t:0,i:919}, D{l:4,t:10,i:506}, D{l:136,t:10,i:517}, D{l:5,t:10,i:295}, D{l:135,t:10,i:1680}, D{l:133,t:11,i:846}, D{l:134,t:0,i:1064}, D{l:5,t:11,i:378}, D{l:7,t:11,i:1402}, D{l:7,t:11,i:1414}, D{l:8,t:11,i:465}, D{l:9,t:11,i:286}, D{l:10,t:11,i:185}, D{l:10,t:11,i:562}, D{l:10,t:11,i:635}, D{l:11,t:11,i:31}, D{l:11,t:11,i:393}, D{l:12,t:11,i:456}, D{l:13,t:11,i:312}, D{l:18,t:11,i:65}, D{l:18,t:11,i:96}, D{l:147,t:11,i:89}, D{l:132,t:0,i:596}, D{l:7,t:10,i:987}, D{l:9,t:10,i:688}, D{l:10,t:10,i:522}, D{l:11,t:10,i:788}, D{l:140,t:10,i:566}, D{l:6,t:0,i:82}, D{l:7,t:0,i:138}, D{l:7,t:0,i:517}, D{l:7,t:0,i:1741}, D{l:11,t:0,i:238}, D{l:4,t:11,i:648}, D{l:134,t:10,i:1775}, D{l:7,t:0,i:1233}, D{l:7,t:10,i:700}, D{l:7,t:10,i:940}, D{l:8,t:10,i:514}, D{l:9,t:10,i:116}, D{l:9,t:10,i:535}, D{l:10,t:10,i:118}, D{l:11,t:10,i:107}, D{l:11,t:10,i:148}, D{l:11,t:10,i:922}, D{l:12,t:10,i:254}, D{l:12,t:10,i:421}, D{l:142,t:10,i:238}, D{l:4,t:0,i:962}, D{l:6,t:0,i:1824}, D{l:8,t:0,i:894}, D{l:12,t:0,i:708}, D{l:12,t:0,i:725}, D{l:14,t:0,i:451}, D{l:20,t:0,i:94}, D{l:22,t:0,i:59}, D{l:150,t:0,i:62}, D{l:5,t:11,i:945}, D{l:6,t:11,i:1656}, D{l:6,t:11,i:1787}, D{l:7,t:11,i:167}, D{l:8,t:11,i:824}, D{l:9,t:11,i:391}, D{l:10,t:11,i:375}, D{l:139,t:11,i:185}, D{l:5,t:0,i:495}, D{l:7,t:0,i:834}, D{l:9,t:0,i:733}, D{l:139,t:0,i:378}, D{l:4,t:10,i:743}, D{l:135,t:11,i:1273}, D{l:6,t:0,i:1204}, D{l:7,t:11,i:1645}, D{l:8,t:11,i:352}, D{l:137,t:11,i:249}, D{l:139,t:10,i:292}, D{l:133,t:0,i:559}, D{l:132,t:11,i:152}, D{l:9,t:0,i:499}, D{l:10,t:0,i:341}, D{l:15,t:0,i:144}, D{l:19,t:0,i:49}, D{l:7,t:10,i:1283}, D{l:9,t:10,i:227}, D{l:11,t:10,i:325}, D{l:11,t:10,i:408}, D{l:14,t:10,i:180}, D{l:146,t:10,i:47}, D{l:6,t:0,i:21}, D{l:6,t:0,i:1737}, D{l:7,t:0,i:1444}, D{l:136,t:0,i:224}, D{l:133,t:11,i:1006}, D{l:7,t:0,i:1446}, D{l:9,t:0,i:97}, D{l:17,t:0,i:15}, D{l:5,t:10,i:81}, D{l:7,t:10,i:146}, D{l:7,t:10,i:1342}, D{l:8,t:10,i:53}, D{l:8,t:10,i:561}, D{l:8,t:10,i:694}, D{l:8,t:10,i:754}, D{l:9,t:10,i:115}, D{l:9,t:10,i:894}, D{l:10,t:10,i:462}, D{l:10,t:10,i:813}, D{l:11,t:10,i:230}, D{l:11,t:10,i:657}, D{l:11,t:10,i:699}, D{l:11,t:10,i:748}, D{l:12,t:10,i:119}, D{l:12,t:10,i:200}, D{l:12,t:10,i:283}, D{l:142,t:10,i:273}, D{l:5,t:10,i:408}, D{l:137,t:10,i:747}, D{l:135,t:11,i:431}, D{l:135,t:11,i:832}, D{l:6,t:0,i:729}, D{l:134,t:0,i:953}, D{l:4,t:0,i:727}, D{l:8,t:0,i:565}, D{l:5,t:11,i:351}, D{l:7,t:11,i:264}, D{l:136,t:11,i:565}, D{l:134,t:0,i:1948}, D{l:5,t:0,i:519}, D{l:5,t:11,i:40}, D{l:7,t:11,i:598}, D{l:7,t:11,i:1638}, D{l:8,t:11,i:78}, D{l:9,t:11,i:166}, D{l:9,t:11,i:640}, D{l:9,t:11,i:685}, D{l:9,t:11,i:773}, D{l:11,t:11,i:215}, D{l:13,t:11,i:65}, D{l:14,t:11,i:172}, D{l:14,t:11,i:317}, D{l:145,t:11,i:6}, D{l:8,t:11,i:60}, D{l:9,t:11,i:343}, D{l:139,t:11,i:769}, D{l:137,t:11,i:455}, D{l:134,t:0,i:1193}, D{l:140,t:0,i:790}, D{l:7,t:11,i:1951}, D{l:8,t:11,i:765}, D{l:8,t:11,i:772}, D{l:140,t:11,i:671}, D{l:7,t:11,i:108}, D{l:8,t:11,i:219}, D{l:8,t:11,i:388}, D{l:9,t:11,i:639}, D{l:9,t:11,i:775}, D{l:11,t:11,i:275}, D{l:140,t:11,i:464}, D{l:132,t:11,i:468}, D{l:7,t:10,i:30}, D{l:8,t:10,i:86}, D{l:8,t:10,i:315}, D{l:8,t:10,i:700}, D{l:9,t:10,i:576}, D{l:9,t:10,i:858}, D{l:11,t:10,i:310}, D{l:11,t:10,i:888}, D{l:11,t:10,i:904}, D{l:12,t:10,i:361}, D{l:141,t:10,i:248}, D{l:5,t:11,i:15}, D{l:6,t:11,i:56}, D{l:7,t:11,i:1758}, D{l:8,t:11,i:500}, D{l:9,t:11,i:730}, D{l:11,t:11,i:331}, D{l:13,t:11,i:150}, D{l:142,t:11,i:282}, D{l:4,t:0,i:402}, D{l:7,t:0,i:2}, D{l:8,t:0,i:323}, D{l:136,t:0,i:479}, D{l:138,t:10,i:839}, D{l:11,t:0,i:580}, D{l:142,t:0,i:201}, D{l:5,t:0,i:59}, D{l:135,t:0,i:672}, D{l:137,t:10,i:617}, D{l:146,t:0,i:34}, D{l:134,t:11,i:1886}, D{l:4,t:0,i:961}, D{l:136,t:0,i:896}, D{l:6,t:0,i:1285}, D{l:5,t:11,i:205}, D{l:6,t:11,i:438}, D{l:137,t:11,i:711}, D{l:134,t:10,i:428}, D{l:7,t:10,i:524}, D{l:8,t:10,i:169}, D{l:8,t:10,i:234}, D{l:9,t:10,i:480}, D{l:138,t:10,i:646}, D{l:148,t:0,i:46}, D{l:141,t:0,i:479}, D{l:133,t:11,i:534}, D{l:6,t:0,i:2019}, D{l:134,t:10,i:1648}, D{l:4,t:0,i:85}, D{l:7,t:0,i:549}, D{l:7,t:10,i:1205}, D{l:138,t:10,i:637}, D{l:4,t:0,i:663}, D{l:5,t:0,i:94}, D{l:7,t:11,i:235}, D{l:7,t:11,i:1475}, D{l:15,t:11,i:68}, D{l:146,t:11,i:120}, D{l:6,t:11,i:443}, D{l:9,t:11,i:237}, D{l:9,t:11,i:571}, D{l:9,t:11,i:695}, D{l:10,t:11,i:139}, D{l:11,t:11,i:715}, D{l:12,t:11,i:417}, D{l:141,t:11,i:421}, D{l:132,t:0,i:783}, D{l:4,t:0,i:682}, D{l:8,t:0,i:65}, D{l:9,t:10,i:39}, D{l:10,t:10,i:166}, D{l:11,t:10,i:918}, D{l:12,t:10,i:635}, D{l:20,t:10,i:10}, D{l:22,t:10,i:27}, D{l:22,t:10,i:43}, D{l:150,t:10,i:52}, D{l:6,t:0,i:11}, D{l:135,t:0,i:187}, D{l:132,t:0,i:522}, D{l:4,t:0,i:52}, D{l:135,t:0,i:661}, D{l:4,t:0,i:383}, D{l:133,t:0,i:520}, D{l:135,t:11,i:546}, D{l:11,t:0,i:343}, D{l:142,t:0,i:127}, D{l:4,t:11,i:578}, D{l:7,t:10,i:157}, D{l:7,t:11,i:624}, D{l:7,t:11,i:916}, D{l:8,t:10,i:279}, D{l:10,t:11,i:256}, D{l:11,t:11,i:87}, D{l:139,t:11,i:703}, D{l:134,t:10,i:604}, D{l:4,t:0,i:281}, D{l:5,t:0,i:38}, D{l:7,t:0,i:194}, D{l:7,t:0,i:668}, D{l:7,t:0,i:1893}, D{l:137,t:0,i:397}, D{l:7,t:10,i:945}, D{l:11,t:10,i:713}, D{l:139,t:10,i:744}, D{l:139,t:10,i:1022}, D{l:9,t:0,i:635}, D{l:139,t:0,i:559}, D{l:5,t:11,i:923}, D{l:7,t:11,i:490}, D{l:12,t:11,i:553}, D{l:13,t:11,i:100}, D{l:14,t:11,i:118}, D{l:143,t:11,i:75}, D{l:132,t:0,i:975}, D{l:132,t:10,i:567}, D{l:137,t:10,i:859}, D{l:7,t:10,i:1846}, D{l:7,t:11,i:1846}, D{l:8,t:10,i:628}, D{l:136,t:11,i:628}, D{l:148,t:0,i:116}, D{l:138,t:11,i:750}, D{l:14,t:0,i:51}, D{l:14,t:11,i:51}, D{l:15,t:11,i:7}, D{l:148,t:11,i:20}, D{l:132,t:0,i:858}, D{l:134,t:0,i:1075}, D{l:4,t:11,i:924}, D{l:133,t:10,i:762}, D{l:136,t:0,i:535}, D{l:133,t:0,i:448}, D{l:10,t:10,i:784}, D{l:141,t:10,i:191}, D{l:133,t:10,i:298}, D{l:7,t:0,i:610}, D{l:135,t:0,i:1501}, D{l:7,t:10,i:633}, D{l:7,t:10,i:905}, D{l:7,t:10,i:909}, D{l:7,t:10,i:1538}, D{l:9,t:10,i:767}, D{l:140,t:10,i:636}, D{l:4,t:11,i:265}, D{l:7,t:11,i:807}, D{l:135,t:11,i:950}, D{l:5,t:11,i:93}, D{l:12,t:11,i:267}, D{l:144,t:11,i:26}, D{l:136,t:0,i:191}, D{l:139,t:10,i:301}, D{l:135,t:10,i:1970}, D{l:135,t:0,i:267}, D{l:4,t:0,i:319}, D{l:5,t:0,i:699}, D{l:138,t:0,i:673}, D{l:6,t:0,i:336}, D{l:7,t:0,i:92}, D{l:7,t:0,i:182}, D{l:8,t:0,i:453}, D{l:8,t:0,i:552}, D{l:9,t:0,i:204}, D{l:9,t:0,i:285}, D{l:10,t:0,i:99}, D{l:11,t:0,i:568}, D{l:11,t:0,i:950}, D{l:12,t:0,i:94}, D{l:16,t:0,i:20}, D{l:16,t:0,i:70}, D{l:19,t:0,i:55}, D{l:12,t:10,i:644}, D{l:144,t:10,i:90}, D{l:6,t:0,i:551}, D{l:7,t:0,i:1308}, D{l:7,t:10,i:845}, D{l:7,t:11,i:994}, D{l:8,t:10,i:160}, D{l:137,t:10,i:318}, D{l:19,t:11,i:1}, D{l:19,t:11,i:26}, D{l:150,t:11,i:9}, D{l:7,t:0,i:1406}, D{l:9,t:0,i:218}, D{l:141,t:0,i:222}, D{l:5,t:0,i:256}, D{l:138,t:0,i:69}, D{l:5,t:11,i:233}, D{l:5,t:11,i:320}, D{l:6,t:11,i:140}, D{l:7,t:11,i:330}, D{l:136,t:11,i:295}, D{l:6,t:0,i:1980}, D{l:136,t:0,i:952}, D{l:4,t:0,i:833}, D{l:137,t:11,i:678}, D{l:133,t:11,i:978}, D{l:4,t:11,i:905}, D{l:6,t:11,i:1701}, D{l:137,t:11,i:843}, D{l:138,t:10,i:735}, D{l:136,t:10,i:76}, D{l:17,t:0,i:39}, D{l:148,t:0,i:36}, D{l:18,t:0,i:81}, D{l:146,t:11,i:81}, D{l:14,t:0,i:352}, D{l:17,t:0,i:53}, D{l:18,t:0,i:146}, D{l:18,t:0,i:152}, D{l:19,t:0,i:11}, D{l:150,t:0,i:54}, D{l:135,t:0,i:634}, D{l:138,t:10,i:841}, D{l:132,t:0,i:618}, D{l:4,t:0,i:339}, D{l:7,t:0,i:259}, D{l:17,t:0,i:73}, D{l:4,t:11,i:275}, D{l:140,t:11,i:376}, D{l:132,t:11,i:509}, D{l:7,t:11,i:273}, D{l:139,t:11,i:377}, D{l:4,t:0,i:759}, D{l:13,t:0,i:169}, D{l:137,t:10,i:804}, D{l:6,t:10,i:96}, D{l:135,t:10,i:1426}, D{l:4,t:10,i:651}, D{l:133,t:10,i:289}, D{l:7,t:0,i:1075}, D{l:8,t:10,i:35}, D{l:9,t:10,i:511}, D{l:10,t:10,i:767}, D{l:147,t:10,i:118}, D{l:6,t:0,i:649}, D{l:6,t:0,i:670}, D{l:136,t:0,i:482}, D{l:5,t:0,i:336}, D{l:6,t:0,i:341}, D{l:6,t:0,i:478}, D{l:6,t:0,i:1763}, D{l:136,t:0,i:386}, D{l:5,t:11,i:802}, D{l:7,t:11,i:2021}, D{l:8,t:11,i:805}, D{l:14,t:11,i:94}, D{l:15,t:11,i:65}, D{l:16,t:11,i:4}, D{l:16,t:11,i:77}, D{l:16,t:11,i:80}, D{l:145,t:11,i:5}, D{l:6,t:0,i:1035}, D{l:5,t:11,i:167}, D{l:5,t:11,i:899}, D{l:6,t:11,i:410}, D{l:137,t:11,i:777}, D{l:134,t:11,i:1705}, D{l:5,t:0,i:924}, D{l:133,t:0,i:969}, D{l:132,t:10,i:704}, D{l:135,t:0,i:73}, D{l:135,t:11,i:10}, D{l:135,t:10,i:1078}, D{l:5,t:11,i:11}, D{l:6,t:11,i:117}, D{l:6,t:11,i:485}, D{l:7,t:11,i:1133}, D{l:9,t:11,i:582}, D{l:9,t:11,i:594}, D{l:11,t:11,i:21}, D{l:11,t:11,i:818}, D{l:12,t:11,i:535}, D{l:141,t:11,i:86}, D{l:135,t:0,i:1971}, D{l:4,t:11,i:264}, D{l:7,t:11,i:1067}, D{l:8,t:11,i:204}, D{l:8,t:11,i:385}, D{l:139,t:11,i:953}, D{l:6,t:0,i:1458}, D{l:135,t:0,i:1344}, D{l:5,t:0,i:396}, D{l:134,t:0,i:501}, D{l:4,t:10,i:720}, D{l:133,t:10,i:306}, D{l:4,t:0,i:929}, D{l:5,t:0,i:799}, D{l:8,t:0,i:46}, D{l:8,t:0,i:740}, D{l:133,t:10,i:431}, D{l:7,t:11,i:646}, D{l:7,t:11,i:1730}, D{l:11,t:11,i:446}, D{l:141,t:11,i:178}, D{l:7,t:0,i:276}, D{l:5,t:10,i:464}, D{l:6,t:10,i:236}, D{l:7,t:10,i:696}, D{l:7,t:10,i:914}, D{l:7,t:10,i:1108}, D{l:7,t:10,i:1448}, D{l:9,t:10,i:15}, D{l:9,t:10,i:564}, D{l:10,t:10,i:14}, D{l:12,t:10,i:565}, D{l:13,t:10,i:449}, D{l:14,t:10,i:53}, D{l:15,t:10,i:13}, D{l:16,t:10,i:64}, D{l:145,t:10,i:41}, D{l:4,t:0,i:892}, D{l:133,t:0,i:770}, D{l:6,t:10,i:1767}, D{l:12,t:10,i:194}, D{l:145,t:10,i:107}, D{l:135,t:0,i:158}, D{l:5,t:10,i:840}, D{l:138,t:11,i:608}, D{l:134,t:0,i:1432}, D{l:138,t:11,i:250}, D{l:8,t:11,i:794}, D{l:9,t:11,i:400}, D{l:10,t:11,i:298}, D{l:142,t:11,i:228}, D{l:151,t:0,i:25}, D{l:7,t:11,i:1131}, D{l:135,t:11,i:1468}, D{l:135,t:0,i:2001}, D{l:9,t:10,i:642}, D{l:11,t:10,i:236}, D{l:142,t:10,i:193}, D{l:4,t:10,i:68}, D{l:5,t:10,i:634}, D{l:6,t:10,i:386}, D{l:7,t:10,i:794}, D{l:8,t:10,i:273}, D{l:9,t:10,i:563}, D{l:10,t:10,i:105}, D{l:10,t:10,i:171}, D{l:11,t:10,i:94}, D{l:139,t:10,i:354}, D{l:136,t:11,i:724}, D{l:132,t:0,i:478}, D{l:11,t:11,i:512}, D{l:13,t:11,i:205}, D{l:19,t:11,i:30}, D{l:22,t:11,i:36}, D{l:151,t:11,i:19}, D{l:7,t:0,i:1461}, D{l:140,t:0,i:91}, D{l:6,t:11,i:190}, D{l:7,t:11,i:768}, D{l:135,t:11,i:1170}, D{l:4,t:0,i:602}, D{l:8,t:0,i:211}, D{l:4,t:10,i:95}, D{l:7,t:10,i:416}, D{l:139,t:10,i:830}, D{l:7,t:10,i:731}, D{l:13,t:10,i:20}, D{l:143,t:10,i:11}, D{l:6,t:0,i:1068}, D{l:135,t:0,i:1872}, D{l:4,t:0,i:13}, D{l:5,t:0,i:567}, D{l:7,t:0,i:1498}, D{l:9,t:0,i:124}, D{l:11,t:0,i:521}, D{l:12,t:0,i:405}, D{l:135,t:11,i:1023}, D{l:135,t:0,i:1006}, D{l:132,t:0,i:735}, D{l:138,t:0,i:812}, D{l:4,t:0,i:170}, D{l:135,t:0,i:323}, D{l:6,t:11,i:137}, D{l:9,t:11,i:75}, D{l:9,t:11,i:253}, D{l:10,t:11,i:194}, D{l:138,t:11,i:444}, D{l:5,t:0,i:304}, D{l:7,t:0,i:1403}, D{l:5,t:10,i:864}, D{l:10,t:10,i:648}, D{l:11,t:10,i:671}, D{l:143,t:10,i:46}, D{l:135,t:11,i:1180}, D{l:133,t:10,i:928}, D{l:4,t:0,i:148}, D{l:133,t:0,i:742}, D{l:11,t:10,i:986}, D{l:140,t:10,i:682}, D{l:133,t:0,i:523}, D{l:135,t:11,i:1743}, D{l:7,t:0,i:730}, D{l:18,t:0,i:144}, D{l:19,t:0,i:61}, D{l:8,t:10,i:44}, D{l:9,t:10,i:884}, D{l:10,t:10,i:580}, D{l:11,t:10,i:399}, D{l:11,t:10,i:894}, D{l:143,t:10,i:122}, D{l:5,t:11,i:760}, D{l:7,t:11,i:542}, D{l:8,t:11,i:135}, D{l:136,t:11,i:496}, D{l:136,t:0,i:981}, D{l:133,t:0,i:111}, D{l:10,t:0,i:132}, D{l:11,t:0,i:191}, D{l:11,t:0,i:358}, D{l:139,t:0,i:460}, D{l:7,t:11,i:319}, D{l:7,t:11,i:355}, D{l:7,t:11,i:763}, D{l:10,t:11,i:389}, D{l:145,t:11,i:43}, D{l:134,t:0,i:890}, D{l:134,t:0,i:1420}, D{l:136,t:11,i:557}, D{l:133,t:10,i:518}, D{l:133,t:0,i:444}, D{l:135,t:0,i:1787}, D{l:135,t:10,i:1852}, D{l:8,t:0,i:123}, D{l:15,t:0,i:6}, D{l:144,t:0,i:7}, D{l:6,t:0,i:2041}, D{l:10,t:11,i:38}, D{l:139,t:11,i:784}, D{l:136,t:0,i:932}, D{l:5,t:0,i:937}, D{l:135,t:0,i:100}, D{l:6,t:0,i:995}, D{l:4,t:11,i:58}, D{l:5,t:11,i:286}, D{l:6,t:11,i:319}, D{l:7,t:11,i:402}, D{l:7,t:11,i:1254}, D{l:7,t:11,i:1903}, D{l:8,t:11,i:356}, D{l:140,t:11,i:408}, D{l:4,t:11,i:389}, D{l:9,t:11,i:181}, D{l:9,t:11,i:255}, D{l:10,t:11,i:8}, D{l:10,t:11,i:29}, D{l:10,t:11,i:816}, D{l:11,t:11,i:311}, D{l:11,t:11,i:561}, D{l:12,t:11,i:67}, D{l:141,t:11,i:181}, D{l:138,t:0,i:255}, D{l:5,t:0,i:138}, D{l:4,t:10,i:934}, D{l:136,t:10,i:610}, D{l:4,t:0,i:965}, D{l:10,t:0,i:863}, D{l:138,t:0,i:898}, D{l:10,t:10,i:804}, D{l:138,t:10,i:832}, D{l:12,t:0,i:631}, D{l:8,t:10,i:96}, D{l:9,t:10,i:36}, D{l:10,t:10,i:607}, D{l:11,t:10,i:423}, D{l:11,t:10,i:442}, D{l:12,t:10,i:309}, D{l:14,t:10,i:199}, D{l:15,t:10,i:90}, D{l:145,t:10,i:110}, D{l:134,t:0,i:1394}, D{l:4,t:0,i:652}, D{l:8,t:0,i:320}, D{l:22,t:0,i:6}, D{l:22,t:0,i:16}, D{l:9,t:10,i:13}, D{l:9,t:10,i:398}, D{l:9,t:10,i:727}, D{l:10,t:10,i:75}, D{l:10,t:10,i:184}, D{l:10,t:10,i:230}, D{l:10,t:10,i:564}, D{l:10,t:10,i:569}, D{l:11,t:10,i:973}, D{l:12,t:10,i:70}, D{l:12,t:10,i:189}, D{l:13,t:10,i:57}, D{l:141,t:10,i:257}, D{l:6,t:0,i:897}, D{l:134,t:0,i:1333}, D{l:4,t:0,i:692}, D{l:133,t:0,i:321}, D{l:133,t:11,i:373}, D{l:135,t:0,i:922}, D{l:5,t:0,i:619}, D{l:133,t:0,i:698}, D{l:137,t:10,i:631}, D{l:5,t:10,i:345}, D{l:135,t:10,i:1016}, D{l:9,t:0,i:957}, D{l:9,t:0,i:1018}, D{l:12,t:0,i:828}, D{l:12,t:0,i:844}, D{l:12,t:0,i:897}, D{l:12,t:0,i:901}, D{l:12,t:0,i:943}, D{l:15,t:0,i:180}, D{l:18,t:0,i:197}, D{l:18,t:0,i:200}, D{l:18,t:0,i:213}, D{l:18,t:0,i:214}, D{l:146,t:0,i:226}, D{l:5,t:0,i:917}, D{l:134,t:0,i:1659}, D{l:135,t:0,i:1100}, D{l:134,t:0,i:1173}, D{l:134,t:0,i:1930}, D{l:5,t:0,i:251}, D{l:5,t:0,i:956}, D{l:8,t:0,i:268}, D{l:9,t:0,i:214}, D{l:146,t:0,i:142}, D{l:133,t:10,i:673}, D{l:137,t:10,i:850}, D{l:4,t:10,i:287}, D{l:133,t:10,i:1018}, D{l:132,t:11,i:672}, D{l:5,t:0,i:346}, D{l:5,t:0,i:711}, D{l:8,t:0,i:390}, D{l:11,t:11,i:752}, D{l:139,t:11,i:885}, D{l:5,t:10,i:34}, D{l:10,t:10,i:724}, D{l:12,t:10,i:444}, D{l:13,t:10,i:354}, D{l:18,t:10,i:32}, D{l:23,t:10,i:24}, D{l:23,t:10,i:31}, D{l:152,t:10,i:5}, D{l:4,t:11,i:710}, D{l:134,t:11,i:606}, D{l:134,t:0,i:744}, D{l:134,t:10,i:382}, D{l:133,t:11,i:145}, D{l:4,t:10,i:329}, D{l:7,t:11,i:884}, D{l:140,t:11,i:124}, D{l:4,t:11,i:467}, D{l:5,t:11,i:405}, D{l:134,t:11,i:544}, D{l:9,t:10,i:846}, D{l:138,t:10,i:827}, D{l:133,t:0,i:624}, D{l:9,t:11,i:372}, D{l:15,t:11,i:2}, D{l:19,t:11,i:10}, D{l:147,t:11,i:18}, D{l:4,t:11,i:387}, D{l:135,t:11,i:1288}, D{l:5,t:0,i:783}, D{l:7,t:0,i:1998}, D{l:135,t:0,i:2047}, D{l:132,t:10,i:906}, D{l:136,t:10,i:366}, D{l:135,t:11,i:550}, D{l:4,t:10,i:123}, D{l:4,t:10,i:649}, D{l:5,t:10,i:605}, D{l:7,t:10,i:1509}, D{l:136,t:10,i:36}, D{l:134,t:0,i:1125}, D{l:132,t:0,i:594}, D{l:133,t:10,i:767}, D{l:135,t:11,i:1227}, D{l:136,t:11,i:467}, D{l:4,t:11,i:576}, D{l:135,t:11,i:1263}, D{l:4,t:0,i:268}, D{l:7,t:0,i:1534}, D{l:135,t:11,i:1534}, D{l:4,t:10,i:273}, D{l:5,t:10,i:658}, D{l:5,t:11,i:919}, D{l:5,t:10,i:995}, D{l:134,t:11,i:1673}, D{l:133,t:0,i:563}, D{l:134,t:10,i:72}, D{l:135,t:10,i:1345}, D{l:4,t:11,i:82}, D{l:5,t:11,i:333}, D{l:5,t:11,i:904}, D{l:6,t:11,i:207}, D{l:7,t:11,i:325}, D{l:7,t:11,i:1726}, D{l:8,t:11,i:101}, D{l:10,t:11,i:778}, D{l:139,t:11,i:220}, D{l:5,t:0,i:37}, D{l:6,t:0,i:39}, D{l:6,t:0,i:451}, D{l:7,t:0,i:218}, D{l:7,t:0,i:667}, D{l:7,t:0,i:1166}, D{l:7,t:0,i:1687}, D{l:8,t:0,i:662}, D{l:16,t:0,i:2}, D{l:133,t:10,i:589}, D{l:134,t:0,i:1332}, D{l:133,t:11,i:903}, D{l:134,t:0,i:508}, D{l:5,t:10,i:117}, D{l:6,t:10,i:514}, D{l:6,t:10,i:541}, D{l:7,t:10,i:1164}, D{l:7,t:10,i:1436}, D{l:8,t:10,i:220}, D{l:8,t:10,i:648}, D{l:10,t:10,i:688}, D{l:11,t:10,i:560}, D{l:140,t:11,i:147}, D{l:6,t:11,i:555}, D{l:135,t:11,i:485}, D{l:133,t:10,i:686}, D{l:7,t:0,i:453}, D{l:7,t:0,i:635}, D{l:7,t:0,i:796}, D{l:8,t:0,i:331}, D{l:9,t:0,i:330}, D{l:9,t:0,i:865}, D{l:10,t:0,i:119}, D{l:10,t:0,i:235}, D{l:11,t:0,i:111}, D{l:11,t:0,i:129}, D{l:11,t:0,i:240}, D{l:12,t:0,i:31}, D{l:12,t:0,i:66}, D{l:12,t:0,i:222}, D{l:12,t:0,i:269}, D{l:12,t:0,i:599}, D{l:12,t:0,i:684}, D{l:12,t:0,i:689}, D{l:12,t:0,i:691}, D{l:142,t:0,i:345}, D{l:135,t:0,i:1834}, D{l:4,t:11,i:705}, D{l:7,t:11,i:615}, D{l:138,t:11,i:251}, D{l:136,t:11,i:345}, D{l:137,t:0,i:527}, D{l:6,t:0,i:98}, D{l:7,t:0,i:702}, D{l:135,t:0,i:991}, D{l:11,t:0,i:576}, D{l:14,t:0,i:74}, D{l:7,t:10,i:196}, D{l:10,t:10,i:765}, D{l:11,t:10,i:347}, D{l:11,t:10,i:552}, D{l:11,t:10,i:790}, D{l:12,t:10,i:263}, D{l:13,t:10,i:246}, D{l:13,t:10,i:270}, D{l:13,t:10,i:395}, D{l:14,t:10,i:176}, D{l:14,t:10,i:190}, D{l:14,t:10,i:398}, D{l:14,t:10,i:412}, D{l:15,t:10,i:32}, D{l:15,t:10,i:63}, D{l:16,t:10,i:88}, D{l:147,t:10,i:105}, D{l:134,t:11,i:90}, D{l:13,t:0,i:84}, D{l:141,t:0,i:122}, D{l:6,t:0,i:37}, D{l:7,t:0,i:299}, D{l:7,t:0,i:1666}, D{l:8,t:0,i:195}, D{l:8,t:0,i:316}, D{l:9,t:0,i:178}, D{l:9,t:0,i:276}, D{l:9,t:0,i:339}, D{l:9,t:0,i:536}, D{l:10,t:0,i:102}, D{l:10,t:0,i:362}, D{l:10,t:0,i:785}, D{l:11,t:0,i:55}, D{l:11,t:0,i:149}, D{l:11,t:0,i:773}, D{l:13,t:0,i:416}, D{l:13,t:0,i:419}, D{l:14,t:0,i:38}, D{l:14,t:0,i:41}, D{l:142,t:0,i:210}, D{l:5,t:10,i:381}, D{l:135,t:10,i:1792}, D{l:7,t:11,i:813}, D{l:12,t:11,i:497}, D{l:141,t:11,i:56}, D{l:7,t:10,i:616}, D{l:138,t:10,i:413}, D{l:133,t:0,i:645}, D{l:6,t:11,i:125}, D{l:135,t:11,i:1277}, D{l:132,t:0,i:290}, D{l:6,t:0,i:70}, D{l:7,t:0,i:1292}, D{l:10,t:0,i:762}, D{l:139,t:0,i:288}, D{l:6,t:10,i:120}, D{l:7,t:10,i:1188}, D{l:7,t:10,i:1710}, D{l:8,t:10,i:286}, D{l:9,t:10,i:667}, D{l:11,t:10,i:592}, D{l:139,t:10,i:730}, D{l:135,t:11,i:1784}, D{l:7,t:0,i:1315}, D{l:135,t:11,i:1315}, D{l:134,t:0,i:1955}, D{l:135,t:10,i:1146}, D{l:7,t:0,i:131}, D{l:7,t:0,i:422}, D{l:8,t:0,i:210}, D{l:140,t:0,i:573}, D{l:4,t:10,i:352}, D{l:135,t:10,i:687}, D{l:139,t:0,i:797}, D{l:143,t:0,i:38}, D{l:14,t:0,i:179}, D{l:15,t:0,i:151}, D{l:150,t:0,i:11}, D{l:7,t:0,i:488}, D{l:4,t:10,i:192}, D{l:5,t:10,i:49}, D{l:6,t:10,i:200}, D{l:6,t:10,i:293}, D{l:134,t:10,i:1696}, D{l:132,t:0,i:936}, D{l:135,t:11,i:703}, D{l:6,t:11,i:160}, D{l:7,t:11,i:1106}, D{l:9,t:11,i:770}, D{l:10,t:11,i:618}, D{l:11,t:11,i:112}, D{l:140,t:11,i:413}, D{l:5,t:0,i:453}, D{l:134,t:0,i:441}, D{l:135,t:0,i:595}, D{l:132,t:10,i:650}, D{l:132,t:10,i:147}, D{l:6,t:0,i:991}, D{l:6,t:0,i:1182}, D{l:12,t:11,i:271}, D{l:145,t:11,i:109}, D{l:133,t:10,i:934}, D{l:140,t:11,i:221}, D{l:132,t:0,i:653}, D{l:7,t:0,i:505}, D{l:135,t:0,i:523}, D{l:134,t:0,i:903}, D{l:135,t:11,i:479}, D{l:7,t:11,i:304}, D{l:9,t:11,i:646}, D{l:9,t:11,i:862}, D{l:10,t:11,i:262}, D{l:11,t:11,i:696}, D{l:12,t:11,i:208}, D{l:15,t:11,i:79}, D{l:147,t:11,i:108}, D{l:146,t:0,i:80}, D{l:135,t:11,i:981}, D{l:142,t:0,i:432}, D{l:132,t:0,i:314}, D{l:137,t:11,i:152}, D{l:7,t:0,i:1368}, D{l:8,t:0,i:232}, D{l:8,t:0,i:361}, D{l:10,t:0,i:682}, D{l:138,t:0,i:742}, D{l:135,t:11,i:1586}, D{l:9,t:0,i:534}, D{l:4,t:11,i:434}, D{l:11,t:11,i:663}, D{l:12,t:11,i:210}, D{l:13,t:11,i:166}, D{l:13,t:11,i:310}, D{l:14,t:11,i:373}, D{l:147,t:11,i:43}, D{l:7,t:11,i:1091}, D{l:135,t:11,i:1765}, D{l:6,t:11,i:550}, D{l:135,t:11,i:652}, D{l:137,t:0,i:27}, D{l:142,t:0,i:12}, D{l:4,t:10,i:637}, D{l:5,t:11,i:553}, D{l:7,t:11,i:766}, D{l:138,t:11,i:824}, D{l:7,t:11,i:737}, D{l:8,t:11,i:298}, D{l:136,t:11,i:452}, D{l:7,t:0,i:736}, D{l:139,t:0,i:264}, D{l:134,t:0,i:1657}, D{l:133,t:11,i:292}, D{l:138,t:11,i:135}, D{l:6,t:0,i:844}, D{l:134,t:0,i:1117}, D{l:135,t:0,i:127}, D{l:9,t:10,i:867}, D{l:138,t:10,i:837}, D{l:6,t:0,i:1184}, D{l:134,t:0,i:1208}, D{l:134,t:0,i:1294}, D{l:136,t:0,i:364}, D{l:6,t:0,i:1415}, D{l:7,t:0,i:1334}, D{l:11,t:0,i:125}, D{l:6,t:10,i:170}, D{l:7,t:11,i:393}, D{l:8,t:10,i:395}, D{l:8,t:10,i:487}, D{l:10,t:11,i:603}, D{l:11,t:11,i:206}, D{l:141,t:10,i:147}, D{l:137,t:11,i:748}, D{l:4,t:11,i:912}, D{l:137,t:11,i:232}, D{l:4,t:10,i:535}, D{l:136,t:10,i:618}, D{l:137,t:0,i:792}, D{l:7,t:11,i:1973}, D{l:136,t:11,i:716}, D{l:135,t:11,i:98}, D{l:5,t:0,i:909}, D{l:9,t:0,i:849}, D{l:138,t:0,i:805}, D{l:4,t:0,i:630}, D{l:132,t:0,i:699}, D{l:5,t:11,i:733}, D{l:14,t:11,i:103}, D{l:150,t:10,i:23}, D{l:12,t:11,i:158}, D{l:18,t:11,i:8}, D{l:19,t:11,i:62}, D{l:20,t:11,i:6}, D{l:22,t:11,i:4}, D{l:23,t:11,i:2}, D{l:151,t:11,i:9}, D{l:132,t:0,i:968}, D{l:132,t:10,i:778}, D{l:132,t:10,i:46}, D{l:5,t:10,i:811}, D{l:6,t:10,i:1679}, D{l:6,t:10,i:1714}, D{l:135,t:10,i:2032}, D{l:6,t:0,i:1446}, D{l:7,t:10,i:1458}, D{l:9,t:10,i:407}, D{l:139,t:10,i:15}, D{l:7,t:0,i:206}, D{l:7,t:0,i:397}, D{l:7,t:0,i:621}, D{l:7,t:0,i:640}, D{l:8,t:0,i:124}, D{l:8,t:0,i:619}, D{l:9,t:0,i:305}, D{l:9,t:0,i:643}, D{l:10,t:0,i:264}, D{l:10,t:0,i:628}, D{l:11,t:0,i:40}, D{l:12,t:0,i:349}, D{l:13,t:0,i:134}, D{l:13,t:0,i:295}, D{l:14,t:0,i:155}, D{l:15,t:0,i:120}, D{l:18,t:0,i:105}, D{l:6,t:10,i:34}, D{l:7,t:10,i:1089}, D{l:8,t:10,i:708}, D{l:8,t:10,i:721}, D{l:9,t:10,i:363}, D{l:148,t:10,i:98}, D{l:4,t:0,i:262}, D{l:5,t:0,i:641}, D{l:135,t:0,i:342}, D{l:137,t:11,i:72}, D{l:4,t:0,i:99}, D{l:6,t:0,i:250}, D{l:6,t:0,i:346}, D{l:8,t:0,i:127}, D{l:138,t:0,i:81}, D{l:132,t:0,i:915}, D{l:5,t:0,i:75}, D{l:9,t:0,i:517}, D{l:10,t:0,i:470}, D{l:12,t:0,i:155}, D{l:141,t:0,i:224}, D{l:132,t:10,i:462}, D{l:11,t:11,i:600}, D{l:11,t:11,i:670}, D{l:141,t:11,i:245}, D{l:142,t:0,i:83}, D{l:5,t:10,i:73}, D{l:6,t:10,i:23}, D{l:134,t:10,i:338}, D{l:6,t:0,i:1031}, D{l:139,t:11,i:923}, D{l:7,t:11,i:164}, D{l:7,t:11,i:1571}, D{l:9,t:11,i:107}, D{l:140,t:11,i:225}, D{l:134,t:0,i:1470}, D{l:133,t:0,i:954}, D{l:6,t:0,i:304}, D{l:8,t:0,i:418}, D{l:10,t:0,i:345}, D{l:11,t:0,i:341}, D{l:139,t:0,i:675}, D{l:9,t:0,i:410}, D{l:139,t:0,i:425}, D{l:4,t:11,i:27}, D{l:5,t:11,i:484}, D{l:5,t:11,i:510}, D{l:6,t:11,i:434}, D{l:7,t:11,i:1000}, D{l:7,t:11,i:1098}, D{l:8,t:11,i:2}, D{l:136,t:11,i:200}, D{l:134,t:0,i:734}, D{l:140,t:11,i:257}, D{l:7,t:10,i:725}, D{l:8,t:10,i:498}, D{l:139,t:10,i:268}, D{l:134,t:0,i:1822}, D{l:135,t:0,i:1798}, D{l:135,t:10,i:773}, D{l:132,t:11,i:460}, D{l:4,t:11,i:932}, D{l:133,t:11,i:891}, D{l:134,t:0,i:14}, D{l:132,t:10,i:583}, D{l:7,t:10,i:1462}, D{l:8,t:11,i:625}, D{l:139,t:10,i:659}, D{l:5,t:0,i:113}, D{l:6,t:0,i:243}, D{l:6,t:0,i:1708}, D{l:7,t:0,i:1865}, D{l:11,t:0,i:161}, D{l:16,t:0,i:37}, D{l:17,t:0,i:99}, D{l:133,t:10,i:220}, D{l:134,t:11,i:76}, D{l:5,t:11,i:461}, D{l:135,t:11,i:1925}, D{l:140,t:0,i:69}, D{l:8,t:11,i:92}, D{l:137,t:11,i:221}, D{l:139,t:10,i:803}, D{l:132,t:10,i:544}, D{l:4,t:0,i:274}, D{l:134,t:0,i:922}, D{l:132,t:0,i:541}, D{l:5,t:0,i:627}, D{l:6,t:10,i:437}, D{l:6,t:10,i:564}, D{l:11,t:10,i:181}, D{l:141,t:10,i:183}, D{l:135,t:10,i:1192}, D{l:7,t:0,i:166}, D{l:132,t:11,i:763}, D{l:133,t:11,i:253}, D{l:134,t:0,i:849}, D{l:9,t:11,i:73}, D{l:10,t:11,i:110}, D{l:14,t:11,i:185}, D{l:145,t:11,i:119}, D{l:5,t:11,i:212}, D{l:12,t:11,i:35}, D{l:141,t:11,i:382}, D{l:133,t:0,i:717}, D{l:137,t:0,i:304}, D{l:136,t:0,i:600}, D{l:133,t:0,i:654}, D{l:6,t:0,i:273}, D{l:10,t:0,i:188}, D{l:13,t:0,i:377}, D{l:146,t:0,i:77}, D{l:4,t:10,i:790}, D{l:5,t:10,i:273}, D{l:134,t:10,i:394}, D{l:132,t:0,i:543}, D{l:135,t:0,i:410}, D{l:11,t:0,i:98}, D{l:11,t:0,i:524}, D{l:141,t:0,i:87}, D{l:132,t:0,i:941}, D{l:135,t:11,i:1175}, D{l:4,t:0,i:250}, D{l:7,t:0,i:1612}, D{l:11,t:0,i:186}, D{l:12,t:0,i:133}, D{l:6,t:10,i:127}, D{l:7,t:10,i:1511}, D{l:8,t:10,i:613}, D{l:12,t:10,i:495}, D{l:12,t:10,i:586}, D{l:12,t:10,i:660}, D{l:12,t:10,i:668}, D{l:14,t:10,i:385}, D{l:15,t:10,i:118}, D{l:17,t:10,i:20}, D{l:146,t:10,i:98}, D{l:6,t:0,i:1785}, D{l:133,t:11,i:816}, D{l:134,t:0,i:1339}, D{l:7,t:0,i:961}, D{l:7,t:0,i:1085}, D{l:7,t:0,i:1727}, D{l:8,t:0,i:462}, D{l:6,t:10,i:230}, D{l:135,t:11,i:1727}, D{l:9,t:0,i:636}, D{l:135,t:10,i:1954}, D{l:132,t:0,i:780}, D{l:5,t:11,i:869}, D{l:5,t:11,i:968}, D{l:6,t:11,i:1626}, D{l:8,t:11,i:734}, D{l:136,t:11,i:784}, D{l:4,t:11,i:542}, D{l:6,t:11,i:1716}, D{l:6,t:11,i:1727}, D{l:7,t:11,i:1082}, D{l:7,t:11,i:1545}, D{l:8,t:11,i:56}, D{l:8,t:11,i:118}, D{l:8,t:11,i:412}, D{l:8,t:11,i:564}, D{l:9,t:11,i:888}, D{l:9,t:11,i:908}, D{l:10,t:11,i:50}, D{l:10,t:11,i:423}, D{l:11,t:11,i:685}, D{l:11,t:11,i:697}, D{l:11,t:11,i:933}, D{l:12,t:11,i:299}, D{l:13,t:11,i:126}, D{l:13,t:11,i:136}, D{l:13,t:11,i:170}, D{l:141,t:11,i:190}, D{l:134,t:11,i:226}, D{l:4,t:11,i:232}, D{l:9,t:11,i:202}, D{l:10,t:11,i:474}, D{l:140,t:11,i:433}, D{l:137,t:11,i:500}, D{l:5,t:0,i:529}, D{l:136,t:10,i:68}, D{l:132,t:10,i:654}, D{l:4,t:10,i:156}, D{l:7,t:10,i:998}, D{l:7,t:10,i:1045}, D{l:7,t:10,i:1860}, D{l:9,t:10,i:48}, D{l:9,t:10,i:692}, D{l:11,t:10,i:419}, D{l:139,t:10,i:602}, D{l:7,t:0,i:1276}, D{l:8,t:0,i:474}, D{l:9,t:0,i:652}, D{l:6,t:11,i:108}, D{l:7,t:11,i:1003}, D{l:7,t:11,i:1181}, D{l:136,t:11,i:343}, D{l:7,t:11,i:1264}, D{l:7,t:11,i:1678}, D{l:11,t:11,i:945}, D{l:12,t:11,i:341}, D{l:12,t:11,i:471}, D{l:140,t:11,i:569}, D{l:134,t:11,i:1712}, D{l:5,t:0,i:948}, D{l:12,t:0,i:468}, D{l:19,t:0,i:96}, D{l:148,t:0,i:24}, D{l:4,t:11,i:133}, D{l:7,t:11,i:711}, D{l:7,t:11,i:1298}, D{l:7,t:11,i:1585}, D{l:135,t:11,i:1929}, D{l:6,t:0,i:753}, D{l:140,t:0,i:657}, D{l:139,t:0,i:941}, D{l:6,t:11,i:99}, D{l:7,t:11,i:1808}, D{l:145,t:11,i:57}, D{l:6,t:11,i:574}, D{l:7,t:11,i:428}, D{l:7,t:11,i:1250}, D{l:10,t:11,i:669}, D{l:11,t:11,i:485}, D{l:11,t:11,i:840}, D{l:12,t:11,i:300}, D{l:142,t:11,i:250}, D{l:4,t:0,i:532}, D{l:5,t:0,i:706}, D{l:135,t:0,i:662}, D{l:5,t:0,i:837}, D{l:6,t:0,i:1651}, D{l:139,t:0,i:985}, D{l:7,t:0,i:1861}, D{l:9,t:10,i:197}, D{l:10,t:10,i:300}, D{l:12,t:10,i:473}, D{l:13,t:10,i:90}, D{l:141,t:10,i:405}, D{l:137,t:11,i:252}, D{l:6,t:11,i:323}, D{l:135,t:11,i:1564}, D{l:4,t:0,i:330}, D{l:4,t:0,i:863}, D{l:7,t:0,i:933}, D{l:7,t:0,i:2012}, D{l:8,t:0,i:292}, D{l:7,t:11,i:461}, D{l:8,t:11,i:775}, D{l:138,t:11,i:435}, D{l:132,t:10,i:606}, D{l:4,t:11,i:655}, D{l:7,t:11,i:850}, D{l:17,t:11,i:75}, D{l:146,t:11,i:137}, D{l:135,t:0,i:767}, D{l:7,t:10,i:1978}, D{l:136,t:10,i:676}, D{l:132,t:0,i:641}, D{l:135,t:11,i:1559}, D{l:134,t:0,i:1233}, D{l:137,t:0,i:242}, D{l:17,t:0,i:114}, D{l:4,t:10,i:361}, D{l:133,t:10,i:315}, D{l:137,t:0,i:883}, D{l:132,t:10,i:461}, D{l:138,t:0,i:274}, D{l:134,t:0,i:2008}, D{l:134,t:0,i:1794}, D{l:4,t:0,i:703}, D{l:135,t:0,i:207}, D{l:12,t:0,i:285}, D{l:132,t:10,i:472}, D{l:132,t:0,i:571}, D{l:5,t:0,i:873}, D{l:5,t:0,i:960}, D{l:8,t:0,i:823}, D{l:9,t:0,i:881}, D{l:136,t:11,i:577}, D{l:7,t:0,i:617}, D{l:10,t:0,i:498}, D{l:11,t:0,i:501}, D{l:12,t:0,i:16}, D{l:140,t:0,i:150}, D{l:138,t:10,i:747}, D{l:132,t:0,i:431}, D{l:133,t:10,i:155}, D{l:11,t:0,i:283}, D{l:11,t:0,i:567}, D{l:7,t:10,i:163}, D{l:8,t:10,i:319}, D{l:9,t:10,i:402}, D{l:10,t:10,i:24}, D{l:10,t:10,i:681}, D{l:11,t:10,i:200}, D{l:12,t:10,i:253}, D{l:12,t:10,i:410}, D{l:142,t:10,i:219}, D{l:4,t:11,i:413}, D{l:5,t:11,i:677}, D{l:8,t:11,i:432}, D{l:140,t:11,i:280}, D{l:9,t:0,i:401}, D{l:5,t:10,i:475}, D{l:7,t:10,i:1780}, D{l:11,t:10,i:297}, D{l:11,t:10,i:558}, D{l:14,t:10,i:322}, D{l:147,t:10,i:76}, D{l:6,t:0,i:781}, D{l:9,t:0,i:134}, D{l:10,t:0,i:2}, D{l:10,t:0,i:27}, D{l:10,t:0,i:333}, D{l:11,t:0,i:722}, D{l:143,t:0,i:1}, D{l:5,t:0,i:33}, D{l:6,t:0,i:470}, D{l:139,t:0,i:424}, D{l:135,t:0,i:2006}, D{l:12,t:0,i:783}, D{l:135,t:10,i:1956}, D{l:136,t:0,i:274}, D{l:135,t:0,i:1882}, D{l:132,t:0,i:794}, D{l:135,t:0,i:1848}, D{l:5,t:10,i:944}, D{l:134,t:10,i:1769}, D{l:6,t:0,i:47}, D{l:7,t:0,i:90}, D{l:7,t:0,i:664}, D{l:7,t:0,i:830}, D{l:7,t:0,i:1380}, D{l:7,t:0,i:2025}, D{l:8,t:0,i:448}, D{l:136,t:0,i:828}, D{l:132,t:10,i:144}, D{l:134,t:0,i:1199}, D{l:4,t:11,i:395}, D{l:139,t:11,i:762}, D{l:135,t:11,i:1504}, D{l:9,t:0,i:417}, D{l:137,t:0,i:493}, D{l:9,t:11,i:174}, D{l:10,t:11,i:164}, D{l:11,t:11,i:440}, D{l:11,t:11,i:841}, D{l:143,t:11,i:98}, D{l:134,t:11,i:426}, D{l:139,t:11,i:1002}, D{l:134,t:0,i:295}, D{l:134,t:0,i:816}, D{l:6,t:10,i:247}, D{l:137,t:10,i:555}, D{l:133,t:0,i:1019}, D{l:4,t:0,i:620}, D{l:5,t:11,i:476}, D{l:10,t:10,i:280}, D{l:138,t:10,i:797}, D{l:139,t:0,i:464}, D{l:5,t:11,i:76}, D{l:6,t:11,i:458}, D{l:6,t:11,i:497}, D{l:7,t:11,i:764}, D{l:7,t:11,i:868}, D{l:9,t:11,i:658}, D{l:10,t:11,i:594}, D{l:11,t:11,i:173}, D{l:11,t:11,i:566}, D{l:12,t:11,i:20}, D{l:12,t:11,i:338}, D{l:141,t:11,i:200}, D{l:134,t:0,i:208}, D{l:4,t:11,i:526}, D{l:7,t:11,i:1029}, D{l:135,t:11,i:1054}, D{l:132,t:11,i:636}, D{l:6,t:11,i:233}, D{l:7,t:11,i:660}, D{l:7,t:11,i:1124}, D{l:17,t:11,i:31}, D{l:19,t:11,i:22}, D{l:151,t:11,i:14}, D{l:10,t:0,i:442}, D{l:133,t:10,i:428}, D{l:10,t:0,i:930}, D{l:140,t:0,i:778}, D{l:6,t:0,i:68}, D{l:7,t:0,i:448}, D{l:7,t:0,i:1629}, D{l:7,t:0,i:1769}, D{l:7,t:0,i:1813}, D{l:8,t:0,i:442}, D{l:8,t:0,i:516}, D{l:9,t:0,i:710}, D{l:10,t:0,i:282}, D{l:10,t:0,i:722}, D{l:7,t:10,i:1717}, D{l:138,t:10,i:546}, D{l:134,t:0,i:1128}, D{l:11,t:0,i:844}, D{l:12,t:0,i:104}, D{l:140,t:0,i:625}, D{l:4,t:11,i:432}, D{l:135,t:11,i:824}, D{l:138,t:10,i:189}, D{l:133,t:0,i:787}, D{l:133,t:10,i:99}, D{l:4,t:11,i:279}, D{l:7,t:11,i:301}, D{l:137,t:11,i:362}, D{l:8,t:0,i:491}, D{l:4,t:10,i:397}, D{l:136,t:10,i:555}, D{l:4,t:11,i:178}, D{l:133,t:11,i:399}, D{l:134,t:0,i:711}, D{l:144,t:0,i:9}, D{l:4,t:0,i:403}, D{l:5,t:0,i:441}, D{l:7,t:0,i:450}, D{l:10,t:0,i:840}, D{l:11,t:0,i:101}, D{l:12,t:0,i:193}, D{l:141,t:0,i:430}, D{l:135,t:11,i:1246}, D{l:12,t:10,i:398}, D{l:20,t:10,i:39}, D{l:21,t:10,i:11}, D{l:150,t:10,i:41}, D{l:4,t:10,i:485}, D{l:7,t:10,i:353}, D{l:135,t:10,i:1523}, D{l:6,t:10,i:366}, D{l:7,t:10,i:1384}, D{l:7,t:10,i:1601}, D{l:135,t:11,i:1912}, D{l:7,t:0,i:396}, D{l:10,t:0,i:160}, D{l:135,t:11,i:396}, D{l:137,t:10,i:282}, D{l:134,t:11,i:1692}, D{l:4,t:10,i:157}, D{l:5,t:10,i:471}, D{l:6,t:11,i:202}, D{l:10,t:11,i:448}, D{l:11,t:11,i:208}, D{l:12,t:11,i:360}, D{l:17,t:11,i:117}, D{l:17,t:11,i:118}, D{l:18,t:11,i:27}, D{l:148,t:11,i:67}, D{l:133,t:0,i:679}, D{l:137,t:0,i:326}, D{l:136,t:10,i:116}, D{l:7,t:11,i:872}, D{l:10,t:11,i:516}, D{l:139,t:11,i:167}, D{l:132,t:11,i:224}, D{l:5,t:11,i:546}, D{l:7,t:11,i:35}, D{l:8,t:11,i:11}, D{l:8,t:11,i:12}, D{l:9,t:11,i:315}, D{l:9,t:11,i:533}, D{l:10,t:11,i:802}, D{l:11,t:11,i:166}, D{l:12,t:11,i:525}, D{l:142,t:11,i:243}, D{l:7,t:0,i:1128}, D{l:135,t:11,i:1920}, D{l:5,t:11,i:241}, D{l:8,t:11,i:242}, D{l:9,t:11,i:451}, D{l:10,t:11,i:667}, D{l:11,t:11,i:598}, D{l:140,t:11,i:429}, D{l:6,t:0,i:737}, D{l:5,t:10,i:160}, D{l:7,t:10,i:363}, D{l:7,t:10,i:589}, D{l:10,t:10,i:170}, D{l:141,t:10,i:55}, D{l:135,t:0,i:1796}, D{l:142,t:11,i:254}, D{l:4,t:0,i:574}, D{l:7,t:0,i:350}, D{l:7,t:0,i:1024}, D{l:8,t:0,i:338}, D{l:9,t:0,i:677}, D{l:138,t:0,i:808}, D{l:134,t:0,i:1096}, D{l:137,t:11,i:516}, D{l:7,t:0,i:405}, D{l:10,t:0,i:491}, D{l:4,t:10,i:108}, D{l:4,t:11,i:366}, D{l:139,t:10,i:498}, D{l:11,t:11,i:337}, D{l:142,t:11,i:303}, D{l:134,t:11,i:1736}, D{l:7,t:0,i:1081}, D{l:140,t:11,i:364}, D{l:7,t:10,i:1005}, D{l:140,t:10,i:609}, D{l:7,t:0,i:1676}, D{l:4,t:10,i:895}, D{l:133,t:10,i:772}, D{l:135,t:0,i:2037}, D{l:6,t:0,i:1207}, D{l:11,t:11,i:916}, D{l:142,t:11,i:419}, D{l:14,t:11,i:140}, D{l:148,t:11,i:41}, D{l:6,t:11,i:331}, D{l:136,t:11,i:623}, D{l:9,t:0,i:944}, D{l:9,t:0,i:969}, D{l:9,t:0,i:1022}, D{l:12,t:0,i:913}, D{l:12,t:0,i:936}, D{l:15,t:0,i:177}, D{l:15,t:0,i:193}, D{l:4,t:10,i:926}, D{l:133,t:10,i:983}, D{l:5,t:0,i:354}, D{l:135,t:11,i:506}, D{l:8,t:0,i:598}, D{l:9,t:0,i:664}, D{l:138,t:0,i:441}, D{l:4,t:11,i:640}, D{l:133,t:11,i:513}, D{l:137,t:0,i:297}, D{l:132,t:10,i:538}, D{l:6,t:10,i:294}, D{l:7,t:10,i:1267}, D{l:136,t:10,i:624}, D{l:7,t:0,i:1772}, D{l:7,t:11,i:1888}, D{l:8,t:11,i:289}, D{l:11,t:11,i:45}, D{l:12,t:11,i:278}, D{l:140,t:11,i:537}, D{l:135,t:10,i:1325}, D{l:138,t:0,i:751}, D{l:141,t:0,i:37}, D{l:134,t:0,i:1828}, D{l:132,t:10,i:757}, D{l:132,t:11,i:394}, D{l:6,t:0,i:257}, D{l:135,t:0,i:1522}, D{l:4,t:0,i:582}, D{l:9,t:0,i:191}, D{l:135,t:11,i:1931}, D{l:7,t:11,i:574}, D{l:7,t:11,i:1719}, D{l:137,t:11,i:145}, D{l:132,t:11,i:658}, D{l:10,t:0,i:790}, D{l:132,t:11,i:369}, D{l:9,t:11,i:781}, D{l:10,t:11,i:144}, D{l:11,t:11,i:385}, D{l:13,t:11,i:161}, D{l:13,t:11,i:228}, D{l:13,t:11,i:268}, D{l:148,t:11,i:107}, D{l:8,t:0,i:469}, D{l:10,t:0,i:47}, D{l:136,t:11,i:374}, D{l:6,t:0,i:306}, D{l:7,t:0,i:1140}, D{l:7,t:0,i:1340}, D{l:8,t:0,i:133}, D{l:138,t:0,i:449}, D{l:139,t:0,i:1011}, D{l:7,t:10,i:1875}, D{l:139,t:10,i:124}, D{l:4,t:11,i:344}, D{l:6,t:11,i:498}, D{l:139,t:11,i:323}, D{l:137,t:0,i:299}, D{l:132,t:0,i:837}, D{l:133,t:11,i:906}, D{l:5,t:0,i:329}, D{l:8,t:0,i:260}, D{l:138,t:0,i:10}, D{l:134,t:0,i:1320}, D{l:4,t:0,i:657}, D{l:146,t:0,i:158}, D{l:135,t:0,i:1191}, D{l:152,t:0,i:7}, D{l:6,t:0,i:1939}, D{l:8,t:0,i:974}, D{l:138,t:0,i:996}, D{l:135,t:0,i:1665}, D{l:11,t:11,i:126}, D{l:139,t:11,i:287}, D{l:143,t:0,i:8}, D{l:14,t:11,i:149}, D{l:14,t:11,i:399}, D{l:143,t:11,i:57}, D{l:5,t:0,i:66}, D{l:7,t:0,i:1896}, D{l:136,t:0,i:288}, D{l:7,t:0,i:175}, D{l:10,t:0,i:494}, D{l:5,t:10,i:150}, D{l:8,t:10,i:603}, D{l:9,t:10,i:593}, D{l:9,t:10,i:634}, D{l:10,t:10,i:173}, D{l:11,t:10,i:462}, D{l:11,t:10,i:515}, D{l:13,t:10,i:216}, D{l:13,t:10,i:288}, D{l:142,t:10,i:400}, D{l:134,t:0,i:1643}, D{l:136,t:11,i:21}, D{l:4,t:0,i:21}, D{l:5,t:0,i:91}, D{l:5,t:0,i:648}, D{l:5,t:0,i:750}, D{l:5,t:0,i:781}, D{l:6,t:0,i:54}, D{l:6,t:0,i:112}, D{l:6,t:0,i:402}, D{l:6,t:0,i:1732}, D{l:7,t:0,i:315}, D{l:7,t:0,i:749}, D{l:7,t:0,i:1427}, D{l:7,t:0,i:1900}, D{l:9,t:0,i:78}, D{l:9,t:0,i:508}, D{l:10,t:0,i:611}, D{l:10,t:0,i:811}, D{l:11,t:0,i:510}, D{l:11,t:0,i:728}, D{l:13,t:0,i:36}, D{l:14,t:0,i:39}, D{l:16,t:0,i:83}, D{l:17,t:0,i:124}, D{l:148,t:0,i:30}, D{l:4,t:0,i:668}, D{l:136,t:0,i:570}, D{l:10,t:0,i:322}, D{l:10,t:0,i:719}, D{l:139,t:0,i:407}, D{l:135,t:11,i:1381}, D{l:136,t:11,i:193}, D{l:12,t:10,i:108}, D{l:141,t:10,i:291}, D{l:132,t:11,i:616}, D{l:136,t:11,i:692}, D{l:8,t:0,i:125}, D{l:8,t:0,i:369}, D{l:8,t:0,i:524}, D{l:10,t:0,i:486}, D{l:11,t:0,i:13}, D{l:11,t:0,i:381}, D{l:11,t:0,i:736}, D{l:11,t:0,i:766}, D{l:11,t:0,i:845}, D{l:13,t:0,i:114}, D{l:13,t:0,i:292}, D{l:142,t:0,i:47}, D{l:134,t:0,i:1247}, D{l:6,t:0,i:1684}, D{l:6,t:0,i:1731}, D{l:7,t:0,i:356}, D{l:8,t:0,i:54}, D{l:8,t:0,i:221}, D{l:9,t:0,i:225}, D{l:9,t:0,i:356}, D{l:10,t:0,i:77}, D{l:10,t:0,i:446}, D{l:10,t:0,i:731}, D{l:12,t:0,i:404}, D{l:141,t:0,i:491}, D{l:135,t:10,i:1777}, D{l:4,t:11,i:305}, D{l:4,t:10,i:493}, D{l:144,t:10,i:55}, D{l:4,t:0,i:951}, D{l:6,t:0,i:1809}, D{l:6,t:0,i:1849}, D{l:8,t:0,i:846}, D{l:8,t:0,i:866}, D{l:8,t:0,i:899}, D{l:10,t:0,i:896}, D{l:12,t:0,i:694}, D{l:142,t:0,i:468}, D{l:5,t:11,i:214}, D{l:7,t:11,i:603}, D{l:8,t:11,i:611}, D{l:9,t:11,i:686}, D{l:10,t:11,i:88}, D{l:11,t:11,i:459}, D{l:11,t:11,i:496}, D{l:12,t:11,i:463}, D{l:12,t:11,i:590}, D{l:13,t:11,i:0}, D{l:142,t:11,i:214}, D{l:132,t:0,i:411}, D{l:4,t:0,i:80}, D{l:133,t:0,i:44}, D{l:140,t:11,i:74}, D{l:143,t:0,i:31}, D{l:7,t:0,i:669}, D{l:6,t:10,i:568}, D{l:7,t:10,i:1804}, D{l:8,t:10,i:362}, D{l:8,t:10,i:410}, D{l:8,t:10,i:830}, D{l:9,t:10,i:514}, D{l:11,t:10,i:649}, D{l:142,t:10,i:157}, D{l:7,t:0,i:673}, D{l:134,t:11,i:1703}, D{l:132,t:10,i:625}, D{l:134,t:0,i:1303}, D{l:5,t:0,i:299}, D{l:135,t:0,i:1083}, D{l:138,t:0,i:704}, D{l:6,t:0,i:275}, D{l:7,t:0,i:408}, D{l:6,t:10,i:158}, D{l:7,t:10,i:129}, D{l:7,t:10,i:181}, D{l:8,t:10,i:276}, D{l:8,t:10,i:377}, D{l:10,t:10,i:523}, D{l:11,t:10,i:816}, D{l:12,t:10,i:455}, D{l:13,t:10,i:303}, D{l:142,t:10,i:135}, D{l:4,t:0,i:219}, D{l:7,t:0,i:367}, D{l:7,t:0,i:1713}, D{l:7,t:0,i:1761}, D{l:9,t:0,i:86}, D{l:9,t:0,i:537}, D{l:10,t:0,i:165}, D{l:12,t:0,i:219}, D{l:140,t:0,i:561}, D{l:8,t:0,i:216}, D{l:4,t:10,i:1}, D{l:4,t:11,i:737}, D{l:6,t:11,i:317}, D{l:7,t:10,i:1143}, D{l:7,t:10,i:1463}, D{l:9,t:10,i:207}, D{l:9,t:10,i:390}, D{l:9,t:10,i:467}, D{l:10,t:11,i:98}, D{l:11,t:11,i:294}, D{l:11,t:10,i:836}, D{l:12,t:11,i:60}, D{l:12,t:11,i:437}, D{l:13,t:11,i:64}, D{l:13,t:11,i:380}, D{l:142,t:11,i:430}, D{l:6,t:11,i:1758}, D{l:8,t:11,i:520}, D{l:9,t:11,i:345}, D{l:9,t:11,i:403}, D{l:142,t:11,i:350}, D{l:5,t:11,i:47}, D{l:10,t:11,i:242}, D{l:138,t:11,i:579}, D{l:5,t:11,i:139}, D{l:7,t:11,i:1168}, D{l:138,t:11,i:539}, D{l:135,t:0,i:1319}, D{l:4,t:10,i:295}, D{l:4,t:10,i:723}, D{l:5,t:10,i:895}, D{l:7,t:10,i:1031}, D{l:8,t:10,i:199}, D{l:8,t:10,i:340}, D{l:9,t:10,i:153}, D{l:9,t:10,i:215}, D{l:10,t:10,i:21}, D{l:10,t:10,i:59}, D{l:10,t:10,i:80}, D{l:10,t:10,i:224}, D{l:10,t:10,i:838}, D{l:11,t:10,i:229}, D{l:11,t:10,i:652}, D{l:12,t:10,i:192}, D{l:13,t:10,i:146}, D{l:142,t:10,i:91}, D{l:140,t:0,i:428}, D{l:137,t:10,i:51}, D{l:133,t:0,i:514}, D{l:5,t:10,i:309}, D{l:140,t:10,i:211}, D{l:6,t:0,i:1010}, D{l:5,t:10,i:125}, D{l:8,t:10,i:77}, D{l:138,t:10,i:15}, D{l:4,t:0,i:55}, D{l:5,t:0,i:301}, D{l:6,t:0,i:571}, D{l:142,t:0,i:49}, D{l:146,t:0,i:102}, D{l:136,t:11,i:370}, D{l:4,t:11,i:107}, D{l:7,t:11,i:613}, D{l:8,t:11,i:358}, D{l:8,t:11,i:439}, D{l:8,t:11,i:504}, D{l:9,t:11,i:501}, D{l:10,t:11,i:383}, D{l:139,t:11,i:477}, D{l:132,t:11,i:229}, D{l:133,t:0,i:364}, D{l:133,t:10,i:439}, D{l:4,t:11,i:903}, D{l:135,t:11,i:1816}, D{l:11,t:0,i:379}, D{l:140,t:10,i:76}, D{l:4,t:0,i:76}, D{l:4,t:0,i:971}, D{l:7,t:0,i:1550}, D{l:9,t:0,i:306}, D{l:9,t:0,i:430}, D{l:9,t:0,i:663}, D{l:10,t:0,i:683}, D{l:10,t:0,i:921}, D{l:11,t:0,i:427}, D{l:11,t:0,i:753}, D{l:12,t:0,i:334}, D{l:12,t:0,i:442}, D{l:14,t:0,i:258}, D{l:14,t:0,i:366}, D{l:143,t:0,i:131}, D{l:137,t:0,i:52}, D{l:4,t:11,i:47}, D{l:6,t:11,i:373}, D{l:7,t:11,i:452}, D{l:7,t:11,i:543}, D{l:7,t:11,i:1714}, D{l:7,t:11,i:1856}, D{l:9,t:11,i:6}, D{l:11,t:11,i:257}, D{l:139,t:11,i:391}, D{l:4,t:10,i:8}, D{l:7,t:10,i:1152}, D{l:7,t:10,i:1153}, D{l:7,t:10,i:1715}, D{l:9,t:10,i:374}, D{l:10,t:10,i:478}, D{l:139,t:10,i:648}, D{l:4,t:11,i:785}, D{l:133,t:11,i:368}, D{l:135,t:10,i:1099}, D{l:135,t:11,i:860}, D{l:5,t:11,i:980}, D{l:134,t:11,i:1754}, D{l:134,t:0,i:1258}, D{l:6,t:0,i:1058}, D{l:6,t:0,i:1359}, D{l:7,t:11,i:536}, D{l:7,t:11,i:1331}, D{l:136,t:11,i:143}, D{l:4,t:0,i:656}, D{l:135,t:0,i:779}, D{l:136,t:10,i:87}, D{l:5,t:11,i:19}, D{l:6,t:11,i:533}, D{l:146,t:11,i:126}, D{l:7,t:0,i:144}, D{l:138,t:10,i:438}, D{l:5,t:11,i:395}, D{l:5,t:11,i:951}, D{l:134,t:11,i:1776}, D{l:135,t:0,i:1373}, D{l:7,t:0,i:554}, D{l:7,t:0,i:605}, D{l:141,t:0,i:10}, D{l:4,t:10,i:69}, D{l:5,t:10,i:122}, D{l:9,t:10,i:656}, D{l:138,t:10,i:464}, D{l:5,t:10,i:849}, D{l:134,t:10,i:1633}, D{l:5,t:0,i:838}, D{l:5,t:0,i:841}, D{l:134,t:0,i:1649}, D{l:133,t:0,i:1012}, D{l:139,t:10,i:499}, D{l:7,t:10,i:476}, D{l:7,t:10,i:1592}, D{l:138,t:10,i:87}, D{l:6,t:0,i:251}, D{l:7,t:0,i:365}, D{l:7,t:0,i:1357}, D{l:7,t:0,i:1497}, D{l:8,t:0,i:154}, D{l:141,t:0,i:281}, D{l:132,t:11,i:441}, D{l:132,t:11,i:695}, D{l:7,t:11,i:497}, D{l:9,t:11,i:387}, D{l:147,t:11,i:81}, D{l:133,t:0,i:340}, D{l:14,t:10,i:283}, D{l:142,t:11,i:283}, D{l:134,t:0,i:810}, D{l:135,t:11,i:1894}, D{l:139,t:0,i:495}, D{l:5,t:11,i:284}, D{l:6,t:11,i:49}, D{l:6,t:11,i:350}, D{l:7,t:11,i:1}, D{l:7,t:11,i:377}, D{l:7,t:11,i:1693}, D{l:8,t:11,i:18}, D{l:8,t:11,i:678}, D{l:9,t:11,i:161}, D{l:9,t:11,i:585}, D{l:9,t:11,i:671}, D{l:9,t:11,i:839}, D{l:11,t:11,i:912}, D{l:141,t:11,i:427}, D{l:5,t:10,i:859}, D{l:7,t:10,i:1160}, D{l:8,t:10,i:107}, D{l:9,t:10,i:291}, D{l:9,t:10,i:439}, D{l:10,t:10,i:663}, D{l:11,t:10,i:609}, D{l:140,t:10,i:197}, D{l:8,t:0,i:261}, D{l:9,t:0,i:144}, D{l:9,t:0,i:466}, D{l:10,t:0,i:370}, D{l:12,t:0,i:470}, D{l:13,t:0,i:144}, D{l:142,t:0,i:348}, D{l:137,t:0,i:897}, D{l:6,t:0,i:248}, D{l:9,t:0,i:546}, D{l:10,t:0,i:535}, D{l:11,t:0,i:681}, D{l:141,t:0,i:135}, D{l:4,t:0,i:358}, D{l:135,t:0,i:1496}, D{l:134,t:0,i:567}, D{l:136,t:0,i:445}, D{l:4,t:10,i:117}, D{l:6,t:10,i:372}, D{l:7,t:10,i:1905}, D{l:142,t:10,i:323}, D{l:4,t:10,i:722}, D{l:139,t:10,i:471}, D{l:6,t:0,i:697}, D{l:134,t:0,i:996}, D{l:7,t:11,i:2007}, D{l:9,t:11,i:101}, D{l:9,t:11,i:450}, D{l:10,t:11,i:66}, D{l:10,t:11,i:842}, D{l:11,t:11,i:536}, D{l:140,t:11,i:587}, D{l:132,t:0,i:577}, D{l:134,t:0,i:1336}, D{l:9,t:10,i:5}, D{l:12,t:10,i:216}, D{l:12,t:10,i:294}, D{l:12,t:10,i:298}, D{l:12,t:10,i:400}, D{l:12,t:10,i:518}, D{l:13,t:10,i:229}, D{l:143,t:10,i:139}, D{l:6,t:0,i:174}, D{l:138,t:0,i:917}, D{l:134,t:10,i:1774}, D{l:5,t:10,i:12}, D{l:7,t:10,i:375}, D{l:9,t:10,i:88}, D{l:9,t:10,i:438}, D{l:11,t:11,i:62}, D{l:139,t:10,i:270}, D{l:134,t:11,i:1766}, D{l:6,t:11,i:0}, D{l:7,t:11,i:84}, D{l:7,t:10,i:816}, D{l:7,t:10,i:1241}, D{l:9,t:10,i:283}, D{l:9,t:10,i:520}, D{l:10,t:10,i:213}, D{l:10,t:10,i:307}, D{l:10,t:10,i:463}, D{l:10,t:10,i:671}, D{l:10,t:10,i:746}, D{l:11,t:10,i:401}, D{l:11,t:10,i:794}, D{l:11,t:11,i:895}, D{l:12,t:10,i:517}, D{l:17,t:11,i:11}, D{l:18,t:10,i:107}, D{l:147,t:10,i:115}, D{l:5,t:0,i:878}, D{l:133,t:0,i:972}, D{l:6,t:11,i:1665}, D{l:7,t:11,i:256}, D{l:7,t:11,i:1388}, D{l:138,t:11,i:499}, D{l:4,t:10,i:258}, D{l:136,t:10,i:639}, D{l:4,t:11,i:22}, D{l:5,t:11,i:10}, D{l:6,t:10,i:22}, D{l:7,t:11,i:848}, D{l:7,t:10,i:903}, D{l:7,t:10,i:1963}, D{l:8,t:11,i:97}, D{l:138,t:10,i:577}, D{l:5,t:10,i:681}, D{l:136,t:10,i:782}, D{l:133,t:11,i:481}, D{l:132,t:0,i:351}, D{l:4,t:10,i:664}, D{l:5,t:10,i:804}, D{l:139,t:10,i:1013}, D{l:6,t:11,i:134}, D{l:7,t:11,i:437}, D{l:7,t:11,i:959}, D{l:9,t:11,i:37}, D{l:14,t:11,i:285}, D{l:14,t:11,i:371}, D{l:144,t:11,i:60}, D{l:7,t:11,i:486}, D{l:8,t:11,i:155}, D{l:11,t:11,i:93}, D{l:140,t:11,i:164}, D{l:132,t:0,i:286}, D{l:7,t:0,i:438}, D{l:7,t:0,i:627}, D{l:7,t:0,i:1516}, D{l:8,t:0,i:40}, D{l:9,t:0,i:56}, D{l:9,t:0,i:294}, D{l:10,t:0,i:30}, D{l:11,t:0,i:969}, D{l:11,t:0,i:995}, D{l:146,t:0,i:148}, D{l:5,t:11,i:591}, D{l:135,t:11,i:337}, D{l:134,t:0,i:1950}, D{l:133,t:10,i:32}, D{l:138,t:11,i:500}, D{l:5,t:11,i:380}, D{l:5,t:11,i:650}, D{l:136,t:11,i:310}, D{l:4,t:11,i:364}, D{l:7,t:11,i:1156}, D{l:7,t:11,i:1187}, D{l:137,t:11,i:409}, D{l:4,t:0,i:738}, D{l:134,t:11,i:482}, D{l:4,t:11,i:781}, D{l:6,t:11,i:487}, D{l:7,t:11,i:926}, D{l:8,t:11,i:263}, D{l:139,t:11,i:500}, D{l:135,t:11,i:418}, D{l:6,t:0,i:2047}, D{l:10,t:0,i:969}, D{l:4,t:10,i:289}, D{l:7,t:10,i:629}, D{l:7,t:10,i:1698}, D{l:7,t:10,i:1711}, D{l:140,t:10,i:215}, D{l:6,t:10,i:450}, D{l:136,t:10,i:109}, D{l:134,t:0,i:818}, D{l:136,t:10,i:705}, D{l:133,t:0,i:866}, D{l:4,t:11,i:94}, D{l:135,t:11,i:1265}, D{l:132,t:11,i:417}, D{l:134,t:0,i:1467}, D{l:135,t:10,i:1238}, D{l:4,t:0,i:972}, D{l:6,t:0,i:1851}, D{l:134,t:0,i:1857}, D{l:134,t:0,i:355}, D{l:133,t:0,i:116}, D{l:132,t:0,i:457}, D{l:135,t:11,i:1411}, D{l:4,t:11,i:408}, D{l:4,t:11,i:741}, D{l:135,t:11,i:500}, D{l:134,t:10,i:26}, D{l:142,t:11,i:137}, D{l:5,t:0,i:527}, D{l:6,t:0,i:189}, D{l:7,t:0,i:859}, D{l:136,t:0,i:267}, D{l:11,t:0,i:104}, D{l:11,t:0,i:554}, D{l:15,t:0,i:60}, D{l:143,t:0,i:125}, D{l:134,t:0,i:1613}, D{l:4,t:10,i:414}, D{l:5,t:10,i:467}, D{l:9,t:10,i:654}, D{l:10,t:10,i:451}, D{l:12,t:10,i:59}, D{l:141,t:10,i:375}, D{l:135,t:10,i:17}, D{l:134,t:0,i:116}, D{l:135,t:11,i:541}, D{l:135,t:10,i:955}, D{l:6,t:11,i:73}, D{l:135,t:11,i:177}, D{l:133,t:11,i:576}, D{l:134,t:0,i:886}, D{l:133,t:0,i:487}, D{l:4,t:0,i:86}, D{l:5,t:0,i:667}, D{l:5,t:0,i:753}, D{l:6,t:0,i:316}, D{l:6,t:0,i:455}, D{l:135,t:0,i:946}, D{l:142,t:11,i:231}, D{l:150,t:0,i:45}, D{l:134,t:0,i:863}, D{l:134,t:0,i:1953}, D{l:6,t:10,i:280}, D{l:10,t:10,i:502}, D{l:11,t:10,i:344}, D{l:140,t:10,i:38}, D{l:4,t:0,i:79}, D{l:7,t:0,i:1773}, D{l:10,t:0,i:450}, D{l:11,t:0,i:589}, D{l:13,t:0,i:332}, D{l:13,t:0,i:493}, D{l:14,t:0,i:183}, D{l:14,t:0,i:334}, D{l:14,t:0,i:362}, D{l:14,t:0,i:368}, D{l:14,t:0,i:376}, D{l:14,t:0,i:379}, D{l:19,t:0,i:90}, D{l:19,t:0,i:103}, D{l:19,t:0,i:127}, D{l:148,t:0,i:90}, D{l:5,t:10,i:45}, D{l:7,t:10,i:1161}, D{l:11,t:10,i:448}, D{l:11,t:10,i:880}, D{l:13,t:10,i:139}, D{l:13,t:10,i:407}, D{l:15,t:10,i:16}, D{l:17,t:10,i:95}, D{l:18,t:10,i:66}, D{l:18,t:10,i:88}, D{l:18,t:10,i:123}, D{l:149,t:10,i:7}, D{l:136,t:10,i:777}, D{l:4,t:10,i:410}, D{l:135,t:10,i:521}, D{l:135,t:10,i:1778}, D{l:135,t:11,i:538}, D{l:142,t:0,i:381}, D{l:133,t:11,i:413}, D{l:134,t:0,i:1142}, D{l:6,t:0,i:1189}, D{l:136,t:11,i:495}, D{l:5,t:0,i:663}, D{l:6,t:0,i:1962}, D{l:134,t:0,i:2003}, D{l:7,t:11,i:54}, D{l:8,t:11,i:312}, D{l:10,t:11,i:191}, D{l:10,t:11,i:614}, D{l:140,t:11,i:567}, D{l:132,t:10,i:436}, D{l:133,t:0,i:846}, D{l:10,t:0,i:528}, D{l:11,t:0,i:504}, D{l:7,t:10,i:1587}, D{l:135,t:10,i:1707}, D{l:5,t:0,i:378}, D{l:8,t:0,i:465}, D{l:9,t:0,i:286}, D{l:10,t:0,i:185}, D{l:10,t:0,i:562}, D{l:10,t:0,i:635}, D{l:11,t:0,i:31}, D{l:11,t:0,i:393}, D{l:13,t:0,i:312}, D{l:18,t:0,i:65}, D{l:18,t:0,i:96}, D{l:147,t:0,i:89}, D{l:7,t:0,i:899}, D{l:14,t:0,i:325}, D{l:6,t:11,i:468}, D{l:7,t:11,i:567}, D{l:7,t:11,i:1478}, D{l:8,t:11,i:530}, D{l:142,t:11,i:290}, D{l:7,t:0,i:1880}, D{l:9,t:0,i:680}, D{l:139,t:0,i:798}, D{l:134,t:0,i:1770}, D{l:132,t:0,i:648}, D{l:150,t:11,i:35}, D{l:5,t:0,i:945}, D{l:6,t:0,i:1656}, D{l:6,t:0,i:1787}, D{l:7,t:0,i:167}, D{l:8,t:0,i:824}, D{l:9,t:0,i:391}, D{l:10,t:0,i:375}, D{l:139,t:0,i:185}, D{l:6,t:11,i:484}, D{l:135,t:11,i:822}, D{l:134,t:0,i:2046}, D{l:7,t:0,i:1645}, D{l:8,t:0,i:352}, D{l:137,t:0,i:249}, D{l:132,t:0,i:152}, D{l:6,t:0,i:611}, D{l:135,t:0,i:1733}, D{l:6,t:11,i:1724}, D{l:135,t:11,i:2022}, D{l:133,t:0,i:1006}, D{l:141,t:11,i:96}, D{l:5,t:0,i:420}, D{l:135,t:0,i:1449}, D{l:146,t:11,i:149}, D{l:135,t:0,i:832}, D{l:135,t:10,i:663}, D{l:133,t:0,i:351}, D{l:5,t:0,i:40}, D{l:7,t:0,i:598}, D{l:7,t:0,i:1638}, D{l:8,t:0,i:78}, D{l:9,t:0,i:166}, D{l:9,t:0,i:640}, D{l:9,t:0,i:685}, D{l:9,t:0,i:773}, D{l:11,t:0,i:215}, D{l:13,t:0,i:65}, D{l:14,t:0,i:172}, D{l:14,t:0,i:317}, D{l:145,t:0,i:6}, D{l:8,t:0,i:60}, D{l:9,t:0,i:343}, D{l:139,t:0,i:769}, D{l:134,t:0,i:1354}, D{l:132,t:0,i:724}, D{l:137,t:0,i:745}, D{l:132,t:11,i:474}, D{l:7,t:0,i:1951}, D{l:8,t:0,i:765}, D{l:8,t:0,i:772}, D{l:140,t:0,i:671}, D{l:7,t:0,i:108}, D{l:8,t:0,i:219}, D{l:8,t:0,i:388}, D{l:9,t:0,i:775}, D{l:11,t:0,i:275}, D{l:140,t:0,i:464}, D{l:137,t:0,i:639}, D{l:135,t:10,i:503}, D{l:133,t:11,i:366}, D{l:5,t:0,i:15}, D{l:6,t:0,i:56}, D{l:7,t:0,i:1758}, D{l:8,t:0,i:500}, D{l:9,t:0,i:730}, D{l:11,t:0,i:331}, D{l:13,t:0,i:150}, D{l:14,t:0,i:282}, D{l:5,t:11,i:305}, D{l:9,t:11,i:560}, D{l:141,t:11,i:208}, D{l:4,t:10,i:113}, D{l:5,t:10,i:163}, D{l:5,t:10,i:735}, D{l:7,t:10,i:1009}, D{l:9,t:10,i:9}, D{l:9,t:10,i:771}, D{l:12,t:10,i:90}, D{l:13,t:10,i:138}, D{l:13,t:10,i:410}, D{l:143,t:10,i:128}, D{l:4,t:10,i:324}, D{l:138,t:10,i:104}, D{l:135,t:11,i:466}, D{l:142,t:11,i:27}, D{l:134,t:0,i:1886}, D{l:5,t:0,i:205}, D{l:6,t:0,i:438}, D{l:9,t:0,i:711}, D{l:4,t:11,i:480}, D{l:6,t:11,i:167}, D{l:6,t:11,i:302}, D{l:6,t:11,i:1642}, D{l:7,t:11,i:130}, D{l:7,t:11,i:656}, D{l:7,t:11,i:837}, D{l:7,t:11,i:1547}, D{l:7,t:11,i:1657}, D{l:8,t:11,i:429}, D{l:9,t:11,i:228}, D{l:10,t:11,i:643}, D{l:13,t:11,i:289}, D{l:13,t:11,i:343}, D{l:147,t:11,i:101}, D{l:134,t:0,i:865}, D{l:6,t:0,i:2025}, D{l:136,t:0,i:965}, D{l:7,t:11,i:278}, D{l:10,t:11,i:739}, D{l:11,t:11,i:708}, D{l:141,t:11,i:348}, D{l:133,t:0,i:534}, D{l:135,t:11,i:1922}, D{l:137,t:0,i:691}, D{l:4,t:10,i:935}, D{l:133,t:10,i:823}, D{l:6,t:0,i:443}, D{l:9,t:0,i:237}, D{l:9,t:0,i:571}, D{l:9,t:0,i:695}, D{l:10,t:0,i:139}, D{l:11,t:0,i:715}, D{l:12,t:0,i:417}, D{l:141,t:0,i:421}, D{l:5,t:10,i:269}, D{l:7,t:10,i:434}, D{l:7,t:10,i:891}, D{l:8,t:10,i:339}, D{l:9,t:10,i:702}, D{l:11,t:10,i:594}, D{l:11,t:10,i:718}, D{l:145,t:10,i:100}, D{l:6,t:0,i:1555}, D{l:7,t:0,i:878}, D{l:9,t:10,i:485}, D{l:141,t:10,i:264}, D{l:134,t:10,i:1713}, D{l:7,t:10,i:1810}, D{l:11,t:10,i:866}, D{l:12,t:10,i:103}, D{l:141,t:10,i:495}, D{l:135,t:10,i:900}, D{l:6,t:0,i:1410}, D{l:9,t:11,i:316}, D{l:139,t:11,i:256}, D{l:4,t:0,i:995}, D{l:135,t:0,i:1033}, D{l:132,t:0,i:578}, D{l:10,t:0,i:881}, D{l:12,t:0,i:740}, D{l:12,t:0,i:743}, D{l:140,t:0,i:759}, D{l:132,t:0,i:822}, D{l:133,t:0,i:923}, D{l:142,t:10,i:143}, D{l:135,t:11,i:1696}, D{l:6,t:11,i:363}, D{l:7,t:11,i:1955}, D{l:136,t:11,i:725}, D{l:132,t:0,i:924}, D{l:133,t:0,i:665}, D{l:135,t:10,i:2029}, D{l:135,t:0,i:1901}, D{l:4,t:0,i:265}, D{l:6,t:0,i:1092}, D{l:6,t:0,i:1417}, D{l:7,t:0,i:807}, D{l:135,t:0,i:950}, D{l:5,t:0,i:93}, D{l:12,t:0,i:267}, D{l:141,t:0,i:498}, D{l:135,t:0,i:1451}, D{l:5,t:11,i:813}, D{l:135,t:11,i:2046}, D{l:5,t:10,i:625}, D{l:135,t:10,i:1617}, D{l:135,t:0,i:747}, D{l:6,t:0,i:788}, D{l:137,t:0,i:828}, D{l:7,t:0,i:184}, D{l:11,t:0,i:307}, D{l:11,t:0,i:400}, D{l:15,t:0,i:130}, D{l:5,t:11,i:712}, D{l:7,t:11,i:1855}, D{l:8,t:10,i:425}, D{l:8,t:10,i:693}, D{l:9,t:10,i:720}, D{l:10,t:10,i:380}, D{l:10,t:10,i:638}, D{l:11,t:11,i:17}, D{l:11,t:10,i:473}, D{l:12,t:10,i:61}, D{l:13,t:11,i:321}, D{l:144,t:11,i:67}, D{l:135,t:0,i:198}, D{l:6,t:11,i:320}, D{l:7,t:11,i:781}, D{l:7,t:11,i:1921}, D{l:9,t:11,i:55}, D{l:10,t:11,i:186}, D{l:10,t:11,i:273}, D{l:10,t:11,i:664}, D{l:10,t:11,i:801}, D{l:11,t:11,i:996}, D{l:11,t:11,i:997}, D{l:13,t:11,i:157}, D{l:142,t:11,i:170}, D{l:136,t:11,i:271}, D{l:135,t:0,i:994}, D{l:7,t:11,i:103}, D{l:7,t:11,i:863}, D{l:11,t:11,i:184}, D{l:14,t:11,i:299}, D{l:145,t:11,i:62}, D{l:11,t:10,i:551}, D{l:142,t:10,i:159}, D{l:5,t:0,i:233}, D{l:5,t:0,i:320}, D{l:6,t:0,i:140}, D{l:8,t:0,i:295}, D{l:8,t:0,i:615}, D{l:136,t:11,i:615}, D{l:133,t:0,i:978}, D{l:4,t:0,i:905}, D{l:6,t:0,i:1701}, D{l:137,t:0,i:843}, D{l:132,t:10,i:168}, D{l:4,t:0,i:974}, D{l:8,t:0,i:850}, D{l:12,t:0,i:709}, D{l:12,t:0,i:768}, D{l:140,t:0,i:786}, D{l:135,t:10,i:91}, D{l:152,t:0,i:6}, D{l:138,t:10,i:532}, D{l:135,t:10,i:1884}, D{l:132,t:0,i:509}, D{l:6,t:0,i:1307}, D{l:135,t:0,i:273}, D{l:5,t:11,i:77}, D{l:7,t:11,i:1455}, D{l:10,t:11,i:843}, D{l:19,t:11,i:73}, D{l:150,t:11,i:5}, D{l:132,t:11,i:458}, D{l:135,t:11,i:1420}, D{l:6,t:11,i:109}, D{l:138,t:11,i:382}, D{l:6,t:0,i:201}, D{l:6,t:11,i:330}, D{l:7,t:10,i:70}, D{l:7,t:11,i:1084}, D{l:10,t:10,i:240}, D{l:11,t:11,i:142}, D{l:147,t:10,i:93}, D{l:7,t:0,i:1041}, D{l:140,t:11,i:328}, D{l:133,t:11,i:354}, D{l:134,t:0,i:1040}, D{l:133,t:0,i:693}, D{l:134,t:0,i:774}, D{l:139,t:0,i:234}, D{l:132,t:0,i:336}, D{l:7,t:0,i:1399}, D{l:139,t:10,i:392}, D{l:20,t:0,i:22}, D{l:148,t:11,i:22}, D{l:5,t:0,i:802}, D{l:7,t:0,i:2021}, D{l:136,t:0,i:805}, D{l:5,t:0,i:167}, D{l:5,t:0,i:899}, D{l:6,t:0,i:410}, D{l:137,t:0,i:777}, D{l:137,t:0,i:789}, D{l:134,t:0,i:1705}, D{l:7,t:10,i:655}, D{l:135,t:10,i:1844}, D{l:4,t:10,i:145}, D{l:6,t:10,i:176}, D{l:7,t:10,i:395}, D{l:137,t:10,i:562}, D{l:132,t:10,i:501}, D{l:135,t:0,i:10}, D{l:5,t:0,i:11}, D{l:6,t:0,i:117}, D{l:6,t:0,i:485}, D{l:7,t:0,i:1133}, D{l:9,t:0,i:582}, D{l:9,t:0,i:594}, D{l:10,t:0,i:82}, D{l:11,t:0,i:21}, D{l:11,t:0,i:818}, D{l:12,t:0,i:535}, D{l:13,t:0,i:86}, D{l:20,t:0,i:91}, D{l:23,t:0,i:13}, D{l:134,t:10,i:509}, D{l:4,t:0,i:264}, D{l:7,t:0,i:1067}, D{l:8,t:0,i:204}, D{l:8,t:0,i:385}, D{l:139,t:0,i:953}, D{l:139,t:11,i:737}, D{l:138,t:0,i:56}, D{l:134,t:0,i:1917}, D{l:133,t:0,i:470}, D{l:10,t:11,i:657}, D{l:14,t:11,i:297}, D{l:142,t:11,i:361}, D{l:135,t:11,i:412}, D{l:7,t:0,i:1198}, D{l:7,t:11,i:1198}, D{l:8,t:11,i:556}, D{l:14,t:11,i:123}, D{l:14,t:11,i:192}, D{l:143,t:11,i:27}, D{l:7,t:11,i:1985}, D{l:14,t:11,i:146}, D{l:15,t:11,i:42}, D{l:16,t:11,i:23}, D{l:17,t:11,i:86}, D{l:146,t:11,i:17}, D{l:11,t:0,i:1015}, D{l:136,t:11,i:122}, D{l:4,t:10,i:114}, D{l:9,t:10,i:492}, D{l:13,t:10,i:462}, D{l:142,t:10,i:215}, D{l:4,t:10,i:77}, D{l:5,t:10,i:361}, D{l:6,t:10,i:139}, D{l:6,t:10,i:401}, D{l:6,t:10,i:404}, D{l:7,t:10,i:413}, D{l:7,t:10,i:715}, D{l:7,t:10,i:1716}, D{l:11,t:10,i:279}, D{l:12,t:10,i:179}, D{l:12,t:10,i:258}, D{l:13,t:10,i:244}, D{l:142,t:10,i:358}, D{l:134,t:10,i:1717}, D{l:7,t:10,i:1061}, D{l:8,t:10,i:82}, D{l:11,t:10,i:250}, D{l:12,t:10,i:420}, D{l:141,t:10,i:184}, D{l:133,t:0,i:715}, D{l:135,t:10,i:724}, D{l:9,t:0,i:919}, D{l:9,t:0,i:922}, D{l:9,t:0,i:927}, D{l:9,t:0,i:933}, D{l:9,t:0,i:962}, D{l:9,t:0,i:1000}, D{l:9,t:0,i:1002}, D{l:9,t:0,i:1021}, D{l:12,t:0,i:890}, D{l:12,t:0,i:907}, D{l:12,t:0,i:930}, D{l:15,t:0,i:207}, D{l:15,t:0,i:228}, D{l:15,t:0,i:238}, D{l:149,t:0,i:61}, D{l:8,t:0,i:794}, D{l:9,t:0,i:400}, D{l:10,t:0,i:298}, D{l:142,t:0,i:228}, D{l:5,t:11,i:430}, D{l:5,t:11,i:932}, D{l:6,t:11,i:131}, D{l:7,t:11,i:417}, D{l:9,t:11,i:522}, D{l:11,t:11,i:314}, D{l:141,t:11,i:390}, D{l:132,t:0,i:867}, D{l:8,t:0,i:724}, D{l:132,t:11,i:507}, D{l:137,t:11,i:261}, D{l:4,t:11,i:343}, D{l:133,t:11,i:511}, D{l:6,t:0,i:190}, D{l:7,t:0,i:768}, D{l:135,t:0,i:1170}, D{l:6,t:10,i:513}, D{l:135,t:10,i:1052}, D{l:7,t:11,i:455}, D{l:138,t:11,i:591}, D{l:134,t:0,i:1066}, D{l:137,t:10,i:899}, D{l:14,t:0,i:67}, D{l:147,t:0,i:60}, D{l:4,t:0,i:948}, D{l:18,t:0,i:174}, D{l:146,t:0,i:176}, D{l:135,t:0,i:1023}, D{l:7,t:10,i:1417}, D{l:12,t:10,i:382}, D{l:17,t:10,i:48}, D{l:152,t:10,i:12}, D{l:134,t:11,i:575}, D{l:132,t:0,i:764}, D{l:6,t:10,i:545}, D{l:7,t:10,i:565}, D{l:7,t:10,i:1669}, D{l:10,t:10,i:114}, D{l:11,t:10,i:642}, D{l:140,t:10,i:618}, D{l:6,t:0,i:137}, D{l:9,t:0,i:75}, D{l:9,t:0,i:253}, D{l:10,t:0,i:194}, D{l:138,t:0,i:444}, D{l:4,t:0,i:756}, D{l:133,t:10,i:5}, D{l:8,t:0,i:1008}, D{l:135,t:10,i:192}, D{l:132,t:0,i:842}, D{l:11,t:0,i:643}, D{l:12,t:0,i:115}, D{l:136,t:10,i:763}, D{l:139,t:0,i:67}, D{l:133,t:10,i:759}, D{l:4,t:0,i:821}, D{l:5,t:0,i:760}, D{l:7,t:0,i:542}, D{l:8,t:0,i:135}, D{l:8,t:0,i:496}, D{l:135,t:11,i:580}, D{l:7,t:10,i:370}, D{l:7,t:10,i:1007}, D{l:7,t:10,i:1177}, D{l:135,t:10,i:1565}, D{l:135,t:10,i:1237}, D{l:140,t:0,i:736}, D{l:7,t:0,i:319}, D{l:7,t:0,i:355}, D{l:7,t:0,i:763}, D{l:10,t:0,i:389}, D{l:145,t:0,i:43}, D{l:8,t:11,i:333}, D{l:138,t:11,i:182}, D{l:4,t:10,i:87}, D{l:5,t:10,i:250}, D{l:141,t:10,i:298}, D{l:138,t:0,i:786}, D{l:134,t:0,i:2044}, D{l:8,t:11,i:330}, D{l:140,t:11,i:477}, D{l:135,t:11,i:1338}, D{l:132,t:11,i:125}, D{l:134,t:0,i:1030}, D{l:134,t:0,i:1083}, D{l:132,t:11,i:721}, D{l:135,t:10,i:814}, D{l:7,t:11,i:776}, D{l:8,t:11,i:145}, D{l:147,t:11,i:56}, D{l:134,t:0,i:1226}, D{l:4,t:10,i:57}, D{l:7,t:10,i:1195}, D{l:7,t:10,i:1438}, D{l:7,t:10,i:1548}, D{l:7,t:10,i:1835}, D{l:7,t:10,i:1904}, D{l:9,t:10,i:757}, D{l:10,t:10,i:604}, D{l:139,t:10,i:519}, D{l:7,t:11,i:792}, D{l:8,t:11,i:147}, D{l:10,t:11,i:821}, D{l:139,t:11,i:1021}, D{l:137,t:11,i:797}, D{l:4,t:0,i:58}, D{l:5,t:0,i:286}, D{l:6,t:0,i:319}, D{l:7,t:0,i:402}, D{l:7,t:0,i:1254}, D{l:7,t:0,i:1903}, D{l:8,t:0,i:356}, D{l:140,t:0,i:408}, D{l:4,t:0,i:389}, D{l:4,t:0,i:815}, D{l:9,t:0,i:181}, D{l:9,t:0,i:255}, D{l:10,t:0,i:8}, D{l:10,t:0,i:29}, D{l:10,t:0,i:816}, D{l:11,t:0,i:311}, D{l:11,t:0,i:561}, D{l:12,t:0,i:67}, D{l:141,t:0,i:181}, D{l:7,t:11,i:1472}, D{l:135,t:11,i:1554}, D{l:7,t:11,i:1071}, D{l:7,t:11,i:1541}, D{l:7,t:11,i:1767}, D{l:7,t:11,i:1806}, D{l:7,t:11,i:1999}, D{l:9,t:11,i:248}, D{l:10,t:11,i:400}, D{l:11,t:11,i:162}, D{l:11,t:11,i:178}, D{l:11,t:11,i:242}, D{l:12,t:11,i:605}, D{l:15,t:11,i:26}, D{l:144,t:11,i:44}, D{l:5,t:11,i:168}, D{l:5,t:11,i:930}, D{l:8,t:11,i:74}, D{l:9,t:11,i:623}, D{l:12,t:11,i:500}, D{l:12,t:11,i:579}, D{l:13,t:11,i:41}, D{l:143,t:11,i:93}, D{l:6,t:11,i:220}, D{l:7,t:11,i:1101}, D{l:141,t:11,i:105}, D{l:5,t:0,i:474}, D{l:7,t:0,i:507}, D{l:4,t:10,i:209}, D{l:7,t:11,i:507}, D{l:135,t:10,i:902}, D{l:132,t:0,i:427}, D{l:6,t:0,i:413}, D{l:7,t:10,i:335}, D{l:7,t:10,i:1437}, D{l:7,t:10,i:1668}, D{l:8,t:10,i:553}, D{l:8,t:10,i:652}, D{l:8,t:10,i:656}, D{l:9,t:10,i:558}, D{l:11,t:10,i:743}, D{l:149,t:10,i:18}, D{l:132,t:0,i:730}, D{l:6,t:11,i:19}, D{l:7,t:11,i:1413}, D{l:139,t:11,i:428}, D{l:133,t:0,i:373}, D{l:132,t:10,i:559}, D{l:7,t:11,i:96}, D{l:8,t:11,i:401}, D{l:137,t:11,i:896}, D{l:7,t:0,i:799}, D{l:7,t:0,i:1972}, D{l:5,t:10,i:1017}, D{l:138,t:10,i:511}, D{l:135,t:0,i:1793}, D{l:7,t:11,i:1961}, D{l:7,t:11,i:1965}, D{l:8,t:11,i:702}, D{l:136,t:11,i:750}, D{l:8,t:11,i:150}, D{l:8,t:11,i:737}, D{l:140,t:11,i:366}, D{l:132,t:0,i:322}, D{l:133,t:10,i:709}, D{l:8,t:11,i:800}, D{l:9,t:11,i:148}, D{l:9,t:11,i:872}, D{l:9,t:11,i:890}, D{l:11,t:11,i:309}, D{l:11,t:11,i:1001}, D{l:13,t:11,i:267}, D{l:141,t:11,i:323}, D{l:134,t:10,i:1745}, D{l:7,t:0,i:290}, D{l:136,t:10,i:206}, D{l:7,t:0,i:1651}, D{l:145,t:0,i:89}, D{l:139,t:0,i:2}, D{l:132,t:0,i:672}, D{l:6,t:0,i:1860}, D{l:8,t:0,i:905}, D{l:10,t:0,i:844}, D{l:10,t:0,i:846}, D{l:10,t:0,i:858}, D{l:12,t:0,i:699}, D{l:12,t:0,i:746}, D{l:140,t:0,i:772}, D{l:135,t:11,i:424}, D{l:133,t:11,i:547}, D{l:133,t:0,i:737}, D{l:5,t:11,i:490}, D{l:6,t:11,i:615}, D{l:6,t:11,i:620}, D{l:135,t:11,i:683}, D{l:6,t:0,i:746}, D{l:134,t:0,i:1612}, D{l:132,t:10,i:776}, D{l:9,t:11,i:385}, D{l:149,t:11,i:17}, D{l:133,t:0,i:145}, D{l:135,t:10,i:1272}, D{l:7,t:0,i:884}, D{l:140,t:0,i:124}, D{l:4,t:0,i:387}, D{l:135,t:0,i:1288}, D{l:5,t:11,i:133}, D{l:136,t:10,i:406}, D{l:136,t:11,i:187}, D{l:6,t:0,i:679}, D{l:8,t:11,i:8}, D{l:138,t:11,i:0}, D{l:135,t:0,i:550}, D{l:135,t:11,i:798}, D{l:136,t:11,i:685}, D{l:7,t:11,i:1086}, D{l:145,t:11,i:46}, D{l:8,t:10,i:175}, D{l:10,t:10,i:168}, D{l:138,t:10,i:573}, D{l:135,t:0,i:1305}, D{l:4,t:0,i:576}, D{l:135,t:0,i:1263}, D{l:6,t:0,i:686}, D{l:134,t:0,i:1563}, D{l:134,t:0,i:607}, D{l:5,t:0,i:919}, D{l:134,t:0,i:1673}, D{l:148,t:0,i:37}, D{l:8,t:11,i:774}, D{l:10,t:11,i:670}, D{l:140,t:11,i:51}, D{l:133,t:10,i:784}, D{l:139,t:10,i:882}, D{l:4,t:0,i:82}, D{l:5,t:0,i:333}, D{l:5,t:0,i:904}, D{l:6,t:0,i:207}, D{l:7,t:0,i:325}, D{l:7,t:0,i:1726}, D{l:8,t:0,i:101}, D{l:10,t:0,i:778}, D{l:139,t:0,i:220}, D{l:135,t:11,i:371}, D{l:132,t:0,i:958}, D{l:133,t:0,i:903}, D{l:4,t:11,i:127}, D{l:5,t:11,i:350}, D{l:6,t:11,i:356}, D{l:8,t:11,i:426}, D{l:9,t:11,i:572}, D{l:10,t:11,i:247}, D{l:139,t:11,i:312}, D{l:140,t:0,i:147}, D{l:6,t:11,i:59}, D{l:7,t:11,i:885}, D{l:9,t:11,i:603}, D{l:141,t:11,i:397}, D{l:10,t:0,i:367}, D{l:9,t:10,i:14}, D{l:9,t:10,i:441}, D{l:139,t:10,i:9}, D{l:11,t:10,i:966}, D{l:12,t:10,i:287}, D{l:13,t:10,i:342}, D{l:13,t:10,i:402}, D{l:15,t:10,i:110}, D{l:143,t:10,i:163}, D{l:134,t:0,i:690}, D{l:132,t:0,i:705}, D{l:9,t:0,i:651}, D{l:11,t:0,i:971}, D{l:13,t:0,i:273}, D{l:7,t:10,i:1428}, D{l:7,t:10,i:1640}, D{l:7,t:10,i:1867}, D{l:9,t:10,i:169}, D{l:9,t:10,i:182}, D{l:9,t:10,i:367}, D{l:9,t:10,i:478}, D{l:9,t:10,i:506}, D{l:9,t:10,i:551}, D{l:9,t:10,i:557}, D{l:9,t:10,i:648}, D{l:9,t:10,i:697}, D{l:9,t:10,i:705}, D{l:9,t:10,i:725}, D{l:9,t:10,i:787}, D{l:9,t:10,i:794}, D{l:10,t:10,i:198}, D{l:10,t:10,i:214}, D{l:10,t:10,i:267}, D{l:10,t:10,i:275}, D{l:10,t:10,i:456}, D{l:10,t:10,i:551}, D{l:10,t:10,i:561}, D{l:10,t:10,i:613}, D{l:10,t:10,i:627}, D{l:10,t:10,i:668}, D{l:10,t:10,i:675}, D{l:10,t:10,i:691}, D{l:10,t:10,i:695}, D{l:10,t:10,i:707}, D{l:10,t:10,i:715}, D{l:11,t:10,i:183}, D{l:11,t:10,i:201}, D{l:11,t:10,i:262}, D{l:11,t:10,i:352}, D{l:11,t:10,i:439}, D{l:11,t:10,i:493}, D{l:11,t:10,i:572}, D{l:11,t:10,i:591}, D{l:11,t:10,i:608}, D{l:11,t:10,i:611}, D{l:11,t:10,i:646}, D{l:11,t:10,i:674}, D{l:11,t:10,i:711}, D{l:11,t:10,i:751}, D{l:11,t:10,i:761}, D{l:11,t:10,i:776}, D{l:11,t:10,i:785}, D{l:11,t:10,i:850}, D{l:11,t:10,i:853}, D{l:11,t:10,i:862}, D{l:11,t:10,i:865}, D{l:11,t:10,i:868}, D{l:11,t:10,i:875}, D{l:11,t:10,i:898}, D{l:11,t:10,i:902}, D{l:11,t:10,i:903}, D{l:11,t:10,i:910}, D{l:11,t:10,i:932}, D{l:11,t:10,i:942}, D{l:11,t:10,i:957}, D{l:11,t:10,i:967}, D{l:11,t:10,i:972}, D{l:12,t:10,i:148}, D{l:12,t:10,i:195}, D{l:12,t:10,i:220}, D{l:12,t:10,i:237}, D{l:12,t:10,i:318}, D{l:12,t:10,i:339}, D{l:12,t:10,i:393}, D{l:12,t:10,i:445}, D{l:12,t:10,i:450}, D{l:12,t:10,i:474}, D{l:12,t:10,i:505}, D{l:12,t:10,i:509}, D{l:12,t:10,i:533}, D{l:12,t:10,i:591}, D{l:12,t:10,i:594}, D{l:12,t:10,i:597}, D{l:12,t:10,i:621}, D{l:12,t:10,i:633}, D{l:12,t:10,i:642}, D{l:13,t:10,i:59}, D{l:13,t:10,i:60}, D{l:13,t:10,i:145}, D{l:13,t:10,i:239}, D{l:13,t:10,i:250}, D{l:13,t:10,i:329}, D{l:13,t:10,i:344}, D{l:13,t:10,i:365}, D{l:13,t:10,i:372}, D{l:13,t:10,i:387}, D{l:13,t:10,i:403}, D{l:13,t:10,i:414}, D{l:13,t:10,i:456}, D{l:13,t:10,i:470}, D{l:13,t:10,i:478}, D{l:13,t:10,i:483}, D{l:13,t:10,i:489}, D{l:14,t:10,i:55}, D{l:14,t:10,i:57}, D{l:14,t:10,i:81}, D{l:14,t:10,i:90}, D{l:14,t:10,i:148}, D{l:14,t:10,i:239}, D{l:14,t:10,i:266}, D{l:14,t:10,i:321}, D{l:14,t:10,i:326}, D{l:14,t:10,i:327}, D{l:14,t:10,i:330}, D{l:14,t:10,i:347}, D{l:14,t:10,i:355}, D{l:14,t:10,i:401}, D{l:14,t:10,i:404}, D{l:14,t:10,i:411}, D{l:14,t:10,i:414}, D{l:14,t:10,i:416}, D{l:14,t:10,i:420}, D{l:15,t:10,i:61}, D{l:15,t:10,i:74}, D{l:15,t:10,i:87}, D{l:15,t:10,i:88}, D{l:15,t:10,i:94}, D{l:15,t:10,i:96}, D{l:15,t:10,i:116}, D{l:15,t:10,i:149}, D{l:15,t:10,i:154}, D{l:16,t:10,i:50}, D{l:16,t:10,i:63}, D{l:16,t:10,i:73}, D{l:17,t:10,i:2}, D{l:17,t:10,i:66}, D{l:17,t:10,i:92}, D{l:17,t:10,i:103}, D{l:17,t:10,i:112}, D{l:17,t:10,i:120}, D{l:18,t:10,i:50}, D{l:18,t:10,i:54}, D{l:18,t:10,i:82}, D{l:18,t:10,i:86}, D{l:18,t:10,i:90}, D{l:18,t:10,i:111}, D{l:18,t:10,i:115}, D{l:18,t:10,i:156}, D{l:19,t:10,i:40}, D{l:19,t:10,i:79}, D{l:20,t:10,i:78}, D{l:149,t:10,i:22}, D{l:7,t:0,i:887}, D{l:5,t:10,i:161}, D{l:135,t:10,i:839}, D{l:142,t:11,i:98}, D{l:134,t:0,i:90}, D{l:138,t:11,i:356}, D{l:135,t:11,i:441}, D{l:6,t:11,i:111}, D{l:7,t:11,i:4}, D{l:8,t:11,i:163}, D{l:8,t:11,i:776}, D{l:138,t:11,i:566}, D{l:134,t:0,i:908}, D{l:134,t:0,i:1261}, D{l:7,t:0,i:813}, D{l:12,t:0,i:497}, D{l:141,t:0,i:56}, D{l:134,t:0,i:1235}, D{l:135,t:0,i:429}, D{l:135,t:11,i:1994}, D{l:138,t:0,i:904}, D{l:6,t:0,i:125}, D{l:7,t:0,i:1277}, D{l:137,t:0,i:772}, D{l:151,t:0,i:12}, D{l:4,t:0,i:841}, D{l:5,t:0,i:386}, D{l:133,t:11,i:386}, D{l:5,t:11,i:297}, D{l:135,t:11,i:1038}, D{l:6,t:0,i:860}, D{l:6,t:0,i:1069}, D{l:135,t:11,i:309}, D{l:136,t:0,i:946}, D{l:135,t:10,i:1814}, D{l:141,t:11,i:418}, D{l:136,t:11,i:363}, D{l:10,t:0,i:768}, D{l:139,t:0,i:787}, D{l:22,t:11,i:30}, D{l:150,t:11,i:33}, D{l:6,t:0,i:160}, D{l:7,t:0,i:1106}, D{l:9,t:0,i:770}, D{l:11,t:0,i:112}, D{l:140,t:0,i:413}, D{l:11,t:11,i:216}, D{l:139,t:11,i:340}, D{l:136,t:10,i:139}, D{l:135,t:11,i:1390}, D{l:135,t:11,i:808}, D{l:132,t:11,i:280}, D{l:12,t:0,i:271}, D{l:17,t:0,i:109}, D{l:7,t:10,i:643}, D{l:136,t:10,i:236}, D{l:140,t:11,i:54}, D{l:4,t:11,i:421}, D{l:133,t:11,i:548}, D{l:11,t:0,i:719}, D{l:12,t:0,i:36}, D{l:141,t:0,i:337}, D{l:7,t:0,i:581}, D{l:9,t:0,i:644}, D{l:137,t:0,i:699}, D{l:11,t:11,i:511}, D{l:13,t:11,i:394}, D{l:14,t:11,i:298}, D{l:14,t:11,i:318}, D{l:146,t:11,i:103}, D{l:7,t:0,i:304}, D{l:9,t:0,i:646}, D{l:9,t:0,i:862}, D{l:11,t:0,i:696}, D{l:12,t:0,i:208}, D{l:15,t:0,i:79}, D{l:147,t:0,i:108}, D{l:4,t:0,i:631}, D{l:7,t:0,i:1126}, D{l:135,t:0,i:1536}, D{l:135,t:11,i:1527}, D{l:8,t:0,i:880}, D{l:10,t:0,i:869}, D{l:138,t:0,i:913}, D{l:7,t:0,i:1513}, D{l:5,t:10,i:54}, D{l:6,t:11,i:254}, D{l:9,t:11,i:109}, D{l:138,t:11,i:103}, D{l:135,t:0,i:981}, D{l:133,t:11,i:729}, D{l:132,t:10,i:744}, D{l:132,t:0,i:434}, D{l:134,t:0,i:550}, D{l:7,t:0,i:930}, D{l:10,t:0,i:476}, D{l:13,t:0,i:452}, D{l:19,t:0,i:104}, D{l:6,t:11,i:1630}, D{l:10,t:10,i:402}, D{l:146,t:10,i:55}, D{l:5,t:0,i:553}, D{l:138,t:0,i:824}, D{l:136,t:0,i:452}, D{l:8,t:0,i:151}, D{l:137,t:10,i:624}, D{l:132,t:10,i:572}, D{l:132,t:0,i:772}, D{l:133,t:11,i:671}, D{l:133,t:0,i:292}, D{l:138,t:0,i:135}, D{l:132,t:11,i:889}, D{l:140,t:11,i:207}, D{l:9,t:0,i:504}, D{l:6,t:10,i:43}, D{l:7,t:10,i:38}, D{l:8,t:10,i:248}, D{l:138,t:10,i:513}, D{l:6,t:0,i:1089}, D{l:135,t:11,i:1910}, D{l:4,t:11,i:627}, D{l:133,t:11,i:775}, D{l:135,t:0,i:783}, D{l:133,t:10,i:766}, D{l:133,t:10,i:363}, D{l:7,t:0,i:387}, D{l:135,t:11,i:387}, D{l:7,t:0,i:393}, D{l:10,t:0,i:603}, D{l:11,t:0,i:206}, D{l:7,t:11,i:202}, D{l:11,t:11,i:362}, D{l:11,t:11,i:948}, D{l:140,t:11,i:388}, D{l:6,t:11,i:507}, D{l:7,t:11,i:451}, D{l:8,t:11,i:389}, D{l:12,t:11,i:490}, D{l:13,t:11,i:16}, D{l:13,t:11,i:215}, D{l:13,t:11,i:351}, D{l:18,t:11,i:132}, D{l:147,t:11,i:125}, D{l:4,t:0,i:912}, D{l:9,t:0,i:232}, D{l:135,t:11,i:841}, D{l:6,t:10,i:258}, D{l:140,t:10,i:409}, D{l:5,t:10,i:249}, D{l:148,t:10,i:82}, D{l:136,t:11,i:566}, D{l:6,t:0,i:977}, D{l:135,t:11,i:1214}, D{l:7,t:0,i:1973}, D{l:136,t:0,i:716}, D{l:135,t:0,i:98}, D{l:133,t:0,i:733}, D{l:5,t:11,i:912}, D{l:134,t:11,i:1695}, D{l:5,t:10,i:393}, D{l:6,t:10,i:378}, D{l:7,t:10,i:1981}, D{l:9,t:10,i:32}, D{l:9,t:10,i:591}, D{l:10,t:10,i:685}, D{l:10,t:10,i:741}, D{l:142,t:10,i:382}, D{l:133,t:10,i:788}, D{l:10,t:0,i:19}, D{l:11,t:0,i:911}, D{l:7,t:10,i:1968}, D{l:141,t:10,i:509}, D{l:5,t:0,i:668}, D{l:5,t:11,i:236}, D{l:6,t:11,i:572}, D{l:8,t:11,i:492}, D{l:11,t:11,i:618}, D{l:144,t:11,i:56}, D{l:135,t:11,i:1789}, D{l:4,t:0,i:360}, D{l:5,t:0,i:635}, D{l:5,t:0,i:700}, D{l:5,t:10,i:58}, D{l:5,t:10,i:171}, D{l:5,t:10,i:683}, D{l:6,t:10,i:291}, D{l:6,t:10,i:566}, D{l:7,t:10,i:1650}, D{l:11,t:10,i:523}, D{l:12,t:10,i:273}, D{l:12,t:10,i:303}, D{l:15,t:10,i:39}, D{l:143,t:10,i:111}, D{l:133,t:0,i:901}, D{l:134,t:10,i:589}, D{l:5,t:11,i:190}, D{l:136,t:11,i:318}, D{l:140,t:0,i:656}, D{l:7,t:0,i:726}, D{l:152,t:0,i:9}, D{l:4,t:10,i:917}, D{l:133,t:10,i:1005}, D{l:135,t:10,i:1598}, D{l:134,t:11,i:491}, D{l:4,t:10,i:919}, D{l:133,t:11,i:434}, D{l:137,t:0,i:72}, D{l:6,t:0,i:1269}, D{l:6,t:0,i:1566}, D{l:134,t:0,i:1621}, D{l:9,t:0,i:463}, D{l:10,t:0,i:595}, D{l:4,t:10,i:255}, D{l:5,t:10,i:302}, D{l:6,t:10,i:132}, D{l:7,t:10,i:128}, D{l:7,t:10,i:283}, D{l:7,t:10,i:1299}, D{l:10,t:10,i:52}, D{l:10,t:10,i:514}, D{l:11,t:10,i:925}, D{l:13,t:10,i:92}, D{l:142,t:10,i:309}, D{l:135,t:0,i:1454}, D{l:134,t:0,i:1287}, D{l:11,t:0,i:600}, D{l:13,t:0,i:245}, D{l:137,t:10,i:173}, D{l:136,t:0,i:989}, D{l:7,t:0,i:164}, D{l:7,t:0,i:1571}, D{l:9,t:0,i:107}, D{l:140,t:0,i:225}, D{l:6,t:0,i:1061}, D{l:141,t:10,i:442}, D{l:4,t:0,i:27}, D{l:5,t:0,i:484}, D{l:5,t:0,i:510}, D{l:6,t:0,i:434}, D{l:7,t:0,i:1000}, D{l:7,t:0,i:1098}, D{l:136,t:0,i:2}, D{l:7,t:11,i:85}, D{l:7,t:11,i:247}, D{l:8,t:11,i:585}, D{l:10,t:11,i:163}, D{l:138,t:11,i:316}, D{l:11,t:11,i:103}, D{l:142,t:11,i:0}, D{l:134,t:0,i:1127}, D{l:4,t:0,i:460}, D{l:134,t:0,i:852}, D{l:134,t:10,i:210}, D{l:4,t:0,i:932}, D{l:133,t:0,i:891}, D{l:6,t:0,i:588}, D{l:147,t:11,i:83}, D{l:8,t:0,i:625}, D{l:4,t:10,i:284}, D{l:134,t:10,i:223}, D{l:134,t:0,i:76}, D{l:8,t:0,i:92}, D{l:137,t:0,i:221}, D{l:4,t:11,i:124}, D{l:10,t:11,i:457}, D{l:11,t:11,i:121}, D{l:11,t:11,i:169}, D{l:11,t:11,i:422}, D{l:11,t:11,i:870}, D{l:12,t:11,i:214}, D{l:13,t:11,i:389}, D{l:14,t:11,i:187}, D{l:143,t:11,i:77}, D{l:9,t:11,i:618}, D{l:138,t:11,i:482}, D{l:4,t:10,i:218}, D{l:7,t:10,i:526}, D{l:143,t:10,i:137}, D{l:13,t:0,i:9}, D{l:14,t:0,i:104}, D{l:14,t:0,i:311}, D{l:4,t:10,i:270}, D{l:5,t:10,i:192}, D{l:6,t:10,i:332}, D{l:135,t:10,i:1322}, D{l:140,t:10,i:661}, D{l:135,t:11,i:1193}, D{l:6,t:11,i:107}, D{l:7,t:11,i:638}, D{l:7,t:11,i:1632}, D{l:137,t:11,i:396}, D{l:132,t:0,i:763}, D{l:4,t:0,i:622}, D{l:5,t:11,i:370}, D{l:134,t:11,i:1756}, D{l:133,t:0,i:253}, D{l:135,t:0,i:546}, D{l:9,t:0,i:73}, D{l:10,t:0,i:110}, D{l:14,t:0,i:185}, D{l:17,t:0,i:119}, D{l:133,t:11,i:204}, D{l:7,t:0,i:624}, D{l:7,t:0,i:916}, D{l:10,t:0,i:256}, D{l:139,t:0,i:87}, D{l:7,t:10,i:379}, D{l:8,t:10,i:481}, D{l:137,t:10,i:377}, D{l:5,t:0,i:212}, D{l:12,t:0,i:35}, D{l:13,t:0,i:382}, D{l:5,t:11,i:970}, D{l:134,t:11,i:1706}, D{l:9,t:0,i:746}, D{l:5,t:10,i:1003}, D{l:134,t:10,i:149}, D{l:10,t:0,i:150}, D{l:11,t:0,i:849}, D{l:13,t:0,i:330}, D{l:8,t:10,i:262}, D{l:9,t:10,i:627}, D{l:11,t:10,i:214}, D{l:11,t:10,i:404}, D{l:11,t:10,i:457}, D{l:11,t:10,i:780}, D{l:11,t:10,i:913}, D{l:13,t:10,i:401}, D{l:142,t:10,i:200}, D{l:134,t:0,i:1466}, D{l:135,t:11,i:3}, D{l:6,t:0,i:1299}, D{l:4,t:11,i:35}, D{l:5,t:11,i:121}, D{l:5,t:11,i:483}, D{l:5,t:11,i:685}, D{l:6,t:11,i:489}, D{l:7,t:11,i:1204}, D{l:136,t:11,i:394}, D{l:135,t:10,i:742}, D{l:4,t:10,i:142}, D{l:136,t:10,i:304}, D{l:4,t:11,i:921}, D{l:133,t:11,i:1007}, D{l:134,t:0,i:1518}, D{l:6,t:0,i:1229}, D{l:135,t:0,i:1175}, D{l:133,t:0,i:816}, D{l:12,t:0,i:159}, D{l:4,t:10,i:471}, D{l:4,t:11,i:712}, D{l:5,t:10,i:51}, D{l:6,t:10,i:602}, D{l:7,t:10,i:925}, D{l:8,t:10,i:484}, D{l:138,t:10,i:195}, D{l:134,t:11,i:1629}, D{l:5,t:0,i:869}, D{l:5,t:0,i:968}, D{l:6,t:0,i:1626}, D{l:8,t:0,i:734}, D{l:136,t:0,i:784}, D{l:4,t:0,i:542}, D{l:6,t:0,i:1716}, D{l:6,t:0,i:1727}, D{l:7,t:0,i:1082}, D{l:7,t:0,i:1545}, D{l:8,t:0,i:56}, D{l:8,t:0,i:118}, D{l:8,t:0,i:412}, D{l:8,t:0,i:564}, D{l:9,t:0,i:888}, D{l:9,t:0,i:908}, D{l:10,t:0,i:50}, D{l:10,t:0,i:423}, D{l:11,t:0,i:685}, D{l:11,t:0,i:697}, D{l:11,t:0,i:933}, D{l:12,t:0,i:299}, D{l:13,t:0,i:126}, D{l:13,t:0,i:136}, D{l:13,t:0,i:170}, D{l:13,t:0,i:190}, D{l:136,t:10,i:688}, D{l:132,t:10,i:697}, D{l:4,t:0,i:232}, D{l:9,t:0,i:202}, D{l:10,t:0,i:474}, D{l:140,t:0,i:433}, D{l:136,t:0,i:212}, D{l:6,t:0,i:108}, D{l:7,t:0,i:1003}, D{l:7,t:0,i:1181}, D{l:8,t:0,i:111}, D{l:136,t:0,i:343}, D{l:5,t:10,i:221}, D{l:135,t:11,i:1255}, D{l:133,t:11,i:485}, D{l:134,t:0,i:1712}, D{l:142,t:0,i:216}, D{l:5,t:0,i:643}, D{l:6,t:0,i:516}, D{l:4,t:11,i:285}, D{l:5,t:11,i:317}, D{l:6,t:11,i:301}, D{l:7,t:11,i:7}, D{l:8,t:11,i:153}, D{l:10,t:11,i:766}, D{l:11,t:11,i:468}, D{l:12,t:11,i:467}, D{l:141,t:11,i:143}, D{l:4,t:0,i:133}, D{l:7,t:0,i:711}, D{l:7,t:0,i:1298}, D{l:135,t:0,i:1585}, D{l:134,t:0,i:650}, D{l:135,t:11,i:512}, D{l:6,t:0,i:99}, D{l:7,t:0,i:1808}, D{l:145,t:0,i:57}, D{l:6,t:0,i:246}, D{l:6,t:0,i:574}, D{l:7,t:0,i:428}, D{l:9,t:0,i:793}, D{l:10,t:0,i:669}, D{l:11,t:0,i:485}, D{l:11,t:0,i:840}, D{l:12,t:0,i:300}, D{l:14,t:0,i:250}, D{l:145,t:0,i:55}, D{l:4,t:10,i:132}, D{l:5,t:10,i:69}, D{l:135,t:10,i:1242}, D{l:136,t:0,i:1023}, D{l:7,t:0,i:302}, D{l:132,t:10,i:111}, D{l:135,t:0,i:1871}, D{l:132,t:0,i:728}, D{l:9,t:0,i:252}, D{l:132,t:10,i:767}, D{l:6,t:0,i:461}, D{l:7,t:0,i:1590}, D{l:7,t:10,i:1416}, D{l:7,t:10,i:2005}, D{l:8,t:10,i:131}, D{l:8,t:10,i:466}, D{l:9,t:10,i:672}, D{l:13,t:10,i:252}, D{l:148,t:10,i:103}, D{l:6,t:0,i:323}, D{l:135,t:0,i:1564}, D{l:7,t:0,i:461}, D{l:136,t:0,i:775}, D{l:6,t:10,i:44}, D{l:136,t:10,i:368}, D{l:139,t:0,i:172}, D{l:132,t:0,i:464}, D{l:4,t:10,i:570}, D{l:133,t:10,i:120}, D{l:137,t:11,i:269}, D{l:6,t:10,i:227}, D{l:135,t:10,i:1589}, D{l:6,t:11,i:1719}, D{l:6,t:11,i:1735}, D{l:7,t:11,i:2016}, D{l:7,t:11,i:2020}, D{l:8,t:11,i:837}, D{l:137,t:11,i:852}, D{l:7,t:0,i:727}, D{l:146,t:0,i:73}, D{l:132,t:0,i:1023}, D{l:135,t:11,i:852}, D{l:135,t:10,i:1529}, D{l:136,t:0,i:577}, D{l:138,t:11,i:568}, D{l:134,t:0,i:1037}, D{l:8,t:11,i:67}, D{l:138,t:11,i:419}, D{l:4,t:0,i:413}, D{l:5,t:0,i:677}, D{l:8,t:0,i:432}, D{l:140,t:0,i:280}, D{l:10,t:0,i:600}, D{l:6,t:10,i:1667}, D{l:7,t:11,i:967}, D{l:7,t:10,i:2036}, D{l:141,t:11,i:11}, D{l:6,t:10,i:511}, D{l:140,t:10,i:132}, D{l:6,t:0,i:799}, D{l:5,t:10,i:568}, D{l:6,t:10,i:138}, D{l:135,t:10,i:1293}, D{l:8,t:0,i:159}, D{l:4,t:10,i:565}, D{l:136,t:10,i:827}, D{l:7,t:0,i:646}, D{l:7,t:0,i:1730}, D{l:11,t:0,i:446}, D{l:141,t:0,i:178}, D{l:4,t:10,i:922}, D{l:133,t:10,i:1023}, D{l:135,t:11,i:11}, D{l:132,t:0,i:395}, D{l:11,t:0,i:145}, D{l:135,t:10,i:1002}, D{l:9,t:0,i:174}, D{l:10,t:0,i:164}, D{l:11,t:0,i:440}, D{l:11,t:0,i:514}, D{l:11,t:0,i:841}, D{l:15,t:0,i:98}, D{l:149,t:0,i:20}, D{l:134,t:0,i:426}, D{l:10,t:0,i:608}, D{l:139,t:0,i:1002}, D{l:7,t:11,i:320}, D{l:8,t:11,i:51}, D{l:12,t:11,i:481}, D{l:12,t:11,i:570}, D{l:148,t:11,i:106}, D{l:9,t:0,i:977}, D{l:9,t:0,i:983}, D{l:132,t:11,i:445}, D{l:138,t:0,i:250}, D{l:139,t:0,i:100}, D{l:6,t:0,i:1982}, D{l:136,t:10,i:402}, D{l:133,t:11,i:239}, D{l:4,t:10,i:716}, D{l:141,t:10,i:31}, D{l:5,t:0,i:476}, D{l:7,t:11,i:83}, D{l:7,t:11,i:1990}, D{l:8,t:11,i:130}, D{l:139,t:11,i:720}, D{l:8,t:10,i:691}, D{l:136,t:10,i:731}, D{l:5,t:11,i:123}, D{l:6,t:11,i:530}, D{l:7,t:11,i:348}, D{l:135,t:11,i:1419}, D{l:5,t:0,i:76}, D{l:6,t:0,i:458}, D{l:6,t:0,i:497}, D{l:7,t:0,i:868}, D{l:9,t:0,i:658}, D{l:10,t:0,i:594}, D{l:11,t:0,i:173}, D{l:11,t:0,i:566}, D{l:12,t:0,i:20}, D{l:12,t:0,i:338}, D{l:141,t:0,i:200}, D{l:9,t:11,i:139}, D{l:10,t:11,i:399}, D{l:11,t:11,i:469}, D{l:12,t:11,i:634}, D{l:141,t:11,i:223}, D{l:9,t:10,i:840}, D{l:138,t:10,i:803}, D{l:133,t:10,i:847}, D{l:11,t:11,i:223}, D{l:140,t:11,i:168}, D{l:132,t:11,i:210}, D{l:8,t:0,i:447}, D{l:9,t:10,i:53}, D{l:9,t:10,i:268}, D{l:9,t:10,i:901}, D{l:10,t:10,i:518}, D{l:10,t:10,i:829}, D{l:11,t:10,i:188}, D{l:13,t:10,i:74}, D{l:14,t:10,i:46}, D{l:15,t:10,i:17}, D{l:15,t:10,i:33}, D{l:17,t:10,i:40}, D{l:18,t:10,i:36}, D{l:19,t:10,i:20}, D{l:22,t:10,i:1}, D{l:152,t:10,i:2}, D{l:4,t:0,i:526}, D{l:7,t:0,i:1029}, D{l:135,t:0,i:1054}, D{l:19,t:11,i:59}, D{l:150,t:11,i:2}, D{l:4,t:0,i:636}, D{l:6,t:0,i:1875}, D{l:6,t:0,i:1920}, D{l:9,t:0,i:999}, D{l:12,t:0,i:807}, D{l:12,t:0,i:825}, D{l:15,t:0,i:179}, D{l:15,t:0,i:190}, D{l:18,t:0,i:182}, D{l:136,t:10,i:532}, D{l:6,t:0,i:1699}, D{l:7,t:0,i:660}, D{l:7,t:0,i:1124}, D{l:17,t:0,i:31}, D{l:19,t:0,i:22}, D{l:151,t:0,i:14}, D{l:135,t:10,i:681}, D{l:132,t:11,i:430}, D{l:140,t:10,i:677}, D{l:4,t:10,i:684}, D{l:136,t:10,i:384}, D{l:132,t:11,i:756}, D{l:133,t:11,i:213}, D{l:7,t:0,i:188}, D{l:7,t:10,i:110}, D{l:8,t:10,i:290}, D{l:8,t:10,i:591}, D{l:9,t:10,i:382}, D{l:9,t:10,i:649}, D{l:11,t:10,i:71}, D{l:11,t:10,i:155}, D{l:11,t:10,i:313}, D{l:12,t:10,i:5}, D{l:13,t:10,i:325}, D{l:142,t:10,i:287}, D{l:7,t:10,i:360}, D{l:7,t:10,i:425}, D{l:9,t:10,i:66}, D{l:9,t:10,i:278}, D{l:138,t:10,i:644}, D{l:142,t:11,i:164}, D{l:4,t:0,i:279}, D{l:7,t:0,i:301}, D{l:137,t:0,i:362}, D{l:134,t:11,i:586}, D{l:135,t:0,i:1743}, D{l:4,t:0,i:178}, D{l:133,t:0,i:399}, D{l:4,t:10,i:900}, D{l:133,t:10,i:861}, D{l:5,t:10,i:254}, D{l:7,t:10,i:985}, D{l:136,t:10,i:73}, D{l:133,t:11,i:108}, D{l:7,t:10,i:1959}, D{l:136,t:10,i:683}, D{l:133,t:11,i:219}, D{l:4,t:11,i:193}, D{l:5,t:11,i:916}, D{l:7,t:11,i:364}, D{l:10,t:11,i:398}, D{l:10,t:11,i:726}, D{l:11,t:11,i:317}, D{l:11,t:11,i:626}, D{l:12,t:11,i:142}, D{l:12,t:11,i:288}, D{l:12,t:11,i:678}, D{l:13,t:11,i:313}, D{l:15,t:11,i:113}, D{l:18,t:11,i:114}, D{l:21,t:11,i:30}, D{l:150,t:11,i:53}, D{l:6,t:11,i:241}, D{l:7,t:11,i:907}, D{l:8,t:11,i:832}, D{l:9,t:11,i:342}, D{l:10,t:11,i:729}, D{l:11,t:11,i:284}, D{l:11,t:11,i:445}, D{l:11,t:11,i:651}, D{l:11,t:11,i:863}, D{l:13,t:11,i:398}, D{l:146,t:11,i:99}, D{l:132,t:0,i:872}, D{l:134,t:0,i:831}, D{l:134,t:0,i:1692}, D{l:6,t:0,i:202}, D{l:6,t:0,i:1006}, D{l:9,t:0,i:832}, D{l:10,t:0,i:636}, D{l:11,t:0,i:208}, D{l:12,t:0,i:360}, D{l:17,t:0,i:118}, D{l:18,t:0,i:27}, D{l:20,t:0,i:67}, D{l:137,t:11,i:734}, D{l:132,t:10,i:725}, D{l:7,t:11,i:993}, D{l:138,t:11,i:666}, D{l:134,t:0,i:1954}, D{l:134,t:10,i:196}, D{l:7,t:0,i:872}, D{l:10,t:0,i:516}, D{l:139,t:0,i:167}, D{l:133,t:10,i:831}, D{l:4,t:11,i:562}, D{l:9,t:11,i:254}, D{l:139,t:11,i:879}, D{l:137,t:0,i:313}, D{l:4,t:0,i:224}, D{l:132,t:11,i:786}, D{l:11,t:0,i:24}, D{l:12,t:0,i:170}, D{l:136,t:10,i:723}, D{l:5,t:0,i:546}, D{l:7,t:0,i:35}, D{l:8,t:0,i:11}, D{l:8,t:0,i:12}, D{l:9,t:0,i:315}, D{l:9,t:0,i:533}, D{l:10,t:0,i:802}, D{l:11,t:0,i:166}, D{l:12,t:0,i:525}, D{l:142,t:0,i:243}, D{l:7,t:0,i:1937}, D{l:13,t:10,i:80}, D{l:13,t:10,i:437}, D{l:145,t:10,i:74}, D{l:5,t:0,i:241}, D{l:8,t:0,i:242}, D{l:9,t:0,i:451}, D{l:10,t:0,i:667}, D{l:11,t:0,i:598}, D{l:140,t:0,i:429}, D{l:150,t:0,i:46}, D{l:6,t:0,i:1273}, D{l:137,t:0,i:830}, D{l:5,t:10,i:848}, D{l:6,t:10,i:66}, D{l:136,t:10,i:764}, D{l:6,t:0,i:825}, D{l:134,t:0,i:993}, D{l:4,t:0,i:1006}, D{l:10,t:0,i:327}, D{l:13,t:0,i:271}, D{l:4,t:10,i:36}, D{l:7,t:10,i:1387}, D{l:139,t:10,i:755}, D{l:134,t:0,i:1023}, D{l:135,t:0,i:1580}, D{l:4,t:0,i:366}, D{l:137,t:0,i:516}, D{l:132,t:10,i:887}, D{l:6,t:0,i:1736}, D{l:135,t:0,i:1891}, D{l:6,t:11,i:216}, D{l:7,t:11,i:901}, D{l:7,t:11,i:1343}, D{l:136,t:11,i:493}, D{l:6,t:10,i:165}, D{l:138,t:10,i:388}, D{l:7,t:11,i:341}, D{l:139,t:11,i:219}, D{l:4,t:10,i:719}, D{l:135,t:10,i:155}, D{l:134,t:0,i:1935}, D{l:132,t:0,i:826}, D{l:6,t:0,i:331}, D{l:6,t:0,i:1605}, D{l:8,t:0,i:623}, D{l:11,t:0,i:139}, D{l:139,t:0,i:171}, D{l:135,t:11,i:1734}, D{l:10,t:11,i:115}, D{l:11,t:11,i:420}, D{l:12,t:11,i:154}, D{l:13,t:11,i:404}, D{l:14,t:11,i:346}, D{l:15,t:11,i:54}, D{l:143,t:11,i:112}, D{l:7,t:0,i:288}, D{l:4,t:10,i:353}, D{l:6,t:10,i:146}, D{l:6,t:10,i:1789}, D{l:7,t:10,i:990}, D{l:7,t:10,i:1348}, D{l:9,t:10,i:665}, D{l:9,t:10,i:898}, D{l:11,t:10,i:893}, D{l:142,t:10,i:212}, D{l:6,t:0,i:916}, D{l:134,t:0,i:1592}, D{l:7,t:0,i:1888}, D{l:4,t:10,i:45}, D{l:135,t:10,i:1257}, D{l:5,t:11,i:1011}, D{l:136,t:11,i:701}, D{l:139,t:11,i:596}, D{l:4,t:11,i:54}, D{l:5,t:11,i:666}, D{l:7,t:11,i:1039}, D{l:7,t:11,i:1130}, D{l:9,t:11,i:195}, D{l:138,t:11,i:302}, D{l:134,t:0,i:1471}, D{l:134,t:0,i:1570}, D{l:132,t:0,i:394}, D{l:140,t:10,i:65}, D{l:136,t:10,i:816}, D{l:135,t:0,i:1931}, D{l:7,t:0,i:574}, D{l:135,t:0,i:1719}, D{l:134,t:11,i:467}, D{l:132,t:0,i:658}, D{l:9,t:0,i:781}, D{l:10,t:0,i:144}, D{l:11,t:0,i:385}, D{l:13,t:0,i:161}, D{l:13,t:0,i:228}, D{l:13,t:0,i:268}, D{l:20,t:0,i:107}, D{l:134,t:11,i:1669}, D{l:136,t:0,i:374}, D{l:135,t:0,i:735}, D{l:4,t:0,i:344}, D{l:6,t:0,i:498}, D{l:139,t:0,i:323}, D{l:7,t:0,i:586}, D{l:7,t:0,i:1063}, D{l:6,t:10,i:559}, D{l:134,t:10,i:1691}, D{l:137,t:0,i:155}, D{l:133,t:0,i:906}, D{l:7,t:11,i:122}, D{l:9,t:11,i:259}, D{l:10,t:11,i:84}, D{l:11,t:11,i:470}, D{l:12,t:11,i:541}, D{l:141,t:11,i:379}, D{l:134,t:0,i:1139}, D{l:10,t:0,i:108}, D{l:139,t:0,i:116}, D{l:134,t:10,i:456}, D{l:133,t:10,i:925}, D{l:5,t:11,i:82}, D{l:5,t:11,i:131}, D{l:7,t:11,i:1755}, D{l:8,t:11,i:31}, D{l:9,t:11,i:168}, D{l:9,t:11,i:764}, D{l:139,t:11,i:869}, D{l:134,t:11,i:605}, D{l:5,t:11,i:278}, D{l:137,t:11,i:68}, D{l:4,t:11,i:163}, D{l:5,t:11,i:201}, D{l:5,t:11,i:307}, D{l:5,t:11,i:310}, D{l:6,t:11,i:335}, D{l:7,t:11,i:284}, D{l:136,t:11,i:165}, D{l:135,t:11,i:1660}, D{l:6,t:11,i:33}, D{l:135,t:11,i:1244}, D{l:4,t:0,i:616}, D{l:136,t:11,i:483}, D{l:8,t:0,i:857}, D{l:8,t:0,i:902}, D{l:8,t:0,i:910}, D{l:10,t:0,i:879}, D{l:12,t:0,i:726}, D{l:4,t:11,i:199}, D{l:139,t:11,i:34}, D{l:136,t:0,i:692}, D{l:6,t:10,i:193}, D{l:7,t:10,i:240}, D{l:7,t:10,i:1682}, D{l:10,t:10,i:51}, D{l:10,t:10,i:640}, D{l:11,t:10,i:410}, D{l:13,t:10,i:82}, D{l:14,t:10,i:247}, D{l:14,t:10,i:331}, D{l:142,t:10,i:377}, D{l:6,t:0,i:823}, D{l:134,t:0,i:983}, D{l:139,t:10,i:411}, D{l:132,t:0,i:305}, D{l:136,t:10,i:633}, D{l:138,t:11,i:203}, D{l:134,t:0,i:681}, D{l:6,t:11,i:326}, D{l:7,t:11,i:677}, D{l:137,t:11,i:425}, D{l:5,t:0,i:214}, D{l:7,t:0,i:603}, D{l:8,t:0,i:611}, D{l:9,t:0,i:686}, D{l:10,t:0,i:88}, D{l:11,t:0,i:459}, D{l:11,t:0,i:496}, D{l:12,t:0,i:463}, D{l:12,t:0,i:590}, D{l:141,t:0,i:0}, D{l:136,t:0,i:1004}, D{l:142,t:0,i:23}, D{l:134,t:0,i:1703}, D{l:147,t:11,i:8}, D{l:145,t:11,i:56}, D{l:135,t:0,i:1443}, D{l:4,t:10,i:237}, D{l:135,t:10,i:514}, D{l:6,t:0,i:714}, D{l:145,t:0,i:19}, D{l:5,t:11,i:358}, D{l:7,t:11,i:473}, D{l:7,t:11,i:1184}, D{l:10,t:11,i:662}, D{l:13,t:11,i:212}, D{l:13,t:11,i:304}, D{l:13,t:11,i:333}, D{l:145,t:11,i:98}, D{l:4,t:0,i:737}, D{l:10,t:0,i:98}, D{l:11,t:0,i:294}, D{l:12,t:0,i:60}, D{l:12,t:0,i:437}, D{l:13,t:0,i:64}, D{l:13,t:0,i:380}, D{l:142,t:0,i:430}, D{l:6,t:10,i:392}, D{l:7,t:10,i:65}, D{l:135,t:10,i:2019}, D{l:6,t:0,i:1758}, D{l:8,t:0,i:520}, D{l:9,t:0,i:345}, D{l:9,t:0,i:403}, D{l:142,t:0,i:350}, D{l:5,t:0,i:47}, D{l:10,t:0,i:242}, D{l:138,t:0,i:579}, D{l:5,t:0,i:139}, D{l:7,t:0,i:1168}, D{l:138,t:0,i:539}, D{l:134,t:0,i:1459}, D{l:13,t:0,i:388}, D{l:141,t:11,i:388}, D{l:134,t:0,i:253}, D{l:7,t:10,i:1260}, D{l:135,t:10,i:1790}, D{l:10,t:0,i:252}, D{l:9,t:10,i:222}, D{l:139,t:10,i:900}, D{l:140,t:0,i:745}, D{l:133,t:11,i:946}, D{l:4,t:0,i:107}, D{l:7,t:0,i:613}, D{l:8,t:0,i:439}, D{l:8,t:0,i:504}, D{l:9,t:0,i:501}, D{l:10,t:0,i:383}, D{l:139,t:0,i:477}, D{l:135,t:11,i:1485}, D{l:132,t:0,i:871}, D{l:7,t:11,i:411}, D{l:7,t:11,i:590}, D{l:8,t:11,i:631}, D{l:9,t:11,i:323}, D{l:10,t:11,i:355}, D{l:11,t:11,i:491}, D{l:12,t:11,i:143}, D{l:12,t:11,i:402}, D{l:13,t:11,i:73}, D{l:14,t:11,i:408}, D{l:15,t:11,i:107}, D{l:146,t:11,i:71}, D{l:132,t:0,i:229}, D{l:132,t:0,i:903}, D{l:140,t:0,i:71}, D{l:133,t:0,i:549}, D{l:4,t:0,i:47}, D{l:6,t:0,i:373}, D{l:7,t:0,i:452}, D{l:7,t:0,i:543}, D{l:7,t:0,i:1828}, D{l:7,t:0,i:1856}, D{l:9,t:0,i:6}, D{l:11,t:0,i:257}, D{l:139,t:0,i:391}, D{l:7,t:11,i:1467}, D{l:8,t:11,i:328}, D{l:10,t:11,i:544}, D{l:11,t:11,i:955}, D{l:13,t:11,i:320}, D{l:145,t:11,i:83}, D{l:5,t:0,i:980}, D{l:134,t:0,i:1754}, D{l:136,t:0,i:865}, D{l:5,t:0,i:705}, D{l:137,t:0,i:606}, D{l:7,t:0,i:161}, D{l:8,t:10,i:201}, D{l:136,t:10,i:605}, D{l:143,t:11,i:35}, D{l:5,t:11,i:835}, D{l:6,t:11,i:483}, D{l:140,t:10,i:224}, D{l:7,t:0,i:536}, D{l:7,t:0,i:1331}, D{l:136,t:0,i:143}, D{l:134,t:0,i:1388}, D{l:5,t:0,i:724}, D{l:10,t:0,i:305}, D{l:11,t:0,i:151}, D{l:12,t:0,i:33}, D{l:12,t:0,i:121}, D{l:12,t:0,i:381}, D{l:17,t:0,i:3}, D{l:17,t:0,i:27}, D{l:17,t:0,i:78}, D{l:18,t:0,i:18}, D{l:19,t:0,i:54}, D{l:149,t:0,i:5}, D{l:4,t:10,i:523}, D{l:133,t:10,i:638}, D{l:5,t:0,i:19}, D{l:134,t:0,i:533}, D{l:5,t:0,i:395}, D{l:5,t:0,i:951}, D{l:134,t:0,i:1776}, D{l:135,t:0,i:1908}, D{l:132,t:0,i:846}, D{l:10,t:0,i:74}, D{l:11,t:0,i:663}, D{l:12,t:0,i:210}, D{l:13,t:0,i:166}, D{l:13,t:0,i:310}, D{l:14,t:0,i:373}, D{l:18,t:0,i:95}, D{l:19,t:0,i:43}, D{l:6,t:10,i:242}, D{l:7,t:10,i:227}, D{l:7,t:10,i:1581}, D{l:8,t:10,i:104}, D{l:9,t:10,i:113}, D{l:9,t:10,i:220}, D{l:9,t:10,i:427}, D{l:10,t:10,i:239}, D{l:11,t:10,i:579}, D{l:11,t:10,i:1023}, D{l:13,t:10,i:4}, D{l:13,t:10,i:204}, D{l:13,t:10,i:316}, D{l:148,t:10,i:86}, D{l:9,t:11,i:716}, D{l:11,t:11,i:108}, D{l:13,t:11,i:123}, D{l:14,t:11,i:252}, D{l:19,t:11,i:38}, D{l:21,t:11,i:3}, D{l:151,t:11,i:11}, D{l:8,t:0,i:372}, D{l:9,t:0,i:122}, D{l:138,t:0,i:175}, D{l:132,t:11,i:677}, D{l:7,t:11,i:1374}, D{l:136,t:11,i:540}, D{l:135,t:10,i:861}, D{l:132,t:0,i:695}, D{l:7,t:0,i:497}, D{l:9,t:0,i:387}, D{l:147,t:0,i:81}, D{l:136,t:0,i:937}, D{l:134,t:0,i:718}, D{l:7,t:0,i:1328}, D{l:136,t:10,i:494}, D{l:132,t:11,i:331}, D{l:6,t:0,i:1581}, D{l:133,t:11,i:747}, D{l:5,t:0,i:284}, D{l:6,t:0,i:49}, D{l:6,t:0,i:350}, D{l:7,t:0,i:1}, D{l:7,t:0,i:377}, D{l:7,t:0,i:1693}, D{l:8,t:0,i:18}, D{l:8,t:0,i:678}, D{l:9,t:0,i:161}, D{l:9,t:0,i:585}, D{l:9,t:0,i:671}, D{l:9,t:0,i:839}, D{l:11,t:0,i:912}, D{l:141,t:0,i:427}, D{l:7,t:10,i:1306}, D{l:8,t:10,i:505}, D{l:9,t:10,i:482}, D{l:10,t:10,i:126}, D{l:11,t:10,i:225}, D{l:12,t:10,i:347}, D{l:12,t:10,i:449}, D{l:13,t:10,i:19}, D{l:14,t:10,i:218}, D{l:142,t:10,i:435}, D{l:10,t:10,i:764}, D{l:12,t:10,i:120}, D{l:13,t:10,i:39}, D{l:145,t:10,i:127}, D{l:4,t:0,i:597}, D{l:133,t:10,i:268}, D{l:134,t:0,i:1094}, D{l:4,t:0,i:1008}, D{l:134,t:0,i:1973}, D{l:132,t:0,i:811}, D{l:139,t:0,i:908}, D{l:135,t:0,i:1471}, D{l:133,t:11,i:326}, D{l:4,t:10,i:384}, D{l:135,t:10,i:1022}, D{l:7,t:0,i:1935}, D{l:8,t:0,i:324}, D{l:12,t:0,i:42}, D{l:4,t:11,i:691}, D{l:7,t:11,i:1935}, D{l:8,t:11,i:324}, D{l:9,t:11,i:35}, D{l:10,t:11,i:680}, D{l:11,t:11,i:364}, D{l:12,t:11,i:42}, D{l:13,t:11,i:357}, D{l:146,t:11,i:16}, D{l:135,t:0,i:2014}, D{l:7,t:0,i:2007}, D{l:9,t:0,i:101}, D{l:9,t:0,i:450}, D{l:10,t:0,i:66}, D{l:10,t:0,i:842}, D{l:11,t:0,i:536}, D{l:12,t:0,i:587}, D{l:6,t:11,i:32}, D{l:7,t:11,i:385}, D{l:7,t:11,i:757}, D{l:7,t:11,i:1916}, D{l:8,t:11,i:37}, D{l:8,t:11,i:94}, D{l:8,t:11,i:711}, D{l:9,t:11,i:541}, D{l:10,t:11,i:162}, D{l:10,t:11,i:795}, D{l:11,t:11,i:989}, D{l:11,t:11,i:1010}, D{l:12,t:11,i:14}, D{l:142,t:11,i:308}, D{l:139,t:0,i:586}, D{l:135,t:10,i:1703}, D{l:7,t:0,i:1077}, D{l:11,t:0,i:28}, D{l:9,t:10,i:159}, D{l:140,t:10,i:603}, D{l:6,t:0,i:1221}, D{l:136,t:10,i:583}, D{l:6,t:11,i:152}, D{l:6,t:11,i:349}, D{l:6,t:11,i:1682}, D{l:7,t:11,i:1252}, D{l:8,t:11,i:112}, D{l:9,t:11,i:435}, D{l:9,t:11,i:668}, D{l:10,t:11,i:290}, D{l:10,t:11,i:319}, D{l:10,t:11,i:815}, D{l:11,t:11,i:180}, D{l:11,t:11,i:837}, D{l:12,t:11,i:240}, D{l:13,t:11,i:152}, D{l:13,t:11,i:219}, D{l:142,t:11,i:158}, D{l:139,t:0,i:62}, D{l:132,t:10,i:515}, D{l:8,t:10,i:632}, D{l:8,t:10,i:697}, D{l:137,t:10,i:854}, D{l:134,t:0,i:1766}, D{l:132,t:11,i:581}, D{l:6,t:11,i:126}, D{l:7,t:11,i:573}, D{l:8,t:11,i:397}, D{l:142,t:11,i:44}, D{l:150,t:0,i:28}, D{l:11,t:0,i:670}, D{l:22,t:0,i:25}, D{l:4,t:10,i:136}, D{l:133,t:10,i:551}, D{l:6,t:0,i:1665}, D{l:7,t:0,i:256}, D{l:7,t:0,i:1388}, D{l:138,t:0,i:499}, D{l:4,t:0,i:22}, D{l:5,t:0,i:10}, D{l:7,t:0,i:1576}, D{l:136,t:0,i:97}, D{l:134,t:10,i:1782}, D{l:5,t:0,i:481}, D{l:7,t:10,i:1287}, D{l:9,t:10,i:44}, D{l:10,t:10,i:552}, D{l:10,t:10,i:642}, D{l:11,t:10,i:839}, D{l:12,t:10,i:274}, D{l:12,t:10,i:275}, D{l:12,t:10,i:372}, D{l:13,t:10,i:91}, D{l:142,t:10,i:125}, D{l:133,t:11,i:926}, D{l:7,t:11,i:1232}, D{l:137,t:11,i:531}, D{l:6,t:0,i:134}, D{l:7,t:0,i:437}, D{l:7,t:0,i:1824}, D{l:9,t:0,i:37}, D{l:14,t:0,i:285}, D{l:142,t:0,i:371}, D{l:7,t:0,i:486}, D{l:8,t:0,i:155}, D{l:11,t:0,i:93}, D{l:140,t:0,i:164}, D{l:6,t:0,i:1391}, D{l:134,t:0,i:1442}, D{l:133,t:11,i:670}, D{l:133,t:0,i:591}, D{l:6,t:10,i:147}, D{l:7,t:10,i:886}, D{l:7,t:11,i:1957}, D{l:9,t:10,i:753}, D{l:138,t:10,i:268}, D{l:5,t:0,i:380}, D{l:5,t:0,i:650}, D{l:7,t:0,i:1173}, D{l:136,t:0,i:310}, D{l:4,t:0,i:364}, D{l:7,t:0,i:1156}, D{l:7,t:0,i:1187}, D{l:137,t:0,i:409}, D{l:135,t:11,i:1621}, D{l:134,t:0,i:482}, D{l:133,t:11,i:506}, D{l:4,t:0,i:781}, D{l:6,t:0,i:487}, D{l:7,t:0,i:926}, D{l:8,t:0,i:263}, D{l:139,t:0,i:500}, D{l:138,t:10,i:137}, D{l:135,t:11,i:242}, D{l:139,t:11,i:96}, D{l:133,t:10,i:414}, D{l:135,t:10,i:1762}, D{l:134,t:0,i:804}, D{l:5,t:11,i:834}, D{l:7,t:11,i:1202}, D{l:8,t:11,i:14}, D{l:9,t:11,i:481}, D{l:137,t:11,i:880}, D{l:134,t:10,i:599}, D{l:4,t:0,i:94}, D{l:135,t:0,i:1265}, D{l:4,t:0,i:415}, D{l:132,t:0,i:417}, D{l:5,t:0,i:348}, D{l:6,t:0,i:522}, D{l:6,t:10,i:1749}, D{l:7,t:11,i:1526}, D{l:138,t:11,i:465}, D{l:134,t:10,i:1627}, D{l:132,t:0,i:1012}, D{l:132,t:10,i:488}, D{l:4,t:11,i:357}, D{l:6,t:11,i:172}, D{l:7,t:11,i:143}, D{l:137,t:11,i:413}, D{l:4,t:10,i:83}, D{l:4,t:11,i:590}, D{l:146,t:11,i:76}, D{l:140,t:10,i:676}, D{l:7,t:11,i:287}, D{l:8,t:11,i:355}, D{l:9,t:11,i:293}, D{l:137,t:11,i:743}, D{l:134,t:10,i:278}, D{l:6,t:0,i:1803}, D{l:18,t:0,i:165}, D{l:24,t:0,i:21}, D{l:5,t:11,i:169}, D{l:7,t:11,i:333}, D{l:136,t:11,i:45}, D{l:12,t:10,i:97}, D{l:140,t:11,i:97}, D{l:4,t:0,i:408}, D{l:4,t:0,i:741}, D{l:135,t:0,i:500}, D{l:132,t:11,i:198}, D{l:7,t:10,i:388}, D{l:7,t:10,i:644}, D{l:139,t:10,i:781}, D{l:4,t:11,i:24}, D{l:5,t:11,i:140}, D{l:5,t:11,i:185}, D{l:7,t:11,i:1500}, D{l:11,t:11,i:565}, D{l:139,t:11,i:838}, D{l:6,t:0,i:1321}, D{l:9,t:0,i:257}, D{l:7,t:10,i:229}, D{l:8,t:10,i:59}, D{l:9,t:10,i:190}, D{l:10,t:10,i:378}, D{l:140,t:10,i:191}, D{l:4,t:11,i:334}, D{l:133,t:11,i:593}, D{l:135,t:11,i:1885}, D{l:134,t:0,i:1138}, D{l:4,t:0,i:249}, D{l:6,t:0,i:73}, D{l:135,t:0,i:177}, D{l:133,t:0,i:576}, D{l:142,t:0,i:231}, D{l:137,t:0,i:288}, D{l:132,t:10,i:660}, D{l:7,t:10,i:1035}, D{l:138,t:10,i:737}, D{l:135,t:0,i:1487}, D{l:6,t:0,i:989}, D{l:9,t:0,i:433}, D{l:7,t:10,i:690}, D{l:9,t:10,i:587}, D{l:140,t:10,i:521}, D{l:7,t:0,i:1264}, D{l:7,t:0,i:1678}, D{l:11,t:0,i:945}, D{l:12,t:0,i:341}, D{l:12,t:0,i:471}, D{l:140,t:0,i:569}, D{l:132,t:11,i:709}, D{l:133,t:11,i:897}, D{l:5,t:11,i:224}, D{l:13,t:11,i:174}, D{l:146,t:11,i:52}, D{l:135,t:11,i:1840}, D{l:134,t:10,i:1744}, D{l:12,t:0,i:87}, D{l:16,t:0,i:74}, D{l:4,t:10,i:733}, D{l:9,t:10,i:194}, D{l:10,t:10,i:92}, D{l:11,t:10,i:198}, D{l:12,t:10,i:84}, D{l:141,t:10,i:128}, D{l:140,t:0,i:779}, D{l:135,t:0,i:538}, D{l:4,t:11,i:608}, D{l:133,t:11,i:497}, D{l:133,t:0,i:413}, D{l:7,t:11,i:1375}, D{l:7,t:11,i:1466}, D{l:138,t:11,i:331}, D{l:136,t:0,i:495}, D{l:6,t:11,i:540}, D{l:136,t:11,i:136}, D{l:7,t:0,i:54}, D{l:8,t:0,i:312}, D{l:10,t:0,i:191}, D{l:10,t:0,i:614}, D{l:140,t:0,i:567}, D{l:6,t:0,i:468}, D{l:7,t:0,i:567}, D{l:7,t:0,i:1478}, D{l:8,t:0,i:530}, D{l:14,t:0,i:290}, D{l:133,t:11,i:999}, D{l:4,t:11,i:299}, D{l:7,t:10,i:306}, D{l:135,t:11,i:1004}, D{l:142,t:11,i:296}, D{l:134,t:0,i:1484}, D{l:133,t:10,i:979}, D{l:6,t:0,i:609}, D{l:9,t:0,i:815}, D{l:12,t:11,i:137}, D{l:14,t:11,i:9}, D{l:14,t:11,i:24}, D{l:142,t:11,i:64}, D{l:133,t:11,i:456}, D{l:6,t:0,i:484}, D{l:135,t:0,i:822}, D{l:133,t:10,i:178}, D{l:136,t:11,i:180}, D{l:132,t:11,i:755}, D{l:137,t:0,i:900}, D{l:135,t:0,i:1335}, D{l:6,t:0,i:1724}, D{l:135,t:0,i:2022}, D{l:135,t:11,i:1139}, D{l:5,t:0,i:640}, D{l:132,t:10,i:390}, D{l:6,t:0,i:1831}, D{l:138,t:11,i:633}, D{l:135,t:11,i:566}, D{l:4,t:11,i:890}, D{l:5,t:11,i:805}, D{l:5,t:11,i:819}, D{l:5,t:11,i:961}, D{l:6,t:11,i:396}, D{l:6,t:11,i:1631}, D{l:6,t:11,i:1678}, D{l:7,t:11,i:1967}, D{l:7,t:11,i:2041}, D{l:9,t:11,i:630}, D{l:11,t:11,i:8}, D{l:11,t:11,i:1019}, D{l:12,t:11,i:176}, D{l:13,t:11,i:225}, D{l:14,t:11,i:292}, D{l:149,t:11,i:24}, D{l:132,t:0,i:474}, D{l:134,t:0,i:1103}, D{l:135,t:0,i:1504}, D{l:134,t:0,i:1576}, D{l:6,t:0,i:961}, D{l:6,t:0,i:1034}, D{l:140,t:0,i:655}, D{l:11,t:11,i:514}, D{l:149,t:11,i:20}, D{l:5,t:0,i:305}, D{l:135,t:11,i:1815}, D{l:7,t:11,i:1505}, D{l:10,t:11,i:190}, D{l:10,t:11,i:634}, D{l:11,t:11,i:792}, D{l:12,t:11,i:358}, D{l:140,t:11,i:447}, D{l:5,t:11,i:0}, D{l:6,t:11,i:536}, D{l:7,t:11,i:604}, D{l:13,t:11,i:445}, D{l:145,t:11,i:126}, D{l:7,t:0,i:1236}, D{l:133,t:10,i:105}, D{l:4,t:0,i:480}, D{l:6,t:0,i:217}, D{l:6,t:0,i:302}, D{l:6,t:0,i:1642}, D{l:7,t:0,i:130}, D{l:7,t:0,i:837}, D{l:7,t:0,i:1321}, D{l:7,t:0,i:1547}, D{l:7,t:0,i:1657}, D{l:8,t:0,i:429}, D{l:9,t:0,i:228}, D{l:13,t:0,i:289}, D{l:13,t:0,i:343}, D{l:19,t:0,i:101}, D{l:6,t:11,i:232}, D{l:6,t:11,i:412}, D{l:7,t:11,i:1074}, D{l:8,t:11,i:9}, D{l:8,t:11,i:157}, D{l:8,t:11,i:786}, D{l:9,t:11,i:196}, D{l:9,t:11,i:352}, D{l:9,t:11,i:457}, D{l:10,t:11,i:337}, D{l:11,t:11,i:232}, D{l:11,t:11,i:877}, D{l:12,t:11,i:480}, D{l:140,t:11,i:546}, D{l:5,t:10,i:438}, D{l:7,t:11,i:958}, D{l:9,t:10,i:694}, D{l:12,t:10,i:627}, D{l:13,t:11,i:38}, D{l:141,t:10,i:210}, D{l:4,t:11,i:382}, D{l:136,t:11,i:579}, D{l:7,t:0,i:278}, D{l:10,t:0,i:739}, D{l:11,t:0,i:708}, D{l:141,t:0,i:348}, D{l:4,t:11,i:212}, D{l:135,t:11,i:1206}, D{l:135,t:11,i:1898}, D{l:6,t:0,i:708}, D{l:6,t:0,i:1344}, D{l:152,t:10,i:11}, D{l:137,t:11,i:768}, D{l:134,t:0,i:1840}, D{l:140,t:0,i:233}, D{l:8,t:10,i:25}, D{l:138,t:10,i:826}, D{l:6,t:0,i:2017}, D{l:133,t:11,i:655}, D{l:6,t:0,i:1488}, D{l:139,t:11,i:290}, D{l:132,t:10,i:308}, D{l:134,t:0,i:1590}, D{l:134,t:0,i:1800}, D{l:134,t:0,i:1259}, D{l:16,t:0,i:28}, D{l:6,t:11,i:231}, D{l:7,t:11,i:95}, D{l:136,t:11,i:423}, D{l:133,t:11,i:300}, D{l:135,t:10,i:150}, D{l:136,t:10,i:649}, D{l:7,t:11,i:1874}, D{l:137,t:11,i:641}, D{l:6,t:11,i:237}, D{l:7,t:11,i:611}, D{l:8,t:11,i:100}, D{l:9,t:11,i:416}, D{l:11,t:11,i:335}, D{l:12,t:11,i:173}, D{l:146,t:11,i:101}, D{l:137,t:0,i:45}, D{l:134,t:10,i:521}, D{l:17,t:0,i:36}, D{l:14,t:11,i:26}, D{l:146,t:11,i:150}, D{l:7,t:0,i:1442}, D{l:14,t:0,i:22}, D{l:5,t:10,i:339}, D{l:15,t:10,i:41}, D{l:15,t:10,i:166}, D{l:147,t:10,i:66}, D{l:8,t:0,i:378}, D{l:6,t:11,i:581}, D{l:135,t:11,i:1119}, D{l:134,t:0,i:1507}, D{l:147,t:11,i:117}, D{l:139,t:0,i:39}, D{l:134,t:0,i:1054}, D{l:6,t:0,i:363}, D{l:7,t:0,i:1955}, D{l:136,t:0,i:725}, D{l:134,t:0,i:2036}, D{l:133,t:11,i:199}, D{l:6,t:0,i:1871}, D{l:9,t:0,i:935}, D{l:9,t:0,i:961}, D{l:9,t:0,i:1004}, D{l:9,t:0,i:1016}, D{l:12,t:0,i:805}, D{l:12,t:0,i:852}, D{l:12,t:0,i:853}, D{l:12,t:0,i:869}, D{l:12,t:0,i:882}, D{l:12,t:0,i:896}, D{l:12,t:0,i:906}, D{l:12,t:0,i:917}, D{l:12,t:0,i:940}, D{l:15,t:0,i:170}, D{l:15,t:0,i:176}, D{l:15,t:0,i:188}, D{l:15,t:0,i:201}, D{l:15,t:0,i:205}, D{l:15,t:0,i:212}, D{l:15,t:0,i:234}, D{l:15,t:0,i:244}, D{l:18,t:0,i:181}, D{l:18,t:0,i:193}, D{l:18,t:0,i:196}, D{l:18,t:0,i:201}, D{l:18,t:0,i:202}, D{l:18,t:0,i:210}, D{l:18,t:0,i:217}, D{l:18,t:0,i:235}, D{l:18,t:0,i:236}, D{l:18,t:0,i:237}, D{l:21,t:0,i:54}, D{l:21,t:0,i:55}, D{l:21,t:0,i:58}, D{l:21,t:0,i:59}, D{l:152,t:0,i:22}, D{l:134,t:10,i:1628}, D{l:137,t:0,i:805}, D{l:5,t:0,i:813}, D{l:135,t:0,i:2046}, D{l:142,t:11,i:42}, D{l:5,t:0,i:712}, D{l:6,t:0,i:1240}, D{l:11,t:0,i:17}, D{l:13,t:0,i:321}, D{l:144,t:0,i:67}, D{l:132,t:0,i:617}, D{l:135,t:10,i:829}, D{l:6,t:0,i:320}, D{l:7,t:0,i:781}, D{l:7,t:0,i:1921}, D{l:9,t:0,i:55}, D{l:10,t:0,i:186}, D{l:10,t:0,i:273}, D{l:10,t:0,i:664}, D{l:10,t:0,i:801}, D{l:11,t:0,i:996}, D{l:11,t:0,i:997}, D{l:13,t:0,i:157}, D{l:142,t:0,i:170}, D{l:136,t:0,i:271}, D{l:5,t:10,i:486}, D{l:135,t:10,i:1349}, D{l:18,t:11,i:91}, D{l:147,t:11,i:70}, D{l:10,t:0,i:445}, D{l:7,t:10,i:1635}, D{l:8,t:10,i:17}, D{l:138,t:10,i:295}, D{l:136,t:11,i:404}, D{l:7,t:0,i:103}, D{l:7,t:0,i:863}, D{l:11,t:0,i:184}, D{l:145,t:0,i:62}, D{l:138,t:10,i:558}, D{l:137,t:0,i:659}, D{l:6,t:11,i:312}, D{l:6,t:11,i:1715}, D{l:10,t:11,i:584}, D{l:11,t:11,i:546}, D{l:11,t:11,i:692}, D{l:12,t:11,i:259}, D{l:12,t:11,i:295}, D{l:13,t:11,i:46}, D{l:141,t:11,i:154}, D{l:134,t:0,i:676}, D{l:132,t:11,i:588}, D{l:4,t:11,i:231}, D{l:5,t:11,i:61}, D{l:6,t:11,i:104}, D{l:7,t:11,i:729}, D{l:7,t:11,i:964}, D{l:7,t:11,i:1658}, D{l:140,t:11,i:414}, D{l:6,t:11,i:263}, D{l:138,t:11,i:757}, D{l:11,t:0,i:337}, D{l:142,t:0,i:303}, D{l:135,t:11,i:1363}, D{l:132,t:11,i:320}, D{l:140,t:0,i:506}, D{l:134,t:10,i:447}, D{l:5,t:0,i:77}, D{l:7,t:0,i:1455}, D{l:10,t:0,i:843}, D{l:147,t:0,i:73}, D{l:7,t:10,i:577}, D{l:7,t:10,i:1432}, D{l:9,t:10,i:475}, D{l:9,t:10,i:505}, D{l:9,t:10,i:526}, D{l:9,t:10,i:609}, D{l:9,t:10,i:689}, D{l:9,t:10,i:726}, D{l:9,t:10,i:735}, D{l:9,t:10,i:738}, D{l:10,t:10,i:556}, D{l:10,t:10,i:674}, D{l:10,t:10,i:684}, D{l:11,t:10,i:89}, D{l:11,t:10,i:202}, D{l:11,t:10,i:272}, D{l:11,t:10,i:380}, D{l:11,t:10,i:415}, D{l:11,t:10,i:505}, D{l:11,t:10,i:537}, D{l:11,t:10,i:550}, D{l:11,t:10,i:562}, D{l:11,t:10,i:640}, D{l:11,t:10,i:667}, D{l:11,t:10,i:688}, D{l:11,t:10,i:847}, D{l:11,t:10,i:927}, D{l:11,t:10,i:930}, D{l:11,t:10,i:940}, D{l:12,t:10,i:144}, D{l:12,t:10,i:325}, D{l:12,t:10,i:329}, D{l:12,t:10,i:389}, D{l:12,t:10,i:403}, D{l:12,t:10,i:451}, D{l:12,t:10,i:515}, D{l:12,t:10,i:604}, D{l:12,t:10,i:616}, D{l:12,t:10,i:626}, D{l:13,t:10,i:66}, D{l:13,t:10,i:131}, D{l:13,t:10,i:167}, D{l:13,t:10,i:236}, D{l:13,t:10,i:368}, D{l:13,t:10,i:411}, D{l:13,t:10,i:434}, D{l:13,t:10,i:453}, D{l:13,t:10,i:461}, D{l:13,t:10,i:474}, D{l:14,t:10,i:59}, D{l:14,t:10,i:60}, D{l:14,t:10,i:139}, D{l:14,t:10,i:152}, D{l:14,t:10,i:276}, D{l:14,t:10,i:353}, D{l:14,t:10,i:402}, D{l:15,t:10,i:28}, D{l:15,t:10,i:81}, D{l:15,t:10,i:123}, D{l:15,t:10,i:152}, D{l:18,t:10,i:136}, D{l:148,t:10,i:88}, D{l:132,t:0,i:458}, D{l:135,t:0,i:1420}, D{l:6,t:0,i:109}, D{l:10,t:0,i:382}, D{l:4,t:11,i:405}, D{l:4,t:10,i:609}, D{l:7,t:10,i:756}, D{l:7,t:11,i:817}, D{l:9,t:10,i:544}, D{l:11,t:10,i:413}, D{l:14,t:11,i:58}, D{l:14,t:10,i:307}, D{l:16,t:10,i:25}, D{l:17,t:11,i:37}, D{l:146,t:11,i:124}, D{l:6,t:0,i:330}, D{l:7,t:0,i:1084}, D{l:11,t:0,i:142}, D{l:133,t:11,i:974}, D{l:4,t:10,i:930}, D{l:133,t:10,i:947}, D{l:5,t:10,i:939}, D{l:142,t:11,i:394}, D{l:16,t:0,i:91}, D{l:145,t:0,i:87}, D{l:5,t:11,i:235}, D{l:5,t:10,i:962}, D{l:7,t:11,i:1239}, D{l:11,t:11,i:131}, D{l:140,t:11,i:370}, D{l:11,t:0,i:492}, D{l:5,t:10,i:651}, D{l:8,t:10,i:170}, D{l:9,t:10,i:61}, D{l:9,t:10,i:63}, D{l:10,t:10,i:23}, D{l:10,t:10,i:37}, D{l:10,t:10,i:834}, D{l:11,t:10,i:4}, D{l:11,t:10,i:281}, D{l:11,t:10,i:503}, D{l:11,t:10,i:677}, D{l:12,t:10,i:96}, D{l:12,t:10,i:130}, D{l:12,t:10,i:244}, D{l:14,t:10,i:5}, D{l:14,t:10,i:40}, D{l:14,t:10,i:162}, D{l:14,t:10,i:202}, D{l:146,t:10,i:133}, D{l:4,t:10,i:406}, D{l:5,t:10,i:579}, D{l:12,t:10,i:492}, D{l:150,t:10,i:15}, D{l:9,t:11,i:137}, D{l:138,t:11,i:221}, D{l:134,t:0,i:1239}, D{l:11,t:0,i:211}, D{l:140,t:0,i:145}, D{l:7,t:11,i:390}, D{l:138,t:11,i:140}, D{l:135,t:11,i:1418}, D{l:135,t:11,i:1144}, D{l:134,t:0,i:1049}, D{l:7,t:0,i:321}, D{l:6,t:10,i:17}, D{l:7,t:10,i:1001}, D{l:7,t:10,i:1982}, D{l:9,t:10,i:886}, D{l:10,t:10,i:489}, D{l:10,t:10,i:800}, D{l:11,t:10,i:782}, D{l:12,t:10,i:320}, D{l:13,t:10,i:467}, D{l:14,t:10,i:145}, D{l:14,t:10,i:387}, D{l:143,t:10,i:119}, D{l:145,t:10,i:17}, D{l:5,t:11,i:407}, D{l:11,t:11,i:489}, D{l:19,t:11,i:37}, D{l:20,t:11,i:73}, D{l:150,t:11,i:38}, D{l:133,t:10,i:458}, D{l:135,t:0,i:1985}, D{l:7,t:10,i:1983}, D{l:8,t:10,i:0}, D{l:8,t:10,i:171}, D{l:9,t:10,i:120}, D{l:9,t:10,i:732}, D{l:10,t:10,i:473}, D{l:11,t:10,i:656}, D{l:11,t:10,i:998}, D{l:18,t:10,i:0}, D{l:18,t:10,i:2}, D{l:147,t:10,i:21}, D{l:5,t:11,i:325}, D{l:7,t:11,i:1483}, D{l:8,t:11,i:5}, D{l:8,t:11,i:227}, D{l:9,t:11,i:105}, D{l:10,t:11,i:585}, D{l:140,t:11,i:614}, D{l:136,t:0,i:122}, D{l:132,t:0,i:234}, D{l:135,t:11,i:1196}, D{l:6,t:0,i:976}, D{l:6,t:0,i:1098}, D{l:134,t:0,i:1441}, D{l:7,t:0,i:253}, D{l:136,t:0,i:549}, D{l:6,t:11,i:621}, D{l:13,t:11,i:504}, D{l:144,t:11,i:19}, D{l:132,t:10,i:519}, D{l:5,t:0,i:430}, D{l:5,t:0,i:932}, D{l:6,t:0,i:131}, D{l:7,t:0,i:417}, D{l:9,t:0,i:522}, D{l:11,t:0,i:314}, D{l:141,t:0,i:390}, D{l:14,t:0,i:149}, D{l:14,t:0,i:399}, D{l:143,t:0,i:57}, D{l:5,t:10,i:907}, D{l:6,t:10,i:31}, D{l:6,t:11,i:218}, D{l:7,t:10,i:491}, D{l:7,t:10,i:530}, D{l:8,t:10,i:592}, D{l:11,t:10,i:53}, D{l:11,t:10,i:779}, D{l:12,t:10,i:167}, D{l:12,t:10,i:411}, D{l:14,t:10,i:14}, D{l:14,t:10,i:136}, D{l:15,t:10,i:72}, D{l:16,t:10,i:17}, D{l:144,t:10,i:72}, D{l:140,t:11,i:330}, D{l:7,t:11,i:454}, D{l:7,t:11,i:782}, D{l:136,t:11,i:768}, D{l:132,t:0,i:507}, D{l:10,t:11,i:676}, D{l:140,t:11,i:462}, D{l:6,t:0,i:630}, D{l:9,t:0,i:811}, D{l:4,t:10,i:208}, D{l:5,t:10,i:106}, D{l:6,t:10,i:531}, D{l:8,t:10,i:408}, D{l:9,t:10,i:188}, D{l:138,t:10,i:572}, D{l:4,t:0,i:343}, D{l:5,t:0,i:511}, D{l:134,t:10,i:1693}, D{l:134,t:11,i:164}, D{l:132,t:0,i:448}, D{l:7,t:0,i:455}, D{l:138,t:0,i:591}, D{l:135,t:0,i:1381}, D{l:12,t:10,i:441}, D{l:150,t:11,i:50}, D{l:9,t:10,i:449}, D{l:10,t:10,i:192}, D{l:138,t:10,i:740}, D{l:6,t:0,i:575}, D{l:132,t:10,i:241}, D{l:134,t:0,i:1175}, D{l:134,t:0,i:653}, D{l:134,t:0,i:1761}, D{l:134,t:0,i:1198}, D{l:132,t:10,i:259}, D{l:6,t:11,i:343}, D{l:7,t:11,i:195}, D{l:9,t:11,i:226}, D{l:10,t:11,i:197}, D{l:10,t:11,i:575}, D{l:11,t:11,i:502}, D{l:139,t:11,i:899}, D{l:7,t:0,i:1127}, D{l:7,t:0,i:1572}, D{l:10,t:0,i:297}, D{l:10,t:0,i:422}, D{l:11,t:0,i:764}, D{l:11,t:0,i:810}, D{l:12,t:0,i:264}, D{l:13,t:0,i:102}, D{l:13,t:0,i:300}, D{l:13,t:0,i:484}, D{l:14,t:0,i:147}, D{l:14,t:0,i:229}, D{l:17,t:0,i:71}, D{l:18,t:0,i:118}, D{l:147,t:0,i:120}, D{l:135,t:11,i:666}, D{l:132,t:0,i:678}, D{l:4,t:10,i:173}, D{l:5,t:10,i:312}, D{l:5,t:10,i:512}, D{l:135,t:10,i:1285}, D{l:7,t:10,i:1603}, D{l:7,t:10,i:1691}, D{l:9,t:10,i:464}, D{l:11,t:10,i:195}, D{l:12,t:10,i:279}, D{l:12,t:10,i:448}, D{l:14,t:10,i:11}, D{l:147,t:10,i:102}, D{l:16,t:0,i:99}, D{l:146,t:0,i:164}, D{l:7,t:11,i:1125}, D{l:9,t:11,i:143}, D{l:11,t:11,i:61}, D{l:14,t:11,i:405}, D{l:150,t:11,i:21}, D{l:137,t:11,i:260}, D{l:4,t:10,i:452}, D{l:5,t:10,i:583}, D{l:5,t:10,i:817}, D{l:6,t:10,i:433}, D{l:7,t:10,i:593}, D{l:7,t:10,i:720}, D{l:7,t:10,i:1378}, D{l:8,t:10,i:161}, D{l:9,t:10,i:284}, D{l:10,t:10,i:313}, D{l:139,t:10,i:886}, D{l:132,t:10,i:547}, D{l:136,t:10,i:722}, D{l:14,t:0,i:35}, D{l:142,t:0,i:191}, D{l:141,t:0,i:45}, D{l:138,t:0,i:121}, D{l:132,t:0,i:125}, D{l:134,t:0,i:1622}, D{l:133,t:11,i:959}, D{l:8,t:10,i:420}, D{l:139,t:10,i:193}, D{l:132,t:0,i:721}, D{l:135,t:10,i:409}, D{l:136,t:0,i:145}, D{l:7,t:0,i:792}, D{l:8,t:0,i:147}, D{l:10,t:0,i:821}, D{l:11,t:0,i:970}, D{l:11,t:0,i:1021}, D{l:136,t:11,i:173}, D{l:134,t:11,i:266}, D{l:132,t:0,i:715}, D{l:7,t:0,i:1999}, D{l:138,t:10,i:308}, D{l:133,t:0,i:531}, D{l:5,t:0,i:168}, D{l:5,t:0,i:930}, D{l:8,t:0,i:74}, D{l:9,t:0,i:623}, D{l:12,t:0,i:500}, D{l:140,t:0,i:579}, D{l:144,t:0,i:65}, D{l:138,t:11,i:246}, D{l:6,t:0,i:220}, D{l:7,t:0,i:1101}, D{l:13,t:0,i:105}, D{l:142,t:11,i:314}, D{l:5,t:10,i:1002}, D{l:136,t:10,i:745}, D{l:134,t:0,i:960}, D{l:20,t:0,i:0}, D{l:148,t:11,i:0}, D{l:4,t:0,i:1005}, D{l:4,t:10,i:239}, D{l:6,t:10,i:477}, D{l:7,t:10,i:1607}, D{l:11,t:10,i:68}, D{l:139,t:10,i:617}, D{l:6,t:0,i:19}, D{l:7,t:0,i:1413}, D{l:139,t:0,i:428}, D{l:149,t:10,i:13}, D{l:7,t:0,i:96}, D{l:8,t:0,i:401}, D{l:8,t:0,i:703}, D{l:9,t:0,i:896}, D{l:136,t:11,i:300}, D{l:134,t:0,i:1595}, D{l:145,t:0,i:116}, D{l:136,t:0,i:1021}, D{l:7,t:0,i:1961}, D{l:7,t:0,i:1965}, D{l:7,t:0,i:2030}, D{l:8,t:0,i:150}, D{l:8,t:0,i:702}, D{l:8,t:0,i:737}, D{l:8,t:0,i:750}, D{l:140,t:0,i:366}, D{l:11,t:11,i:75}, D{l:142,t:11,i:267}, D{l:132,t:10,i:367}, D{l:8,t:0,i:800}, D{l:9,t:0,i:148}, D{l:9,t:0,i:872}, D{l:9,t:0,i:890}, D{l:11,t:0,i:309}, D{l:11,t:0,i:1001}, D{l:13,t:0,i:267}, D{l:13,t:0,i:323}, D{l:5,t:11,i:427}, D{l:5,t:11,i:734}, D{l:7,t:11,i:478}, D{l:136,t:11,i:52}, D{l:7,t:11,i:239}, D{l:11,t:11,i:217}, D{l:142,t:11,i:165}, D{l:132,t:11,i:323}, D{l:140,t:11,i:419}, D{l:13,t:0,i:299}, D{l:142,t:0,i:75}, D{l:6,t:11,i:87}, D{l:6,t:11,i:1734}, D{l:7,t:11,i:20}, D{l:7,t:11,i:1056}, D{l:8,t:11,i:732}, D{l:9,t:11,i:406}, D{l:9,t:11,i:911}, D{l:138,t:11,i:694}, D{l:134,t:0,i:1383}, D{l:132,t:10,i:694}, D{l:133,t:11,i:613}, D{l:137,t:0,i:779}, D{l:4,t:0,i:598}, D{l:140,t:10,i:687}, D{l:6,t:0,i:970}, D{l:135,t:0,i:424}, D{l:133,t:0,i:547}, D{l:7,t:11,i:32}, D{l:7,t:11,i:984}, D{l:8,t:11,i:85}, D{l:8,t:11,i:709}, D{l:9,t:11,i:579}, D{l:9,t:11,i:847}, D{l:9,t:11,i:856}, D{l:10,t:11,i:799}, D{l:11,t:11,i:258}, D{l:11,t:11,i:1007}, D{l:12,t:11,i:331}, D{l:12,t:11,i:615}, D{l:13,t:11,i:188}, D{l:13,t:11,i:435}, D{l:14,t:11,i:8}, D{l:15,t:11,i:165}, D{l:16,t:11,i:27}, D{l:148,t:11,i:40}, D{l:6,t:0,i:1222}, D{l:134,t:0,i:1385}, D{l:132,t:0,i:876}, D{l:138,t:11,i:151}, D{l:135,t:10,i:213}, D{l:4,t:11,i:167}, D{l:135,t:11,i:82}, D{l:133,t:0,i:133}, D{l:6,t:11,i:24}, D{l:7,t:11,i:74}, D{l:7,t:11,i:678}, D{l:137,t:11,i:258}, D{l:5,t:11,i:62}, D{l:6,t:11,i:534}, D{l:7,t:11,i:684}, D{l:7,t:11,i:1043}, D{l:7,t:11,i:1072}, D{l:8,t:11,i:280}, D{l:8,t:11,i:541}, D{l:8,t:11,i:686}, D{l:10,t:11,i:519}, D{l:11,t:11,i:252}, D{l:140,t:11,i:282}, D{l:136,t:0,i:187}, D{l:8,t:0,i:8}, D{l:10,t:0,i:0}, D{l:10,t:0,i:818}, D{l:139,t:0,i:988}, D{l:132,t:11,i:359}, D{l:11,t:0,i:429}, D{l:15,t:0,i:51}, D{l:135,t:10,i:1672}, D{l:136,t:0,i:685}, D{l:5,t:11,i:211}, D{l:7,t:11,i:88}, D{l:136,t:11,i:627}, D{l:134,t:0,i:472}, D{l:136,t:0,i:132}, D{l:6,t:11,i:145}, D{l:141,t:11,i:336}, D{l:4,t:10,i:751}, D{l:11,t:10,i:390}, D{l:140,t:10,i:32}, D{l:6,t:0,i:938}, D{l:6,t:0,i:1060}, D{l:4,t:11,i:263}, D{l:4,t:10,i:409}, D{l:133,t:10,i:78}, D{l:137,t:0,i:874}, D{l:8,t:0,i:774}, D{l:10,t:0,i:670}, D{l:12,t:0,i:51}, D{l:4,t:11,i:916}, D{l:6,t:10,i:473}, D{l:7,t:10,i:1602}, D{l:10,t:10,i:698}, D{l:12,t:10,i:212}, D{l:13,t:10,i:307}, D{l:145,t:10,i:105}, D{l:146,t:0,i:92}, D{l:143,t:10,i:156}, D{l:132,t:0,i:830}, D{l:137,t:0,i:701}, D{l:4,t:11,i:599}, D{l:6,t:11,i:1634}, D{l:7,t:11,i:5}, D{l:7,t:11,i:55}, D{l:7,t:11,i:67}, D{l:7,t:11,i:97}, D{l:7,t:11,i:691}, D{l:7,t:11,i:979}, D{l:7,t:11,i:1697}, D{l:8,t:11,i:207}, D{l:8,t:11,i:214}, D{l:8,t:11,i:231}, D{l:8,t:11,i:294}, D{l:8,t:11,i:336}, D{l:8,t:11,i:428}, D{l:8,t:11,i:451}, D{l:8,t:11,i:460}, D{l:8,t:11,i:471}, D{l:8,t:11,i:622}, D{l:8,t:11,i:626}, D{l:8,t:11,i:679}, D{l:8,t:11,i:759}, D{l:8,t:11,i:829}, D{l:9,t:11,i:11}, D{l:9,t:11,i:246}, D{l:9,t:11,i:484}, D{l:9,t:11,i:573}, D{l:9,t:11,i:706}, D{l:9,t:11,i:762}, D{l:9,t:11,i:798}, D{l:9,t:11,i:855}, D{l:9,t:11,i:870}, D{l:9,t:11,i:912}, D{l:10,t:11,i:303}, D{l:10,t:11,i:335}, D{l:10,t:11,i:424}, D{l:10,t:11,i:461}, D{l:10,t:11,i:543}, D{l:10,t:11,i:759}, D{l:10,t:11,i:814}, D{l:11,t:11,i:59}, D{l:11,t:11,i:199}, D{l:11,t:11,i:235}, D{l:11,t:11,i:475}, D{l:11,t:11,i:590}, D{l:11,t:11,i:929}, D{l:11,t:11,i:963}, D{l:12,t:11,i:114}, D{l:12,t:11,i:182}, D{l:12,t:11,i:226}, D{l:12,t:11,i:332}, D{l:12,t:11,i:439}, D{l:12,t:11,i:575}, D{l:12,t:11,i:598}, D{l:13,t:11,i:8}, D{l:13,t:11,i:125}, D{l:13,t:11,i:194}, D{l:13,t:11,i:287}, D{l:14,t:11,i:197}, D{l:14,t:11,i:383}, D{l:15,t:11,i:53}, D{l:17,t:11,i:63}, D{l:19,t:11,i:46}, D{l:19,t:11,i:98}, D{l:19,t:11,i:106}, D{l:148,t:11,i:85}, D{l:4,t:0,i:127}, D{l:5,t:0,i:350}, D{l:6,t:0,i:356}, D{l:8,t:0,i:426}, D{l:9,t:0,i:572}, D{l:10,t:0,i:247}, D{l:139,t:0,i:312}, D{l:134,t:0,i:1215}, D{l:6,t:0,i:59}, D{l:9,t:0,i:603}, D{l:13,t:0,i:397}, D{l:7,t:11,i:1853}, D{l:138,t:11,i:437}, D{l:134,t:0,i:1762}, D{l:147,t:11,i:126}, D{l:135,t:10,i:883}, D{l:13,t:0,i:293}, D{l:142,t:0,i:56}, D{l:133,t:10,i:617}, D{l:139,t:10,i:50}, D{l:5,t:11,i:187}, D{l:7,t:10,i:1518}, D{l:139,t:10,i:694}, D{l:135,t:0,i:441}, D{l:6,t:0,i:111}, D{l:7,t:0,i:4}, D{l:8,t:0,i:163}, D{l:8,t:0,i:776}, D{l:138,t:0,i:566}, D{l:132,t:0,i:806}, D{l:4,t:11,i:215}, D{l:9,t:11,i:38}, D{l:10,t:11,i:3}, D{l:11,t:11,i:23}, D{l:11,t:11,i:127}, D{l:139,t:11,i:796}, D{l:14,t:0,i:233}, D{l:4,t:10,i:546}, D{l:135,t:10,i:2042}, D{l:135,t:0,i:1994}, D{l:134,t:0,i:1739}, D{l:135,t:11,i:1530}, D{l:136,t:0,i:393}, D{l:5,t:0,i:297}, D{l:7,t:0,i:1038}, D{l:14,t:0,i:359}, D{l:19,t:0,i:52}, D{l:148,t:0,i:47}, D{l:135,t:0,i:309}, D{l:4,t:10,i:313}, D{l:133,t:10,i:577}, D{l:8,t:10,i:184}, D{l:141,t:10,i:433}, D{l:135,t:10,i:935}, D{l:12,t:10,i:186}, D{l:12,t:10,i:292}, D{l:14,t:10,i:100}, D{l:146,t:10,i:70}, D{l:136,t:0,i:363}, D{l:14,t:0,i:175}, D{l:11,t:10,i:402}, D{l:12,t:10,i:109}, D{l:12,t:10,i:431}, D{l:13,t:10,i:179}, D{l:13,t:10,i:206}, D{l:14,t:10,i:217}, D{l:16,t:10,i:3}, D{l:148,t:10,i:53}, D{l:5,t:10,i:886}, D{l:6,t:10,i:46}, D{l:6,t:10,i:1790}, D{l:7,t:10,i:14}, D{l:7,t:10,i:732}, D{l:7,t:10,i:1654}, D{l:8,t:10,i:95}, D{l:8,t:10,i:327}, D{l:8,t:10,i:616}, D{l:9,t:10,i:892}, D{l:10,t:10,i:598}, D{l:10,t:10,i:769}, D{l:11,t:10,i:134}, D{l:11,t:10,i:747}, D{l:12,t:10,i:378}, D{l:142,t:10,i:97}, D{l:136,t:0,i:666}, D{l:135,t:0,i:1675}, D{l:6,t:0,i:655}, D{l:134,t:0,i:1600}, D{l:135,t:0,i:808}, D{l:133,t:10,i:1021}, D{l:4,t:11,i:28}, D{l:5,t:11,i:440}, D{l:7,t:11,i:248}, D{l:11,t:11,i:833}, D{l:140,t:11,i:344}, D{l:134,t:11,i:1654}, D{l:132,t:0,i:280}, D{l:140,t:0,i:54}, D{l:4,t:0,i:421}, D{l:133,t:0,i:548}, D{l:132,t:10,i:153}, D{l:6,t:11,i:339}, D{l:135,t:11,i:923}, D{l:133,t:11,i:853}, D{l:133,t:10,i:798}, D{l:132,t:10,i:587}, D{l:6,t:11,i:249}, D{l:7,t:11,i:1234}, D{l:139,t:11,i:573}, D{l:6,t:10,i:598}, D{l:7,t:10,i:42}, D{l:8,t:10,i:695}, D{l:10,t:10,i:212}, D{l:11,t:10,i:158}, D{l:14,t:10,i:196}, D{l:145,t:10,i:85}, D{l:7,t:0,i:249}, D{l:5,t:10,i:957}, D{l:133,t:10,i:1008}, D{l:4,t:10,i:129}, D{l:135,t:10,i:465}, D{l:6,t:0,i:254}, D{l:7,t:0,i:842}, D{l:7,t:0,i:1659}, D{l:9,t:0,i:109}, D{l:10,t:0,i:103}, D{l:7,t:10,i:908}, D{l:7,t:10,i:1201}, D{l:9,t:10,i:755}, D{l:11,t:10,i:906}, D{l:12,t:10,i:527}, D{l:146,t:10,i:7}, D{l:5,t:0,i:262}, D{l:136,t:10,i:450}, D{l:144,t:0,i:1}, D{l:10,t:11,i:201}, D{l:142,t:11,i:319}, D{l:7,t:11,i:49}, D{l:7,t:11,i:392}, D{l:8,t:11,i:20}, D{l:8,t:11,i:172}, D{l:8,t:11,i:690}, D{l:9,t:11,i:383}, D{l:9,t:11,i:845}, D{l:10,t:11,i:48}, D{l:11,t:11,i:293}, D{l:11,t:11,i:832}, D{l:11,t:11,i:920}, D{l:141,t:11,i:221}, D{l:5,t:11,i:858}, D{l:133,t:11,i:992}, D{l:134,t:0,i:805}, D{l:139,t:10,i:1003}, D{l:6,t:0,i:1630}, D{l:134,t:11,i:307}, D{l:7,t:11,i:1512}, D{l:135,t:11,i:1794}, D{l:6,t:11,i:268}, D{l:137,t:11,i:62}, D{l:135,t:10,i:1868}, D{l:133,t:0,i:671}, D{l:4,t:0,i:989}, D{l:8,t:0,i:972}, D{l:136,t:0,i:998}, D{l:132,t:11,i:423}, D{l:132,t:0,i:889}, D{l:135,t:0,i:1382}, D{l:135,t:0,i:1910}, D{l:7,t:10,i:965}, D{l:7,t:10,i:1460}, D{l:135,t:10,i:1604}, D{l:4,t:0,i:627}, D{l:5,t:0,i:775}, D{l:138,t:11,i:106}, D{l:134,t:11,i:348}, D{l:7,t:0,i:202}, D{l:11,t:0,i:362}, D{l:11,t:0,i:948}, D{l:140,t:0,i:388}, D{l:138,t:11,i:771}, D{l:6,t:11,i:613}, D{l:136,t:11,i:223}, D{l:6,t:0,i:560}, D{l:7,t:0,i:451}, D{l:8,t:0,i:389}, D{l:12,t:0,i:490}, D{l:13,t:0,i:16}, D{l:13,t:0,i:215}, D{l:13,t:0,i:351}, D{l:18,t:0,i:132}, D{l:147,t:0,i:125}, D{l:135,t:0,i:841}, D{l:136,t:0,i:566}, D{l:136,t:0,i:938}, D{l:132,t:11,i:670}, D{l:5,t:0,i:912}, D{l:6,t:0,i:1695}, D{l:140,t:11,i:55}, D{l:9,t:11,i:40}, D{l:139,t:11,i:136}, D{l:7,t:0,i:1361}, D{l:7,t:10,i:982}, D{l:10,t:10,i:32}, D{l:143,t:10,i:56}, D{l:11,t:11,i:259}, D{l:140,t:11,i:270}, D{l:5,t:0,i:236}, D{l:6,t:0,i:572}, D{l:8,t:0,i:492}, D{l:11,t:0,i:618}, D{l:144,t:0,i:56}, D{l:8,t:11,i:572}, D{l:9,t:11,i:310}, D{l:9,t:11,i:682}, D{l:137,t:11,i:698}, D{l:134,t:0,i:1854}, D{l:5,t:0,i:190}, D{l:136,t:0,i:318}, D{l:133,t:10,i:435}, D{l:135,t:0,i:1376}, D{l:4,t:11,i:296}, D{l:6,t:11,i:352}, D{l:7,t:11,i:401}, D{l:7,t:11,i:1410}, D{l:7,t:11,i:1594}, D{l:7,t:11,i:1674}, D{l:8,t:11,i:63}, D{l:8,t:11,i:660}, D{l:137,t:11,i:74}, D{l:7,t:0,i:349}, D{l:5,t:10,i:85}, D{l:6,t:10,i:419}, D{l:7,t:10,i:305}, D{l:7,t:10,i:361}, D{l:7,t:10,i:1337}, D{l:8,t:10,i:71}, D{l:140,t:10,i:519}, D{l:4,t:11,i:139}, D{l:4,t:11,i:388}, D{l:140,t:11,i:188}, D{l:6,t:0,i:1972}, D{l:6,t:0,i:2013}, D{l:8,t:0,i:951}, D{l:10,t:0,i:947}, D{l:10,t:0,i:974}, D{l:10,t:0,i:1018}, D{l:142,t:0,i:476}, D{l:140,t:10,i:688}, D{l:135,t:10,i:740}, D{l:5,t:10,i:691}, D{l:7,t:10,i:345}, D{l:9,t:10,i:94}, D{l:140,t:10,i:169}, D{l:9,t:0,i:344}, D{l:5,t:10,i:183}, D{l:6,t:10,i:582}, D{l:10,t:10,i:679}, D{l:140,t:10,i:435}, D{l:135,t:10,i:511}, D{l:132,t:0,i:850}, D{l:8,t:11,i:441}, D{l:10,t:11,i:314}, D{l:143,t:11,i:3}, D{l:7,t:10,i:1993}, D{l:136,t:10,i:684}, D{l:4,t:11,i:747}, D{l:6,t:11,i:290}, D{l:6,t:10,i:583}, D{l:7,t:11,i:649}, D{l:7,t:11,i:1479}, D{l:135,t:11,i:1583}, D{l:133,t:11,i:232}, D{l:133,t:10,i:704}, D{l:134,t:0,i:910}, D{l:4,t:10,i:179}, D{l:5,t:10,i:198}, D{l:133,t:10,i:697}, D{l:7,t:10,i:347}, D{l:7,t:10,i:971}, D{l:8,t:10,i:181}, D{l:138,t:10,i:711}, D{l:136,t:11,i:525}, D{l:14,t:0,i:19}, D{l:14,t:0,i:28}, D{l:144,t:0,i:29}, D{l:7,t:0,i:85}, D{l:7,t:0,i:247}, D{l:8,t:0,i:585}, D{l:138,t:0,i:163}, D{l:4,t:0,i:487}, D{l:7,t:11,i:472}, D{l:7,t:11,i:1801}, D{l:10,t:11,i:748}, D{l:141,t:11,i:458}, D{l:4,t:10,i:243}, D{l:5,t:10,i:203}, D{l:7,t:10,i:19}, D{l:7,t:10,i:71}, D{l:7,t:10,i:113}, D{l:10,t:10,i:405}, D{l:11,t:10,i:357}, D{l:142,t:10,i:240}, D{l:7,t:10,i:1450}, D{l:139,t:10,i:99}, D{l:132,t:11,i:425}, D{l:138,t:0,i:145}, D{l:147,t:0,i:83}, D{l:6,t:10,i:492}, D{l:137,t:11,i:247}, D{l:4,t:0,i:1013}, D{l:134,t:0,i:2033}, D{l:5,t:10,i:134}, D{l:6,t:10,i:408}, D{l:6,t:10,i:495}, D{l:135,t:10,i:1593}, D{l:135,t:0,i:1922}, D{l:134,t:11,i:1768}, D{l:4,t:0,i:124}, D{l:10,t:0,i:457}, D{l:11,t:0,i:121}, D{l:11,t:0,i:169}, D{l:11,t:0,i:870}, D{l:11,t:0,i:874}, D{l:12,t:0,i:214}, D{l:14,t:0,i:187}, D{l:143,t:0,i:77}, D{l:5,t:0,i:557}, D{l:135,t:0,i:1457}, D{l:139,t:0,i:66}, D{l:5,t:11,i:943}, D{l:6,t:11,i:1779}, D{l:142,t:10,i:4}, D{l:4,t:10,i:248}, D{l:4,t:10,i:665}, D{l:7,t:10,i:137}, D{l:137,t:10,i:349}, D{l:7,t:0,i:1193}, D{l:5,t:11,i:245}, D{l:6,t:11,i:576}, D{l:7,t:11,i:582}, D{l:136,t:11,i:225}, D{l:144,t:0,i:82}, D{l:7,t:10,i:1270}, D{l:139,t:10,i:612}, D{l:5,t:0,i:454}, D{l:10,t:0,i:352}, D{l:138,t:11,i:352}, D{l:18,t:0,i:57}, D{l:5,t:10,i:371}, D{l:135,t:10,i:563}, D{l:135,t:0,i:1333}, D{l:6,t:0,i:107}, D{l:7,t:0,i:638}, D{l:7,t:0,i:1632}, D{l:9,t:0,i:396}, D{l:134,t:11,i:610}, D{l:5,t:0,i:370}, D{l:134,t:0,i:1756}, D{l:4,t:10,i:374}, D{l:7,t:10,i:547}, D{l:7,t:10,i:1700}, D{l:7,t:10,i:1833}, D{l:139,t:10,i:858}, D{l:133,t:0,i:204}, D{l:6,t:0,i:1305}, D{l:9,t:10,i:311}, D{l:141,t:10,i:42}, D{l:5,t:0,i:970}, D{l:134,t:0,i:1706}, D{l:6,t:10,i:1647}, D{l:7,t:10,i:1552}, D{l:7,t:10,i:2010}, D{l:9,t:10,i:494}, D{l:137,t:10,i:509}, D{l:13,t:11,i:455}, D{l:15,t:11,i:99}, D{l:15,t:11,i:129}, D{l:144,t:11,i:68}, D{l:135,t:0,i:3}, D{l:4,t:0,i:35}, D{l:5,t:0,i:121}, D{l:5,t:0,i:483}, D{l:5,t:0,i:685}, D{l:6,t:0,i:489}, D{l:6,t:0,i:782}, D{l:6,t:0,i:1032}, D{l:7,t:0,i:1204}, D{l:136,t:0,i:394}, D{l:4,t:0,i:921}, D{l:133,t:0,i:1007}, D{l:8,t:11,i:360}, D{l:138,t:11,i:63}, D{l:135,t:0,i:1696}, D{l:134,t:0,i:1519}, D{l:132,t:11,i:443}, D{l:135,t:11,i:944}, D{l:6,t:10,i:123}, D{l:7,t:10,i:214}, D{l:9,t:10,i:728}, D{l:10,t:10,i:157}, D{l:11,t:10,i:346}, D{l:11,t:10,i:662}, D{l:143,t:10,i:106}, D{l:137,t:0,i:981}, D{l:135,t:10,i:1435}, D{l:134,t:0,i:1072}, D{l:132,t:0,i:712}, D{l:134,t:0,i:1629}, D{l:134,t:0,i:728}, D{l:4,t:11,i:298}, D{l:137,t:11,i:483}, D{l:6,t:0,i:1177}, D{l:6,t:0,i:1271}, D{l:5,t:11,i:164}, D{l:7,t:11,i:121}, D{l:142,t:11,i:189}, D{l:7,t:0,i:1608}, D{l:4,t:10,i:707}, D{l:5,t:10,i:588}, D{l:6,t:10,i:393}, D{l:13,t:10,i:106}, D{l:18,t:10,i:49}, D{l:147,t:10,i:41}, D{l:23,t:0,i:16}, D{l:151,t:11,i:16}, D{l:6,t:10,i:211}, D{l:7,t:10,i:1690}, D{l:11,t:10,i:486}, D{l:140,t:10,i:369}, D{l:133,t:0,i:485}, D{l:19,t:11,i:15}, D{l:149,t:11,i:27}, D{l:4,t:11,i:172}, D{l:9,t:11,i:611}, D{l:10,t:11,i:436}, D{l:12,t:11,i:673}, D{l:141,t:11,i:255}, D{l:5,t:11,i:844}, D{l:10,t:11,i:484}, D{l:11,t:11,i:754}, D{l:12,t:11,i:457}, D{l:14,t:11,i:171}, D{l:14,t:11,i:389}, D{l:146,t:11,i:153}, D{l:4,t:0,i:285}, D{l:5,t:0,i:27}, D{l:5,t:0,i:317}, D{l:6,t:0,i:301}, D{l:7,t:0,i:7}, D{l:8,t:0,i:153}, D{l:10,t:0,i:766}, D{l:11,t:0,i:468}, D{l:12,t:0,i:467}, D{l:141,t:0,i:143}, D{l:134,t:0,i:1462}, D{l:9,t:11,i:263}, D{l:10,t:11,i:147}, D{l:138,t:11,i:492}, D{l:133,t:11,i:537}, D{l:6,t:0,i:1945}, D{l:6,t:0,i:1986}, D{l:6,t:0,i:1991}, D{l:134,t:0,i:2038}, D{l:134,t:10,i:219}, D{l:137,t:11,i:842}, D{l:14,t:0,i:52}, D{l:17,t:0,i:50}, D{l:5,t:10,i:582}, D{l:6,t:10,i:1646}, D{l:7,t:10,i:99}, D{l:7,t:10,i:1962}, D{l:7,t:10,i:1986}, D{l:8,t:10,i:515}, D{l:8,t:10,i:773}, D{l:9,t:10,i:23}, D{l:9,t:10,i:491}, D{l:12,t:10,i:620}, D{l:142,t:10,i:93}, D{l:138,t:11,i:97}, D{l:20,t:0,i:21}, D{l:20,t:0,i:44}, D{l:133,t:10,i:851}, D{l:136,t:0,i:819}, D{l:139,t:0,i:917}, D{l:5,t:11,i:230}, D{l:5,t:11,i:392}, D{l:6,t:11,i:420}, D{l:8,t:10,i:762}, D{l:8,t:10,i:812}, D{l:9,t:11,i:568}, D{l:9,t:10,i:910}, D{l:140,t:11,i:612}, D{l:135,t:0,i:784}, D{l:15,t:0,i:135}, D{l:143,t:11,i:135}, D{l:10,t:0,i:454}, D{l:140,t:0,i:324}, D{l:4,t:11,i:0}, D{l:5,t:11,i:41}, D{l:7,t:11,i:1459}, D{l:7,t:11,i:1469}, D{l:7,t:11,i:1618}, D{l:7,t:11,i:1859}, D{l:9,t:11,i:549}, D{l:139,t:11,i:905}, D{l:4,t:10,i:98}, D{l:7,t:10,i:1365}, D{l:9,t:10,i:422}, D{l:9,t:10,i:670}, D{l:10,t:10,i:775}, D{l:11,t:10,i:210}, D{l:13,t:10,i:26}, D{l:13,t:10,i:457}, D{l:141,t:10,i:476}, D{l:6,t:0,i:1719}, D{l:6,t:0,i:1735}, D{l:7,t:0,i:2016}, D{l:7,t:0,i:2020}, D{l:8,t:0,i:837}, D{l:137,t:0,i:852}, D{l:133,t:11,i:696}, D{l:135,t:0,i:852}, D{l:132,t:0,i:952}, D{l:134,t:10,i:1730}, D{l:132,t:11,i:771}, D{l:138,t:0,i:568}, D{l:137,t:0,i:448}, D{l:139,t:0,i:146}, D{l:8,t:0,i:67}, D{l:138,t:0,i:419}, D{l:133,t:11,i:921}, D{l:137,t:10,i:147}, D{l:134,t:0,i:1826}, D{l:10,t:0,i:657}, D{l:14,t:0,i:297}, D{l:142,t:0,i:361}, D{l:6,t:0,i:666}, D{l:6,t:0,i:767}, D{l:134,t:0,i:1542}, D{l:139,t:0,i:729}, D{l:6,t:11,i:180}, D{l:7,t:11,i:1137}, D{l:8,t:11,i:751}, D{l:139,t:11,i:805}, D{l:4,t:11,i:183}, D{l:7,t:11,i:271}, D{l:11,t:11,i:824}, D{l:11,t:11,i:952}, D{l:13,t:11,i:278}, D{l:13,t:11,i:339}, D{l:13,t:11,i:482}, D{l:14,t:11,i:424}, D{l:148,t:11,i:99}, D{l:4,t:0,i:669}, D{l:5,t:11,i:477}, D{l:5,t:11,i:596}, D{l:6,t:11,i:505}, D{l:7,t:11,i:1221}, D{l:11,t:11,i:907}, D{l:12,t:11,i:209}, D{l:141,t:11,i:214}, D{l:135,t:11,i:1215}, D{l:5,t:0,i:402}, D{l:6,t:10,i:30}, D{l:11,t:10,i:56}, D{l:139,t:10,i:305}, D{l:7,t:11,i:564}, D{l:142,t:11,i:168}, D{l:139,t:0,i:152}, D{l:7,t:0,i:912}, D{l:135,t:10,i:1614}, D{l:4,t:10,i:150}, D{l:5,t:10,i:303}, D{l:134,t:10,i:327}, D{l:7,t:0,i:320}, D{l:8,t:0,i:51}, D{l:9,t:0,i:868}, D{l:10,t:0,i:833}, D{l:12,t:0,i:481}, D{l:12,t:0,i:570}, D{l:148,t:0,i:106}, D{l:132,t:0,i:445}, D{l:7,t:11,i:274}, D{l:11,t:11,i:263}, D{l:11,t:11,i:479}, D{l:11,t:11,i:507}, D{l:140,t:11,i:277}, D{l:10,t:0,i:555}, D{l:11,t:0,i:308}, D{l:19,t:0,i:95}, D{l:6,t:11,i:1645}, D{l:8,t:10,i:192}, D{l:10,t:10,i:78}, D{l:141,t:10,i:359}, D{l:135,t:10,i:786}, D{l:6,t:11,i:92}, D{l:6,t:11,i:188}, D{l:7,t:11,i:1269}, D{l:7,t:11,i:1524}, D{l:7,t:11,i:1876}, D{l:10,t:11,i:228}, D{l:139,t:11,i:1020}, D{l:4,t:11,i:459}, D{l:133,t:11,i:966}, D{l:11,t:0,i:386}, D{l:6,t:10,i:1638}, D{l:7,t:10,i:79}, D{l:7,t:10,i:496}, D{l:9,t:10,i:138}, D{l:10,t:10,i:336}, D{l:12,t:10,i:412}, D{l:12,t:10,i:440}, D{l:142,t:10,i:305}, D{l:133,t:0,i:239}, D{l:7,t:0,i:83}, D{l:7,t:0,i:1990}, D{l:8,t:0,i:130}, D{l:139,t:0,i:720}, D{l:138,t:11,i:709}, D{l:4,t:0,i:143}, D{l:5,t:0,i:550}, D{l:133,t:0,i:752}, D{l:5,t:0,i:123}, D{l:6,t:0,i:530}, D{l:7,t:0,i:348}, D{l:135,t:0,i:1419}, D{l:135,t:0,i:2024}, D{l:6,t:11,i:18}, D{l:7,t:11,i:179}, D{l:7,t:11,i:721}, D{l:7,t:11,i:932}, D{l:8,t:11,i:548}, D{l:8,t:11,i:757}, D{l:9,t:11,i:54}, D{l:9,t:11,i:65}, D{l:9,t:11,i:532}, D{l:9,t:11,i:844}, D{l:10,t:11,i:113}, D{l:10,t:11,i:117}, D{l:10,t:11,i:236}, D{l:10,t:11,i:315}, D{l:10,t:11,i:430}, D{l:10,t:11,i:798}, D{l:11,t:11,i:153}, D{l:11,t:11,i:351}, D{l:11,t:11,i:375}, D{l:12,t:11,i:78}, D{l:12,t:11,i:151}, D{l:12,t:11,i:392}, D{l:14,t:11,i:248}, D{l:143,t:11,i:23}, D{l:7,t:10,i:204}, D{l:7,t:10,i:415}, D{l:8,t:10,i:42}, D{l:10,t:10,i:85}, D{l:139,t:10,i:564}, D{l:134,t:0,i:958}, D{l:133,t:11,i:965}, D{l:132,t:0,i:210}, D{l:135,t:11,i:1429}, D{l:138,t:11,i:480}, D{l:134,t:11,i:182}, D{l:139,t:11,i:345}, D{l:10,t:11,i:65}, D{l:10,t:11,i:488}, D{l:138,t:11,i:497}, D{l:4,t:10,i:3}, D{l:5,t:10,i:247}, D{l:5,t:10,i:644}, D{l:7,t:10,i:744}, D{l:7,t:10,i:1207}, D{l:7,t:10,i:1225}, D{l:7,t:10,i:1909}, D{l:146,t:10,i:147}, D{l:132,t:0,i:430}, D{l:5,t:10,i:285}, D{l:9,t:10,i:67}, D{l:13,t:10,i:473}, D{l:143,t:10,i:82}, D{l:144,t:11,i:16}, D{l:7,t:11,i:1162}, D{l:9,t:11,i:588}, D{l:10,t:11,i:260}, D{l:151,t:10,i:8}, D{l:133,t:0,i:213}, D{l:138,t:0,i:7}, D{l:135,t:0,i:801}, D{l:134,t:11,i:1786}, D{l:135,t:11,i:308}, D{l:6,t:0,i:936}, D{l:134,t:0,i:1289}, D{l:133,t:0,i:108}, D{l:132,t:0,i:885}, D{l:133,t:0,i:219}, D{l:139,t:0,i:587}, D{l:4,t:0,i:193}, D{l:5,t:0,i:916}, D{l:6,t:0,i:1041}, D{l:7,t:0,i:364}, D{l:10,t:0,i:398}, D{l:10,t:0,i:726}, D{l:11,t:0,i:317}, D{l:11,t:0,i:626}, D{l:12,t:0,i:142}, D{l:12,t:0,i:288}, D{l:12,t:0,i:678}, D{l:13,t:0,i:313}, D{l:15,t:0,i:113}, D{l:146,t:0,i:114}, D{l:135,t:0,i:1165}, D{l:6,t:0,i:241}, D{l:9,t:0,i:342}, D{l:10,t:0,i:729}, D{l:11,t:0,i:284}, D{l:11,t:0,i:445}, D{l:11,t:0,i:651}, D{l:11,t:0,i:863}, D{l:13,t:0,i:398}, D{l:146,t:0,i:99}, D{l:7,t:0,i:907}, D{l:136,t:0,i:832}, D{l:9,t:0,i:303}, D{l:4,t:10,i:29}, D{l:6,t:10,i:532}, D{l:7,t:10,i:1628}, D{l:7,t:10,i:1648}, D{l:9,t:10,i:350}, D{l:10,t:10,i:433}, D{l:11,t:10,i:97}, D{l:11,t:10,i:557}, D{l:11,t:10,i:745}, D{l:12,t:10,i:289}, D{l:12,t:10,i:335}, D{l:12,t:10,i:348}, D{l:12,t:10,i:606}, D{l:13,t:10,i:116}, D{l:13,t:10,i:233}, D{l:13,t:10,i:466}, D{l:14,t:10,i:181}, D{l:14,t:10,i:209}, D{l:14,t:10,i:232}, D{l:14,t:10,i:236}, D{l:14,t:10,i:300}, D{l:16,t:10,i:41}, D{l:148,t:10,i:97}, D{l:7,t:11,i:423}, D{l:7,t:10,i:1692}, D{l:136,t:11,i:588}, D{l:6,t:0,i:931}, D{l:134,t:0,i:1454}, D{l:5,t:10,i:501}, D{l:7,t:10,i:1704}, D{l:9,t:10,i:553}, D{l:11,t:10,i:520}, D{l:12,t:10,i:557}, D{l:141,t:10,i:249}, D{l:136,t:11,i:287}, D{l:4,t:0,i:562}, D{l:9,t:0,i:254}, D{l:139,t:0,i:879}, D{l:132,t:0,i:786}, D{l:14,t:11,i:32}, D{l:18,t:11,i:85}, D{l:20,t:11,i:2}, D{l:152,t:11,i:16}, D{l:135,t:0,i:1294}, D{l:7,t:11,i:723}, D{l:135,t:11,i:1135}, D{l:6,t:0,i:216}, D{l:7,t:0,i:901}, D{l:7,t:0,i:1343}, D{l:8,t:0,i:493}, D{l:134,t:11,i:403}, D{l:7,t:11,i:719}, D{l:8,t:11,i:809}, D{l:136,t:11,i:834}, D{l:5,t:11,i:210}, D{l:6,t:11,i:213}, D{l:7,t:11,i:60}, D{l:10,t:11,i:364}, D{l:139,t:11,i:135}, D{l:7,t:0,i:341}, D{l:11,t:0,i:219}, D{l:5,t:11,i:607}, D{l:8,t:11,i:326}, D{l:136,t:11,i:490}, D{l:4,t:11,i:701}, D{l:5,t:11,i:472}, D{l:5,t:11,i:639}, D{l:7,t:11,i:1249}, D{l:9,t:11,i:758}, D{l:139,t:11,i:896}, D{l:135,t:11,i:380}, D{l:135,t:11,i:1947}, D{l:139,t:0,i:130}, D{l:135,t:0,i:1734}, D{l:10,t:0,i:115}, D{l:11,t:0,i:420}, D{l:12,t:0,i:154}, D{l:13,t:0,i:404}, D{l:14,t:0,i:346}, D{l:143,t:0,i:54}, D{l:134,t:10,i:129}, D{l:4,t:11,i:386}, D{l:7,t:11,i:41}, D{l:8,t:11,i:405}, D{l:9,t:11,i:497}, D{l:11,t:11,i:110}, D{l:11,t:11,i:360}, D{l:15,t:11,i:37}, D{l:144,t:11,i:84}, D{l:141,t:11,i:282}, D{l:5,t:11,i:46}, D{l:7,t:11,i:1452}, D{l:7,t:11,i:1480}, D{l:8,t:11,i:634}, D{l:140,t:11,i:472}, D{l:4,t:11,i:524}, D{l:136,t:11,i:810}, D{l:10,t:11,i:238}, D{l:141,t:11,i:33}, D{l:133,t:0,i:604}, D{l:5,t:0,i:1011}, D{l:136,t:0,i:701}, D{l:8,t:0,i:856}, D{l:8,t:0,i:858}, D{l:8,t:0,i:879}, D{l:12,t:0,i:702}, D{l:142,t:0,i:447}, D{l:4,t:0,i:54}, D{l:5,t:0,i:666}, D{l:7,t:0,i:1039}, D{l:7,t:0,i:1130}, D{l:9,t:0,i:195}, D{l:138,t:0,i:302}, D{l:4,t:10,i:25}, D{l:5,t:10,i:60}, D{l:6,t:10,i:504}, D{l:7,t:10,i:614}, D{l:7,t:10,i:1155}, D{l:140,t:10,i:0}, D{l:7,t:10,i:1248}, D{l:11,t:10,i:621}, D{l:139,t:10,i:702}, D{l:133,t:11,i:997}, D{l:137,t:10,i:321}, D{l:134,t:0,i:1669}, D{l:134,t:0,i:1791}, D{l:4,t:10,i:379}, D{l:135,t:10,i:1397}, D{l:138,t:11,i:372}, D{l:5,t:11,i:782}, D{l:5,t:11,i:829}, D{l:134,t:11,i:1738}, D{l:135,t:0,i:1228}, D{l:4,t:10,i:118}, D{l:6,t:10,i:274}, D{l:6,t:10,i:361}, D{l:7,t:10,i:75}, D{l:141,t:10,i:441}, D{l:132,t:0,i:623}, D{l:9,t:11,i:279}, D{l:10,t:11,i:407}, D{l:14,t:11,i:84}, D{l:150,t:11,i:18}, D{l:137,t:10,i:841}, D{l:135,t:0,i:798}, D{l:140,t:10,i:693}, D{l:5,t:10,i:314}, D{l:6,t:10,i:221}, D{l:7,t:10,i:419}, D{l:10,t:10,i:650}, D{l:11,t:10,i:396}, D{l:12,t:10,i:156}, D{l:13,t:10,i:369}, D{l:14,t:10,i:333}, D{l:145,t:10,i:47}, D{l:135,t:11,i:1372}, D{l:7,t:0,i:122}, D{l:9,t:0,i:259}, D{l:10,t:0,i:84}, D{l:11,t:0,i:470}, D{l:12,t:0,i:541}, D{l:141,t:0,i:379}, D{l:134,t:0,i:837}, D{l:8,t:0,i:1013}, D{l:4,t:11,i:78}, D{l:5,t:11,i:96}, D{l:5,t:11,i:182}, D{l:7,t:11,i:1724}, D{l:7,t:11,i:1825}, D{l:10,t:11,i:394}, D{l:10,t:11,i:471}, D{l:11,t:11,i:532}, D{l:14,t:11,i:340}, D{l:145,t:11,i:88}, D{l:134,t:0,i:577}, D{l:135,t:11,i:1964}, D{l:132,t:10,i:913}, D{l:134,t:0,i:460}, D{l:8,t:0,i:891}, D{l:10,t:0,i:901}, D{l:10,t:0,i:919}, D{l:10,t:0,i:932}, D{l:12,t:0,i:715}, D{l:12,t:0,i:728}, D{l:12,t:0,i:777}, D{l:14,t:0,i:457}, D{l:144,t:0,i:103}, D{l:5,t:0,i:82}, D{l:5,t:0,i:131}, D{l:7,t:0,i:1755}, D{l:8,t:0,i:31}, D{l:9,t:0,i:168}, D{l:9,t:0,i:764}, D{l:139,t:0,i:869}, D{l:136,t:10,i:475}, D{l:6,t:0,i:605}, D{l:5,t:10,i:1016}, D{l:9,t:11,i:601}, D{l:9,t:11,i:619}, D{l:10,t:11,i:505}, D{l:10,t:11,i:732}, D{l:11,t:11,i:355}, D{l:140,t:11,i:139}, D{l:7,t:10,i:602}, D{l:8,t:10,i:179}, D{l:10,t:10,i:781}, D{l:140,t:10,i:126}, D{l:134,t:0,i:1246}, D{l:6,t:10,i:329}, D{l:138,t:10,i:111}, D{l:6,t:11,i:215}, D{l:7,t:11,i:1028}, D{l:7,t:11,i:1473}, D{l:7,t:11,i:1721}, D{l:9,t:11,i:424}, D{l:138,t:11,i:779}, D{l:5,t:0,i:278}, D{l:137,t:0,i:68}, D{l:6,t:0,i:932}, D{l:6,t:0,i:1084}, D{l:144,t:0,i:86}, D{l:4,t:0,i:163}, D{l:5,t:0,i:201}, D{l:5,t:0,i:307}, D{l:5,t:0,i:310}, D{l:6,t:0,i:335}, D{l:7,t:0,i:284}, D{l:7,t:0,i:1660}, D{l:136,t:0,i:165}, D{l:136,t:0,i:781}, D{l:134,t:0,i:707}, D{l:6,t:0,i:33}, D{l:135,t:0,i:1244}, D{l:5,t:10,i:821}, D{l:6,t:11,i:67}, D{l:6,t:10,i:1687}, D{l:7,t:11,i:258}, D{l:7,t:11,i:1630}, D{l:9,t:11,i:354}, D{l:9,t:11,i:675}, D{l:10,t:11,i:830}, D{l:14,t:11,i:80}, D{l:145,t:11,i:80}, D{l:6,t:11,i:141}, D{l:7,t:11,i:225}, D{l:9,t:11,i:59}, D{l:9,t:11,i:607}, D{l:10,t:11,i:312}, D{l:11,t:11,i:687}, D{l:12,t:11,i:555}, D{l:13,t:11,i:373}, D{l:13,t:11,i:494}, D{l:148,t:11,i:58}, D{l:134,t:0,i:1113}, D{l:9,t:0,i:388}, D{l:5,t:10,i:71}, D{l:7,t:10,i:1407}, D{l:9,t:10,i:704}, D{l:10,t:10,i:261}, D{l:10,t:10,i:619}, D{l:11,t:10,i:547}, D{l:11,t:10,i:619}, D{l:143,t:10,i:157}, D{l:7,t:0,i:1953}, D{l:136,t:0,i:720}, D{l:138,t:0,i:203}, D{l:7,t:10,i:2008}, D{l:9,t:10,i:337}, D{l:138,t:10,i:517}, D{l:6,t:0,i:326}, D{l:7,t:0,i:677}, D{l:137,t:0,i:425}, D{l:139,t:11,i:81}, D{l:7,t:0,i:1316}, D{l:7,t:0,i:1412}, D{l:7,t:0,i:1839}, D{l:9,t:0,i:589}, D{l:11,t:0,i:241}, D{l:11,t:0,i:676}, D{l:11,t:0,i:811}, D{l:11,t:0,i:891}, D{l:12,t:0,i:140}, D{l:12,t:0,i:346}, D{l:12,t:0,i:479}, D{l:13,t:0,i:140}, D{l:13,t:0,i:381}, D{l:14,t:0,i:188}, D{l:18,t:0,i:30}, D{l:148,t:0,i:108}, D{l:5,t:0,i:416}, D{l:6,t:10,i:86}, D{l:6,t:10,i:603}, D{l:7,t:10,i:292}, D{l:7,t:10,i:561}, D{l:8,t:10,i:257}, D{l:8,t:10,i:382}, D{l:9,t:10,i:721}, D{l:9,t:10,i:778}, D{l:11,t:10,i:581}, D{l:140,t:10,i:466}, D{l:4,t:10,i:486}, D{l:133,t:10,i:491}, D{l:134,t:0,i:1300}, D{l:132,t:10,i:72}, D{l:7,t:0,i:847}, D{l:6,t:10,i:265}, D{l:7,t:11,i:430}, D{l:139,t:11,i:46}, D{l:5,t:11,i:602}, D{l:6,t:11,i:106}, D{l:7,t:11,i:1786}, D{l:7,t:11,i:1821}, D{l:7,t:11,i:2018}, D{l:9,t:11,i:418}, D{l:137,t:11,i:763}, D{l:5,t:0,i:358}, D{l:7,t:0,i:535}, D{l:7,t:0,i:1184}, D{l:10,t:0,i:662}, D{l:13,t:0,i:212}, D{l:13,t:0,i:304}, D{l:13,t:0,i:333}, D{l:145,t:0,i:98}, D{l:5,t:11,i:65}, D{l:6,t:11,i:416}, D{l:7,t:11,i:1720}, D{l:7,t:11,i:1924}, D{l:8,t:11,i:677}, D{l:10,t:11,i:109}, D{l:11,t:11,i:14}, D{l:11,t:11,i:70}, D{l:11,t:11,i:569}, D{l:11,t:11,i:735}, D{l:15,t:11,i:153}, D{l:148,t:11,i:80}, D{l:6,t:0,i:1823}, D{l:8,t:0,i:839}, D{l:8,t:0,i:852}, D{l:8,t:0,i:903}, D{l:10,t:0,i:940}, D{l:12,t:0,i:707}, D{l:140,t:0,i:775}, D{l:135,t:11,i:1229}, D{l:6,t:0,i:1522}, D{l:140,t:0,i:654}, D{l:136,t:11,i:595}, D{l:139,t:0,i:163}, D{l:141,t:0,i:314}, D{l:132,t:0,i:978}, D{l:4,t:0,i:601}, D{l:6,t:0,i:2035}, D{l:137,t:10,i:234}, D{l:5,t:10,i:815}, D{l:6,t:10,i:1688}, D{l:134,t:10,i:1755}, D{l:133,t:0,i:946}, D{l:136,t:0,i:434}, D{l:6,t:10,i:197}, D{l:136,t:10,i:205}, D{l:7,t:0,i:411}, D{l:7,t:0,i:590}, D{l:8,t:0,i:631}, D{l:9,t:0,i:323}, D{l:10,t:0,i:355}, D{l:11,t:0,i:491}, D{l:12,t:0,i:143}, D{l:12,t:0,i:402}, D{l:13,t:0,i:73}, D{l:14,t:0,i:408}, D{l:15,t:0,i:107}, D{l:146,t:0,i:71}, D{l:7,t:0,i:1467}, D{l:8,t:0,i:328}, D{l:10,t:0,i:544}, D{l:11,t:0,i:955}, D{l:12,t:0,i:13}, D{l:13,t:0,i:320}, D{l:145,t:0,i:83}, D{l:142,t:0,i:410}, D{l:11,t:0,i:511}, D{l:13,t:0,i:394}, D{l:14,t:0,i:298}, D{l:14,t:0,i:318}, D{l:146,t:0,i:103}, D{l:6,t:10,i:452}, D{l:7,t:10,i:312}, D{l:138,t:10,i:219}, D{l:138,t:10,i:589}, D{l:4,t:10,i:333}, D{l:9,t:10,i:176}, D{l:12,t:10,i:353}, D{l:141,t:10,i:187}, D{l:135,t:11,i:329}, D{l:132,t:11,i:469}, D{l:5,t:0,i:835}, D{l:134,t:0,i:483}, D{l:134,t:11,i:1743}, D{l:5,t:11,i:929}, D{l:6,t:11,i:340}, D{l:8,t:11,i:376}, D{l:136,t:11,i:807}, D{l:134,t:10,i:1685}, D{l:132,t:0,i:677}, D{l:5,t:11,i:218}, D{l:7,t:11,i:1610}, D{l:138,t:11,i:83}, D{l:5,t:11,i:571}, D{l:135,t:11,i:1842}, D{l:132,t:11,i:455}, D{l:137,t:0,i:70}, D{l:135,t:0,i:1405}, D{l:7,t:10,i:135}, D{l:8,t:10,i:7}, D{l:8,t:10,i:62}, D{l:9,t:10,i:243}, D{l:10,t:10,i:658}, D{l:10,t:10,i:697}, D{l:11,t:10,i:456}, D{l:139,t:10,i:756}, D{l:9,t:10,i:395}, D{l:138,t:10,i:79}, D{l:137,t:0,i:108}, D{l:6,t:11,i:161}, D{l:7,t:11,i:372}, D{l:137,t:11,i:597}, D{l:132,t:11,i:349}, D{l:132,t:0,i:777}, D{l:132,t:0,i:331}, D{l:135,t:10,i:631}, D{l:133,t:0,i:747}, D{l:6,t:11,i:432}, D{l:6,t:11,i:608}, D{l:139,t:11,i:322}, D{l:138,t:10,i:835}, D{l:5,t:11,i:468}, D{l:7,t:11,i:1809}, D{l:10,t:11,i:325}, D{l:11,t:11,i:856}, D{l:12,t:11,i:345}, D{l:143,t:11,i:104}, D{l:133,t:11,i:223}, D{l:7,t:10,i:406}, D{l:7,t:10,i:459}, D{l:8,t:10,i:606}, D{l:139,t:10,i:726}, D{l:132,t:11,i:566}, D{l:142,t:0,i:68}, D{l:4,t:11,i:59}, D{l:135,t:11,i:1394}, D{l:6,t:11,i:436}, D{l:139,t:11,i:481}, D{l:4,t:11,i:48}, D{l:5,t:11,i:271}, D{l:135,t:11,i:953}, D{l:139,t:11,i:170}, D{l:5,t:11,i:610}, D{l:136,t:11,i:457}, D{l:133,t:11,i:755}, D{l:135,t:11,i:1217}, D{l:133,t:10,i:612}, D{l:132,t:11,i:197}, D{l:132,t:0,i:505}, D{l:4,t:10,i:372}, D{l:7,t:10,i:482}, D{l:8,t:10,i:158}, D{l:9,t:10,i:602}, D{l:9,t:10,i:615}, D{l:10,t:10,i:245}, D{l:10,t:10,i:678}, D{l:10,t:10,i:744}, D{l:11,t:10,i:248}, D{l:139,t:10,i:806}, D{l:133,t:0,i:326}, D{l:5,t:10,i:854}, D{l:135,t:10,i:1991}, D{l:4,t:0,i:691}, D{l:146,t:0,i:16}, D{l:6,t:0,i:628}, D{l:9,t:0,i:35}, D{l:10,t:0,i:680}, D{l:10,t:0,i:793}, D{l:11,t:0,i:364}, D{l:13,t:0,i:357}, D{l:143,t:0,i:164}, D{l:138,t:0,i:654}, D{l:6,t:0,i:32}, D{l:7,t:0,i:385}, D{l:7,t:0,i:757}, D{l:7,t:0,i:1916}, D{l:8,t:0,i:37}, D{l:8,t:0,i:94}, D{l:8,t:0,i:711}, D{l:9,t:0,i:541}, D{l:10,t:0,i:162}, D{l:10,t:0,i:795}, D{l:11,t:0,i:989}, D{l:11,t:0,i:1010}, D{l:12,t:0,i:14}, D{l:142,t:0,i:308}, D{l:133,t:11,i:217}, D{l:6,t:0,i:152}, D{l:6,t:0,i:349}, D{l:6,t:0,i:1682}, D{l:7,t:0,i:1252}, D{l:8,t:0,i:112}, D{l:9,t:0,i:435}, D{l:9,t:0,i:668}, D{l:10,t:0,i:290}, D{l:10,t:0,i:319}, D{l:10,t:0,i:815}, D{l:11,t:0,i:180}, D{l:11,t:0,i:837}, D{l:12,t:0,i:240}, D{l:13,t:0,i:152}, D{l:13,t:0,i:219}, D{l:142,t:0,i:158}, D{l:4,t:0,i:581}, D{l:134,t:0,i:726}, D{l:5,t:10,i:195}, D{l:135,t:10,i:1685}, D{l:6,t:0,i:126}, D{l:7,t:0,i:573}, D{l:8,t:0,i:397}, D{l:142,t:0,i:44}, D{l:138,t:0,i:89}, D{l:7,t:10,i:1997}, D{l:8,t:10,i:730}, D{l:139,t:10,i:1006}, D{l:134,t:0,i:1531}, D{l:134,t:0,i:1167}, D{l:5,t:0,i:926}, D{l:12,t:0,i:203}, D{l:133,t:10,i:751}, D{l:4,t:11,i:165}, D{l:7,t:11,i:1398}, D{l:135,t:11,i:1829}, D{l:7,t:0,i:1232}, D{l:137,t:0,i:531}, D{l:135,t:10,i:821}, D{l:134,t:0,i:943}, D{l:133,t:0,i:670}, D{l:4,t:0,i:880}, D{l:139,t:0,i:231}, D{l:134,t:0,i:1617}, D{l:135,t:0,i:1957}, D{l:5,t:11,i:9}, D{l:7,t:11,i:297}, D{l:7,t:11,i:966}, D{l:140,t:11,i:306}, D{l:6,t:0,i:975}, D{l:134,t:0,i:985}, D{l:5,t:10,i:950}, D{l:5,t:10,i:994}, D{l:134,t:10,i:351}, D{l:12,t:11,i:21}, D{l:151,t:11,i:7}, D{l:5,t:11,i:146}, D{l:6,t:11,i:411}, D{l:138,t:11,i:721}, D{l:7,t:0,i:242}, D{l:135,t:0,i:1942}, D{l:6,t:11,i:177}, D{l:135,t:11,i:467}, D{l:5,t:0,i:421}, D{l:7,t:10,i:47}, D{l:137,t:10,i:684}, D{l:5,t:0,i:834}, D{l:7,t:0,i:1202}, D{l:8,t:0,i:14}, D{l:9,t:0,i:481}, D{l:137,t:0,i:880}, D{l:138,t:0,i:465}, D{l:6,t:0,i:688}, D{l:9,t:0,i:834}, D{l:132,t:10,i:350}, D{l:132,t:0,i:855}, D{l:4,t:0,i:357}, D{l:6,t:0,i:172}, D{l:7,t:0,i:143}, D{l:137,t:0,i:413}, D{l:133,t:11,i:200}, D{l:132,t:0,i:590}, D{l:7,t:10,i:1812}, D{l:13,t:10,i:259}, D{l:13,t:10,i:356}, D{l:14,t:10,i:242}, D{l:147,t:10,i:114}, D{l:133,t:10,i:967}, D{l:11,t:0,i:114}, D{l:4,t:10,i:473}, D{l:7,t:10,i:623}, D{l:8,t:10,i:808}, D{l:9,t:10,i:871}, D{l:9,t:10,i:893}, D{l:11,t:10,i:431}, D{l:12,t:10,i:112}, D{l:12,t:10,i:217}, D{l:12,t:10,i:243}, D{l:12,t:10,i:562}, D{l:12,t:10,i:663}, D{l:12,t:10,i:683}, D{l:13,t:10,i:141}, D{l:13,t:10,i:197}, D{l:13,t:10,i:227}, D{l:13,t:10,i:406}, D{l:13,t:10,i:487}, D{l:14,t:10,i:156}, D{l:14,t:10,i:203}, D{l:14,t:10,i:224}, D{l:14,t:10,i:256}, D{l:18,t:10,i:58}, D{l:150,t:10,i:0}, D{l:138,t:10,i:286}, D{l:4,t:10,i:222}, D{l:7,t:10,i:286}, D{l:136,t:10,i:629}, D{l:5,t:0,i:169}, D{l:7,t:0,i:333}, D{l:136,t:0,i:45}, D{l:134,t:11,i:481}, D{l:132,t:0,i:198}, D{l:4,t:0,i:24}, D{l:5,t:0,i:140}, D{l:5,t:0,i:185}, D{l:7,t:0,i:1500}, D{l:11,t:0,i:565}, D{l:11,t:0,i:838}, D{l:4,t:11,i:84}, D{l:7,t:11,i:1482}, D{l:10,t:11,i:76}, D{l:138,t:11,i:142}, D{l:133,t:0,i:585}, D{l:141,t:10,i:306}, D{l:133,t:11,i:1015}, D{l:4,t:11,i:315}, D{l:5,t:11,i:507}, D{l:135,t:11,i:1370}, D{l:136,t:10,i:146}, D{l:6,t:0,i:691}, D{l:134,t:0,i:1503}, D{l:4,t:0,i:334}, D{l:133,t:0,i:593}, D{l:4,t:10,i:465}, D{l:135,t:10,i:1663}, D{l:142,t:11,i:173}, D{l:135,t:0,i:913}, D{l:12,t:0,i:116}, D{l:134,t:11,i:1722}, D{l:134,t:0,i:1360}, D{l:132,t:0,i:802}, D{l:8,t:11,i:222}, D{l:8,t:11,i:476}, D{l:9,t:11,i:238}, D{l:11,t:11,i:516}, D{l:11,t:11,i:575}, D{l:15,t:11,i:109}, D{l:146,t:11,i:100}, D{l:6,t:0,i:308}, D{l:9,t:0,i:673}, D{l:7,t:10,i:138}, D{l:7,t:10,i:517}, D{l:139,t:10,i:238}, D{l:132,t:0,i:709}, D{l:6,t:0,i:1876}, D{l:6,t:0,i:1895}, D{l:9,t:0,i:994}, D{l:9,t:0,i:1006}, D{l:12,t:0,i:829}, D{l:12,t:0,i:888}, D{l:12,t:0,i:891}, D{l:146,t:0,i:185}, D{l:148,t:10,i:94}, D{l:4,t:0,i:228}, D{l:133,t:0,i:897}, D{l:7,t:0,i:1840}, D{l:5,t:10,i:495}, D{l:7,t:10,i:834}, D{l:9,t:10,i:733}, D{l:139,t:10,i:378}, D{l:133,t:10,i:559}, D{l:6,t:10,i:21}, D{l:6,t:10,i:1737}, D{l:7,t:10,i:1444}, D{l:136,t:10,i:224}, D{l:4,t:0,i:608}, D{l:133,t:0,i:497}, D{l:6,t:11,i:40}, D{l:135,t:11,i:1781}, D{l:134,t:0,i:1573}, D{l:135,t:0,i:2039}, D{l:6,t:0,i:540}, D{l:136,t:0,i:136}, D{l:4,t:0,i:897}, D{l:5,t:0,i:786}, D{l:133,t:10,i:519}, D{l:6,t:0,i:1878}, D{l:6,t:0,i:1884}, D{l:9,t:0,i:938}, D{l:9,t:0,i:948}, D{l:9,t:0,i:955}, D{l:9,t:0,i:973}, D{l:9,t:0,i:1012}, D{l:12,t:0,i:895}, D{l:12,t:0,i:927}, D{l:143,t:0,i:254}, D{l:134,t:0,i:1469}, D{l:133,t:0,i:999}, D{l:4,t:0,i:299}, D{l:135,t:0,i:1004}, D{l:4,t:0,i:745}, D{l:133,t:0,i:578}, D{l:136,t:11,i:574}, D{l:133,t:0,i:456}, D{l:134,t:0,i:1457}, D{l:7,t:0,i:1679}, D{l:132,t:10,i:402}, D{l:7,t:0,i:693}, D{l:8,t:0,i:180}, D{l:12,t:0,i:163}, D{l:8,t:10,i:323}, D{l:136,t:10,i:479}, D{l:11,t:10,i:580}, D{l:142,t:10,i:201}, D{l:5,t:10,i:59}, D{l:135,t:10,i:672}, D{l:132,t:11,i:354}, D{l:146,t:10,i:34}, D{l:4,t:0,i:755}, D{l:135,t:11,i:1558}, D{l:7,t:0,i:1740}, D{l:146,t:0,i:48}, D{l:4,t:10,i:85}, D{l:135,t:10,i:549}, D{l:139,t:0,i:338}, D{l:133,t:10,i:94}, D{l:134,t:0,i:1091}, D{l:135,t:11,i:469}, D{l:12,t:0,i:695}, D{l:12,t:0,i:704}, D{l:20,t:0,i:113}, D{l:5,t:11,i:830}, D{l:14,t:11,i:338}, D{l:148,t:11,i:81}, D{l:135,t:0,i:1464}, D{l:6,t:10,i:11}, D{l:135,t:10,i:187}, D{l:135,t:0,i:975}, D{l:13,t:0,i:335}, D{l:132,t:10,i:522}, D{l:134,t:0,i:1979}, D{l:5,t:11,i:496}, D{l:135,t:11,i:203}, D{l:4,t:10,i:52}, D{l:135,t:10,i:661}, D{l:7,t:0,i:1566}, D{l:8,t:0,i:269}, D{l:9,t:0,i:212}, D{l:9,t:0,i:718}, D{l:14,t:0,i:15}, D{l:14,t:0,i:132}, D{l:142,t:0,i:227}, D{l:4,t:0,i:890}, D{l:5,t:0,i:805}, D{l:5,t:0,i:819}, D{l:5,t:0,i:961}, D{l:6,t:0,i:396}, D{l:6,t:0,i:1631}, D{l:6,t:0,i:1678}, D{l:7,t:0,i:1967}, D{l:7,t:0,i:2041}, D{l:9,t:0,i:630}, D{l:11,t:0,i:8}, D{l:11,t:0,i:1019}, D{l:12,t:0,i:176}, D{l:13,t:0,i:225}, D{l:14,t:0,i:292}, D{l:21,t:0,i:24}, D{l:4,t:10,i:383}, D{l:133,t:10,i:520}, D{l:134,t:11,i:547}, D{l:135,t:11,i:1748}, D{l:5,t:11,i:88}, D{l:137,t:11,i:239}, D{l:146,t:11,i:128}, D{l:7,t:11,i:650}, D{l:135,t:11,i:1310}, D{l:4,t:10,i:281}, D{l:5,t:10,i:38}, D{l:7,t:10,i:194}, D{l:7,t:10,i:668}, D{l:7,t:10,i:1893}, D{l:137,t:10,i:397}, D{l:135,t:0,i:1815}, D{l:9,t:10,i:635}, D{l:139,t:10,i:559}, D{l:7,t:0,i:1505}, D{l:10,t:0,i:190}, D{l:10,t:0,i:634}, D{l:11,t:0,i:792}, D{l:12,t:0,i:358}, D{l:140,t:0,i:447}, D{l:5,t:0,i:0}, D{l:6,t:0,i:536}, D{l:7,t:0,i:604}, D{l:13,t:0,i:445}, D{l:145,t:0,i:126}, D{l:7,t:11,i:1076}, D{l:9,t:11,i:80}, D{l:11,t:11,i:78}, D{l:11,t:11,i:421}, D{l:11,t:11,i:534}, D{l:140,t:11,i:545}, D{l:8,t:0,i:966}, D{l:10,t:0,i:1023}, D{l:14,t:11,i:369}, D{l:146,t:11,i:72}, D{l:135,t:11,i:1641}, D{l:6,t:0,i:232}, D{l:6,t:0,i:412}, D{l:7,t:0,i:1074}, D{l:8,t:0,i:9}, D{l:8,t:0,i:157}, D{l:8,t:0,i:786}, D{l:9,t:0,i:196}, D{l:9,t:0,i:352}, D{l:9,t:0,i:457}, D{l:10,t:0,i:337}, D{l:11,t:0,i:232}, D{l:11,t:0,i:877}, D{l:12,t:0,i:480}, D{l:140,t:0,i:546}, D{l:135,t:0,i:958}, D{l:4,t:0,i:382}, D{l:136,t:0,i:579}, D{l:4,t:0,i:212}, D{l:135,t:0,i:1206}, D{l:4,t:11,i:497}, D{l:5,t:11,i:657}, D{l:135,t:11,i:1584}, D{l:132,t:0,i:681}, D{l:8,t:0,i:971}, D{l:138,t:0,i:965}, D{l:5,t:10,i:448}, D{l:136,t:10,i:535}, D{l:14,t:0,i:16}, D{l:146,t:0,i:44}, D{l:11,t:0,i:584}, D{l:11,t:0,i:616}, D{l:14,t:0,i:275}, D{l:11,t:11,i:584}, D{l:11,t:11,i:616}, D{l:142,t:11,i:275}, D{l:136,t:11,i:13}, D{l:7,t:10,i:610}, D{l:135,t:10,i:1501}, D{l:7,t:11,i:642}, D{l:8,t:11,i:250}, D{l:11,t:11,i:123}, D{l:11,t:11,i:137}, D{l:13,t:11,i:48}, D{l:142,t:11,i:95}, D{l:133,t:0,i:655}, D{l:17,t:0,i:67}, D{l:147,t:0,i:74}, D{l:134,t:0,i:751}, D{l:134,t:0,i:1967}, D{l:6,t:0,i:231}, D{l:136,t:0,i:423}, D{l:5,t:0,i:300}, D{l:138,t:0,i:1016}, D{l:4,t:10,i:319}, D{l:5,t:10,i:699}, D{l:138,t:10,i:673}, D{l:6,t:0,i:237}, D{l:7,t:0,i:611}, D{l:8,t:0,i:100}, D{l:9,t:0,i:416}, D{l:11,t:0,i:335}, D{l:12,t:0,i:173}, D{l:18,t:0,i:101}, D{l:6,t:10,i:336}, D{l:8,t:10,i:552}, D{l:9,t:10,i:285}, D{l:10,t:10,i:99}, D{l:139,t:10,i:568}, D{l:134,t:0,i:1370}, D{l:7,t:10,i:1406}, D{l:9,t:10,i:218}, D{l:141,t:10,i:222}, D{l:133,t:10,i:256}, D{l:135,t:0,i:1208}, D{l:14,t:11,i:213}, D{l:148,t:11,i:38}, D{l:6,t:0,i:1219}, D{l:135,t:11,i:1642}, D{l:13,t:0,i:417}, D{l:14,t:0,i:129}, D{l:143,t:0,i:15}, D{l:10,t:11,i:545}, D{l:140,t:11,i:301}, D{l:17,t:10,i:39}, D{l:148,t:10,i:36}, D{l:133,t:0,i:199}, D{l:4,t:11,i:904}, D{l:133,t:11,i:794}, D{l:12,t:0,i:427}, D{l:146,t:0,i:38}, D{l:134,t:0,i:949}, D{l:8,t:0,i:665}, D{l:135,t:10,i:634}, D{l:132,t:10,i:618}, D{l:135,t:10,i:259}, D{l:132,t:10,i:339}, D{l:133,t:11,i:761}, D{l:141,t:10,i:169}, D{l:132,t:10,i:759}, D{l:5,t:0,i:688}, D{l:7,t:0,i:539}, D{l:135,t:0,i:712}, D{l:7,t:11,i:386}, D{l:138,t:11,i:713}, D{l:134,t:0,i:1186}, D{l:6,t:11,i:7}, D{l:6,t:11,i:35}, D{l:7,t:11,i:147}, D{l:7,t:11,i:1069}, D{l:7,t:11,i:1568}, D{l:7,t:11,i:1575}, D{l:7,t:11,i:1917}, D{l:8,t:11,i:43}, D{l:8,t:11,i:208}, D{l:9,t:11,i:128}, D{l:9,t:11,i:866}, D{l:10,t:11,i:20}, D{l:11,t:11,i:981}, D{l:147,t:11,i:33}, D{l:7,t:11,i:893}, D{l:8,t:10,i:482}, D{l:141,t:11,i:424}, D{l:6,t:0,i:312}, D{l:6,t:0,i:1715}, D{l:10,t:0,i:584}, D{l:11,t:0,i:546}, D{l:11,t:0,i:692}, D{l:12,t:0,i:259}, D{l:12,t:0,i:295}, D{l:13,t:0,i:46}, D{l:141,t:0,i:154}, D{l:5,t:10,i:336}, D{l:6,t:10,i:341}, D{l:6,t:10,i:478}, D{l:6,t:10,i:1763}, D{l:136,t:10,i:386}, D{l:137,t:0,i:151}, D{l:132,t:0,i:588}, D{l:152,t:0,i:4}, D{l:6,t:11,i:322}, D{l:9,t:11,i:552}, D{l:11,t:11,i:274}, D{l:13,t:11,i:209}, D{l:13,t:11,i:499}, D{l:14,t:11,i:85}, D{l:15,t:11,i:126}, D{l:145,t:11,i:70}, D{l:135,t:10,i:73}, D{l:4,t:0,i:231}, D{l:5,t:0,i:61}, D{l:6,t:0,i:104}, D{l:7,t:0,i:729}, D{l:7,t:0,i:964}, D{l:7,t:0,i:1658}, D{l:140,t:0,i:414}, D{l:6,t:0,i:263}, D{l:138,t:0,i:757}, D{l:135,t:10,i:1971}, D{l:4,t:0,i:612}, D{l:133,t:0,i:561}, D{l:132,t:0,i:320}, D{l:135,t:10,i:1344}, D{l:8,t:11,i:83}, D{l:8,t:11,i:817}, D{l:9,t:11,i:28}, D{l:9,t:11,i:29}, D{l:9,t:11,i:885}, D{l:10,t:11,i:387}, D{l:11,t:11,i:633}, D{l:11,t:11,i:740}, D{l:13,t:11,i:235}, D{l:13,t:11,i:254}, D{l:15,t:11,i:143}, D{l:143,t:11,i:146}, D{l:5,t:10,i:396}, D{l:134,t:10,i:501}, D{l:140,t:11,i:49}, D{l:132,t:0,i:225}, D{l:4,t:10,i:929}, D{l:5,t:10,i:799}, D{l:8,t:10,i:46}, D{l:136,t:10,i:740}, D{l:4,t:0,i:405}, D{l:7,t:0,i:817}, D{l:14,t:0,i:58}, D{l:17,t:0,i:37}, D{l:146,t:0,i:124}, D{l:133,t:0,i:974}, D{l:4,t:11,i:412}, D{l:133,t:11,i:581}, D{l:4,t:10,i:892}, D{l:133,t:10,i:770}, D{l:4,t:0,i:996}, D{l:134,t:0,i:2026}, D{l:4,t:0,i:527}, D{l:5,t:0,i:235}, D{l:7,t:0,i:1239}, D{l:11,t:0,i:131}, D{l:140,t:0,i:370}, D{l:9,t:0,i:16}, D{l:13,t:0,i:386}, D{l:135,t:11,i:421}, D{l:7,t:0,i:956}, D{l:7,t:0,i:1157}, D{l:7,t:0,i:1506}, D{l:7,t:0,i:1606}, D{l:7,t:0,i:1615}, D{l:7,t:0,i:1619}, D{l:7,t:0,i:1736}, D{l:7,t:0,i:1775}, D{l:8,t:0,i:590}, D{l:9,t:0,i:324}, D{l:9,t:0,i:736}, D{l:9,t:0,i:774}, D{l:9,t:0,i:776}, D{l:9,t:0,i:784}, D{l:10,t:0,i:567}, D{l:10,t:0,i:708}, D{l:11,t:0,i:518}, D{l:11,t:0,i:613}, D{l:11,t:0,i:695}, D{l:11,t:0,i:716}, D{l:11,t:0,i:739}, D{l:11,t:0,i:770}, D{l:11,t:0,i:771}, D{l:11,t:0,i:848}, D{l:11,t:0,i:857}, D{l:11,t:0,i:931}, D{l:11,t:0,i:947}, D{l:12,t:0,i:326}, D{l:12,t:0,i:387}, D{l:12,t:0,i:484}, D{l:12,t:0,i:528}, D{l:12,t:0,i:552}, D{l:12,t:0,i:613}, D{l:13,t:0,i:189}, D{l:13,t:0,i:256}, D{l:13,t:0,i:340}, D{l:13,t:0,i:432}, D{l:13,t:0,i:436}, D{l:13,t:0,i:440}, D{l:13,t:0,i:454}, D{l:14,t:0,i:174}, D{l:14,t:0,i:220}, D{l:14,t:0,i:284}, D{l:14,t:0,i:390}, D{l:145,t:0,i:121}, D{l:135,t:10,i:158}, D{l:9,t:0,i:137}, D{l:138,t:0,i:221}, D{l:4,t:11,i:110}, D{l:10,t:11,i:415}, D{l:10,t:11,i:597}, D{l:142,t:11,i:206}, D{l:141,t:11,i:496}, D{l:135,t:11,i:205}, D{l:151,t:10,i:25}, D{l:135,t:11,i:778}, D{l:7,t:11,i:1656}, D{l:7,t:10,i:2001}, D{l:9,t:11,i:369}, D{l:10,t:11,i:338}, D{l:10,t:11,i:490}, D{l:11,t:11,i:154}, D{l:11,t:11,i:545}, D{l:11,t:11,i:775}, D{l:13,t:11,i:77}, D{l:141,t:11,i:274}, D{l:4,t:11,i:444}, D{l:10,t:11,i:146}, D{l:140,t:11,i:9}, D{l:7,t:0,i:390}, D{l:138,t:0,i:140}, D{l:135,t:0,i:1144}, D{l:134,t:0,i:464}, D{l:7,t:10,i:1461}, D{l:140,t:10,i:91}, D{l:132,t:10,i:602}, D{l:4,t:11,i:283}, D{l:135,t:11,i:1194}, D{l:5,t:0,i:407}, D{l:11,t:0,i:204}, D{l:11,t:0,i:243}, D{l:11,t:0,i:489}, D{l:12,t:0,i:293}, D{l:19,t:0,i:37}, D{l:20,t:0,i:73}, D{l:150,t:0,i:38}, D{l:7,t:0,i:1218}, D{l:136,t:0,i:303}, D{l:5,t:0,i:325}, D{l:8,t:0,i:5}, D{l:8,t:0,i:227}, D{l:9,t:0,i:105}, D{l:10,t:0,i:585}, D{l:12,t:0,i:614}, D{l:4,t:10,i:13}, D{l:5,t:10,i:567}, D{l:7,t:10,i:1498}, D{l:9,t:10,i:124}, D{l:11,t:10,i:521}, D{l:140,t:10,i:405}, D{l:135,t:10,i:1006}, D{l:7,t:0,i:800}, D{l:10,t:0,i:12}, D{l:134,t:11,i:1720}, D{l:135,t:0,i:1783}, D{l:132,t:10,i:735}, D{l:138,t:10,i:812}, D{l:4,t:10,i:170}, D{l:135,t:10,i:323}, D{l:6,t:0,i:621}, D{l:13,t:0,i:504}, D{l:144,t:0,i:89}, D{l:5,t:10,i:304}, D{l:135,t:10,i:1403}, D{l:137,t:11,i:216}, D{l:6,t:0,i:920}, D{l:6,t:0,i:1104}, D{l:9,t:11,i:183}, D{l:139,t:11,i:286}, D{l:4,t:0,i:376}, D{l:133,t:10,i:742}, D{l:134,t:0,i:218}, D{l:8,t:0,i:641}, D{l:11,t:0,i:388}, D{l:140,t:0,i:580}, D{l:7,t:0,i:454}, D{l:7,t:0,i:782}, D{l:8,t:0,i:768}, D{l:140,t:0,i:686}, D{l:137,t:11,i:33}, D{l:133,t:10,i:111}, D{l:144,t:0,i:0}, D{l:10,t:0,i:676}, D{l:140,t:0,i:462}, D{l:6,t:0,i:164}, D{l:136,t:11,i:735}, D{l:133,t:10,i:444}, D{l:150,t:0,i:50}, D{l:7,t:11,i:1862}, D{l:12,t:11,i:491}, D{l:12,t:11,i:520}, D{l:13,t:11,i:383}, D{l:14,t:11,i:244}, D{l:146,t:11,i:12}, D{l:5,t:11,i:132}, D{l:9,t:11,i:486}, D{l:9,t:11,i:715}, D{l:10,t:11,i:458}, D{l:11,t:11,i:373}, D{l:11,t:11,i:668}, D{l:11,t:11,i:795}, D{l:11,t:11,i:897}, D{l:12,t:11,i:272}, D{l:12,t:11,i:424}, D{l:12,t:11,i:539}, D{l:12,t:11,i:558}, D{l:14,t:11,i:245}, D{l:14,t:11,i:263}, D{l:14,t:11,i:264}, D{l:14,t:11,i:393}, D{l:142,t:11,i:403}, D{l:8,t:10,i:123}, D{l:15,t:10,i:6}, D{l:144,t:10,i:7}, D{l:6,t:0,i:285}, D{l:8,t:0,i:654}, D{l:11,t:0,i:749}, D{l:12,t:0,i:190}, D{l:12,t:0,i:327}, D{l:13,t:0,i:120}, D{l:13,t:0,i:121}, D{l:13,t:0,i:327}, D{l:15,t:0,i:47}, D{l:146,t:0,i:40}, D{l:5,t:11,i:8}, D{l:6,t:11,i:89}, D{l:6,t:11,i:400}, D{l:7,t:11,i:1569}, D{l:7,t:11,i:1623}, D{l:7,t:11,i:1850}, D{l:8,t:11,i:218}, D{l:8,t:11,i:422}, D{l:9,t:11,i:570}, D{l:138,t:11,i:626}, D{l:6,t:11,i:387}, D{l:7,t:11,i:882}, D{l:141,t:11,i:111}, D{l:6,t:0,i:343}, D{l:7,t:0,i:195}, D{l:9,t:0,i:226}, D{l:10,t:0,i:197}, D{l:10,t:0,i:575}, D{l:11,t:0,i:502}, D{l:11,t:0,i:899}, D{l:6,t:11,i:224}, D{l:7,t:11,i:877}, D{l:137,t:11,i:647}, D{l:5,t:10,i:937}, D{l:135,t:10,i:100}, D{l:135,t:11,i:790}, D{l:150,t:0,i:29}, D{l:147,t:0,i:8}, D{l:134,t:0,i:1812}, D{l:149,t:0,i:8}, D{l:135,t:11,i:394}, D{l:7,t:0,i:1125}, D{l:9,t:0,i:143}, D{l:11,t:0,i:61}, D{l:14,t:0,i:405}, D{l:150,t:0,i:21}, D{l:10,t:11,i:755}, D{l:147,t:11,i:29}, D{l:9,t:11,i:378}, D{l:141,t:11,i:162}, D{l:135,t:10,i:922}, D{l:5,t:10,i:619}, D{l:133,t:10,i:698}, D{l:134,t:0,i:1327}, D{l:6,t:0,i:1598}, D{l:137,t:0,i:575}, D{l:9,t:11,i:569}, D{l:12,t:11,i:12}, D{l:12,t:11,i:81}, D{l:12,t:11,i:319}, D{l:13,t:11,i:69}, D{l:14,t:11,i:259}, D{l:16,t:11,i:87}, D{l:17,t:11,i:1}, D{l:17,t:11,i:21}, D{l:17,t:11,i:24}, D{l:18,t:11,i:15}, D{l:18,t:11,i:56}, D{l:18,t:11,i:59}, D{l:18,t:11,i:127}, D{l:18,t:11,i:154}, D{l:19,t:11,i:19}, D{l:148,t:11,i:31}, D{l:6,t:0,i:895}, D{l:135,t:11,i:1231}, D{l:5,t:0,i:959}, D{l:7,t:11,i:124}, D{l:136,t:11,i:38}, D{l:5,t:11,i:261}, D{l:7,t:11,i:78}, D{l:7,t:11,i:199}, D{l:8,t:11,i:815}, D{l:9,t:11,i:126}, D{l:138,t:11,i:342}, D{l:5,t:10,i:917}, D{l:134,t:10,i:1659}, D{l:7,t:0,i:1759}, D{l:5,t:11,i:595}, D{l:135,t:11,i:1863}, D{l:136,t:0,i:173}, D{l:134,t:0,i:266}, D{l:142,t:0,i:261}, D{l:132,t:11,i:628}, D{l:5,t:10,i:251}, D{l:5,t:10,i:956}, D{l:8,t:10,i:268}, D{l:9,t:10,i:214}, D{l:146,t:10,i:142}, D{l:7,t:11,i:266}, D{l:136,t:11,i:804}, D{l:135,t:11,i:208}, D{l:6,t:11,i:79}, D{l:7,t:11,i:1021}, D{l:135,t:11,i:1519}, D{l:11,t:11,i:704}, D{l:141,t:11,i:396}, D{l:5,t:10,i:346}, D{l:5,t:10,i:711}, D{l:136,t:10,i:390}, D{l:136,t:11,i:741}, D{l:134,t:11,i:376}, D{l:134,t:0,i:1427}, D{l:6,t:0,i:1033}, D{l:6,t:0,i:1217}, D{l:136,t:0,i:300}, D{l:133,t:10,i:624}, D{l:6,t:11,i:100}, D{l:7,t:11,i:244}, D{l:7,t:11,i:632}, D{l:7,t:11,i:1609}, D{l:8,t:11,i:178}, D{l:8,t:11,i:638}, D{l:141,t:11,i:58}, D{l:6,t:0,i:584}, D{l:5,t:10,i:783}, D{l:7,t:10,i:1998}, D{l:135,t:10,i:2047}, D{l:5,t:0,i:427}, D{l:5,t:0,i:734}, D{l:7,t:0,i:478}, D{l:136,t:0,i:52}, D{l:7,t:0,i:239}, D{l:11,t:0,i:217}, D{l:142,t:0,i:165}, D{l:134,t:0,i:1129}, D{l:6,t:0,i:168}, D{l:6,t:0,i:1734}, D{l:7,t:0,i:20}, D{l:7,t:0,i:1056}, D{l:8,t:0,i:732}, D{l:9,t:0,i:406}, D{l:9,t:0,i:911}, D{l:138,t:0,i:694}, D{l:132,t:10,i:594}, D{l:133,t:11,i:791}, D{l:7,t:11,i:686}, D{l:8,t:11,i:33}, D{l:8,t:11,i:238}, D{l:10,t:11,i:616}, D{l:11,t:11,i:467}, D{l:11,t:11,i:881}, D{l:13,t:11,i:217}, D{l:13,t:11,i:253}, D{l:142,t:11,i:268}, D{l:137,t:11,i:476}, D{l:134,t:0,i:418}, D{l:133,t:0,i:613}, D{l:132,t:0,i:632}, D{l:132,t:11,i:447}, D{l:7,t:0,i:32}, D{l:7,t:0,i:984}, D{l:8,t:0,i:85}, D{l:8,t:0,i:709}, D{l:9,t:0,i:579}, D{l:9,t:0,i:847}, D{l:9,t:0,i:856}, D{l:10,t:0,i:799}, D{l:11,t:0,i:258}, D{l:11,t:0,i:1007}, D{l:12,t:0,i:331}, D{l:12,t:0,i:615}, D{l:13,t:0,i:188}, D{l:13,t:0,i:435}, D{l:14,t:0,i:8}, D{l:15,t:0,i:165}, D{l:16,t:0,i:27}, D{l:20,t:0,i:40}, D{l:144,t:11,i:35}, D{l:4,t:11,i:128}, D{l:5,t:11,i:415}, D{l:6,t:11,i:462}, D{l:7,t:11,i:294}, D{l:7,t:11,i:578}, D{l:10,t:11,i:710}, D{l:139,t:11,i:86}, D{l:5,t:0,i:694}, D{l:136,t:0,i:909}, D{l:7,t:0,i:1109}, D{l:11,t:0,i:7}, D{l:5,t:10,i:37}, D{l:6,t:10,i:39}, D{l:6,t:10,i:451}, D{l:7,t:10,i:218}, D{l:7,t:10,i:1166}, D{l:7,t:10,i:1687}, D{l:8,t:10,i:662}, D{l:144,t:10,i:2}, D{l:136,t:11,i:587}, D{l:6,t:11,i:427}, D{l:7,t:11,i:1018}, D{l:138,t:11,i:692}, D{l:4,t:11,i:195}, D{l:6,t:10,i:508}, D{l:135,t:11,i:802}, D{l:4,t:0,i:167}, D{l:135,t:0,i:82}, D{l:5,t:0,i:62}, D{l:6,t:0,i:24}, D{l:6,t:0,i:534}, D{l:7,t:0,i:74}, D{l:7,t:0,i:678}, D{l:7,t:0,i:684}, D{l:7,t:0,i:1043}, D{l:7,t:0,i:1072}, D{l:8,t:0,i:280}, D{l:8,t:0,i:541}, D{l:8,t:0,i:686}, D{l:9,t:0,i:258}, D{l:10,t:0,i:519}, D{l:11,t:0,i:252}, D{l:140,t:0,i:282}, D{l:138,t:0,i:33}, D{l:4,t:0,i:359}, D{l:133,t:11,i:738}, D{l:7,t:0,i:980}, D{l:9,t:0,i:328}, D{l:13,t:0,i:186}, D{l:13,t:0,i:364}, D{l:7,t:10,i:635}, D{l:7,t:10,i:796}, D{l:8,t:10,i:331}, D{l:9,t:10,i:330}, D{l:9,t:10,i:865}, D{l:10,t:10,i:119}, D{l:10,t:10,i:235}, D{l:11,t:10,i:111}, D{l:11,t:10,i:129}, D{l:11,t:10,i:240}, D{l:12,t:10,i:31}, D{l:12,t:10,i:66}, D{l:12,t:10,i:222}, D{l:12,t:10,i:269}, D{l:12,t:10,i:599}, D{l:12,t:10,i:684}, D{l:12,t:10,i:689}, D{l:12,t:10,i:691}, D{l:142,t:10,i:345}, D{l:137,t:10,i:527}, D{l:6,t:0,i:596}, D{l:7,t:0,i:585}, D{l:135,t:10,i:702}, D{l:134,t:11,i:1683}, D{l:133,t:0,i:211}, D{l:6,t:0,i:145}, D{l:141,t:0,i:336}, D{l:134,t:0,i:1130}, D{l:7,t:0,i:873}, D{l:6,t:10,i:37}, D{l:7,t:10,i:1666}, D{l:8,t:10,i:195}, D{l:8,t:10,i:316}, D{l:9,t:10,i:178}, D{l:9,t:10,i:276}, D{l:9,t:10,i:339}, D{l:9,t:10,i:536}, D{l:10,t:10,i:102}, D{l:10,t:10,i:362}, D{l:10,t:10,i:785}, D{l:11,t:10,i:55}, D{l:11,t:10,i:149}, D{l:11,t:10,i:773}, D{l:13,t:10,i:416}, D{l:13,t:10,i:419}, D{l:14,t:10,i:38}, D{l:14,t:10,i:41}, D{l:142,t:10,i:210}, D{l:8,t:0,i:840}, D{l:136,t:0,i:841}, D{l:132,t:0,i:263}, D{l:5,t:11,i:3}, D{l:8,t:11,i:578}, D{l:9,t:11,i:118}, D{l:10,t:11,i:705}, D{l:12,t:11,i:383}, D{l:141,t:11,i:279}, D{l:132,t:0,i:916}, D{l:133,t:11,i:229}, D{l:133,t:10,i:645}, D{l:15,t:0,i:155}, D{l:16,t:0,i:79}, D{l:8,t:11,i:102}, D{l:10,t:11,i:578}, D{l:10,t:11,i:672}, D{l:12,t:11,i:496}, D{l:13,t:11,i:408}, D{l:14,t:11,i:121}, D{l:145,t:11,i:106}, D{l:4,t:0,i:599}, D{l:5,t:0,i:592}, D{l:6,t:0,i:1634}, D{l:7,t:0,i:5}, D{l:7,t:0,i:55}, D{l:7,t:0,i:67}, D{l:7,t:0,i:97}, D{l:7,t:0,i:691}, D{l:7,t:0,i:979}, D{l:7,t:0,i:1600}, D{l:7,t:0,i:1697}, D{l:8,t:0,i:207}, D{l:8,t:0,i:214}, D{l:8,t:0,i:231}, D{l:8,t:0,i:294}, D{l:8,t:0,i:336}, D{l:8,t:0,i:428}, D{l:8,t:0,i:471}, D{l:8,t:0,i:622}, D{l:8,t:0,i:626}, D{l:8,t:0,i:679}, D{l:8,t:0,i:759}, D{l:8,t:0,i:829}, D{l:9,t:0,i:11}, D{l:9,t:0,i:246}, D{l:9,t:0,i:484}, D{l:9,t:0,i:573}, D{l:9,t:0,i:706}, D{l:9,t:0,i:762}, D{l:9,t:0,i:798}, D{l:9,t:0,i:855}, D{l:9,t:0,i:870}, D{l:9,t:0,i:912}, D{l:10,t:0,i:303}, D{l:10,t:0,i:335}, D{l:10,t:0,i:424}, D{l:10,t:0,i:461}, D{l:10,t:0,i:543}, D{l:10,t:0,i:759}, D{l:10,t:0,i:814}, D{l:11,t:0,i:59}, D{l:11,t:0,i:199}, D{l:11,t:0,i:235}, D{l:11,t:0,i:590}, D{l:11,t:0,i:631}, D{l:11,t:0,i:929}, D{l:11,t:0,i:963}, D{l:11,t:0,i:987}, D{l:12,t:0,i:114}, D{l:12,t:0,i:182}, D{l:12,t:0,i:226}, D{l:12,t:0,i:332}, D{l:12,t:0,i:439}, D{l:12,t:0,i:575}, D{l:12,t:0,i:598}, D{l:12,t:0,i:675}, D{l:13,t:0,i:8}, D{l:13,t:0,i:125}, D{l:13,t:0,i:194}, D{l:13,t:0,i:287}, D{l:14,t:0,i:197}, D{l:14,t:0,i:383}, D{l:15,t:0,i:53}, D{l:17,t:0,i:63}, D{l:19,t:0,i:46}, D{l:19,t:0,i:98}, D{l:19,t:0,i:106}, D{l:148,t:0,i:85}, D{l:7,t:0,i:1356}, D{l:132,t:10,i:290}, D{l:6,t:10,i:70}, D{l:7,t:10,i:1292}, D{l:10,t:10,i:762}, D{l:139,t:10,i:288}, D{l:150,t:11,i:55}, D{l:4,t:0,i:593}, D{l:8,t:11,i:115}, D{l:8,t:11,i:350}, D{l:9,t:11,i:489}, D{l:10,t:11,i:128}, D{l:11,t:11,i:306}, D{l:12,t:11,i:373}, D{l:14,t:11,i:30}, D{l:17,t:11,i:79}, D{l:147,t:11,i:80}, D{l:135,t:11,i:1235}, D{l:134,t:0,i:1392}, D{l:4,t:11,i:230}, D{l:133,t:11,i:702}, D{l:147,t:0,i:126}, D{l:7,t:10,i:131}, D{l:7,t:10,i:422}, D{l:8,t:10,i:210}, D{l:140,t:10,i:573}, D{l:134,t:0,i:1179}, D{l:139,t:11,i:435}, D{l:139,t:10,i:797}, D{l:134,t:11,i:1728}, D{l:4,t:0,i:162}, D{l:18,t:11,i:26}, D{l:19,t:11,i:42}, D{l:20,t:11,i:43}, D{l:21,t:11,i:0}, D{l:23,t:11,i:27}, D{l:152,t:11,i:14}, D{l:132,t:10,i:936}, D{l:6,t:0,i:765}, D{l:5,t:10,i:453}, D{l:134,t:10,i:441}, D{l:133,t:0,i:187}, D{l:135,t:0,i:1286}, D{l:6,t:0,i:635}, D{l:6,t:0,i:904}, D{l:6,t:0,i:1210}, D{l:134,t:0,i:1489}, D{l:4,t:0,i:215}, D{l:8,t:0,i:890}, D{l:9,t:0,i:38}, D{l:10,t:0,i:923}, D{l:11,t:0,i:23}, D{l:11,t:0,i:127}, D{l:139,t:0,i:796}, D{l:6,t:0,i:1165}, D{l:134,t:0,i:1306}, D{l:7,t:0,i:716}, D{l:13,t:0,i:97}, D{l:141,t:0,i:251}, D{l:132,t:10,i:653}, D{l:136,t:0,i:657}, D{l:146,t:10,i:80}, D{l:5,t:11,i:622}, D{l:7,t:11,i:1032}, D{l:11,t:11,i:26}, D{l:11,t:11,i:213}, D{l:11,t:11,i:707}, D{l:12,t:11,i:380}, D{l:13,t:11,i:226}, D{l:141,t:11,i:355}, D{l:6,t:0,i:299}, D{l:5,t:11,i:70}, D{l:6,t:11,i:334}, D{l:9,t:11,i:171}, D{l:11,t:11,i:637}, D{l:12,t:11,i:202}, D{l:14,t:11,i:222}, D{l:145,t:11,i:42}, D{l:142,t:0,i:134}, D{l:4,t:11,i:23}, D{l:5,t:11,i:313}, D{l:5,t:11,i:1014}, D{l:6,t:11,i:50}, D{l:6,t:11,i:51}, D{l:7,t:11,i:142}, D{l:7,t:11,i:384}, D{l:9,t:11,i:783}, D{l:139,t:11,i:741}, D{l:4,t:11,i:141}, D{l:7,t:11,i:559}, D{l:8,t:11,i:640}, D{l:9,t:11,i:460}, D{l:12,t:11,i:183}, D{l:141,t:11,i:488}, D{l:136,t:11,i:614}, D{l:7,t:10,i:1368}, D{l:8,t:10,i:232}, D{l:8,t:10,i:361}, D{l:10,t:10,i:682}, D{l:138,t:10,i:742}, D{l:137,t:10,i:534}, D{l:6,t:0,i:1082}, D{l:140,t:0,i:658}, D{l:137,t:10,i:27}, D{l:135,t:0,i:2002}, D{l:142,t:10,i:12}, D{l:4,t:0,i:28}, D{l:5,t:0,i:440}, D{l:7,t:0,i:248}, D{l:11,t:0,i:833}, D{l:140,t:0,i:344}, D{l:7,t:10,i:736}, D{l:139,t:10,i:264}, D{l:134,t:10,i:1657}, D{l:134,t:0,i:1654}, D{l:138,t:0,i:531}, D{l:5,t:11,i:222}, D{l:9,t:11,i:140}, D{l:138,t:11,i:534}, D{l:6,t:0,i:634}, D{l:6,t:0,i:798}, D{l:134,t:0,i:840}, D{l:138,t:11,i:503}, D{l:135,t:10,i:127}, D{l:133,t:0,i:853}, D{l:5,t:11,i:154}, D{l:7,t:11,i:1491}, D{l:10,t:11,i:379}, D{l:138,t:11,i:485}, D{l:6,t:0,i:249}, D{l:7,t:0,i:1234}, D{l:139,t:0,i:573}, D{l:133,t:11,i:716}, D{l:7,t:11,i:1570}, D{l:140,t:11,i:542}, D{l:136,t:10,i:364}, D{l:138,t:0,i:527}, D{l:4,t:11,i:91}, D{l:5,t:11,i:388}, D{l:5,t:11,i:845}, D{l:6,t:11,i:206}, D{l:6,t:11,i:252}, D{l:6,t:11,i:365}, D{l:7,t:11,i:136}, D{l:7,t:11,i:531}, D{l:8,t:11,i:264}, D{l:136,t:11,i:621}, D{l:134,t:0,i:1419}, D{l:135,t:11,i:1441}, D{l:7,t:0,i:49}, D{l:7,t:0,i:392}, D{l:8,t:0,i:20}, D{l:8,t:0,i:172}, D{l:8,t:0,i:690}, D{l:9,t:0,i:383}, D{l:9,t:0,i:845}, D{l:10,t:0,i:48}, D{l:11,t:0,i:293}, D{l:11,t:0,i:832}, D{l:11,t:0,i:920}, D{l:11,t:0,i:984}, D{l:141,t:0,i:221}, D{l:5,t:0,i:858}, D{l:133,t:0,i:992}, D{l:5,t:0,i:728}, D{l:137,t:10,i:792}, D{l:5,t:10,i:909}, D{l:9,t:10,i:849}, D{l:138,t:10,i:805}, D{l:7,t:0,i:525}, D{l:7,t:0,i:1579}, D{l:8,t:0,i:497}, D{l:136,t:0,i:573}, D{l:6,t:0,i:268}, D{l:137,t:0,i:62}, D{l:135,t:11,i:576}, D{l:134,t:0,i:1201}, D{l:5,t:11,i:771}, D{l:5,t:11,i:863}, D{l:5,t:11,i:898}, D{l:6,t:11,i:1632}, D{l:6,t:11,i:1644}, D{l:134,t:11,i:1780}, D{l:133,t:11,i:331}, D{l:7,t:0,i:193}, D{l:7,t:0,i:1105}, D{l:10,t:0,i:495}, D{l:7,t:10,i:397}, D{l:8,t:10,i:124}, D{l:8,t:10,i:619}, D{l:9,t:10,i:305}, D{l:11,t:10,i:40}, D{l:12,t:10,i:349}, D{l:13,t:10,i:134}, D{l:13,t:10,i:295}, D{l:14,t:10,i:155}, D{l:15,t:10,i:120}, D{l:146,t:10,i:105}, D{l:138,t:0,i:106}, D{l:6,t:0,i:859}, D{l:5,t:11,i:107}, D{l:7,t:11,i:201}, D{l:136,t:11,i:518}, D{l:6,t:11,i:446}, D{l:135,t:11,i:1817}, D{l:13,t:0,i:23}, D{l:4,t:10,i:262}, D{l:135,t:10,i:342}, D{l:133,t:10,i:641}, D{l:137,t:11,i:851}, D{l:6,t:0,i:925}, D{l:137,t:0,i:813}, D{l:132,t:11,i:504}, D{l:6,t:0,i:613}, D{l:136,t:0,i:223}, D{l:4,t:10,i:99}, D{l:6,t:10,i:250}, D{l:6,t:10,i:346}, D{l:8,t:10,i:127}, D{l:138,t:10,i:81}, D{l:136,t:0,i:953}, D{l:132,t:10,i:915}, D{l:139,t:11,i:892}, D{l:5,t:10,i:75}, D{l:9,t:10,i:517}, D{l:10,t:10,i:470}, D{l:12,t:10,i:155}, D{l:141,t:10,i:224}, D{l:4,t:0,i:666}, D{l:7,t:0,i:1017}, D{l:7,t:11,i:996}, D{l:138,t:11,i:390}, D{l:5,t:11,i:883}, D{l:133,t:11,i:975}, D{l:14,t:10,i:83}, D{l:142,t:11,i:83}, D{l:4,t:0,i:670}, D{l:5,t:11,i:922}, D{l:134,t:11,i:1707}, D{l:135,t:0,i:216}, D{l:9,t:0,i:40}, D{l:11,t:0,i:136}, D{l:135,t:11,i:787}, D{l:5,t:10,i:954}, D{l:5,t:11,i:993}, D{l:7,t:11,i:515}, D{l:137,t:11,i:91}, D{l:139,t:0,i:259}, D{l:7,t:0,i:1114}, D{l:9,t:0,i:310}, D{l:9,t:0,i:682}, D{l:10,t:0,i:440}, D{l:13,t:0,i:40}, D{l:6,t:10,i:304}, D{l:8,t:10,i:418}, D{l:11,t:10,i:341}, D{l:139,t:10,i:675}, D{l:14,t:0,i:296}, D{l:9,t:10,i:410}, D{l:139,t:10,i:425}, D{l:10,t:11,i:377}, D{l:12,t:11,i:363}, D{l:13,t:11,i:68}, D{l:13,t:11,i:94}, D{l:14,t:11,i:108}, D{l:142,t:11,i:306}, D{l:7,t:0,i:1401}, D{l:135,t:0,i:1476}, D{l:4,t:0,i:296}, D{l:6,t:0,i:475}, D{l:7,t:0,i:401}, D{l:7,t:0,i:1410}, D{l:7,t:0,i:1594}, D{l:7,t:0,i:1674}, D{l:8,t:0,i:63}, D{l:8,t:0,i:660}, D{l:137,t:0,i:74}, D{l:4,t:0,i:139}, D{l:4,t:0,i:388}, D{l:140,t:0,i:188}, D{l:132,t:0,i:797}, D{l:132,t:11,i:766}, D{l:5,t:11,i:103}, D{l:7,t:11,i:921}, D{l:8,t:11,i:580}, D{l:8,t:11,i:593}, D{l:8,t:11,i:630}, D{l:138,t:11,i:28}, D{l:4,t:11,i:911}, D{l:5,t:11,i:867}, D{l:133,t:11,i:1013}, D{l:134,t:10,i:14}, D{l:134,t:0,i:1572}, D{l:134,t:10,i:1708}, D{l:21,t:0,i:39}, D{l:5,t:10,i:113}, D{l:6,t:10,i:243}, D{l:7,t:10,i:1865}, D{l:11,t:10,i:161}, D{l:16,t:10,i:37}, D{l:145,t:10,i:99}, D{l:7,t:11,i:1563}, D{l:141,t:11,i:182}, D{l:5,t:11,i:135}, D{l:6,t:11,i:519}, D{l:7,t:11,i:1722}, D{l:10,t:11,i:271}, D{l:11,t:11,i:261}, D{l:145,t:11,i:54}, D{l:132,t:10,i:274}, D{l:134,t:0,i:1594}, D{l:4,t:11,i:300}, D{l:5,t:11,i:436}, D{l:135,t:11,i:484}, D{l:4,t:0,i:747}, D{l:6,t:0,i:290}, D{l:7,t:0,i:649}, D{l:7,t:0,i:1479}, D{l:135,t:0,i:1583}, D{l:133,t:11,i:535}, D{l:147,t:11,i:82}, D{l:133,t:0,i:232}, D{l:137,t:0,i:887}, D{l:135,t:10,i:166}, D{l:136,t:0,i:521}, D{l:4,t:0,i:14}, D{l:7,t:0,i:472}, D{l:7,t:0,i:1801}, D{l:10,t:0,i:748}, D{l:141,t:0,i:458}, D{l:134,t:0,i:741}, D{l:134,t:0,i:992}, D{l:16,t:0,i:111}, D{l:137,t:10,i:304}, D{l:4,t:0,i:425}, D{l:5,t:11,i:387}, D{l:7,t:11,i:557}, D{l:12,t:11,i:547}, D{l:142,t:11,i:86}, D{l:135,t:11,i:1747}, D{l:5,t:10,i:654}, D{l:135,t:11,i:1489}, D{l:7,t:0,i:789}, D{l:4,t:11,i:6}, D{l:5,t:11,i:708}, D{l:136,t:11,i:75}, D{l:6,t:10,i:273}, D{l:10,t:10,i:188}, D{l:13,t:10,i:377}, D{l:146,t:10,i:77}, D{l:6,t:0,i:1593}, D{l:4,t:11,i:303}, D{l:7,t:11,i:619}, D{l:10,t:11,i:547}, D{l:10,t:11,i:687}, D{l:11,t:11,i:122}, D{l:140,t:11,i:601}, D{l:134,t:0,i:1768}, D{l:135,t:10,i:410}, D{l:138,t:11,i:772}, D{l:11,t:0,i:233}, D{l:139,t:10,i:524}, D{l:5,t:0,i:943}, D{l:134,t:0,i:1779}, D{l:134,t:10,i:1785}, D{l:136,t:11,i:529}, D{l:132,t:0,i:955}, D{l:5,t:0,i:245}, D{l:6,t:0,i:576}, D{l:7,t:0,i:582}, D{l:136,t:0,i:225}, D{l:132,t:10,i:780}, D{l:142,t:0,i:241}, D{l:134,t:0,i:1943}, D{l:4,t:11,i:106}, D{l:7,t:11,i:310}, D{l:7,t:11,i:1785}, D{l:10,t:11,i:690}, D{l:139,t:11,i:717}, D{l:134,t:0,i:1284}, D{l:5,t:11,i:890}, D{l:133,t:11,i:988}, D{l:6,t:11,i:626}, D{l:142,t:11,i:431}, D{l:10,t:11,i:706}, D{l:145,t:11,i:32}, D{l:137,t:11,i:332}, D{l:132,t:11,i:698}, D{l:135,t:0,i:709}, D{l:5,t:10,i:948}, D{l:138,t:11,i:17}, D{l:136,t:0,i:554}, D{l:134,t:0,i:1564}, D{l:139,t:10,i:941}, D{l:132,t:0,i:443}, D{l:134,t:0,i:909}, D{l:134,t:11,i:84}, D{l:142,t:0,i:280}, D{l:4,t:10,i:532}, D{l:5,t:10,i:706}, D{l:135,t:10,i:662}, D{l:132,t:0,i:729}, D{l:5,t:10,i:837}, D{l:6,t:10,i:1651}, D{l:139,t:10,i:985}, D{l:135,t:10,i:1861}, D{l:4,t:0,i:348}, D{l:152,t:11,i:3}, D{l:5,t:11,i:986}, D{l:6,t:11,i:130}, D{l:7,t:11,i:1582}, D{l:8,t:11,i:458}, D{l:10,t:11,i:101}, D{l:10,t:11,i:318}, D{l:138,t:11,i:823}, D{l:134,t:0,i:758}, D{l:4,t:0,i:298}, D{l:137,t:0,i:848}, D{l:4,t:10,i:330}, D{l:7,t:10,i:933}, D{l:7,t:10,i:2012}, D{l:136,t:10,i:292}, D{l:7,t:11,i:1644}, D{l:137,t:11,i:129}, D{l:6,t:0,i:1422}, D{l:9,t:0,i:829}, D{l:135,t:10,i:767}, D{l:5,t:0,i:164}, D{l:7,t:0,i:121}, D{l:142,t:0,i:189}, D{l:7,t:0,i:812}, D{l:7,t:0,i:1261}, D{l:7,t:0,i:1360}, D{l:9,t:0,i:632}, D{l:140,t:0,i:352}, D{l:135,t:11,i:1788}, D{l:139,t:0,i:556}, D{l:135,t:11,i:997}, D{l:145,t:10,i:114}, D{l:4,t:0,i:172}, D{l:9,t:0,i:611}, D{l:10,t:0,i:436}, D{l:12,t:0,i:673}, D{l:13,t:0,i:255}, D{l:137,t:10,i:883}, D{l:11,t:0,i:530}, D{l:138,t:10,i:274}, D{l:133,t:0,i:844}, D{l:134,t:0,i:984}, D{l:13,t:0,i:232}, D{l:18,t:0,i:35}, D{l:4,t:10,i:703}, D{l:135,t:10,i:207}, D{l:132,t:10,i:571}, D{l:9,t:0,i:263}, D{l:10,t:0,i:147}, D{l:138,t:0,i:492}, D{l:7,t:11,i:1756}, D{l:137,t:11,i:98}, D{l:5,t:10,i:873}, D{l:5,t:10,i:960}, D{l:8,t:10,i:823}, D{l:137,t:10,i:881}, D{l:133,t:0,i:537}, D{l:132,t:0,i:859}, D{l:7,t:11,i:1046}, D{l:139,t:11,i:160}, D{l:137,t:0,i:842}, D{l:139,t:10,i:283}, D{l:5,t:10,i:33}, D{l:6,t:10,i:470}, D{l:139,t:10,i:424}, D{l:6,t:11,i:45}, D{l:7,t:11,i:433}, D{l:8,t:11,i:129}, D{l:9,t:11,i:21}, D{l:10,t:11,i:392}, D{l:11,t:11,i:79}, D{l:12,t:11,i:499}, D{l:13,t:11,i:199}, D{l:141,t:11,i:451}, D{l:135,t:0,i:1291}, D{l:135,t:10,i:1882}, D{l:7,t:11,i:558}, D{l:136,t:11,i:353}, D{l:134,t:0,i:1482}, D{l:5,t:0,i:230}, D{l:5,t:0,i:392}, D{l:6,t:0,i:420}, D{l:9,t:0,i:568}, D{l:140,t:0,i:612}, D{l:6,t:0,i:262}, D{l:7,t:10,i:90}, D{l:7,t:10,i:664}, D{l:7,t:10,i:830}, D{l:7,t:10,i:1380}, D{l:7,t:10,i:2025}, D{l:8,t:11,i:81}, D{l:8,t:10,i:448}, D{l:8,t:10,i:828}, D{l:9,t:11,i:189}, D{l:9,t:11,i:201}, D{l:11,t:11,i:478}, D{l:11,t:11,i:712}, D{l:141,t:11,i:338}, D{l:142,t:0,i:31}, D{l:5,t:11,i:353}, D{l:151,t:11,i:26}, D{l:132,t:0,i:753}, D{l:4,t:0,i:0}, D{l:5,t:0,i:41}, D{l:7,t:0,i:1459}, D{l:7,t:0,i:1469}, D{l:7,t:0,i:1859}, D{l:9,t:0,i:549}, D{l:139,t:0,i:905}, D{l:9,t:10,i:417}, D{l:137,t:10,i:493}, D{l:135,t:11,i:1113}, D{l:133,t:0,i:696}, D{l:141,t:11,i:448}, D{l:134,t:10,i:295}, D{l:132,t:0,i:834}, D{l:4,t:0,i:771}, D{l:5,t:10,i:1019}, D{l:6,t:11,i:25}, D{l:7,t:11,i:855}, D{l:7,t:11,i:1258}, D{l:144,t:11,i:32}, D{l:134,t:0,i:1076}, D{l:133,t:0,i:921}, D{l:133,t:0,i:674}, D{l:4,t:11,i:4}, D{l:7,t:11,i:1118}, D{l:7,t:11,i:1320}, D{l:7,t:11,i:1706}, D{l:8,t:11,i:277}, D{l:9,t:11,i:622}, D{l:10,t:11,i:9}, D{l:11,t:11,i:724}, D{l:12,t:11,i:350}, D{l:12,t:11,i:397}, D{l:13,t:11,i:28}, D{l:13,t:11,i:159}, D{l:15,t:11,i:89}, D{l:18,t:11,i:5}, D{l:19,t:11,i:9}, D{l:20,t:11,i:34}, D{l:150,t:11,i:47}, D{l:134,t:10,i:208}, D{l:6,t:0,i:444}, D{l:136,t:0,i:308}, D{l:6,t:0,i:180}, D{l:7,t:0,i:1137}, D{l:8,t:0,i:751}, D{l:139,t:0,i:805}, D{l:4,t:0,i:183}, D{l:7,t:0,i:271}, D{l:11,t:0,i:824}, D{l:11,t:0,i:952}, D{l:13,t:0,i:278}, D{l:13,t:0,i:339}, D{l:13,t:0,i:482}, D{l:14,t:0,i:424}, D{l:148,t:0,i:99}, D{l:7,t:11,i:317}, D{l:135,t:11,i:569}, D{l:4,t:0,i:19}, D{l:5,t:0,i:477}, D{l:5,t:0,i:596}, D{l:6,t:0,i:505}, D{l:7,t:0,i:1221}, D{l:11,t:0,i:907}, D{l:12,t:0,i:209}, D{l:141,t:0,i:214}, D{l:135,t:0,i:1215}, D{l:6,t:0,i:271}, D{l:7,t:0,i:398}, D{l:8,t:0,i:387}, D{l:10,t:0,i:344}, D{l:7,t:10,i:448}, D{l:7,t:10,i:1629}, D{l:7,t:10,i:1813}, D{l:8,t:10,i:442}, D{l:9,t:10,i:710}, D{l:10,t:10,i:282}, D{l:138,t:10,i:722}, D{l:11,t:10,i:844}, D{l:12,t:10,i:104}, D{l:140,t:10,i:625}, D{l:134,t:11,i:255}, D{l:133,t:10,i:787}, D{l:134,t:0,i:1645}, D{l:11,t:11,i:956}, D{l:151,t:11,i:3}, D{l:6,t:0,i:92}, D{l:6,t:0,i:188}, D{l:7,t:0,i:209}, D{l:7,t:0,i:1269}, D{l:7,t:0,i:1524}, D{l:7,t:0,i:1876}, D{l:8,t:0,i:661}, D{l:10,t:0,i:42}, D{l:10,t:0,i:228}, D{l:11,t:0,i:58}, D{l:11,t:0,i:1020}, D{l:12,t:0,i:58}, D{l:12,t:0,i:118}, D{l:141,t:0,i:32}, D{l:4,t:0,i:459}, D{l:133,t:0,i:966}, D{l:4,t:11,i:536}, D{l:7,t:11,i:1141}, D{l:10,t:11,i:723}, D{l:139,t:11,i:371}, D{l:140,t:0,i:330}, D{l:134,t:0,i:1557}, D{l:7,t:11,i:285}, D{l:135,t:11,i:876}, D{l:136,t:10,i:491}, D{l:135,t:11,i:560}, D{l:6,t:0,i:18}, D{l:7,t:0,i:179}, D{l:7,t:0,i:932}, D{l:8,t:0,i:548}, D{l:8,t:0,i:757}, D{l:9,t:0,i:54}, D{l:9,t:0,i:65}, D{l:9,t:0,i:532}, D{l:9,t:0,i:844}, D{l:10,t:0,i:113}, D{l:10,t:0,i:117}, D{l:10,t:0,i:315}, D{l:10,t:0,i:560}, D{l:10,t:0,i:622}, D{l:10,t:0,i:798}, D{l:11,t:0,i:153}, D{l:11,t:0,i:351}, D{l:11,t:0,i:375}, D{l:12,t:0,i:78}, D{l:12,t:0,i:151}, D{l:12,t:0,i:392}, D{l:12,t:0,i:666}, D{l:14,t:0,i:248}, D{l:143,t:0,i:23}, D{l:6,t:0,i:1742}, D{l:132,t:11,i:690}, D{l:4,t:10,i:403}, D{l:5,t:10,i:441}, D{l:7,t:10,i:450}, D{l:10,t:10,i:840}, D{l:11,t:10,i:101}, D{l:12,t:10,i:193}, D{l:141,t:10,i:430}, D{l:133,t:0,i:965}, D{l:134,t:0,i:182}, D{l:10,t:0,i:65}, D{l:10,t:0,i:488}, D{l:138,t:0,i:497}, D{l:135,t:11,i:1346}, D{l:6,t:0,i:973}, D{l:6,t:0,i:1158}, D{l:10,t:11,i:200}, D{l:19,t:11,i:2}, D{l:151,t:11,i:22}, D{l:4,t:11,i:190}, D{l:133,t:11,i:554}, D{l:133,t:10,i:679}, D{l:7,t:0,i:328}, D{l:137,t:10,i:326}, D{l:133,t:11,i:1001}, D{l:9,t:0,i:588}, D{l:138,t:0,i:260}, D{l:133,t:11,i:446}, D{l:135,t:10,i:1128}, D{l:135,t:10,i:1796}, D{l:147,t:11,i:119}, D{l:134,t:0,i:1786}, D{l:6,t:0,i:1328}, D{l:6,t:0,i:1985}, D{l:8,t:0,i:962}, D{l:138,t:0,i:1017}, D{l:135,t:0,i:308}, D{l:11,t:0,i:508}, D{l:4,t:10,i:574}, D{l:7,t:10,i:350}, D{l:7,t:10,i:1024}, D{l:8,t:10,i:338}, D{l:9,t:10,i:677}, D{l:138,t:10,i:808}, D{l:138,t:11,i:752}, D{l:135,t:10,i:1081}, D{l:137,t:11,i:96}, D{l:7,t:10,i:1676}, D{l:135,t:10,i:2037}, D{l:136,t:0,i:588}, D{l:132,t:11,i:304}, D{l:133,t:0,i:614}, D{l:140,t:0,i:793}, D{l:136,t:0,i:287}, D{l:137,t:10,i:297}, D{l:141,t:10,i:37}, D{l:6,t:11,i:53}, D{l:6,t:11,i:199}, D{l:7,t:11,i:1408}, D{l:8,t:11,i:32}, D{l:8,t:11,i:93}, D{l:9,t:11,i:437}, D{l:10,t:11,i:397}, D{l:10,t:11,i:629}, D{l:11,t:11,i:593}, D{l:11,t:11,i:763}, D{l:13,t:11,i:326}, D{l:145,t:11,i:35}, D{l:134,t:11,i:105}, D{l:9,t:11,i:320}, D{l:10,t:11,i:506}, D{l:138,t:11,i:794}, D{l:5,t:11,i:114}, D{l:5,t:11,i:255}, D{l:141,t:11,i:285}, D{l:140,t:0,i:290}, D{l:7,t:11,i:2035}, D{l:8,t:11,i:19}, D{l:9,t:11,i:89}, D{l:138,t:11,i:831}, D{l:134,t:0,i:1136}, D{l:7,t:0,i:719}, D{l:8,t:0,i:796}, D{l:8,t:0,i:809}, D{l:8,t:0,i:834}, D{l:6,t:10,i:306}, D{l:7,t:10,i:1140}, D{l:7,t:10,i:1340}, D{l:8,t:10,i:133}, D{l:138,t:10,i:449}, D{l:139,t:10,i:1011}, D{l:5,t:0,i:210}, D{l:6,t:0,i:213}, D{l:7,t:0,i:60}, D{l:10,t:0,i:364}, D{l:139,t:0,i:135}, D{l:5,t:0,i:607}, D{l:8,t:0,i:326}, D{l:136,t:0,i:490}, D{l:138,t:11,i:176}, D{l:132,t:0,i:701}, D{l:5,t:0,i:472}, D{l:7,t:0,i:380}, D{l:137,t:0,i:758}, D{l:135,t:0,i:1947}, D{l:6,t:0,i:1079}, D{l:138,t:0,i:278}, D{l:138,t:11,i:391}, D{l:5,t:10,i:329}, D{l:8,t:10,i:260}, D{l:139,t:11,i:156}, D{l:4,t:0,i:386}, D{l:7,t:0,i:41}, D{l:8,t:0,i:405}, D{l:8,t:0,i:728}, D{l:9,t:0,i:497}, D{l:11,t:0,i:110}, D{l:11,t:0,i:360}, D{l:15,t:0,i:37}, D{l:144,t:0,i:84}, D{l:5,t:0,i:46}, D{l:7,t:0,i:1452}, D{l:7,t:0,i:1480}, D{l:8,t:0,i:634}, D{l:140,t:0,i:472}, D{l:136,t:0,i:961}, D{l:4,t:0,i:524}, D{l:136,t:0,i:810}, D{l:10,t:0,i:238}, D{l:141,t:0,i:33}, D{l:132,t:10,i:657}, D{l:152,t:10,i:7}, D{l:133,t:0,i:532}, D{l:5,t:0,i:997}, D{l:135,t:10,i:1665}, D{l:7,t:11,i:594}, D{l:7,t:11,i:851}, D{l:7,t:11,i:1858}, D{l:9,t:11,i:411}, D{l:9,t:11,i:574}, D{l:9,t:11,i:666}, D{l:9,t:11,i:737}, D{l:10,t:11,i:346}, D{l:10,t:11,i:712}, D{l:11,t:11,i:246}, D{l:11,t:11,i:432}, D{l:11,t:11,i:517}, D{l:11,t:11,i:647}, D{l:11,t:11,i:679}, D{l:11,t:11,i:727}, D{l:12,t:11,i:304}, D{l:12,t:11,i:305}, D{l:12,t:11,i:323}, D{l:12,t:11,i:483}, D{l:12,t:11,i:572}, D{l:12,t:11,i:593}, D{l:12,t:11,i:602}, D{l:13,t:11,i:95}, D{l:13,t:11,i:101}, D{l:13,t:11,i:171}, D{l:13,t:11,i:315}, D{l:13,t:11,i:378}, D{l:13,t:11,i:425}, D{l:13,t:11,i:475}, D{l:14,t:11,i:63}, D{l:14,t:11,i:380}, D{l:14,t:11,i:384}, D{l:15,t:11,i:133}, D{l:18,t:11,i:112}, D{l:148,t:11,i:72}, D{l:5,t:11,i:955}, D{l:136,t:11,i:814}, D{l:134,t:0,i:1301}, D{l:5,t:10,i:66}, D{l:7,t:10,i:1896}, D{l:136,t:10,i:288}, D{l:133,t:11,i:56}, D{l:134,t:10,i:1643}, D{l:6,t:0,i:1298}, D{l:148,t:11,i:100}, D{l:5,t:0,i:782}, D{l:5,t:0,i:829}, D{l:6,t:0,i:671}, D{l:6,t:0,i:1156}, D{l:6,t:0,i:1738}, D{l:137,t:11,i:621}, D{l:4,t:0,i:306}, D{l:5,t:0,i:570}, D{l:7,t:0,i:1347}, D{l:5,t:10,i:91}, D{l:5,t:10,i:648}, D{l:5,t:10,i:750}, D{l:5,t:10,i:781}, D{l:6,t:10,i:54}, D{l:6,t:10,i:112}, D{l:6,t:10,i:402}, D{l:6,t:10,i:1732}, D{l:7,t:10,i:315}, D{l:7,t:10,i:749}, D{l:7,t:10,i:1900}, D{l:9,t:10,i:78}, D{l:9,t:10,i:508}, D{l:10,t:10,i:611}, D{l:10,t:10,i:811}, D{l:11,t:10,i:510}, D{l:11,t:10,i:728}, D{l:13,t:10,i:36}, D{l:14,t:10,i:39}, D{l:16,t:10,i:83}, D{l:17,t:10,i:124}, D{l:148,t:10,i:30}, D{l:8,t:10,i:570}, D{l:9,t:11,i:477}, D{l:141,t:11,i:78}, D{l:4,t:11,i:639}, D{l:10,t:11,i:4}, D{l:10,t:10,i:322}, D{l:10,t:10,i:719}, D{l:11,t:10,i:407}, D{l:11,t:11,i:638}, D{l:12,t:11,i:177}, D{l:148,t:11,i:57}, D{l:7,t:0,i:1823}, D{l:139,t:0,i:693}, D{l:7,t:0,i:759}, D{l:5,t:11,i:758}, D{l:8,t:10,i:125}, D{l:8,t:10,i:369}, D{l:8,t:10,i:524}, D{l:10,t:10,i:486}, D{l:11,t:10,i:13}, D{l:11,t:10,i:381}, D{l:11,t:10,i:736}, D{l:11,t:10,i:766}, D{l:11,t:10,i:845}, D{l:13,t:10,i:114}, D{l:13,t:10,i:292}, D{l:142,t:10,i:47}, D{l:7,t:0,i:1932}, D{l:6,t:10,i:1684}, D{l:6,t:10,i:1731}, D{l:7,t:10,i:356}, D{l:8,t:10,i:54}, D{l:8,t:10,i:221}, D{l:9,t:10,i:225}, D{l:9,t:10,i:356}, D{l:10,t:10,i:77}, D{l:10,t:10,i:446}, D{l:10,t:10,i:731}, D{l:12,t:10,i:404}, D{l:141,t:10,i:491}, D{l:135,t:11,i:552}, D{l:135,t:11,i:1112}, D{l:4,t:0,i:78}, D{l:5,t:0,i:96}, D{l:5,t:0,i:182}, D{l:6,t:0,i:1257}, D{l:7,t:0,i:1724}, D{l:7,t:0,i:1825}, D{l:10,t:0,i:394}, D{l:10,t:0,i:471}, D{l:11,t:0,i:532}, D{l:14,t:0,i:340}, D{l:145,t:0,i:88}, D{l:139,t:11,i:328}, D{l:135,t:0,i:1964}, D{l:132,t:10,i:411}, D{l:4,t:10,i:80}, D{l:5,t:10,i:44}, D{l:137,t:11,i:133}, D{l:5,t:11,i:110}, D{l:6,t:11,i:169}, D{l:6,t:11,i:1702}, D{l:7,t:11,i:400}, D{l:8,t:11,i:538}, D{l:9,t:11,i:184}, D{l:9,t:11,i:524}, D{l:140,t:11,i:218}, D{l:4,t:0,i:521}, D{l:5,t:10,i:299}, D{l:7,t:10,i:1083}, D{l:140,t:11,i:554}, D{l:6,t:11,i:133}, D{l:9,t:11,i:353}, D{l:12,t:11,i:628}, D{l:146,t:11,i:79}, D{l:6,t:0,i:215}, D{l:7,t:0,i:584}, D{l:7,t:0,i:1028}, D{l:7,t:0,i:1473}, D{l:7,t:0,i:1721}, D{l:9,t:0,i:424}, D{l:138,t:0,i:779}, D{l:7,t:0,i:857}, D{l:7,t:0,i:1209}, D{l:7,t:10,i:1713}, D{l:9,t:10,i:537}, D{l:10,t:10,i:165}, D{l:12,t:10,i:219}, D{l:140,t:10,i:561}, D{l:4,t:10,i:219}, D{l:6,t:11,i:93}, D{l:7,t:11,i:1422}, D{l:7,t:10,i:1761}, D{l:7,t:11,i:1851}, D{l:8,t:11,i:673}, D{l:9,t:10,i:86}, D{l:9,t:11,i:529}, D{l:140,t:11,i:43}, D{l:137,t:11,i:371}, D{l:136,t:0,i:671}, D{l:5,t:0,i:328}, D{l:135,t:0,i:918}, D{l:132,t:0,i:529}, D{l:9,t:11,i:25}, D{l:10,t:11,i:467}, D{l:138,t:11,i:559}, D{l:4,t:11,i:335}, D{l:135,t:11,i:942}, D{l:134,t:0,i:716}, D{l:134,t:0,i:1509}, D{l:6,t:0,i:67}, D{l:7,t:0,i:258}, D{l:7,t:0,i:1630}, D{l:9,t:0,i:354}, D{l:9,t:0,i:675}, D{l:10,t:0,i:830}, D{l:14,t:0,i:80}, D{l:17,t:0,i:80}, D{l:140,t:10,i:428}, D{l:134,t:0,i:1112}, D{l:6,t:0,i:141}, D{l:7,t:0,i:225}, D{l:9,t:0,i:59}, D{l:9,t:0,i:607}, D{l:10,t:0,i:312}, D{l:11,t:0,i:687}, D{l:12,t:0,i:555}, D{l:13,t:0,i:373}, D{l:13,t:0,i:494}, D{l:148,t:0,i:58}, D{l:133,t:10,i:514}, D{l:8,t:11,i:39}, D{l:10,t:11,i:773}, D{l:11,t:11,i:84}, D{l:12,t:11,i:205}, D{l:142,t:11,i:1}, D{l:8,t:0,i:783}, D{l:5,t:11,i:601}, D{l:133,t:11,i:870}, D{l:136,t:11,i:594}, D{l:4,t:10,i:55}, D{l:5,t:10,i:301}, D{l:6,t:10,i:571}, D{l:14,t:10,i:49}, D{l:146,t:10,i:102}, D{l:132,t:11,i:181}, D{l:134,t:11,i:1652}, D{l:133,t:10,i:364}, D{l:4,t:11,i:97}, D{l:5,t:11,i:147}, D{l:6,t:11,i:286}, D{l:7,t:11,i:1362}, D{l:141,t:11,i:176}, D{l:4,t:10,i:76}, D{l:7,t:10,i:1550}, D{l:9,t:10,i:306}, D{l:9,t:10,i:430}, D{l:9,t:10,i:663}, D{l:10,t:10,i:683}, D{l:11,t:10,i:427}, D{l:11,t:10,i:753}, D{l:12,t:10,i:334}, D{l:12,t:10,i:442}, D{l:14,t:10,i:258}, D{l:14,t:10,i:366}, D{l:143,t:10,i:131}, D{l:137,t:10,i:52}, D{l:6,t:0,i:955}, D{l:134,t:0,i:1498}, D{l:6,t:11,i:375}, D{l:7,t:11,i:169}, D{l:7,t:11,i:254}, D{l:136,t:11,i:780}, D{l:7,t:0,i:430}, D{l:11,t:0,i:46}, D{l:14,t:0,i:343}, D{l:142,t:11,i:343}, D{l:135,t:0,i:1183}, D{l:5,t:0,i:602}, D{l:7,t:0,i:2018}, D{l:9,t:0,i:418}, D{l:9,t:0,i:803}, D{l:135,t:11,i:1447}, D{l:8,t:0,i:677}, D{l:135,t:11,i:1044}, D{l:139,t:11,i:285}, D{l:4,t:10,i:656}, D{l:135,t:10,i:779}, D{l:135,t:10,i:144}, D{l:5,t:11,i:629}, D{l:135,t:11,i:1549}, D{l:135,t:10,i:1373}, D{l:138,t:11,i:209}, D{l:7,t:10,i:554}, D{l:7,t:10,i:605}, D{l:141,t:10,i:10}, D{l:5,t:10,i:838}, D{l:5,t:10,i:841}, D{l:134,t:10,i:1649}, D{l:133,t:10,i:1012}, D{l:6,t:0,i:1357}, D{l:134,t:0,i:1380}, D{l:144,t:0,i:53}, D{l:6,t:0,i:590}, D{l:7,t:10,i:365}, D{l:7,t:10,i:1357}, D{l:7,t:10,i:1497}, D{l:8,t:10,i:154}, D{l:141,t:10,i:281}, D{l:133,t:10,i:340}, D{l:132,t:11,i:420}, D{l:135,t:0,i:329}, D{l:147,t:11,i:32}, D{l:4,t:0,i:469}, D{l:10,t:11,i:429}, D{l:139,t:10,i:495}, D{l:8,t:10,i:261}, D{l:9,t:10,i:144}, D{l:9,t:10,i:466}, D{l:10,t:10,i:370}, D{l:12,t:10,i:470}, D{l:13,t:10,i:144}, D{l:142,t:10,i:348}, D{l:142,t:0,i:460}, D{l:4,t:11,i:325}, D{l:9,t:10,i:897}, D{l:138,t:11,i:125}, D{l:6,t:0,i:1743}, D{l:6,t:10,i:248}, D{l:9,t:10,i:546}, D{l:10,t:10,i:535}, D{l:11,t:10,i:681}, D{l:141,t:10,i:135}, D{l:4,t:0,i:990}, D{l:5,t:0,i:929}, D{l:6,t:0,i:340}, D{l:8,t:0,i:376}, D{l:8,t:0,i:807}, D{l:8,t:0,i:963}, D{l:8,t:0,i:980}, D{l:138,t:0,i:1007}, D{l:134,t:0,i:1603}, D{l:140,t:0,i:250}, D{l:4,t:11,i:714}, D{l:133,t:11,i:469}, D{l:134,t:10,i:567}, D{l:136,t:10,i:445}, D{l:5,t:0,i:218}, D{l:7,t:0,i:1610}, D{l:8,t:0,i:646}, D{l:10,t:0,i:83}, D{l:11,t:11,i:138}, D{l:140,t:11,i:40}, D{l:7,t:0,i:1512}, D{l:135,t:0,i:1794}, D{l:135,t:11,i:1216}, D{l:11,t:0,i:0}, D{l:16,t:0,i:78}, D{l:132,t:11,i:718}, D{l:133,t:0,i:571}, D{l:132,t:0,i:455}, D{l:134,t:0,i:1012}, D{l:5,t:11,i:124}, D{l:5,t:11,i:144}, D{l:6,t:11,i:548}, D{l:7,t:11,i:15}, D{l:7,t:11,i:153}, D{l:137,t:11,i:629}, D{l:142,t:11,i:10}, D{l:6,t:11,i:75}, D{l:7,t:11,i:1531}, D{l:8,t:11,i:416}, D{l:9,t:11,i:240}, D{l:9,t:11,i:275}, D{l:10,t:11,i:100}, D{l:11,t:11,i:658}, D{l:11,t:11,i:979}, D{l:12,t:11,i:86}, D{l:13,t:11,i:468}, D{l:14,t:11,i:66}, D{l:14,t:11,i:207}, D{l:15,t:11,i:20}, D{l:15,t:11,i:25}, D{l:144,t:11,i:58}, D{l:132,t:10,i:577}, D{l:5,t:11,i:141}, D{l:5,t:11,i:915}, D{l:6,t:11,i:1783}, D{l:7,t:11,i:211}, D{l:7,t:11,i:698}, D{l:7,t:11,i:1353}, D{l:9,t:11,i:83}, D{l:9,t:11,i:281}, D{l:10,t:11,i:376}, D{l:10,t:11,i:431}, D{l:11,t:11,i:543}, D{l:12,t:11,i:664}, D{l:13,t:11,i:280}, D{l:13,t:11,i:428}, D{l:14,t:11,i:61}, D{l:14,t:11,i:128}, D{l:17,t:11,i:52}, D{l:145,t:11,i:81}, D{l:6,t:0,i:161}, D{l:7,t:0,i:372}, D{l:137,t:0,i:597}, D{l:132,t:0,i:349}, D{l:10,t:11,i:702}, D{l:139,t:11,i:245}, D{l:134,t:0,i:524}, D{l:134,t:10,i:174}, D{l:6,t:0,i:432}, D{l:9,t:0,i:751}, D{l:139,t:0,i:322}, D{l:147,t:11,i:94}, D{l:4,t:11,i:338}, D{l:133,t:11,i:400}, D{l:5,t:0,i:468}, D{l:10,t:0,i:325}, D{l:11,t:0,i:856}, D{l:12,t:0,i:345}, D{l:143,t:0,i:104}, D{l:133,t:0,i:223}, D{l:132,t:0,i:566}, D{l:4,t:11,i:221}, D{l:5,t:11,i:659}, D{l:5,t:11,i:989}, D{l:7,t:11,i:697}, D{l:7,t:11,i:1211}, D{l:138,t:11,i:284}, D{l:135,t:11,i:1070}, D{l:4,t:0,i:59}, D{l:135,t:0,i:1394}, D{l:6,t:0,i:436}, D{l:11,t:0,i:481}, D{l:5,t:10,i:878}, D{l:133,t:10,i:972}, D{l:4,t:0,i:48}, D{l:5,t:0,i:271}, D{l:135,t:0,i:953}, D{l:5,t:0,i:610}, D{l:136,t:0,i:457}, D{l:4,t:0,i:773}, D{l:5,t:0,i:618}, D{l:137,t:0,i:756}, D{l:133,t:0,i:755}, D{l:135,t:0,i:1217}, D{l:138,t:11,i:507}, D{l:132,t:10,i:351}, D{l:132,t:0,i:197}, D{l:143,t:11,i:78}, D{l:4,t:11,i:188}, D{l:7,t:11,i:805}, D{l:11,t:11,i:276}, D{l:142,t:11,i:293}, D{l:5,t:11,i:884}, D{l:139,t:11,i:991}, D{l:132,t:10,i:286}, D{l:10,t:0,i:259}, D{l:10,t:0,i:428}, D{l:7,t:10,i:438}, D{l:7,t:10,i:627}, D{l:7,t:10,i:1516}, D{l:8,t:10,i:40}, D{l:9,t:10,i:56}, D{l:9,t:10,i:294}, D{l:11,t:10,i:969}, D{l:11,t:10,i:995}, D{l:146,t:10,i:148}, D{l:4,t:0,i:356}, D{l:5,t:0,i:217}, D{l:5,t:0,i:492}, D{l:5,t:0,i:656}, D{l:8,t:0,i:544}, D{l:136,t:11,i:544}, D{l:5,t:0,i:259}, D{l:6,t:0,i:1230}, D{l:7,t:0,i:414}, D{l:7,t:0,i:854}, D{l:142,t:0,i:107}, D{l:132,t:0,i:1007}, D{l:15,t:0,i:14}, D{l:144,t:0,i:5}, D{l:6,t:0,i:1580}, D{l:132,t:10,i:738}, D{l:132,t:11,i:596}, D{l:132,t:0,i:673}, D{l:133,t:10,i:866}, D{l:6,t:0,i:1843}, D{l:135,t:11,i:1847}, D{l:4,t:0,i:165}, D{l:7,t:0,i:1398}, D{l:135,t:0,i:1829}, D{l:135,t:11,i:1634}, D{l:147,t:11,i:65}, D{l:6,t:0,i:885}, D{l:6,t:0,i:1009}, D{l:137,t:0,i:809}, D{l:133,t:10,i:116}, D{l:132,t:10,i:457}, D{l:136,t:11,i:770}, D{l:9,t:0,i:498}, D{l:12,t:0,i:181}, D{l:10,t:11,i:361}, D{l:142,t:11,i:316}, D{l:134,t:11,i:595}, D{l:5,t:0,i:9}, D{l:7,t:0,i:297}, D{l:7,t:0,i:966}, D{l:140,t:0,i:306}, D{l:4,t:11,i:89}, D{l:5,t:11,i:489}, D{l:6,t:11,i:315}, D{l:7,t:11,i:553}, D{l:7,t:11,i:1745}, D{l:138,t:11,i:243}, D{l:134,t:0,i:1487}, D{l:132,t:0,i:437}, D{l:5,t:0,i:146}, D{l:6,t:0,i:411}, D{l:138,t:0,i:721}, D{l:5,t:10,i:527}, D{l:6,t:10,i:189}, D{l:135,t:10,i:859}, D{l:11,t:10,i:104}, D{l:11,t:10,i:554}, D{l:15,t:10,i:60}, D{l:143,t:10,i:125}, D{l:6,t:11,i:1658}, D{l:9,t:11,i:3}, D{l:10,t:11,i:154}, D{l:11,t:11,i:641}, D{l:13,t:11,i:85}, D{l:13,t:11,i:201}, D{l:141,t:11,i:346}, D{l:6,t:0,i:177}, D{l:135,t:0,i:467}, D{l:134,t:0,i:1377}, D{l:134,t:10,i:116}, D{l:136,t:11,i:645}, D{l:4,t:11,i:166}, D{l:5,t:11,i:505}, D{l:6,t:11,i:1670}, D{l:137,t:11,i:110}, D{l:133,t:10,i:487}, D{l:4,t:10,i:86}, D{l:5,t:10,i:667}, D{l:5,t:10,i:753}, D{l:6,t:10,i:316}, D{l:6,t:10,i:455}, D{l:135,t:10,i:946}, D{l:133,t:0,i:200}, D{l:132,t:0,i:959}, D{l:6,t:0,i:1928}, D{l:134,t:0,i:1957}, D{l:139,t:11,i:203}, D{l:150,t:10,i:45}, D{l:4,t:10,i:79}, D{l:7,t:10,i:1773}, D{l:10,t:10,i:450}, D{l:11,t:10,i:589}, D{l:13,t:10,i:332}, D{l:13,t:10,i:493}, D{l:14,t:10,i:183}, D{l:14,t:10,i:334}, D{l:14,t:10,i:362}, D{l:14,t:10,i:368}, D{l:14,t:10,i:376}, D{l:14,t:10,i:379}, D{l:19,t:10,i:90}, D{l:19,t:10,i:103}, D{l:19,t:10,i:127}, D{l:148,t:10,i:90}, D{l:6,t:0,i:1435}, D{l:135,t:11,i:1275}, D{l:134,t:0,i:481}, D{l:7,t:11,i:445}, D{l:8,t:11,i:307}, D{l:8,t:11,i:704}, D{l:10,t:11,i:41}, D{l:10,t:11,i:439}, D{l:11,t:11,i:237}, D{l:11,t:11,i:622}, D{l:140,t:11,i:201}, D{l:135,t:11,i:869}, D{l:4,t:0,i:84}, D{l:7,t:0,i:1482}, D{l:10,t:0,i:76}, D{l:138,t:0,i:142}, D{l:11,t:11,i:277}, D{l:144,t:11,i:14}, D{l:135,t:11,i:1977}, D{l:4,t:11,i:189}, D{l:5,t:11,i:713}, D{l:136,t:11,i:57}, D{l:133,t:0,i:1015}, D{l:138,t:11,i:371}, D{l:4,t:0,i:315}, D{l:5,t:0,i:507}, D{l:135,t:0,i:1370}, D{l:4,t:11,i:552}, D{l:142,t:10,i:381}, D{l:9,t:0,i:759}, D{l:16,t:0,i:31}, D{l:16,t:0,i:39}, D{l:16,t:0,i:75}, D{l:18,t:0,i:24}, D{l:20,t:0,i:42}, D{l:152,t:0,i:1}, D{l:134,t:0,i:712}, D{l:134,t:0,i:1722}, D{l:133,t:10,i:663}, D{l:133,t:10,i:846}, D{l:8,t:0,i:222}, D{l:8,t:0,i:476}, D{l:9,t:0,i:238}, D{l:11,t:0,i:516}, D{l:11,t:0,i:575}, D{l:15,t:0,i:109}, D{l:146,t:0,i:100}, D{l:7,t:0,i:1402}, D{l:7,t:0,i:1414}, D{l:12,t:0,i:456}, D{l:5,t:10,i:378}, D{l:8,t:10,i:465}, D{l:9,t:10,i:286}, D{l:10,t:10,i:185}, D{l:10,t:10,i:562}, D{l:10,t:10,i:635}, D{l:11,t:10,i:31}, D{l:11,t:10,i:393}, D{l:13,t:10,i:312}, D{l:18,t:10,i:65}, D{l:18,t:10,i:96}, D{l:147,t:10,i:89}, D{l:4,t:0,i:986}, D{l:6,t:0,i:1958}, D{l:6,t:0,i:2032}, D{l:8,t:0,i:934}, D{l:138,t:0,i:985}, D{l:7,t:10,i:1880}, D{l:9,t:10,i:680}, D{l:139,t:10,i:798}, D{l:134,t:10,i:1770}, D{l:145,t:11,i:49}, D{l:132,t:11,i:614}, D{l:132,t:10,i:648}, D{l:5,t:10,i:945}, D{l:6,t:10,i:1656}, D{l:6,t:10,i:1787}, D{l:7,t:10,i:167}, D{l:8,t:10,i:824}, D{l:9,t:10,i:391}, D{l:10,t:10,i:375}, D{l:139,t:10,i:185}, D{l:138,t:11,i:661}, D{l:7,t:0,i:1273}, D{l:135,t:11,i:1945}, D{l:7,t:0,i:706}, D{l:7,t:0,i:1058}, D{l:138,t:0,i:538}, D{l:7,t:10,i:1645}, D{l:8,t:10,i:352}, D{l:137,t:10,i:249}, D{l:132,t:10,i:152}, D{l:11,t:0,i:92}, D{l:11,t:0,i:196}, D{l:11,t:0,i:409}, D{l:11,t:0,i:450}, D{l:11,t:0,i:666}, D{l:11,t:0,i:777}, D{l:12,t:0,i:262}, D{l:13,t:0,i:385}, D{l:13,t:0,i:393}, D{l:15,t:0,i:115}, D{l:16,t:0,i:45}, D{l:145,t:0,i:82}, D{l:133,t:10,i:1006}, D{l:6,t:0,i:40}, D{l:135,t:0,i:1781}, D{l:9,t:11,i:614}, D{l:139,t:11,i:327}, D{l:5,t:10,i:420}, D{l:135,t:10,i:1449}, D{l:135,t:0,i:431}, D{l:10,t:0,i:97}, D{l:135,t:10,i:832}, D{l:6,t:0,i:423}, D{l:7,t:0,i:665}, D{l:135,t:0,i:1210}, D{l:7,t:0,i:237}, D{l:8,t:0,i:664}, D{l:9,t:0,i:42}, D{l:9,t:0,i:266}, D{l:9,t:0,i:380}, D{l:9,t:0,i:645}, D{l:10,t:0,i:177}, D{l:138,t:0,i:276}, D{l:7,t:0,i:264}, D{l:133,t:10,i:351}, D{l:8,t:0,i:213}, D{l:5,t:10,i:40}, D{l:7,t:10,i:598}, D{l:7,t:10,i:1638}, D{l:9,t:10,i:166}, D{l:9,t:10,i:640}, D{l:9,t:10,i:685}, D{l:9,t:10,i:773}, D{l:11,t:10,i:215}, D{l:13,t:10,i:65}, D{l:14,t:10,i:172}, D{l:14,t:10,i:317}, D{l:145,t:10,i:6}, D{l:5,t:11,i:84}, D{l:134,t:11,i:163}, D{l:8,t:10,i:60}, D{l:9,t:10,i:343}, D{l:139,t:10,i:769}, D{l:137,t:0,i:455}, D{l:133,t:11,i:410}, D{l:8,t:0,i:906}, D{l:12,t:0,i:700}, D{l:12,t:0,i:706}, D{l:140,t:0,i:729}, D{l:21,t:11,i:33}, D{l:150,t:11,i:40}, D{l:7,t:10,i:1951}, D{l:8,t:10,i:765}, D{l:8,t:10,i:772}, D{l:140,t:10,i:671}, D{l:7,t:10,i:108}, D{l:8,t:10,i:219}, D{l:8,t:10,i:388}, D{l:9,t:10,i:639}, D{l:9,t:10,i:775}, D{l:11,t:10,i:275}, D{l:140,t:10,i:464}, D{l:5,t:11,i:322}, D{l:7,t:11,i:1941}, D{l:8,t:11,i:186}, D{l:9,t:11,i:262}, D{l:10,t:11,i:187}, D{l:14,t:11,i:208}, D{l:146,t:11,i:130}, D{l:139,t:0,i:624}, D{l:8,t:0,i:574}, D{l:5,t:11,i:227}, D{l:140,t:11,i:29}, D{l:7,t:11,i:1546}, D{l:11,t:11,i:299}, D{l:142,t:11,i:407}, D{l:5,t:10,i:15}, D{l:6,t:10,i:56}, D{l:7,t:10,i:1758}, D{l:8,t:10,i:500}, D{l:9,t:10,i:730}, D{l:11,t:10,i:331}, D{l:13,t:10,i:150}, D{l:142,t:10,i:282}, D{l:7,t:11,i:1395}, D{l:8,t:11,i:486}, D{l:9,t:11,i:236}, D{l:9,t:11,i:878}, D{l:10,t:11,i:218}, D{l:11,t:11,i:95}, D{l:19,t:11,i:17}, D{l:147,t:11,i:31}, D{l:135,t:11,i:2043}, D{l:4,t:0,i:354}, D{l:146,t:11,i:4}, D{l:140,t:11,i:80}, D{l:135,t:0,i:1558}, D{l:134,t:10,i:1886}, D{l:5,t:10,i:205}, D{l:6,t:10,i:438}, D{l:137,t:10,i:711}, D{l:133,t:11,i:522}, D{l:133,t:10,i:534}, D{l:7,t:0,i:235}, D{l:7,t:0,i:1475}, D{l:15,t:0,i:68}, D{l:146,t:0,i:120}, D{l:137,t:10,i:691}, D{l:4,t:0,i:942}, D{l:6,t:0,i:1813}, D{l:8,t:0,i:917}, D{l:10,t:0,i:884}, D{l:12,t:0,i:696}, D{l:12,t:0,i:717}, D{l:12,t:0,i:723}, D{l:12,t:0,i:738}, D{l:12,t:0,i:749}, D{l:12,t:0,i:780}, D{l:16,t:0,i:97}, D{l:146,t:0,i:169}, D{l:6,t:10,i:443}, D{l:8,t:11,i:562}, D{l:9,t:10,i:237}, D{l:9,t:10,i:571}, D{l:9,t:10,i:695}, D{l:10,t:10,i:139}, D{l:11,t:10,i:715}, D{l:12,t:10,i:417}, D{l:141,t:10,i:421}, D{l:135,t:0,i:957}, D{l:133,t:0,i:830}, D{l:134,t:11,i:1771}, D{l:146,t:0,i:23}, D{l:5,t:0,i:496}, D{l:6,t:0,i:694}, D{l:7,t:0,i:203}, D{l:7,t:11,i:1190}, D{l:137,t:11,i:620}, D{l:137,t:11,i:132}, D{l:6,t:0,i:547}, D{l:134,t:0,i:1549}, D{l:8,t:11,i:258}, D{l:9,t:11,i:208}, D{l:137,t:11,i:359}, D{l:4,t:0,i:864}, D{l:5,t:0,i:88}, D{l:137,t:0,i:239}, D{l:135,t:11,i:493}, D{l:4,t:11,i:317}, D{l:135,t:11,i:1279}, D{l:132,t:11,i:477}, D{l:4,t:10,i:578}, D{l:5,t:11,i:63}, D{l:133,t:11,i:509}, D{l:7,t:0,i:650}, D{l:135,t:0,i:1310}, D{l:7,t:0,i:1076}, D{l:9,t:0,i:80}, D{l:11,t:0,i:78}, D{l:11,t:0,i:421}, D{l:11,t:0,i:534}, D{l:140,t:0,i:545}, D{l:132,t:11,i:288}, D{l:12,t:0,i:553}, D{l:14,t:0,i:118}, D{l:133,t:10,i:923}, D{l:7,t:0,i:274}, D{l:11,t:0,i:479}, D{l:139,t:0,i:507}, D{l:8,t:11,i:89}, D{l:8,t:11,i:620}, D{l:9,t:11,i:49}, D{l:10,t:11,i:774}, D{l:11,t:11,i:628}, D{l:12,t:11,i:322}, D{l:143,t:11,i:124}, D{l:4,t:0,i:497}, D{l:135,t:0,i:1584}, D{l:7,t:0,i:261}, D{l:7,t:0,i:1115}, D{l:7,t:0,i:1354}, D{l:7,t:0,i:1404}, D{l:7,t:0,i:1588}, D{l:7,t:0,i:1705}, D{l:7,t:0,i:1902}, D{l:9,t:0,i:465}, D{l:10,t:0,i:248}, D{l:10,t:0,i:349}, D{l:10,t:0,i:647}, D{l:11,t:0,i:527}, D{l:11,t:0,i:660}, D{l:11,t:0,i:669}, D{l:12,t:0,i:529}, D{l:13,t:0,i:305}, D{l:132,t:10,i:924}, D{l:133,t:10,i:665}, D{l:136,t:0,i:13}, D{l:6,t:0,i:791}, D{l:138,t:11,i:120}, D{l:7,t:0,i:642}, D{l:8,t:0,i:250}, D{l:11,t:0,i:123}, D{l:11,t:0,i:137}, D{l:13,t:0,i:48}, D{l:142,t:0,i:95}, D{l:4,t:10,i:265}, D{l:7,t:10,i:807}, D{l:135,t:10,i:950}, D{l:5,t:10,i:93}, D{l:140,t:10,i:267}, D{l:135,t:0,i:1429}, D{l:4,t:0,i:949}, D{l:10,t:0,i:885}, D{l:10,t:0,i:891}, D{l:10,t:0,i:900}, D{l:10,t:0,i:939}, D{l:12,t:0,i:760}, D{l:142,t:0,i:449}, D{l:139,t:11,i:366}, D{l:132,t:0,i:818}, D{l:134,t:11,i:85}, D{l:135,t:10,i:994}, D{l:7,t:0,i:330}, D{l:5,t:10,i:233}, D{l:5,t:10,i:320}, D{l:6,t:10,i:140}, D{l:136,t:10,i:295}, D{l:4,t:0,i:1004}, D{l:8,t:0,i:982}, D{l:136,t:0,i:993}, D{l:133,t:10,i:978}, D{l:4,t:10,i:905}, D{l:6,t:10,i:1701}, D{l:137,t:10,i:843}, D{l:10,t:0,i:545}, D{l:140,t:0,i:301}, D{l:6,t:0,i:947}, D{l:134,t:0,i:1062}, D{l:134,t:0,i:1188}, D{l:4,t:0,i:904}, D{l:5,t:0,i:794}, D{l:152,t:10,i:6}, D{l:134,t:0,i:1372}, D{l:135,t:11,i:608}, D{l:5,t:11,i:279}, D{l:6,t:11,i:235}, D{l:7,t:11,i:468}, D{l:8,t:11,i:446}, D{l:9,t:11,i:637}, D{l:10,t:11,i:717}, D{l:11,t:11,i:738}, D{l:140,t:11,i:514}, D{l:132,t:10,i:509}, D{l:5,t:11,i:17}, D{l:6,t:11,i:371}, D{l:137,t:11,i:528}, D{l:132,t:0,i:693}, D{l:4,t:11,i:115}, D{l:5,t:11,i:669}, D{l:6,t:11,i:407}, D{l:8,t:11,i:311}, D{l:11,t:11,i:10}, D{l:141,t:11,i:5}, D{l:11,t:0,i:377}, D{l:7,t:10,i:273}, D{l:137,t:11,i:381}, D{l:135,t:0,i:695}, D{l:7,t:0,i:386}, D{l:138,t:0,i:713}, D{l:135,t:10,i:1041}, D{l:134,t:0,i:1291}, D{l:6,t:0,i:7}, D{l:6,t:0,i:35}, D{l:7,t:0,i:147}, D{l:7,t:0,i:1069}, D{l:7,t:0,i:1568}, D{l:7,t:0,i:1575}, D{l:7,t:0,i:1917}, D{l:8,t:0,i:43}, D{l:8,t:0,i:208}, D{l:9,t:0,i:128}, D{l:9,t:0,i:866}, D{l:10,t:0,i:20}, D{l:11,t:0,i:981}, D{l:147,t:0,i:33}, D{l:7,t:0,i:893}, D{l:141,t:0,i:424}, D{l:139,t:10,i:234}, D{l:150,t:11,i:56}, D{l:5,t:11,i:779}, D{l:5,t:11,i:807}, D{l:6,t:11,i:1655}, D{l:134,t:11,i:1676}, D{l:5,t:10,i:802}, D{l:7,t:10,i:2021}, D{l:136,t:10,i:805}, D{l:4,t:11,i:196}, D{l:5,t:10,i:167}, D{l:5,t:11,i:558}, D{l:5,t:10,i:899}, D{l:5,t:11,i:949}, D{l:6,t:10,i:410}, D{l:137,t:10,i:777}, D{l:137,t:10,i:789}, D{l:134,t:10,i:1705}, D{l:8,t:0,i:904}, D{l:140,t:0,i:787}, D{l:6,t:0,i:322}, D{l:9,t:0,i:552}, D{l:11,t:0,i:274}, D{l:13,t:0,i:209}, D{l:13,t:0,i:499}, D{l:14,t:0,i:85}, D{l:15,t:0,i:126}, D{l:145,t:0,i:70}, D{l:135,t:10,i:10}, D{l:5,t:10,i:11}, D{l:6,t:10,i:117}, D{l:6,t:10,i:485}, D{l:7,t:10,i:1133}, D{l:9,t:10,i:582}, D{l:9,t:10,i:594}, D{l:11,t:10,i:21}, D{l:11,t:10,i:818}, D{l:12,t:10,i:535}, D{l:141,t:10,i:86}, D{l:4,t:10,i:264}, D{l:7,t:10,i:1067}, D{l:8,t:10,i:204}, D{l:8,t:10,i:385}, D{l:139,t:10,i:953}, D{l:132,t:11,i:752}, D{l:138,t:10,i:56}, D{l:133,t:10,i:470}, D{l:6,t:0,i:1808}, D{l:8,t:0,i:83}, D{l:8,t:0,i:742}, D{l:8,t:0,i:817}, D{l:9,t:0,i:28}, D{l:9,t:0,i:29}, D{l:9,t:0,i:885}, D{l:10,t:0,i:387}, D{l:11,t:0,i:633}, D{l:11,t:0,i:740}, D{l:13,t:0,i:235}, D{l:13,t:0,i:254}, D{l:15,t:0,i:143}, D{l:143,t:0,i:146}, D{l:140,t:0,i:49}, D{l:134,t:0,i:1832}, D{l:4,t:11,i:227}, D{l:5,t:11,i:159}, D{l:5,t:11,i:409}, D{l:7,t:11,i:80}, D{l:10,t:11,i:294}, D{l:10,t:11,i:479}, D{l:12,t:11,i:418}, D{l:14,t:11,i:50}, D{l:14,t:11,i:249}, D{l:142,t:11,i:295}, D{l:7,t:11,i:1470}, D{l:8,t:11,i:66}, D{l:8,t:11,i:137}, D{l:8,t:11,i:761}, D{l:9,t:11,i:638}, D{l:11,t:11,i:80}, D{l:11,t:11,i:212}, D{l:11,t:11,i:368}, D{l:11,t:11,i:418}, D{l:12,t:11,i:8}, D{l:13,t:11,i:15}, D{l:16,t:11,i:61}, D{l:17,t:11,i:59}, D{l:19,t:11,i:28}, D{l:148,t:11,i:84}, D{l:139,t:10,i:1015}, D{l:138,t:11,i:468}, D{l:135,t:0,i:421}, D{l:6,t:0,i:415}, D{l:7,t:0,i:1049}, D{l:137,t:0,i:442}, D{l:6,t:11,i:38}, D{l:7,t:11,i:1220}, D{l:8,t:11,i:185}, D{l:8,t:11,i:256}, D{l:9,t:11,i:22}, D{l:9,t:11,i:331}, D{l:10,t:11,i:738}, D{l:11,t:11,i:205}, D{l:11,t:11,i:540}, D{l:11,t:11,i:746}, D{l:13,t:11,i:399}, D{l:13,t:11,i:465}, D{l:14,t:11,i:88}, D{l:142,t:11,i:194}, D{l:139,t:0,i:289}, D{l:133,t:10,i:715}, D{l:4,t:0,i:110}, D{l:10,t:0,i:415}, D{l:10,t:0,i:597}, D{l:142,t:0,i:206}, D{l:4,t:11,i:159}, D{l:6,t:11,i:115}, D{l:7,t:11,i:252}, D{l:7,t:11,i:257}, D{l:7,t:11,i:1928}, D{l:8,t:11,i:69}, D{l:9,t:11,i:384}, D{l:10,t:11,i:91}, D{l:10,t:11,i:615}, D{l:12,t:11,i:375}, D{l:14,t:11,i:235}, D{l:18,t:11,i:117}, D{l:147,t:11,i:123}, D{l:5,t:11,i:911}, D{l:136,t:11,i:278}, D{l:7,t:0,i:205}, D{l:7,t:0,i:2000}, D{l:8,t:10,i:794}, D{l:9,t:10,i:400}, D{l:10,t:10,i:298}, D{l:142,t:10,i:228}, D{l:135,t:11,i:1774}, D{l:4,t:11,i:151}, D{l:7,t:11,i:1567}, D{l:8,t:11,i:351}, D{l:137,t:11,i:322}, D{l:136,t:10,i:724}, D{l:133,t:11,i:990}, D{l:7,t:0,i:1539}, D{l:11,t:0,i:512}, D{l:13,t:0,i:205}, D{l:19,t:0,i:30}, D{l:22,t:0,i:36}, D{l:23,t:0,i:19}, D{l:135,t:11,i:1539}, D{l:5,t:11,i:194}, D{l:7,t:11,i:1662}, D{l:9,t:11,i:90}, D{l:140,t:11,i:180}, D{l:6,t:10,i:190}, D{l:7,t:10,i:768}, D{l:135,t:10,i:1170}, D{l:134,t:0,i:1340}, D{l:4,t:0,i:283}, D{l:135,t:0,i:1194}, D{l:133,t:11,i:425}, D{l:133,t:11,i:971}, D{l:12,t:0,i:549}, D{l:14,t:10,i:67}, D{l:147,t:10,i:60}, D{l:135,t:10,i:1023}, D{l:134,t:0,i:1720}, D{l:138,t:11,i:587}, D{l:5,t:11,i:72}, D{l:6,t:11,i:264}, D{l:7,t:11,i:21}, D{l:7,t:11,i:46}, D{l:7,t:11,i:2013}, D{l:8,t:11,i:215}, D{l:8,t:11,i:513}, D{l:10,t:11,i:266}, D{l:139,t:11,i:22}, D{l:5,t:0,i:319}, D{l:135,t:0,i:534}, D{l:6,t:10,i:137}, D{l:9,t:10,i:75}, D{l:9,t:10,i:253}, D{l:10,t:10,i:194}, D{l:138,t:10,i:444}, D{l:7,t:0,i:1180}, D{l:20,t:0,i:112}, D{l:6,t:11,i:239}, D{l:7,t:11,i:118}, D{l:10,t:11,i:95}, D{l:11,t:11,i:603}, D{l:13,t:11,i:443}, D{l:14,t:11,i:160}, D{l:143,t:11,i:4}, D{l:134,t:11,i:431}, D{l:5,t:11,i:874}, D{l:6,t:11,i:1677}, D{l:11,t:10,i:643}, D{l:12,t:10,i:115}, D{l:143,t:11,i:0}, D{l:134,t:0,i:967}, D{l:6,t:11,i:65}, D{l:7,t:11,i:939}, D{l:7,t:11,i:1172}, D{l:7,t:11,i:1671}, D{l:9,t:11,i:540}, D{l:10,t:11,i:696}, D{l:11,t:11,i:265}, D{l:11,t:11,i:732}, D{l:11,t:11,i:928}, D{l:11,t:11,i:937}, D{l:12,t:11,i:399}, D{l:13,t:11,i:438}, D{l:149,t:11,i:19}, D{l:137,t:11,i:200}, D{l:135,t:0,i:1940}, D{l:5,t:10,i:760}, D{l:7,t:10,i:542}, D{l:8,t:10,i:135}, D{l:136,t:10,i:496}, D{l:140,t:11,i:44}, D{l:7,t:11,i:1655}, D{l:136,t:11,i:305}, D{l:7,t:10,i:319}, D{l:7,t:10,i:355}, D{l:7,t:10,i:763}, D{l:10,t:10,i:389}, D{l:145,t:10,i:43}, D{l:136,t:0,i:735}, D{l:138,t:10,i:786}, D{l:137,t:11,i:19}, D{l:132,t:11,i:696}, D{l:5,t:0,i:132}, D{l:9,t:0,i:486}, D{l:9,t:0,i:715}, D{l:10,t:0,i:458}, D{l:11,t:0,i:373}, D{l:11,t:0,i:668}, D{l:11,t:0,i:795}, D{l:11,t:0,i:897}, D{l:12,t:0,i:272}, D{l:12,t:0,i:424}, D{l:12,t:0,i:539}, D{l:12,t:0,i:558}, D{l:14,t:0,i:245}, D{l:14,t:0,i:263}, D{l:14,t:0,i:264}, D{l:14,t:0,i:393}, D{l:142,t:0,i:403}, D{l:10,t:0,i:38}, D{l:139,t:0,i:784}, D{l:132,t:0,i:838}, D{l:4,t:11,i:302}, D{l:135,t:11,i:1766}, D{l:133,t:0,i:379}, D{l:5,t:0,i:8}, D{l:6,t:0,i:89}, D{l:6,t:0,i:400}, D{l:7,t:0,i:1569}, D{l:7,t:0,i:1623}, D{l:7,t:0,i:1850}, D{l:8,t:0,i:218}, D{l:8,t:0,i:422}, D{l:9,t:0,i:570}, D{l:10,t:0,i:626}, D{l:4,t:11,i:726}, D{l:133,t:11,i:630}, D{l:4,t:0,i:1017}, D{l:138,t:0,i:660}, D{l:6,t:0,i:387}, D{l:7,t:0,i:882}, D{l:141,t:0,i:111}, D{l:6,t:0,i:224}, D{l:7,t:0,i:877}, D{l:137,t:0,i:647}, D{l:4,t:10,i:58}, D{l:5,t:10,i:286}, D{l:6,t:10,i:319}, D{l:7,t:10,i:402}, D{l:7,t:10,i:1254}, D{l:7,t:10,i:1903}, D{l:8,t:10,i:356}, D{l:140,t:10,i:408}, D{l:135,t:0,i:790}, D{l:9,t:0,i:510}, D{l:10,t:0,i:53}, D{l:4,t:10,i:389}, D{l:9,t:10,i:181}, D{l:10,t:10,i:29}, D{l:10,t:10,i:816}, D{l:11,t:10,i:311}, D{l:11,t:10,i:561}, D{l:12,t:10,i:67}, D{l:141,t:10,i:181}, D{l:142,t:0,i:458}, D{l:6,t:11,i:118}, D{l:7,t:11,i:215}, D{l:7,t:11,i:1521}, D{l:140,t:11,i:11}, D{l:134,t:0,i:954}, D{l:135,t:0,i:394}, D{l:134,t:0,i:1367}, D{l:5,t:11,i:225}, D{l:133,t:10,i:373}, D{l:132,t:0,i:882}, D{l:7,t:0,i:1409}, D{l:135,t:10,i:1972}, D{l:135,t:10,i:1793}, D{l:4,t:11,i:370}, D{l:5,t:11,i:756}, D{l:135,t:11,i:1326}, D{l:150,t:11,i:13}, D{l:7,t:11,i:354}, D{l:10,t:11,i:410}, D{l:139,t:11,i:815}, D{l:6,t:11,i:1662}, D{l:7,t:11,i:48}, D{l:8,t:11,i:771}, D{l:10,t:11,i:116}, D{l:13,t:11,i:104}, D{l:14,t:11,i:105}, D{l:14,t:11,i:184}, D{l:15,t:11,i:168}, D{l:19,t:11,i:92}, D{l:148,t:11,i:68}, D{l:7,t:0,i:124}, D{l:136,t:0,i:38}, D{l:5,t:0,i:261}, D{l:7,t:0,i:78}, D{l:7,t:0,i:199}, D{l:8,t:0,i:815}, D{l:9,t:0,i:126}, D{l:10,t:0,i:342}, D{l:140,t:0,i:647}, D{l:4,t:0,i:628}, D{l:140,t:0,i:724}, D{l:7,t:0,i:266}, D{l:8,t:0,i:804}, D{l:7,t:10,i:1651}, D{l:145,t:10,i:89}, D{l:135,t:0,i:208}, D{l:134,t:0,i:1178}, D{l:6,t:0,i:79}, D{l:135,t:0,i:1519}, D{l:132,t:10,i:672}, D{l:133,t:10,i:737}, D{l:136,t:0,i:741}, D{l:132,t:11,i:120}, D{l:4,t:0,i:710}, D{l:6,t:0,i:376}, D{l:134,t:0,i:606}, D{l:134,t:0,i:1347}, D{l:134,t:0,i:1494}, D{l:6,t:0,i:850}, D{l:6,t:0,i:1553}, D{l:137,t:0,i:821}, D{l:5,t:10,i:145}, D{l:134,t:11,i:593}, D{l:7,t:0,i:1311}, D{l:140,t:0,i:135}, D{l:4,t:0,i:467}, D{l:5,t:0,i:405}, D{l:134,t:0,i:544}, D{l:5,t:11,i:820}, D{l:135,t:11,i:931}, D{l:6,t:0,i:100}, D{l:7,t:0,i:244}, D{l:7,t:0,i:632}, D{l:7,t:0,i:1609}, D{l:8,t:0,i:178}, D{l:8,t:0,i:638}, D{l:141,t:0,i:58}, D{l:4,t:10,i:387}, D{l:135,t:10,i:1288}, D{l:6,t:11,i:151}, D{l:6,t:11,i:1675}, D{l:7,t:11,i:383}, D{l:151,t:11,i:10}, D{l:132,t:0,i:481}, D{l:135,t:10,i:550}, D{l:134,t:0,i:1378}, D{l:6,t:11,i:1624}, D{l:11,t:11,i:11}, D{l:12,t:11,i:422}, D{l:13,t:11,i:262}, D{l:142,t:11,i:360}, D{l:133,t:0,i:791}, D{l:4,t:11,i:43}, D{l:5,t:11,i:344}, D{l:133,t:11,i:357}, D{l:7,t:0,i:1227}, D{l:140,t:0,i:978}, D{l:7,t:0,i:686}, D{l:8,t:0,i:33}, D{l:8,t:0,i:238}, D{l:10,t:0,i:616}, D{l:11,t:0,i:467}, D{l:11,t:0,i:881}, D{l:13,t:0,i:217}, D{l:13,t:0,i:253}, D{l:142,t:0,i:268}, D{l:137,t:0,i:857}, D{l:8,t:0,i:467}, D{l:8,t:0,i:1006}, D{l:7,t:11,i:148}, D{l:8,t:11,i:284}, D{l:141,t:11,i:63}, D{l:4,t:10,i:576}, D{l:135,t:10,i:1263}, D{l:133,t:11,i:888}, D{l:5,t:10,i:919}, D{l:134,t:10,i:1673}, D{l:20,t:10,i:37}, D{l:148,t:11,i:37}, D{l:132,t:0,i:447}, D{l:132,t:11,i:711}, D{l:4,t:0,i:128}, D{l:5,t:0,i:415}, D{l:6,t:0,i:462}, D{l:7,t:0,i:294}, D{l:7,t:0,i:578}, D{l:10,t:0,i:710}, D{l:139,t:0,i:86}, D{l:4,t:10,i:82}, D{l:5,t:10,i:333}, D{l:5,t:10,i:904}, D{l:6,t:10,i:207}, D{l:7,t:10,i:325}, D{l:7,t:10,i:1726}, D{l:8,t:10,i:101}, D{l:10,t:10,i:778}, D{l:139,t:10,i:220}, D{l:136,t:0,i:587}, D{l:137,t:11,i:440}, D{l:133,t:10,i:903}, D{l:6,t:0,i:427}, D{l:7,t:0,i:1018}, D{l:138,t:0,i:692}, D{l:4,t:0,i:195}, D{l:135,t:0,i:802}, D{l:140,t:10,i:147}, D{l:134,t:0,i:1546}, D{l:134,t:0,i:684}, D{l:132,t:10,i:705}, D{l:136,t:0,i:345}, D{l:11,t:11,i:678}, D{l:140,t:11,i:307}, D{l:133,t:0,i:365}, D{l:134,t:0,i:1683}, D{l:4,t:11,i:65}, D{l:5,t:11,i:479}, D{l:5,t:11,i:1004}, D{l:7,t:11,i:1913}, D{l:8,t:11,i:317}, D{l:9,t:11,i:302}, D{l:10,t:11,i:612}, D{l:141,t:11,i:22}, D{l:138,t:0,i:472}, D{l:4,t:11,i:261}, D{l:135,t:11,i:510}, D{l:134,t:10,i:90}, D{l:142,t:0,i:433}, D{l:151,t:0,i:28}, D{l:4,t:11,i:291}, D{l:7,t:11,i:101}, D{l:9,t:11,i:515}, D{l:12,t:11,i:152}, D{l:12,t:11,i:443}, D{l:13,t:11,i:392}, D{l:142,t:11,i:357}, D{l:140,t:0,i:997}, D{l:5,t:0,i:3}, D{l:8,t:0,i:578}, D{l:9,t:0,i:118}, D{l:10,t:0,i:705}, D{l:141,t:0,i:279}, D{l:135,t:11,i:1266}, D{l:7,t:10,i:813}, D{l:12,t:10,i:497}, D{l:141,t:10,i:56}, D{l:133,t:0,i:229}, D{l:6,t:10,i:125}, D{l:135,t:10,i:1277}, D{l:8,t:0,i:102}, D{l:10,t:0,i:578}, D{l:10,t:0,i:672}, D{l:12,t:0,i:496}, D{l:13,t:0,i:408}, D{l:14,t:0,i:121}, D{l:17,t:0,i:106}, D{l:151,t:10,i:12}, D{l:6,t:0,i:866}, D{l:134,t:0,i:1080}, D{l:136,t:0,i:1022}, D{l:4,t:11,i:130}, D{l:135,t:11,i:843}, D{l:5,t:11,i:42}, D{l:5,t:11,i:879}, D{l:7,t:11,i:245}, D{l:7,t:11,i:324}, D{l:7,t:11,i:1532}, D{l:11,t:11,i:463}, D{l:11,t:11,i:472}, D{l:13,t:11,i:363}, D{l:144,t:11,i:52}, D{l:150,t:0,i:55}, D{l:8,t:0,i:115}, D{l:8,t:0,i:350}, D{l:9,t:0,i:489}, D{l:10,t:0,i:128}, D{l:11,t:0,i:306}, D{l:12,t:0,i:373}, D{l:14,t:0,i:30}, D{l:17,t:0,i:79}, D{l:19,t:0,i:80}, D{l:4,t:11,i:134}, D{l:133,t:11,i:372}, D{l:134,t:0,i:657}, D{l:134,t:0,i:933}, D{l:135,t:11,i:1147}, D{l:4,t:0,i:230}, D{l:133,t:0,i:702}, D{l:134,t:0,i:1728}, D{l:4,t:0,i:484}, D{l:18,t:0,i:26}, D{l:19,t:0,i:42}, D{l:20,t:0,i:43}, D{l:21,t:0,i:0}, D{l:23,t:0,i:27}, D{l:152,t:0,i:14}, D{l:7,t:0,i:185}, D{l:135,t:0,i:703}, D{l:6,t:0,i:417}, D{l:10,t:0,i:618}, D{l:7,t:10,i:1106}, D{l:9,t:10,i:770}, D{l:11,t:10,i:112}, D{l:140,t:10,i:413}, D{l:134,t:0,i:803}, D{l:132,t:11,i:644}, D{l:134,t:0,i:1262}, D{l:7,t:11,i:540}, D{l:12,t:10,i:271}, D{l:145,t:10,i:109}, D{l:135,t:11,i:123}, D{l:132,t:0,i:633}, D{l:134,t:11,i:623}, D{l:4,t:11,i:908}, D{l:5,t:11,i:359}, D{l:5,t:11,i:508}, D{l:6,t:11,i:1723}, D{l:7,t:11,i:343}, D{l:7,t:11,i:1996}, D{l:135,t:11,i:2026}, D{l:135,t:0,i:479}, D{l:10,t:0,i:262}, D{l:7,t:10,i:304}, D{l:9,t:10,i:646}, D{l:9,t:10,i:862}, D{l:11,t:10,i:696}, D{l:12,t:10,i:208}, D{l:15,t:10,i:79}, D{l:147,t:10,i:108}, D{l:4,t:11,i:341}, D{l:135,t:11,i:480}, D{l:134,t:0,i:830}, D{l:5,t:0,i:70}, D{l:5,t:0,i:622}, D{l:6,t:0,i:334}, D{l:7,t:0,i:1032}, D{l:9,t:0,i:171}, D{l:11,t:0,i:26}, D{l:11,t:0,i:213}, D{l:11,t:0,i:637}, D{l:11,t:0,i:707}, D{l:12,t:0,i:202}, D{l:12,t:0,i:380}, D{l:13,t:0,i:226}, D{l:13,t:0,i:355}, D{l:14,t:0,i:222}, D{l:145,t:0,i:42}, D{l:135,t:10,i:981}, D{l:143,t:0,i:217}, D{l:137,t:11,i:114}, D{l:4,t:0,i:23}, D{l:4,t:0,i:141}, D{l:5,t:0,i:313}, D{l:5,t:0,i:1014}, D{l:6,t:0,i:50}, D{l:6,t:0,i:51}, D{l:7,t:0,i:142}, D{l:7,t:0,i:384}, D{l:7,t:0,i:559}, D{l:8,t:0,i:640}, D{l:9,t:0,i:460}, D{l:9,t:0,i:783}, D{l:11,t:0,i:741}, D{l:12,t:0,i:183}, D{l:141,t:0,i:488}, D{l:141,t:0,i:360}, D{l:7,t:0,i:1586}, D{l:7,t:11,i:1995}, D{l:8,t:11,i:299}, D{l:11,t:11,i:890}, D{l:140,t:11,i:674}, D{l:132,t:10,i:434}, D{l:7,t:0,i:652}, D{l:134,t:10,i:550}, D{l:7,t:0,i:766}, D{l:5,t:10,i:553}, D{l:138,t:10,i:824}, D{l:7,t:0,i:737}, D{l:8,t:0,i:298}, D{l:136,t:10,i:452}, D{l:4,t:11,i:238}, D{l:5,t:11,i:503}, D{l:6,t:11,i:179}, D{l:7,t:11,i:2003}, D{l:8,t:11,i:381}, D{l:8,t:11,i:473}, D{l:9,t:11,i:149}, D{l:10,t:11,i:183}, D{l:15,t:11,i:45}, D{l:143,t:11,i:86}, D{l:133,t:10,i:292}, D{l:5,t:0,i:222}, D{l:9,t:0,i:655}, D{l:138,t:0,i:534}, D{l:138,t:10,i:135}, D{l:4,t:11,i:121}, D{l:5,t:11,i:156}, D{l:5,t:11,i:349}, D{l:9,t:11,i:136}, D{l:10,t:11,i:605}, D{l:14,t:11,i:342}, D{l:147,t:11,i:107}, D{l:137,t:0,i:906}, D{l:6,t:0,i:1013}, D{l:134,t:0,i:1250}, D{l:6,t:0,i:1956}, D{l:6,t:0,i:2009}, D{l:8,t:0,i:991}, D{l:144,t:0,i:120}, D{l:135,t:11,i:1192}, D{l:138,t:0,i:503}, D{l:5,t:0,i:154}, D{l:7,t:0,i:1491}, D{l:10,t:0,i:379}, D{l:138,t:0,i:485}, D{l:6,t:0,i:1867}, D{l:6,t:0,i:1914}, D{l:6,t:0,i:1925}, D{l:9,t:0,i:917}, D{l:9,t:0,i:925}, D{l:9,t:0,i:932}, D{l:9,t:0,i:951}, D{l:9,t:0,i:1007}, D{l:9,t:0,i:1013}, D{l:12,t:0,i:806}, D{l:12,t:0,i:810}, D{l:12,t:0,i:814}, D{l:12,t:0,i:816}, D{l:12,t:0,i:824}, D{l:12,t:0,i:832}, D{l:12,t:0,i:837}, D{l:12,t:0,i:863}, D{l:12,t:0,i:868}, D{l:12,t:0,i:870}, D{l:12,t:0,i:889}, D{l:12,t:0,i:892}, D{l:12,t:0,i:900}, D{l:12,t:0,i:902}, D{l:12,t:0,i:908}, D{l:12,t:0,i:933}, D{l:12,t:0,i:942}, D{l:12,t:0,i:949}, D{l:12,t:0,i:954}, D{l:15,t:0,i:175}, D{l:15,t:0,i:203}, D{l:15,t:0,i:213}, D{l:15,t:0,i:218}, D{l:15,t:0,i:225}, D{l:15,t:0,i:231}, D{l:15,t:0,i:239}, D{l:15,t:0,i:248}, D{l:15,t:0,i:252}, D{l:18,t:0,i:190}, D{l:18,t:0,i:204}, D{l:18,t:0,i:215}, D{l:18,t:0,i:216}, D{l:18,t:0,i:222}, D{l:18,t:0,i:225}, D{l:18,t:0,i:230}, D{l:18,t:0,i:239}, D{l:18,t:0,i:241}, D{l:21,t:0,i:42}, D{l:21,t:0,i:43}, D{l:21,t:0,i:44}, D{l:21,t:0,i:45}, D{l:21,t:0,i:46}, D{l:21,t:0,i:53}, D{l:24,t:0,i:27}, D{l:152,t:0,i:31}, D{l:133,t:0,i:716}, D{l:135,t:0,i:844}, D{l:4,t:0,i:91}, D{l:5,t:0,i:388}, D{l:5,t:0,i:845}, D{l:6,t:0,i:206}, D{l:6,t:0,i:252}, D{l:6,t:0,i:365}, D{l:7,t:0,i:136}, D{l:7,t:0,i:531}, D{l:136,t:0,i:621}, D{l:7,t:10,i:393}, D{l:10,t:10,i:603}, D{l:139,t:10,i:206}, D{l:6,t:11,i:80}, D{l:6,t:11,i:1694}, D{l:7,t:11,i:173}, D{l:7,t:11,i:1974}, D{l:9,t:11,i:547}, D{l:10,t:11,i:730}, D{l:14,t:11,i:18}, D{l:150,t:11,i:39}, D{l:137,t:0,i:748}, D{l:4,t:11,i:923}, D{l:134,t:11,i:1711}, D{l:4,t:10,i:912}, D{l:137,t:10,i:232}, D{l:7,t:10,i:98}, D{l:7,t:10,i:1973}, D{l:136,t:10,i:716}, D{l:14,t:0,i:103}, D{l:133,t:10,i:733}, D{l:132,t:11,i:595}, D{l:12,t:0,i:158}, D{l:18,t:0,i:8}, D{l:19,t:0,i:62}, D{l:20,t:0,i:6}, D{l:22,t:0,i:4}, D{l:23,t:0,i:2}, D{l:23,t:0,i:9}, D{l:5,t:11,i:240}, D{l:6,t:11,i:459}, D{l:7,t:11,i:12}, D{l:7,t:11,i:114}, D{l:7,t:11,i:502}, D{l:7,t:11,i:1751}, D{l:7,t:11,i:1753}, D{l:7,t:11,i:1805}, D{l:8,t:11,i:658}, D{l:9,t:11,i:1}, D{l:11,t:11,i:959}, D{l:13,t:11,i:446}, D{l:142,t:11,i:211}, D{l:135,t:0,i:576}, D{l:5,t:0,i:771}, D{l:5,t:0,i:863}, D{l:5,t:0,i:898}, D{l:6,t:0,i:648}, D{l:6,t:0,i:1632}, D{l:6,t:0,i:1644}, D{l:134,t:0,i:1780}, D{l:133,t:0,i:331}, D{l:7,t:11,i:633}, D{l:7,t:11,i:905}, D{l:7,t:11,i:909}, D{l:7,t:11,i:1538}, D{l:9,t:11,i:767}, D{l:140,t:11,i:636}, D{l:140,t:0,i:632}, D{l:5,t:0,i:107}, D{l:7,t:0,i:201}, D{l:136,t:0,i:518}, D{l:6,t:0,i:446}, D{l:7,t:0,i:1817}, D{l:134,t:11,i:490}, D{l:9,t:0,i:851}, D{l:141,t:0,i:510}, D{l:7,t:11,i:250}, D{l:8,t:11,i:506}, D{l:136,t:11,i:507}, D{l:4,t:0,i:504}, D{l:137,t:10,i:72}, D{l:132,t:11,i:158}, D{l:4,t:11,i:140}, D{l:7,t:11,i:362}, D{l:8,t:11,i:209}, D{l:9,t:11,i:10}, D{l:9,t:11,i:160}, D{l:9,t:11,i:503}, D{l:10,t:11,i:689}, D{l:11,t:11,i:350}, D{l:11,t:11,i:553}, D{l:11,t:11,i:725}, D{l:12,t:11,i:252}, D{l:12,t:11,i:583}, D{l:13,t:11,i:192}, D{l:13,t:11,i:352}, D{l:14,t:11,i:269}, D{l:14,t:11,i:356}, D{l:148,t:11,i:50}, D{l:6,t:11,i:597}, D{l:135,t:11,i:1318}, D{l:135,t:10,i:1454}, D{l:5,t:0,i:883}, D{l:5,t:0,i:975}, D{l:8,t:0,i:392}, D{l:148,t:0,i:7}, D{l:6,t:11,i:228}, D{l:7,t:11,i:1341}, D{l:9,t:11,i:408}, D{l:138,t:11,i:343}, D{l:11,t:11,i:348}, D{l:11,t:10,i:600}, D{l:12,t:11,i:99}, D{l:13,t:10,i:245}, D{l:18,t:11,i:1}, D{l:18,t:11,i:11}, D{l:147,t:11,i:4}, D{l:134,t:11,i:296}, D{l:5,t:0,i:922}, D{l:134,t:0,i:1707}, D{l:132,t:11,i:557}, D{l:4,t:11,i:548}, D{l:7,t:10,i:164}, D{l:7,t:10,i:1571}, D{l:9,t:10,i:107}, D{l:140,t:10,i:225}, D{l:7,t:11,i:197}, D{l:8,t:11,i:142}, D{l:8,t:11,i:325}, D{l:9,t:11,i:150}, D{l:9,t:11,i:596}, D{l:10,t:11,i:350}, D{l:10,t:11,i:353}, D{l:11,t:11,i:74}, D{l:11,t:11,i:315}, D{l:14,t:11,i:423}, D{l:143,t:11,i:141}, D{l:5,t:0,i:993}, D{l:7,t:0,i:515}, D{l:137,t:0,i:91}, D{l:4,t:0,i:131}, D{l:8,t:0,i:200}, D{l:5,t:10,i:484}, D{l:5,t:10,i:510}, D{l:6,t:10,i:434}, D{l:7,t:10,i:1000}, D{l:7,t:10,i:1098}, D{l:136,t:10,i:2}, D{l:152,t:0,i:10}, D{l:4,t:11,i:62}, D{l:5,t:11,i:83}, D{l:6,t:11,i:399}, D{l:6,t:11,i:579}, D{l:7,t:11,i:692}, D{l:7,t:11,i:846}, D{l:7,t:11,i:1015}, D{l:7,t:11,i:1799}, D{l:8,t:11,i:403}, D{l:9,t:11,i:394}, D{l:10,t:11,i:133}, D{l:12,t:11,i:4}, D{l:12,t:11,i:297}, D{l:12,t:11,i:452}, D{l:16,t:11,i:81}, D{l:18,t:11,i:19}, D{l:18,t:11,i:25}, D{l:21,t:11,i:14}, D{l:22,t:11,i:12}, D{l:151,t:11,i:18}, D{l:140,t:11,i:459}, D{l:132,t:11,i:177}, D{l:7,t:0,i:1433}, D{l:9,t:0,i:365}, D{l:137,t:11,i:365}, D{l:132,t:10,i:460}, D{l:5,t:0,i:103}, D{l:6,t:0,i:2004}, D{l:7,t:0,i:921}, D{l:8,t:0,i:580}, D{l:8,t:0,i:593}, D{l:8,t:0,i:630}, D{l:10,t:0,i:28}, D{l:5,t:11,i:411}, D{l:135,t:11,i:653}, D{l:4,t:10,i:932}, D{l:133,t:10,i:891}, D{l:4,t:0,i:911}, D{l:5,t:0,i:867}, D{l:5,t:0,i:1013}, D{l:7,t:0,i:2034}, D{l:8,t:0,i:798}, D{l:136,t:0,i:813}, D{l:7,t:11,i:439}, D{l:10,t:11,i:727}, D{l:11,t:11,i:260}, D{l:139,t:11,i:684}, D{l:136,t:10,i:625}, D{l:5,t:11,i:208}, D{l:7,t:11,i:753}, D{l:135,t:11,i:1528}, D{l:5,t:0,i:461}, D{l:7,t:0,i:1925}, D{l:12,t:0,i:39}, D{l:13,t:0,i:265}, D{l:13,t:0,i:439}, D{l:134,t:10,i:76}, D{l:6,t:0,i:853}, D{l:8,t:10,i:92}, D{l:137,t:10,i:221}, D{l:5,t:0,i:135}, D{l:6,t:0,i:519}, D{l:7,t:0,i:1722}, D{l:10,t:0,i:271}, D{l:11,t:0,i:261}, D{l:145,t:0,i:54}, D{l:139,t:11,i:814}, D{l:14,t:0,i:338}, D{l:148,t:0,i:81}, D{l:4,t:0,i:300}, D{l:133,t:0,i:436}, D{l:5,t:0,i:419}, D{l:5,t:0,i:687}, D{l:7,t:0,i:864}, D{l:9,t:0,i:470}, D{l:135,t:11,i:864}, D{l:9,t:0,i:836}, D{l:133,t:11,i:242}, D{l:134,t:0,i:1937}, D{l:4,t:10,i:763}, D{l:133,t:11,i:953}, D{l:132,t:10,i:622}, D{l:132,t:0,i:393}, D{l:133,t:10,i:253}, D{l:8,t:0,i:357}, D{l:10,t:0,i:745}, D{l:14,t:0,i:426}, D{l:17,t:0,i:94}, D{l:19,t:0,i:57}, D{l:135,t:10,i:546}, D{l:5,t:11,i:615}, D{l:146,t:11,i:37}, D{l:9,t:10,i:73}, D{l:10,t:10,i:110}, D{l:14,t:10,i:185}, D{l:145,t:10,i:119}, D{l:11,t:0,i:703}, D{l:7,t:10,i:624}, D{l:7,t:10,i:916}, D{l:10,t:10,i:256}, D{l:139,t:10,i:87}, D{l:133,t:11,i:290}, D{l:5,t:10,i:212}, D{l:12,t:10,i:35}, D{l:141,t:10,i:382}, D{l:132,t:11,i:380}, D{l:5,t:11,i:52}, D{l:7,t:11,i:277}, D{l:9,t:11,i:368}, D{l:139,t:11,i:791}, D{l:133,t:0,i:387}, D{l:10,t:11,i:138}, D{l:139,t:11,i:476}, D{l:4,t:0,i:6}, D{l:5,t:0,i:708}, D{l:136,t:0,i:75}, D{l:7,t:0,i:1351}, D{l:9,t:0,i:581}, D{l:10,t:0,i:639}, D{l:11,t:0,i:453}, D{l:140,t:0,i:584}, D{l:132,t:0,i:303}, D{l:138,t:0,i:772}, D{l:135,t:10,i:1175}, D{l:4,t:0,i:749}, D{l:5,t:10,i:816}, D{l:6,t:11,i:256}, D{l:7,t:11,i:307}, D{l:7,t:11,i:999}, D{l:7,t:11,i:1481}, D{l:7,t:11,i:1732}, D{l:7,t:11,i:1738}, D{l:8,t:11,i:265}, D{l:9,t:11,i:414}, D{l:11,t:11,i:316}, D{l:12,t:11,i:52}, D{l:13,t:11,i:420}, D{l:147,t:11,i:100}, D{l:135,t:11,i:1296}, D{l:6,t:0,i:1065}, D{l:5,t:10,i:869}, D{l:5,t:10,i:968}, D{l:6,t:10,i:1626}, D{l:8,t:10,i:734}, D{l:136,t:10,i:784}, D{l:4,t:10,i:542}, D{l:6,t:10,i:1716}, D{l:6,t:10,i:1727}, D{l:7,t:10,i:1082}, D{l:7,t:10,i:1545}, D{l:8,t:10,i:56}, D{l:8,t:10,i:118}, D{l:8,t:10,i:412}, D{l:8,t:10,i:564}, D{l:9,t:10,i:888}, D{l:9,t:10,i:908}, D{l:10,t:10,i:50}, D{l:10,t:10,i:423}, D{l:11,t:10,i:685}, D{l:11,t:10,i:697}, D{l:11,t:10,i:933}, D{l:12,t:10,i:299}, D{l:13,t:10,i:126}, D{l:13,t:10,i:136}, D{l:13,t:10,i:170}, D{l:141,t:10,i:190}, D{l:134,t:0,i:226}, D{l:4,t:0,i:106}, D{l:7,t:0,i:310}, D{l:11,t:0,i:717}, D{l:133,t:11,i:723}, D{l:5,t:0,i:890}, D{l:5,t:0,i:988}, D{l:4,t:10,i:232}, D{l:9,t:10,i:202}, D{l:10,t:10,i:474}, D{l:140,t:10,i:433}, D{l:6,t:0,i:626}, D{l:142,t:0,i:431}, D{l:10,t:0,i:706}, D{l:150,t:0,i:44}, D{l:13,t:0,i:51}, D{l:6,t:10,i:108}, D{l:7,t:10,i:1003}, D{l:7,t:10,i:1181}, D{l:8,t:10,i:111}, D{l:136,t:10,i:343}, D{l:132,t:0,i:698}, D{l:5,t:11,i:109}, D{l:6,t:11,i:1784}, D{l:7,t:11,i:1895}, D{l:12,t:11,i:296}, D{l:140,t:11,i:302}, D{l:134,t:0,i:828}, D{l:134,t:10,i:1712}, D{l:138,t:0,i:17}, D{l:7,t:0,i:1929}, D{l:4,t:10,i:133}, D{l:5,t:11,i:216}, D{l:7,t:10,i:711}, D{l:7,t:10,i:1298}, D{l:7,t:10,i:1585}, D{l:7,t:11,i:1879}, D{l:9,t:11,i:141}, D{l:9,t:11,i:270}, D{l:9,t:11,i:679}, D{l:10,t:11,i:159}, D{l:10,t:11,i:553}, D{l:11,t:11,i:197}, D{l:11,t:11,i:438}, D{l:12,t:11,i:538}, D{l:12,t:11,i:559}, D{l:13,t:11,i:193}, D{l:13,t:11,i:423}, D{l:14,t:11,i:144}, D{l:14,t:11,i:166}, D{l:14,t:11,i:167}, D{l:15,t:11,i:67}, D{l:147,t:11,i:84}, D{l:141,t:11,i:127}, D{l:7,t:11,i:1872}, D{l:137,t:11,i:81}, D{l:6,t:10,i:99}, D{l:7,t:10,i:1808}, D{l:145,t:10,i:57}, D{l:134,t:11,i:391}, D{l:5,t:0,i:689}, D{l:6,t:0,i:84}, D{l:7,t:0,i:1250}, D{l:6,t:10,i:574}, D{l:7,t:10,i:428}, D{l:10,t:10,i:669}, D{l:11,t:10,i:485}, D{l:11,t:10,i:840}, D{l:12,t:10,i:300}, D{l:142,t:10,i:250}, D{l:7,t:11,i:322}, D{l:136,t:11,i:249}, D{l:7,t:11,i:432}, D{l:135,t:11,i:1649}, D{l:135,t:10,i:1871}, D{l:137,t:10,i:252}, D{l:6,t:11,i:155}, D{l:140,t:11,i:234}, D{l:7,t:0,i:871}, D{l:19,t:0,i:27}, D{l:147,t:11,i:27}, D{l:140,t:0,i:498}, D{l:5,t:0,i:986}, D{l:6,t:0,i:130}, D{l:138,t:0,i:823}, D{l:6,t:0,i:1793}, D{l:7,t:0,i:1582}, D{l:8,t:0,i:458}, D{l:10,t:0,i:101}, D{l:10,t:0,i:318}, D{l:10,t:0,i:945}, D{l:12,t:0,i:734}, D{l:16,t:0,i:104}, D{l:18,t:0,i:177}, D{l:6,t:10,i:323}, D{l:135,t:10,i:1564}, D{l:5,t:11,i:632}, D{l:138,t:11,i:526}, D{l:10,t:0,i:435}, D{l:7,t:10,i:461}, D{l:136,t:10,i:775}, D{l:6,t:11,i:144}, D{l:7,t:11,i:948}, D{l:7,t:11,i:1042}, D{l:7,t:11,i:1857}, D{l:8,t:11,i:235}, D{l:8,t:11,i:461}, D{l:9,t:11,i:453}, D{l:9,t:11,i:530}, D{l:10,t:11,i:354}, D{l:17,t:11,i:77}, D{l:19,t:11,i:99}, D{l:148,t:11,i:79}, D{l:138,t:0,i:966}, D{l:7,t:0,i:1644}, D{l:137,t:0,i:129}, D{l:135,t:0,i:997}, D{l:136,t:0,i:502}, D{l:5,t:11,i:196}, D{l:6,t:11,i:486}, D{l:7,t:11,i:212}, D{l:8,t:11,i:309}, D{l:136,t:11,i:346}, D{l:7,t:10,i:727}, D{l:146,t:10,i:73}, D{l:132,t:0,i:823}, D{l:132,t:11,i:686}, D{l:135,t:0,i:1927}, D{l:4,t:0,i:762}, D{l:7,t:0,i:1756}, D{l:137,t:0,i:98}, D{l:136,t:10,i:577}, D{l:24,t:0,i:8}, D{l:4,t:11,i:30}, D{l:5,t:11,i:43}, D{l:152,t:11,i:8}, D{l:7,t:0,i:1046}, D{l:139,t:0,i:160}, D{l:7,t:0,i:492}, D{l:4,t:10,i:413}, D{l:5,t:10,i:677}, D{l:7,t:11,i:492}, D{l:8,t:10,i:432}, D{l:140,t:10,i:280}, D{l:6,t:0,i:45}, D{l:7,t:0,i:433}, D{l:8,t:0,i:129}, D{l:9,t:0,i:21}, D{l:10,t:0,i:392}, D{l:11,t:0,i:79}, D{l:12,t:0,i:499}, D{l:13,t:0,i:199}, D{l:141,t:0,i:451}, D{l:7,t:0,i:558}, D{l:136,t:0,i:353}, D{l:4,t:11,i:220}, D{l:7,t:11,i:1535}, D{l:9,t:11,i:93}, D{l:139,t:11,i:474}, D{l:7,t:10,i:646}, D{l:7,t:10,i:1730}, D{l:11,t:10,i:446}, D{l:141,t:10,i:178}, D{l:133,t:0,i:785}, D{l:134,t:0,i:1145}, D{l:8,t:0,i:81}, D{l:9,t:0,i:189}, D{l:9,t:0,i:201}, D{l:11,t:0,i:478}, D{l:11,t:0,i:712}, D{l:141,t:0,i:338}, D{l:5,t:0,i:353}, D{l:151,t:0,i:26}, D{l:11,t:0,i:762}, D{l:132,t:10,i:395}, D{l:134,t:0,i:2024}, D{l:4,t:0,i:611}, D{l:133,t:0,i:606}, D{l:9,t:10,i:174}, D{l:10,t:10,i:164}, D{l:11,t:10,i:440}, D{l:11,t:10,i:841}, D{l:143,t:10,i:98}, D{l:134,t:10,i:426}, D{l:10,t:10,i:608}, D{l:139,t:10,i:1002}, D{l:138,t:10,i:250}, D{l:6,t:0,i:25}, D{l:7,t:0,i:855}, D{l:7,t:0,i:1258}, D{l:144,t:0,i:32}, D{l:7,t:11,i:1725}, D{l:138,t:11,i:393}, D{l:5,t:11,i:263}, D{l:134,t:11,i:414}, D{l:6,t:0,i:2011}, D{l:133,t:10,i:476}, D{l:4,t:0,i:4}, D{l:7,t:0,i:1118}, D{l:7,t:0,i:1320}, D{l:7,t:0,i:1706}, D{l:8,t:0,i:277}, D{l:9,t:0,i:622}, D{l:10,t:0,i:9}, D{l:11,t:0,i:724}, D{l:12,t:0,i:350}, D{l:12,t:0,i:397}, D{l:13,t:0,i:28}, D{l:13,t:0,i:159}, D{l:15,t:0,i:89}, D{l:18,t:0,i:5}, D{l:19,t:0,i:9}, D{l:20,t:0,i:34}, D{l:22,t:0,i:47}, D{l:6,t:11,i:178}, D{l:6,t:11,i:1750}, D{l:8,t:11,i:251}, D{l:9,t:11,i:690}, D{l:10,t:11,i:155}, D{l:10,t:11,i:196}, D{l:10,t:11,i:373}, D{l:11,t:11,i:698}, D{l:13,t:11,i:155}, D{l:148,t:11,i:93}, D{l:5,t:11,i:97}, D{l:137,t:11,i:393}, D{l:7,t:0,i:764}, D{l:11,t:0,i:461}, D{l:12,t:0,i:172}, D{l:5,t:10,i:76}, D{l:6,t:10,i:458}, D{l:6,t:10,i:497}, D{l:7,t:10,i:868}, D{l:9,t:10,i:658}, D{l:10,t:10,i:594}, D{l:11,t:10,i:566}, D{l:12,t:10,i:338}, D{l:141,t:10,i:200}, D{l:134,t:0,i:1449}, D{l:138,t:11,i:40}, D{l:134,t:11,i:1639}, D{l:134,t:0,i:1445}, D{l:6,t:0,i:1168}, D{l:4,t:10,i:526}, D{l:7,t:10,i:1029}, D{l:135,t:10,i:1054}, D{l:4,t:11,i:191}, D{l:7,t:11,i:934}, D{l:8,t:11,i:647}, D{l:145,t:11,i:97}, D{l:132,t:10,i:636}, D{l:6,t:0,i:233}, D{l:7,t:10,i:660}, D{l:7,t:10,i:1124}, D{l:17,t:10,i:31}, D{l:19,t:10,i:22}, D{l:151,t:10,i:14}, D{l:6,t:10,i:1699}, D{l:136,t:11,i:110}, D{l:12,t:11,i:246}, D{l:15,t:11,i:162}, D{l:19,t:11,i:64}, D{l:20,t:11,i:8}, D{l:20,t:11,i:95}, D{l:22,t:11,i:24}, D{l:152,t:11,i:17}, D{l:5,t:11,i:165}, D{l:9,t:11,i:346}, D{l:138,t:11,i:655}, D{l:5,t:11,i:319}, D{l:135,t:11,i:534}, D{l:134,t:0,i:255}, D{l:9,t:0,i:216}, D{l:8,t:11,i:128}, D{l:139,t:11,i:179}, D{l:9,t:0,i:183}, D{l:139,t:0,i:286}, D{l:11,t:0,i:956}, D{l:151,t:0,i:3}, D{l:4,t:0,i:536}, D{l:7,t:0,i:1141}, D{l:10,t:0,i:723}, D{l:139,t:0,i:371}, D{l:4,t:10,i:279}, D{l:7,t:10,i:301}, D{l:137,t:10,i:362}, D{l:7,t:0,i:285}, D{l:5,t:11,i:57}, D{l:6,t:11,i:101}, D{l:6,t:11,i:1663}, D{l:7,t:11,i:132}, D{l:7,t:11,i:1048}, D{l:7,t:11,i:1154}, D{l:7,t:11,i:1415}, D{l:7,t:11,i:1507}, D{l:12,t:11,i:493}, D{l:15,t:11,i:105}, D{l:151,t:11,i:15}, D{l:5,t:11,i:459}, D{l:7,t:11,i:1073}, D{l:7,t:10,i:1743}, D{l:8,t:11,i:241}, D{l:136,t:11,i:334}, D{l:4,t:10,i:178}, D{l:133,t:10,i:399}, D{l:135,t:0,i:560}, D{l:132,t:0,i:690}, D{l:135,t:0,i:1246}, D{l:18,t:0,i:157}, D{l:147,t:0,i:63}, D{l:10,t:0,i:599}, D{l:11,t:0,i:33}, D{l:12,t:0,i:571}, D{l:149,t:0,i:1}, D{l:6,t:11,i:324}, D{l:6,t:11,i:520}, D{l:7,t:11,i:338}, D{l:7,t:11,i:1616}, D{l:7,t:11,i:1729}, D{l:8,t:11,i:228}, D{l:9,t:11,i:69}, D{l:139,t:11,i:750}, D{l:7,t:0,i:1862}, D{l:12,t:0,i:491}, D{l:12,t:0,i:520}, D{l:13,t:0,i:383}, D{l:142,t:0,i:244}, D{l:135,t:11,i:734}, D{l:134,t:10,i:1692}, D{l:10,t:0,i:448}, D{l:11,t:0,i:630}, D{l:17,t:0,i:117}, D{l:6,t:10,i:202}, D{l:7,t:11,i:705}, D{l:12,t:10,i:360}, D{l:17,t:10,i:118}, D{l:18,t:10,i:27}, D{l:148,t:10,i:67}, D{l:4,t:11,i:73}, D{l:6,t:11,i:612}, D{l:7,t:11,i:927}, D{l:7,t:11,i:1822}, D{l:8,t:11,i:217}, D{l:9,t:11,i:472}, D{l:9,t:11,i:765}, D{l:9,t:11,i:766}, D{l:10,t:11,i:408}, D{l:11,t:11,i:51}, D{l:11,t:11,i:793}, D{l:12,t:11,i:266}, D{l:15,t:11,i:158}, D{l:20,t:11,i:89}, D{l:150,t:11,i:32}, D{l:4,t:0,i:190}, D{l:133,t:0,i:554}, D{l:133,t:0,i:1001}, D{l:5,t:11,i:389}, D{l:8,t:11,i:636}, D{l:137,t:11,i:229}, D{l:5,t:0,i:446}, D{l:7,t:10,i:872}, D{l:10,t:10,i:516}, D{l:139,t:10,i:167}, D{l:137,t:10,i:313}, D{l:132,t:10,i:224}, D{l:134,t:0,i:1313}, D{l:5,t:10,i:546}, D{l:7,t:10,i:35}, D{l:8,t:10,i:11}, D{l:8,t:10,i:12}, D{l:9,t:10,i:315}, D{l:9,t:10,i:533}, D{l:10,t:10,i:802}, D{l:11,t:10,i:166}, D{l:12,t:10,i:525}, D{l:142,t:10,i:243}, D{l:6,t:0,i:636}, D{l:137,t:0,i:837}, D{l:5,t:10,i:241}, D{l:8,t:10,i:242}, D{l:9,t:10,i:451}, D{l:10,t:10,i:667}, D{l:11,t:10,i:598}, D{l:140,t:10,i:429}, D{l:22,t:10,i:46}, D{l:150,t:11,i:46}, D{l:136,t:11,i:472}, D{l:11,t:0,i:278}, D{l:142,t:0,i:73}, D{l:141,t:11,i:185}, D{l:132,t:0,i:868}, D{l:134,t:0,i:972}, D{l:4,t:10,i:366}, D{l:137,t:10,i:516}, D{l:138,t:0,i:1010}, D{l:5,t:11,i:189}, D{l:6,t:10,i:1736}, D{l:7,t:11,i:442}, D{l:7,t:11,i:443}, D{l:8,t:11,i:281}, D{l:12,t:11,i:174}, D{l:13,t:11,i:83}, D{l:141,t:11,i:261}, D{l:139,t:11,i:384}, D{l:6,t:11,i:2}, D{l:7,t:11,i:191}, D{l:7,t:11,i:446}, D{l:7,t:11,i:758}, D{l:7,t:11,i:1262}, D{l:7,t:11,i:1737}, D{l:8,t:11,i:22}, D{l:8,t:11,i:270}, D{l:8,t:11,i:612}, D{l:9,t:11,i:4}, D{l:9,t:11,i:167}, D{l:9,t:11,i:312}, D{l:9,t:11,i:436}, D{l:10,t:11,i:156}, D{l:10,t:11,i:216}, D{l:10,t:11,i:311}, D{l:10,t:11,i:623}, D{l:11,t:11,i:72}, D{l:11,t:11,i:330}, D{l:11,t:11,i:455}, D{l:12,t:11,i:101}, D{l:12,t:11,i:321}, D{l:12,t:11,i:504}, D{l:12,t:11,i:530}, D{l:12,t:11,i:543}, D{l:13,t:11,i:17}, D{l:13,t:11,i:156}, D{l:13,t:11,i:334}, D{l:14,t:11,i:48}, D{l:15,t:11,i:70}, D{l:17,t:11,i:60}, D{l:148,t:11,i:64}, D{l:6,t:10,i:331}, D{l:136,t:10,i:623}, D{l:135,t:0,i:1231}, D{l:132,t:0,i:304}, D{l:6,t:11,i:60}, D{l:7,t:11,i:670}, D{l:7,t:11,i:1327}, D{l:8,t:11,i:411}, D{l:8,t:11,i:435}, D{l:9,t:11,i:653}, D{l:9,t:11,i:740}, D{l:10,t:11,i:385}, D{l:11,t:11,i:222}, D{l:11,t:11,i:324}, D{l:11,t:11,i:829}, D{l:140,t:11,i:611}, D{l:7,t:0,i:506}, D{l:6,t:11,i:166}, D{l:7,t:11,i:374}, D{l:135,t:11,i:1174}, D{l:14,t:11,i:43}, D{l:146,t:11,i:21}, D{l:135,t:11,i:1694}, D{l:135,t:10,i:1888}, D{l:5,t:11,i:206}, D{l:134,t:11,i:398}, D{l:135,t:11,i:50}, D{l:150,t:0,i:26}, D{l:6,t:0,i:53}, D{l:6,t:0,i:199}, D{l:7,t:0,i:1408}, D{l:8,t:0,i:32}, D{l:8,t:0,i:93}, D{l:10,t:0,i:397}, D{l:10,t:0,i:629}, D{l:11,t:0,i:593}, D{l:11,t:0,i:763}, D{l:13,t:0,i:326}, D{l:145,t:0,i:35}, D{l:134,t:0,i:105}, D{l:132,t:10,i:394}, D{l:4,t:0,i:843}, D{l:138,t:0,i:794}, D{l:11,t:0,i:704}, D{l:141,t:0,i:396}, D{l:5,t:0,i:114}, D{l:5,t:0,i:255}, D{l:141,t:0,i:285}, D{l:6,t:0,i:619}, D{l:7,t:0,i:898}, D{l:7,t:0,i:1092}, D{l:8,t:0,i:485}, D{l:18,t:0,i:28}, D{l:19,t:0,i:116}, D{l:135,t:10,i:1931}, D{l:9,t:0,i:145}, D{l:7,t:10,i:574}, D{l:135,t:10,i:1719}, D{l:7,t:0,i:2035}, D{l:8,t:0,i:19}, D{l:9,t:0,i:89}, D{l:138,t:0,i:831}, D{l:132,t:10,i:658}, D{l:6,t:11,i:517}, D{l:7,t:11,i:1159}, D{l:10,t:11,i:621}, D{l:139,t:11,i:192}, D{l:7,t:0,i:1933}, D{l:7,t:11,i:1933}, D{l:9,t:10,i:781}, D{l:10,t:10,i:144}, D{l:11,t:10,i:385}, D{l:13,t:10,i:161}, D{l:13,t:10,i:228}, D{l:13,t:10,i:268}, D{l:148,t:10,i:107}, D{l:136,t:10,i:374}, D{l:10,t:11,i:223}, D{l:139,t:11,i:645}, D{l:135,t:0,i:1728}, D{l:7,t:11,i:64}, D{l:7,t:11,i:289}, D{l:136,t:11,i:245}, D{l:4,t:10,i:344}, D{l:6,t:10,i:498}, D{l:139,t:10,i:323}, D{l:136,t:0,i:746}, D{l:135,t:10,i:1063}, D{l:137,t:10,i:155}, D{l:4,t:0,i:987}, D{l:6,t:0,i:1964}, D{l:6,t:0,i:1974}, D{l:6,t:0,i:1990}, D{l:136,t:0,i:995}, D{l:133,t:11,i:609}, D{l:133,t:10,i:906}, D{l:134,t:0,i:1550}, D{l:134,t:0,i:874}, D{l:5,t:11,i:129}, D{l:6,t:11,i:61}, D{l:135,t:11,i:947}, D{l:4,t:0,i:1018}, D{l:6,t:0,i:1938}, D{l:6,t:0,i:2021}, D{l:134,t:0,i:2039}, D{l:132,t:0,i:814}, D{l:11,t:0,i:126}, D{l:139,t:0,i:287}, D{l:134,t:0,i:1264}, D{l:5,t:0,i:955}, D{l:136,t:0,i:814}, D{l:141,t:11,i:506}, D{l:132,t:11,i:314}, D{l:6,t:0,i:981}, D{l:139,t:11,i:1000}, D{l:5,t:0,i:56}, D{l:8,t:0,i:892}, D{l:8,t:0,i:915}, D{l:140,t:0,i:776}, D{l:148,t:0,i:100}, D{l:10,t:0,i:4}, D{l:10,t:0,i:13}, D{l:11,t:0,i:638}, D{l:148,t:0,i:57}, D{l:148,t:11,i:74}, D{l:5,t:0,i:738}, D{l:132,t:10,i:616}, D{l:133,t:11,i:637}, D{l:136,t:10,i:692}, D{l:133,t:0,i:758}, D{l:132,t:10,i:305}, D{l:137,t:11,i:590}, D{l:5,t:11,i:280}, D{l:135,t:11,i:1226}, D{l:134,t:11,i:494}, D{l:135,t:0,i:1112}, D{l:133,t:11,i:281}, D{l:13,t:0,i:44}, D{l:14,t:0,i:214}, D{l:5,t:10,i:214}, D{l:7,t:10,i:603}, D{l:8,t:10,i:611}, D{l:9,t:10,i:686}, D{l:10,t:10,i:88}, D{l:11,t:10,i:459}, D{l:11,t:10,i:496}, D{l:12,t:10,i:463}, D{l:140,t:10,i:590}, D{l:139,t:0,i:328}, D{l:135,t:11,i:1064}, D{l:137,t:0,i:133}, D{l:7,t:0,i:168}, D{l:13,t:0,i:196}, D{l:141,t:0,i:237}, D{l:134,t:10,i:1703}, D{l:134,t:0,i:1152}, D{l:135,t:0,i:1245}, D{l:5,t:0,i:110}, D{l:6,t:0,i:169}, D{l:6,t:0,i:1702}, D{l:7,t:0,i:400}, D{l:8,t:0,i:538}, D{l:9,t:0,i:184}, D{l:9,t:0,i:524}, D{l:140,t:0,i:218}, D{l:6,t:0,i:1816}, D{l:10,t:0,i:871}, D{l:12,t:0,i:769}, D{l:140,t:0,i:785}, D{l:132,t:11,i:630}, D{l:7,t:11,i:33}, D{l:7,t:11,i:120}, D{l:8,t:11,i:489}, D{l:9,t:11,i:319}, D{l:10,t:11,i:820}, D{l:11,t:11,i:1004}, D{l:12,t:11,i:379}, D{l:13,t:11,i:117}, D{l:13,t:11,i:412}, D{l:14,t:11,i:25}, D{l:15,t:11,i:52}, D{l:15,t:11,i:161}, D{l:16,t:11,i:47}, D{l:149,t:11,i:2}, D{l:6,t:0,i:133}, D{l:8,t:0,i:413}, D{l:9,t:0,i:353}, D{l:139,t:0,i:993}, D{l:145,t:10,i:19}, D{l:4,t:11,i:937}, D{l:133,t:11,i:801}, D{l:134,t:0,i:978}, D{l:6,t:0,i:93}, D{l:6,t:0,i:1508}, D{l:7,t:0,i:1422}, D{l:7,t:0,i:1851}, D{l:8,t:0,i:673}, D{l:9,t:0,i:529}, D{l:140,t:0,i:43}, D{l:6,t:0,i:317}, D{l:10,t:0,i:512}, D{l:4,t:10,i:737}, D{l:11,t:10,i:294}, D{l:12,t:10,i:60}, D{l:12,t:10,i:437}, D{l:13,t:10,i:64}, D{l:13,t:10,i:380}, D{l:142,t:10,i:430}, D{l:9,t:0,i:371}, D{l:7,t:11,i:1591}, D{l:144,t:11,i:43}, D{l:6,t:10,i:1758}, D{l:8,t:10,i:520}, D{l:9,t:10,i:345}, D{l:9,t:10,i:403}, D{l:142,t:10,i:350}, D{l:5,t:0,i:526}, D{l:10,t:10,i:242}, D{l:138,t:10,i:579}, D{l:9,t:0,i:25}, D{l:10,t:0,i:467}, D{l:138,t:0,i:559}, D{l:5,t:10,i:139}, D{l:7,t:10,i:1168}, D{l:138,t:10,i:539}, D{l:4,t:0,i:335}, D{l:135,t:0,i:942}, D{l:140,t:0,i:754}, D{l:132,t:11,i:365}, D{l:11,t:0,i:182}, D{l:142,t:0,i:195}, D{l:142,t:11,i:29}, D{l:5,t:11,i:7}, D{l:139,t:11,i:774}, D{l:4,t:11,i:746}, D{l:135,t:11,i:1090}, D{l:8,t:0,i:39}, D{l:10,t:0,i:773}, D{l:11,t:0,i:84}, D{l:12,t:0,i:205}, D{l:142,t:0,i:1}, D{l:5,t:0,i:601}, D{l:5,t:0,i:870}, D{l:5,t:11,i:360}, D{l:136,t:11,i:237}, D{l:132,t:0,i:181}, D{l:136,t:0,i:370}, D{l:134,t:0,i:1652}, D{l:8,t:0,i:358}, D{l:4,t:10,i:107}, D{l:7,t:10,i:613}, D{l:8,t:10,i:439}, D{l:8,t:10,i:504}, D{l:9,t:10,i:501}, D{l:10,t:10,i:383}, D{l:139,t:10,i:477}, D{l:132,t:10,i:229}, D{l:137,t:11,i:785}, D{l:4,t:0,i:97}, D{l:5,t:0,i:147}, D{l:6,t:0,i:286}, D{l:7,t:0,i:1362}, D{l:141,t:0,i:176}, D{l:6,t:0,i:537}, D{l:7,t:0,i:788}, D{l:7,t:0,i:1816}, D{l:132,t:10,i:903}, D{l:140,t:10,i:71}, D{l:6,t:0,i:743}, D{l:134,t:0,i:1223}, D{l:6,t:0,i:375}, D{l:7,t:0,i:169}, D{l:7,t:0,i:254}, D{l:8,t:0,i:780}, D{l:135,t:11,i:1493}, D{l:7,t:0,i:1714}, D{l:4,t:10,i:47}, D{l:6,t:10,i:373}, D{l:7,t:10,i:452}, D{l:7,t:10,i:543}, D{l:7,t:10,i:1856}, D{l:9,t:10,i:6}, D{l:11,t:10,i:257}, D{l:139,t:10,i:391}, D{l:6,t:0,i:896}, D{l:136,t:0,i:1003}, D{l:135,t:0,i:1447}, D{l:137,t:11,i:341}, D{l:5,t:10,i:980}, D{l:134,t:10,i:1754}, D{l:145,t:11,i:22}, D{l:4,t:11,i:277}, D{l:5,t:11,i:608}, D{l:6,t:11,i:493}, D{l:7,t:11,i:457}, D{l:140,t:11,i:384}, D{l:7,t:10,i:536}, D{l:7,t:10,i:1331}, D{l:136,t:10,i:143}, D{l:140,t:0,i:744}, D{l:7,t:11,i:27}, D{l:135,t:11,i:316}, D{l:18,t:0,i:126}, D{l:5,t:10,i:19}, D{l:134,t:10,i:533}, D{l:4,t:0,i:788}, D{l:11,t:0,i:41}, D{l:5,t:11,i:552}, D{l:5,t:11,i:586}, D{l:5,t:11,i:676}, D{l:6,t:11,i:448}, D{l:8,t:11,i:244}, D{l:11,t:11,i:1}, D{l:11,t:11,i:41}, D{l:13,t:11,i:3}, D{l:16,t:11,i:54}, D{l:17,t:11,i:4}, D{l:146,t:11,i:13}, D{l:4,t:0,i:985}, D{l:6,t:0,i:1801}, D{l:4,t:11,i:401}, D{l:137,t:11,i:264}, D{l:5,t:10,i:395}, D{l:5,t:10,i:951}, D{l:134,t:10,i:1776}, D{l:5,t:0,i:629}, D{l:135,t:0,i:1549}, D{l:11,t:10,i:663}, D{l:12,t:10,i:210}, D{l:13,t:10,i:166}, D{l:13,t:10,i:310}, D{l:14,t:10,i:373}, D{l:147,t:10,i:43}, D{l:9,t:11,i:543}, D{l:10,t:11,i:524}, D{l:11,t:11,i:30}, D{l:12,t:11,i:524}, D{l:14,t:11,i:315}, D{l:16,t:11,i:18}, D{l:20,t:11,i:26}, D{l:148,t:11,i:65}, D{l:4,t:11,i:205}, D{l:5,t:11,i:623}, D{l:7,t:11,i:104}, D{l:136,t:11,i:519}, D{l:5,t:0,i:293}, D{l:134,t:0,i:601}, D{l:7,t:11,i:579}, D{l:9,t:11,i:41}, D{l:9,t:11,i:244}, D{l:9,t:11,i:669}, D{l:10,t:11,i:5}, D{l:11,t:11,i:861}, D{l:11,t:11,i:951}, D{l:139,t:11,i:980}, D{l:132,t:11,i:717}, D{l:132,t:10,i:695}, D{l:7,t:10,i:497}, D{l:9,t:10,i:387}, D{l:147,t:10,i:81}, D{l:132,t:0,i:420}, D{l:142,t:0,i:37}, D{l:6,t:0,i:1134}, D{l:6,t:0,i:1900}, D{l:12,t:0,i:830}, D{l:12,t:0,i:878}, D{l:12,t:0,i:894}, D{l:15,t:0,i:221}, D{l:143,t:0,i:245}, D{l:132,t:11,i:489}, D{l:7,t:0,i:1570}, D{l:140,t:0,i:542}, D{l:8,t:0,i:933}, D{l:136,t:0,i:957}, D{l:6,t:0,i:1371}, D{l:7,t:0,i:31}, D{l:8,t:0,i:373}, D{l:5,t:10,i:284}, D{l:6,t:10,i:49}, D{l:6,t:10,i:350}, D{l:7,t:10,i:377}, D{l:7,t:10,i:1693}, D{l:8,t:10,i:678}, D{l:9,t:10,i:161}, D{l:9,t:10,i:585}, D{l:9,t:10,i:671}, D{l:9,t:10,i:839}, D{l:11,t:10,i:912}, D{l:141,t:10,i:427}, D{l:135,t:11,i:892}, D{l:4,t:0,i:325}, D{l:138,t:0,i:125}, D{l:139,t:11,i:47}, D{l:132,t:10,i:597}, D{l:138,t:0,i:323}, D{l:6,t:0,i:1547}, D{l:7,t:11,i:1605}, D{l:9,t:11,i:473}, D{l:11,t:11,i:962}, D{l:146,t:11,i:139}, D{l:139,t:10,i:908}, D{l:7,t:11,i:819}, D{l:9,t:11,i:26}, D{l:9,t:11,i:392}, D{l:10,t:11,i:152}, D{l:10,t:11,i:226}, D{l:11,t:11,i:19}, D{l:12,t:11,i:276}, D{l:12,t:11,i:426}, D{l:12,t:11,i:589}, D{l:13,t:11,i:460}, D{l:15,t:11,i:97}, D{l:19,t:11,i:48}, D{l:148,t:11,i:104}, D{l:135,t:11,i:51}, D{l:4,t:0,i:718}, D{l:135,t:0,i:1216}, D{l:6,t:0,i:1896}, D{l:6,t:0,i:1905}, D{l:6,t:0,i:1912}, D{l:9,t:0,i:947}, D{l:9,t:0,i:974}, D{l:12,t:0,i:809}, D{l:12,t:0,i:850}, D{l:12,t:0,i:858}, D{l:12,t:0,i:874}, D{l:12,t:0,i:887}, D{l:12,t:0,i:904}, D{l:12,t:0,i:929}, D{l:12,t:0,i:948}, D{l:12,t:0,i:952}, D{l:15,t:0,i:198}, D{l:15,t:0,i:206}, D{l:15,t:0,i:220}, D{l:15,t:0,i:227}, D{l:15,t:0,i:247}, D{l:18,t:0,i:188}, D{l:21,t:0,i:48}, D{l:21,t:0,i:50}, D{l:24,t:0,i:25}, D{l:24,t:0,i:29}, D{l:7,t:11,i:761}, D{l:7,t:11,i:1051}, D{l:137,t:11,i:545}, D{l:5,t:0,i:124}, D{l:5,t:0,i:144}, D{l:6,t:0,i:548}, D{l:7,t:0,i:15}, D{l:7,t:0,i:153}, D{l:137,t:0,i:629}, D{l:135,t:11,i:606}, D{l:135,t:10,i:2014}, D{l:7,t:10,i:2007}, D{l:9,t:11,i:46}, D{l:9,t:10,i:101}, D{l:9,t:10,i:450}, D{l:10,t:10,i:66}, D{l:10,t:10,i:842}, D{l:11,t:10,i:536}, D{l:140,t:10,i:587}, D{l:6,t:0,i:75}, D{l:7,t:0,i:1531}, D{l:8,t:0,i:416}, D{l:9,t:0,i:240}, D{l:9,t:0,i:275}, D{l:10,t:0,i:100}, D{l:11,t:0,i:658}, D{l:11,t:0,i:979}, D{l:12,t:0,i:86}, D{l:14,t:0,i:207}, D{l:15,t:0,i:20}, D{l:143,t:0,i:25}, D{l:5,t:0,i:141}, D{l:5,t:0,i:915}, D{l:6,t:0,i:1783}, D{l:7,t:0,i:211}, D{l:7,t:0,i:698}, D{l:7,t:0,i:1353}, D{l:9,t:0,i:83}, D{l:9,t:0,i:281}, D{l:10,t:0,i:376}, D{l:10,t:0,i:431}, D{l:11,t:0,i:543}, D{l:12,t:0,i:664}, D{l:13,t:0,i:280}, D{l:13,t:0,i:428}, D{l:14,t:0,i:61}, D{l:14,t:0,i:128}, D{l:17,t:0,i:52}, D{l:145,t:0,i:81}, D{l:132,t:11,i:674}, D{l:135,t:0,i:533}, D{l:149,t:0,i:6}, D{l:132,t:11,i:770}, D{l:133,t:0,i:538}, D{l:5,t:11,i:79}, D{l:7,t:11,i:1027}, D{l:7,t:11,i:1477}, D{l:139,t:11,i:52}, D{l:139,t:10,i:62}, D{l:4,t:0,i:338}, D{l:133,t:0,i:400}, D{l:5,t:11,i:789}, D{l:134,t:11,i:195}, D{l:4,t:11,i:251}, D{l:4,t:11,i:688}, D{l:7,t:11,i:513}, D{l:7,t:11,i:1284}, D{l:9,t:11,i:87}, D{l:138,t:11,i:365}, D{l:134,t:10,i:1766}, D{l:6,t:0,i:0}, D{l:7,t:0,i:84}, D{l:11,t:0,i:895}, D{l:145,t:0,i:11}, D{l:139,t:0,i:892}, D{l:4,t:0,i:221}, D{l:5,t:0,i:659}, D{l:7,t:0,i:697}, D{l:7,t:0,i:1211}, D{l:138,t:0,i:284}, D{l:133,t:0,i:989}, D{l:133,t:11,i:889}, D{l:4,t:11,i:160}, D{l:5,t:11,i:330}, D{l:7,t:11,i:1434}, D{l:136,t:11,i:174}, D{l:6,t:10,i:1665}, D{l:7,t:10,i:256}, D{l:7,t:10,i:1388}, D{l:10,t:10,i:499}, D{l:139,t:10,i:670}, D{l:7,t:0,i:848}, D{l:4,t:10,i:22}, D{l:5,t:10,i:10}, D{l:136,t:10,i:97}, D{l:138,t:0,i:507}, D{l:133,t:10,i:481}, D{l:4,t:0,i:188}, D{l:135,t:0,i:805}, D{l:5,t:0,i:884}, D{l:6,t:0,i:732}, D{l:139,t:0,i:991}, D{l:135,t:11,i:968}, D{l:11,t:11,i:636}, D{l:15,t:11,i:145}, D{l:17,t:11,i:34}, D{l:19,t:11,i:50}, D{l:151,t:11,i:20}, D{l:7,t:0,i:959}, D{l:16,t:0,i:60}, D{l:6,t:10,i:134}, D{l:7,t:10,i:437}, D{l:9,t:10,i:37}, D{l:14,t:10,i:285}, D{l:142,t:10,i:371}, D{l:7,t:10,i:486}, D{l:8,t:10,i:155}, D{l:11,t:10,i:93}, D{l:140,t:10,i:164}, D{l:134,t:0,i:1653}, D{l:7,t:0,i:337}, D{l:133,t:10,i:591}, D{l:6,t:0,i:1989}, D{l:8,t:0,i:922}, D{l:8,t:0,i:978}, D{l:133,t:11,i:374}, D{l:132,t:0,i:638}, D{l:138,t:0,i:500}, D{l:133,t:11,i:731}, D{l:5,t:10,i:380}, D{l:5,t:10,i:650}, D{l:136,t:10,i:310}, D{l:138,t:11,i:381}, D{l:4,t:10,i:364}, D{l:7,t:10,i:1156}, D{l:7,t:10,i:1187}, D{l:137,t:10,i:409}, D{l:137,t:11,i:224}, D{l:140,t:0,i:166}, D{l:134,t:10,i:482}, D{l:4,t:11,i:626}, D{l:5,t:11,i:642}, D{l:6,t:11,i:425}, D{l:10,t:11,i:202}, D{l:139,t:11,i:141}, D{l:4,t:10,i:781}, D{l:6,t:10,i:487}, D{l:7,t:10,i:926}, D{l:8,t:10,i:263}, D{l:139,t:10,i:500}, D{l:135,t:0,i:418}, D{l:4,t:10,i:94}, D{l:135,t:10,i:1265}, D{l:136,t:0,i:760}, D{l:132,t:10,i:417}, D{l:136,t:11,i:835}, D{l:5,t:10,i:348}, D{l:134,t:10,i:522}, D{l:6,t:0,i:1277}, D{l:134,t:0,i:1538}, D{l:139,t:11,i:541}, D{l:135,t:11,i:1597}, D{l:5,t:11,i:384}, D{l:8,t:11,i:455}, D{l:140,t:11,i:48}, D{l:136,t:0,i:770}, D{l:5,t:11,i:264}, D{l:134,t:11,i:184}, D{l:4,t:0,i:89}, D{l:5,t:0,i:489}, D{l:6,t:0,i:315}, D{l:7,t:0,i:553}, D{l:7,t:0,i:1745}, D{l:138,t:0,i:243}, D{l:4,t:10,i:408}, D{l:4,t:10,i:741}, D{l:135,t:10,i:500}, D{l:134,t:0,i:1396}, D{l:133,t:0,i:560}, D{l:6,t:0,i:1658}, D{l:9,t:0,i:3}, D{l:10,t:0,i:154}, D{l:11,t:0,i:641}, D{l:13,t:0,i:85}, D{l:13,t:0,i:201}, D{l:141,t:0,i:346}, D{l:135,t:11,i:1595}, D{l:5,t:11,i:633}, D{l:6,t:11,i:28}, D{l:7,t:11,i:219}, D{l:135,t:11,i:1323}, D{l:9,t:11,i:769}, D{l:140,t:11,i:185}, D{l:135,t:11,i:785}, D{l:7,t:11,i:359}, D{l:8,t:11,i:243}, D{l:140,t:11,i:175}, D{l:138,t:0,i:586}, D{l:7,t:0,i:1271}, D{l:134,t:10,i:73}, D{l:132,t:11,i:105}, D{l:4,t:0,i:166}, D{l:5,t:0,i:505}, D{l:134,t:0,i:1670}, D{l:133,t:10,i:576}, D{l:4,t:11,i:324}, D{l:138,t:11,i:104}, D{l:142,t:10,i:231}, D{l:6,t:0,i:637}, D{l:7,t:10,i:1264}, D{l:7,t:10,i:1678}, D{l:11,t:10,i:945}, D{l:12,t:10,i:341}, D{l:12,t:10,i:471}, D{l:12,t:10,i:569}, D{l:23,t:11,i:21}, D{l:151,t:11,i:23}, D{l:8,t:11,i:559}, D{l:141,t:11,i:109}, D{l:134,t:0,i:1947}, D{l:7,t:0,i:445}, D{l:8,t:0,i:307}, D{l:8,t:0,i:704}, D{l:10,t:0,i:41}, D{l:10,t:0,i:439}, D{l:11,t:0,i:237}, D{l:11,t:0,i:622}, D{l:140,t:0,i:201}, D{l:135,t:11,i:963}, D{l:135,t:0,i:1977}, D{l:4,t:0,i:189}, D{l:5,t:0,i:713}, D{l:136,t:0,i:57}, D{l:138,t:0,i:371}, D{l:135,t:10,i:538}, D{l:132,t:0,i:552}, D{l:6,t:0,i:883}, D{l:133,t:10,i:413}, D{l:6,t:0,i:923}, D{l:132,t:11,i:758}, D{l:138,t:11,i:215}, D{l:136,t:10,i:495}, D{l:7,t:10,i:54}, D{l:8,t:10,i:312}, D{l:10,t:10,i:191}, D{l:10,t:10,i:614}, D{l:140,t:10,i:567}, D{l:7,t:11,i:351}, D{l:139,t:11,i:128}, D{l:7,t:0,i:875}, D{l:6,t:10,i:468}, D{l:7,t:10,i:1478}, D{l:8,t:10,i:530}, D{l:142,t:10,i:290}, D{l:135,t:0,i:1788}, D{l:17,t:0,i:49}, D{l:133,t:11,i:918}, D{l:12,t:11,i:398}, D{l:20,t:11,i:39}, D{l:21,t:11,i:11}, D{l:150,t:11,i:41}, D{l:10,t:0,i:661}, D{l:6,t:10,i:484}, D{l:135,t:10,i:822}, D{l:135,t:0,i:1945}, D{l:134,t:0,i:794}, D{l:137,t:10,i:900}, D{l:135,t:10,i:1335}, D{l:6,t:10,i:1724}, D{l:135,t:10,i:2022}, D{l:132,t:11,i:340}, D{l:134,t:0,i:1135}, D{l:4,t:0,i:784}, D{l:133,t:0,i:745}, D{l:5,t:0,i:84}, D{l:134,t:0,i:163}, D{l:133,t:0,i:410}, D{l:4,t:0,i:976}, D{l:5,t:11,i:985}, D{l:7,t:11,i:509}, D{l:7,t:11,i:529}, D{l:145,t:11,i:96}, D{l:132,t:10,i:474}, D{l:134,t:0,i:703}, D{l:135,t:11,i:1919}, D{l:5,t:0,i:322}, D{l:8,t:0,i:186}, D{l:9,t:0,i:262}, D{l:10,t:0,i:187}, D{l:142,t:0,i:208}, D{l:135,t:10,i:1504}, D{l:133,t:0,i:227}, D{l:9,t:0,i:560}, D{l:13,t:0,i:208}, D{l:133,t:10,i:305}, D{l:132,t:11,i:247}, D{l:7,t:0,i:1395}, D{l:8,t:0,i:486}, D{l:9,t:0,i:236}, D{l:9,t:0,i:878}, D{l:10,t:0,i:218}, D{l:11,t:0,i:95}, D{l:19,t:0,i:17}, D{l:147,t:0,i:31}, D{l:7,t:0,i:2043}, D{l:8,t:0,i:672}, D{l:141,t:0,i:448}, D{l:4,t:11,i:184}, D{l:5,t:11,i:390}, D{l:6,t:11,i:337}, D{l:7,t:11,i:23}, D{l:7,t:11,i:494}, D{l:7,t:11,i:618}, D{l:7,t:11,i:1456}, D{l:8,t:11,i:27}, D{l:8,t:11,i:599}, D{l:10,t:11,i:153}, D{l:139,t:11,i:710}, D{l:135,t:0,i:466}, D{l:135,t:10,i:1236}, D{l:6,t:0,i:167}, D{l:7,t:0,i:186}, D{l:7,t:0,i:656}, D{l:10,t:0,i:643}, D{l:4,t:10,i:480}, D{l:6,t:10,i:302}, D{l:6,t:10,i:1642}, D{l:7,t:10,i:837}, D{l:7,t:10,i:1547}, D{l:7,t:10,i:1657}, D{l:8,t:10,i:429}, D{l:9,t:10,i:228}, D{l:13,t:10,i:289}, D{l:13,t:10,i:343}, D{l:147,t:10,i:101}, D{l:134,t:0,i:1428}, D{l:134,t:0,i:1440}, D{l:5,t:0,i:412}, D{l:7,t:10,i:278}, D{l:10,t:10,i:739}, D{l:11,t:10,i:708}, D{l:141,t:10,i:348}, D{l:134,t:0,i:1118}, D{l:136,t:0,i:562}, D{l:148,t:11,i:46}, D{l:9,t:0,i:316}, D{l:139,t:0,i:256}, D{l:134,t:0,i:1771}, D{l:135,t:0,i:1190}, D{l:137,t:0,i:132}, D{l:10,t:11,i:227}, D{l:11,t:11,i:497}, D{l:11,t:11,i:709}, D{l:140,t:11,i:415}, D{l:143,t:0,i:66}, D{l:6,t:11,i:360}, D{l:7,t:11,i:1664}, D{l:136,t:11,i:478}, D{l:144,t:10,i:28}, D{l:4,t:0,i:317}, D{l:135,t:0,i:1279}, D{l:5,t:0,i:63}, D{l:133,t:0,i:509}, D{l:136,t:11,i:699}, D{l:145,t:10,i:36}, D{l:134,t:0,i:1475}, D{l:11,t:11,i:343}, D{l:142,t:11,i:127}, D{l:132,t:11,i:739}, D{l:132,t:0,i:288}, D{l:135,t:11,i:1757}, D{l:8,t:0,i:89}, D{l:8,t:0,i:620}, D{l:9,t:0,i:608}, D{l:11,t:0,i:628}, D{l:12,t:0,i:322}, D{l:143,t:0,i:124}, D{l:134,t:0,i:1225}, D{l:7,t:0,i:1189}, D{l:4,t:11,i:67}, D{l:5,t:11,i:422}, D{l:6,t:10,i:363}, D{l:7,t:11,i:1037}, D{l:7,t:11,i:1289}, D{l:7,t:11,i:1555}, D{l:7,t:10,i:1955}, D{l:8,t:10,i:725}, D{l:9,t:11,i:741}, D{l:145,t:11,i:108}, D{l:134,t:0,i:1468}, D{l:6,t:0,i:689}, D{l:134,t:0,i:1451}, D{l:138,t:0,i:120}, D{l:151,t:0,i:1}, D{l:137,t:10,i:805}, D{l:142,t:0,i:329}, D{l:5,t:10,i:813}, D{l:135,t:10,i:2046}, D{l:135,t:0,i:226}, D{l:138,t:11,i:96}, D{l:7,t:0,i:1855}, D{l:5,t:10,i:712}, D{l:11,t:10,i:17}, D{l:13,t:10,i:321}, D{l:144,t:10,i:67}, D{l:9,t:0,i:461}, D{l:6,t:10,i:320}, D{l:7,t:10,i:781}, D{l:7,t:10,i:1921}, D{l:9,t:10,i:55}, D{l:10,t:10,i:186}, D{l:10,t:10,i:273}, D{l:10,t:10,i:664}, D{l:10,t:10,i:801}, D{l:11,t:10,i:996}, D{l:11,t:10,i:997}, D{l:13,t:10,i:157}, D{l:142,t:10,i:170}, D{l:8,t:11,i:203}, D{l:8,t:10,i:271}, D{l:11,t:11,i:823}, D{l:11,t:11,i:846}, D{l:12,t:11,i:482}, D{l:13,t:11,i:133}, D{l:13,t:11,i:277}, D{l:13,t:11,i:302}, D{l:13,t:11,i:464}, D{l:14,t:11,i:205}, D{l:142,t:11,i:221}, D{l:135,t:0,i:1346}, D{l:4,t:11,i:449}, D{l:133,t:11,i:718}, D{l:134,t:0,i:85}, D{l:14,t:0,i:299}, D{l:7,t:10,i:103}, D{l:7,t:10,i:863}, D{l:11,t:10,i:184}, D{l:145,t:10,i:62}, D{l:4,t:11,i:355}, D{l:6,t:11,i:311}, D{l:9,t:11,i:256}, D{l:138,t:11,i:404}, D{l:137,t:10,i:659}, D{l:138,t:11,i:758}, D{l:133,t:11,i:827}, D{l:5,t:11,i:64}, D{l:140,t:11,i:581}, D{l:134,t:0,i:1171}, D{l:4,t:11,i:442}, D{l:7,t:11,i:1047}, D{l:7,t:11,i:1352}, D{l:135,t:11,i:1643}, D{l:132,t:0,i:980}, D{l:5,t:11,i:977}, D{l:6,t:11,i:288}, D{l:7,t:11,i:528}, D{l:135,t:11,i:1065}, D{l:5,t:0,i:279}, D{l:6,t:0,i:235}, D{l:7,t:0,i:468}, D{l:8,t:0,i:446}, D{l:9,t:0,i:637}, D{l:10,t:0,i:717}, D{l:11,t:0,i:738}, D{l:140,t:0,i:514}, D{l:132,t:0,i:293}, D{l:11,t:10,i:337}, D{l:142,t:10,i:303}, D{l:136,t:11,i:285}, D{l:5,t:0,i:17}, D{l:6,t:0,i:371}, D{l:9,t:0,i:528}, D{l:12,t:0,i:364}, D{l:132,t:11,i:254}, D{l:5,t:10,i:77}, D{l:7,t:10,i:1455}, D{l:10,t:10,i:843}, D{l:147,t:10,i:73}, D{l:150,t:0,i:5}, D{l:132,t:10,i:458}, D{l:6,t:11,i:12}, D{l:7,t:11,i:1219}, D{l:145,t:11,i:73}, D{l:135,t:10,i:1420}, D{l:6,t:10,i:109}, D{l:138,t:10,i:382}, D{l:135,t:11,i:125}, D{l:6,t:10,i:330}, D{l:7,t:10,i:1084}, D{l:139,t:10,i:142}, D{l:6,t:11,i:369}, D{l:6,t:11,i:502}, D{l:7,t:11,i:1036}, D{l:8,t:11,i:348}, D{l:9,t:11,i:452}, D{l:10,t:11,i:26}, D{l:11,t:11,i:224}, D{l:11,t:11,i:387}, D{l:11,t:11,i:772}, D{l:12,t:11,i:95}, D{l:12,t:11,i:629}, D{l:13,t:11,i:195}, D{l:13,t:11,i:207}, D{l:13,t:11,i:241}, D{l:14,t:11,i:260}, D{l:14,t:11,i:270}, D{l:143,t:11,i:140}, D{l:132,t:11,i:269}, D{l:5,t:11,i:480}, D{l:7,t:11,i:532}, D{l:7,t:11,i:1197}, D{l:7,t:11,i:1358}, D{l:8,t:11,i:291}, D{l:11,t:11,i:349}, D{l:142,t:11,i:396}, D{l:150,t:0,i:48}, D{l:10,t:0,i:601}, D{l:13,t:0,i:353}, D{l:141,t:0,i:376}, D{l:5,t:0,i:779}, D{l:5,t:0,i:807}, D{l:6,t:0,i:1655}, D{l:134,t:0,i:1676}, D{l:142,t:11,i:223}, D{l:4,t:0,i:196}, D{l:5,t:0,i:558}, D{l:133,t:0,i:949}, D{l:148,t:11,i:15}, D{l:135,t:11,i:1764}, D{l:134,t:0,i:1322}, D{l:132,t:0,i:752}, D{l:139,t:0,i:737}, D{l:135,t:11,i:657}, D{l:136,t:11,i:533}, D{l:135,t:0,i:412}, D{l:4,t:0,i:227}, D{l:5,t:0,i:159}, D{l:5,t:0,i:409}, D{l:7,t:0,i:80}, D{l:8,t:0,i:556}, D{l:10,t:0,i:479}, D{l:12,t:0,i:418}, D{l:14,t:0,i:50}, D{l:14,t:0,i:123}, D{l:14,t:0,i:192}, D{l:14,t:0,i:249}, D{l:14,t:0,i:295}, D{l:143,t:0,i:27}, D{l:7,t:0,i:1470}, D{l:8,t:0,i:66}, D{l:8,t:0,i:137}, D{l:8,t:0,i:761}, D{l:9,t:0,i:638}, D{l:11,t:0,i:80}, D{l:11,t:0,i:212}, D{l:11,t:0,i:368}, D{l:11,t:0,i:418}, D{l:12,t:0,i:8}, D{l:13,t:0,i:15}, D{l:16,t:0,i:61}, D{l:17,t:0,i:59}, D{l:19,t:0,i:28}, D{l:148,t:0,i:84}, D{l:135,t:10,i:1985}, D{l:4,t:11,i:211}, D{l:4,t:11,i:332}, D{l:5,t:11,i:335}, D{l:6,t:11,i:238}, D{l:7,t:11,i:269}, D{l:7,t:11,i:811}, D{l:7,t:11,i:1797}, D{l:8,t:10,i:122}, D{l:8,t:11,i:836}, D{l:9,t:11,i:507}, D{l:141,t:11,i:242}, D{l:6,t:0,i:683}, D{l:134,t:0,i:1252}, D{l:4,t:0,i:873}, D{l:132,t:10,i:234}, D{l:134,t:0,i:835}, D{l:6,t:0,i:38}, D{l:7,t:0,i:1220}, D{l:8,t:0,i:185}, D{l:8,t:0,i:256}, D{l:9,t:0,i:22}, D{l:9,t:0,i:331}, D{l:10,t:0,i:738}, D{l:11,t:0,i:205}, D{l:11,t:0,i:540}, D{l:11,t:0,i:746}, D{l:13,t:0,i:465}, D{l:14,t:0,i:88}, D{l:142,t:0,i:194}, D{l:138,t:0,i:986}, D{l:5,t:11,i:1009}, D{l:12,t:11,i:582}, D{l:146,t:11,i:131}, D{l:4,t:0,i:159}, D{l:6,t:0,i:115}, D{l:7,t:0,i:252}, D{l:7,t:0,i:257}, D{l:7,t:0,i:1928}, D{l:8,t:0,i:69}, D{l:9,t:0,i:384}, D{l:10,t:0,i:91}, D{l:10,t:0,i:615}, D{l:12,t:0,i:375}, D{l:14,t:0,i:235}, D{l:18,t:0,i:117}, D{l:147,t:0,i:123}, D{l:133,t:0,i:911}, D{l:136,t:0,i:278}, D{l:5,t:10,i:430}, D{l:5,t:10,i:932}, D{l:6,t:10,i:131}, D{l:7,t:10,i:417}, D{l:9,t:10,i:522}, D{l:11,t:10,i:314}, D{l:141,t:10,i:390}, D{l:14,t:10,i:149}, D{l:14,t:10,i:399}, D{l:143,t:10,i:57}, D{l:4,t:0,i:151}, D{l:7,t:0,i:1567}, D{l:136,t:0,i:749}, D{l:5,t:11,i:228}, D{l:6,t:11,i:203}, D{l:7,t:11,i:156}, D{l:8,t:11,i:347}, D{l:137,t:11,i:265}, D{l:132,t:10,i:507}, D{l:10,t:0,i:989}, D{l:140,t:0,i:956}, D{l:133,t:0,i:990}, D{l:5,t:0,i:194}, D{l:6,t:0,i:927}, D{l:7,t:0,i:1662}, D{l:9,t:0,i:90}, D{l:140,t:0,i:564}, D{l:4,t:10,i:343}, D{l:133,t:10,i:511}, D{l:133,t:0,i:425}, D{l:7,t:10,i:455}, D{l:138,t:10,i:591}, D{l:4,t:0,i:774}, D{l:7,t:11,i:476}, D{l:7,t:11,i:1592}, D{l:138,t:11,i:87}, D{l:5,t:0,i:971}, D{l:135,t:10,i:1381}, D{l:5,t:11,i:318}, D{l:147,t:11,i:121}, D{l:5,t:11,i:291}, D{l:7,t:11,i:765}, D{l:9,t:11,i:389}, D{l:140,t:11,i:548}, D{l:134,t:10,i:575}, D{l:4,t:0,i:827}, D{l:12,t:0,i:646}, D{l:12,t:0,i:705}, D{l:12,t:0,i:712}, D{l:140,t:0,i:714}, D{l:139,t:0,i:752}, D{l:137,t:0,i:662}, D{l:5,t:0,i:72}, D{l:6,t:0,i:264}, D{l:7,t:0,i:21}, D{l:7,t:0,i:46}, D{l:7,t:0,i:2013}, D{l:8,t:0,i:215}, D{l:8,t:0,i:513}, D{l:10,t:0,i:266}, D{l:139,t:0,i:22}, D{l:139,t:11,i:522}, D{l:6,t:0,i:239}, D{l:7,t:0,i:118}, D{l:10,t:0,i:95}, D{l:11,t:0,i:603}, D{l:13,t:0,i:443}, D{l:14,t:0,i:160}, D{l:143,t:0,i:4}, D{l:6,t:0,i:431}, D{l:134,t:0,i:669}, D{l:7,t:10,i:1127}, D{l:7,t:10,i:1572}, D{l:10,t:10,i:297}, D{l:10,t:10,i:422}, D{l:11,t:10,i:764}, D{l:11,t:10,i:810}, D{l:12,t:10,i:264}, D{l:13,t:10,i:102}, D{l:13,t:10,i:300}, D{l:13,t:10,i:484}, D{l:14,t:10,i:147}, D{l:14,t:10,i:229}, D{l:17,t:10,i:71}, D{l:18,t:10,i:118}, D{l:147,t:10,i:120}, D{l:5,t:0,i:874}, D{l:6,t:0,i:1677}, D{l:15,t:0,i:0}, D{l:10,t:11,i:525}, D{l:139,t:11,i:82}, D{l:6,t:0,i:65}, D{l:7,t:0,i:939}, D{l:7,t:0,i:1172}, D{l:7,t:0,i:1671}, D{l:9,t:0,i:540}, D{l:10,t:0,i:696}, D{l:11,t:0,i:265}, D{l:11,t:0,i:732}, D{l:11,t:0,i:928}, D{l:11,t:0,i:937}, D{l:141,t:0,i:438}, D{l:134,t:0,i:1350}, D{l:136,t:11,i:547}, D{l:132,t:11,i:422}, D{l:5,t:11,i:355}, D{l:145,t:11,i:0}, D{l:137,t:11,i:905}, D{l:5,t:0,i:682}, D{l:135,t:0,i:1887}, D{l:132,t:0,i:809}, D{l:4,t:0,i:696}, D{l:133,t:11,i:865}, D{l:6,t:0,i:1074}, D{l:6,t:0,i:1472}, D{l:14,t:10,i:35}, D{l:142,t:10,i:191}, D{l:5,t:11,i:914}, D{l:134,t:11,i:1625}, D{l:133,t:11,i:234}, D{l:135,t:11,i:1383}, D{l:137,t:11,i:780}, D{l:132,t:10,i:125}, D{l:4,t:0,i:726}, D{l:133,t:0,i:630}, D{l:8,t:0,i:802}, D{l:136,t:0,i:838}, D{l:132,t:10,i:721}, D{l:6,t:0,i:1337}, D{l:7,t:0,i:776}, D{l:19,t:0,i:56}, D{l:136,t:10,i:145}, D{l:132,t:0,i:970}, D{l:7,t:10,i:792}, D{l:8,t:10,i:147}, D{l:10,t:10,i:821}, D{l:139,t:10,i:1021}, D{l:139,t:10,i:970}, D{l:8,t:0,i:940}, D{l:137,t:0,i:797}, D{l:135,t:11,i:1312}, D{l:9,t:0,i:248}, D{l:10,t:0,i:400}, D{l:7,t:11,i:816}, D{l:7,t:11,i:1241}, D{l:7,t:10,i:1999}, D{l:9,t:11,i:283}, D{l:9,t:11,i:520}, D{l:10,t:11,i:213}, D{l:10,t:11,i:307}, D{l:10,t:11,i:463}, D{l:10,t:11,i:671}, D{l:10,t:11,i:746}, D{l:11,t:11,i:401}, D{l:11,t:11,i:794}, D{l:12,t:11,i:517}, D{l:18,t:11,i:107}, D{l:147,t:11,i:115}, D{l:6,t:0,i:1951}, D{l:134,t:0,i:2040}, D{l:135,t:11,i:339}, D{l:13,t:0,i:41}, D{l:15,t:0,i:93}, D{l:5,t:10,i:168}, D{l:5,t:10,i:930}, D{l:8,t:10,i:74}, D{l:9,t:10,i:623}, D{l:12,t:10,i:500}, D{l:140,t:10,i:579}, D{l:6,t:0,i:118}, D{l:7,t:0,i:215}, D{l:7,t:0,i:1521}, D{l:140,t:0,i:11}, D{l:6,t:10,i:220}, D{l:7,t:10,i:1101}, D{l:141,t:10,i:105}, D{l:6,t:11,i:421}, D{l:7,t:11,i:61}, D{l:7,t:11,i:1540}, D{l:10,t:11,i:11}, D{l:138,t:11,i:501}, D{l:7,t:0,i:615}, D{l:138,t:0,i:251}, D{l:140,t:11,i:631}, D{l:135,t:0,i:1044}, D{l:6,t:10,i:19}, D{l:7,t:10,i:1413}, D{l:139,t:10,i:428}, D{l:133,t:0,i:225}, D{l:7,t:10,i:96}, D{l:8,t:10,i:401}, D{l:8,t:10,i:703}, D{l:137,t:10,i:896}, D{l:145,t:10,i:116}, D{l:6,t:11,i:102}, D{l:7,t:11,i:72}, D{l:15,t:11,i:142}, D{l:147,t:11,i:67}, D{l:7,t:10,i:1961}, D{l:7,t:10,i:1965}, D{l:8,t:10,i:702}, D{l:136,t:10,i:750}, D{l:7,t:10,i:2030}, D{l:8,t:10,i:150}, D{l:8,t:10,i:737}, D{l:12,t:10,i:366}, D{l:151,t:11,i:30}, D{l:4,t:0,i:370}, D{l:5,t:0,i:756}, D{l:7,t:0,i:1326}, D{l:135,t:11,i:823}, D{l:8,t:10,i:800}, D{l:9,t:10,i:148}, D{l:9,t:10,i:872}, D{l:9,t:10,i:890}, D{l:11,t:10,i:309}, D{l:11,t:10,i:1001}, D{l:13,t:10,i:267}, D{l:141,t:10,i:323}, D{l:6,t:0,i:1662}, D{l:7,t:0,i:48}, D{l:8,t:0,i:771}, D{l:10,t:0,i:116}, D{l:13,t:0,i:104}, D{l:14,t:0,i:105}, D{l:14,t:0,i:184}, D{l:15,t:0,i:168}, D{l:19,t:0,i:92}, D{l:148,t:0,i:68}, D{l:10,t:0,i:209}, D{l:135,t:11,i:1870}, D{l:7,t:11,i:68}, D{l:8,t:11,i:48}, D{l:8,t:11,i:88}, D{l:8,t:11,i:582}, D{l:8,t:11,i:681}, D{l:9,t:11,i:373}, D{l:9,t:11,i:864}, D{l:11,t:11,i:157}, D{l:11,t:11,i:336}, D{l:11,t:11,i:843}, D{l:148,t:11,i:27}, D{l:134,t:0,i:930}, D{l:4,t:11,i:88}, D{l:5,t:11,i:137}, D{l:5,t:11,i:174}, D{l:5,t:11,i:777}, D{l:6,t:11,i:1664}, D{l:6,t:11,i:1725}, D{l:7,t:11,i:77}, D{l:7,t:11,i:426}, D{l:7,t:11,i:1317}, D{l:7,t:11,i:1355}, D{l:8,t:11,i:126}, D{l:8,t:11,i:563}, D{l:9,t:11,i:523}, D{l:9,t:11,i:750}, D{l:10,t:11,i:310}, D{l:10,t:11,i:836}, D{l:11,t:11,i:42}, D{l:11,t:11,i:318}, D{l:11,t:11,i:731}, D{l:12,t:11,i:68}, D{l:12,t:11,i:92}, D{l:12,t:11,i:507}, D{l:12,t:11,i:692}, D{l:13,t:11,i:81}, D{l:13,t:11,i:238}, D{l:13,t:11,i:374}, D{l:18,t:11,i:138}, D{l:19,t:11,i:78}, D{l:19,t:11,i:111}, D{l:20,t:11,i:55}, D{l:20,t:11,i:77}, D{l:148,t:11,i:92}, D{l:4,t:11,i:938}, D{l:135,t:11,i:1831}, D{l:5,t:10,i:547}, D{l:7,t:10,i:424}, D{l:8,t:11,i:617}, D{l:138,t:11,i:351}, D{l:6,t:0,i:1286}, D{l:6,t:11,i:1668}, D{l:7,t:11,i:1499}, D{l:8,t:11,i:117}, D{l:9,t:11,i:314}, D{l:138,t:11,i:174}, D{l:6,t:0,i:759}, D{l:6,t:0,i:894}, D{l:7,t:11,i:707}, D{l:139,t:11,i:563}, D{l:4,t:0,i:120}, D{l:135,t:0,i:1894}, D{l:9,t:0,i:385}, D{l:149,t:0,i:17}, D{l:138,t:0,i:429}, D{l:133,t:11,i:403}, D{l:5,t:0,i:820}, D{l:135,t:0,i:931}, D{l:10,t:0,i:199}, D{l:133,t:10,i:133}, D{l:6,t:0,i:151}, D{l:6,t:0,i:1675}, D{l:7,t:0,i:383}, D{l:151,t:0,i:10}, D{l:6,t:0,i:761}, D{l:136,t:10,i:187}, D{l:8,t:0,i:365}, D{l:10,t:10,i:0}, D{l:10,t:10,i:818}, D{l:139,t:10,i:988}, D{l:4,t:11,i:44}, D{l:5,t:11,i:311}, D{l:6,t:11,i:156}, D{l:7,t:11,i:639}, D{l:7,t:11,i:762}, D{l:7,t:11,i:1827}, D{l:9,t:11,i:8}, D{l:9,t:11,i:462}, D{l:148,t:11,i:83}, D{l:4,t:11,i:346}, D{l:7,t:11,i:115}, D{l:9,t:11,i:180}, D{l:9,t:11,i:456}, D{l:138,t:11,i:363}, D{l:136,t:10,i:685}, D{l:7,t:0,i:1086}, D{l:145,t:0,i:46}, D{l:6,t:0,i:1624}, D{l:11,t:0,i:11}, D{l:12,t:0,i:422}, D{l:13,t:0,i:444}, D{l:142,t:0,i:360}, D{l:6,t:0,i:1020}, D{l:6,t:0,i:1260}, D{l:134,t:0,i:1589}, D{l:4,t:0,i:43}, D{l:5,t:0,i:344}, D{l:5,t:0,i:357}, D{l:14,t:0,i:472}, D{l:150,t:0,i:58}, D{l:6,t:0,i:1864}, D{l:6,t:0,i:1866}, D{l:6,t:0,i:1868}, D{l:6,t:0,i:1869}, D{l:6,t:0,i:1874}, D{l:6,t:0,i:1877}, D{l:6,t:0,i:1903}, D{l:6,t:0,i:1911}, D{l:9,t:0,i:920}, D{l:9,t:0,i:921}, D{l:9,t:0,i:924}, D{l:9,t:0,i:946}, D{l:9,t:0,i:959}, D{l:9,t:0,i:963}, D{l:9,t:0,i:970}, D{l:9,t:0,i:997}, D{l:9,t:0,i:1008}, D{l:9,t:0,i:1017}, D{l:12,t:0,i:795}, D{l:12,t:0,i:797}, D{l:12,t:0,i:798}, D{l:12,t:0,i:800}, D{l:12,t:0,i:803}, D{l:12,t:0,i:811}, D{l:12,t:0,i:820}, D{l:12,t:0,i:821}, D{l:12,t:0,i:839}, D{l:12,t:0,i:841}, D{l:12,t:0,i:848}, D{l:12,t:0,i:911}, D{l:12,t:0,i:921}, D{l:12,t:0,i:922}, D{l:12,t:0,i:925}, D{l:12,t:0,i:937}, D{l:12,t:0,i:944}, D{l:12,t:0,i:945}, D{l:12,t:0,i:953}, D{l:15,t:0,i:184}, D{l:15,t:0,i:191}, D{l:15,t:0,i:199}, D{l:15,t:0,i:237}, D{l:15,t:0,i:240}, D{l:15,t:0,i:243}, D{l:15,t:0,i:246}, D{l:18,t:0,i:203}, D{l:21,t:0,i:40}, D{l:21,t:0,i:52}, D{l:21,t:0,i:57}, D{l:24,t:0,i:23}, D{l:24,t:0,i:28}, D{l:152,t:0,i:30}, D{l:134,t:0,i:725}, D{l:145,t:11,i:58}, D{l:133,t:0,i:888}, D{l:137,t:10,i:874}, D{l:4,t:0,i:711}, D{l:8,t:10,i:774}, D{l:10,t:10,i:670}, D{l:140,t:10,i:51}, D{l:144,t:11,i:40}, D{l:6,t:11,i:185}, D{l:7,t:11,i:1899}, D{l:139,t:11,i:673}, D{l:137,t:10,i:701}, D{l:137,t:0,i:440}, D{l:4,t:11,i:327}, D{l:5,t:11,i:478}, D{l:7,t:11,i:1332}, D{l:8,t:11,i:753}, D{l:140,t:11,i:227}, D{l:4,t:10,i:127}, D{l:5,t:10,i:350}, D{l:6,t:10,i:356}, D{l:8,t:10,i:426}, D{l:9,t:10,i:572}, D{l:10,t:10,i:247}, D{l:139,t:10,i:312}, D{l:5,t:11,i:1020}, D{l:133,t:11,i:1022}, D{l:4,t:11,i:103}, D{l:133,t:11,i:401}, D{l:6,t:0,i:1913}, D{l:6,t:0,i:1926}, D{l:6,t:0,i:1959}, D{l:9,t:0,i:914}, D{l:9,t:0,i:939}, D{l:9,t:0,i:952}, D{l:9,t:0,i:979}, D{l:9,t:0,i:990}, D{l:9,t:0,i:998}, D{l:9,t:0,i:1003}, D{l:9,t:0,i:1023}, D{l:12,t:0,i:827}, D{l:12,t:0,i:834}, D{l:12,t:0,i:845}, D{l:12,t:0,i:912}, D{l:12,t:0,i:935}, D{l:12,t:0,i:951}, D{l:15,t:0,i:172}, D{l:15,t:0,i:174}, D{l:18,t:0,i:198}, D{l:149,t:0,i:63}, D{l:5,t:0,i:958}, D{l:5,t:0,i:987}, D{l:4,t:11,i:499}, D{l:135,t:11,i:1421}, D{l:7,t:0,i:885}, D{l:6,t:10,i:59}, D{l:6,t:10,i:1762}, D{l:9,t:10,i:603}, D{l:141,t:10,i:397}, D{l:10,t:11,i:62}, D{l:141,t:11,i:164}, D{l:4,t:0,i:847}, D{l:135,t:0,i:326}, D{l:11,t:0,i:276}, D{l:142,t:0,i:293}, D{l:4,t:0,i:65}, D{l:5,t:0,i:479}, D{l:5,t:0,i:1004}, D{l:7,t:0,i:1913}, D{l:8,t:0,i:317}, D{l:9,t:0,i:302}, D{l:10,t:0,i:612}, D{l:13,t:0,i:22}, D{l:132,t:11,i:96}, D{l:4,t:0,i:261}, D{l:135,t:0,i:510}, D{l:135,t:0,i:1514}, D{l:6,t:10,i:111}, D{l:7,t:10,i:4}, D{l:8,t:10,i:163}, D{l:8,t:10,i:776}, D{l:138,t:10,i:566}, D{l:4,t:0,i:291}, D{l:9,t:0,i:515}, D{l:12,t:0,i:152}, D{l:12,t:0,i:443}, D{l:13,t:0,i:392}, D{l:142,t:0,i:357}, D{l:7,t:11,i:399}, D{l:135,t:11,i:1492}, D{l:4,t:0,i:589}, D{l:139,t:0,i:282}, D{l:6,t:11,i:563}, D{l:135,t:10,i:1994}, D{l:5,t:10,i:297}, D{l:135,t:10,i:1038}, D{l:4,t:0,i:130}, D{l:7,t:0,i:843}, D{l:135,t:0,i:1562}, D{l:5,t:0,i:42}, D{l:5,t:0,i:879}, D{l:7,t:0,i:245}, D{l:7,t:0,i:324}, D{l:7,t:0,i:1532}, D{l:11,t:0,i:463}, D{l:11,t:0,i:472}, D{l:13,t:0,i:363}, D{l:144,t:0,i:52}, D{l:4,t:0,i:134}, D{l:133,t:0,i:372}, D{l:133,t:0,i:680}, D{l:136,t:10,i:363}, D{l:6,t:0,i:1997}, D{l:8,t:0,i:935}, D{l:136,t:0,i:977}, D{l:4,t:0,i:810}, D{l:135,t:0,i:1634}, D{l:135,t:10,i:1675}, D{l:7,t:0,i:1390}, D{l:4,t:11,i:910}, D{l:133,t:11,i:832}, D{l:7,t:10,i:808}, D{l:8,t:11,i:266}, D{l:139,t:11,i:578}, D{l:132,t:0,i:644}, D{l:4,t:0,i:982}, D{l:138,t:0,i:867}, D{l:132,t:10,i:280}, D{l:135,t:0,i:540}, D{l:140,t:10,i:54}, D{l:135,t:0,i:123}, D{l:134,t:0,i:1978}, D{l:4,t:10,i:421}, D{l:133,t:10,i:548}, D{l:6,t:0,i:623}, D{l:136,t:0,i:789}, D{l:4,t:0,i:908}, D{l:5,t:0,i:359}, D{l:5,t:0,i:508}, D{l:6,t:0,i:1723}, D{l:7,t:0,i:343}, D{l:7,t:0,i:1996}, D{l:135,t:0,i:2026}, D{l:134,t:0,i:1220}, D{l:4,t:0,i:341}, D{l:135,t:0,i:480}, D{l:6,t:10,i:254}, D{l:9,t:10,i:109}, D{l:138,t:10,i:103}, D{l:134,t:0,i:888}, D{l:8,t:11,i:528}, D{l:137,t:11,i:348}, D{l:7,t:0,i:1995}, D{l:8,t:0,i:299}, D{l:11,t:0,i:890}, D{l:12,t:0,i:674}, D{l:4,t:11,i:20}, D{l:133,t:11,i:616}, D{l:135,t:11,i:1094}, D{l:134,t:10,i:1630}, D{l:4,t:0,i:238}, D{l:5,t:0,i:503}, D{l:6,t:0,i:179}, D{l:7,t:0,i:2003}, D{l:8,t:0,i:381}, D{l:8,t:0,i:473}, D{l:9,t:0,i:149}, D{l:10,t:0,i:788}, D{l:15,t:0,i:45}, D{l:15,t:0,i:86}, D{l:20,t:0,i:110}, D{l:150,t:0,i:57}, D{l:133,t:10,i:671}, D{l:4,t:11,i:26}, D{l:5,t:11,i:429}, D{l:6,t:11,i:245}, D{l:7,t:11,i:704}, D{l:7,t:11,i:1379}, D{l:135,t:11,i:1474}, D{l:4,t:0,i:121}, D{l:5,t:0,i:156}, D{l:5,t:0,i:349}, D{l:9,t:0,i:431}, D{l:10,t:0,i:605}, D{l:142,t:0,i:342}, D{l:7,t:11,i:943}, D{l:139,t:11,i:614}, D{l:132,t:10,i:889}, D{l:132,t:11,i:621}, D{l:7,t:10,i:1382}, D{l:7,t:11,i:1382}, D{l:135,t:10,i:1910}, D{l:132,t:10,i:627}, D{l:133,t:10,i:775}, D{l:133,t:11,i:542}, D{l:133,t:11,i:868}, D{l:136,t:11,i:433}, D{l:6,t:0,i:1373}, D{l:7,t:0,i:1011}, D{l:11,t:10,i:362}, D{l:11,t:10,i:948}, D{l:140,t:10,i:388}, D{l:6,t:0,i:80}, D{l:7,t:0,i:173}, D{l:9,t:0,i:547}, D{l:10,t:0,i:730}, D{l:14,t:0,i:18}, D{l:22,t:0,i:39}, D{l:135,t:11,i:1495}, D{l:6,t:0,i:1694}, D{l:135,t:0,i:1974}, D{l:140,t:0,i:196}, D{l:4,t:0,i:923}, D{l:6,t:0,i:507}, D{l:6,t:0,i:1711}, D{l:7,t:10,i:451}, D{l:8,t:10,i:389}, D{l:12,t:10,i:490}, D{l:13,t:10,i:16}, D{l:13,t:10,i:215}, D{l:13,t:10,i:351}, D{l:18,t:10,i:132}, D{l:147,t:10,i:125}, D{l:6,t:0,i:646}, D{l:134,t:0,i:1047}, D{l:135,t:10,i:841}, D{l:136,t:10,i:566}, D{l:6,t:0,i:1611}, D{l:135,t:0,i:1214}, D{l:139,t:0,i:926}, D{l:132,t:11,i:525}, D{l:132,t:0,i:595}, D{l:5,t:0,i:240}, D{l:6,t:0,i:459}, D{l:7,t:0,i:12}, D{l:7,t:0,i:114}, D{l:7,t:0,i:949}, D{l:7,t:0,i:1753}, D{l:7,t:0,i:1805}, D{l:8,t:0,i:658}, D{l:9,t:0,i:1}, D{l:11,t:0,i:959}, D{l:141,t:0,i:446}, D{l:5,t:10,i:912}, D{l:134,t:10,i:1695}, D{l:132,t:0,i:446}, D{l:7,t:11,i:62}, D{l:12,t:11,i:45}, D{l:147,t:11,i:112}, D{l:5,t:10,i:236}, D{l:6,t:10,i:572}, D{l:8,t:10,i:492}, D{l:11,t:10,i:618}, D{l:144,t:10,i:56}, D{l:5,t:10,i:190}, D{l:136,t:10,i:318}, D{l:135,t:10,i:1376}, D{l:4,t:11,i:223}, D{l:6,t:11,i:359}, D{l:11,t:11,i:3}, D{l:13,t:11,i:108}, D{l:14,t:11,i:89}, D{l:144,t:11,i:22}, D{l:132,t:11,i:647}, D{l:134,t:0,i:490}, D{l:134,t:0,i:491}, D{l:134,t:0,i:1584}, D{l:135,t:11,i:685}, D{l:138,t:11,i:220}, D{l:7,t:0,i:250}, D{l:136,t:0,i:507}, D{l:132,t:0,i:158}, D{l:4,t:0,i:140}, D{l:7,t:0,i:362}, D{l:8,t:0,i:209}, D{l:9,t:0,i:10}, D{l:9,t:0,i:160}, D{l:9,t:0,i:503}, D{l:9,t:0,i:614}, D{l:10,t:0,i:689}, D{l:11,t:0,i:327}, D{l:11,t:0,i:553}, D{l:11,t:0,i:725}, D{l:11,t:0,i:767}, D{l:12,t:0,i:252}, D{l:12,t:0,i:583}, D{l:13,t:0,i:192}, D{l:14,t:0,i:269}, D{l:14,t:0,i:356}, D{l:148,t:0,i:50}, D{l:19,t:0,i:1}, D{l:19,t:0,i:26}, D{l:150,t:0,i:9}, D{l:132,t:11,i:109}, D{l:6,t:0,i:228}, D{l:7,t:0,i:1341}, D{l:9,t:0,i:408}, D{l:138,t:0,i:343}, D{l:4,t:0,i:373}, D{l:5,t:0,i:283}, D{l:6,t:0,i:480}, D{l:7,t:0,i:609}, D{l:10,t:0,i:860}, D{l:138,t:0,i:878}, D{l:6,t:0,i:779}, D{l:134,t:0,i:1209}, D{l:4,t:0,i:557}, D{l:7,t:11,i:263}, D{l:7,t:11,i:628}, D{l:136,t:11,i:349}, D{l:132,t:0,i:548}, D{l:7,t:0,i:197}, D{l:8,t:0,i:142}, D{l:8,t:0,i:325}, D{l:9,t:0,i:150}, D{l:9,t:0,i:596}, D{l:10,t:0,i:350}, D{l:10,t:0,i:353}, D{l:11,t:0,i:74}, D{l:11,t:0,i:315}, D{l:12,t:0,i:662}, D{l:12,t:0,i:681}, D{l:14,t:0,i:423}, D{l:143,t:0,i:141}, D{l:4,t:11,i:40}, D{l:10,t:11,i:67}, D{l:11,t:11,i:117}, D{l:11,t:11,i:768}, D{l:139,t:11,i:935}, D{l:7,t:11,i:992}, D{l:8,t:11,i:301}, D{l:9,t:11,i:722}, D{l:12,t:11,i:63}, D{l:13,t:11,i:29}, D{l:14,t:11,i:161}, D{l:143,t:11,i:18}, D{l:6,t:0,i:1490}, D{l:138,t:11,i:532}, D{l:5,t:0,i:580}, D{l:7,t:0,i:378}, D{l:7,t:0,i:674}, D{l:7,t:0,i:1424}, D{l:15,t:0,i:83}, D{l:16,t:0,i:11}, D{l:15,t:11,i:83}, D{l:144,t:11,i:11}, D{l:6,t:0,i:1057}, D{l:6,t:0,i:1335}, D{l:10,t:0,i:316}, D{l:7,t:10,i:85}, D{l:7,t:10,i:247}, D{l:8,t:10,i:585}, D{l:138,t:10,i:163}, D{l:4,t:0,i:169}, D{l:5,t:0,i:83}, D{l:6,t:0,i:399}, D{l:6,t:0,i:579}, D{l:6,t:0,i:1513}, D{l:7,t:0,i:692}, D{l:7,t:0,i:846}, D{l:7,t:0,i:1015}, D{l:7,t:0,i:1799}, D{l:8,t:0,i:403}, D{l:9,t:0,i:394}, D{l:10,t:0,i:133}, D{l:12,t:0,i:4}, D{l:12,t:0,i:297}, D{l:12,t:0,i:452}, D{l:16,t:0,i:81}, D{l:18,t:0,i:25}, D{l:21,t:0,i:14}, D{l:22,t:0,i:12}, D{l:151,t:0,i:18}, D{l:134,t:0,i:1106}, D{l:7,t:0,i:1546}, D{l:11,t:0,i:299}, D{l:142,t:0,i:407}, D{l:134,t:0,i:1192}, D{l:132,t:0,i:177}, D{l:5,t:0,i:411}, D{l:135,t:0,i:653}, D{l:7,t:0,i:439}, D{l:10,t:0,i:727}, D{l:11,t:0,i:260}, D{l:139,t:0,i:684}, D{l:138,t:10,i:145}, D{l:147,t:10,i:83}, D{l:5,t:0,i:208}, D{l:7,t:0,i:753}, D{l:135,t:0,i:1528}, D{l:137,t:11,i:617}, D{l:135,t:10,i:1922}, D{l:135,t:11,i:825}, D{l:11,t:0,i:422}, D{l:13,t:0,i:389}, D{l:4,t:10,i:124}, D{l:10,t:10,i:457}, D{l:11,t:10,i:121}, D{l:11,t:10,i:169}, D{l:11,t:10,i:870}, D{l:12,t:10,i:214}, D{l:14,t:10,i:187}, D{l:143,t:10,i:77}, D{l:11,t:0,i:615}, D{l:15,t:0,i:58}, D{l:11,t:11,i:615}, D{l:143,t:11,i:58}, D{l:9,t:0,i:618}, D{l:138,t:0,i:482}, D{l:6,t:0,i:1952}, D{l:6,t:0,i:1970}, D{l:142,t:0,i:505}, D{l:7,t:10,i:1193}, D{l:135,t:11,i:1838}, D{l:133,t:0,i:242}, D{l:135,t:10,i:1333}, D{l:6,t:10,i:107}, D{l:7,t:10,i:638}, D{l:7,t:10,i:1632}, D{l:137,t:10,i:396}, D{l:133,t:0,i:953}, D{l:5,t:10,i:370}, D{l:134,t:10,i:1756}, D{l:5,t:11,i:28}, D{l:6,t:11,i:204}, D{l:10,t:11,i:320}, D{l:10,t:11,i:583}, D{l:13,t:11,i:502}, D{l:14,t:11,i:72}, D{l:14,t:11,i:274}, D{l:14,t:11,i:312}, D{l:14,t:11,i:344}, D{l:15,t:11,i:159}, D{l:16,t:11,i:62}, D{l:16,t:11,i:69}, D{l:17,t:11,i:30}, D{l:18,t:11,i:42}, D{l:18,t:11,i:53}, D{l:18,t:11,i:84}, D{l:18,t:11,i:140}, D{l:19,t:11,i:68}, D{l:19,t:11,i:85}, D{l:20,t:11,i:5}, D{l:20,t:11,i:45}, D{l:20,t:11,i:101}, D{l:22,t:11,i:7}, D{l:150,t:11,i:20}, D{l:4,t:11,i:558}, D{l:6,t:11,i:390}, D{l:7,t:11,i:162}, D{l:7,t:11,i:689}, D{l:9,t:11,i:360}, D{l:138,t:11,i:653}, D{l:11,t:0,i:802}, D{l:141,t:0,i:67}, D{l:133,t:10,i:204}, D{l:133,t:0,i:290}, D{l:5,t:10,i:970}, D{l:134,t:10,i:1706}, D{l:132,t:0,i:380}, D{l:5,t:0,i:52}, D{l:7,t:0,i:277}, D{l:9,t:0,i:368}, D{l:139,t:0,i:791}, D{l:5,t:11,i:856}, D{l:6,t:11,i:1672}, D{l:6,t:11,i:1757}, D{l:6,t:11,i:1781}, D{l:7,t:11,i:1150}, D{l:7,t:11,i:1425}, D{l:7,t:11,i:1453}, D{l:140,t:11,i:513}, D{l:5,t:11,i:92}, D{l:7,t:10,i:3}, D{l:10,t:11,i:736}, D{l:140,t:11,i:102}, D{l:4,t:0,i:112}, D{l:5,t:0,i:653}, D{l:5,t:10,i:483}, D{l:5,t:10,i:685}, D{l:6,t:10,i:489}, D{l:7,t:10,i:1204}, D{l:136,t:10,i:394}, D{l:132,t:10,i:921}, D{l:6,t:0,i:1028}, D{l:133,t:10,i:1007}, D{l:5,t:11,i:590}, D{l:9,t:11,i:213}, D{l:145,t:11,i:91}, D{l:135,t:10,i:1696}, D{l:10,t:0,i:138}, D{l:139,t:0,i:476}, D{l:5,t:0,i:725}, D{l:5,t:0,i:727}, D{l:135,t:0,i:1811}, D{l:4,t:0,i:979}, D{l:6,t:0,i:1821}, D{l:6,t:0,i:1838}, D{l:8,t:0,i:876}, D{l:8,t:0,i:883}, D{l:8,t:0,i:889}, D{l:8,t:0,i:893}, D{l:8,t:0,i:895}, D{l:10,t:0,i:934}, D{l:12,t:0,i:720}, D{l:14,t:0,i:459}, D{l:148,t:0,i:123}, D{l:135,t:11,i:551}, D{l:4,t:0,i:38}, D{l:6,t:0,i:435}, D{l:7,t:0,i:307}, D{l:7,t:0,i:999}, D{l:7,t:0,i:1481}, D{l:7,t:0,i:1732}, D{l:7,t:0,i:1738}, D{l:8,t:0,i:371}, D{l:9,t:0,i:414}, D{l:11,t:0,i:316}, D{l:12,t:0,i:52}, D{l:13,t:0,i:420}, D{l:147,t:0,i:100}, D{l:135,t:0,i:1296}, D{l:132,t:10,i:712}, D{l:134,t:10,i:1629}, D{l:133,t:0,i:723}, D{l:134,t:0,i:651}, D{l:136,t:11,i:191}, D{l:9,t:11,i:791}, D{l:10,t:11,i:93}, D{l:11,t:11,i:301}, D{l:16,t:11,i:13}, D{l:17,t:11,i:23}, D{l:18,t:11,i:135}, D{l:19,t:11,i:12}, D{l:20,t:11,i:1}, D{l:20,t:11,i:12}, D{l:148,t:11,i:14}, D{l:136,t:11,i:503}, D{l:6,t:11,i:466}, D{l:135,t:11,i:671}, D{l:6,t:0,i:1200}, D{l:134,t:0,i:1330}, D{l:135,t:0,i:1255}, D{l:134,t:0,i:986}, D{l:5,t:0,i:109}, D{l:6,t:0,i:1784}, D{l:7,t:0,i:1895}, D{l:12,t:0,i:296}, D{l:140,t:0,i:302}, D{l:135,t:11,i:983}, D{l:133,t:10,i:485}, D{l:134,t:0,i:660}, D{l:134,t:0,i:800}, D{l:5,t:0,i:216}, D{l:5,t:0,i:294}, D{l:6,t:0,i:591}, D{l:7,t:0,i:1879}, D{l:9,t:0,i:141}, D{l:9,t:0,i:270}, D{l:9,t:0,i:679}, D{l:10,t:0,i:159}, D{l:11,t:0,i:197}, D{l:11,t:0,i:438}, D{l:12,t:0,i:538}, D{l:12,t:0,i:559}, D{l:14,t:0,i:144}, D{l:14,t:0,i:167}, D{l:15,t:0,i:67}, D{l:4,t:10,i:285}, D{l:5,t:10,i:317}, D{l:6,t:10,i:301}, D{l:7,t:10,i:7}, D{l:8,t:10,i:153}, D{l:10,t:10,i:766}, D{l:11,t:10,i:468}, D{l:12,t:10,i:467}, D{l:141,t:10,i:143}, D{l:136,t:0,i:945}, D{l:134,t:0,i:1090}, D{l:137,t:0,i:81}, D{l:12,t:11,i:468}, D{l:19,t:11,i:96}, D{l:148,t:11,i:24}, D{l:134,t:0,i:391}, D{l:138,t:11,i:241}, D{l:7,t:0,i:322}, D{l:136,t:0,i:249}, D{l:134,t:0,i:1412}, D{l:135,t:11,i:795}, D{l:5,t:0,i:632}, D{l:138,t:0,i:526}, D{l:136,t:10,i:819}, D{l:6,t:0,i:144}, D{l:7,t:0,i:948}, D{l:7,t:0,i:1042}, D{l:8,t:0,i:235}, D{l:8,t:0,i:461}, D{l:9,t:0,i:453}, D{l:9,t:0,i:796}, D{l:10,t:0,i:354}, D{l:17,t:0,i:77}, D{l:135,t:11,i:954}, D{l:139,t:10,i:917}, D{l:6,t:0,i:940}, D{l:134,t:0,i:1228}, D{l:4,t:0,i:362}, D{l:7,t:0,i:52}, D{l:135,t:0,i:303}, D{l:6,t:11,i:549}, D{l:8,t:11,i:34}, D{l:8,t:11,i:283}, D{l:9,t:11,i:165}, D{l:138,t:11,i:475}, D{l:7,t:11,i:370}, D{l:7,t:11,i:1007}, D{l:7,t:11,i:1177}, D{l:135,t:11,i:1565}, D{l:5,t:11,i:652}, D{l:5,t:11,i:701}, D{l:135,t:11,i:449}, D{l:5,t:0,i:196}, D{l:6,t:0,i:486}, D{l:7,t:0,i:212}, D{l:8,t:0,i:309}, D{l:136,t:0,i:346}, D{l:6,t:10,i:1719}, D{l:6,t:10,i:1735}, D{l:7,t:10,i:2016}, D{l:7,t:10,i:2020}, D{l:8,t:10,i:837}, D{l:137,t:10,i:852}, D{l:6,t:11,i:159}, D{l:6,t:11,i:364}, D{l:7,t:11,i:516}, D{l:7,t:11,i:1439}, D{l:137,t:11,i:518}, D{l:135,t:0,i:1912}, D{l:135,t:0,i:1290}, D{l:132,t:0,i:686}, D{l:141,t:11,i:151}, D{l:138,t:0,i:625}, D{l:136,t:0,i:706}, D{l:138,t:10,i:568}, D{l:139,t:0,i:412}, D{l:4,t:0,i:30}, D{l:133,t:0,i:43}, D{l:8,t:10,i:67}, D{l:138,t:10,i:419}, D{l:7,t:0,i:967}, D{l:141,t:0,i:11}, D{l:12,t:0,i:758}, D{l:14,t:0,i:441}, D{l:142,t:0,i:462}, D{l:10,t:10,i:657}, D{l:14,t:10,i:297}, D{l:142,t:10,i:361}, D{l:139,t:10,i:729}, D{l:4,t:0,i:220}, D{l:135,t:0,i:1535}, D{l:7,t:11,i:501}, D{l:9,t:11,i:111}, D{l:10,t:11,i:141}, D{l:11,t:11,i:332}, D{l:13,t:11,i:43}, D{l:13,t:11,i:429}, D{l:14,t:11,i:130}, D{l:14,t:11,i:415}, D{l:145,t:11,i:102}, D{l:4,t:0,i:950}, D{l:6,t:0,i:1859}, D{l:7,t:0,i:11}, D{l:8,t:0,i:873}, D{l:12,t:0,i:710}, D{l:12,t:0,i:718}, D{l:12,t:0,i:748}, D{l:12,t:0,i:765}, D{l:148,t:0,i:124}, D{l:5,t:11,i:149}, D{l:5,t:11,i:935}, D{l:136,t:11,i:233}, D{l:142,t:11,i:291}, D{l:134,t:0,i:1579}, D{l:7,t:0,i:890}, D{l:8,t:10,i:51}, D{l:9,t:10,i:868}, D{l:10,t:10,i:833}, D{l:12,t:10,i:481}, D{l:12,t:10,i:570}, D{l:148,t:10,i:106}, D{l:141,t:0,i:2}, D{l:132,t:10,i:445}, D{l:136,t:11,i:801}, D{l:135,t:0,i:1774}, D{l:7,t:0,i:1725}, D{l:138,t:0,i:393}, D{l:5,t:0,i:263}, D{l:134,t:0,i:414}, D{l:132,t:11,i:322}, D{l:133,t:10,i:239}, D{l:7,t:0,i:456}, D{l:7,t:10,i:1990}, D{l:8,t:10,i:130}, D{l:139,t:10,i:720}, D{l:137,t:0,i:818}, D{l:5,t:10,i:123}, D{l:6,t:10,i:530}, D{l:7,t:10,i:348}, D{l:135,t:10,i:1419}, D{l:135,t:10,i:2024}, D{l:6,t:0,i:178}, D{l:6,t:0,i:1750}, D{l:8,t:0,i:251}, D{l:9,t:0,i:690}, D{l:10,t:0,i:155}, D{l:10,t:0,i:196}, D{l:10,t:0,i:373}, D{l:11,t:0,i:698}, D{l:13,t:0,i:155}, D{l:148,t:0,i:93}, D{l:5,t:0,i:97}, D{l:137,t:0,i:393}, D{l:134,t:0,i:674}, D{l:11,t:0,i:223}, D{l:140,t:0,i:168}, D{l:132,t:10,i:210}, D{l:139,t:11,i:464}, D{l:6,t:0,i:1639}, D{l:146,t:0,i:159}, D{l:139,t:11,i:2}, D{l:7,t:0,i:934}, D{l:8,t:0,i:647}, D{l:17,t:0,i:97}, D{l:19,t:0,i:59}, D{l:150,t:0,i:2}, D{l:132,t:0,i:191}, D{l:5,t:0,i:165}, D{l:9,t:0,i:346}, D{l:10,t:0,i:655}, D{l:11,t:0,i:885}, D{l:4,t:10,i:430}, D{l:135,t:11,i:357}, D{l:133,t:0,i:877}, D{l:5,t:10,i:213}, D{l:133,t:11,i:406}, D{l:8,t:0,i:128}, D{l:139,t:0,i:179}, D{l:6,t:11,i:69}, D{l:135,t:11,i:117}, D{l:135,t:0,i:1297}, D{l:11,t:11,i:43}, D{l:13,t:11,i:72}, D{l:141,t:11,i:142}, D{l:135,t:11,i:1830}, D{l:142,t:0,i:164}, D{l:5,t:0,i:57}, D{l:6,t:0,i:101}, D{l:6,t:0,i:586}, D{l:6,t:0,i:1663}, D{l:7,t:0,i:132}, D{l:7,t:0,i:1154}, D{l:7,t:0,i:1415}, D{l:7,t:0,i:1507}, D{l:12,t:0,i:493}, D{l:15,t:0,i:105}, D{l:151,t:0,i:15}, D{l:5,t:0,i:459}, D{l:7,t:0,i:1073}, D{l:8,t:0,i:241}, D{l:136,t:0,i:334}, D{l:133,t:11,i:826}, D{l:133,t:10,i:108}, D{l:5,t:10,i:219}, D{l:10,t:11,i:132}, D{l:11,t:11,i:191}, D{l:11,t:11,i:358}, D{l:139,t:11,i:460}, D{l:6,t:0,i:324}, D{l:6,t:0,i:520}, D{l:7,t:0,i:338}, D{l:7,t:0,i:1729}, D{l:8,t:0,i:228}, D{l:139,t:0,i:750}, D{l:21,t:0,i:30}, D{l:22,t:0,i:53}, D{l:4,t:10,i:193}, D{l:5,t:10,i:916}, D{l:7,t:10,i:364}, D{l:10,t:10,i:398}, D{l:10,t:10,i:726}, D{l:11,t:10,i:317}, D{l:11,t:10,i:626}, D{l:12,t:10,i:142}, D{l:12,t:10,i:288}, D{l:12,t:10,i:678}, D{l:13,t:10,i:313}, D{l:15,t:10,i:113}, D{l:146,t:10,i:114}, D{l:6,t:11,i:110}, D{l:135,t:11,i:1681}, D{l:135,t:0,i:910}, D{l:6,t:10,i:241}, D{l:7,t:10,i:907}, D{l:8,t:10,i:832}, D{l:9,t:10,i:342}, D{l:10,t:10,i:729}, D{l:11,t:10,i:284}, D{l:11,t:10,i:445}, D{l:11,t:10,i:651}, D{l:11,t:10,i:863}, D{l:13,t:10,i:398}, D{l:146,t:10,i:99}, D{l:7,t:0,i:705}, D{l:9,t:0,i:734}, D{l:5,t:11,i:1000}, D{l:7,t:11,i:733}, D{l:137,t:11,i:583}, D{l:4,t:0,i:73}, D{l:6,t:0,i:612}, D{l:7,t:0,i:927}, D{l:7,t:0,i:1822}, D{l:8,t:0,i:217}, D{l:9,t:0,i:765}, D{l:9,t:0,i:766}, D{l:10,t:0,i:408}, D{l:11,t:0,i:51}, D{l:11,t:0,i:793}, D{l:12,t:0,i:266}, D{l:15,t:0,i:158}, D{l:20,t:0,i:89}, D{l:150,t:0,i:32}, D{l:7,t:0,i:1330}, D{l:4,t:11,i:297}, D{l:6,t:11,i:529}, D{l:7,t:11,i:152}, D{l:7,t:11,i:713}, D{l:7,t:11,i:1845}, D{l:8,t:11,i:710}, D{l:8,t:11,i:717}, D{l:140,t:11,i:639}, D{l:5,t:0,i:389}, D{l:136,t:0,i:636}, D{l:134,t:0,i:1409}, D{l:4,t:10,i:562}, D{l:9,t:10,i:254}, D{l:139,t:10,i:879}, D{l:134,t:0,i:893}, D{l:132,t:10,i:786}, D{l:4,t:11,i:520}, D{l:135,t:11,i:575}, D{l:136,t:0,i:21}, D{l:140,t:0,i:721}, D{l:136,t:0,i:959}, D{l:7,t:11,i:1428}, D{l:7,t:11,i:1640}, D{l:9,t:11,i:169}, D{l:9,t:11,i:182}, D{l:9,t:11,i:367}, D{l:9,t:11,i:478}, D{l:9,t:11,i:506}, D{l:9,t:11,i:551}, D{l:9,t:11,i:648}, D{l:9,t:11,i:651}, D{l:9,t:11,i:697}, D{l:9,t:11,i:705}, D{l:9,t:11,i:725}, D{l:9,t:11,i:787}, D{l:9,t:11,i:794}, D{l:10,t:11,i:198}, D{l:10,t:11,i:214}, D{l:10,t:11,i:267}, D{l:10,t:11,i:275}, D{l:10,t:11,i:456}, D{l:10,t:11,i:551}, D{l:10,t:11,i:561}, D{l:10,t:11,i:613}, D{l:10,t:11,i:627}, D{l:10,t:11,i:668}, D{l:10,t:11,i:675}, D{l:10,t:11,i:691}, D{l:10,t:11,i:695}, D{l:10,t:11,i:707}, D{l:10,t:11,i:715}, D{l:11,t:11,i:183}, D{l:11,t:11,i:201}, D{l:11,t:11,i:244}, D{l:11,t:11,i:262}, D{l:11,t:11,i:352}, D{l:11,t:11,i:439}, D{l:11,t:11,i:493}, D{l:11,t:11,i:572}, D{l:11,t:11,i:591}, D{l:11,t:11,i:608}, D{l:11,t:11,i:611}, D{l:11,t:11,i:646}, D{l:11,t:11,i:674}, D{l:11,t:11,i:711}, D{l:11,t:11,i:751}, D{l:11,t:11,i:761}, D{l:11,t:11,i:776}, D{l:11,t:11,i:785}, D{l:11,t:11,i:850}, D{l:11,t:11,i:853}, D{l:11,t:11,i:862}, D{l:11,t:11,i:865}, D{l:11,t:11,i:868}, D{l:11,t:11,i:898}, D{l:11,t:11,i:902}, D{l:11,t:11,i:903}, D{l:11,t:11,i:910}, D{l:11,t:11,i:932}, D{l:11,t:11,i:942}, D{l:11,t:11,i:957}, D{l:11,t:11,i:967}, D{l:11,t:11,i:972}, D{l:12,t:11,i:148}, D{l:12,t:11,i:195}, D{l:12,t:11,i:220}, D{l:12,t:11,i:237}, D{l:12,t:11,i:318}, D{l:12,t:11,i:339}, D{l:12,t:11,i:393}, D{l:12,t:11,i:445}, D{l:12,t:11,i:450}, D{l:12,t:11,i:474}, D{l:12,t:11,i:509}, D{l:12,t:11,i:533}, D{l:12,t:11,i:591}, D{l:12,t:11,i:594}, D{l:12,t:11,i:597}, D{l:12,t:11,i:621}, D{l:12,t:11,i:633}, D{l:12,t:11,i:642}, D{l:13,t:11,i:59}, D{l:13,t:11,i:60}, D{l:13,t:11,i:145}, D{l:13,t:11,i:239}, D{l:13,t:11,i:250}, D{l:13,t:11,i:273}, D{l:13,t:11,i:329}, D{l:13,t:11,i:344}, D{l:13,t:11,i:365}, D{l:13,t:11,i:372}, D{l:13,t:11,i:387}, D{l:13,t:11,i:403}, D{l:13,t:11,i:414}, D{l:13,t:11,i:456}, D{l:13,t:11,i:478}, D{l:13,t:11,i:483}, D{l:13,t:11,i:489}, D{l:14,t:11,i:55}, D{l:14,t:11,i:57}, D{l:14,t:11,i:81}, D{l:14,t:11,i:90}, D{l:14,t:11,i:148}, D{l:14,t:11,i:239}, D{l:14,t:11,i:266}, D{l:14,t:11,i:321}, D{l:14,t:11,i:326}, D{l:14,t:11,i:327}, D{l:14,t:11,i:330}, D{l:14,t:11,i:347}, D{l:14,t:11,i:355}, D{l:14,t:11,i:401}, D{l:14,t:11,i:411}, D{l:14,t:11,i:414}, D{l:14,t:11,i:416}, D{l:14,t:11,i:420}, D{l:15,t:11,i:61}, D{l:15,t:11,i:74}, D{l:15,t:11,i:87}, D{l:15,t:11,i:88}, D{l:15,t:11,i:94}, D{l:15,t:11,i:96}, D{l:15,t:11,i:116}, D{l:15,t:11,i:149}, D{l:15,t:11,i:154}, D{l:16,t:11,i:50}, D{l:16,t:11,i:63}, D{l:16,t:11,i:73}, D{l:17,t:11,i:2}, D{l:17,t:11,i:66}, D{l:17,t:11,i:92}, D{l:17,t:11,i:103}, D{l:17,t:11,i:112}, D{l:18,t:11,i:50}, D{l:18,t:11,i:54}, D{l:18,t:11,i:82}, D{l:18,t:11,i:86}, D{l:18,t:11,i:90}, D{l:18,t:11,i:111}, D{l:18,t:11,i:115}, D{l:18,t:11,i:156}, D{l:19,t:11,i:40}, D{l:19,t:11,i:79}, D{l:20,t:11,i:78}, D{l:149,t:11,i:22}, D{l:137,t:11,i:170}, D{l:134,t:0,i:1433}, D{l:135,t:11,i:1307}, D{l:139,t:11,i:411}, D{l:5,t:0,i:189}, D{l:7,t:0,i:442}, D{l:7,t:0,i:443}, D{l:8,t:0,i:281}, D{l:12,t:0,i:174}, D{l:141,t:0,i:261}, D{l:6,t:10,i:216}, D{l:7,t:10,i:901}, D{l:7,t:10,i:1343}, D{l:136,t:10,i:493}, D{l:5,t:11,i:397}, D{l:6,t:11,i:154}, D{l:7,t:10,i:341}, D{l:7,t:11,i:676}, D{l:8,t:11,i:443}, D{l:8,t:11,i:609}, D{l:9,t:11,i:24}, D{l:9,t:11,i:325}, D{l:10,t:11,i:35}, D{l:11,t:10,i:219}, D{l:11,t:11,i:535}, D{l:11,t:11,i:672}, D{l:11,t:11,i:1018}, D{l:12,t:11,i:637}, D{l:144,t:11,i:30}, D{l:6,t:0,i:2}, D{l:7,t:0,i:191}, D{l:7,t:0,i:446}, D{l:7,t:0,i:1262}, D{l:7,t:0,i:1737}, D{l:8,t:0,i:22}, D{l:8,t:0,i:270}, D{l:8,t:0,i:612}, D{l:9,t:0,i:4}, D{l:9,t:0,i:312}, D{l:9,t:0,i:436}, D{l:9,t:0,i:626}, D{l:10,t:0,i:216}, D{l:10,t:0,i:311}, D{l:10,t:0,i:521}, D{l:10,t:0,i:623}, D{l:11,t:0,i:72}, D{l:11,t:0,i:330}, D{l:11,t:0,i:455}, D{l:12,t:0,i:321}, D{l:12,t:0,i:504}, D{l:12,t:0,i:530}, D{l:12,t:0,i:543}, D{l:13,t:0,i:17}, D{l:13,t:0,i:156}, D{l:13,t:0,i:334}, D{l:14,t:0,i:131}, D{l:17,t:0,i:60}, D{l:148,t:0,i:64}, D{l:7,t:0,i:354}, D{l:10,t:0,i:410}, D{l:139,t:0,i:815}, D{l:139,t:10,i:130}, D{l:7,t:10,i:1734}, D{l:137,t:11,i:631}, D{l:12,t:0,i:425}, D{l:15,t:0,i:112}, D{l:10,t:10,i:115}, D{l:11,t:10,i:420}, D{l:13,t:10,i:404}, D{l:14,t:10,i:346}, D{l:143,t:10,i:54}, D{l:6,t:0,i:60}, D{l:6,t:0,i:166}, D{l:7,t:0,i:374}, D{l:7,t:0,i:670}, D{l:7,t:0,i:1327}, D{l:8,t:0,i:411}, D{l:8,t:0,i:435}, D{l:9,t:0,i:653}, D{l:9,t:0,i:740}, D{l:10,t:0,i:385}, D{l:11,t:0,i:222}, D{l:11,t:0,i:324}, D{l:11,t:0,i:829}, D{l:140,t:0,i:611}, D{l:7,t:0,i:1611}, D{l:13,t:0,i:14}, D{l:15,t:0,i:44}, D{l:19,t:0,i:13}, D{l:148,t:0,i:76}, D{l:133,t:11,i:981}, D{l:4,t:11,i:56}, D{l:7,t:11,i:1791}, D{l:8,t:11,i:607}, D{l:8,t:11,i:651}, D{l:11,t:11,i:465}, D{l:11,t:11,i:835}, D{l:12,t:11,i:337}, D{l:141,t:11,i:480}, D{l:6,t:0,i:1478}, D{l:5,t:10,i:1011}, D{l:136,t:10,i:701}, D{l:139,t:0,i:596}, D{l:5,t:0,i:206}, D{l:134,t:0,i:398}, D{l:4,t:10,i:54}, D{l:5,t:10,i:666}, D{l:7,t:10,i:1039}, D{l:7,t:10,i:1130}, D{l:9,t:10,i:195}, D{l:138,t:10,i:302}, D{l:7,t:0,i:50}, D{l:9,t:11,i:158}, D{l:138,t:11,i:411}, D{l:135,t:11,i:1120}, D{l:6,t:0,i:517}, D{l:7,t:0,i:1159}, D{l:10,t:0,i:621}, D{l:11,t:0,i:192}, D{l:134,t:10,i:1669}, D{l:4,t:0,i:592}, D{l:6,t:0,i:600}, D{l:135,t:0,i:1653}, D{l:10,t:0,i:223}, D{l:139,t:0,i:645}, D{l:136,t:11,i:139}, D{l:7,t:0,i:64}, D{l:136,t:0,i:245}, D{l:142,t:0,i:278}, D{l:6,t:11,i:622}, D{l:135,t:11,i:1030}, D{l:136,t:0,i:604}, D{l:134,t:0,i:1502}, D{l:138,t:0,i:265}, D{l:141,t:11,i:168}, D{l:7,t:0,i:1763}, D{l:140,t:0,i:310}, D{l:7,t:10,i:798}, D{l:139,t:11,i:719}, D{l:7,t:11,i:160}, D{l:10,t:11,i:624}, D{l:142,t:11,i:279}, D{l:132,t:11,i:363}, D{l:7,t:10,i:122}, D{l:9,t:10,i:259}, D{l:10,t:10,i:84}, D{l:11,t:10,i:470}, D{l:12,t:10,i:541}, D{l:141,t:10,i:379}, D{l:5,t:0,i:129}, D{l:6,t:0,i:61}, D{l:135,t:0,i:947}, D{l:134,t:0,i:1356}, D{l:135,t:11,i:1191}, D{l:13,t:0,i:505}, D{l:141,t:0,i:506}, D{l:11,t:0,i:1000}, D{l:5,t:10,i:82}, D{l:5,t:10,i:131}, D{l:7,t:10,i:1755}, D{l:8,t:10,i:31}, D{l:9,t:10,i:168}, D{l:9,t:10,i:764}, D{l:139,t:10,i:869}, D{l:134,t:0,i:966}, D{l:134,t:10,i:605}, D{l:134,t:11,i:292}, D{l:5,t:11,i:177}, D{l:6,t:11,i:616}, D{l:7,t:11,i:827}, D{l:9,t:11,i:525}, D{l:138,t:11,i:656}, D{l:135,t:11,i:1486}, D{l:138,t:11,i:31}, D{l:5,t:10,i:278}, D{l:137,t:10,i:68}, D{l:4,t:10,i:163}, D{l:5,t:10,i:201}, D{l:5,t:10,i:307}, D{l:5,t:10,i:310}, D{l:6,t:10,i:335}, D{l:7,t:10,i:284}, D{l:136,t:10,i:165}, D{l:6,t:0,i:839}, D{l:135,t:10,i:1660}, D{l:136,t:10,i:781}, D{l:6,t:10,i:33}, D{l:135,t:10,i:1244}, D{l:133,t:0,i:637}, D{l:4,t:11,i:161}, D{l:133,t:11,i:631}, D{l:137,t:0,i:590}, D{l:7,t:10,i:1953}, D{l:136,t:10,i:720}, D{l:5,t:0,i:280}, D{l:7,t:0,i:1226}, D{l:138,t:10,i:203}, D{l:134,t:0,i:1386}, D{l:5,t:0,i:281}, D{l:6,t:0,i:1026}, D{l:6,t:10,i:326}, D{l:7,t:10,i:677}, D{l:137,t:10,i:425}, D{l:7,t:11,i:1557}, D{l:135,t:11,i:1684}, D{l:135,t:0,i:1064}, D{l:9,t:11,i:469}, D{l:9,t:11,i:709}, D{l:12,t:11,i:512}, D{l:14,t:11,i:65}, D{l:145,t:11,i:12}, D{l:134,t:0,i:917}, D{l:10,t:11,i:229}, D{l:11,t:11,i:73}, D{l:11,t:11,i:376}, D{l:139,t:11,i:433}, D{l:7,t:0,i:555}, D{l:9,t:0,i:192}, D{l:13,t:0,i:30}, D{l:13,t:0,i:49}, D{l:15,t:0,i:150}, D{l:16,t:0,i:76}, D{l:20,t:0,i:52}, D{l:7,t:10,i:1316}, D{l:7,t:10,i:1412}, D{l:7,t:10,i:1839}, D{l:9,t:10,i:589}, D{l:11,t:10,i:241}, D{l:11,t:10,i:676}, D{l:11,t:10,i:811}, D{l:11,t:10,i:891}, D{l:12,t:10,i:140}, D{l:12,t:10,i:346}, D{l:12,t:10,i:479}, D{l:13,t:10,i:381}, D{l:14,t:10,i:188}, D{l:146,t:10,i:30}, D{l:149,t:0,i:15}, D{l:6,t:0,i:1882}, D{l:6,t:0,i:1883}, D{l:6,t:0,i:1897}, D{l:9,t:0,i:945}, D{l:9,t:0,i:1014}, D{l:9,t:0,i:1020}, D{l:12,t:0,i:823}, D{l:12,t:0,i:842}, D{l:12,t:0,i:866}, D{l:12,t:0,i:934}, D{l:15,t:0,i:242}, D{l:146,t:0,i:208}, D{l:6,t:0,i:965}, D{l:134,t:0,i:1499}, D{l:7,t:0,i:33}, D{l:7,t:0,i:120}, D{l:8,t:0,i:489}, D{l:9,t:0,i:319}, D{l:10,t:0,i:820}, D{l:11,t:0,i:1004}, D{l:12,t:0,i:379}, D{l:12,t:0,i:679}, D{l:13,t:0,i:117}, D{l:13,t:0,i:412}, D{l:14,t:0,i:25}, D{l:15,t:0,i:52}, D{l:15,t:0,i:161}, D{l:16,t:0,i:47}, D{l:149,t:0,i:2}, D{l:6,t:11,i:558}, D{l:7,t:11,i:651}, D{l:8,t:11,i:421}, D{l:9,t:11,i:0}, D{l:138,t:11,i:34}, D{l:4,t:0,i:937}, D{l:5,t:0,i:801}, D{l:7,t:0,i:473}, D{l:5,t:10,i:358}, D{l:7,t:10,i:1184}, D{l:10,t:10,i:662}, D{l:13,t:10,i:212}, D{l:13,t:10,i:304}, D{l:13,t:10,i:333}, D{l:145,t:10,i:98}, D{l:132,t:0,i:877}, D{l:6,t:0,i:693}, D{l:134,t:0,i:824}, D{l:132,t:0,i:365}, D{l:7,t:11,i:1832}, D{l:138,t:11,i:374}, D{l:5,t:0,i:7}, D{l:139,t:0,i:774}, D{l:4,t:0,i:734}, D{l:5,t:0,i:662}, D{l:134,t:0,i:430}, D{l:4,t:0,i:746}, D{l:135,t:0,i:1090}, D{l:5,t:0,i:360}, D{l:8,t:0,i:237}, D{l:10,t:0,i:231}, D{l:147,t:0,i:124}, D{l:138,t:11,i:348}, D{l:6,t:11,i:6}, D{l:7,t:11,i:81}, D{l:7,t:11,i:771}, D{l:7,t:11,i:1731}, D{l:9,t:11,i:405}, D{l:138,t:11,i:421}, D{l:6,t:0,i:740}, D{l:137,t:0,i:822}, D{l:133,t:10,i:946}, D{l:7,t:0,i:1485}, D{l:136,t:0,i:929}, D{l:7,t:10,i:411}, D{l:8,t:10,i:631}, D{l:9,t:10,i:323}, D{l:10,t:10,i:355}, D{l:11,t:10,i:491}, D{l:12,t:10,i:143}, D{l:12,t:10,i:402}, D{l:13,t:10,i:73}, D{l:14,t:10,i:408}, D{l:15,t:10,i:107}, D{l:146,t:10,i:71}, D{l:135,t:10,i:590}, D{l:5,t:11,i:881}, D{l:133,t:11,i:885}, D{l:150,t:11,i:25}, D{l:4,t:0,i:852}, D{l:5,t:11,i:142}, D{l:134,t:11,i:546}, D{l:7,t:10,i:1467}, D{l:8,t:10,i:328}, D{l:10,t:10,i:544}, D{l:11,t:10,i:955}, D{l:13,t:10,i:320}, D{l:145,t:10,i:83}, D{l:9,t:0,i:17}, D{l:10,t:0,i:291}, D{l:11,t:10,i:511}, D{l:13,t:10,i:394}, D{l:14,t:10,i:298}, D{l:14,t:10,i:318}, D{l:146,t:10,i:103}, D{l:5,t:11,i:466}, D{l:11,t:11,i:571}, D{l:12,t:11,i:198}, D{l:13,t:11,i:283}, D{l:14,t:11,i:186}, D{l:15,t:11,i:21}, D{l:143,t:11,i:103}, D{l:134,t:0,i:1001}, D{l:4,t:11,i:185}, D{l:5,t:11,i:257}, D{l:5,t:11,i:839}, D{l:5,t:11,i:936}, D{l:7,t:11,i:171}, D{l:9,t:11,i:399}, D{l:10,t:11,i:258}, D{l:10,t:11,i:395}, D{l:10,t:11,i:734}, D{l:11,t:11,i:1014}, D{l:12,t:11,i:23}, D{l:13,t:11,i:350}, D{l:14,t:11,i:150}, D{l:147,t:11,i:6}, D{l:143,t:0,i:35}, D{l:132,t:0,i:831}, D{l:5,t:10,i:835}, D{l:134,t:10,i:483}, D{l:4,t:0,i:277}, D{l:5,t:0,i:608}, D{l:6,t:0,i:493}, D{l:7,t:0,i:457}, D{l:12,t:0,i:384}, D{l:7,t:11,i:404}, D{l:7,t:11,i:1377}, D{l:7,t:11,i:1430}, D{l:7,t:11,i:2017}, D{l:8,t:11,i:149}, D{l:8,t:11,i:239}, D{l:8,t:11,i:512}, D{l:8,t:11,i:793}, D{l:8,t:11,i:818}, D{l:9,t:11,i:474}, D{l:9,t:11,i:595}, D{l:10,t:11,i:122}, D{l:10,t:11,i:565}, D{l:10,t:11,i:649}, D{l:10,t:11,i:783}, D{l:11,t:11,i:239}, D{l:11,t:11,i:295}, D{l:11,t:11,i:447}, D{l:11,t:11,i:528}, D{l:11,t:11,i:639}, D{l:11,t:11,i:800}, D{l:11,t:11,i:936}, D{l:12,t:11,i:25}, D{l:12,t:11,i:73}, D{l:12,t:11,i:77}, D{l:12,t:11,i:157}, D{l:12,t:11,i:316}, D{l:12,t:11,i:390}, D{l:12,t:11,i:391}, D{l:12,t:11,i:394}, D{l:12,t:11,i:395}, D{l:12,t:11,i:478}, D{l:12,t:11,i:503}, D{l:12,t:11,i:592}, D{l:12,t:11,i:680}, D{l:13,t:11,i:50}, D{l:13,t:11,i:53}, D{l:13,t:11,i:132}, D{l:13,t:11,i:198}, D{l:13,t:11,i:275}, D{l:13,t:11,i:322}, D{l:13,t:11,i:415}, D{l:14,t:11,i:71}, D{l:14,t:11,i:257}, D{l:14,t:11,i:395}, D{l:15,t:11,i:71}, D{l:15,t:11,i:136}, D{l:17,t:11,i:123}, D{l:18,t:11,i:93}, D{l:147,t:11,i:58}, D{l:134,t:0,i:1351}, D{l:7,t:0,i:27}, D{l:135,t:0,i:316}, D{l:136,t:11,i:712}, D{l:136,t:0,i:984}, D{l:133,t:0,i:552}, D{l:137,t:0,i:264}, D{l:132,t:0,i:401}, D{l:6,t:0,i:710}, D{l:6,t:0,i:1111}, D{l:134,t:0,i:1343}, D{l:134,t:0,i:1211}, D{l:9,t:0,i:543}, D{l:10,t:0,i:524}, D{l:11,t:0,i:108}, D{l:11,t:0,i:653}, D{l:12,t:0,i:524}, D{l:13,t:0,i:123}, D{l:14,t:0,i:252}, D{l:16,t:0,i:18}, D{l:19,t:0,i:38}, D{l:20,t:0,i:26}, D{l:20,t:0,i:65}, D{l:21,t:0,i:3}, D{l:151,t:0,i:11}, D{l:4,t:0,i:205}, D{l:5,t:0,i:623}, D{l:7,t:0,i:104}, D{l:8,t:0,i:519}, D{l:137,t:0,i:716}, D{l:132,t:10,i:677}, D{l:4,t:11,i:377}, D{l:152,t:11,i:13}, D{l:135,t:11,i:1673}, D{l:7,t:0,i:579}, D{l:9,t:0,i:41}, D{l:9,t:0,i:244}, D{l:9,t:0,i:669}, D{l:10,t:0,i:5}, D{l:11,t:0,i:861}, D{l:11,t:0,i:951}, D{l:139,t:0,i:980}, D{l:132,t:0,i:717}, D{l:136,t:0,i:1011}, D{l:132,t:0,i:805}, D{l:4,t:11,i:180}, D{l:135,t:11,i:1906}, D{l:132,t:10,i:777}, D{l:132,t:10,i:331}, D{l:132,t:0,i:489}, D{l:6,t:0,i:1024}, D{l:4,t:11,i:491}, D{l:133,t:10,i:747}, D{l:135,t:11,i:1182}, D{l:4,t:11,i:171}, D{l:138,t:11,i:234}, D{l:4,t:11,i:586}, D{l:7,t:11,i:1186}, D{l:138,t:11,i:631}, D{l:135,t:0,i:892}, D{l:135,t:11,i:336}, D{l:9,t:11,i:931}, D{l:10,t:11,i:334}, D{l:148,t:11,i:71}, D{l:137,t:0,i:473}, D{l:6,t:0,i:864}, D{l:12,t:0,i:659}, D{l:139,t:11,i:926}, D{l:7,t:0,i:819}, D{l:9,t:0,i:26}, D{l:9,t:0,i:392}, D{l:10,t:0,i:152}, D{l:10,t:0,i:226}, D{l:11,t:0,i:19}, D{l:12,t:0,i:276}, D{l:12,t:0,i:426}, D{l:12,t:0,i:589}, D{l:13,t:0,i:460}, D{l:15,t:0,i:97}, D{l:19,t:0,i:48}, D{l:148,t:0,i:104}, D{l:135,t:0,i:51}, D{l:133,t:10,i:326}, D{l:4,t:10,i:691}, D{l:146,t:10,i:16}, D{l:9,t:0,i:130}, D{l:11,t:0,i:765}, D{l:10,t:10,i:680}, D{l:10,t:10,i:793}, D{l:141,t:10,i:357}, D{l:133,t:11,i:765}, D{l:8,t:0,i:229}, D{l:6,t:10,i:32}, D{l:7,t:10,i:385}, D{l:7,t:10,i:757}, D{l:7,t:10,i:1916}, D{l:8,t:10,i:94}, D{l:8,t:10,i:711}, D{l:9,t:10,i:541}, D{l:10,t:10,i:162}, D{l:10,t:10,i:795}, D{l:11,t:10,i:989}, D{l:11,t:10,i:1010}, D{l:12,t:10,i:14}, D{l:142,t:10,i:308}, D{l:7,t:11,i:474}, D{l:137,t:11,i:578}, D{l:132,t:0,i:674}, D{l:132,t:0,i:770}, D{l:5,t:0,i:79}, D{l:7,t:0,i:1027}, D{l:7,t:0,i:1477}, D{l:139,t:0,i:52}, D{l:133,t:11,i:424}, D{l:134,t:0,i:1666}, D{l:6,t:0,i:409}, D{l:6,t:10,i:349}, D{l:6,t:10,i:1682}, D{l:7,t:10,i:1252}, D{l:8,t:10,i:112}, D{l:8,t:11,i:714}, D{l:9,t:10,i:435}, D{l:9,t:10,i:668}, D{l:10,t:10,i:290}, D{l:10,t:10,i:319}, D{l:10,t:10,i:815}, D{l:11,t:10,i:180}, D{l:11,t:10,i:837}, D{l:12,t:10,i:240}, D{l:13,t:10,i:152}, D{l:13,t:10,i:219}, D{l:142,t:10,i:158}, D{l:5,t:0,i:789}, D{l:134,t:0,i:195}, D{l:4,t:0,i:251}, D{l:4,t:0,i:688}, D{l:7,t:0,i:513}, D{l:135,t:0,i:1284}, D{l:132,t:10,i:581}, D{l:9,t:11,i:420}, D{l:10,t:11,i:269}, D{l:10,t:11,i:285}, D{l:10,t:11,i:576}, D{l:11,t:11,i:397}, D{l:13,t:11,i:175}, D{l:145,t:11,i:90}, D{l:6,t:10,i:126}, D{l:7,t:10,i:573}, D{l:8,t:10,i:397}, D{l:142,t:10,i:44}, D{l:132,t:11,i:429}, D{l:133,t:0,i:889}, D{l:4,t:0,i:160}, D{l:5,t:0,i:330}, D{l:7,t:0,i:1434}, D{l:136,t:0,i:174}, D{l:7,t:11,i:18}, D{l:7,t:11,i:699}, D{l:7,t:11,i:1966}, D{l:8,t:11,i:752}, D{l:9,t:11,i:273}, D{l:9,t:11,i:412}, D{l:9,t:11,i:703}, D{l:10,t:11,i:71}, D{l:10,t:11,i:427}, D{l:10,t:11,i:508}, D{l:146,t:11,i:97}, D{l:6,t:0,i:872}, D{l:134,t:0,i:899}, D{l:133,t:10,i:926}, D{l:134,t:0,i:1126}, D{l:134,t:0,i:918}, D{l:4,t:11,i:53}, D{l:5,t:11,i:186}, D{l:135,t:11,i:752}, D{l:7,t:0,i:268}, D{l:136,t:0,i:569}, D{l:134,t:0,i:1224}, D{l:6,t:0,i:1361}, D{l:7,t:10,i:1232}, D{l:137,t:10,i:531}, D{l:8,t:11,i:575}, D{l:10,t:11,i:289}, D{l:139,t:11,i:319}, D{l:133,t:10,i:670}, D{l:132,t:11,i:675}, D{l:133,t:0,i:374}, D{l:135,t:10,i:1957}, D{l:133,t:0,i:731}, D{l:11,t:0,i:190}, D{l:15,t:0,i:49}, D{l:11,t:11,i:190}, D{l:143,t:11,i:49}, D{l:4,t:0,i:626}, D{l:5,t:0,i:506}, D{l:5,t:0,i:642}, D{l:6,t:0,i:425}, D{l:10,t:0,i:202}, D{l:139,t:0,i:141}, D{l:137,t:0,i:444}, D{l:7,t:10,i:242}, D{l:135,t:10,i:1942}, D{l:6,t:11,i:209}, D{l:8,t:11,i:468}, D{l:9,t:11,i:210}, D{l:11,t:11,i:36}, D{l:12,t:11,i:28}, D{l:12,t:11,i:630}, D{l:13,t:11,i:21}, D{l:13,t:11,i:349}, D{l:14,t:11,i:7}, D{l:145,t:11,i:13}, D{l:4,t:11,i:342}, D{l:135,t:11,i:1179}, D{l:5,t:10,i:834}, D{l:7,t:10,i:1202}, D{l:8,t:10,i:14}, D{l:9,t:10,i:481}, D{l:137,t:10,i:880}, D{l:4,t:11,i:928}, D{l:133,t:11,i:910}, D{l:4,t:11,i:318}, D{l:4,t:11,i:496}, D{l:7,t:11,i:856}, D{l:139,t:11,i:654}, D{l:136,t:0,i:835}, D{l:7,t:0,i:1526}, D{l:138,t:10,i:465}, D{l:151,t:0,i:17}, D{l:135,t:0,i:477}, D{l:4,t:10,i:357}, D{l:6,t:10,i:172}, D{l:7,t:10,i:143}, D{l:137,t:10,i:413}, D{l:6,t:0,i:1374}, D{l:138,t:0,i:994}, D{l:18,t:0,i:76}, D{l:132,t:10,i:590}, D{l:7,t:0,i:287}, D{l:8,t:0,i:355}, D{l:9,t:0,i:293}, D{l:137,t:0,i:743}, D{l:134,t:0,i:1389}, D{l:7,t:11,i:915}, D{l:8,t:11,i:247}, D{l:147,t:11,i:0}, D{l:4,t:11,i:202}, D{l:5,t:11,i:382}, D{l:6,t:11,i:454}, D{l:7,t:11,i:936}, D{l:7,t:11,i:1803}, D{l:8,t:11,i:758}, D{l:9,t:11,i:375}, D{l:9,t:11,i:895}, D{l:10,t:11,i:743}, D{l:10,t:11,i:792}, D{l:11,t:11,i:978}, D{l:11,t:11,i:1012}, D{l:142,t:11,i:109}, D{l:5,t:0,i:384}, D{l:8,t:0,i:455}, D{l:140,t:0,i:48}, D{l:132,t:11,i:390}, D{l:5,t:10,i:169}, D{l:7,t:10,i:333}, D{l:136,t:10,i:45}, D{l:5,t:0,i:264}, D{l:134,t:0,i:184}, D{l:138,t:11,i:791}, D{l:133,t:11,i:717}, D{l:132,t:10,i:198}, D{l:6,t:11,i:445}, D{l:7,t:11,i:332}, D{l:137,t:11,i:909}, D{l:136,t:0,i:1001}, D{l:4,t:10,i:24}, D{l:5,t:10,i:140}, D{l:5,t:10,i:185}, D{l:7,t:10,i:1500}, D{l:11,t:10,i:565}, D{l:139,t:10,i:838}, D{l:134,t:11,i:578}, D{l:5,t:0,i:633}, D{l:6,t:0,i:28}, D{l:135,t:0,i:1323}, D{l:132,t:0,i:851}, D{l:136,t:11,i:267}, D{l:7,t:0,i:359}, D{l:8,t:0,i:243}, D{l:140,t:0,i:175}, D{l:4,t:10,i:334}, D{l:133,t:10,i:593}, D{l:141,t:11,i:87}, D{l:136,t:11,i:766}, D{l:10,t:0,i:287}, D{l:12,t:0,i:138}, D{l:10,t:11,i:287}, D{l:140,t:11,i:138}, D{l:4,t:0,i:105}, D{l:132,t:0,i:740}, D{l:140,t:10,i:116}, D{l:134,t:0,i:857}, D{l:135,t:11,i:1841}, D{l:6,t:0,i:1402}, D{l:137,t:0,i:819}, D{l:132,t:11,i:584}, D{l:132,t:10,i:709}, D{l:133,t:10,i:897}, D{l:5,t:0,i:224}, D{l:13,t:0,i:174}, D{l:146,t:0,i:52}, D{l:135,t:10,i:1840}, D{l:4,t:10,i:608}, D{l:133,t:10,i:497}, D{l:139,t:11,i:60}, D{l:4,t:0,i:758}, D{l:135,t:0,i:1649}, D{l:4,t:11,i:226}, D{l:4,t:11,i:326}, D{l:135,t:11,i:1770}, D{l:5,t:11,i:426}, D{l:8,t:11,i:30}, D{l:9,t:11,i:2}, D{l:11,t:11,i:549}, D{l:147,t:11,i:122}, D{l:135,t:10,i:2039}, D{l:6,t:10,i:540}, D{l:136,t:10,i:136}, D{l:4,t:0,i:573}, D{l:8,t:0,i:655}, D{l:4,t:10,i:897}, D{l:133,t:10,i:786}, D{l:7,t:0,i:351}, D{l:139,t:0,i:128}, D{l:133,t:10,i:999}, D{l:4,t:10,i:299}, D{l:135,t:10,i:1004}, D{l:133,t:0,i:918}, D{l:132,t:11,i:345}, D{l:4,t:11,i:385}, D{l:7,t:11,i:265}, D{l:135,t:11,i:587}, D{l:133,t:10,i:456}, D{l:136,t:10,i:180}, D{l:6,t:0,i:687}, D{l:134,t:0,i:1537}, D{l:4,t:11,i:347}, D{l:5,t:11,i:423}, D{l:5,t:11,i:996}, D{l:135,t:11,i:1329}, D{l:132,t:10,i:755}, D{l:7,t:11,i:1259}, D{l:9,t:11,i:125}, D{l:11,t:11,i:65}, D{l:140,t:11,i:285}, D{l:5,t:11,i:136}, D{l:6,t:11,i:136}, D{l:136,t:11,i:644}, D{l:134,t:0,i:1525}, D{l:4,t:0,i:1009}, D{l:135,t:0,i:1139}, D{l:139,t:10,i:338}, D{l:132,t:0,i:340}, D{l:135,t:10,i:1464}, D{l:8,t:0,i:847}, D{l:10,t:0,i:861}, D{l:10,t:0,i:876}, D{l:10,t:0,i:889}, D{l:10,t:0,i:922}, D{l:10,t:0,i:929}, D{l:10,t:0,i:933}, D{l:12,t:0,i:784}, D{l:140,t:0,i:791}, D{l:139,t:0,i:176}, D{l:9,t:11,i:134}, D{l:10,t:11,i:2}, D{l:10,t:11,i:27}, D{l:10,t:11,i:333}, D{l:11,t:11,i:722}, D{l:143,t:11,i:1}, D{l:4,t:11,i:433}, D{l:133,t:11,i:719}, D{l:5,t:0,i:985}, D{l:7,t:0,i:509}, D{l:7,t:0,i:529}, D{l:145,t:0,i:96}, D{l:132,t:0,i:615}, D{l:4,t:10,i:890}, D{l:5,t:10,i:805}, D{l:5,t:10,i:819}, D{l:5,t:10,i:961}, D{l:6,t:10,i:396}, D{l:6,t:10,i:1631}, D{l:6,t:10,i:1678}, D{l:7,t:10,i:1967}, D{l:7,t:10,i:2041}, D{l:9,t:10,i:630}, D{l:11,t:10,i:8}, D{l:11,t:10,i:1019}, D{l:12,t:10,i:176}, D{l:13,t:10,i:225}, D{l:14,t:10,i:292}, D{l:149,t:10,i:24}, D{l:135,t:0,i:1919}, D{l:134,t:0,i:1131}, D{l:144,t:11,i:21}, D{l:144,t:11,i:51}, D{l:135,t:10,i:1815}, D{l:4,t:0,i:247}, D{l:7,t:10,i:1505}, D{l:10,t:10,i:190}, D{l:10,t:10,i:634}, D{l:11,t:10,i:792}, D{l:12,t:10,i:358}, D{l:140,t:10,i:447}, D{l:5,t:10,i:0}, D{l:6,t:10,i:536}, D{l:7,t:10,i:604}, D{l:13,t:10,i:445}, D{l:145,t:10,i:126}, D{l:4,t:0,i:184}, D{l:5,t:0,i:390}, D{l:6,t:0,i:337}, D{l:7,t:0,i:23}, D{l:7,t:0,i:494}, D{l:7,t:0,i:618}, D{l:7,t:0,i:1456}, D{l:8,t:0,i:27}, D{l:8,t:0,i:599}, D{l:10,t:0,i:153}, D{l:139,t:0,i:710}, D{l:6,t:10,i:232}, D{l:6,t:10,i:412}, D{l:7,t:10,i:1074}, D{l:8,t:10,i:9}, D{l:8,t:10,i:157}, D{l:8,t:10,i:786}, D{l:9,t:10,i:196}, D{l:9,t:10,i:352}, D{l:9,t:10,i:457}, D{l:10,t:10,i:337}, D{l:11,t:10,i:232}, D{l:11,t:10,i:877}, D{l:12,t:10,i:480}, D{l:140,t:10,i:546}, D{l:13,t:0,i:38}, D{l:135,t:10,i:958}, D{l:4,t:10,i:382}, D{l:136,t:10,i:579}, D{l:4,t:10,i:212}, D{l:135,t:10,i:1206}, D{l:4,t:11,i:555}, D{l:8,t:11,i:536}, D{l:138,t:11,i:288}, D{l:11,t:11,i:139}, D{l:139,t:11,i:171}, D{l:9,t:11,i:370}, D{l:138,t:11,i:90}, D{l:132,t:0,i:1015}, D{l:134,t:0,i:1088}, D{l:5,t:10,i:655}, D{l:135,t:11,i:977}, D{l:134,t:0,i:1585}, D{l:17,t:10,i:67}, D{l:147,t:10,i:74}, D{l:10,t:0,i:227}, D{l:11,t:0,i:497}, D{l:11,t:0,i:709}, D{l:140,t:0,i:415}, D{l:6,t:0,i:360}, D{l:7,t:0,i:1664}, D{l:136,t:0,i:478}, D{l:7,t:0,i:95}, D{l:6,t:10,i:231}, D{l:136,t:10,i:423}, D{l:140,t:11,i:65}, D{l:4,t:11,i:257}, D{l:135,t:11,i:2031}, D{l:135,t:11,i:1768}, D{l:133,t:10,i:300}, D{l:139,t:11,i:211}, D{l:136,t:0,i:699}, D{l:6,t:10,i:237}, D{l:7,t:10,i:611}, D{l:8,t:10,i:100}, D{l:9,t:10,i:416}, D{l:11,t:10,i:335}, D{l:12,t:10,i:173}, D{l:146,t:10,i:101}, D{l:14,t:0,i:26}, D{l:146,t:0,i:150}, D{l:6,t:0,i:581}, D{l:135,t:0,i:1119}, D{l:135,t:10,i:1208}, D{l:132,t:0,i:739}, D{l:6,t:11,i:83}, D{l:6,t:11,i:1733}, D{l:135,t:11,i:1389}, D{l:137,t:0,i:869}, D{l:4,t:0,i:67}, D{l:5,t:0,i:422}, D{l:7,t:0,i:1037}, D{l:7,t:0,i:1289}, D{l:7,t:0,i:1555}, D{l:9,t:0,i:741}, D{l:145,t:0,i:108}, D{l:133,t:10,i:199}, D{l:12,t:10,i:427}, D{l:146,t:10,i:38}, D{l:136,t:0,i:464}, D{l:142,t:0,i:42}, D{l:10,t:0,i:96}, D{l:8,t:11,i:501}, D{l:137,t:11,i:696}, D{l:134,t:11,i:592}, D{l:4,t:0,i:512}, D{l:4,t:0,i:966}, D{l:5,t:0,i:342}, D{l:6,t:0,i:1855}, D{l:8,t:0,i:869}, D{l:8,t:0,i:875}, D{l:8,t:0,i:901}, D{l:144,t:0,i:26}, D{l:8,t:0,i:203}, D{l:11,t:0,i:823}, D{l:11,t:0,i:846}, D{l:12,t:0,i:482}, D{l:13,t:0,i:277}, D{l:13,t:0,i:302}, D{l:13,t:0,i:464}, D{l:14,t:0,i:205}, D{l:142,t:0,i:221}, D{l:4,t:0,i:449}, D{l:133,t:0,i:718}, D{l:7,t:11,i:1718}, D{l:9,t:11,i:95}, D{l:9,t:11,i:274}, D{l:10,t:11,i:279}, D{l:10,t:11,i:317}, D{l:10,t:11,i:420}, D{l:11,t:11,i:303}, D{l:11,t:11,i:808}, D{l:12,t:11,i:134}, D{l:12,t:11,i:367}, D{l:13,t:11,i:149}, D{l:13,t:11,i:347}, D{l:14,t:11,i:349}, D{l:14,t:11,i:406}, D{l:18,t:11,i:22}, D{l:18,t:11,i:89}, D{l:18,t:11,i:122}, D{l:147,t:11,i:47}, D{l:133,t:11,i:26}, D{l:4,t:0,i:355}, D{l:6,t:0,i:311}, D{l:9,t:0,i:256}, D{l:138,t:0,i:404}, D{l:132,t:11,i:550}, D{l:10,t:0,i:758}, D{l:6,t:10,i:312}, D{l:6,t:10,i:1715}, D{l:10,t:10,i:584}, D{l:11,t:10,i:546}, D{l:11,t:10,i:692}, D{l:12,t:10,i:259}, D{l:12,t:10,i:295}, D{l:13,t:10,i:46}, D{l:141,t:10,i:154}, D{l:136,t:11,i:822}, D{l:5,t:0,i:827}, D{l:4,t:11,i:902}, D{l:5,t:11,i:809}, D{l:6,t:11,i:122}, D{l:135,t:11,i:896}, D{l:5,t:0,i:64}, D{l:140,t:0,i:581}, D{l:4,t:0,i:442}, D{l:6,t:0,i:739}, D{l:7,t:0,i:1047}, D{l:7,t:0,i:1352}, D{l:7,t:0,i:1643}, D{l:7,t:11,i:1911}, D{l:9,t:11,i:449}, D{l:10,t:11,i:192}, D{l:138,t:11,i:740}, D{l:135,t:11,i:262}, D{l:132,t:10,i:588}, D{l:133,t:11,i:620}, D{l:5,t:0,i:977}, D{l:6,t:0,i:288}, D{l:7,t:0,i:528}, D{l:4,t:11,i:34}, D{l:5,t:11,i:574}, D{l:7,t:11,i:279}, D{l:7,t:11,i:1624}, D{l:136,t:11,i:601}, D{l:6,t:0,i:1375}, D{l:4,t:10,i:231}, D{l:5,t:10,i:61}, D{l:6,t:10,i:104}, D{l:7,t:10,i:729}, D{l:7,t:10,i:964}, D{l:7,t:10,i:1658}, D{l:140,t:10,i:414}, D{l:6,t:10,i:263}, D{l:138,t:10,i:757}, D{l:132,t:10,i:320}, D{l:4,t:0,i:254}, D{l:7,t:0,i:1309}, D{l:5,t:11,i:332}, D{l:135,t:11,i:1309}, D{l:6,t:11,i:261}, D{l:8,t:11,i:182}, D{l:139,t:11,i:943}, D{l:132,t:10,i:225}, D{l:6,t:0,i:12}, D{l:135,t:0,i:1219}, D{l:4,t:0,i:275}, D{l:12,t:0,i:376}, D{l:6,t:11,i:1721}, D{l:141,t:11,i:490}, D{l:4,t:11,i:933}, D{l:133,t:11,i:880}, D{l:6,t:0,i:951}, D{l:6,t:0,i:1109}, D{l:6,t:0,i:1181}, D{l:7,t:0,i:154}, D{l:4,t:10,i:405}, D{l:7,t:10,i:817}, D{l:14,t:10,i:58}, D{l:17,t:10,i:37}, D{l:146,t:10,i:124}, D{l:6,t:0,i:1520}, D{l:133,t:10,i:974}, D{l:134,t:0,i:1753}, D{l:6,t:0,i:369}, D{l:6,t:0,i:502}, D{l:7,t:0,i:1036}, D{l:8,t:0,i:348}, D{l:9,t:0,i:452}, D{l:10,t:0,i:26}, D{l:11,t:0,i:224}, D{l:11,t:0,i:387}, D{l:11,t:0,i:772}, D{l:12,t:0,i:95}, D{l:12,t:0,i:629}, D{l:13,t:0,i:195}, D{l:13,t:0,i:207}, D{l:13,t:0,i:241}, D{l:14,t:0,i:260}, D{l:14,t:0,i:270}, D{l:143,t:0,i:140}, D{l:132,t:0,i:269}, D{l:5,t:0,i:480}, D{l:7,t:0,i:532}, D{l:7,t:0,i:1197}, D{l:7,t:0,i:1358}, D{l:8,t:0,i:291}, D{l:11,t:0,i:349}, D{l:142,t:0,i:396}, D{l:5,t:10,i:235}, D{l:7,t:10,i:1239}, D{l:11,t:10,i:131}, D{l:140,t:10,i:370}, D{l:7,t:10,i:956}, D{l:7,t:10,i:1157}, D{l:7,t:10,i:1506}, D{l:7,t:10,i:1606}, D{l:7,t:10,i:1615}, D{l:7,t:10,i:1619}, D{l:7,t:10,i:1736}, D{l:7,t:10,i:1775}, D{l:8,t:10,i:590}, D{l:9,t:10,i:324}, D{l:9,t:10,i:736}, D{l:9,t:10,i:774}, D{l:9,t:10,i:776}, D{l:9,t:10,i:784}, D{l:10,t:10,i:567}, D{l:10,t:10,i:708}, D{l:11,t:10,i:518}, D{l:11,t:10,i:613}, D{l:11,t:10,i:695}, D{l:11,t:10,i:716}, D{l:11,t:10,i:739}, D{l:11,t:10,i:770}, D{l:11,t:10,i:771}, D{l:11,t:10,i:848}, D{l:11,t:10,i:857}, D{l:11,t:10,i:931}, D{l:11,t:10,i:947}, D{l:12,t:10,i:326}, D{l:12,t:10,i:387}, D{l:12,t:10,i:484}, D{l:12,t:10,i:528}, D{l:12,t:10,i:552}, D{l:12,t:10,i:613}, D{l:13,t:10,i:189}, D{l:13,t:10,i:256}, D{l:13,t:10,i:340}, D{l:13,t:10,i:432}, D{l:13,t:10,i:436}, D{l:13,t:10,i:440}, D{l:13,t:10,i:454}, D{l:14,t:10,i:174}, D{l:14,t:10,i:220}, D{l:14,t:10,i:284}, D{l:14,t:10,i:390}, D{l:145,t:10,i:121}, D{l:8,t:11,i:598}, D{l:9,t:11,i:664}, D{l:138,t:11,i:441}, D{l:9,t:10,i:137}, D{l:138,t:10,i:221}, D{l:133,t:11,i:812}, D{l:148,t:0,i:15}, D{l:134,t:0,i:1341}, D{l:6,t:0,i:1017}, D{l:4,t:11,i:137}, D{l:7,t:11,i:1178}, D{l:135,t:11,i:1520}, D{l:7,t:10,i:390}, D{l:138,t:10,i:140}, D{l:7,t:11,i:1260}, D{l:135,t:11,i:1790}, D{l:137,t:11,i:191}, D{l:135,t:10,i:1144}, D{l:6,t:0,i:1810}, D{l:7,t:0,i:657}, D{l:8,t:0,i:886}, D{l:10,t:0,i:857}, D{l:14,t:0,i:440}, D{l:144,t:0,i:96}, D{l:8,t:0,i:533}, D{l:6,t:11,i:1661}, D{l:7,t:11,i:1975}, D{l:7,t:11,i:2009}, D{l:135,t:11,i:2011}, D{l:6,t:0,i:1453}, D{l:134,t:10,i:464}, D{l:132,t:11,i:715}, D{l:5,t:10,i:407}, D{l:11,t:10,i:204}, D{l:11,t:10,i:243}, D{l:11,t:10,i:489}, D{l:12,t:10,i:293}, D{l:19,t:10,i:37}, D{l:20,t:10,i:73}, D{l:150,t:10,i:38}, D{l:133,t:11,i:703}, D{l:4,t:0,i:211}, D{l:7,t:0,i:1483}, D{l:5,t:10,i:325}, D{l:8,t:10,i:5}, D{l:8,t:10,i:227}, D{l:9,t:10,i:105}, D{l:10,t:10,i:585}, D{l:140,t:10,i:614}, D{l:4,t:0,i:332}, D{l:5,t:0,i:335}, D{l:6,t:0,i:238}, D{l:7,t:0,i:269}, D{l:7,t:0,i:811}, D{l:7,t:0,i:1797}, D{l:8,t:0,i:836}, D{l:9,t:0,i:507}, D{l:141,t:0,i:242}, D{l:5,t:11,i:89}, D{l:7,t:11,i:1915}, D{l:9,t:11,i:185}, D{l:9,t:11,i:235}, D{l:9,t:11,i:496}, D{l:10,t:11,i:64}, D{l:10,t:11,i:270}, D{l:10,t:11,i:403}, D{l:10,t:11,i:469}, D{l:10,t:11,i:529}, D{l:10,t:11,i:590}, D{l:11,t:11,i:140}, D{l:11,t:11,i:860}, D{l:13,t:11,i:1}, D{l:13,t:11,i:422}, D{l:14,t:11,i:341}, D{l:14,t:11,i:364}, D{l:17,t:11,i:93}, D{l:18,t:11,i:113}, D{l:19,t:11,i:97}, D{l:147,t:11,i:113}, D{l:133,t:11,i:695}, D{l:16,t:0,i:19}, D{l:5,t:11,i:6}, D{l:6,t:11,i:183}, D{l:6,t:10,i:621}, D{l:7,t:11,i:680}, D{l:7,t:11,i:978}, D{l:7,t:11,i:1013}, D{l:7,t:11,i:1055}, D{l:12,t:11,i:230}, D{l:13,t:11,i:172}, D{l:13,t:10,i:504}, D{l:146,t:11,i:29}, D{l:136,t:0,i:156}, D{l:133,t:0,i:1009}, D{l:6,t:11,i:29}, D{l:139,t:11,i:63}, D{l:134,t:0,i:820}, D{l:134,t:10,i:218}, D{l:7,t:10,i:454}, D{l:7,t:10,i:782}, D{l:8,t:10,i:768}, D{l:140,t:10,i:686}, D{l:5,t:0,i:228}, D{l:6,t:0,i:203}, D{l:7,t:0,i:156}, D{l:8,t:0,i:347}, D{l:9,t:0,i:265}, D{l:18,t:0,i:39}, D{l:20,t:0,i:54}, D{l:21,t:0,i:31}, D{l:22,t:0,i:3}, D{l:23,t:0,i:0}, D{l:15,t:11,i:8}, D{l:18,t:11,i:39}, D{l:20,t:11,i:54}, D{l:21,t:11,i:31}, D{l:22,t:11,i:3}, D{l:151,t:11,i:0}, D{l:7,t:0,i:1131}, D{l:135,t:0,i:1468}, D{l:144,t:10,i:0}, D{l:134,t:0,i:1276}, D{l:10,t:10,i:676}, D{l:140,t:10,i:462}, D{l:132,t:11,i:311}, D{l:134,t:11,i:1740}, D{l:7,t:11,i:170}, D{l:8,t:11,i:90}, D{l:8,t:11,i:177}, D{l:8,t:11,i:415}, D{l:11,t:11,i:714}, D{l:142,t:11,i:281}, D{l:134,t:10,i:164}, D{l:6,t:0,i:1792}, D{l:138,t:0,i:849}, D{l:150,t:10,i:50}, D{l:5,t:0,i:291}, D{l:5,t:0,i:318}, D{l:7,t:0,i:765}, D{l:9,t:0,i:389}, D{l:12,t:0,i:548}, D{l:8,t:11,i:522}, D{l:142,t:11,i:328}, D{l:11,t:11,i:91}, D{l:13,t:11,i:129}, D{l:15,t:11,i:101}, D{l:145,t:11,i:125}, D{l:4,t:11,i:494}, D{l:6,t:11,i:74}, D{l:7,t:11,i:44}, D{l:7,t:11,i:407}, D{l:8,t:11,i:551}, D{l:12,t:11,i:17}, D{l:15,t:11,i:5}, D{l:148,t:11,i:11}, D{l:4,t:11,i:276}, D{l:133,t:11,i:296}, D{l:6,t:10,i:343}, D{l:7,t:10,i:195}, D{l:7,t:11,i:1777}, D{l:9,t:10,i:226}, D{l:10,t:10,i:197}, D{l:10,t:10,i:575}, D{l:11,t:10,i:502}, D{l:139,t:10,i:899}, D{l:10,t:0,i:525}, D{l:139,t:0,i:82}, D{l:14,t:0,i:453}, D{l:4,t:11,i:7}, D{l:5,t:11,i:90}, D{l:5,t:11,i:158}, D{l:6,t:11,i:542}, D{l:7,t:11,i:221}, D{l:7,t:11,i:1574}, D{l:9,t:11,i:490}, D{l:10,t:11,i:540}, D{l:11,t:11,i:443}, D{l:139,t:11,i:757}, D{l:135,t:0,i:666}, D{l:22,t:10,i:29}, D{l:150,t:11,i:29}, D{l:4,t:0,i:422}, D{l:147,t:10,i:8}, D{l:5,t:0,i:355}, D{l:145,t:0,i:0}, D{l:6,t:0,i:1873}, D{l:9,t:0,i:918}, D{l:7,t:11,i:588}, D{l:9,t:11,i:175}, D{l:138,t:11,i:530}, D{l:143,t:11,i:31}, D{l:11,t:0,i:165}, D{l:7,t:10,i:1125}, D{l:9,t:10,i:143}, D{l:14,t:10,i:405}, D{l:150,t:10,i:21}, D{l:9,t:0,i:260}, D{l:137,t:0,i:905}, D{l:5,t:11,i:872}, D{l:6,t:11,i:57}, D{l:6,t:11,i:479}, D{l:6,t:11,i:562}, D{l:7,t:11,i:471}, D{l:7,t:11,i:1060}, D{l:9,t:11,i:447}, D{l:9,t:11,i:454}, D{l:141,t:11,i:6}, D{l:138,t:11,i:704}, D{l:133,t:0,i:865}, D{l:5,t:0,i:914}, D{l:134,t:0,i:1625}, D{l:133,t:0,i:234}, D{l:7,t:0,i:1383}, D{l:5,t:11,i:31}, D{l:6,t:11,i:614}, D{l:145,t:11,i:61}, D{l:7,t:11,i:1200}, D{l:138,t:11,i:460}, D{l:6,t:11,i:424}, D{l:135,t:11,i:1866}, D{l:136,t:0,i:306}, D{l:5,t:10,i:959}, D{l:12,t:11,i:30}, D{l:13,t:11,i:148}, D{l:14,t:11,i:87}, D{l:14,t:11,i:182}, D{l:16,t:11,i:42}, D{l:18,t:11,i:92}, D{l:148,t:11,i:70}, D{l:6,t:0,i:1919}, D{l:6,t:0,i:1921}, D{l:9,t:0,i:923}, D{l:9,t:0,i:930}, D{l:9,t:0,i:941}, D{l:9,t:0,i:949}, D{l:9,t:0,i:987}, D{l:9,t:0,i:988}, D{l:9,t:0,i:992}, D{l:12,t:0,i:802}, D{l:12,t:0,i:815}, D{l:12,t:0,i:856}, D{l:12,t:0,i:885}, D{l:12,t:0,i:893}, D{l:12,t:0,i:898}, D{l:12,t:0,i:919}, D{l:12,t:0,i:920}, D{l:12,t:0,i:941}, D{l:12,t:0,i:947}, D{l:15,t:0,i:183}, D{l:15,t:0,i:185}, D{l:15,t:0,i:189}, D{l:15,t:0,i:197}, D{l:15,t:0,i:202}, D{l:15,t:0,i:233}, D{l:18,t:0,i:218}, D{l:18,t:0,i:219}, D{l:18,t:0,i:233}, D{l:143,t:11,i:156}, D{l:135,t:10,i:1759}, D{l:136,t:10,i:173}, D{l:13,t:0,i:163}, D{l:13,t:0,i:180}, D{l:18,t:0,i:78}, D{l:20,t:0,i:35}, D{l:5,t:11,i:13}, D{l:134,t:11,i:142}, D{l:134,t:10,i:266}, D{l:6,t:11,i:97}, D{l:7,t:11,i:116}, D{l:8,t:11,i:322}, D{l:8,t:11,i:755}, D{l:9,t:11,i:548}, D{l:10,t:11,i:714}, D{l:11,t:11,i:884}, D{l:141,t:11,i:324}, D{l:135,t:0,i:1312}, D{l:9,t:0,i:814}, D{l:137,t:11,i:676}, D{l:133,t:0,i:707}, D{l:135,t:0,i:1493}, D{l:6,t:0,i:421}, D{l:7,t:0,i:61}, D{l:7,t:0,i:1540}, D{l:10,t:0,i:11}, D{l:138,t:0,i:501}, D{l:12,t:0,i:733}, D{l:12,t:0,i:766}, D{l:7,t:11,i:866}, D{l:135,t:11,i:1163}, D{l:137,t:0,i:341}, D{l:142,t:0,i:98}, D{l:145,t:11,i:115}, D{l:135,t:11,i:1111}, D{l:136,t:10,i:300}, D{l:136,t:0,i:1014}, D{l:8,t:11,i:1}, D{l:9,t:11,i:112}, D{l:138,t:11,i:326}, D{l:132,t:11,i:730}, D{l:5,t:11,i:488}, D{l:6,t:11,i:527}, D{l:7,t:11,i:489}, D{l:7,t:11,i:1636}, D{l:8,t:11,i:121}, D{l:8,t:11,i:144}, D{l:8,t:11,i:359}, D{l:9,t:11,i:193}, D{l:9,t:11,i:241}, D{l:9,t:11,i:336}, D{l:9,t:11,i:882}, D{l:11,t:11,i:266}, D{l:11,t:11,i:372}, D{l:11,t:11,i:944}, D{l:12,t:11,i:401}, D{l:140,t:11,i:641}, D{l:6,t:0,i:971}, D{l:134,t:0,i:1121}, D{l:6,t:0,i:102}, D{l:7,t:0,i:72}, D{l:15,t:0,i:142}, D{l:147,t:0,i:67}, D{l:151,t:0,i:30}, D{l:135,t:0,i:823}, D{l:134,t:0,i:1045}, D{l:5,t:10,i:427}, D{l:5,t:10,i:734}, D{l:7,t:10,i:478}, D{l:136,t:10,i:52}, D{l:7,t:0,i:1930}, D{l:11,t:10,i:217}, D{l:142,t:10,i:165}, D{l:6,t:0,i:1512}, D{l:135,t:0,i:1870}, D{l:9,t:11,i:31}, D{l:10,t:11,i:244}, D{l:10,t:11,i:699}, D{l:12,t:11,i:149}, D{l:141,t:11,i:497}, D{l:133,t:11,i:377}, D{l:145,t:11,i:101}, D{l:10,t:11,i:158}, D{l:13,t:11,i:13}, D{l:13,t:11,i:137}, D{l:13,t:11,i:258}, D{l:14,t:11,i:111}, D{l:14,t:11,i:225}, D{l:14,t:11,i:253}, D{l:14,t:11,i:304}, D{l:14,t:11,i:339}, D{l:14,t:11,i:417}, D{l:146,t:11,i:33}, D{l:6,t:0,i:87}, D{l:6,t:10,i:1734}, D{l:7,t:10,i:20}, D{l:7,t:10,i:1056}, D{l:8,t:10,i:732}, D{l:9,t:10,i:406}, D{l:9,t:10,i:911}, D{l:138,t:10,i:694}, D{l:134,t:0,i:1243}, D{l:137,t:0,i:245}, D{l:7,t:0,i:68}, D{l:8,t:0,i:48}, D{l:8,t:0,i:88}, D{l:8,t:0,i:582}, D{l:8,t:0,i:681}, D{l:9,t:0,i:373}, D{l:9,t:0,i:864}, D{l:11,t:0,i:157}, D{l:11,t:0,i:336}, D{l:11,t:0,i:843}, D{l:148,t:0,i:27}, D{l:8,t:11,i:663}, D{l:144,t:11,i:8}, D{l:133,t:10,i:613}, D{l:4,t:0,i:88}, D{l:5,t:0,i:137}, D{l:5,t:0,i:174}, D{l:5,t:0,i:777}, D{l:6,t:0,i:1664}, D{l:6,t:0,i:1725}, D{l:7,t:0,i:77}, D{l:7,t:0,i:426}, D{l:7,t:0,i:1317}, D{l:7,t:0,i:1355}, D{l:8,t:0,i:126}, D{l:8,t:0,i:563}, D{l:9,t:0,i:523}, D{l:9,t:0,i:750}, D{l:10,t:0,i:310}, D{l:10,t:0,i:836}, D{l:11,t:0,i:42}, D{l:11,t:0,i:318}, D{l:11,t:0,i:731}, D{l:12,t:0,i:68}, D{l:12,t:0,i:92}, D{l:12,t:0,i:507}, D{l:12,t:0,i:692}, D{l:13,t:0,i:81}, D{l:13,t:0,i:238}, D{l:13,t:0,i:374}, D{l:14,t:0,i:436}, D{l:18,t:0,i:138}, D{l:19,t:0,i:78}, D{l:19,t:0,i:111}, D{l:20,t:0,i:55}, D{l:20,t:0,i:77}, D{l:148,t:0,i:92}, D{l:141,t:0,i:418}, D{l:4,t:0,i:938}, D{l:137,t:0,i:625}, D{l:138,t:0,i:351}, D{l:5,t:11,i:843}, D{l:7,t:10,i:32}, D{l:7,t:10,i:984}, D{l:8,t:10,i:85}, D{l:8,t:10,i:709}, D{l:9,t:10,i:579}, D{l:9,t:10,i:847}, D{l:9,t:10,i:856}, D{l:10,t:10,i:799}, D{l:11,t:10,i:258}, D{l:11,t:10,i:1007}, D{l:12,t:10,i:331}, D{l:12,t:10,i:615}, D{l:13,t:10,i:188}, D{l:13,t:10,i:435}, D{l:14,t:10,i:8}, D{l:15,t:10,i:165}, D{l:16,t:10,i:27}, D{l:148,t:10,i:40}, D{l:6,t:0,i:1668}, D{l:7,t:0,i:1499}, D{l:8,t:0,i:117}, D{l:9,t:0,i:314}, D{l:138,t:0,i:174}, D{l:135,t:0,i:707}, D{l:132,t:11,i:554}, D{l:133,t:11,i:536}, D{l:5,t:0,i:403}, D{l:5,t:11,i:207}, D{l:9,t:11,i:79}, D{l:11,t:11,i:625}, D{l:145,t:11,i:7}, D{l:132,t:11,i:424}, D{l:136,t:11,i:785}, D{l:4,t:10,i:167}, D{l:135,t:10,i:82}, D{l:9,t:0,i:7}, D{l:23,t:0,i:6}, D{l:9,t:11,i:7}, D{l:151,t:11,i:6}, D{l:6,t:0,i:282}, D{l:5,t:10,i:62}, D{l:6,t:10,i:534}, D{l:7,t:10,i:74}, D{l:7,t:10,i:678}, D{l:7,t:10,i:684}, D{l:7,t:10,i:1043}, D{l:7,t:10,i:1072}, D{l:8,t:10,i:280}, D{l:8,t:10,i:541}, D{l:8,t:10,i:686}, D{l:9,t:10,i:258}, D{l:10,t:10,i:519}, D{l:11,t:10,i:252}, D{l:140,t:10,i:282}, D{l:138,t:10,i:33}, D{l:132,t:10,i:359}, D{l:4,t:0,i:44}, D{l:5,t:0,i:311}, D{l:6,t:0,i:156}, D{l:7,t:0,i:639}, D{l:7,t:0,i:762}, D{l:7,t:0,i:1827}, D{l:9,t:0,i:8}, D{l:9,t:0,i:462}, D{l:148,t:0,i:83}, D{l:7,t:11,i:769}, D{l:9,t:11,i:18}, D{l:138,t:11,i:358}, D{l:4,t:0,i:346}, D{l:7,t:0,i:115}, D{l:9,t:0,i:180}, D{l:9,t:0,i:456}, D{l:10,t:0,i:363}, D{l:4,t:11,i:896}, D{l:134,t:11,i:1777}, D{l:133,t:10,i:211}, D{l:7,t:0,i:761}, D{l:7,t:0,i:1051}, D{l:137,t:0,i:545}, D{l:6,t:10,i:145}, D{l:141,t:10,i:336}, D{l:7,t:11,i:750}, D{l:9,t:11,i:223}, D{l:11,t:11,i:27}, D{l:11,t:11,i:466}, D{l:12,t:11,i:624}, D{l:14,t:11,i:265}, D{l:146,t:11,i:61}, D{l:6,t:0,i:752}, D{l:6,t:0,i:768}, D{l:6,t:0,i:1195}, D{l:6,t:0,i:1254}, D{l:6,t:0,i:1619}, D{l:137,t:0,i:835}, D{l:6,t:0,i:1936}, D{l:8,t:0,i:930}, D{l:136,t:0,i:960}, D{l:132,t:10,i:263}, D{l:132,t:11,i:249}, D{l:12,t:0,i:653}, D{l:132,t:10,i:916}, D{l:4,t:11,i:603}, D{l:133,t:11,i:661}, D{l:8,t:0,i:344}, D{l:4,t:11,i:11}, D{l:6,t:11,i:128}, D{l:7,t:11,i:231}, D{l:7,t:11,i:1533}, D{l:138,t:11,i:725}, D{l:134,t:0,i:1483}, D{l:134,t:0,i:875}, D{l:6,t:0,i:185}, D{l:7,t:0,i:1899}, D{l:9,t:0,i:875}, D{l:139,t:0,i:673}, D{l:15,t:10,i:155}, D{l:144,t:10,i:79}, D{l:7,t:0,i:93}, D{l:7,t:0,i:210}, D{l:7,t:0,i:1223}, D{l:8,t:0,i:451}, D{l:8,t:0,i:460}, D{l:11,t:0,i:353}, D{l:11,t:0,i:475}, D{l:4,t:10,i:599}, D{l:6,t:10,i:1634}, D{l:7,t:10,i:67}, D{l:7,t:10,i:691}, D{l:7,t:10,i:979}, D{l:7,t:10,i:1697}, D{l:8,t:10,i:207}, D{l:8,t:10,i:214}, D{l:8,t:10,i:231}, D{l:8,t:10,i:294}, D{l:8,t:10,i:336}, D{l:8,t:10,i:428}, D{l:8,t:10,i:471}, D{l:8,t:10,i:622}, D{l:8,t:10,i:626}, D{l:8,t:10,i:679}, D{l:8,t:10,i:759}, D{l:8,t:10,i:829}, D{l:9,t:10,i:11}, D{l:9,t:10,i:246}, D{l:9,t:10,i:484}, D{l:9,t:10,i:573}, D{l:9,t:10,i:706}, D{l:9,t:10,i:762}, D{l:9,t:10,i:798}, D{l:9,t:10,i:855}, D{l:9,t:10,i:870}, D{l:9,t:10,i:912}, D{l:10,t:10,i:303}, D{l:10,t:10,i:335}, D{l:10,t:10,i:424}, D{l:10,t:10,i:461}, D{l:10,t:10,i:543}, D{l:10,t:10,i:759}, D{l:10,t:10,i:814}, D{l:11,t:10,i:59}, D{l:11,t:10,i:235}, D{l:11,t:10,i:590}, D{l:11,t:10,i:929}, D{l:11,t:10,i:963}, D{l:11,t:10,i:987}, D{l:12,t:10,i:114}, D{l:12,t:10,i:182}, D{l:12,t:10,i:226}, D{l:12,t:10,i:332}, D{l:12,t:10,i:439}, D{l:12,t:10,i:575}, D{l:12,t:10,i:598}, D{l:12,t:10,i:675}, D{l:13,t:10,i:8}, D{l:13,t:10,i:125}, D{l:13,t:10,i:194}, D{l:13,t:10,i:287}, D{l:14,t:10,i:197}, D{l:14,t:10,i:383}, D{l:15,t:10,i:53}, D{l:17,t:10,i:63}, D{l:19,t:10,i:46}, D{l:19,t:10,i:98}, D{l:19,t:10,i:106}, D{l:148,t:10,i:85}, D{l:132,t:11,i:476}, D{l:4,t:0,i:327}, D{l:5,t:0,i:478}, D{l:7,t:0,i:1332}, D{l:136,t:0,i:753}, D{l:5,t:0,i:1020}, D{l:133,t:0,i:1022}, D{l:135,t:11,i:1807}, D{l:4,t:0,i:103}, D{l:133,t:0,i:401}, D{l:4,t:0,i:499}, D{l:135,t:0,i:1421}, D{l:10,t:0,i:207}, D{l:13,t:0,i:164}, D{l:147,t:10,i:126}, D{l:9,t:11,i:20}, D{l:10,t:11,i:324}, D{l:139,t:11,i:488}, D{l:132,t:0,i:96}, D{l:9,t:11,i:280}, D{l:138,t:11,i:134}, D{l:135,t:0,i:968}, D{l:133,t:10,i:187}, D{l:135,t:10,i:1286}, D{l:5,t:11,i:112}, D{l:6,t:11,i:103}, D{l:134,t:11,i:150}, D{l:8,t:0,i:914}, D{l:10,t:0,i:3}, D{l:4,t:10,i:215}, D{l:9,t:10,i:38}, D{l:11,t:10,i:23}, D{l:11,t:10,i:127}, D{l:139,t:10,i:796}, D{l:135,t:0,i:399}, D{l:6,t:0,i:563}, D{l:137,t:0,i:224}, D{l:6,t:0,i:704}, D{l:134,t:0,i:1214}, D{l:4,t:11,i:708}, D{l:8,t:11,i:15}, D{l:9,t:11,i:50}, D{l:9,t:11,i:386}, D{l:11,t:11,i:18}, D{l:11,t:11,i:529}, D{l:140,t:11,i:228}, D{l:4,t:11,i:563}, D{l:7,t:11,i:109}, D{l:7,t:11,i:592}, D{l:7,t:11,i:637}, D{l:7,t:11,i:770}, D{l:7,t:11,i:1701}, D{l:8,t:11,i:436}, D{l:8,t:11,i:463}, D{l:9,t:11,i:60}, D{l:9,t:11,i:335}, D{l:9,t:11,i:904}, D{l:10,t:11,i:73}, D{l:11,t:11,i:434}, D{l:12,t:11,i:585}, D{l:13,t:11,i:331}, D{l:18,t:11,i:110}, D{l:148,t:11,i:60}, D{l:134,t:0,i:1559}, D{l:132,t:11,i:502}, D{l:6,t:11,i:347}, D{l:138,t:11,i:161}, D{l:4,t:11,i:33}, D{l:5,t:11,i:102}, D{l:5,t:11,i:500}, D{l:6,t:11,i:284}, D{l:7,t:11,i:1079}, D{l:7,t:11,i:1423}, D{l:7,t:11,i:1702}, D{l:8,t:11,i:470}, D{l:9,t:11,i:554}, D{l:9,t:11,i:723}, D{l:139,t:11,i:333}, D{l:7,t:11,i:246}, D{l:135,t:11,i:840}, D{l:6,t:11,i:10}, D{l:8,t:11,i:571}, D{l:9,t:11,i:739}, D{l:143,t:11,i:91}, D{l:8,t:0,i:861}, D{l:10,t:0,i:905}, D{l:12,t:0,i:730}, D{l:12,t:0,i:789}, D{l:133,t:11,i:626}, D{l:134,t:0,i:946}, D{l:5,t:0,i:746}, D{l:12,t:0,i:333}, D{l:14,t:0,i:332}, D{l:12,t:11,i:333}, D{l:142,t:11,i:332}, D{l:5,t:11,i:18}, D{l:6,t:11,i:526}, D{l:13,t:11,i:24}, D{l:13,t:11,i:110}, D{l:19,t:11,i:5}, D{l:147,t:11,i:44}, D{l:4,t:0,i:910}, D{l:5,t:0,i:832}, D{l:135,t:10,i:2002}, D{l:10,t:11,i:768}, D{l:139,t:11,i:787}, D{l:4,t:11,i:309}, D{l:5,t:11,i:462}, D{l:7,t:11,i:970}, D{l:135,t:11,i:1097}, D{l:4,t:10,i:28}, D{l:5,t:10,i:440}, D{l:7,t:10,i:248}, D{l:11,t:10,i:833}, D{l:140,t:10,i:344}, D{l:134,t:10,i:1654}, D{l:6,t:0,i:632}, D{l:6,t:0,i:652}, D{l:6,t:0,i:1272}, D{l:6,t:0,i:1384}, D{l:134,t:0,i:1560}, D{l:134,t:11,i:1704}, D{l:6,t:0,i:1393}, D{l:133,t:10,i:853}, D{l:6,t:10,i:249}, D{l:7,t:10,i:1234}, D{l:139,t:10,i:573}, D{l:5,t:11,i:86}, D{l:7,t:11,i:743}, D{l:9,t:11,i:85}, D{l:10,t:11,i:281}, D{l:10,t:11,i:432}, D{l:11,t:11,i:490}, D{l:12,t:11,i:251}, D{l:13,t:11,i:118}, D{l:14,t:11,i:378}, D{l:146,t:11,i:143}, D{l:5,t:11,i:524}, D{l:133,t:11,i:744}, D{l:134,t:0,i:1514}, D{l:10,t:0,i:201}, D{l:142,t:0,i:319}, D{l:7,t:0,i:717}, D{l:10,t:0,i:510}, D{l:7,t:10,i:392}, D{l:8,t:10,i:20}, D{l:8,t:10,i:172}, D{l:8,t:10,i:690}, D{l:9,t:10,i:383}, D{l:9,t:10,i:845}, D{l:11,t:10,i:293}, D{l:11,t:10,i:832}, D{l:11,t:10,i:920}, D{l:11,t:10,i:984}, D{l:141,t:10,i:221}, D{l:134,t:0,i:1381}, D{l:5,t:10,i:858}, D{l:133,t:10,i:992}, D{l:8,t:0,i:528}, D{l:137,t:0,i:348}, D{l:10,t:11,i:107}, D{l:140,t:11,i:436}, D{l:4,t:0,i:20}, D{l:133,t:0,i:616}, D{l:134,t:0,i:1251}, D{l:132,t:11,i:927}, D{l:10,t:11,i:123}, D{l:12,t:11,i:670}, D{l:13,t:11,i:371}, D{l:14,t:11,i:142}, D{l:146,t:11,i:94}, D{l:134,t:0,i:1163}, D{l:7,t:11,i:1149}, D{l:137,t:11,i:156}, D{l:134,t:0,i:307}, D{l:133,t:11,i:778}, D{l:7,t:0,i:1091}, D{l:135,t:0,i:1765}, D{l:5,t:11,i:502}, D{l:6,t:10,i:268}, D{l:137,t:10,i:62}, D{l:8,t:11,i:196}, D{l:10,t:11,i:283}, D{l:139,t:11,i:406}, D{l:4,t:0,i:26}, D{l:5,t:0,i:429}, D{l:6,t:0,i:245}, D{l:7,t:0,i:704}, D{l:7,t:0,i:1379}, D{l:135,t:0,i:1474}, D{l:133,t:11,i:855}, D{l:132,t:0,i:881}, D{l:4,t:0,i:621}, D{l:135,t:11,i:1596}, D{l:7,t:11,i:1400}, D{l:9,t:11,i:446}, D{l:138,t:11,i:45}, D{l:6,t:0,i:736}, D{l:138,t:10,i:106}, D{l:133,t:0,i:542}, D{l:134,t:0,i:348}, D{l:133,t:0,i:868}, D{l:136,t:0,i:433}, D{l:135,t:0,i:1495}, D{l:138,t:0,i:771}, D{l:6,t:10,i:613}, D{l:136,t:10,i:223}, D{l:138,t:0,i:215}, D{l:141,t:0,i:124}, D{l:136,t:11,i:391}, D{l:135,t:11,i:172}, D{l:132,t:10,i:670}, D{l:140,t:0,i:55}, D{l:9,t:10,i:40}, D{l:139,t:10,i:136}, D{l:7,t:0,i:62}, D{l:147,t:0,i:112}, D{l:132,t:0,i:856}, D{l:132,t:11,i:568}, D{l:12,t:0,i:270}, D{l:139,t:10,i:259}, D{l:8,t:0,i:572}, D{l:137,t:0,i:698}, D{l:4,t:11,i:732}, D{l:9,t:10,i:310}, D{l:137,t:10,i:682}, D{l:142,t:10,i:296}, D{l:134,t:0,i:939}, D{l:136,t:11,i:733}, D{l:135,t:11,i:1435}, D{l:7,t:10,i:1401}, D{l:135,t:10,i:1476}, D{l:6,t:0,i:352}, D{l:4,t:10,i:296}, D{l:7,t:10,i:401}, D{l:7,t:10,i:1410}, D{l:7,t:10,i:1594}, D{l:7,t:10,i:1674}, D{l:8,t:10,i:63}, D{l:8,t:10,i:660}, D{l:137,t:10,i:74}, D{l:4,t:11,i:428}, D{l:133,t:11,i:668}, D{l:4,t:10,i:139}, D{l:4,t:10,i:388}, D{l:140,t:10,i:188}, D{l:7,t:11,i:2015}, D{l:140,t:11,i:665}, D{l:132,t:0,i:647}, D{l:146,t:0,i:10}, D{l:138,t:0,i:220}, D{l:142,t:0,i:464}, D{l:132,t:0,i:109}, D{l:134,t:0,i:1746}, D{l:6,t:0,i:515}, D{l:4,t:10,i:747}, D{l:6,t:11,i:1623}, D{l:6,t:11,i:1681}, D{l:7,t:10,i:649}, D{l:7,t:10,i:1479}, D{l:135,t:10,i:1583}, D{l:133,t:10,i:232}, D{l:135,t:0,i:566}, D{l:137,t:10,i:887}, D{l:4,t:0,i:40}, D{l:10,t:0,i:67}, D{l:11,t:0,i:117}, D{l:11,t:0,i:768}, D{l:139,t:0,i:935}, D{l:132,t:0,i:801}, D{l:7,t:0,i:992}, D{l:8,t:0,i:301}, D{l:9,t:0,i:722}, D{l:12,t:0,i:63}, D{l:13,t:0,i:29}, D{l:14,t:0,i:161}, D{l:143,t:0,i:18}, D{l:139,t:0,i:923}, D{l:6,t:11,i:1748}, D{l:8,t:11,i:715}, D{l:9,t:11,i:802}, D{l:10,t:11,i:46}, D{l:10,t:11,i:819}, D{l:13,t:11,i:308}, D{l:14,t:11,i:351}, D{l:14,t:11,i:363}, D{l:146,t:11,i:67}, D{l:137,t:11,i:745}, D{l:7,t:0,i:1145}, D{l:4,t:10,i:14}, D{l:7,t:10,i:1801}, D{l:10,t:10,i:748}, D{l:141,t:10,i:458}, D{l:4,t:11,i:63}, D{l:5,t:11,i:347}, D{l:134,t:11,i:474}, D{l:135,t:0,i:568}, D{l:4,t:10,i:425}, D{l:7,t:11,i:577}, D{l:7,t:11,i:1432}, D{l:9,t:11,i:475}, D{l:9,t:11,i:505}, D{l:9,t:11,i:526}, D{l:9,t:11,i:609}, D{l:9,t:11,i:689}, D{l:9,t:11,i:726}, D{l:9,t:11,i:735}, D{l:9,t:11,i:738}, D{l:10,t:11,i:556}, D{l:10,t:11,i:674}, D{l:10,t:11,i:684}, D{l:11,t:11,i:89}, D{l:11,t:11,i:202}, D{l:11,t:11,i:272}, D{l:11,t:11,i:380}, D{l:11,t:11,i:415}, D{l:11,t:11,i:505}, D{l:11,t:11,i:537}, D{l:11,t:11,i:550}, D{l:11,t:11,i:562}, D{l:11,t:11,i:640}, D{l:11,t:11,i:667}, D{l:11,t:11,i:688}, D{l:11,t:11,i:847}, D{l:11,t:11,i:927}, D{l:11,t:11,i:930}, D{l:11,t:11,i:940}, D{l:12,t:11,i:144}, D{l:12,t:11,i:325}, D{l:12,t:11,i:329}, D{l:12,t:11,i:389}, D{l:12,t:11,i:403}, D{l:12,t:11,i:451}, D{l:12,t:11,i:515}, D{l:12,t:11,i:604}, D{l:12,t:11,i:616}, D{l:12,t:11,i:626}, D{l:13,t:11,i:66}, D{l:13,t:11,i:131}, D{l:13,t:11,i:167}, D{l:13,t:11,i:236}, D{l:13,t:11,i:368}, D{l:13,t:11,i:411}, D{l:13,t:11,i:434}, D{l:13,t:11,i:453}, D{l:13,t:11,i:461}, D{l:13,t:11,i:474}, D{l:14,t:11,i:59}, D{l:14,t:11,i:60}, D{l:14,t:11,i:139}, D{l:14,t:11,i:152}, D{l:14,t:11,i:276}, D{l:14,t:11,i:353}, D{l:14,t:11,i:402}, D{l:15,t:11,i:28}, D{l:15,t:11,i:81}, D{l:15,t:11,i:123}, D{l:15,t:11,i:152}, D{l:18,t:11,i:136}, D{l:148,t:11,i:88}, D{l:137,t:0,i:247}, D{l:135,t:11,i:1622}, D{l:9,t:11,i:544}, D{l:11,t:11,i:413}, D{l:144,t:11,i:25}, D{l:4,t:0,i:645}, D{l:7,t:0,i:825}, D{l:6,t:10,i:1768}, D{l:135,t:11,i:89}, D{l:140,t:0,i:328}, D{l:5,t:10,i:943}, D{l:134,t:10,i:1779}, D{l:134,t:0,i:1363}, D{l:5,t:10,i:245}, D{l:6,t:10,i:576}, D{l:7,t:10,i:582}, D{l:136,t:10,i:225}, D{l:134,t:0,i:1280}, D{l:5,t:11,i:824}, D{l:133,t:11,i:941}, D{l:7,t:11,i:440}, D{l:8,t:11,i:230}, D{l:139,t:11,i:106}, D{l:5,t:0,i:28}, D{l:6,t:0,i:204}, D{l:10,t:0,i:320}, D{l:10,t:0,i:583}, D{l:13,t:0,i:502}, D{l:14,t:0,i:72}, D{l:14,t:0,i:274}, D{l:14,t:0,i:312}, D{l:14,t:0,i:344}, D{l:15,t:0,i:159}, D{l:16,t:0,i:62}, D{l:16,t:0,i:69}, D{l:17,t:0,i:30}, D{l:18,t:0,i:42}, D{l:18,t:0,i:53}, D{l:18,t:0,i:84}, D{l:18,t:0,i:140}, D{l:19,t:0,i:68}, D{l:19,t:0,i:85}, D{l:20,t:0,i:5}, D{l:20,t:0,i:45}, D{l:20,t:0,i:101}, D{l:22,t:0,i:7}, D{l:150,t:0,i:20}, D{l:4,t:0,i:558}, D{l:6,t:0,i:390}, D{l:7,t:0,i:162}, D{l:7,t:0,i:689}, D{l:9,t:0,i:360}, D{l:138,t:0,i:653}, D{l:134,t:0,i:764}, D{l:6,t:0,i:862}, D{l:137,t:0,i:833}, D{l:5,t:0,i:856}, D{l:6,t:0,i:1672}, D{l:6,t:0,i:1757}, D{l:134,t:0,i:1781}, D{l:5,t:0,i:92}, D{l:10,t:0,i:736}, D{l:140,t:0,i:102}, D{l:6,t:0,i:1927}, D{l:6,t:0,i:1944}, D{l:8,t:0,i:924}, D{l:8,t:0,i:948}, D{l:10,t:0,i:967}, D{l:138,t:0,i:978}, D{l:134,t:0,i:1479}, D{l:5,t:0,i:590}, D{l:8,t:0,i:360}, D{l:9,t:0,i:213}, D{l:138,t:0,i:63}, D{l:134,t:0,i:1521}, D{l:6,t:0,i:709}, D{l:134,t:0,i:891}, D{l:132,t:10,i:443}, D{l:13,t:0,i:477}, D{l:14,t:0,i:120}, D{l:148,t:0,i:61}, D{l:4,t:11,i:914}, D{l:5,t:11,i:800}, D{l:133,t:11,i:852}, D{l:10,t:11,i:54}, D{l:141,t:11,i:115}, D{l:4,t:11,i:918}, D{l:133,t:11,i:876}, D{l:139,t:11,i:152}, D{l:4,t:11,i:92}, D{l:133,t:11,i:274}, D{l:135,t:11,i:1901}, D{l:9,t:11,i:800}, D{l:10,t:11,i:693}, D{l:11,t:11,i:482}, D{l:11,t:11,i:734}, D{l:139,t:11,i:789}, D{l:9,t:0,i:483}, D{l:132,t:10,i:298}, D{l:6,t:0,i:1213}, D{l:141,t:11,i:498}, D{l:135,t:11,i:1451}, D{l:133,t:11,i:743}, D{l:4,t:0,i:1022}, D{l:10,t:0,i:1000}, D{l:12,t:0,i:957}, D{l:12,t:0,i:980}, D{l:12,t:0,i:1013}, D{l:14,t:0,i:481}, D{l:144,t:0,i:116}, D{l:8,t:0,i:503}, D{l:17,t:0,i:29}, D{l:4,t:11,i:49}, D{l:7,t:11,i:280}, D{l:135,t:11,i:1633}, D{l:135,t:0,i:1712}, D{l:134,t:0,i:466}, D{l:136,t:11,i:47}, D{l:5,t:10,i:164}, D{l:7,t:10,i:121}, D{l:142,t:10,i:189}, D{l:7,t:10,i:812}, D{l:7,t:10,i:1261}, D{l:7,t:10,i:1360}, D{l:9,t:10,i:632}, D{l:140,t:10,i:352}, D{l:139,t:10,i:556}, D{l:132,t:0,i:731}, D{l:5,t:11,i:272}, D{l:5,t:11,i:908}, D{l:5,t:11,i:942}, D{l:7,t:11,i:1008}, D{l:7,t:11,i:1560}, D{l:8,t:11,i:197}, D{l:9,t:11,i:47}, D{l:11,t:11,i:538}, D{l:139,t:11,i:742}, D{l:4,t:10,i:172}, D{l:9,t:10,i:611}, D{l:10,t:10,i:436}, D{l:12,t:10,i:673}, D{l:141,t:10,i:255}, D{l:133,t:10,i:844}, D{l:10,t:0,i:484}, D{l:11,t:0,i:754}, D{l:12,t:0,i:457}, D{l:14,t:0,i:171}, D{l:14,t:0,i:389}, D{l:146,t:0,i:153}, D{l:9,t:10,i:263}, D{l:10,t:10,i:147}, D{l:138,t:10,i:492}, D{l:137,t:11,i:891}, D{l:138,t:0,i:241}, D{l:133,t:10,i:537}, D{l:6,t:0,i:2005}, D{l:136,t:0,i:964}, D{l:137,t:10,i:842}, D{l:151,t:11,i:8}, D{l:4,t:11,i:407}, D{l:132,t:11,i:560}, D{l:135,t:11,i:1884}, D{l:6,t:0,i:1100}, D{l:134,t:0,i:1242}, D{l:135,t:0,i:954}, D{l:5,t:10,i:230}, D{l:5,t:10,i:392}, D{l:6,t:10,i:420}, D{l:9,t:10,i:568}, D{l:140,t:10,i:612}, D{l:4,t:11,i:475}, D{l:11,t:11,i:35}, D{l:11,t:11,i:90}, D{l:13,t:11,i:7}, D{l:13,t:11,i:71}, D{l:13,t:11,i:177}, D{l:142,t:11,i:422}, D{l:136,t:11,i:332}, D{l:135,t:0,i:1958}, D{l:6,t:0,i:549}, D{l:8,t:0,i:34}, D{l:8,t:0,i:283}, D{l:9,t:0,i:165}, D{l:138,t:0,i:475}, D{l:10,t:0,i:952}, D{l:12,t:0,i:966}, D{l:140,t:0,i:994}, D{l:5,t:0,i:652}, D{l:5,t:0,i:701}, D{l:135,t:0,i:449}, D{l:4,t:0,i:655}, D{l:7,t:0,i:850}, D{l:17,t:0,i:75}, D{l:146,t:0,i:137}, D{l:4,t:0,i:146}, D{l:7,t:0,i:1618}, D{l:8,t:0,i:670}, D{l:5,t:10,i:41}, D{l:7,t:10,i:1459}, D{l:7,t:10,i:1469}, D{l:7,t:10,i:1859}, D{l:9,t:10,i:549}, D{l:139,t:10,i:905}, D{l:133,t:10,i:696}, D{l:6,t:0,i:159}, D{l:6,t:0,i:364}, D{l:7,t:0,i:516}, D{l:137,t:0,i:518}, D{l:135,t:0,i:1439}, D{l:6,t:11,i:222}, D{l:7,t:11,i:636}, D{l:7,t:11,i:1620}, D{l:8,t:11,i:409}, D{l:9,t:11,i:693}, D{l:139,t:11,i:77}, D{l:13,t:0,i:151}, D{l:141,t:11,i:45}, D{l:6,t:0,i:1027}, D{l:4,t:11,i:336}, D{l:132,t:10,i:771}, D{l:139,t:11,i:392}, D{l:10,t:11,i:121}, D{l:11,t:11,i:175}, D{l:149,t:11,i:16}, D{l:8,t:0,i:950}, D{l:138,t:0,i:983}, D{l:133,t:10,i:921}, D{l:135,t:0,i:993}, D{l:6,t:10,i:180}, D{l:7,t:10,i:1137}, D{l:8,t:10,i:751}, D{l:139,t:10,i:805}, D{l:7,t:0,i:501}, D{l:9,t:0,i:111}, D{l:10,t:0,i:141}, D{l:11,t:0,i:332}, D{l:13,t:0,i:43}, D{l:13,t:0,i:429}, D{l:14,t:0,i:130}, D{l:14,t:0,i:415}, D{l:145,t:0,i:102}, D{l:4,t:10,i:183}, D{l:5,t:11,i:882}, D{l:7,t:10,i:271}, D{l:11,t:10,i:824}, D{l:11,t:10,i:952}, D{l:13,t:10,i:278}, D{l:13,t:10,i:339}, D{l:13,t:10,i:482}, D{l:14,t:10,i:424}, D{l:148,t:10,i:99}, D{l:4,t:10,i:19}, D{l:5,t:10,i:477}, D{l:5,t:10,i:596}, D{l:6,t:10,i:505}, D{l:7,t:10,i:1221}, D{l:11,t:10,i:907}, D{l:12,t:10,i:209}, D{l:141,t:10,i:214}, D{l:135,t:10,i:1215}, D{l:133,t:0,i:452}, D{l:132,t:11,i:426}, D{l:5,t:0,i:149}, D{l:136,t:0,i:233}, D{l:133,t:0,i:935}, D{l:6,t:11,i:58}, D{l:7,t:11,i:654}, D{l:7,t:11,i:745}, D{l:7,t:11,i:1969}, D{l:8,t:11,i:240}, D{l:8,t:11,i:675}, D{l:9,t:11,i:479}, D{l:9,t:11,i:731}, D{l:10,t:11,i:330}, D{l:10,t:11,i:593}, D{l:10,t:11,i:817}, D{l:11,t:11,i:32}, D{l:11,t:11,i:133}, D{l:11,t:11,i:221}, D{l:145,t:11,i:68}, D{l:12,t:0,i:582}, D{l:18,t:0,i:131}, D{l:7,t:11,i:102}, D{l:137,t:11,i:538}, D{l:136,t:0,i:801}, D{l:134,t:10,i:1645}, D{l:132,t:0,i:70}, D{l:6,t:10,i:92}, D{l:6,t:10,i:188}, D{l:7,t:10,i:1269}, D{l:7,t:10,i:1524}, D{l:7,t:10,i:1876}, D{l:10,t:10,i:228}, D{l:139,t:10,i:1020}, D{l:4,t:10,i:459}, D{l:133,t:10,i:966}, D{l:138,t:0,i:369}, D{l:16,t:0,i:36}, D{l:140,t:10,i:330}, D{l:141,t:11,i:366}, D{l:7,t:0,i:721}, D{l:10,t:0,i:236}, D{l:12,t:0,i:204}, D{l:6,t:10,i:18}, D{l:7,t:10,i:932}, D{l:8,t:10,i:757}, D{l:9,t:10,i:54}, D{l:9,t:10,i:65}, D{l:9,t:10,i:844}, D{l:10,t:10,i:113}, D{l:10,t:10,i:315}, D{l:10,t:10,i:798}, D{l:11,t:10,i:153}, D{l:12,t:10,i:151}, D{l:12,t:10,i:392}, D{l:12,t:10,i:666}, D{l:142,t:10,i:248}, D{l:7,t:0,i:241}, D{l:10,t:0,i:430}, D{l:8,t:10,i:548}, D{l:9,t:10,i:532}, D{l:10,t:10,i:117}, D{l:11,t:10,i:351}, D{l:11,t:10,i:375}, D{l:143,t:10,i:23}, D{l:134,t:10,i:1742}, D{l:133,t:10,i:965}, D{l:133,t:11,i:566}, D{l:6,t:11,i:48}, D{l:135,t:11,i:63}, D{l:134,t:10,i:182}, D{l:10,t:10,i:65}, D{l:10,t:10,i:488}, D{l:138,t:10,i:497}, D{l:6,t:11,i:114}, D{l:7,t:11,i:1224}, D{l:7,t:11,i:1556}, D{l:136,t:11,i:3}, D{l:134,t:0,i:1817}, D{l:8,t:11,i:576}, D{l:137,t:11,i:267}, D{l:6,t:0,i:1078}, D{l:144,t:0,i:16}, D{l:9,t:10,i:588}, D{l:138,t:10,i:260}, D{l:138,t:0,i:1021}, D{l:5,t:0,i:406}, D{l:134,t:0,i:2022}, D{l:133,t:11,i:933}, D{l:6,t:0,i:69}, D{l:135,t:0,i:117}, D{l:7,t:0,i:1830}, D{l:136,t:11,i:427}, D{l:4,t:0,i:432}, D{l:135,t:0,i:824}, D{l:134,t:10,i:1786}, D{l:133,t:0,i:826}, D{l:139,t:11,i:67}, D{l:133,t:11,i:759}, D{l:135,t:10,i:308}, D{l:137,t:0,i:816}, D{l:133,t:0,i:1000}, D{l:4,t:0,i:297}, D{l:6,t:0,i:529}, D{l:7,t:0,i:152}, D{l:7,t:0,i:713}, D{l:7,t:0,i:1845}, D{l:8,t:0,i:710}, D{l:8,t:0,i:717}, D{l:12,t:0,i:639}, D{l:140,t:0,i:685}, D{l:7,t:0,i:423}, D{l:136,t:10,i:588}, D{l:136,t:10,i:287}, D{l:136,t:0,i:510}, D{l:134,t:0,i:1048}, D{l:6,t:0,i:618}, D{l:7,t:11,i:56}, D{l:7,t:11,i:1989}, D{l:8,t:11,i:337}, D{l:8,t:11,i:738}, D{l:9,t:11,i:600}, D{l:10,t:11,i:483}, D{l:12,t:11,i:37}, D{l:13,t:11,i:447}, D{l:142,t:11,i:92}, D{l:4,t:0,i:520}, D{l:135,t:0,i:575}, D{l:8,t:0,i:990}, D{l:138,t:0,i:977}, D{l:135,t:11,i:774}, D{l:9,t:11,i:347}, D{l:11,t:11,i:24}, D{l:140,t:11,i:170}, D{l:136,t:11,i:379}, D{l:140,t:10,i:290}, D{l:132,t:11,i:328}, D{l:4,t:0,i:321}, D{l:134,t:0,i:569}, D{l:4,t:11,i:101}, D{l:135,t:11,i:1171}, D{l:7,t:0,i:723}, D{l:7,t:0,i:1135}, D{l:5,t:11,i:833}, D{l:136,t:11,i:744}, D{l:7,t:10,i:719}, D{l:8,t:10,i:809}, D{l:136,t:10,i:834}, D{l:8,t:0,i:921}, D{l:136,t:10,i:796}, D{l:5,t:10,i:210}, D{l:6,t:10,i:213}, D{l:7,t:10,i:60}, D{l:10,t:10,i:364}, D{l:139,t:10,i:135}, D{l:5,t:0,i:397}, D{l:6,t:0,i:154}, D{l:7,t:0,i:676}, D{l:8,t:0,i:443}, D{l:8,t:0,i:609}, D{l:9,t:0,i:24}, D{l:9,t:0,i:325}, D{l:10,t:0,i:35}, D{l:11,t:0,i:535}, D{l:11,t:0,i:672}, D{l:11,t:0,i:1018}, D{l:12,t:0,i:637}, D{l:16,t:0,i:30}, D{l:5,t:10,i:607}, D{l:8,t:10,i:326}, D{l:136,t:10,i:490}, D{l:4,t:10,i:701}, D{l:5,t:10,i:472}, D{l:6,t:11,i:9}, D{l:6,t:11,i:397}, D{l:7,t:11,i:53}, D{l:7,t:11,i:1742}, D{l:9,t:10,i:758}, D{l:10,t:11,i:632}, D{l:11,t:11,i:828}, D{l:140,t:11,i:146}, D{l:135,t:10,i:380}, D{l:135,t:10,i:1947}, D{l:148,t:11,i:109}, D{l:10,t:10,i:278}, D{l:138,t:11,i:278}, D{l:134,t:0,i:856}, D{l:7,t:0,i:139}, D{l:4,t:10,i:386}, D{l:8,t:10,i:405}, D{l:8,t:10,i:728}, D{l:9,t:10,i:497}, D{l:11,t:10,i:110}, D{l:11,t:10,i:360}, D{l:15,t:10,i:37}, D{l:144,t:10,i:84}, D{l:141,t:0,i:282}, D{l:133,t:0,i:981}, D{l:5,t:0,i:288}, D{l:7,t:10,i:1452}, D{l:7,t:10,i:1480}, D{l:8,t:10,i:634}, D{l:140,t:10,i:472}, D{l:7,t:0,i:1890}, D{l:8,t:11,i:367}, D{l:10,t:11,i:760}, D{l:14,t:11,i:79}, D{l:20,t:11,i:17}, D{l:152,t:11,i:0}, D{l:4,t:10,i:524}, D{l:136,t:10,i:810}, D{l:4,t:0,i:56}, D{l:7,t:0,i:1791}, D{l:8,t:0,i:607}, D{l:8,t:0,i:651}, D{l:11,t:0,i:465}, D{l:11,t:0,i:835}, D{l:12,t:0,i:337}, D{l:141,t:0,i:480}, D{l:10,t:10,i:238}, D{l:141,t:10,i:33}, D{l:11,t:11,i:417}, D{l:12,t:11,i:223}, D{l:140,t:11,i:265}, D{l:9,t:0,i:158}, D{l:10,t:0,i:411}, D{l:140,t:0,i:261}, D{l:133,t:10,i:532}, D{l:133,t:10,i:997}, D{l:12,t:11,i:186}, D{l:12,t:11,i:292}, D{l:14,t:11,i:100}, D{l:146,t:11,i:70}, D{l:6,t:0,i:1403}, D{l:136,t:0,i:617}, D{l:134,t:0,i:1205}, D{l:139,t:0,i:563}, D{l:4,t:0,i:242}, D{l:134,t:0,i:333}, D{l:4,t:11,i:186}, D{l:5,t:11,i:157}, D{l:8,t:11,i:168}, D{l:138,t:11,i:6}, D{l:132,t:0,i:369}, D{l:133,t:11,i:875}, D{l:5,t:10,i:782}, D{l:5,t:10,i:829}, D{l:134,t:10,i:1738}, D{l:134,t:0,i:622}, D{l:135,t:11,i:1272}, D{l:6,t:0,i:1407}, D{l:7,t:11,i:111}, D{l:136,t:11,i:581}, D{l:7,t:10,i:1823}, D{l:139,t:10,i:693}, D{l:7,t:0,i:160}, D{l:10,t:0,i:624}, D{l:142,t:0,i:279}, D{l:132,t:0,i:363}, D{l:10,t:11,i:589}, D{l:12,t:11,i:111}, D{l:13,t:11,i:260}, D{l:14,t:11,i:82}, D{l:18,t:11,i:63}, D{l:147,t:11,i:45}, D{l:7,t:11,i:1364}, D{l:7,t:11,i:1907}, D{l:141,t:11,i:158}, D{l:4,t:11,i:404}, D{l:4,t:11,i:659}, D{l:135,t:11,i:675}, D{l:13,t:11,i:211}, D{l:14,t:11,i:133}, D{l:14,t:11,i:204}, D{l:15,t:11,i:64}, D{l:15,t:11,i:69}, D{l:15,t:11,i:114}, D{l:16,t:11,i:10}, D{l:19,t:11,i:23}, D{l:19,t:11,i:35}, D{l:19,t:11,i:39}, D{l:19,t:11,i:51}, D{l:19,t:11,i:71}, D{l:19,t:11,i:75}, D{l:152,t:11,i:15}, D{l:4,t:10,i:78}, D{l:5,t:10,i:96}, D{l:5,t:10,i:182}, D{l:7,t:10,i:1724}, D{l:7,t:10,i:1825}, D{l:10,t:10,i:394}, D{l:10,t:10,i:471}, D{l:11,t:10,i:532}, D{l:14,t:10,i:340}, D{l:145,t:10,i:88}, D{l:135,t:10,i:1964}, D{l:133,t:11,i:391}, D{l:11,t:11,i:887}, D{l:14,t:11,i:365}, D{l:142,t:11,i:375}, D{l:5,t:11,i:540}, D{l:6,t:11,i:1697}, D{l:7,t:11,i:222}, D{l:136,t:11,i:341}, D{l:134,t:11,i:78}, D{l:9,t:0,i:601}, D{l:9,t:0,i:619}, D{l:10,t:0,i:505}, D{l:10,t:0,i:732}, D{l:11,t:0,i:355}, D{l:140,t:0,i:139}, D{l:134,t:0,i:292}, D{l:139,t:0,i:174}, D{l:5,t:0,i:177}, D{l:6,t:0,i:616}, D{l:7,t:0,i:827}, D{l:9,t:0,i:525}, D{l:138,t:0,i:656}, D{l:10,t:0,i:31}, D{l:6,t:10,i:215}, D{l:7,t:10,i:1028}, D{l:7,t:10,i:1473}, D{l:7,t:10,i:1721}, D{l:9,t:10,i:424}, D{l:138,t:10,i:779}, D{l:135,t:10,i:584}, D{l:136,t:11,i:293}, D{l:134,t:0,i:685}, D{l:135,t:11,i:1868}, D{l:133,t:11,i:460}, D{l:7,t:0,i:647}, D{l:6,t:10,i:67}, D{l:7,t:10,i:1630}, D{l:9,t:10,i:354}, D{l:9,t:10,i:675}, D{l:10,t:10,i:830}, D{l:14,t:10,i:80}, D{l:145,t:10,i:80}, D{l:4,t:0,i:161}, D{l:133,t:0,i:631}, D{l:6,t:10,i:141}, D{l:7,t:10,i:225}, D{l:9,t:10,i:59}, D{l:9,t:10,i:607}, D{l:10,t:10,i:312}, D{l:11,t:10,i:687}, D{l:12,t:10,i:555}, D{l:13,t:10,i:373}, D{l:13,t:10,i:494}, D{l:148,t:10,i:58}, D{l:7,t:11,i:965}, D{l:7,t:11,i:1460}, D{l:135,t:11,i:1604}, D{l:136,t:10,i:783}, D{l:134,t:11,i:388}, D{l:6,t:0,i:722}, D{l:6,t:0,i:1267}, D{l:4,t:11,i:511}, D{l:9,t:11,i:333}, D{l:9,t:11,i:379}, D{l:10,t:11,i:602}, D{l:11,t:11,i:441}, D{l:11,t:11,i:723}, D{l:11,t:11,i:976}, D{l:140,t:11,i:357}, D{l:134,t:0,i:1797}, D{l:135,t:0,i:1684}, D{l:9,t:0,i:469}, D{l:9,t:0,i:709}, D{l:12,t:0,i:512}, D{l:14,t:0,i:65}, D{l:17,t:0,i:12}, D{l:5,t:11,i:938}, D{l:136,t:11,i:707}, D{l:7,t:0,i:1230}, D{l:136,t:0,i:531}, D{l:10,t:0,i:229}, D{l:11,t:0,i:73}, D{l:11,t:0,i:376}, D{l:139,t:0,i:433}, D{l:12,t:0,i:268}, D{l:12,t:0,i:640}, D{l:142,t:0,i:119}, D{l:7,t:10,i:430}, D{l:139,t:10,i:46}, D{l:6,t:0,i:558}, D{l:7,t:0,i:651}, D{l:8,t:0,i:421}, D{l:9,t:0,i:0}, D{l:10,t:0,i:34}, D{l:139,t:0,i:1008}, D{l:6,t:0,i:106}, D{l:7,t:0,i:1786}, D{l:7,t:0,i:1821}, D{l:9,t:0,i:102}, D{l:9,t:0,i:763}, D{l:5,t:10,i:602}, D{l:7,t:10,i:2018}, D{l:137,t:10,i:418}, D{l:5,t:0,i:65}, D{l:6,t:0,i:416}, D{l:7,t:0,i:1720}, D{l:7,t:0,i:1924}, D{l:10,t:0,i:109}, D{l:11,t:0,i:14}, D{l:11,t:0,i:70}, D{l:11,t:0,i:569}, D{l:11,t:0,i:735}, D{l:15,t:0,i:153}, D{l:20,t:0,i:80}, D{l:136,t:10,i:677}, D{l:135,t:11,i:1625}, D{l:137,t:11,i:772}, D{l:136,t:0,i:595}, D{l:6,t:11,i:469}, D{l:7,t:11,i:1709}, D{l:138,t:11,i:515}, D{l:7,t:0,i:1832}, D{l:138,t:0,i:374}, D{l:9,t:0,i:106}, D{l:9,t:0,i:163}, D{l:9,t:0,i:296}, D{l:10,t:0,i:167}, D{l:10,t:0,i:172}, D{l:10,t:0,i:777}, D{l:139,t:0,i:16}, D{l:6,t:0,i:6}, D{l:7,t:0,i:81}, D{l:7,t:0,i:771}, D{l:7,t:0,i:1731}, D{l:9,t:0,i:405}, D{l:138,t:0,i:421}, D{l:4,t:11,i:500}, D{l:135,t:11,i:938}, D{l:5,t:11,i:68}, D{l:134,t:11,i:383}, D{l:5,t:0,i:881}, D{l:133,t:0,i:885}, D{l:6,t:0,i:854}, D{l:6,t:0,i:1132}, D{l:6,t:0,i:1495}, D{l:6,t:0,i:1526}, D{l:6,t:0,i:1533}, D{l:134,t:0,i:1577}, D{l:4,t:11,i:337}, D{l:6,t:11,i:353}, D{l:7,t:11,i:1934}, D{l:8,t:11,i:488}, D{l:137,t:11,i:429}, D{l:7,t:11,i:236}, D{l:7,t:11,i:1795}, D{l:8,t:11,i:259}, D{l:9,t:11,i:135}, D{l:9,t:11,i:177}, D{l:10,t:11,i:825}, D{l:11,t:11,i:115}, D{l:11,t:11,i:370}, D{l:11,t:11,i:405}, D{l:11,t:11,i:604}, D{l:12,t:11,i:10}, D{l:12,t:11,i:667}, D{l:12,t:11,i:669}, D{l:13,t:11,i:76}, D{l:14,t:11,i:310}, D{l:15,t:11,i:76}, D{l:15,t:11,i:147}, D{l:148,t:11,i:23}, D{l:5,t:0,i:142}, D{l:134,t:0,i:546}, D{l:4,t:11,i:15}, D{l:5,t:11,i:22}, D{l:6,t:11,i:244}, D{l:7,t:11,i:40}, D{l:7,t:11,i:200}, D{l:7,t:11,i:906}, D{l:7,t:11,i:1199}, D{l:9,t:11,i:616}, D{l:10,t:11,i:716}, D{l:11,t:11,i:635}, D{l:11,t:11,i:801}, D{l:140,t:11,i:458}, D{l:5,t:0,i:466}, D{l:11,t:0,i:571}, D{l:12,t:0,i:198}, D{l:13,t:0,i:283}, D{l:14,t:0,i:186}, D{l:15,t:0,i:21}, D{l:15,t:0,i:103}, D{l:135,t:10,i:329}, D{l:4,t:0,i:185}, D{l:5,t:0,i:257}, D{l:5,t:0,i:839}, D{l:5,t:0,i:936}, D{l:9,t:0,i:399}, D{l:10,t:0,i:258}, D{l:10,t:0,i:395}, D{l:10,t:0,i:734}, D{l:11,t:0,i:1014}, D{l:12,t:0,i:23}, D{l:13,t:0,i:350}, D{l:14,t:0,i:150}, D{l:19,t:0,i:6}, D{l:135,t:11,i:1735}, D{l:12,t:11,i:36}, D{l:141,t:11,i:337}, D{l:5,t:11,i:598}, D{l:7,t:11,i:791}, D{l:8,t:11,i:108}, D{l:137,t:11,i:123}, D{l:132,t:10,i:469}, D{l:7,t:0,i:404}, D{l:7,t:0,i:1377}, D{l:7,t:0,i:1430}, D{l:7,t:0,i:2017}, D{l:8,t:0,i:149}, D{l:8,t:0,i:239}, D{l:8,t:0,i:512}, D{l:8,t:0,i:793}, D{l:8,t:0,i:818}, D{l:9,t:0,i:474}, D{l:9,t:0,i:595}, D{l:10,t:0,i:122}, D{l:10,t:0,i:565}, D{l:10,t:0,i:649}, D{l:10,t:0,i:783}, D{l:11,t:0,i:239}, D{l:11,t:0,i:295}, D{l:11,t:0,i:447}, D{l:11,t:0,i:528}, D{l:11,t:0,i:639}, D{l:11,t:0,i:800}, D{l:12,t:0,i:25}, D{l:12,t:0,i:77}, D{l:12,t:0,i:157}, D{l:12,t:0,i:256}, D{l:12,t:0,i:316}, D{l:12,t:0,i:390}, D{l:12,t:0,i:391}, D{l:12,t:0,i:395}, D{l:12,t:0,i:478}, D{l:12,t:0,i:503}, D{l:12,t:0,i:592}, D{l:12,t:0,i:680}, D{l:13,t:0,i:50}, D{l:13,t:0,i:53}, D{l:13,t:0,i:132}, D{l:13,t:0,i:198}, D{l:13,t:0,i:322}, D{l:13,t:0,i:415}, D{l:13,t:0,i:511}, D{l:14,t:0,i:71}, D{l:14,t:0,i:395}, D{l:15,t:0,i:71}, D{l:15,t:0,i:136}, D{l:17,t:0,i:123}, D{l:18,t:0,i:93}, D{l:147,t:0,i:58}, D{l:136,t:0,i:712}, D{l:134,t:10,i:1743}, D{l:5,t:10,i:929}, D{l:6,t:10,i:340}, D{l:8,t:10,i:376}, D{l:136,t:10,i:807}, D{l:6,t:0,i:1848}, D{l:8,t:0,i:860}, D{l:10,t:0,i:856}, D{l:10,t:0,i:859}, D{l:10,t:0,i:925}, D{l:10,t:0,i:941}, D{l:140,t:0,i:762}, D{l:6,t:0,i:629}, D{l:6,t:0,i:906}, D{l:9,t:0,i:810}, D{l:140,t:0,i:652}, D{l:5,t:10,i:218}, D{l:7,t:10,i:1610}, D{l:138,t:10,i:83}, D{l:7,t:10,i:1512}, D{l:135,t:10,i:1794}, D{l:4,t:0,i:377}, D{l:24,t:0,i:13}, D{l:4,t:11,i:155}, D{l:7,t:11,i:1689}, D{l:11,t:10,i:0}, D{l:144,t:10,i:78}, D{l:4,t:11,i:164}, D{l:5,t:11,i:151}, D{l:5,t:11,i:730}, D{l:5,t:11,i:741}, D{l:7,t:11,i:498}, D{l:7,t:11,i:870}, D{l:7,t:11,i:1542}, D{l:12,t:11,i:213}, D{l:14,t:11,i:36}, D{l:14,t:11,i:391}, D{l:17,t:11,i:111}, D{l:18,t:11,i:6}, D{l:18,t:11,i:46}, D{l:18,t:11,i:151}, D{l:19,t:11,i:36}, D{l:20,t:11,i:32}, D{l:20,t:11,i:56}, D{l:20,t:11,i:69}, D{l:20,t:11,i:102}, D{l:21,t:11,i:4}, D{l:22,t:11,i:8}, D{l:22,t:11,i:10}, D{l:22,t:11,i:14}, D{l:150,t:11,i:31}, D{l:7,t:0,i:1842}, D{l:133,t:10,i:571}, D{l:4,t:10,i:455}, D{l:4,t:11,i:624}, D{l:135,t:11,i:1752}, D{l:134,t:0,i:1501}, D{l:4,t:11,i:492}, D{l:5,t:11,i:451}, D{l:6,t:10,i:161}, D{l:7,t:10,i:372}, D{l:137,t:10,i:597}, D{l:132,t:10,i:349}, D{l:4,t:0,i:180}, D{l:135,t:0,i:1906}, D{l:135,t:11,i:835}, D{l:141,t:11,i:70}, D{l:132,t:0,i:491}, D{l:137,t:10,i:751}, D{l:6,t:10,i:432}, D{l:139,t:10,i:322}, D{l:4,t:0,i:171}, D{l:138,t:0,i:234}, D{l:6,t:11,i:113}, D{l:135,t:11,i:436}, D{l:4,t:0,i:586}, D{l:7,t:0,i:1186}, D{l:138,t:0,i:631}, D{l:5,t:10,i:468}, D{l:10,t:10,i:325}, D{l:11,t:10,i:856}, D{l:12,t:10,i:345}, D{l:143,t:10,i:104}, D{l:5,t:10,i:223}, D{l:10,t:11,i:592}, D{l:10,t:11,i:753}, D{l:12,t:11,i:317}, D{l:12,t:11,i:355}, D{l:12,t:11,i:465}, D{l:12,t:11,i:469}, D{l:12,t:11,i:560}, D{l:12,t:11,i:578}, D{l:141,t:11,i:243}, D{l:132,t:10,i:566}, D{l:135,t:11,i:520}, D{l:4,t:10,i:59}, D{l:135,t:10,i:1394}, D{l:6,t:10,i:436}, D{l:139,t:10,i:481}, D{l:9,t:0,i:931}, D{l:10,t:0,i:334}, D{l:20,t:0,i:71}, D{l:4,t:10,i:48}, D{l:5,t:10,i:271}, D{l:7,t:10,i:953}, D{l:135,t:11,i:1878}, D{l:11,t:0,i:170}, D{l:5,t:10,i:610}, D{l:136,t:10,i:457}, D{l:133,t:10,i:755}, D{l:6,t:0,i:1587}, D{l:135,t:10,i:1217}, D{l:4,t:10,i:197}, D{l:149,t:11,i:26}, D{l:133,t:11,i:585}, D{l:137,t:11,i:521}, D{l:133,t:0,i:765}, D{l:133,t:10,i:217}, D{l:139,t:11,i:586}, D{l:133,t:0,i:424}, D{l:9,t:11,i:752}, D{l:12,t:11,i:610}, D{l:13,t:11,i:431}, D{l:16,t:11,i:59}, D{l:146,t:11,i:109}, D{l:136,t:0,i:714}, D{l:7,t:0,i:685}, D{l:132,t:11,i:307}, D{l:9,t:0,i:420}, D{l:10,t:0,i:269}, D{l:10,t:0,i:285}, D{l:10,t:0,i:576}, D{l:11,t:0,i:397}, D{l:13,t:0,i:175}, D{l:145,t:0,i:90}, D{l:132,t:0,i:429}, D{l:133,t:11,i:964}, D{l:9,t:11,i:463}, D{l:138,t:11,i:595}, D{l:7,t:0,i:18}, D{l:7,t:0,i:699}, D{l:7,t:0,i:1966}, D{l:8,t:0,i:752}, D{l:9,t:0,i:273}, D{l:9,t:0,i:412}, D{l:9,t:0,i:703}, D{l:10,t:0,i:71}, D{l:10,t:0,i:427}, D{l:138,t:0,i:508}, D{l:4,t:10,i:165}, D{l:7,t:10,i:1398}, D{l:135,t:10,i:1829}, D{l:4,t:0,i:53}, D{l:5,t:0,i:186}, D{l:7,t:0,i:752}, D{l:7,t:0,i:828}, D{l:142,t:0,i:116}, D{l:8,t:0,i:575}, D{l:10,t:0,i:289}, D{l:139,t:0,i:319}, D{l:132,t:0,i:675}, D{l:134,t:0,i:1424}, D{l:4,t:11,i:75}, D{l:5,t:11,i:180}, D{l:6,t:11,i:500}, D{l:7,t:11,i:58}, D{l:7,t:11,i:710}, D{l:138,t:11,i:645}, D{l:133,t:11,i:649}, D{l:6,t:11,i:276}, D{l:7,t:11,i:282}, D{l:7,t:11,i:879}, D{l:7,t:11,i:924}, D{l:8,t:11,i:459}, D{l:9,t:11,i:599}, D{l:9,t:11,i:754}, D{l:11,t:11,i:574}, D{l:12,t:11,i:128}, D{l:12,t:11,i:494}, D{l:13,t:11,i:52}, D{l:13,t:11,i:301}, D{l:15,t:11,i:30}, D{l:143,t:11,i:132}, D{l:6,t:0,i:647}, D{l:134,t:0,i:1095}, D{l:5,t:10,i:9}, D{l:7,t:10,i:297}, D{l:7,t:10,i:966}, D{l:140,t:10,i:306}, D{l:132,t:11,i:200}, D{l:134,t:0,i:1334}, D{l:5,t:10,i:146}, D{l:6,t:10,i:411}, D{l:138,t:10,i:721}, D{l:6,t:0,i:209}, D{l:6,t:0,i:1141}, D{l:6,t:0,i:1288}, D{l:8,t:0,i:468}, D{l:9,t:0,i:210}, D{l:11,t:0,i:36}, D{l:12,t:0,i:28}, D{l:12,t:0,i:630}, D{l:13,t:0,i:21}, D{l:13,t:0,i:349}, D{l:14,t:0,i:7}, D{l:145,t:0,i:13}, D{l:6,t:10,i:177}, D{l:135,t:10,i:467}, D{l:4,t:0,i:342}, D{l:135,t:0,i:1179}, D{l:10,t:11,i:454}, D{l:140,t:11,i:324}, D{l:4,t:0,i:928}, D{l:133,t:0,i:910}, D{l:7,t:0,i:1838}, D{l:6,t:11,i:225}, D{l:137,t:11,i:211}, D{l:16,t:0,i:101}, D{l:20,t:0,i:115}, D{l:20,t:0,i:118}, D{l:148,t:0,i:122}, D{l:4,t:0,i:496}, D{l:135,t:0,i:856}, D{l:4,t:0,i:318}, D{l:11,t:0,i:654}, D{l:7,t:11,i:718}, D{l:139,t:11,i:102}, D{l:8,t:11,i:58}, D{l:9,t:11,i:724}, D{l:11,t:11,i:809}, D{l:13,t:11,i:113}, D{l:145,t:11,i:72}, D{l:5,t:10,i:200}, D{l:6,t:11,i:345}, D{l:135,t:11,i:1247}, D{l:8,t:11,i:767}, D{l:8,t:11,i:803}, D{l:9,t:11,i:301}, D{l:137,t:11,i:903}, D{l:7,t:0,i:915}, D{l:8,t:0,i:247}, D{l:19,t:0,i:0}, D{l:7,t:11,i:1949}, D{l:136,t:11,i:674}, D{l:4,t:0,i:202}, D{l:5,t:0,i:382}, D{l:6,t:0,i:454}, D{l:7,t:0,i:936}, D{l:7,t:0,i:1803}, D{l:8,t:0,i:758}, D{l:9,t:0,i:375}, D{l:9,t:0,i:895}, D{l:10,t:0,i:743}, D{l:10,t:0,i:792}, D{l:11,t:0,i:978}, D{l:11,t:0,i:1012}, D{l:142,t:0,i:109}, D{l:7,t:0,i:1150}, D{l:7,t:0,i:1425}, D{l:7,t:0,i:1453}, D{l:140,t:0,i:513}, D{l:134,t:11,i:259}, D{l:138,t:0,i:791}, D{l:11,t:0,i:821}, D{l:12,t:0,i:110}, D{l:12,t:0,i:153}, D{l:18,t:0,i:41}, D{l:150,t:0,i:19}, D{l:134,t:10,i:481}, D{l:132,t:0,i:796}, D{l:6,t:0,i:445}, D{l:9,t:0,i:909}, D{l:136,t:11,i:254}, D{l:10,t:0,i:776}, D{l:13,t:0,i:345}, D{l:142,t:0,i:425}, D{l:4,t:10,i:84}, D{l:7,t:10,i:1482}, D{l:10,t:10,i:76}, D{l:138,t:10,i:142}, D{l:135,t:11,i:742}, D{l:6,t:0,i:578}, D{l:133,t:10,i:1015}, D{l:6,t:0,i:1387}, D{l:4,t:10,i:315}, D{l:5,t:10,i:507}, D{l:135,t:10,i:1370}, D{l:4,t:0,i:438}, D{l:133,t:0,i:555}, D{l:136,t:0,i:766}, D{l:133,t:11,i:248}, D{l:134,t:10,i:1722}, D{l:4,t:11,i:116}, D{l:5,t:11,i:95}, D{l:5,t:11,i:445}, D{l:7,t:11,i:1688}, D{l:8,t:11,i:29}, D{l:9,t:11,i:272}, D{l:11,t:11,i:509}, D{l:139,t:11,i:915}, D{l:135,t:0,i:541}, D{l:133,t:11,i:543}, D{l:8,t:10,i:222}, D{l:8,t:10,i:476}, D{l:9,t:10,i:238}, D{l:11,t:10,i:516}, D{l:11,t:10,i:575}, D{l:15,t:10,i:109}, D{l:146,t:10,i:100}, D{l:6,t:0,i:880}, D{l:134,t:0,i:1191}, D{l:5,t:11,i:181}, D{l:136,t:11,i:41}, D{l:134,t:0,i:1506}, D{l:132,t:11,i:681}, D{l:7,t:11,i:25}, D{l:8,t:11,i:202}, D{l:138,t:11,i:536}, D{l:139,t:0,i:983}, D{l:137,t:0,i:768}, D{l:132,t:0,i:584}, D{l:9,t:11,i:423}, D{l:140,t:11,i:89}, D{l:8,t:11,i:113}, D{l:9,t:11,i:877}, D{l:10,t:11,i:554}, D{l:11,t:11,i:83}, D{l:12,t:11,i:136}, D{l:147,t:11,i:109}, D{l:7,t:10,i:706}, D{l:7,t:10,i:1058}, D{l:138,t:10,i:538}, D{l:133,t:11,i:976}, D{l:4,t:11,i:206}, D{l:135,t:11,i:746}, D{l:136,t:11,i:526}, D{l:140,t:0,i:737}, D{l:11,t:10,i:92}, D{l:11,t:10,i:196}, D{l:11,t:10,i:409}, D{l:11,t:10,i:450}, D{l:11,t:10,i:666}, D{l:11,t:10,i:777}, D{l:12,t:10,i:262}, D{l:13,t:10,i:385}, D{l:13,t:10,i:393}, D{l:15,t:10,i:115}, D{l:16,t:10,i:45}, D{l:145,t:10,i:82}, D{l:4,t:0,i:226}, D{l:4,t:0,i:326}, D{l:7,t:0,i:1770}, D{l:4,t:11,i:319}, D{l:5,t:11,i:699}, D{l:138,t:11,i:673}, D{l:6,t:10,i:40}, D{l:135,t:10,i:1781}, D{l:5,t:0,i:426}, D{l:8,t:0,i:30}, D{l:9,t:0,i:2}, D{l:11,t:0,i:549}, D{l:147,t:0,i:122}, D{l:6,t:0,i:1161}, D{l:134,t:0,i:1329}, D{l:138,t:10,i:97}, D{l:6,t:10,i:423}, D{l:7,t:10,i:665}, D{l:135,t:10,i:1210}, D{l:7,t:11,i:13}, D{l:8,t:11,i:226}, D{l:10,t:11,i:537}, D{l:11,t:11,i:570}, D{l:11,t:11,i:605}, D{l:11,t:11,i:799}, D{l:11,t:11,i:804}, D{l:12,t:11,i:85}, D{l:12,t:11,i:516}, D{l:12,t:11,i:623}, D{l:13,t:11,i:112}, D{l:13,t:11,i:361}, D{l:14,t:11,i:77}, D{l:14,t:11,i:78}, D{l:17,t:11,i:28}, D{l:147,t:11,i:110}, D{l:132,t:11,i:769}, D{l:132,t:11,i:551}, D{l:132,t:11,i:728}, D{l:147,t:0,i:117}, D{l:9,t:11,i:57}, D{l:9,t:11,i:459}, D{l:10,t:11,i:425}, D{l:11,t:11,i:119}, D{l:12,t:11,i:184}, D{l:12,t:11,i:371}, D{l:13,t:11,i:358}, D{l:145,t:11,i:51}, D{l:5,t:11,i:188}, D{l:5,t:11,i:814}, D{l:8,t:11,i:10}, D{l:9,t:11,i:421}, D{l:9,t:11,i:729}, D{l:10,t:11,i:609}, D{l:139,t:11,i:689}, D{l:134,t:11,i:624}, D{l:135,t:11,i:298}, D{l:135,t:0,i:462}, D{l:4,t:0,i:345}, D{l:139,t:10,i:624}, D{l:136,t:10,i:574}, D{l:4,t:0,i:385}, D{l:7,t:0,i:265}, D{l:135,t:0,i:587}, D{l:6,t:0,i:808}, D{l:132,t:11,i:528}, D{l:133,t:0,i:398}, D{l:132,t:10,i:354}, D{l:4,t:0,i:347}, D{l:5,t:0,i:423}, D{l:5,t:0,i:996}, D{l:135,t:0,i:1329}, D{l:135,t:10,i:1558}, D{l:7,t:0,i:1259}, D{l:9,t:0,i:125}, D{l:139,t:0,i:65}, D{l:5,t:0,i:136}, D{l:6,t:0,i:136}, D{l:136,t:0,i:644}, D{l:5,t:11,i:104}, D{l:6,t:11,i:173}, D{l:135,t:11,i:1631}, D{l:135,t:0,i:469}, D{l:133,t:10,i:830}, D{l:4,t:0,i:278}, D{l:5,t:0,i:465}, D{l:135,t:0,i:1367}, D{l:7,t:11,i:810}, D{l:8,t:11,i:138}, D{l:8,t:11,i:342}, D{l:9,t:11,i:84}, D{l:10,t:11,i:193}, D{l:11,t:11,i:883}, D{l:140,t:11,i:359}, D{l:5,t:10,i:496}, D{l:135,t:10,i:203}, D{l:4,t:0,i:433}, D{l:133,t:0,i:719}, D{l:6,t:11,i:95}, D{l:134,t:10,i:547}, D{l:5,t:10,i:88}, D{l:137,t:10,i:239}, D{l:6,t:11,i:406}, D{l:10,t:11,i:409}, D{l:10,t:11,i:447}, D{l:11,t:11,i:44}, D{l:140,t:11,i:100}, D{l:134,t:0,i:1423}, D{l:7,t:10,i:650}, D{l:135,t:10,i:1310}, D{l:134,t:0,i:749}, D{l:135,t:11,i:1243}, D{l:135,t:0,i:1363}, D{l:6,t:0,i:381}, D{l:7,t:0,i:645}, D{l:7,t:0,i:694}, D{l:8,t:0,i:546}, D{l:7,t:10,i:1076}, D{l:9,t:10,i:80}, D{l:11,t:10,i:78}, D{l:11,t:10,i:421}, D{l:11,t:10,i:534}, D{l:140,t:10,i:545}, D{l:134,t:11,i:1636}, D{l:135,t:11,i:1344}, D{l:12,t:0,i:277}, D{l:7,t:10,i:274}, D{l:11,t:10,i:479}, D{l:139,t:10,i:507}, D{l:6,t:0,i:705}, D{l:6,t:0,i:783}, D{l:6,t:0,i:1275}, D{l:6,t:0,i:1481}, D{l:4,t:11,i:282}, D{l:7,t:11,i:1034}, D{l:11,t:11,i:398}, D{l:11,t:11,i:634}, D{l:12,t:11,i:1}, D{l:12,t:11,i:79}, D{l:12,t:11,i:544}, D{l:14,t:11,i:237}, D{l:17,t:11,i:10}, D{l:146,t:11,i:20}, D{l:134,t:0,i:453}, D{l:4,t:0,i:555}, D{l:8,t:0,i:536}, D{l:10,t:0,i:288}, D{l:11,t:0,i:1005}, D{l:4,t:10,i:497}, D{l:135,t:10,i:1584}, D{l:5,t:11,i:118}, D{l:5,t:11,i:499}, D{l:6,t:11,i:476}, D{l:7,t:11,i:600}, D{l:7,t:11,i:888}, D{l:135,t:11,i:1096}, D{l:138,t:0,i:987}, D{l:7,t:0,i:1107}, D{l:7,t:10,i:261}, D{l:7,t:10,i:1115}, D{l:7,t:10,i:1354}, D{l:7,t:10,i:1588}, D{l:7,t:10,i:1705}, D{l:7,t:10,i:1902}, D{l:9,t:10,i:465}, D{l:10,t:10,i:248}, D{l:10,t:10,i:349}, D{l:10,t:10,i:647}, D{l:11,t:10,i:527}, D{l:11,t:10,i:660}, D{l:11,t:10,i:669}, D{l:12,t:10,i:529}, D{l:141,t:10,i:305}, D{l:7,t:11,i:296}, D{l:7,t:11,i:596}, D{l:8,t:11,i:560}, D{l:8,t:11,i:586}, D{l:9,t:11,i:612}, D{l:11,t:11,i:100}, D{l:11,t:11,i:304}, D{l:12,t:11,i:46}, D{l:13,t:11,i:89}, D{l:14,t:11,i:112}, D{l:145,t:11,i:122}, D{l:9,t:0,i:370}, D{l:138,t:0,i:90}, D{l:136,t:10,i:13}, D{l:132,t:0,i:860}, D{l:7,t:10,i:642}, D{l:8,t:10,i:250}, D{l:11,t:10,i:123}, D{l:11,t:10,i:137}, D{l:13,t:10,i:48}, D{l:142,t:10,i:95}, D{l:135,t:10,i:1429}, D{l:137,t:11,i:321}, D{l:132,t:0,i:257}, D{l:135,t:0,i:2031}, D{l:7,t:0,i:1768}, D{l:7,t:11,i:1599}, D{l:7,t:11,i:1723}, D{l:8,t:11,i:79}, D{l:8,t:11,i:106}, D{l:8,t:11,i:190}, D{l:8,t:11,i:302}, D{l:8,t:11,i:383}, D{l:9,t:11,i:119}, D{l:9,t:11,i:233}, D{l:9,t:11,i:298}, D{l:9,t:11,i:419}, D{l:9,t:11,i:471}, D{l:10,t:11,i:181}, D{l:10,t:11,i:406}, D{l:11,t:11,i:57}, D{l:11,t:11,i:85}, D{l:11,t:11,i:120}, D{l:11,t:11,i:177}, D{l:11,t:11,i:296}, D{l:11,t:11,i:382}, D{l:11,t:11,i:454}, D{l:11,t:11,i:758}, D{l:11,t:11,i:999}, D{l:12,t:11,i:27}, D{l:12,t:11,i:98}, D{l:12,t:11,i:131}, D{l:12,t:11,i:245}, D{l:12,t:11,i:312}, D{l:12,t:11,i:446}, D{l:12,t:11,i:454}, D{l:13,t:11,i:25}, D{l:13,t:11,i:98}, D{l:13,t:11,i:426}, D{l:13,t:11,i:508}, D{l:14,t:11,i:6}, D{l:14,t:11,i:163}, D{l:14,t:11,i:272}, D{l:14,t:11,i:277}, D{l:14,t:11,i:370}, D{l:15,t:11,i:95}, D{l:15,t:11,i:138}, D{l:15,t:11,i:167}, D{l:17,t:11,i:18}, D{l:17,t:11,i:38}, D{l:20,t:11,i:96}, D{l:149,t:11,i:32}, D{l:5,t:11,i:722}, D{l:134,t:11,i:1759}, D{l:145,t:11,i:16}, D{l:6,t:0,i:1071}, D{l:134,t:0,i:1561}, D{l:10,t:10,i:545}, D{l:140,t:10,i:301}, D{l:6,t:0,i:83}, D{l:6,t:0,i:1733}, D{l:135,t:0,i:1389}, D{l:4,t:0,i:835}, D{l:135,t:0,i:1818}, D{l:133,t:11,i:258}, D{l:4,t:10,i:904}, D{l:133,t:10,i:794}, D{l:134,t:0,i:2006}, D{l:5,t:11,i:30}, D{l:7,t:11,i:495}, D{l:8,t:11,i:134}, D{l:9,t:11,i:788}, D{l:140,t:11,i:438}, D{l:135,t:11,i:2004}, D{l:137,t:0,i:696}, D{l:5,t:11,i:50}, D{l:6,t:11,i:439}, D{l:7,t:11,i:780}, D{l:135,t:11,i:1040}, D{l:7,t:11,i:772}, D{l:7,t:11,i:1104}, D{l:7,t:11,i:1647}, D{l:11,t:11,i:269}, D{l:11,t:11,i:539}, D{l:11,t:11,i:607}, D{l:11,t:11,i:627}, D{l:11,t:11,i:706}, D{l:11,t:11,i:975}, D{l:12,t:11,i:248}, D{l:12,t:11,i:311}, D{l:12,t:11,i:434}, D{l:12,t:11,i:600}, D{l:12,t:11,i:622}, D{l:13,t:11,i:297}, D{l:13,t:11,i:367}, D{l:13,t:11,i:485}, D{l:14,t:11,i:69}, D{l:14,t:11,i:409}, D{l:143,t:11,i:108}, D{l:5,t:11,i:1}, D{l:6,t:11,i:81}, D{l:138,t:11,i:520}, D{l:7,t:0,i:1718}, D{l:9,t:0,i:95}, D{l:9,t:0,i:274}, D{l:10,t:0,i:279}, D{l:10,t:0,i:317}, D{l:10,t:0,i:420}, D{l:11,t:0,i:303}, D{l:11,t:0,i:808}, D{l:12,t:0,i:134}, D{l:12,t:0,i:367}, D{l:13,t:0,i:149}, D{l:13,t:0,i:347}, D{l:14,t:0,i:349}, D{l:14,t:0,i:406}, D{l:18,t:0,i:22}, D{l:18,t:0,i:89}, D{l:18,t:0,i:122}, D{l:147,t:0,i:47}, D{l:5,t:11,i:482}, D{l:8,t:11,i:98}, D{l:9,t:11,i:172}, D{l:10,t:11,i:222}, D{l:10,t:11,i:700}, D{l:10,t:11,i:822}, D{l:11,t:11,i:302}, D{l:11,t:11,i:778}, D{l:12,t:11,i:50}, D{l:12,t:11,i:127}, D{l:12,t:11,i:396}, D{l:13,t:11,i:62}, D{l:13,t:11,i:328}, D{l:14,t:11,i:122}, D{l:147,t:11,i:72}, D{l:7,t:10,i:386}, D{l:138,t:10,i:713}, D{l:6,t:10,i:7}, D{l:6,t:10,i:35}, D{l:7,t:10,i:147}, D{l:7,t:10,i:1069}, D{l:7,t:10,i:1568}, D{l:7,t:10,i:1575}, D{l:7,t:10,i:1917}, D{l:8,t:10,i:43}, D{l:8,t:10,i:208}, D{l:9,t:10,i:128}, D{l:9,t:10,i:866}, D{l:10,t:10,i:20}, D{l:11,t:10,i:981}, D{l:147,t:10,i:33}, D{l:133,t:0,i:26}, D{l:132,t:0,i:550}, D{l:5,t:11,i:2}, D{l:7,t:11,i:1494}, D{l:136,t:11,i:589}, D{l:6,t:11,i:512}, D{l:7,t:11,i:797}, D{l:8,t:11,i:253}, D{l:9,t:11,i:77}, D{l:10,t:11,i:1}, D{l:10,t:11,i:129}, D{l:10,t:11,i:225}, D{l:11,t:11,i:118}, D{l:11,t:11,i:226}, D{l:11,t:11,i:251}, D{l:11,t:11,i:430}, D{l:11,t:11,i:701}, D{l:11,t:11,i:974}, D{l:11,t:11,i:982}, D{l:12,t:11,i:64}, D{l:12,t:11,i:260}, D{l:12,t:11,i:488}, D{l:140,t:11,i:690}, D{l:7,t:10,i:893}, D{l:141,t:10,i:424}, D{l:134,t:0,i:901}, D{l:136,t:0,i:822}, D{l:4,t:0,i:902}, D{l:5,t:0,i:809}, D{l:134,t:0,i:122}, D{l:6,t:0,i:807}, D{l:134,t:0,i:1366}, D{l:7,t:0,i:262}, D{l:5,t:11,i:748}, D{l:134,t:11,i:553}, D{l:133,t:0,i:620}, D{l:4,t:0,i:34}, D{l:5,t:0,i:574}, D{l:7,t:0,i:279}, D{l:7,t:0,i:1624}, D{l:136,t:0,i:601}, D{l:9,t:0,i:170}, D{l:6,t:10,i:322}, D{l:9,t:10,i:552}, D{l:11,t:10,i:274}, D{l:13,t:10,i:209}, D{l:13,t:10,i:499}, D{l:14,t:10,i:85}, D{l:15,t:10,i:126}, D{l:145,t:10,i:70}, D{l:132,t:0,i:537}, D{l:4,t:11,i:12}, D{l:7,t:11,i:420}, D{l:7,t:11,i:522}, D{l:7,t:11,i:809}, D{l:8,t:11,i:797}, D{l:141,t:11,i:88}, D{l:133,t:0,i:332}, D{l:8,t:10,i:83}, D{l:8,t:10,i:742}, D{l:8,t:10,i:817}, D{l:9,t:10,i:28}, D{l:9,t:10,i:29}, D{l:9,t:10,i:885}, D{l:10,t:10,i:387}, D{l:11,t:10,i:633}, D{l:11,t:10,i:740}, D{l:13,t:10,i:235}, D{l:13,t:10,i:254}, D{l:15,t:10,i:143}, D{l:143,t:10,i:146}, D{l:6,t:0,i:1909}, D{l:9,t:0,i:964}, D{l:12,t:0,i:822}, D{l:12,t:0,i:854}, D{l:12,t:0,i:865}, D{l:12,t:0,i:910}, D{l:12,t:0,i:938}, D{l:15,t:0,i:169}, D{l:15,t:0,i:208}, D{l:15,t:0,i:211}, D{l:18,t:0,i:205}, D{l:18,t:0,i:206}, D{l:18,t:0,i:220}, D{l:18,t:0,i:223}, D{l:152,t:0,i:24}, D{l:140,t:10,i:49}, D{l:5,t:11,i:528}, D{l:135,t:11,i:1580}, D{l:6,t:0,i:261}, D{l:8,t:0,i:182}, D{l:139,t:0,i:943}, D{l:134,t:0,i:1721}, D{l:4,t:0,i:933}, D{l:133,t:0,i:880}, D{l:136,t:11,i:321}, D{l:5,t:11,i:266}, D{l:9,t:11,i:290}, D{l:9,t:11,i:364}, D{l:10,t:11,i:293}, D{l:11,t:11,i:606}, D{l:142,t:11,i:45}, D{l:6,t:0,i:1609}, D{l:4,t:11,i:50}, D{l:6,t:11,i:510}, D{l:6,t:11,i:594}, D{l:9,t:11,i:121}, D{l:10,t:11,i:49}, D{l:10,t:11,i:412}, D{l:139,t:11,i:834}, D{l:7,t:0,i:895}, D{l:136,t:11,i:748}, D{l:132,t:11,i:466}, D{l:4,t:10,i:110}, D{l:10,t:10,i:415}, D{l:10,t:10,i:597}, D{l:142,t:10,i:206}, D{l:133,t:0,i:812}, D{l:135,t:11,i:281}, D{l:6,t:0,i:1890}, D{l:6,t:0,i:1902}, D{l:6,t:0,i:1916}, D{l:9,t:0,i:929}, D{l:9,t:0,i:942}, D{l:9,t:0,i:975}, D{l:9,t:0,i:984}, D{l:9,t:0,i:986}, D{l:9,t:0,i:1011}, D{l:9,t:0,i:1019}, D{l:12,t:0,i:804}, D{l:12,t:0,i:851}, D{l:12,t:0,i:867}, D{l:12,t:0,i:916}, D{l:12,t:0,i:923}, D{l:15,t:0,i:194}, D{l:15,t:0,i:204}, D{l:15,t:0,i:210}, D{l:15,t:0,i:222}, D{l:15,t:0,i:223}, D{l:15,t:0,i:229}, D{l:15,t:0,i:250}, D{l:18,t:0,i:179}, D{l:18,t:0,i:186}, D{l:18,t:0,i:192}, D{l:7,t:10,i:205}, D{l:135,t:10,i:2000}, D{l:132,t:11,i:667}, D{l:135,t:0,i:778}, D{l:4,t:0,i:137}, D{l:7,t:0,i:1178}, D{l:135,t:0,i:1520}, D{l:134,t:0,i:1314}, D{l:4,t:11,i:242}, D{l:134,t:11,i:333}, D{l:6,t:0,i:1661}, D{l:7,t:0,i:1975}, D{l:7,t:0,i:2009}, D{l:135,t:0,i:2011}, D{l:134,t:0,i:1591}, D{l:4,t:10,i:283}, D{l:135,t:10,i:1194}, D{l:11,t:0,i:820}, D{l:150,t:0,i:51}, D{l:4,t:11,i:39}, D{l:5,t:11,i:36}, D{l:7,t:11,i:1843}, D{l:8,t:11,i:407}, D{l:11,t:11,i:144}, D{l:140,t:11,i:523}, D{l:134,t:10,i:1720}, D{l:4,t:11,i:510}, D{l:7,t:11,i:29}, D{l:7,t:11,i:66}, D{l:7,t:11,i:1980}, D{l:10,t:11,i:487}, D{l:10,t:11,i:809}, D{l:146,t:11,i:9}, D{l:5,t:0,i:89}, D{l:7,t:0,i:1915}, D{l:9,t:0,i:185}, D{l:9,t:0,i:235}, D{l:10,t:0,i:64}, D{l:10,t:0,i:270}, D{l:10,t:0,i:403}, D{l:10,t:0,i:469}, D{l:10,t:0,i:529}, D{l:10,t:0,i:590}, D{l:11,t:0,i:140}, D{l:11,t:0,i:860}, D{l:13,t:0,i:1}, D{l:13,t:0,i:422}, D{l:14,t:0,i:341}, D{l:14,t:0,i:364}, D{l:17,t:0,i:93}, D{l:18,t:0,i:113}, D{l:19,t:0,i:97}, D{l:147,t:0,i:113}, D{l:133,t:0,i:695}, D{l:6,t:0,i:987}, D{l:134,t:0,i:1160}, D{l:5,t:0,i:6}, D{l:6,t:0,i:183}, D{l:7,t:0,i:680}, D{l:7,t:0,i:978}, D{l:7,t:0,i:1013}, D{l:7,t:0,i:1055}, D{l:12,t:0,i:230}, D{l:13,t:0,i:172}, D{l:146,t:0,i:29}, D{l:134,t:11,i:570}, D{l:132,t:11,i:787}, D{l:134,t:11,i:518}, D{l:6,t:0,i:29}, D{l:139,t:0,i:63}, D{l:132,t:11,i:516}, D{l:136,t:11,i:821}, D{l:132,t:0,i:311}, D{l:134,t:0,i:1740}, D{l:7,t:0,i:170}, D{l:8,t:0,i:90}, D{l:8,t:0,i:177}, D{l:8,t:0,i:415}, D{l:11,t:0,i:714}, D{l:14,t:0,i:281}, D{l:136,t:10,i:735}, D{l:134,t:0,i:1961}, D{l:135,t:11,i:1405}, D{l:4,t:11,i:10}, D{l:7,t:11,i:917}, D{l:139,t:11,i:786}, D{l:5,t:10,i:132}, D{l:9,t:10,i:486}, D{l:9,t:10,i:715}, D{l:10,t:10,i:458}, D{l:11,t:10,i:373}, D{l:11,t:10,i:668}, D{l:11,t:10,i:795}, D{l:11,t:10,i:897}, D{l:12,t:10,i:272}, D{l:12,t:10,i:424}, D{l:12,t:10,i:539}, D{l:12,t:10,i:558}, D{l:14,t:10,i:245}, D{l:14,t:10,i:263}, D{l:14,t:10,i:264}, D{l:14,t:10,i:393}, D{l:142,t:10,i:403}, D{l:11,t:0,i:91}, D{l:13,t:0,i:129}, D{l:15,t:0,i:101}, D{l:145,t:0,i:125}, D{l:135,t:0,i:1132}, D{l:4,t:0,i:494}, D{l:6,t:0,i:74}, D{l:7,t:0,i:44}, D{l:7,t:0,i:407}, D{l:12,t:0,i:17}, D{l:15,t:0,i:5}, D{l:148,t:0,i:11}, D{l:133,t:10,i:379}, D{l:5,t:0,i:270}, D{l:5,t:11,i:684}, D{l:6,t:10,i:89}, D{l:6,t:10,i:400}, D{l:7,t:10,i:1569}, D{l:7,t:10,i:1623}, D{l:7,t:10,i:1850}, D{l:8,t:10,i:218}, D{l:8,t:10,i:422}, D{l:9,t:10,i:570}, D{l:138,t:10,i:626}, D{l:4,t:0,i:276}, D{l:133,t:0,i:296}, D{l:6,t:0,i:1523}, D{l:134,t:11,i:27}, D{l:6,t:10,i:387}, D{l:7,t:10,i:882}, D{l:141,t:10,i:111}, D{l:6,t:10,i:224}, D{l:7,t:10,i:877}, D{l:137,t:10,i:647}, D{l:135,t:10,i:790}, D{l:4,t:0,i:7}, D{l:5,t:0,i:90}, D{l:5,t:0,i:158}, D{l:6,t:0,i:542}, D{l:7,t:0,i:221}, D{l:7,t:0,i:1574}, D{l:9,t:0,i:490}, D{l:10,t:0,i:540}, D{l:11,t:0,i:443}, D{l:139,t:0,i:757}, D{l:7,t:0,i:588}, D{l:9,t:0,i:175}, D{l:138,t:0,i:530}, D{l:135,t:10,i:394}, D{l:142,t:11,i:23}, D{l:134,t:0,i:786}, D{l:135,t:0,i:580}, D{l:7,t:0,i:88}, D{l:136,t:0,i:627}, D{l:5,t:0,i:872}, D{l:6,t:0,i:57}, D{l:7,t:0,i:471}, D{l:9,t:0,i:447}, D{l:137,t:0,i:454}, D{l:6,t:11,i:342}, D{l:6,t:11,i:496}, D{l:8,t:11,i:275}, D{l:137,t:11,i:206}, D{l:4,t:11,i:909}, D{l:133,t:11,i:940}, D{l:6,t:0,i:735}, D{l:132,t:11,i:891}, D{l:8,t:0,i:845}, D{l:8,t:0,i:916}, D{l:135,t:10,i:1409}, D{l:5,t:0,i:31}, D{l:134,t:0,i:614}, D{l:11,t:0,i:458}, D{l:12,t:0,i:15}, D{l:140,t:0,i:432}, D{l:8,t:0,i:330}, D{l:140,t:0,i:477}, D{l:4,t:0,i:530}, D{l:5,t:0,i:521}, D{l:7,t:0,i:1200}, D{l:10,t:0,i:460}, D{l:132,t:11,i:687}, D{l:6,t:0,i:424}, D{l:135,t:0,i:1866}, D{l:9,t:0,i:569}, D{l:12,t:0,i:12}, D{l:12,t:0,i:81}, D{l:12,t:0,i:319}, D{l:13,t:0,i:69}, D{l:14,t:0,i:259}, D{l:16,t:0,i:87}, D{l:17,t:0,i:1}, D{l:17,t:0,i:21}, D{l:17,t:0,i:24}, D{l:18,t:0,i:15}, D{l:18,t:0,i:56}, D{l:18,t:0,i:59}, D{l:18,t:0,i:127}, D{l:18,t:0,i:154}, D{l:19,t:0,i:19}, D{l:148,t:0,i:31}, D{l:7,t:0,i:1302}, D{l:136,t:10,i:38}, D{l:134,t:11,i:253}, D{l:5,t:10,i:261}, D{l:7,t:10,i:78}, D{l:7,t:10,i:199}, D{l:8,t:10,i:815}, D{l:9,t:10,i:126}, D{l:138,t:10,i:342}, D{l:5,t:0,i:595}, D{l:135,t:0,i:1863}, D{l:6,t:11,i:41}, D{l:141,t:11,i:160}, D{l:5,t:0,i:13}, D{l:134,t:0,i:142}, D{l:6,t:0,i:97}, D{l:7,t:0,i:116}, D{l:8,t:0,i:322}, D{l:8,t:0,i:755}, D{l:9,t:0,i:548}, D{l:10,t:0,i:714}, D{l:11,t:0,i:884}, D{l:13,t:0,i:324}, D{l:7,t:11,i:1304}, D{l:138,t:11,i:477}, D{l:132,t:10,i:628}, D{l:134,t:11,i:1718}, D{l:7,t:10,i:266}, D{l:136,t:10,i:804}, D{l:135,t:10,i:208}, D{l:7,t:0,i:1021}, D{l:6,t:10,i:79}, D{l:135,t:10,i:1519}, D{l:7,t:0,i:1472}, D{l:135,t:0,i:1554}, D{l:6,t:11,i:362}, D{l:146,t:11,i:51}, D{l:7,t:0,i:1071}, D{l:7,t:0,i:1541}, D{l:7,t:0,i:1767}, D{l:7,t:0,i:1806}, D{l:11,t:0,i:162}, D{l:11,t:0,i:242}, D{l:11,t:0,i:452}, D{l:12,t:0,i:605}, D{l:15,t:0,i:26}, D{l:144,t:0,i:44}, D{l:136,t:10,i:741}, D{l:133,t:11,i:115}, D{l:145,t:0,i:115}, D{l:134,t:10,i:376}, D{l:6,t:0,i:1406}, D{l:134,t:0,i:1543}, D{l:5,t:11,i:193}, D{l:12,t:11,i:178}, D{l:13,t:11,i:130}, D{l:145,t:11,i:84}, D{l:135,t:0,i:1111}, D{l:8,t:0,i:1}, D{l:9,t:0,i:650}, D{l:10,t:0,i:326}, D{l:5,t:11,i:705}, D{l:137,t:11,i:606}, D{l:5,t:0,i:488}, D{l:6,t:0,i:527}, D{l:7,t:0,i:489}, D{l:7,t:0,i:1636}, D{l:8,t:0,i:121}, D{l:8,t:0,i:144}, D{l:8,t:0,i:359}, D{l:9,t:0,i:193}, D{l:9,t:0,i:241}, D{l:9,t:0,i:336}, D{l:9,t:0,i:882}, D{l:11,t:0,i:266}, D{l:11,t:0,i:372}, D{l:11,t:0,i:944}, D{l:12,t:0,i:401}, D{l:140,t:0,i:641}, D{l:135,t:11,i:174}, D{l:6,t:0,i:267}, D{l:7,t:10,i:244}, D{l:7,t:10,i:632}, D{l:7,t:10,i:1609}, D{l:8,t:10,i:178}, D{l:8,t:10,i:638}, D{l:141,t:10,i:58}, D{l:134,t:0,i:1983}, D{l:134,t:0,i:1155}, D{l:134,t:0,i:1575}, D{l:134,t:0,i:1438}, D{l:9,t:0,i:31}, D{l:10,t:0,i:244}, D{l:10,t:0,i:699}, D{l:12,t:0,i:149}, D{l:141,t:0,i:497}, D{l:133,t:0,i:377}, D{l:4,t:11,i:122}, D{l:5,t:11,i:796}, D{l:5,t:11,i:952}, D{l:6,t:11,i:1660}, D{l:6,t:11,i:1671}, D{l:8,t:11,i:567}, D{l:9,t:11,i:687}, D{l:9,t:11,i:742}, D{l:10,t:11,i:686}, D{l:11,t:11,i:356}, D{l:11,t:11,i:682}, D{l:140,t:11,i:281}, D{l:145,t:0,i:101}, D{l:11,t:11,i:0}, D{l:144,t:11,i:78}, D{l:5,t:11,i:179}, D{l:5,t:10,i:791}, D{l:7,t:11,i:1095}, D{l:135,t:11,i:1213}, D{l:8,t:11,i:372}, D{l:9,t:11,i:122}, D{l:138,t:11,i:175}, D{l:7,t:10,i:686}, D{l:8,t:10,i:33}, D{l:8,t:10,i:238}, D{l:10,t:10,i:616}, D{l:11,t:10,i:467}, D{l:11,t:10,i:881}, D{l:13,t:10,i:217}, D{l:13,t:10,i:253}, D{l:142,t:10,i:268}, D{l:9,t:0,i:476}, D{l:4,t:11,i:66}, D{l:7,t:11,i:722}, D{l:135,t:11,i:904}, D{l:7,t:11,i:352}, D{l:137,t:11,i:684}, D{l:135,t:0,i:2023}, D{l:135,t:0,i:1836}, D{l:132,t:10,i:447}, D{l:5,t:0,i:843}, D{l:144,t:0,i:35}, D{l:137,t:11,i:779}, D{l:141,t:11,i:35}, D{l:4,t:10,i:128}, D{l:5,t:10,i:415}, D{l:6,t:10,i:462}, D{l:7,t:10,i:294}, D{l:7,t:10,i:578}, D{l:10,t:10,i:710}, D{l:139,t:10,i:86}, D{l:132,t:0,i:554}, D{l:133,t:0,i:536}, D{l:136,t:10,i:587}, D{l:5,t:0,i:207}, D{l:9,t:0,i:79}, D{l:11,t:0,i:625}, D{l:145,t:0,i:7}, D{l:7,t:0,i:1371}, D{l:6,t:10,i:427}, D{l:138,t:10,i:692}, D{l:4,t:0,i:424}, D{l:4,t:10,i:195}, D{l:135,t:10,i:802}, D{l:8,t:0,i:785}, D{l:133,t:11,i:564}, D{l:135,t:0,i:336}, D{l:4,t:0,i:896}, D{l:6,t:0,i:1777}, D{l:134,t:11,i:556}, D{l:137,t:11,i:103}, D{l:134,t:10,i:1683}, D{l:7,t:11,i:544}, D{l:8,t:11,i:719}, D{l:138,t:11,i:61}, D{l:138,t:10,i:472}, D{l:4,t:11,i:5}, D{l:5,t:11,i:498}, D{l:136,t:11,i:637}, D{l:7,t:0,i:750}, D{l:9,t:0,i:223}, D{l:11,t:0,i:27}, D{l:11,t:0,i:466}, D{l:12,t:0,i:624}, D{l:14,t:0,i:265}, D{l:146,t:0,i:61}, D{l:12,t:0,i:238}, D{l:18,t:0,i:155}, D{l:12,t:11,i:238}, D{l:146,t:11,i:155}, D{l:151,t:10,i:28}, D{l:133,t:11,i:927}, D{l:12,t:0,i:383}, D{l:5,t:10,i:3}, D{l:8,t:10,i:578}, D{l:9,t:10,i:118}, D{l:10,t:10,i:705}, D{l:141,t:10,i:279}, D{l:4,t:11,i:893}, D{l:5,t:11,i:780}, D{l:133,t:11,i:893}, D{l:4,t:0,i:603}, D{l:133,t:0,i:661}, D{l:4,t:0,i:11}, D{l:6,t:0,i:128}, D{l:7,t:0,i:231}, D{l:7,t:0,i:1533}, D{l:10,t:0,i:725}, D{l:5,t:10,i:229}, D{l:5,t:11,i:238}, D{l:135,t:11,i:1350}, D{l:8,t:10,i:102}, D{l:10,t:10,i:578}, D{l:10,t:10,i:672}, D{l:12,t:10,i:496}, D{l:13,t:10,i:408}, D{l:14,t:10,i:121}, D{l:145,t:10,i:106}, D{l:132,t:0,i:476}, D{l:134,t:0,i:1552}, D{l:134,t:11,i:1729}, D{l:8,t:10,i:115}, D{l:8,t:10,i:350}, D{l:9,t:10,i:489}, D{l:10,t:10,i:128}, D{l:11,t:10,i:306}, D{l:12,t:10,i:373}, D{l:14,t:10,i:30}, D{l:17,t:10,i:79}, D{l:19,t:10,i:80}, D{l:150,t:10,i:55}, D{l:135,t:0,i:1807}, D{l:4,t:0,i:680}, D{l:4,t:11,i:60}, D{l:7,t:11,i:760}, D{l:7,t:11,i:1800}, D{l:8,t:11,i:314}, D{l:9,t:11,i:700}, D{l:139,t:11,i:487}, D{l:4,t:10,i:230}, D{l:5,t:10,i:702}, D{l:148,t:11,i:94}, D{l:132,t:11,i:228}, D{l:139,t:0,i:435}, D{l:9,t:0,i:20}, D{l:10,t:0,i:324}, D{l:10,t:0,i:807}, D{l:139,t:0,i:488}, D{l:6,t:10,i:1728}, D{l:136,t:11,i:419}, D{l:4,t:10,i:484}, D{l:18,t:10,i:26}, D{l:19,t:10,i:42}, D{l:20,t:10,i:43}, D{l:21,t:10,i:0}, D{l:23,t:10,i:27}, D{l:152,t:10,i:14}, D{l:135,t:0,i:1431}, D{l:133,t:11,i:828}, D{l:5,t:0,i:112}, D{l:6,t:0,i:103}, D{l:6,t:0,i:150}, D{l:7,t:0,i:1303}, D{l:9,t:0,i:292}, D{l:10,t:0,i:481}, D{l:20,t:0,i:13}, D{l:7,t:11,i:176}, D{l:7,t:11,i:178}, D{l:7,t:11,i:1110}, D{l:10,t:11,i:481}, D{l:148,t:11,i:13}, D{l:138,t:0,i:356}, D{l:4,t:11,i:51}, D{l:5,t:11,i:39}, D{l:6,t:11,i:4}, D{l:7,t:11,i:591}, D{l:7,t:11,i:849}, D{l:7,t:11,i:951}, D{l:7,t:11,i:1129}, D{l:7,t:11,i:1613}, D{l:7,t:11,i:1760}, D{l:7,t:11,i:1988}, D{l:9,t:11,i:434}, D{l:10,t:11,i:754}, D{l:11,t:11,i:25}, D{l:11,t:11,i:37}, D{l:139,t:11,i:414}, D{l:6,t:0,i:1963}, D{l:134,t:0,i:2000}, D{l:132,t:10,i:633}, D{l:6,t:0,i:1244}, D{l:133,t:11,i:902}, D{l:135,t:11,i:928}, D{l:140,t:0,i:18}, D{l:138,t:0,i:204}, D{l:135,t:11,i:1173}, D{l:134,t:0,i:867}, D{l:4,t:0,i:708}, D{l:8,t:0,i:15}, D{l:9,t:0,i:50}, D{l:9,t:0,i:386}, D{l:11,t:0,i:18}, D{l:11,t:0,i:529}, D{l:140,t:0,i:228}, D{l:134,t:11,i:270}, D{l:4,t:0,i:563}, D{l:7,t:0,i:109}, D{l:7,t:0,i:592}, D{l:7,t:0,i:637}, D{l:7,t:0,i:770}, D{l:8,t:0,i:463}, D{l:9,t:0,i:60}, D{l:9,t:0,i:335}, D{l:9,t:0,i:904}, D{l:10,t:0,i:73}, D{l:11,t:0,i:434}, D{l:12,t:0,i:585}, D{l:13,t:0,i:331}, D{l:18,t:0,i:110}, D{l:148,t:0,i:60}, D{l:132,t:0,i:502}, D{l:14,t:11,i:359}, D{l:19,t:11,i:52}, D{l:148,t:11,i:47}, D{l:6,t:11,i:377}, D{l:7,t:11,i:1025}, D{l:9,t:11,i:613}, D{l:145,t:11,i:104}, D{l:6,t:0,i:347}, D{l:10,t:0,i:161}, D{l:5,t:10,i:70}, D{l:5,t:10,i:622}, D{l:6,t:10,i:334}, D{l:7,t:10,i:1032}, D{l:9,t:10,i:171}, D{l:11,t:10,i:26}, D{l:11,t:10,i:213}, D{l:11,t:10,i:637}, D{l:11,t:10,i:707}, D{l:12,t:10,i:202}, D{l:12,t:10,i:380}, D{l:13,t:10,i:226}, D{l:13,t:10,i:355}, D{l:14,t:10,i:222}, D{l:145,t:10,i:42}, D{l:132,t:11,i:416}, D{l:4,t:0,i:33}, D{l:5,t:0,i:102}, D{l:6,t:0,i:284}, D{l:7,t:0,i:1079}, D{l:7,t:0,i:1423}, D{l:7,t:0,i:1702}, D{l:8,t:0,i:470}, D{l:9,t:0,i:554}, D{l:9,t:0,i:723}, D{l:11,t:0,i:333}, D{l:142,t:11,i:372}, D{l:5,t:11,i:152}, D{l:5,t:11,i:197}, D{l:7,t:11,i:340}, D{l:7,t:11,i:867}, D{l:10,t:11,i:548}, D{l:10,t:11,i:581}, D{l:11,t:11,i:6}, D{l:12,t:11,i:3}, D{l:12,t:11,i:19}, D{l:14,t:11,i:110}, D{l:142,t:11,i:289}, D{l:7,t:0,i:246}, D{l:135,t:0,i:840}, D{l:6,t:0,i:10}, D{l:8,t:0,i:571}, D{l:9,t:0,i:739}, D{l:143,t:0,i:91}, D{l:6,t:0,i:465}, D{l:7,t:0,i:1465}, D{l:4,t:10,i:23}, D{l:4,t:10,i:141}, D{l:5,t:10,i:313}, D{l:5,t:10,i:1014}, D{l:6,t:10,i:50}, D{l:7,t:10,i:142}, D{l:7,t:10,i:559}, D{l:8,t:10,i:640}, D{l:9,t:10,i:460}, D{l:9,t:10,i:783}, D{l:11,t:10,i:741}, D{l:12,t:10,i:183}, D{l:141,t:10,i:488}, D{l:133,t:0,i:626}, D{l:136,t:0,i:614}, D{l:138,t:0,i:237}, D{l:7,t:11,i:34}, D{l:7,t:11,i:190}, D{l:8,t:11,i:28}, D{l:8,t:11,i:141}, D{l:8,t:11,i:444}, D{l:8,t:11,i:811}, D{l:9,t:11,i:468}, D{l:11,t:11,i:334}, D{l:12,t:11,i:24}, D{l:12,t:11,i:386}, D{l:140,t:11,i:576}, D{l:133,t:11,i:757}, D{l:5,t:0,i:18}, D{l:6,t:0,i:526}, D{l:13,t:0,i:24}, D{l:13,t:0,i:110}, D{l:19,t:0,i:5}, D{l:147,t:0,i:44}, D{l:6,t:0,i:506}, D{l:134,t:11,i:506}, D{l:135,t:11,i:1553}, D{l:4,t:0,i:309}, D{l:5,t:0,i:462}, D{l:7,t:0,i:970}, D{l:7,t:0,i:1097}, D{l:22,t:0,i:30}, D{l:22,t:0,i:33}, D{l:7,t:11,i:1385}, D{l:11,t:11,i:582}, D{l:11,t:11,i:650}, D{l:11,t:11,i:901}, D{l:11,t:11,i:949}, D{l:12,t:11,i:232}, D{l:12,t:11,i:236}, D{l:13,t:11,i:413}, D{l:13,t:11,i:501}, D{l:146,t:11,i:116}, D{l:9,t:0,i:140}, D{l:5,t:10,i:222}, D{l:138,t:10,i:534}, D{l:6,t:0,i:1056}, D{l:137,t:10,i:906}, D{l:134,t:0,i:1704}, D{l:138,t:10,i:503}, D{l:134,t:0,i:1036}, D{l:5,t:10,i:154}, D{l:7,t:10,i:1491}, D{l:10,t:10,i:379}, D{l:138,t:10,i:485}, D{l:4,t:11,i:383}, D{l:133,t:10,i:716}, D{l:134,t:0,i:1315}, D{l:5,t:0,i:86}, D{l:7,t:0,i:743}, D{l:9,t:0,i:85}, D{l:10,t:0,i:281}, D{l:10,t:0,i:432}, D{l:11,t:0,i:825}, D{l:12,t:0,i:251}, D{l:13,t:0,i:118}, D{l:142,t:0,i:378}, D{l:8,t:0,i:264}, D{l:4,t:10,i:91}, D{l:5,t:10,i:388}, D{l:5,t:10,i:845}, D{l:6,t:10,i:206}, D{l:6,t:10,i:252}, D{l:6,t:10,i:365}, D{l:7,t:10,i:136}, D{l:7,t:10,i:531}, D{l:136,t:10,i:621}, D{l:5,t:0,i:524}, D{l:133,t:0,i:744}, D{l:5,t:11,i:277}, D{l:141,t:11,i:247}, D{l:132,t:11,i:435}, D{l:10,t:0,i:107}, D{l:140,t:0,i:436}, D{l:132,t:0,i:927}, D{l:10,t:0,i:123}, D{l:12,t:0,i:670}, D{l:146,t:0,i:94}, D{l:7,t:0,i:1149}, D{l:9,t:0,i:156}, D{l:138,t:0,i:957}, D{l:5,t:11,i:265}, D{l:6,t:11,i:212}, D{l:135,t:11,i:28}, D{l:133,t:0,i:778}, D{l:133,t:0,i:502}, D{l:8,t:0,i:196}, D{l:10,t:0,i:283}, D{l:139,t:0,i:406}, D{l:135,t:10,i:576}, D{l:136,t:11,i:535}, D{l:134,t:0,i:1312}, D{l:5,t:10,i:771}, D{l:5,t:10,i:863}, D{l:5,t:10,i:898}, D{l:6,t:10,i:1632}, D{l:6,t:10,i:1644}, D{l:134,t:10,i:1780}, D{l:5,t:0,i:855}, D{l:5,t:10,i:331}, D{l:135,t:11,i:1487}, D{l:132,t:11,i:702}, D{l:5,t:11,i:808}, D{l:135,t:11,i:2045}, D{l:7,t:0,i:1400}, D{l:9,t:0,i:446}, D{l:138,t:0,i:45}, D{l:140,t:10,i:632}, D{l:132,t:0,i:1003}, D{l:5,t:11,i:166}, D{l:8,t:11,i:739}, D{l:140,t:11,i:511}, D{l:5,t:10,i:107}, D{l:7,t:10,i:201}, D{l:136,t:10,i:518}, D{l:6,t:10,i:446}, D{l:135,t:10,i:1817}, D{l:134,t:0,i:1532}, D{l:134,t:0,i:1097}, D{l:4,t:11,i:119}, D{l:5,t:11,i:170}, D{l:5,t:11,i:447}, D{l:7,t:11,i:1708}, D{l:7,t:11,i:1889}, D{l:9,t:11,i:357}, D{l:9,t:11,i:719}, D{l:12,t:11,i:486}, D{l:140,t:11,i:596}, D{l:9,t:10,i:851}, D{l:141,t:10,i:510}, D{l:7,t:0,i:612}, D{l:8,t:0,i:545}, D{l:8,t:0,i:568}, D{l:8,t:0,i:642}, D{l:9,t:0,i:717}, D{l:10,t:0,i:541}, D{l:10,t:0,i:763}, D{l:11,t:0,i:449}, D{l:12,t:0,i:489}, D{l:13,t:0,i:153}, D{l:13,t:0,i:296}, D{l:14,t:0,i:138}, D{l:14,t:0,i:392}, D{l:15,t:0,i:50}, D{l:16,t:0,i:6}, D{l:16,t:0,i:12}, D{l:20,t:0,i:9}, D{l:132,t:10,i:504}, D{l:4,t:11,i:450}, D{l:135,t:11,i:1158}, D{l:11,t:0,i:54}, D{l:13,t:0,i:173}, D{l:13,t:0,i:294}, D{l:5,t:10,i:883}, D{l:5,t:10,i:975}, D{l:8,t:10,i:392}, D{l:148,t:10,i:7}, D{l:13,t:0,i:455}, D{l:15,t:0,i:99}, D{l:15,t:0,i:129}, D{l:144,t:0,i:68}, D{l:135,t:0,i:172}, D{l:132,t:11,i:754}, D{l:5,t:10,i:922}, D{l:134,t:10,i:1707}, D{l:134,t:0,i:1029}, D{l:17,t:11,i:39}, D{l:148,t:11,i:36}, D{l:4,t:0,i:568}, D{l:5,t:10,i:993}, D{l:7,t:10,i:515}, D{l:137,t:10,i:91}, D{l:132,t:0,i:732}, D{l:10,t:0,i:617}, D{l:138,t:11,i:617}, D{l:134,t:0,i:974}, D{l:7,t:0,i:989}, D{l:10,t:0,i:377}, D{l:12,t:0,i:363}, D{l:13,t:0,i:68}, D{l:13,t:0,i:94}, D{l:14,t:0,i:108}, D{l:142,t:0,i:306}, D{l:136,t:0,i:733}, D{l:132,t:0,i:428}, D{l:7,t:0,i:1789}, D{l:135,t:11,i:1062}, D{l:7,t:0,i:2015}, D{l:140,t:0,i:665}, D{l:135,t:10,i:1433}, D{l:5,t:0,i:287}, D{l:7,t:10,i:921}, D{l:8,t:10,i:580}, D{l:8,t:10,i:593}, D{l:8,t:10,i:630}, D{l:138,t:10,i:28}, D{l:138,t:0,i:806}, D{l:4,t:10,i:911}, D{l:5,t:10,i:867}, D{l:5,t:10,i:1013}, D{l:7,t:10,i:2034}, D{l:8,t:10,i:798}, D{l:136,t:10,i:813}, D{l:134,t:0,i:1539}, D{l:8,t:11,i:523}, D{l:150,t:11,i:34}, D{l:135,t:11,i:740}, D{l:7,t:11,i:238}, D{l:7,t:11,i:2033}, D{l:8,t:11,i:120}, D{l:8,t:11,i:188}, D{l:8,t:11,i:659}, D{l:9,t:11,i:598}, D{l:10,t:11,i:466}, D{l:12,t:11,i:342}, D{l:12,t:11,i:588}, D{l:13,t:11,i:503}, D{l:14,t:11,i:246}, D{l:143,t:11,i:92}, D{l:7,t:0,i:1563}, D{l:141,t:0,i:182}, D{l:5,t:10,i:135}, D{l:6,t:10,i:519}, D{l:7,t:10,i:1722}, D{l:10,t:10,i:271}, D{l:11,t:10,i:261}, D{l:145,t:10,i:54}, D{l:14,t:10,i:338}, D{l:148,t:10,i:81}, D{l:7,t:0,i:484}, D{l:4,t:10,i:300}, D{l:133,t:10,i:436}, D{l:145,t:11,i:114}, D{l:6,t:0,i:1623}, D{l:134,t:0,i:1681}, D{l:133,t:11,i:640}, D{l:4,t:11,i:201}, D{l:7,t:11,i:1744}, D{l:8,t:11,i:602}, D{l:11,t:11,i:247}, D{l:11,t:11,i:826}, D{l:145,t:11,i:65}, D{l:8,t:11,i:164}, D{l:146,t:11,i:62}, D{l:6,t:0,i:1833}, D{l:6,t:0,i:1861}, D{l:136,t:0,i:878}, D{l:134,t:0,i:1569}, D{l:8,t:10,i:357}, D{l:10,t:10,i:745}, D{l:14,t:10,i:426}, D{l:17,t:10,i:94}, D{l:147,t:10,i:57}, D{l:12,t:0,i:93}, D{l:12,t:0,i:501}, D{l:13,t:0,i:362}, D{l:14,t:0,i:151}, D{l:15,t:0,i:40}, D{l:15,t:0,i:59}, D{l:16,t:0,i:46}, D{l:17,t:0,i:25}, D{l:18,t:0,i:14}, D{l:18,t:0,i:134}, D{l:19,t:0,i:25}, D{l:19,t:0,i:69}, D{l:20,t:0,i:16}, D{l:20,t:0,i:19}, D{l:20,t:0,i:66}, D{l:21,t:0,i:23}, D{l:21,t:0,i:25}, D{l:150,t:0,i:42}, D{l:6,t:0,i:1748}, D{l:8,t:0,i:715}, D{l:9,t:0,i:802}, D{l:10,t:0,i:46}, D{l:10,t:0,i:819}, D{l:13,t:0,i:308}, D{l:14,t:0,i:351}, D{l:14,t:0,i:363}, D{l:146,t:0,i:67}, D{l:132,t:0,i:994}, D{l:4,t:0,i:63}, D{l:133,t:0,i:347}, D{l:132,t:0,i:591}, D{l:133,t:0,i:749}, D{l:7,t:11,i:1577}, D{l:10,t:11,i:304}, D{l:10,t:11,i:549}, D{l:11,t:11,i:424}, D{l:12,t:11,i:365}, D{l:13,t:11,i:220}, D{l:13,t:11,i:240}, D{l:142,t:11,i:33}, D{l:133,t:0,i:366}, D{l:7,t:0,i:557}, D{l:12,t:0,i:547}, D{l:14,t:0,i:86}, D{l:133,t:10,i:387}, D{l:135,t:0,i:1747}, D{l:132,t:11,i:907}, D{l:5,t:11,i:100}, D{l:10,t:11,i:329}, D{l:12,t:11,i:416}, D{l:149,t:11,i:29}, D{l:4,t:10,i:6}, D{l:5,t:10,i:708}, D{l:136,t:10,i:75}, D{l:7,t:10,i:1351}, D{l:9,t:10,i:581}, D{l:10,t:10,i:639}, D{l:11,t:10,i:453}, D{l:140,t:10,i:584}, D{l:7,t:0,i:89}, D{l:132,t:10,i:303}, D{l:138,t:10,i:772}, D{l:132,t:11,i:176}, D{l:5,t:11,i:636}, D{l:5,t:11,i:998}, D{l:8,t:11,i:26}, D{l:137,t:11,i:358}, D{l:7,t:11,i:9}, D{l:7,t:11,i:1508}, D{l:9,t:11,i:317}, D{l:10,t:11,i:210}, D{l:10,t:11,i:292}, D{l:10,t:11,i:533}, D{l:11,t:11,i:555}, D{l:12,t:11,i:526}, D{l:12,t:11,i:607}, D{l:13,t:11,i:263}, D{l:13,t:11,i:459}, D{l:142,t:11,i:271}, D{l:134,t:0,i:1463}, D{l:6,t:0,i:772}, D{l:6,t:0,i:1137}, D{l:139,t:11,i:595}, D{l:7,t:0,i:977}, D{l:139,t:11,i:66}, D{l:138,t:0,i:893}, D{l:20,t:0,i:48}, D{l:148,t:11,i:48}, D{l:5,t:0,i:824}, D{l:133,t:0,i:941}, D{l:134,t:11,i:295}, D{l:7,t:0,i:1543}, D{l:7,t:0,i:1785}, D{l:10,t:0,i:690}, D{l:4,t:10,i:106}, D{l:139,t:10,i:717}, D{l:7,t:0,i:440}, D{l:8,t:0,i:230}, D{l:139,t:0,i:106}, D{l:5,t:10,i:890}, D{l:133,t:10,i:988}, D{l:6,t:10,i:626}, D{l:142,t:10,i:431}, D{l:10,t:11,i:127}, D{l:141,t:11,i:27}, D{l:17,t:0,i:32}, D{l:10,t:10,i:706}, D{l:150,t:10,i:44}, D{l:132,t:0,i:216}, D{l:137,t:0,i:332}, D{l:4,t:10,i:698}, D{l:136,t:11,i:119}, D{l:139,t:11,i:267}, D{l:138,t:10,i:17}, D{l:11,t:11,i:526}, D{l:11,t:11,i:939}, D{l:141,t:11,i:290}, D{l:7,t:11,i:1167}, D{l:11,t:11,i:934}, D{l:13,t:11,i:391}, D{l:145,t:11,i:76}, D{l:139,t:11,i:39}, D{l:134,t:10,i:84}, D{l:4,t:0,i:914}, D{l:5,t:0,i:800}, D{l:133,t:0,i:852}, D{l:10,t:0,i:416}, D{l:141,t:0,i:115}, D{l:7,t:0,i:564}, D{l:142,t:0,i:168}, D{l:4,t:0,i:918}, D{l:133,t:0,i:876}, D{l:134,t:0,i:1764}, D{l:152,t:0,i:3}, D{l:4,t:0,i:92}, D{l:5,t:0,i:274}, D{l:7,t:11,i:126}, D{l:136,t:11,i:84}, D{l:140,t:10,i:498}, D{l:136,t:11,i:790}, D{l:8,t:0,i:501}, D{l:5,t:10,i:986}, D{l:6,t:10,i:130}, D{l:7,t:10,i:1582}, D{l:8,t:10,i:458}, D{l:10,t:10,i:101}, D{l:10,t:10,i:318}, D{l:138,t:10,i:823}, D{l:6,t:11,i:64}, D{l:12,t:11,i:377}, D{l:141,t:11,i:309}, D{l:5,t:0,i:743}, D{l:138,t:0,i:851}, D{l:4,t:0,i:49}, D{l:7,t:0,i:280}, D{l:135,t:0,i:1633}, D{l:134,t:0,i:879}, D{l:136,t:0,i:47}, D{l:7,t:10,i:1644}, D{l:137,t:10,i:129}, D{l:132,t:0,i:865}, D{l:134,t:0,i:1202}, D{l:9,t:11,i:34}, D{l:139,t:11,i:484}, D{l:135,t:10,i:997}, D{l:5,t:0,i:272}, D{l:5,t:0,i:908}, D{l:5,t:0,i:942}, D{l:8,t:0,i:197}, D{l:9,t:0,i:47}, D{l:11,t:0,i:538}, D{l:139,t:0,i:742}, D{l:6,t:11,i:1700}, D{l:7,t:11,i:26}, D{l:7,t:11,i:293}, D{l:7,t:11,i:382}, D{l:7,t:11,i:1026}, D{l:7,t:11,i:1087}, D{l:7,t:11,i:2027}, D{l:8,t:11,i:24}, D{l:8,t:11,i:114}, D{l:8,t:11,i:252}, D{l:8,t:11,i:727}, D{l:8,t:11,i:729}, D{l:9,t:11,i:30}, D{l:9,t:11,i:199}, D{l:9,t:11,i:231}, D{l:9,t:11,i:251}, D{l:9,t:11,i:334}, D{l:9,t:11,i:361}, D{l:9,t:11,i:488}, D{l:9,t:11,i:712}, D{l:10,t:11,i:55}, D{l:10,t:11,i:60}, D{l:10,t:11,i:232}, D{l:10,t:11,i:332}, D{l:10,t:11,i:384}, D{l:10,t:11,i:396}, D{l:10,t:11,i:504}, D{l:10,t:11,i:542}, D{l:10,t:11,i:652}, D{l:11,t:11,i:20}, D{l:11,t:11,i:48}, D{l:11,t:11,i:207}, D{l:11,t:11,i:291}, D{l:11,t:11,i:298}, D{l:11,t:11,i:342}, D{l:11,t:11,i:365}, D{l:11,t:11,i:394}, D{l:11,t:11,i:620}, D{l:11,t:11,i:705}, D{l:11,t:11,i:1017}, D{l:12,t:11,i:123}, D{l:12,t:11,i:340}, D{l:12,t:11,i:406}, D{l:12,t:11,i:643}, D{l:13,t:11,i:61}, D{l:13,t:11,i:269}, D{l:13,t:11,i:311}, D{l:13,t:11,i:319}, D{l:13,t:11,i:486}, D{l:14,t:11,i:234}, D{l:15,t:11,i:62}, D{l:15,t:11,i:85}, D{l:16,t:11,i:71}, D{l:18,t:11,i:119}, D{l:148,t:11,i:105}, D{l:6,t:0,i:1455}, D{l:150,t:11,i:37}, D{l:135,t:10,i:1927}, D{l:135,t:0,i:1911}, D{l:137,t:0,i:891}, D{l:7,t:10,i:1756}, D{l:137,t:10,i:98}, D{l:7,t:10,i:1046}, D{l:139,t:10,i:160}, D{l:132,t:0,i:761}, D{l:6,t:11,i:379}, D{l:7,t:11,i:270}, D{l:7,t:11,i:1116}, D{l:8,t:11,i:176}, D{l:8,t:11,i:183}, D{l:9,t:11,i:432}, D{l:9,t:11,i:661}, D{l:12,t:11,i:247}, D{l:12,t:11,i:617}, D{l:146,t:11,i:125}, D{l:6,t:10,i:45}, D{l:7,t:10,i:433}, D{l:8,t:10,i:129}, D{l:9,t:10,i:21}, D{l:10,t:10,i:392}, D{l:11,t:10,i:79}, D{l:12,t:10,i:499}, D{l:13,t:10,i:199}, D{l:141,t:10,i:451}, D{l:4,t:0,i:407}, D{l:5,t:11,i:792}, D{l:133,t:11,i:900}, D{l:132,t:0,i:560}, D{l:135,t:0,i:183}, D{l:13,t:0,i:490}, D{l:7,t:10,i:558}, D{l:136,t:10,i:353}, D{l:4,t:0,i:475}, D{l:6,t:0,i:731}, D{l:11,t:0,i:35}, D{l:13,t:0,i:71}, D{l:13,t:0,i:177}, D{l:14,t:0,i:422}, D{l:133,t:10,i:785}, D{l:8,t:10,i:81}, D{l:9,t:10,i:189}, D{l:9,t:10,i:201}, D{l:11,t:10,i:478}, D{l:11,t:10,i:712}, D{l:141,t:10,i:338}, D{l:4,t:0,i:418}, D{l:4,t:0,i:819}, D{l:133,t:10,i:353}, D{l:151,t:10,i:26}, D{l:4,t:11,i:901}, D{l:133,t:11,i:776}, D{l:132,t:0,i:575}, D{l:7,t:0,i:818}, D{l:16,t:0,i:92}, D{l:17,t:0,i:14}, D{l:17,t:0,i:45}, D{l:18,t:0,i:75}, D{l:148,t:0,i:18}, D{l:6,t:0,i:222}, D{l:7,t:0,i:636}, D{l:7,t:0,i:1620}, D{l:8,t:0,i:409}, D{l:9,t:0,i:693}, D{l:139,t:0,i:77}, D{l:6,t:10,i:25}, D{l:7,t:10,i:855}, D{l:7,t:10,i:1258}, D{l:144,t:10,i:32}, D{l:6,t:0,i:1880}, D{l:6,t:0,i:1887}, D{l:6,t:0,i:1918}, D{l:6,t:0,i:1924}, D{l:9,t:0,i:967}, D{l:9,t:0,i:995}, D{l:9,t:0,i:1015}, D{l:12,t:0,i:826}, D{l:12,t:0,i:849}, D{l:12,t:0,i:857}, D{l:12,t:0,i:860}, D{l:12,t:0,i:886}, D{l:12,t:0,i:932}, D{l:18,t:0,i:228}, D{l:18,t:0,i:231}, D{l:146,t:0,i:240}, D{l:134,t:0,i:633}, D{l:134,t:0,i:1308}, D{l:4,t:11,i:37}, D{l:5,t:11,i:334}, D{l:135,t:11,i:1253}, D{l:10,t:0,i:86}, D{l:4,t:10,i:4}, D{l:7,t:10,i:1118}, D{l:7,t:10,i:1320}, D{l:7,t:10,i:1706}, D{l:8,t:10,i:277}, D{l:9,t:10,i:622}, D{l:11,t:10,i:724}, D{l:12,t:10,i:350}, D{l:12,t:10,i:397}, D{l:13,t:10,i:28}, D{l:13,t:10,i:159}, D{l:15,t:10,i:89}, D{l:18,t:10,i:5}, D{l:19,t:10,i:9}, D{l:20,t:10,i:34}, D{l:150,t:10,i:47}, D{l:132,t:11,i:508}, D{l:137,t:11,i:448}, D{l:12,t:11,i:107}, D{l:146,t:11,i:31}, D{l:132,t:0,i:817}, D{l:134,t:0,i:663}, D{l:133,t:0,i:882}, D{l:134,t:0,i:914}, D{l:132,t:11,i:540}, D{l:132,t:11,i:533}, D{l:136,t:11,i:608}, D{l:8,t:0,i:885}, D{l:138,t:0,i:865}, D{l:132,t:0,i:426}, D{l:6,t:0,i:58}, D{l:7,t:0,i:745}, D{l:7,t:0,i:1969}, D{l:8,t:0,i:399}, D{l:8,t:0,i:675}, D{l:9,t:0,i:479}, D{l:9,t:0,i:731}, D{l:10,t:0,i:330}, D{l:10,t:0,i:593}, D{l:10,t:0,i:817}, D{l:11,t:0,i:32}, D{l:11,t:0,i:133}, D{l:11,t:0,i:221}, D{l:145,t:0,i:68}, D{l:134,t:10,i:255}, D{l:7,t:0,i:102}, D{l:137,t:0,i:538}, D{l:137,t:10,i:216}, D{l:7,t:11,i:253}, D{l:136,t:11,i:549}, D{l:135,t:11,i:912}, D{l:9,t:10,i:183}, D{l:139,t:10,i:286}, D{l:11,t:10,i:956}, D{l:151,t:10,i:3}, D{l:8,t:11,i:527}, D{l:18,t:11,i:60}, D{l:147,t:11,i:24}, D{l:4,t:10,i:536}, D{l:7,t:10,i:1141}, D{l:10,t:10,i:723}, D{l:139,t:10,i:371}, D{l:133,t:11,i:920}, D{l:7,t:0,i:876}, D{l:135,t:10,i:285}, D{l:135,t:10,i:560}, D{l:132,t:10,i:690}, D{l:142,t:11,i:126}, D{l:11,t:10,i:33}, D{l:12,t:10,i:571}, D{l:149,t:10,i:1}, D{l:133,t:0,i:566}, D{l:9,t:0,i:139}, D{l:10,t:0,i:399}, D{l:11,t:0,i:469}, D{l:12,t:0,i:634}, D{l:13,t:0,i:223}, D{l:132,t:11,i:483}, D{l:6,t:0,i:48}, D{l:135,t:0,i:63}, D{l:18,t:0,i:12}, D{l:7,t:10,i:1862}, D{l:12,t:10,i:491}, D{l:12,t:10,i:520}, D{l:13,t:10,i:383}, D{l:142,t:10,i:244}, D{l:135,t:11,i:1665}, D{l:132,t:11,i:448}, D{l:9,t:11,i:495}, D{l:146,t:11,i:104}, D{l:6,t:0,i:114}, D{l:7,t:0,i:1224}, D{l:7,t:0,i:1556}, D{l:136,t:0,i:3}, D{l:4,t:10,i:190}, D{l:133,t:10,i:554}, D{l:8,t:0,i:576}, D{l:9,t:0,i:267}, D{l:133,t:10,i:1001}, D{l:133,t:10,i:446}, D{l:133,t:0,i:933}, D{l:139,t:11,i:1009}, D{l:8,t:11,i:653}, D{l:13,t:11,i:93}, D{l:147,t:11,i:14}, D{l:6,t:0,i:692}, D{l:6,t:0,i:821}, D{l:134,t:0,i:1077}, D{l:5,t:11,i:172}, D{l:135,t:11,i:801}, D{l:138,t:0,i:752}, D{l:4,t:0,i:375}, D{l:134,t:0,i:638}, D{l:134,t:0,i:1011}, D{l:140,t:11,i:540}, D{l:9,t:0,i:96}, D{l:133,t:11,i:260}, D{l:139,t:11,i:587}, D{l:135,t:10,i:1231}, D{l:12,t:0,i:30}, D{l:13,t:0,i:148}, D{l:14,t:0,i:87}, D{l:14,t:0,i:182}, D{l:16,t:0,i:42}, D{l:20,t:0,i:70}, D{l:132,t:10,i:304}, D{l:6,t:0,i:1398}, D{l:7,t:0,i:56}, D{l:7,t:0,i:1989}, D{l:8,t:0,i:337}, D{l:8,t:0,i:738}, D{l:9,t:0,i:600}, D{l:12,t:0,i:37}, D{l:13,t:0,i:447}, D{l:142,t:0,i:92}, D{l:138,t:0,i:666}, D{l:5,t:0,i:394}, D{l:7,t:0,i:487}, D{l:136,t:0,i:246}, D{l:9,t:0,i:437}, D{l:6,t:10,i:53}, D{l:6,t:10,i:199}, D{l:7,t:10,i:1408}, D{l:8,t:10,i:32}, D{l:8,t:10,i:93}, D{l:10,t:10,i:397}, D{l:10,t:10,i:629}, D{l:11,t:10,i:593}, D{l:11,t:10,i:763}, D{l:13,t:10,i:326}, D{l:145,t:10,i:35}, D{l:134,t:10,i:105}, D{l:9,t:0,i:320}, D{l:10,t:0,i:506}, D{l:138,t:10,i:794}, D{l:7,t:11,i:57}, D{l:8,t:11,i:167}, D{l:8,t:11,i:375}, D{l:9,t:11,i:82}, D{l:9,t:11,i:561}, D{l:10,t:11,i:620}, D{l:10,t:11,i:770}, D{l:11,t:10,i:704}, D{l:141,t:10,i:396}, D{l:6,t:0,i:1003}, D{l:5,t:10,i:114}, D{l:5,t:10,i:255}, D{l:141,t:10,i:285}, D{l:7,t:0,i:866}, D{l:135,t:0,i:1163}, D{l:133,t:11,i:531}, D{l:132,t:0,i:328}, D{l:7,t:10,i:2035}, D{l:8,t:10,i:19}, D{l:9,t:10,i:89}, D{l:138,t:10,i:831}, D{l:8,t:11,i:194}, D{l:136,t:11,i:756}, D{l:136,t:0,i:1000}, D{l:5,t:11,i:453}, D{l:134,t:11,i:441}, D{l:4,t:0,i:101}, D{l:5,t:0,i:833}, D{l:7,t:0,i:1171}, D{l:136,t:0,i:744}, D{l:133,t:0,i:726}, D{l:136,t:10,i:746}, D{l:138,t:0,i:176}, D{l:6,t:0,i:9}, D{l:6,t:0,i:397}, D{l:7,t:0,i:53}, D{l:7,t:0,i:1742}, D{l:10,t:0,i:632}, D{l:11,t:0,i:828}, D{l:140,t:0,i:146}, D{l:135,t:11,i:22}, D{l:145,t:11,i:64}, D{l:132,t:0,i:839}, D{l:11,t:0,i:417}, D{l:12,t:0,i:223}, D{l:140,t:0,i:265}, D{l:4,t:11,i:102}, D{l:7,t:11,i:815}, D{l:7,t:11,i:1699}, D{l:139,t:11,i:964}, D{l:5,t:10,i:955}, D{l:136,t:10,i:814}, D{l:6,t:0,i:1931}, D{l:6,t:0,i:2007}, D{l:18,t:0,i:246}, D{l:146,t:0,i:247}, D{l:8,t:0,i:198}, D{l:11,t:0,i:29}, D{l:140,t:0,i:534}, D{l:135,t:0,i:1771}, D{l:6,t:0,i:846}, D{l:7,t:11,i:1010}, D{l:11,t:11,i:733}, D{l:11,t:11,i:759}, D{l:12,t:11,i:563}, D{l:13,t:11,i:34}, D{l:14,t:11,i:101}, D{l:18,t:11,i:45}, D{l:146,t:11,i:129}, D{l:4,t:0,i:186}, D{l:5,t:0,i:157}, D{l:8,t:0,i:168}, D{l:138,t:0,i:6}, D{l:132,t:11,i:899}, D{l:133,t:10,i:56}, D{l:148,t:10,i:100}, D{l:133,t:0,i:875}, D{l:5,t:0,i:773}, D{l:5,t:0,i:991}, D{l:6,t:0,i:1635}, D{l:134,t:0,i:1788}, D{l:6,t:0,i:1274}, D{l:9,t:0,i:477}, D{l:141,t:0,i:78}, D{l:4,t:0,i:639}, D{l:7,t:0,i:111}, D{l:8,t:0,i:581}, D{l:12,t:0,i:177}, D{l:6,t:11,i:52}, D{l:9,t:11,i:104}, D{l:9,t:11,i:559}, D{l:10,t:10,i:4}, D{l:10,t:10,i:13}, D{l:11,t:10,i:638}, D{l:12,t:11,i:308}, D{l:19,t:11,i:87}, D{l:148,t:10,i:57}, D{l:132,t:11,i:604}, D{l:4,t:11,i:301}, D{l:133,t:10,i:738}, D{l:133,t:10,i:758}, D{l:134,t:0,i:1747}, D{l:7,t:11,i:1440}, D{l:11,t:11,i:854}, D{l:11,t:11,i:872}, D{l:11,t:11,i:921}, D{l:12,t:11,i:551}, D{l:13,t:11,i:472}, D{l:142,t:11,i:367}, D{l:7,t:0,i:1364}, D{l:7,t:0,i:1907}, D{l:141,t:0,i:158}, D{l:134,t:0,i:873}, D{l:4,t:0,i:404}, D{l:4,t:0,i:659}, D{l:7,t:0,i:552}, D{l:135,t:0,i:675}, D{l:135,t:10,i:1112}, D{l:139,t:10,i:328}, D{l:7,t:11,i:508}, D{l:137,t:10,i:133}, D{l:133,t:0,i:391}, D{l:5,t:10,i:110}, D{l:6,t:10,i:169}, D{l:6,t:10,i:1702}, D{l:7,t:10,i:400}, D{l:8,t:10,i:538}, D{l:9,t:10,i:184}, D{l:9,t:10,i:524}, D{l:140,t:10,i:218}, D{l:6,t:11,i:310}, D{l:7,t:11,i:1849}, D{l:8,t:11,i:72}, D{l:8,t:11,i:272}, D{l:8,t:11,i:431}, D{l:9,t:11,i:12}, D{l:9,t:11,i:351}, D{l:10,t:11,i:563}, D{l:10,t:11,i:630}, D{l:10,t:11,i:810}, D{l:11,t:11,i:367}, D{l:11,t:11,i:599}, D{l:11,t:11,i:686}, D{l:140,t:11,i:672}, D{l:5,t:0,i:540}, D{l:6,t:0,i:1697}, D{l:136,t:0,i:668}, D{l:132,t:0,i:883}, D{l:134,t:0,i:78}, D{l:12,t:0,i:628}, D{l:18,t:0,i:79}, D{l:6,t:10,i:133}, D{l:9,t:10,i:353}, D{l:139,t:10,i:993}, D{l:6,t:11,i:181}, D{l:7,t:11,i:537}, D{l:8,t:11,i:64}, D{l:9,t:11,i:127}, D{l:10,t:11,i:496}, D{l:12,t:11,i:510}, D{l:141,t:11,i:384}, D{l:6,t:10,i:93}, D{l:7,t:10,i:1422}, D{l:7,t:10,i:1851}, D{l:8,t:10,i:673}, D{l:9,t:10,i:529}, D{l:140,t:10,i:43}, D{l:137,t:10,i:371}, D{l:134,t:0,i:1460}, D{l:134,t:0,i:962}, D{l:4,t:11,i:244}, D{l:135,t:11,i:233}, D{l:9,t:10,i:25}, D{l:10,t:10,i:467}, D{l:138,t:10,i:559}, D{l:4,t:10,i:335}, D{l:135,t:10,i:942}, D{l:133,t:0,i:460}, D{l:135,t:11,i:334}, D{l:134,t:11,i:1650}, D{l:4,t:0,i:199}, D{l:139,t:0,i:34}, D{l:5,t:10,i:601}, D{l:8,t:10,i:39}, D{l:10,t:10,i:773}, D{l:11,t:10,i:84}, D{l:12,t:10,i:205}, D{l:142,t:10,i:1}, D{l:133,t:10,i:870}, D{l:134,t:0,i:388}, D{l:14,t:0,i:474}, D{l:148,t:0,i:120}, D{l:133,t:11,i:369}, D{l:139,t:0,i:271}, D{l:4,t:0,i:511}, D{l:9,t:0,i:333}, D{l:9,t:0,i:379}, D{l:10,t:0,i:602}, D{l:11,t:0,i:441}, D{l:11,t:0,i:723}, D{l:11,t:0,i:976}, D{l:12,t:0,i:357}, D{l:132,t:10,i:181}, D{l:134,t:0,i:608}, D{l:134,t:10,i:1652}, D{l:22,t:0,i:49}, D{l:137,t:11,i:338}, D{l:140,t:0,i:988}, D{l:134,t:0,i:617}, D{l:5,t:0,i:938}, D{l:136,t:0,i:707}, D{l:132,t:10,i:97}, D{l:5,t:10,i:147}, D{l:6,t:10,i:286}, D{l:7,t:10,i:1362}, D{l:141,t:10,i:176}, D{l:6,t:0,i:756}, D{l:134,t:0,i:1149}, D{l:133,t:11,i:896}, D{l:6,t:10,i:375}, D{l:7,t:10,i:169}, D{l:7,t:10,i:254}, D{l:136,t:10,i:780}, D{l:134,t:0,i:1583}, D{l:135,t:10,i:1447}, D{l:139,t:0,i:285}, D{l:7,t:11,i:1117}, D{l:8,t:11,i:393}, D{l:136,t:11,i:539}, D{l:135,t:0,i:344}, D{l:6,t:0,i:469}, D{l:7,t:0,i:1709}, D{l:138,t:0,i:515}, D{l:5,t:10,i:629}, D{l:135,t:10,i:1549}, D{l:5,t:11,i:4}, D{l:5,t:11,i:810}, D{l:6,t:11,i:13}, D{l:6,t:11,i:538}, D{l:6,t:11,i:1690}, D{l:6,t:11,i:1726}, D{l:7,t:11,i:499}, D{l:7,t:11,i:1819}, D{l:8,t:11,i:148}, D{l:8,t:11,i:696}, D{l:8,t:11,i:791}, D{l:12,t:11,i:125}, D{l:13,t:11,i:54}, D{l:143,t:11,i:9}, D{l:135,t:11,i:1268}, D{l:137,t:0,i:404}, D{l:132,t:0,i:500}, D{l:5,t:0,i:68}, D{l:134,t:0,i:383}, D{l:11,t:0,i:216}, D{l:139,t:0,i:340}, D{l:4,t:11,i:925}, D{l:5,t:11,i:803}, D{l:8,t:11,i:698}, D{l:138,t:11,i:828}, D{l:4,t:0,i:337}, D{l:6,t:0,i:353}, D{l:7,t:0,i:1934}, D{l:8,t:0,i:488}, D{l:137,t:0,i:429}, D{l:7,t:0,i:236}, D{l:7,t:0,i:1795}, D{l:8,t:0,i:259}, D{l:9,t:0,i:135}, D{l:9,t:0,i:177}, D{l:9,t:0,i:860}, D{l:10,t:0,i:825}, D{l:11,t:0,i:115}, D{l:11,t:0,i:370}, D{l:11,t:0,i:405}, D{l:11,t:0,i:604}, D{l:12,t:0,i:10}, D{l:12,t:0,i:667}, D{l:12,t:0,i:669}, D{l:13,t:0,i:76}, D{l:14,t:0,i:310}, D{l:15,t:0,i:76}, D{l:15,t:0,i:147}, D{l:148,t:0,i:23}, D{l:4,t:0,i:15}, D{l:4,t:0,i:490}, D{l:5,t:0,i:22}, D{l:6,t:0,i:244}, D{l:7,t:0,i:40}, D{l:7,t:0,i:200}, D{l:7,t:0,i:906}, D{l:7,t:0,i:1199}, D{l:9,t:0,i:616}, D{l:10,t:0,i:716}, D{l:11,t:0,i:635}, D{l:11,t:0,i:801}, D{l:140,t:0,i:458}, D{l:12,t:0,i:756}, D{l:132,t:10,i:420}, D{l:134,t:0,i:1504}, D{l:6,t:0,i:757}, D{l:133,t:11,i:383}, D{l:6,t:0,i:1266}, D{l:135,t:0,i:1735}, D{l:5,t:0,i:598}, D{l:7,t:0,i:791}, D{l:8,t:0,i:108}, D{l:9,t:0,i:123}, D{l:7,t:10,i:1570}, D{l:140,t:10,i:542}, D{l:142,t:11,i:410}, D{l:9,t:11,i:660}, D{l:138,t:11,i:347}]; brotli-3.4.0/src/enc/stride_eval.rs000064400000000000000000000257261046102023000153420ustar 00000000000000use core; use super::super::alloc; use super::super::alloc::{SliceWrapper, SliceWrapperMut, Allocator}; use super::interface; use super::backward_references::BrotliEncoderParams; use super::input_pair::{InputPair, InputReference, InputReferenceMut}; use super::ir_interpret::{IRInterpreter, push_base}; use super::util::{floatX, FastLog2u16}; use super::prior_eval::{DEFAULT_SPEED}; const NIBBLE_PRIOR_SIZE: usize = 16; pub const STRIDE_PRIOR_SIZE: usize = 256 * 256 * NIBBLE_PRIOR_SIZE * 2; pub fn local_init_cdfs(cdfs: &mut [u16]) { for (index, item) in cdfs.iter_mut().enumerate() { *item = 4 + 4 * (index as u16 & 0xf); } } #[allow(unused_variables)] fn stride_lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { if let Some(nibble) = high_nibble { 1 + 2 * (actual_context as usize | ((stride_byte as usize & 0xf) << 8) | ((nibble as usize) << 12)) } else { 2 * (actual_context as usize | ((stride_byte as usize) << 8)) } } struct CDF<'a> { cdf:&'a mut [u16], } struct Stride1Prior{ } impl Stride1Prior { fn lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> usize { stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble) } fn lookup_mut(data:&mut [u16], stride_byte: u8, selected_context:u8, actual_context:usize, high_nibble: Option) -> CDF { let index = Self::lookup_lin(stride_byte, selected_context, actual_context, high_nibble) * NIBBLE_PRIOR_SIZE; CDF::from(data.split_at_mut(index).1.split_at_mut(16).0) } } impl<'a> CDF<'a> { pub fn cost(&self, nibble_u8:u8) -> floatX { assert_eq!(self.cdf.len(), 16); let nibble = nibble_u8 as usize & 0xf; let mut pdf = self.cdf[nibble]; if nibble_u8 != 0 { pdf -= self.cdf[nibble - 1]; } FastLog2u16(self.cdf[15]) - FastLog2u16(pdf) } pub fn update(&mut self, nibble_u8:u8, speed: (u16, u16)) { assert_eq!(self.cdf.len(), 16); for nib_range in (nibble_u8 as usize & 0xf) .. 16 { self.cdf[nib_range] += speed.0; } if self.cdf[15] >= speed.1 { const CDF_BIAS:[u16;16] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]; for nibble_index in 0..16 { let tmp = &mut self.cdf[nibble_index]; *tmp = (tmp.wrapping_add(CDF_BIAS[nibble_index])).wrapping_sub( tmp.wrapping_add(CDF_BIAS[nibble_index]) >> 2); } } } } impl<'a> From<&'a mut[u16]> for CDF<'a> { fn from(cdf: &'a mut[u16]) -> CDF<'a> { assert_eq!(cdf.len(), 16); CDF { cdf:cdf, } } } pub struct StrideEval<'a, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator +'a, > { input: InputPair<'a>, alloc: &'a mut Alloc, context_map: &'a interface::PredictionModeContextMap>, block_type: u8, local_byte_offset: usize, stride_priors: [>::AllocatedMemory;8], score: >::AllocatedMemory, cur_score_epoch: usize, stride_speed: [(u16, u16);2], cur_stride: u8, } impl<'a, Alloc:alloc::Allocator + alloc::Allocator + alloc::Allocator+'a, > StrideEval<'a, Alloc> { pub fn new(alloc: &'a mut Alloc, input: InputPair<'a>, prediction_mode: &'a interface::PredictionModeContextMap>, params: &BrotliEncoderParams, ) -> Self { let do_alloc = true; let mut stride_speed = prediction_mode.stride_context_speed(); if stride_speed[0] == (0, 0) { stride_speed[0] = params.literal_adaptation[0] } if stride_speed[0] == (0, 0) { stride_speed[0] = DEFAULT_SPEED; } if stride_speed[1] == (0, 0) { stride_speed[1] = params.literal_adaptation[1] } if stride_speed[1] == (0, 0) { stride_speed[1] = stride_speed[0]; } let score = if do_alloc { >::alloc_cell(alloc, 8 * 4) // FIXME make this bigger than just 4 } else { >::AllocatedMemory::default() }; let stride_priors = if do_alloc { [>::alloc_cell(alloc, STRIDE_PRIOR_SIZE), >::alloc_cell(alloc, STRIDE_PRIOR_SIZE), >::alloc_cell(alloc, STRIDE_PRIOR_SIZE), >::alloc_cell(alloc, STRIDE_PRIOR_SIZE), >::alloc_cell(alloc, STRIDE_PRIOR_SIZE), >::alloc_cell(alloc, STRIDE_PRIOR_SIZE), >::alloc_cell(alloc, STRIDE_PRIOR_SIZE), >::alloc_cell(alloc, STRIDE_PRIOR_SIZE), ] } else { [>::AllocatedMemory::default(), >::AllocatedMemory::default(), >::AllocatedMemory::default(), >::AllocatedMemory::default(), >::AllocatedMemory::default(), >::AllocatedMemory::default(), >::AllocatedMemory::default(), >::AllocatedMemory::default(), ] }; let mut ret = StrideEval::{ input: input, context_map: prediction_mode, block_type: 0, alloc: alloc, cur_stride: 1, cur_score_epoch: 0, local_byte_offset: 0, stride_priors: stride_priors, score: score, stride_speed: stride_speed, }; for stride_prior in ret.stride_priors.iter_mut() { local_init_cdfs(stride_prior.slice_mut()); } ret } pub fn alloc(&mut self) -> &mut Alloc { self.alloc } pub fn choose_stride(&self, stride_data: &mut[u8]) { assert_eq!(stride_data.len(), self.cur_score_epoch); assert!(self.score.slice().len() > stride_data.len()); assert!(self.score.slice().len() > (stride_data.len() << 3) + 7 + 8); for (index, choice) in stride_data.iter_mut().enumerate() { let choices = self.score.slice().split_at((1 + index) << 3).1.split_at(8).0; let mut best_choice: u8 = 0; let mut best_score = choices[0]; for (cur_index, cur_score) in choices.iter().enumerate() { if *cur_score + 2.0 < best_score { // needs to be 2 bits better to be worth the type switch best_score = *cur_score; best_choice = cur_index as u8; } } *choice = best_choice; } } pub fn num_types(&self) -> usize { self.cur_score_epoch } fn update_cost_base(&mut self, stride_prior: [u8;8], selected_bits: u8, cm_prior: usize, literal: u8) { type CurPrior = Stride1Prior; { for i in 0..8 { let mut cdf = CurPrior::lookup_mut(self.stride_priors[i].slice_mut(), stride_prior[i], selected_bits, cm_prior, None); self.score.slice_mut()[self.cur_score_epoch * 8 + i] += cdf.cost(literal>>4); cdf.update(literal >> 4, self.stride_speed[1]); } } { for i in 0..8 { let mut cdf = CurPrior::lookup_mut(self.stride_priors[i].slice_mut(), stride_prior[i], selected_bits, cm_prior, Some(literal >> 4)); self.score.slice_mut()[self.cur_score_epoch * 8 + i] += cdf.cost(literal&0xf); cdf.update(literal&0xf, self.stride_speed[0]); } } } } impl<'a, Alloc: alloc::Allocator + alloc::Allocator + alloc::Allocator> Drop for StrideEval<'a, Alloc> { fn drop(&mut self) { >::free_cell(&mut self.alloc, core::mem::replace(&mut self.score, >::AllocatedMemory::default())); for i in 0..8 { >::free_cell(&mut self.alloc, core::mem::replace(&mut self.stride_priors[i], >::AllocatedMemory::default())); } } } impl<'a, Alloc: alloc::Allocator + alloc::Allocator + alloc::Allocator> IRInterpreter for StrideEval<'a, Alloc> { fn inc_local_byte_offset(&mut self, inc: usize) { self.local_byte_offset += inc; } fn local_byte_offset(&self) -> usize { self.local_byte_offset } fn update_block_type(&mut self, new_type: u8, stride: u8) { self.block_type = new_type; self.cur_stride = stride; self.cur_score_epoch += 1; if self.cur_score_epoch * 8 + 7 >= self.score.slice().len() { let new_len = self.score.slice().len() * 2; let mut new_score = >::alloc_cell(self.alloc, new_len); for (src, dst) in self.score.slice().iter().zip(new_score.slice_mut().split_at_mut(self.score.slice().len()).0.iter_mut()) { *dst = *src; } >::free_cell(self.alloc, core::mem::replace(&mut self.score, new_score)); } } fn block_type(&self) -> u8 { self.block_type } fn literal_data_at_offset(&self, index:usize) -> u8 { self.input[index] } fn literal_context_map(&self) -> &[u8] { self.context_map.literal_context_map.slice() } fn prediction_mode(&self) -> ::interface::LiteralPredictionModeNibble { self.context_map.literal_prediction_mode() } fn update_cost(&mut self, stride_prior: [u8;8], stride_prior_offset: usize , selected_bits: u8, cm_prior: usize, literal: u8) { let reversed_stride_priors = [stride_prior[stride_prior_offset&7], stride_prior[stride_prior_offset.wrapping_sub(1)&7], stride_prior[stride_prior_offset.wrapping_sub(2)&7], stride_prior[stride_prior_offset.wrapping_sub(3)&7], stride_prior[stride_prior_offset.wrapping_sub(4)&7], stride_prior[stride_prior_offset.wrapping_sub(5)&7], stride_prior[stride_prior_offset.wrapping_sub(6)&7], stride_prior[stride_prior_offset.wrapping_sub(7)&7]]; self.update_cost_base(reversed_stride_priors, selected_bits, cm_prior, literal) } } impl<'a, 'b, Alloc: alloc::Allocator + alloc::Allocator + alloc::Allocator> interface::CommandProcessor<'b> for StrideEval<'a, Alloc> { fn push(&mut self, val: interface::Command>) { push_base(self, val) } } brotli-3.4.0/src/enc/test.rs000075500000000000000000000445131046102023000140160ustar 00000000000000#![cfg(test)] use core; use super::{s16, v8}; extern crate alloc_no_stdlib; extern crate brotli_decompressor; use super::cluster::HistogramPair; use super::ZopfliNode; use super::encode::{BrotliEncoderCreateInstance, BrotliEncoderSetParameter, BrotliEncoderDestroyInstance, BrotliEncoderIsFinished, BrotliEncoderCompressStream, BrotliEncoderParameter, BrotliEncoderOperation}; use super::histogram::{ContextType, HistogramLiteral, HistogramCommand, HistogramDistance}; use super::super::alloc::{AllocatedStackMemory, Allocator, SliceWrapper, SliceWrapperMut, StackAllocator, bzero}; use enc::util::brotli_min_size_t; use super::StaticCommand; extern "C" { fn calloc(n_elem: usize, el_size: usize) -> *mut u8; } extern "C" { fn free(ptr: *mut u8); } use super::pdf::PDF; use super::command::Command; use super::entropy_encode::HuffmanTree; use super::combined_alloc::CombiningAllocator; pub use super::super::{BrotliDecompressStream, BrotliResult, BrotliState}; use brotli_decompressor::HuffmanCode; use core::ops; use super::interface; declare_stack_allocator_struct!(MemPool, 128, stack); declare_stack_allocator_struct!(CallocatedFreelist4096, 128, calloc); declare_stack_allocator_struct!(CallocatedFreelist2048, 64, calloc); declare_stack_allocator_struct!(CallocatedFreelist1024, 32, calloc); fn oneshot_compress(input: &[u8], output: &mut [u8], quality: u32, lgwin: u32, magic: bool, in_batch_size: usize, out_batch_size: usize) -> (i32, usize) { let stack_u8_buffer = unsafe { define_allocator_memory_pool!(96, u8, [0; 24 * 1024 * 1024], calloc) }; let stack_u16_buffer = unsafe { define_allocator_memory_pool!(96, u16, [0; 128 * 1024], calloc) }; let stack_i32_buffer = unsafe { define_allocator_memory_pool!(96, i32, [0; 128 * 1024], calloc) }; let stack_u32_buffer = unsafe { define_allocator_memory_pool!(96, u32, [0; 32 * 1024 * 1024], calloc) }; let stack_u64_buffer = unsafe { define_allocator_memory_pool!(96, u64, [0; 32 * 1024], calloc) }; let stack_f64_buffer = unsafe { define_allocator_memory_pool!(48, super::util::floatX, [0; 128 * 1024], calloc) }; let stack_f8_buffer = unsafe { define_allocator_memory_pool!(48, v8, [0; 128 * 1024], calloc) }; let stack_16x16_buffer = unsafe { define_allocator_memory_pool!(48, s16, [0; 128 * 1024], calloc) }; let stack_hl_buffer = unsafe { define_allocator_memory_pool!(48, HistogramLiteral, [0; 128 * 1024], calloc) }; let stack_hc_buffer = unsafe { define_allocator_memory_pool!(48, HistogramCommand, [0; 128 * 1024], calloc) }; let stack_hd_buffer = unsafe { define_allocator_memory_pool!(48, HistogramDistance, [0; 128 * 1024], calloc) }; let stack_hp_buffer = unsafe { define_allocator_memory_pool!(48, HistogramPair, [0; 128 * 1024], calloc) }; let stack_ct_buffer = unsafe { define_allocator_memory_pool!(48, ContextType, [0; 128 * 1024], calloc) }; let stack_ht_buffer = unsafe { define_allocator_memory_pool!(48, HuffmanTree, [0; 128 * 1024], calloc) }; let stack_zn_buffer = unsafe { define_allocator_memory_pool!(48, ZopfliNode, [0; 1024], calloc) }; let stack_mc_buffer = unsafe { define_allocator_memory_pool!(48, Command, [0; 128 * 1024], calloc) }; let stack_pdf_buffer = unsafe { define_allocator_memory_pool!(48, PDF, [0; 1], calloc) }; let stack_sc_buffer = unsafe { define_allocator_memory_pool!(48, StaticCommand, [0; 100], calloc) }; let stack_u8_allocator = CallocatedFreelist4096::::new_allocator(stack_u8_buffer.data, bzero); let stack_u16_allocator = CallocatedFreelist4096::::new_allocator(stack_u16_buffer.data, bzero); let stack_i32_allocator = CallocatedFreelist1024::::new_allocator(stack_i32_buffer.data, bzero); let stack_u32_allocator = CallocatedFreelist4096::::new_allocator(stack_u32_buffer.data, bzero); let stack_u64_allocator = CallocatedFreelist1024::::new_allocator(stack_u64_buffer.data, bzero); let stack_zn_allocator = CallocatedFreelist1024::::new_allocator(stack_zn_buffer.data, bzero); let mf64 = CallocatedFreelist2048::::new_allocator(stack_f64_buffer.data, bzero); let mf8 = CallocatedFreelist2048::::new_allocator(stack_f8_buffer.data, bzero); let m16x16 = CallocatedFreelist2048::::new_allocator(stack_16x16_buffer.data, bzero); let mpdf = CallocatedFreelist2048::::new_allocator(stack_pdf_buffer.data, bzero); let msc = CallocatedFreelist2048::::new_allocator(stack_sc_buffer.data, bzero); let stack_mc_allocator = CallocatedFreelist2048::::new_allocator(stack_mc_buffer.data, bzero); let mhl = CallocatedFreelist2048::::new_allocator(stack_hl_buffer.data, bzero); let mhc = CallocatedFreelist2048::::new_allocator(stack_hc_buffer.data, bzero); let mhd = CallocatedFreelist2048::::new_allocator(stack_hd_buffer.data, bzero); let mhp = CallocatedFreelist2048::::new_allocator(stack_hp_buffer.data, bzero); let mct = CallocatedFreelist2048::::new_allocator(stack_ct_buffer.data, bzero); let mht = CallocatedFreelist2048::::new_allocator(stack_ht_buffer.data, bzero); let mut s_orig = BrotliEncoderCreateInstance(CombiningAllocator::new( stack_u8_allocator, stack_u16_allocator, stack_i32_allocator, stack_u32_allocator, stack_u64_allocator, stack_mc_allocator, mf64, mf8, m16x16, mpdf, msc, mhl, mhc, mhd, mhp, mct, mht, stack_zn_allocator, )); let mut next_in_offset: usize = 0; let mut next_out_offset: usize = 0; { let s = &mut s_orig; BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_QUALITY, quality as (u32)); if magic { BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_MAGIC_NUMBER, magic as (u32)); } if quality >= 10 { BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_Q9_5, 1); } BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, lgwin as (u32)); BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_MODE, 0 as (u32)); // gen, text, font BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT, input.len() as (u32)); loop { let mut available_in: usize = brotli_min_size_t(input.len() - next_in_offset, in_batch_size); let mut available_out: usize = brotli_min_size_t(output.len() - next_out_offset, out_batch_size); if available_out == 0 { panic!("No output buffer space"); } let mut total_out = Some(0usize); let op: BrotliEncoderOperation; if available_in == input.len() - next_in_offset { op = BrotliEncoderOperation::BROTLI_OPERATION_FINISH; } else { op = BrotliEncoderOperation::BROTLI_OPERATION_PROCESS; } let mut nop_callback = |_data:&mut interface::PredictionModeContextMap, _cmds: &mut [interface::StaticCommand], _mb: interface::InputPair, _mfv:&mut CombiningAllocator<_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_>|(); let result = BrotliEncoderCompressStream(s, op, &mut available_in, input, &mut next_in_offset, &mut available_out, output, &mut next_out_offset, &mut total_out, &mut nop_callback); if result <= 0 { return (result, next_out_offset); } if BrotliEncoderIsFinished(s) != 0 { break; } } BrotliEncoderDestroyInstance(s); } return (1, next_out_offset); } fn oneshot_decompress(compressed: &[u8], mut output: &mut [u8]) -> (BrotliResult, usize, usize) { let mut available_in: usize = compressed.len(); let mut available_out: usize = output.len(); let mut stack_u8_buffer = define_allocator_memory_pool!(128, u8, [0; 100 * 1024], stack); let mut stack_u32_buffer = define_allocator_memory_pool!(128, u32, [0; 36 * 1024], stack); let mut stack_hc_buffer = define_allocator_memory_pool!(128, HuffmanCode, [HuffmanCode::default(); 116 * 1024], stack); let stack_u8_allocator = MemPool::::new_allocator(&mut stack_u8_buffer, bzero); let stack_u32_allocator = MemPool::::new_allocator(&mut stack_u32_buffer, bzero); let stack_hc_allocator = MemPool::::new_allocator(&mut stack_hc_buffer, bzero); let mut input_offset: usize = 0; let mut output_offset: usize = 0; let mut written: usize = 0; let mut brotli_state = BrotliState::new(stack_u8_allocator, stack_u32_allocator, stack_hc_allocator); let result = BrotliDecompressStream(&mut available_in, &mut input_offset, &compressed[..], &mut available_out, &mut output_offset, &mut output, &mut written, &mut brotli_state); return (result, input_offset, output_offset); } fn oneshot(input: &[u8], compressed: &mut [u8], output: &mut [u8], q: u32, lg: u32, magic: bool, in_buffer_size: usize, out_buffer_size: usize) -> (BrotliResult, usize, usize) { let (success, mut available_in) = oneshot_compress(input, compressed, q, lg, magic, in_buffer_size, out_buffer_size); if success == 0 { //return (BrotliResult::ResultFailure, 0, 0); available_in = compressed.len(); } return oneshot_decompress(&mut compressed[..available_in], output); } #[test] fn test_roundtrip_10x10y() { const BUFFER_SIZE: usize = 128; let mut compressed: [u8; 13] = [0; 13]; let mut output = [0u8; BUFFER_SIZE]; let mut input = ['x' as u8, 'x' as u8, 'x' as u8, 'x' as u8, 'x' as u8, 'x' as u8, 'x' as u8, 'x' as u8, 'x' as u8, 'x' as u8, 'y' as u8, 'y' as u8, 'y' as u8, 'y' as u8, 'y' as u8, 'y' as u8, 'y' as u8, 'y' as u8, 'y' as u8, 'y' as u8]; let (result, compressed_offset, output_offset) = oneshot(&mut input[..], &mut compressed, &mut output[..], 9, 10, false, 1, 1); match result { BrotliResult::ResultSuccess => {} _ => assert!(false), } let mut i: usize = 0; while i < 10 { assert_eq!(output[i], 'x' as u8); assert_eq!(output[i + 10], 'y' as u8); i += 1; } assert_eq!(output_offset, 20); assert_eq!(compressed_offset, compressed.len()); } macro_rules! test_roundtrip_file { ($filedata : expr, $bufsize: expr, $quality: expr, $lgwin: expr, $magic: expr, $in_buf:expr, $out_buf:expr) => {{ let stack_u8_buffer = unsafe{define_allocator_memory_pool!(4096, u8, [0; 18 * 1024 * 1024], calloc)}; let mut stack_u8_allocator = CallocatedFreelist4096::::new_allocator(stack_u8_buffer.data, bzero); let mut compressed = stack_u8_allocator.alloc_cell($bufsize); let inp = $filedata; let mut output = stack_u8_allocator.alloc_cell(inp.len() + 16); let (result, compressed_offset, output_offset) = oneshot(&inp[..], compressed.slice_mut(), output.slice_mut(), $quality, $lgwin, $magic, $in_buf, $out_buf); match result { BrotliResult::ResultSuccess => {} _ => assert!(false), } for i in 0..inp.len() { if inp[i] != output[i] { assert_eq!((i,inp[i]), (i,output[i])); } assert_eq!(inp[i], output[i]); } assert!(compressed_offset <= compressed.slice().len()); assert_eq!(output_offset, inp.len()); stack_u8_allocator.free_cell(output); stack_u8_allocator.free_cell(compressed); }}; } #[test] fn test_roundtrip_64x() { test_roundtrip_file!(include_bytes!("../../testdata/64x"), 72, 9, 10, false, 3, 2); } #[test] fn test_roundtrip_ukkonooa() { test_roundtrip_file!(include_bytes!("../../testdata/ukkonooa"), 82, 9, 10, true, 3, 2); } #[test] fn test_roundtrip_backward65536() { test_roundtrip_file!(include_bytes!("../../testdata/backward65536"), 72000, 9, 10, false, 3, 2); } #[test] fn test_roundtrip_aaabaaaa() { test_roundtrip_file!(include_bytes!("../../testdata/aaabaaaa"), 72000, 9, 10, true, 3, 2); } #[test] fn test_roundtrip_monkey() { test_roundtrip_file!(include_bytes!("../../testdata/monkey"), 72000, 9, 10, false, 16, 15); } #[test] fn test_roundtrip_quickfox_repeated() { test_roundtrip_file!(include_bytes!("../../testdata/quickfox_repeated"), 16384, 9, 10, true, 257, 255); } #[test] fn test_roundtrip_asyoulik() { test_roundtrip_file!(include_bytes!("../../testdata/asyoulik.txt"), 64384, 9, 15, false, 513, 511); } #[test] fn test_roundtrip_asyoulik9_5() { test_roundtrip_file!(include_bytes!("../../testdata/asyoulik.txt"), 62384, 10, 15, true, 513, 511); } #[test] fn test_roundtrip_compressed() { test_roundtrip_file!(include_bytes!("../../testdata/compressed_file"), 50400, 9, 10, false, 1025, 1024); } #[test] fn test_roundtrip_compressed_repeated() { test_roundtrip_file!(include_bytes!("../../testdata/compressed_repeated"), 120000, 9, 16, false, 2049, 2047); } #[test] fn test_roundtrip_first_58_bytes_alice() { test_roundtrip_file!(&include_bytes!("../../testdata/alice29.txt")[..58], 50400, 2, 10, true, 1, 2); } #[test] fn test_roundtrip_first_2_bytes_alice() { test_roundtrip_file!(&include_bytes!("../../testdata/alice29.txt")[..2], 50400, 2, 10, true, 1, 2); } #[test] fn test_roundtrip_quickfox() { test_roundtrip_file!(include_bytes!("../../testdata/quickfox"), 256, 9, 10, false, 1, 2); } #[test] fn test_roundtrip_x() { const BUFFER_SIZE: usize = 16384; let mut compressed: [u8; 6] = [0x0b, 0x00, 0x80, 0x58, 0x03, 0]; let mut output = [0u8; BUFFER_SIZE]; let mut input = ['X' as u8]; let (result, compressed_offset, output_offset) = oneshot(&mut input[..], &mut compressed[..], &mut output[..], 9, 10, false, 1, 2); match result { BrotliResult::ResultSuccess => {} _ => assert!(false), } assert_eq!(output[0], 'X' as u8); assert_eq!(output_offset, 1); assert_eq!(compressed_offset, compressed.len()); } #[test] fn test_roundtrip_empty() { let mut compressed: [u8; 2] = [0x06, 0]; let mut output = [0u8; 1]; let (result, compressed_offset, output_offset) = oneshot(&mut [], &mut compressed[..], &mut output[..], 9, 10, false, 2, 3); match result { BrotliResult::ResultSuccess => {} _ => assert!(false), } assert_eq!(output_offset, 0); assert_eq!(compressed_offset, compressed.len()); } /* #[cfg(feature="std")] struct Buffer { data: Vec, read_offset: usize, } #[cfg(feature="std")] impl Buffer { pub fn new(buf: &[u8]) -> Buffer { let mut ret = Buffer { data: Vec::::new(), read_offset: 0, }; ret.data.extend(buf); return ret; } } #[cfg(feature="std")] impl io::Read for Buffer { fn read(self: &mut Self, buf: &mut [u8]) -> io::Result { let bytes_to_read = ::core::cmp::min(buf.len(), self.data.len() - self.read_offset); if bytes_to_read > 0 { buf[0..bytes_to_read] .clone_from_slice(&self.data[self.read_offset..self.read_offset + bytes_to_read]); } self.read_offset += bytes_to_read; return Ok(bytes_to_read); } } #[cfg(feature="std")] impl io::Write for Buffer { fn write(self: &mut Self, buf: &[u8]) -> io::Result { self.data.extend(buf); return Ok(buf.len()); } fn flush(self: &mut Self) -> io::Result<()> { return Ok(()); } } */ brotli-3.4.0/src/enc/threading.rs000064400000000000000000000476051046102023000150060ustar 00000000000000use alloc::{Allocator, SliceWrapper, SliceWrapperMut}; use core::marker::PhantomData; use core::mem; use core::any; #[cfg(feature="std")] use std; use super::BrotliAlloc; use super::encode::{ BrotliEncoderOperation, BrotliEncoderCreateInstance, BrotliEncoderSetCustomDictionaryWithOptionalPrecomputedHasher, BrotliEncoderDestroyInstance, BrotliEncoderMaxCompressedSize, BrotliEncoderCompressStream, SanitizeParams, HasherSetup, }; use concat::{ BroCatli, BroCatliResult, }; use core::ops::Range; use super::backward_references::{BrotliEncoderParams, UnionHasher, CloneWithAlloc, AnyHasher}; pub type PoisonedThreadError = (); #[cfg(feature="std")] pub type LowLevelThreadError = std::boxed::Box; #[cfg(not(feature="std"))] pub type LowLevelThreadError = (); pub trait AnyBoxConstructor { fn new(data:LowLevelThreadError) -> Self; } pub trait Joinable:Sized { fn join(self) -> Result; } #[derive(Debug)] pub enum BrotliEncoderThreadError { InsufficientOutputSpace, ConcatenationDidNotProcessFullFile, ConcatenationError(BroCatliResult), ConcatenationFinalizationError(BroCatliResult), OtherThreadPanic, ThreadExecError(LowLevelThreadError), } impl AnyBoxConstructor for BrotliEncoderThreadError { fn new(data:LowLevelThreadError) -> Self { BrotliEncoderThreadError::ThreadExecError(data) } } pub struct CompressedFileChunk where >::AllocatedMemory: Send { data_backing:>::AllocatedMemory, data_size: usize, } pub struct CompressionThreadResult where >::AllocatedMemory: Send { compressed: Result, BrotliEncoderThreadError>, alloc: Alloc, } pub enum InternalSendAlloc> where >::AllocatedMemory: Send { A(Alloc, ExtraInput), Join(Join), SpawningOrJoining(PhantomData), } impl > InternalSendAlloc where >::AllocatedMemory: Send { fn unwrap_input(&mut self) -> (&mut Alloc, &mut ExtraInput) { match *self { InternalSendAlloc::A(ref mut alloc, ref mut extra) => (alloc, extra), _ => panic!("Bad state for allocator"), } } } pub struct SendAlloc>(pub InternalSendAlloc)//FIXME pub where >::AllocatedMemory: Send; impl> SendAlloc where >::AllocatedMemory: Send { pub fn new(alloc: Alloc, extra_input: ExtraInput) -> Self { SendAlloc::(InternalSendAlloc::A(alloc, extra_input)) } pub fn unwrap_or(self, other: Alloc, other_extra: ExtraInput) -> (Alloc, ExtraInput) { match self.0 { InternalSendAlloc::A(alloc, extra_input) => { (alloc, extra_input) }, InternalSendAlloc::SpawningOrJoining(_) | InternalSendAlloc::Join(_) => { (other, other_extra) }, } } fn unwrap_view_mut(&mut self) -> (&mut Alloc, &mut ExtraInput) { match self.0 { InternalSendAlloc::A(ref mut alloc, ref mut extra_input) => { (alloc, extra_input) }, InternalSendAlloc::SpawningOrJoining(_) | InternalSendAlloc::Join(_) => panic!("Item permanently borrowed/leaked"), } } pub fn unwrap(self) -> (Alloc, ExtraInput) { match self.0 { InternalSendAlloc::A(alloc, extra_input) => { (alloc, extra_input) }, InternalSendAlloc::SpawningOrJoining(_) | InternalSendAlloc::Join(_) => panic!("Item permanently borrowed/leaked"), } } pub fn replace_with_default(&mut self) -> (Alloc, ExtraInput) { match mem::replace(&mut self.0, InternalSendAlloc::SpawningOrJoining(PhantomData::default())) { InternalSendAlloc::A(alloc, extra_input) => { (alloc, extra_input) }, InternalSendAlloc::SpawningOrJoining(_) | InternalSendAlloc::Join(_) => panic!("Item permanently borrowed/leaked"), } } } pub enum InternalOwned { // FIXME pub Item(T), Borrowed, } pub struct Owned(pub InternalOwned); // FIXME pub impl Owned { pub fn new(data:T) -> Self { Owned::(InternalOwned::Item(data)) } pub fn unwrap_or(self, other: T) -> T { if let InternalOwned::Item(x) = self.0 { x } else { other } } pub fn unwrap(self) -> T { if let InternalOwned::Item(x) = self.0 { x } else { panic!("Item permanently borrowed") } } pub fn view(&self) -> &T { if let InternalOwned::Item(ref x) = self.0 { x } else { panic!("Item permanently borrowed") } } } pub trait OwnedRetriever { fn view T>(&self, f:F) -> Result; fn unwrap(self) -> Result; } #[cfg(feature="std")] impl OwnedRetriever for std::sync::Arc> { fn view T>(&self, f:F) -> Result { match self.read() { Ok(ref u) => Ok(f(u)), Err(_) => Err(PoisonedThreadError::default()), } } fn unwrap(self) -> Result { match std::sync::Arc::try_unwrap(self) { Ok(rwlock) => match rwlock.into_inner() { Ok(u) => Ok(u), Err(_) => Err(PoisonedThreadError::default()), }, Err(_) => Err(PoisonedThreadError::default()), } } } pub trait BatchSpawnable where >::AllocatedMemory:Send+'static { type JoinHandle: Joinable; type FinalJoinHandle: OwnedRetriever; // this function takes in an input slice // a SendAlloc per thread and converts them all into JoinHandle // the input is borrowed until the joins complete // owned is set to borrowed // the final join handle is a r/w lock which will return the SliceW to the owner // the FinalJoinHandle is only to be called when each individual JoinHandle has been examined // the function is called with the thread_index, the num_threads, a reference to the slice under a read lock, // and an allocator from the alloc_per_thread fn make_spawner( &mut self, input: &mut Owned, ) -> Self::FinalJoinHandle; fn spawn ReturnValue+Send+'static+Copy>( &mut self, handle:&mut Self::FinalJoinHandle, alloc:&mut SendAlloc, index: usize, num_threads: usize, f: F, ); } pub trait BatchSpawnableLite where >::AllocatedMemory:Send+'static { type JoinHandle: Joinable; type FinalJoinHandle: OwnedRetriever; fn make_spawner( &mut self, input: &mut Owned, ) -> Self::FinalJoinHandle; fn spawn( &mut self, handle:&mut Self::FinalJoinHandle, alloc_per_thread:&mut SendAlloc, index: usize, num_threads: usize, f: fn(ExtraInput, usize, usize, &U, Alloc) -> ReturnValue, ); } /* impl BatchSpawnableLite for BatchSpawnable { type JoinHandle = >::JoinHandle; type FinalJoinHandle = >::FinalJoinHandle; fn batch_spawn( &mut self, input: &mut Owned, alloc_per_thread:&mut [SendAlloc], f: fn(usize, usize, &U, Alloc) -> T, ) -> Self::FinalJoinHandle { >::batch_spawn(self, input, alloc_per_thread, f) } }*/ pub fn CompressMultiSlice, UnionHasher, Alloc, (>::AllocatedMemory, BrotliEncoderParams)>> ( params:&BrotliEncoderParams, input_slice: &[u8], output: &mut [u8], alloc_per_thread:&mut [SendAlloc, UnionHasher, Alloc, Spawner::JoinHandle>], thread_spawner: &mut Spawner, ) -> Result where >::AllocatedMemory: Send+Sync, >::AllocatedMemory: Send+Sync, >::AllocatedMemory: Send+Sync { let input = if let InternalSendAlloc::A(ref mut alloc, ref _extra) = alloc_per_thread[0].0 { let mut input = >::alloc_cell(alloc, input_slice.len()); input.slice_mut().clone_from_slice(input_slice); input } else { >::AllocatedMemory::default() }; let mut owned_input = Owned::new(input); let ret = CompressMulti(params, &mut owned_input, output, alloc_per_thread, thread_spawner); if let InternalSendAlloc::A(ref mut alloc, ref _extra) = alloc_per_thread[0].0 { >::free_cell(alloc, owned_input.unwrap()); } ret } fn get_range(thread_index: usize, num_threads: usize, file_size: usize) -> Range { ((thread_index * file_size) / num_threads)..(((thread_index + 1) * file_size) / num_threads) } fn compress_part>( hasher: UnionHasher, thread_index: usize, num_threads: usize, input_and_params:&(SliceW, BrotliEncoderParams), mut alloc: Alloc, ) -> CompressionThreadResult where >::AllocatedMemory:Send+'static { let mut range = get_range(thread_index, num_threads, input_and_params.0.len()); let mut mem = >::alloc_cell(&mut alloc, BrotliEncoderMaxCompressedSize(range.end - range.start)); let mut state = BrotliEncoderCreateInstance(alloc); state.params = input_and_params.1.clone(); if thread_index != 0 { state.params.catable = true; // make sure we can concatenate this to the other work results state.params.magic_number = false; // no reason to pepper this around } state.params.appendable = true; // make sure we are at least appendable, so that future items can be catted in if thread_index != 0 { BrotliEncoderSetCustomDictionaryWithOptionalPrecomputedHasher( &mut state, range.start, &input_and_params.0.slice()[..range.start], hasher, ); } let mut out_offset = 0usize; let compression_result; let mut available_out = mem.len(); loop { let mut next_in_offset = 0usize; let mut available_in = range.end - range.start; let result = BrotliEncoderCompressStream(&mut state, BrotliEncoderOperation::BROTLI_OPERATION_FINISH, &mut available_in, &input_and_params.0.slice()[range.clone()], &mut next_in_offset, &mut available_out, mem.slice_mut(), &mut out_offset, &mut None, &mut |_a,_b,_c,_d|()); let new_range = range.start + next_in_offset..range.end; range = new_range; if result != 0 { compression_result = Ok(out_offset); break; } else if available_out == 0 { compression_result = Err(BrotliEncoderThreadError::InsufficientOutputSpace); // mark no space?? break; } } BrotliEncoderDestroyInstance(&mut state); match compression_result { Ok(size) => { CompressionThreadResult::{ compressed:Ok(CompressedFileChunk{data_backing:mem, data_size:size}), alloc:state.m8, } }, Err(e) => { >::free_cell(&mut state.m8, mem); CompressionThreadResult::{ compressed:Err(e), alloc:state.m8, } }, } } pub fn CompressMulti+Send+'static+Sync, Spawner:BatchSpawnableLite, UnionHasher, Alloc, (SliceW, BrotliEncoderParams)>> ( params:&BrotliEncoderParams, owned_input: &mut Owned, output: &mut [u8], alloc_per_thread:&mut [SendAlloc, UnionHasher, Alloc, Spawner::JoinHandle>], thread_spawner: &mut Spawner, ) -> Result where >::AllocatedMemory: Send, >::AllocatedMemory: Send, >::AllocatedMemory: Send{ let num_threads = alloc_per_thread.len(); let actually_owned_mem = mem::replace(owned_input, Owned(InternalOwned::Borrowed)); let mut owned_input_pair = Owned::new((actually_owned_mem.unwrap(), params.clone())); // start thread spawner let mut spawner_and_input = thread_spawner.make_spawner(&mut owned_input_pair); if num_threads > 1 { // spawn first thread without "custom dictionary" while we compute the custom dictionary for other work items thread_spawner.spawn(&mut spawner_and_input, &mut alloc_per_thread[0], 0, num_threads, compress_part); } // populate all hashers at once, cloning them one by one let mut compression_last_thread_result; if num_threads > 1 && params.favor_cpu_efficiency { let mut local_params = params.clone(); SanitizeParams(&mut local_params); let mut hasher = UnionHasher::Uninit; HasherSetup(alloc_per_thread[num_threads -1].0.unwrap_input().0, &mut hasher, &mut local_params, &[], 0, 0, 0); for thread_index in 1..num_threads { let res = spawner_and_input.view(|input_and_params:&(SliceW, BrotliEncoderParams)| -> () { let range = get_range(thread_index - 1, num_threads, input_and_params.0.len()); let overlap = hasher.StoreLookahead().wrapping_sub(1usize); if range.end - range.start > overlap { hasher.BulkStoreRange(input_and_params.0.slice(), !(0usize), if range.start > overlap {range.start - overlap} else {0}, range.end - overlap); } }); if let Err(_e) = res { return Err(BrotliEncoderThreadError::OtherThreadPanic); } if thread_index + 1 != num_threads { { let (alloc, out_hasher) = alloc_per_thread[thread_index].unwrap_view_mut(); *out_hasher = hasher.clone_with_alloc(alloc); } thread_spawner.spawn(&mut spawner_and_input, &mut alloc_per_thread[thread_index], thread_index, num_threads, compress_part); } } let (alloc, _extra) = alloc_per_thread[num_threads -1].replace_with_default(); compression_last_thread_result = spawner_and_input.view(move |input_and_params:&(SliceW, BrotliEncoderParams)| -> CompressionThreadResult { compress_part(hasher, num_threads - 1, num_threads, input_and_params, alloc, ) }); } else { if num_threads > 1 { for thread_index in 1..num_threads-1 { thread_spawner.spawn(&mut spawner_and_input, &mut alloc_per_thread[thread_index], thread_index, num_threads, compress_part); } } let (alloc, _extra) = alloc_per_thread[num_threads - 1].replace_with_default(); compression_last_thread_result = spawner_and_input.view(move |input_and_params:&(SliceW, BrotliEncoderParams)| -> CompressionThreadResult { compress_part(UnionHasher::Uninit, num_threads - 1, num_threads, input_and_params, alloc, ) }); } let mut compression_result = Err(BrotliEncoderThreadError::InsufficientOutputSpace); let mut out_file_size = 0usize; let mut bro_cat_li = BroCatli::new(); for (index, thread) in alloc_per_thread.iter_mut().enumerate() { let mut cur_result = if index + 1 == num_threads { match mem::replace(&mut compression_last_thread_result, Err(())){ Ok(result) => result, Err(_err) => return Err(BrotliEncoderThreadError::OtherThreadPanic), } } else { match mem::replace(&mut thread.0, InternalSendAlloc::SpawningOrJoining(PhantomData::default())) { InternalSendAlloc::A(_, _) | InternalSendAlloc::SpawningOrJoining(_) => panic!("Thread not properly spawned"), InternalSendAlloc::Join(join) => match join.join() { Ok(result) => result, Err(err) => { return Err(err); } } } }; match cur_result.compressed { Ok(compressed_out) => { bro_cat_li.new_brotli_file(); let mut in_offset = 0usize; let cat_result = bro_cat_li.stream(&compressed_out.data_backing.slice()[..compressed_out.data_size], &mut in_offset, output, &mut out_file_size); match cat_result { BroCatliResult::Success | BroCatliResult::NeedsMoreInput => { compression_result = Ok(out_file_size); }, BroCatliResult::NeedsMoreOutput => { compression_result = Err(BrotliEncoderThreadError::InsufficientOutputSpace); // not enough space }, err => { compression_result = Err(BrotliEncoderThreadError::ConcatenationError(err)); // misc error }, } >::free_cell(&mut cur_result.alloc, compressed_out.data_backing); } Err(e) => { compression_result = Err(e); } } thread.0 = InternalSendAlloc::A(cur_result.alloc, UnionHasher::Uninit); } if let Err(e) = compression_result { return Err(e); } match bro_cat_li.finish(output, &mut out_file_size) { BroCatliResult::Success => compression_result = Ok(out_file_size), err => compression_result = Err(BrotliEncoderThreadError::ConcatenationFinalizationError(err)), } if let Ok(retrieved_owned_input) = spawner_and_input.unwrap() { *owned_input = Owned::new(retrieved_owned_input.0); // return the input to its rightful owner before returning } else { if let Ok(_) = compression_result { compression_result = Err(BrotliEncoderThreadError::OtherThreadPanic); } } compression_result } brotli-3.4.0/src/enc/utf8_util.rs000075500000000000000000000052531046102023000147600ustar 00000000000000#![allow(dead_code)] static kMinUTF8Ratio: super::util::floatX = 0.75 as super::util::floatX; fn BrotliParseAsUTF8(symbol: &mut i32, input: &[u8], size: usize) -> usize { if input[0i32 as (usize)] as (i32) & 0x80i32 == 0i32 { *symbol = input[0i32 as (usize)] as (i32); if *symbol > 0i32 { return 1i32 as (usize); } } if size > 1u32 as (usize) && (input[0i32 as (usize)] as (i32) & 0xe0i32 == 0xc0i32) && (input[1i32 as (usize)] as (i32) & 0xc0i32 == 0x80i32) { *symbol = (input[0i32 as (usize)] as (i32) & 0x1fi32) << 6i32 | input[1i32 as (usize)] as (i32) & 0x3fi32; if *symbol > 0x7fi32 { return 2i32 as (usize); } } if size > 2u32 as (usize) && (input[0i32 as (usize)] as (i32) & 0xf0i32 == 0xe0i32) && (input[1i32 as (usize)] as (i32) & 0xc0i32 == 0x80i32) && (input[2i32 as (usize)] as (i32) & 0xc0i32 == 0x80i32) { *symbol = (input[0i32 as (usize)] as (i32) & 0xfi32) << 12i32 | (input[1i32 as (usize)] as (i32) & 0x3fi32) << 6i32 | input[2i32 as (usize)] as (i32) & 0x3fi32; if *symbol > 0x7ffi32 { return 3i32 as (usize); } } if size > 3u32 as (usize) && (input[0i32 as (usize)] as (i32) & 0xf8i32 == 0xf0i32) && (input[1i32 as (usize)] as (i32) & 0xc0i32 == 0x80i32) && (input[2i32 as (usize)] as (i32) & 0xc0i32 == 0x80i32) && (input[3i32 as (usize)] as (i32) & 0xc0i32 == 0x80i32) { *symbol = (input[0i32 as (usize)] as (i32) & 0x7i32) << 18i32 | (input[1i32 as (usize)] as (i32) & 0x3fi32) << 12i32 | (input[2i32 as (usize)] as (i32) & 0x3fi32) << 6i32 | input[3i32 as (usize)] as (i32) & 0x3fi32; if *symbol > 0xffffi32 && (*symbol <= 0x10ffffi32) { return 4i32 as (usize); } } *symbol = 0x110000i32 | input[0i32 as (usize)] as (i32); 1i32 as (usize) } pub fn BrotliIsMostlyUTF8(data: &[u8], pos: usize, mask: usize, length: usize, min_fraction: super::util::floatX) -> i32 { let mut size_utf8: usize = 0usize; let mut i: usize = 0usize; while i < length { let mut symbol: i32 = 0; let bytes_read: usize = BrotliParseAsUTF8(&mut symbol, &data[((pos.wrapping_add(i) & mask) as (usize))..], length.wrapping_sub(i)); i = i.wrapping_add(bytes_read); if symbol < 0x110000i32 { size_utf8 = size_utf8.wrapping_add(bytes_read); } } if !!(size_utf8 as (super::util::floatX) > min_fraction * length as (super::util::floatX)) { 1i32 } else { 0i32 } } brotli-3.4.0/src/enc/util.rs000075500000000000000000034160031046102023000140140ustar 00000000000000#![allow(dead_code)] use core; #[cfg(feature="float64")] pub type floatX = f64; #[cfg(not(feature="float64"))] pub type floatX = f32; #[inline(always)] pub fn brotli_max_uint32_t(a: u32, b: u32) -> u32 { core::cmp::max(a, b) } #[inline(always)] pub fn brotli_min_uint32_t(a: u32, b: u32) -> u32 { core::cmp::min(a, b) } #[inline(always)] pub fn brotli_min_size_t(a: usize, b: usize) -> usize { core::cmp::min(a,b) } #[inline(always)] pub fn brotli_max_size_t(a: usize, b: usize) -> usize { core::cmp::max(a,b) } #[inline(always)] pub fn brotli_max_uint8_t(a: u8, b: u8) -> u8 { core::cmp::max(a,b) } static kLog2Table: [f32; 256] = [0.0000000000000000, 0.0000000000000000, 1.0000000000000000, 1.5849625007211563, 2.0000000000000000, 2.3219280948873622, 2.5849625007211561, 2.8073549220576042, 3.0000000000000000, 3.1699250014423126, 3.3219280948873626, 3.4594316186372978, 3.5849625007211565, 3.7004397181410922, 3.8073549220576037, 3.9068905956085187, 4.0000000000000000, 4.0874628412503400, 4.1699250014423122, 4.2479275134435852, 4.3219280948873626, 4.3923174227787607, 4.4594316186372973, 4.5235619560570131, 4.5849625007211570, 4.6438561897747244, 4.7004397181410926, 4.7548875021634691, 4.8073549220576037, 4.8579809951275728, 4.9068905956085187, 4.9541963103868758, 5.0000000000000000, 5.0443941193584534, 5.0874628412503400, 5.1292830169449664, 5.1699250014423122, 5.2094533656289501, 5.2479275134435852, 5.2854022188622487, 5.3219280948873626, 5.3575520046180838, 5.3923174227787607, 5.4262647547020979, 5.4594316186372973, 5.4918530963296748, 5.5235619560570131, 5.5545888516776376, 5.5849625007211570, 5.6147098441152083, 5.6438561897747244, 5.6724253419714961, 5.7004397181410926, 5.7279204545631996, 5.7548875021634691, 5.7813597135246599, 5.8073549220576046, 5.8328900141647422, 5.8579809951275719, 5.8826430493618416, 5.9068905956085187, 5.9307373375628867, 5.9541963103868758, 5.9772799234999168, 6.0000000000000000, 6.0223678130284544, 6.0443941193584534, 6.0660891904577721, 6.0874628412503400, 6.1085244567781700, 6.1292830169449672, 6.1497471195046822, 6.1699250014423122, 6.1898245588800176, 6.2094533656289510, 6.2288186904958804, 6.2479275134435861, 6.2667865406949019, 6.2854022188622487, 6.3037807481771031, 6.3219280948873617, 6.3398500028846252, 6.3575520046180847, 6.3750394313469254, 6.3923174227787598, 6.4093909361377026, 6.4262647547020979, 6.4429434958487288, 6.4594316186372982, 6.4757334309663976, 6.4918530963296748, 6.5077946401986964, 6.5235619560570131, 6.5391588111080319, 6.5545888516776376, 6.5698556083309478, 6.5849625007211561, 6.5999128421871278, 6.6147098441152092, 6.6293566200796095, 6.6438561897747253, 6.6582114827517955, 6.6724253419714952, 6.6865005271832185, 6.7004397181410917, 6.7142455176661224, 6.7279204545631988, 6.7414669864011465, 6.7548875021634691, 6.7681843247769260, 6.7813597135246599, 6.7944158663501062, 6.8073549220576037, 6.8201789624151887, 6.8328900141647422, 6.8454900509443757, 6.8579809951275719, 6.8703647195834048, 6.8826430493618416, 6.8948177633079437, 6.9068905956085187, 6.9188632372745955, 6.9307373375628867, 6.9425145053392399, 6.9541963103868758, 6.9657842846620879, 6.9772799234999168, 6.9886846867721664, 7.0000000000000000, 7.0112272554232540, 7.0223678130284544, 7.0334230015374501, 7.0443941193584534, 7.0552824355011898, 7.0660891904577721, 7.0768155970508317, 7.0874628412503400, 7.0980320829605272, 7.1085244567781700, 7.1189410727235076, 7.1292830169449664, 7.1395513523987937, 7.1497471195046822, 7.1598713367783891, 7.1699250014423130, 7.1799090900149345, 7.1898245588800176, 7.1996723448363644, 7.2094533656289492, 7.2191685204621621, 7.2288186904958804, 7.2384047393250794, 7.2479275134435861, 7.2573878426926521, 7.2667865406949019, 7.2761244052742384, 7.2854022188622487, 7.2946207488916270, 7.3037807481771031, 7.3128829552843557, 7.3219280948873617, 7.3309168781146177, 7.3398500028846243, 7.3487281542310781, 7.3575520046180847, 7.3663222142458151, 7.3750394313469254, 7.3837042924740528, 7.3923174227787607, 7.4008794362821844, 7.4093909361377026, 7.4178525148858991, 7.4262647547020979, 7.4346282276367255, 7.4429434958487288, 7.4512111118323299, 7.4594316186372973, 7.4676055500829976, 7.4757334309663976, 7.4838157772642564, 7.4918530963296748, 7.4998458870832057, 7.5077946401986964, 7.5156998382840436, 7.5235619560570131, 7.5313814605163119, 7.5391588111080319, 7.5468944598876373, 7.5545888516776376, 7.5622424242210728, 7.5698556083309478, 7.5774288280357487, 7.5849625007211561, 7.5924570372680806, 7.5999128421871278, 7.6073303137496113, 7.6147098441152075, 7.6220518194563764, 7.6293566200796095, 7.6366246205436488, 7.6438561897747244, 7.6510516911789290, 7.6582114827517955, 7.6653359171851765, 7.6724253419714952, 7.6794800995054464, 7.6865005271832185, 7.6934869574993252, 7.7004397181410926, 7.7073591320808825, 7.7142455176661224, 7.7210991887071856, 7.7279204545631996, 7.7347096202258392, 7.7414669864011465, 7.7481928495894596, 7.7548875021634691, 7.7615512324444795, 7.7681843247769260, 7.7747870596011737, 7.7813597135246608, 7.7879025593914317, 7.7944158663501062, 7.8008998999203047, 7.8073549220576037, 7.8137811912170374, 7.8201789624151887, 7.8265484872909159, 7.8328900141647422, 7.8392037880969445, 7.8454900509443757, 7.8517490414160571, 7.8579809951275719, 7.8641861446542798, 7.8703647195834048, 7.8765169465650002, 7.8826430493618425, 7.8887432488982601, 7.8948177633079446, 7.9008668079807496, 7.9068905956085187, 7.9128893362299619, 7.9188632372745955, 7.9248125036057813, 7.9307373375628867, 7.9366379390025719, 7.9425145053392399, 7.9483672315846778, 7.9541963103868758, 7.9600019320680806, 7.9657842846620870, 7.9715435539507720, 7.9772799234999168, 7.9829935746943104, 7.9886846867721664, 7.9943534368588578]; #[inline(always)] pub fn FastLog2u16(v: u16) -> floatX { log64k[v as usize] } #[cfg(feature="std")] #[inline(always)] pub fn FastLog2(v: u64) -> floatX { if v < 256 { return kLog2Table[v as usize] as floatX; } (v as f32).log2() as floatX } #[cfg(not(feature="std"))] #[inline(always)] pub fn FastLog2(v: u64) -> floatX { if v < 256 { return kLog2Table[v as usize] as floatX; } FastLog2u64(v) } #[cfg(feature="std")] #[inline(always)] pub fn FastLog2f64(v: u64) -> floatX { if v < 256 { return kLog2Table[v as usize] as floatX; } (v as floatX).log2() } #[cfg(not(feature="std"))] #[inline(always)] pub fn FastLog2f64(v: u64) -> floatX { FastLog2(v) as floatX } #[inline] pub fn FastLog2u64(v: u64) -> floatX { let bsr_8 = 56i8 - v.leading_zeros() as i8; let offset = bsr_8 & -((bsr_8 >= 0) as i8); offset as floatX + kLog2Table[(v >> offset) as u8 as usize] as (floatX) } #[inline(always)] pub fn FastLog2u32(v: i32) -> floatX { let bsr_8 = 24i8 - v.leading_zeros() as i8; let offset = bsr_8 & -((bsr_8 >= 0) as i8); offset as floatX + kLog2Table[(v >> offset) as u8 as usize] as (floatX) } #[inline(always)] pub fn xFastLog2u16(v: u16) -> floatX { let bsr_8 = 8i8 - v.leading_zeros() as i8; let offset = (bsr_8 & -((bsr_8 >= 0) as i8)); offset as floatX + kLog2Table[(v >> offset) as u8 as usize] as (floatX) } #[cfg(feature="std")] #[inline(always)] pub fn FastPow2(v: super::util::floatX) -> super::util::floatX { return (2 as super::util::floatX).powf(v); } #[cfg(not(feature="std"))] #[inline(always)] pub fn FastPow2(v: super::util::floatX) -> super::util::floatX { assert!(v >= 0 as super::util::floatX); let round_down = v as i32; let remainder = v - round_down as super::util::floatX; let mut x = 1 as super::util::floatX; // (1 + (x/n) * ln2) ^ n // let n = 8 x += remainder * (0.693147180559945309417232121458 / 256.0) as super::util::floatX; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; return (1 << round_down) as super::util::floatX * x; } #[inline(always)] pub fn Log2FloorNonZero(v: u64) -> u32 { (63u32 ^ v.leading_zeros()) as u32 } mod test { fn baseline_log2_floor_non_zero(mut n:u64) -> u32 { let mut result: u32 = 0u32; while { n = n >> 1i32; n } != 0 { result = result.wrapping_add(1 as (u32)); } result } #[test] fn log2floor_non_zero_works(){ let examples = [4u64, 254u64, 256u64, 1428u64, 25412509u64, 21350891256u64, 65536u64, 1258912591u64, 60968101u64, 1u64, 12589125190825u64, 105912059215091u64, 0u64]; for example in examples.iter() { let fast_version = super::Log2FloorNonZero(*example); let baseline_version = baseline_log2_floor_non_zero(*example); if *example != 0 { // make sure we don't panic when computing...but don't care about result assert_eq!(fast_version, baseline_version); } } } pub fn approx_eq(a : f64, b: f64, tol: f64) { let mut t0 = a - b; let mut t1 = b - a; if t0 < 0.0 { t0 = -t0; } if t1 < 0.0 { t1 = -t1; } if (!(t1 < tol)) { assert_eq!(a, b); } if (!(t0 < tol)) { assert_eq!(a, b); } } #[test] fn fast_log2_works(){ let examples = [4u64, 254u64, 256u64, 1428u64, 25412509u64, 21350891256u64, 65536u64, 1258912591u64, 60968101u64, 1u64, 12589125190825u64, 105912059215091u64, 0u64]; let tol = [0.00001, 0.0001, 0.0001, 0.005, 0.007, 0.008, 0.01, 0.01, 0.01, 0.000001, 0.01, 0.01, 0.0001]; for (index, example) in examples.iter().enumerate() { let fast_version = super::FastLog2(*example); if *example != 0 { // make sure we don't panic when computing...but don't care about result let baseline_version = (*example as f64).log2(); approx_eq(fast_version as f64, baseline_version, tol[index]); } else { //assert_eq!(fast_version as f64, 0.0 as f64); } } } } static log64k : [floatX; 65536] = [ 0.0,0.0,1.0,1.58496250072,2.0,2.32192809489,2.58496250072,2.80735492206,3.0,3.16992500144,3.32192809489,3.45943161864,3.58496250072,3.70043971814,3.80735492206,3.90689059561, 4.0,4.08746284125,4.16992500144,4.24792751344,4.32192809489,4.39231742278,4.45943161864,4.52356195606,4.58496250072,4.64385618977,4.70043971814,4.75488750216,4.80735492206,4.85798099513,4.90689059561,4.95419631039, 5.0,5.04439411936,5.08746284125,5.12928301694,5.16992500144,5.20945336563,5.24792751344,5.28540221886,5.32192809489,5.35755200462,5.39231742278,5.4262647547,5.45943161864,5.49185309633,5.52356195606,5.55458885168, 5.58496250072,5.61470984412,5.64385618977,5.67242534197,5.70043971814,5.72792045456,5.75488750216,5.78135971352,5.80735492206,5.83289001416,5.85798099513,5.88264304936,5.90689059561,5.93073733756,5.95419631039,5.9772799235, 6.0,6.02236781303,6.04439411936,6.06608919046,6.08746284125,6.10852445678,6.12928301694,6.1497471195,6.16992500144,6.18982455888,6.20945336563,6.2288186905,6.24792751344,6.26678654069,6.28540221886,6.30378074818, 6.32192809489,6.33985000288,6.35755200462,6.37503943135,6.39231742278,6.40939093614,6.4262647547,6.44294349585,6.45943161864,6.47573343097,6.49185309633,6.5077946402,6.52356195606,6.53915881111,6.55458885168,6.56985560833, 6.58496250072,6.59991284219,6.61470984412,6.62935662008,6.64385618977,6.65821148275,6.67242534197,6.68650052718,6.70043971814,6.71424551767,6.72792045456,6.7414669864,6.75488750216,6.76818432478,6.78135971352,6.79441586635, 6.80735492206,6.82017896242,6.83289001416,6.84549005094,6.85798099513,6.87036471958,6.88264304936,6.89481776331,6.90689059561,6.91886323727,6.93073733756,6.94251450534,6.95419631039,6.96578428466,6.9772799235,6.98868468677, 7.0,7.01122725542,7.02236781303,7.03342300154,7.04439411936,7.0552824355,7.06608919046,7.07681559705,7.08746284125,7.09803208296,7.10852445678,7.11894107272,7.12928301694,7.1395513524,7.1497471195,7.15987133678, 7.16992500144,7.17990909001,7.18982455888,7.19967234484,7.20945336563,7.21916852046,7.2288186905,7.23840473933,7.24792751344,7.25738784269,7.26678654069,7.27612440527,7.28540221886,7.29462074889,7.30378074818,7.31288295528, 7.32192809489,7.33091687811,7.33985000288,7.34872815423,7.35755200462,7.36632221425,7.37503943135,7.38370429247,7.39231742278,7.40087943628,7.40939093614,7.41785251489,7.4262647547,7.43462822764,7.44294349585,7.45121111183, 7.45943161864,7.46760555008,7.47573343097,7.48381577726,7.49185309633,7.49984588708,7.5077946402,7.51569983828,7.52356195606,7.53138146052,7.53915881111,7.54689445989,7.55458885168,7.56224242422,7.56985560833,7.57742882804, 7.58496250072,7.59245703727,7.59991284219,7.60733031375,7.61470984412,7.62205181946,7.62935662008,7.63662462054,7.64385618977,7.65105169118,7.65821148275,7.66533591719,7.67242534197,7.67948009951,7.68650052718,7.6934869575, 7.70043971814,7.70735913208,7.71424551767,7.72109918871,7.72792045456,7.73470962023,7.7414669864,7.74819284959,7.75488750216,7.76155123244,7.76818432478,7.7747870596,7.78135971352,7.78790255939,7.79441586635,7.80089989992, 7.80735492206,7.81378119122,7.82017896242,7.82654848729,7.83289001416,7.8392037881,7.84549005094,7.85174904142,7.85798099513,7.86418614465,7.87036471958,7.87651694657,7.88264304936,7.8887432489,7.89481776331,7.90086680798, 7.90689059561,7.91288933623,7.91886323727,7.92481250361,7.93073733756,7.936637939,7.94251450534,7.94836723158,7.95419631039,7.96000193207,7.96578428466,7.97154355395,7.9772799235,7.98299357469,7.98868468677,7.99435343686, 8.0,8.00562454919,8.01122725542,8.01680828769,8.02236781303,8.02790599657,8.03342300154,8.03891898929,8.04439411936,8.04984854945,8.0552824355,8.06069593169,8.06608919046,8.07146236256,8.07681559705,8.08214904135, 8.08746284125,8.09275714092,8.09803208296,8.10328780841,8.10852445678,8.11374216605,8.11894107272,8.12412131183,8.12928301694,8.13442632022,8.1395513524,8.14465824283,8.1497471195,8.15481810905,8.15987133678,8.16490692668, 8.16992500144,8.1749256825,8.17990909001,8.18487534291,8.18982455888,8.19475685442,8.19967234484,8.20457114425,8.20945336563,8.2143191208,8.21916852046,8.2240016742,8.2288186905,8.23361967676,8.23840473933,8.24317398347, 8.24792751344,8.25266543245,8.25738784269,8.26209484537,8.26678654069,8.2714630279,8.27612440527,8.28077077013,8.28540221886,8.29001884693,8.29462074889,8.29920801839,8.30378074818,8.30833903014,8.31288295528,8.31741261376, 8.32192809489,8.32642948712,8.33091687811,8.33539035469,8.33985000288,8.34429590792,8.34872815423,8.3531468255,8.35755200462,8.36194377374,8.36632221425,8.37068740681,8.37503943135,8.37937836707,8.38370429247,8.38801728535, 8.39231742278,8.39660478118,8.40087943628,8.40514146314,8.40939093614,8.41362792902,8.41785251489,8.42206476617,8.4262647547,8.43045255167,8.43462822764,8.43879185258,8.44294349585,8.44708322621,8.45121111183,8.4553272203, 8.45943161864,8.46352437327,8.46760555008,8.47167521439,8.47573343097,8.47978026403,8.48381577726,8.48784003382,8.49185309633,8.49585502689,8.49984588708,8.503825738,8.5077946402,8.51175265377,8.51569983828,8.51963625284, 8.52356195606,8.52747700606,8.53138146052,8.53527537662,8.53915881111,8.54303182026,8.54689445989,8.55074678538,8.55458885168,8.55842071327,8.56224242422,8.56605403817,8.56985560833,8.57364718749,8.57742882804,8.58120058192, 8.58496250072,8.58871463558,8.59245703727,8.59618975614,8.59991284219,8.60362634499,8.60733031375,8.61102479731,8.61470984412,8.61838550226,8.62205181946,8.62570884306,8.62935662008,8.63299519714,8.63662462054,8.64024493622, 8.64385618977,8.64745842645,8.65105169118,8.65463602853,8.65821148275,8.66177809777,8.66533591719,8.66888498427,8.67242534197,8.67595703294,8.67948009951,8.68299458368,8.68650052718,8.68999797142,8.6934869575,8.69696752623, 8.70043971814,8.70390357344,8.70735913208,8.7108064337,8.71424551767,8.71767642307,8.72109918871,8.72451385312,8.72792045456,8.73131903103,8.73470962023,8.73809225962,8.7414669864,8.7448338375,8.74819284959,8.75154405909, 8.75488750216,8.75822321473,8.76155123244,8.76487159074,8.76818432478,8.7714894695,8.7747870596,8.77807712954,8.78135971352,8.78463484556,8.78790255939,8.79116288856,8.79441586635,8.79766152585,8.80089989992,8.80413102118, 8.80735492206,8.81057163474,8.81378119122,8.81698362326,8.82017896242,8.82336724005,8.82654848729,8.82972273509,8.83289001416,8.83605035506,8.8392037881,8.84235034341,8.84549005094,8.84862294043,8.85174904142,8.85486838326, 8.85798099513,8.861086906,8.86418614465,8.86727873971,8.87036471958,8.87344411252,8.87651694656,8.87958324961,8.88264304936,8.88569637334,8.8887432489,8.89178370322,8.89481776331,8.89784545601,8.90086680798,8.90388184574, 8.90689059561,8.90989308377,8.91288933623,8.91587937884,8.91886323727,8.92184093707,8.92481250361,8.92777796208,8.93073733756,8.93369065495,8.936637939,8.93957921431,8.94251450534,8.94544383638,8.94836723158,8.95128471497, 8.95419631039,8.95710204156,8.96000193207,8.96289600534,8.96578428466,8.9686667932,8.97154355395,8.97441458981,8.9772799235,8.98013957764,8.98299357469,8.985841937,8.98868468677,8.99152184608,8.99435343686,8.99717948094, 9.0,9.00281501561,9.00562454919,9.00842862207,9.01122725542,9.01402047031,9.01680828769,9.01959072836,9.02236781303,9.02513956228,9.02790599657,9.03066713625,9.03342300154,9.03617361255,9.03891898929,9.04165915164, 9.04439411936,9.04712391211,9.04984854945,9.0525680508,9.0552824355,9.05799172276,9.06069593169,9.06339508129,9.06608919046,9.06877827799,9.07146236256,9.07414146275,9.07681559705,9.07948478383,9.08214904135,9.0848083878, 9.08746284125,9.09011241966,9.09275714092,9.09539702279,9.09803208296,9.10066233901,9.10328780841,9.10590850857,9.10852445678,9.11113567023,9.11374216605,9.11634396124,9.11894107272,9.12153351734,9.12412131183,9.12670447284, 9.12928301694,9.13185696061,9.13442632022,9.13699111208,9.1395513524,9.1421070573,9.14465824283,9.14720492494,9.1497471195,9.15228484231,9.15481810905,9.15734693536,9.15987133678,9.16239132876,9.16490692668,9.16741814583, 9.16992500144,9.17242750865,9.1749256825,9.17741953799,9.17990909001,9.1823943534,9.18487534291,9.1873520732,9.18982455888,9.19229281447,9.19475685442,9.19721669311,9.19967234484,9.20212382383,9.20457114425,9.20701432018, 9.20945336563,9.21188829455,9.2143191208,9.2167458582,9.21916852046,9.22158712126,9.2240016742,9.22641219279,9.2288186905,9.23122118071,9.23361967676,9.2360141919,9.23840473933,9.24079133216,9.24317398347,9.24555270626, 9.24792751344,9.25029841791,9.25266543245,9.25502856982,9.25738784269,9.25974326369,9.26209484537,9.26444260023,9.26678654069,9.26912667915,9.2714630279,9.27379559921,9.27612440527,9.27844945822,9.28077077013,9.28308835302, 9.28540221886,9.28771237955,9.29001884693,9.2923216328,9.29462074889,9.29691620688,9.29920801839,9.30149619498,9.30378074818,9.30606168943,9.30833903014,9.31061278166,9.31288295528,9.31514956226,9.31741261376,9.31967212095, 9.32192809489,9.32418054662,9.32642948712,9.32867492733,9.33091687811,9.33315535031,9.33539035469,9.33762190199,9.33985000288,9.342074668,9.34429590792,9.34651373317,9.34872815423,9.35093918155,9.3531468255,9.35535109642, 9.35755200462,9.35974956032,9.36194377374,9.36413465501,9.36632221425,9.36850646151,9.37068740681,9.37286506011,9.37503943135,9.37721053039,9.37937836707,9.38154295118,9.38370429247,9.38586240064,9.38801728535,9.3901689562, 9.39231742278,9.39446269461,9.39660478118,9.39874369194,9.40087943628,9.40301202357,9.40514146314,9.40726776424,9.40939093614,9.41151098801,9.41362792902,9.41574176829,9.41785251489,9.41996017785,9.42206476617,9.42416628882, 9.4262647547,9.4283601727,9.43045255167,9.43254190039,9.43462822764,9.43671154214,9.43879185258,9.44086916761,9.44294349585,9.44501484587,9.44708322621,9.44914864538,9.45121111183,9.45327063401,9.4553272203,9.45738087907, 9.45943161864,9.46147944729,9.46352437327,9.46556640481,9.46760555008,9.46964181724,9.47167521439,9.47370574962,9.47573343097,9.47775826644,9.47978026403,9.48179943167,9.48381577726,9.4858293087,9.48784003382,9.48984796044, 9.49185309633,9.49385544924,9.49585502689,9.49785183695,9.49984588708,9.5018371849,9.503825738,9.50581155392,9.5077946402,9.50977500433,9.51175265377,9.51372759595,9.51569983828,9.51766938813,9.51963625284,9.52160043972, 9.52356195606,9.5255208091,9.52747700606,9.52943055415,9.53138146052,9.53332973231,9.53527537662,9.53721840054,9.53915881111,9.54109661535,9.54303182026,9.54496443279,9.54689445989,9.54882190846,9.55074678538,9.55266909751, 9.55458885168,9.55650605467,9.55842071327,9.56033283421,9.56224242422,9.56414948999,9.56605403817,9.56795607542,9.56985560833,9.5717526435,9.57364718749,9.57553924683,9.57742882804,9.57931593758,9.58120058192,9.5830827675, 9.58496250072,9.58683978796,9.58871463558,9.59058704992,9.59245703727,9.59432460392,9.59618975614,9.59805250016,9.59991284219,9.60177078841,9.60362634499,9.60547951806,9.60733031375,9.60917873814,9.61102479731,9.61286849729, 9.61470984412,9.61654884378,9.61838550226,9.62021982551,9.62205181946,9.62388149001,9.62570884306,9.62753388447,9.62935662008,9.6311770557,9.63299519714,9.63481105017,9.63662462054,9.63843591399,9.64024493622,9.64205169293, 9.64385618977,9.64565843241,9.64745842645,9.64925617752,9.65105169118,9.652844973,9.65463602853,9.65642486328,9.65821148275,9.65999589243,9.66177809777,9.66355810422,9.66533591719,9.66711154208,9.66888498427,9.67065624912, 9.67242534197,9.67419226815,9.67595703294,9.67771964164,9.67948009951,9.68123841178,9.68299458368,9.68474862042,9.68650052718,9.68825030913,9.68999797142,9.69174351917,9.6934869575,9.6952282915,9.69696752623,9.69870466677, 9.70043971814,9.70217268537,9.70390357344,9.70563238736,9.70735913208,9.70908381255,9.7108064337,9.71252700044,9.71424551767,9.71596199026,9.71767642307,9.71938882094,9.72109918871,9.72280753117,9.72451385312,9.72621815933, 9.72792045456,9.72962074355,9.73131903103,9.73301532169,9.73470962023,9.73640193132,9.73809225962,9.73978060977,9.7414669864,9.74315139411,9.7448338375,9.74651432114,9.74819284959,9.7498694274,9.75154405909,9.75321674918, 9.75488750216,9.75655632252,9.75822321473,9.75988818322,9.76155123244,9.76321236681,9.76487159074,9.7665289086,9.76818432478,9.76983784363,9.7714894695,9.77313920672,9.7747870596,9.77643303244,9.77807712954,9.77971935514, 9.78135971352,9.78299820892,9.78463484556,9.78626962765,9.78790255939,9.78953364497,9.79116288856,9.7927902943,9.79441586635,9.79603960883,9.79766152585,9.79928162152,9.80089989992,9.80251636512,9.80413102118,9.80574387215, 9.80735492206,9.80896417492,9.81057163474,9.81217730551,9.81378119122,9.81538329581,9.81698362326,9.81858217748,9.82017896242,9.82177398197,9.82336724005,9.82495874053,9.82654848729,9.82813648419,9.82972273509,9.8313072438, 9.83289001416,9.83447104998,9.83605035506,9.83762793317,9.8392037881,9.8407779236,9.84235034341,9.84392105129,9.84549005094,9.84705734609,9.84862294043,9.85018683765,9.85174904142,9.8533095554,9.85486838326,9.85642552863, 9.85798099513,9.85953478638,9.861086906,9.86263735756,9.86418614465,9.86573327085,9.86727873971,9.86882255477,9.87036471958,9.87190523766,9.87344411252,9.87498134765,9.87651694657,9.87805091273,9.87958324961,9.88111396068, 9.88264304936,9.88417051911,9.88569637334,9.88722061547,9.8887432489,9.89026427702,9.89178370322,9.89330153086,9.89481776331,9.89633240391,9.89784545601,9.89935692292,9.90086680798,9.90237511449,9.90388184574,9.90538700502, 9.90689059561,9.90839262077,9.90989308377,9.91139198784,9.91288933623,9.91438513216,9.91587937884,9.91737207948,9.91886323727,9.92035285542,9.92184093707,9.92332748542,9.92481250361,9.92629599478,9.92777796208,9.92925840864, 9.93073733756,9.93221475197,9.93369065495,9.9351650496,9.936637939,9.93810932622,9.93957921431,9.94104760634,9.94251450534,9.94397991434,9.94544383638,9.94690627446,9.94836723158,9.94982671076,9.95128471497,9.95274124719, 9.95419631039,9.95564990753,9.95710204156,9.95855271543,9.96000193207,9.9614496944,9.96289600534,9.96434086779,9.96578428466,9.96722625884,9.9686667932,9.97010589061,9.97154355395,9.97297978607,9.97441458981,9.97584796801, 9.9772799235,9.97871045911,9.98013957764,9.9815672819,9.98299357469,9.9844184588,9.985841937,9.98726401207,9.98868468677,9.99010396386,9.99152184608,9.99293833617,9.99435343686,9.99576715088,9.99717948094,9.99859042975, 10.0,10.0014081944,10.0028150156,10.0042204663,10.0056245492,10.0070272669,10.0084286221,10.0098286174,10.0112272554,10.0126245389,10.0140204703,10.0154150524,10.0168082877,10.0182001788,10.0195907284,10.0209799389, 10.022367813,10.0237543533,10.0251395623,10.0265234425,10.0279059966,10.029287227,10.0306671362,10.0320457269,10.0334230015,10.0347989626,10.0361736126,10.037546954,10.0389189893,10.040289721,10.0416591516,10.0430272836, 10.0443941194,10.0457596614,10.0471239121,10.048486874,10.0498485495,10.0512089409,10.0525680508,10.0539258815,10.0552824355,10.0566377151,10.0579917228,10.0593444608,10.0606959317,10.0620461377,10.0633950813,10.0647427648, 10.0660891905,10.0674343608,10.068778278,10.0701209445,10.0714623626,10.0728025345,10.0741414628,10.0754791495,10.0768155971,10.0781508077,10.0794847838,10.0808175276,10.0821490414,10.0834793273,10.0848083878,10.086136225, 10.0874628413,10.0887882387,10.0901124197,10.0914353863,10.0927571409,10.0940776857,10.0953970228,10.0967151545,10.098032083,10.0993478104,10.100662339,10.1019756709,10.1032878084,10.1045987536,10.1059085086,10.1072170756, 10.1085244568,10.1098306543,10.1111356702,10.1124395068,10.113742166,10.1150436502,10.1163439612,10.1176431014,10.1189410727,10.1202378773,10.1215335173,10.1228279948,10.1241213118,10.1254134705,10.1267044728,10.127994321, 10.1292830169,10.1305705628,10.1318569606,10.1331422124,10.1344263202,10.1357092861,10.1369911121,10.1382718002,10.1395513524,10.1408297708,10.1421070573,10.143383214,10.1446582428,10.1459321458,10.1472049249,10.1484765822, 10.1497471195,10.1510165389,10.1522848423,10.1535520317,10.1548181091,10.1560830763,10.1573469354,10.1586096882,10.1598713368,10.161131883,10.1623913288,10.163649676,10.1649069267,10.1661630826,10.1674181458,10.1686721181, 10.1699250014,10.1711767977,10.1724275086,10.1736771363,10.1749256825,10.1761731491,10.177419538,10.178664851,10.17990909,10.1811522569,10.1823943534,10.1836353815,10.1848753429,10.1861142395,10.1873520732,10.1885888457, 10.1898245589,10.1910592145,10.1922928145,10.1935253605,10.1947568544,10.195987298,10.1972166931,10.1984450415,10.1996723448,10.200898605,10.2021238238,10.203348003,10.2045711442,10.2057932494,10.2070143202,10.2082343583, 10.2094533656,10.2106713438,10.2118882945,10.2131042196,10.2143191208,10.2155329997,10.2167458582,10.2179576979,10.2191685205,10.2203783277,10.2215871213,10.2227949029,10.2240016742,10.2252074369,10.2264121928,10.2276159434, 10.2288186905,10.2300204357,10.2312211807,10.2324209272,10.2336196768,10.2348174311,10.2360141919,10.2372099608,10.2384047393,10.2395985292,10.2407913322,10.2419831497,10.2431739835,10.2443638351,10.2455527063,10.2467405985, 10.2479275134,10.2491134527,10.2502984179,10.2514824106,10.2526654325,10.253847485,10.2550285698,10.2562086885,10.2573878427,10.2585660339,10.2597432637,10.2609195337,10.2620948454,10.2632692004,10.2644426002,10.2656150465, 10.2667865407,10.2679570844,10.2691266791,10.2702953265,10.2714630279,10.272629785,10.2737955992,10.2749604721,10.2761244053,10.2772874001,10.2784494582,10.2796105811,10.2807707701,10.281930027,10.283088353,10.2842457498, 10.2854022189,10.2865577616,10.2877123795,10.2888660742,10.2900188469,10.2911706993,10.2923216328,10.2934716488,10.2946207489,10.2957689344,10.2969162069,10.2980625677,10.2992080184,10.3003525603,10.301496195,10.3026389238, 10.3037807482,10.3049216696,10.3060616894,10.3072008091,10.3083390301,10.3094763538,10.3106127817,10.311748315,10.3128829553,10.3140167039,10.3151495623,10.3162815317,10.3174126138,10.3185428097,10.3196721209,10.3208005489, 10.3219280949,10.3230547603,10.3241805466,10.3253054551,10.3264294871,10.3275526441,10.3286749273,10.3297963382,10.3309168781,10.3320365484,10.3331553503,10.3342732853,10.3353903547,10.3365065598,10.337621902,10.3387363826, 10.3398500029,10.3409627643,10.342074668,10.3431857154,10.3442959079,10.3454052467,10.3465137332,10.3476213686,10.3487281542,10.3498340915,10.3509391815,10.3520434258,10.3531468255,10.3542493819,10.3553510964,10.3564519702, 10.3575520046,10.3586512009,10.3597495603,10.3608470842,10.3619437737,10.3630396303,10.364134655,10.3652288493,10.3663222142,10.3674147512,10.3685064615,10.3695973463,10.3706874068,10.3717766443,10.3728650601,10.3739526554, 10.3750394313,10.3761253893,10.3772105304,10.3782948559,10.3793783671,10.3804610651,10.3815429512,10.3826240266,10.3837042925,10.3847837501,10.3858624006,10.3869402453,10.3880172853,10.3890935219,10.3901689562,10.3912435894, 10.3923174228,10.3933904574,10.3944626946,10.3955341355,10.3966047812,10.3976746329,10.3987436919,10.3998119593,10.4008794363,10.401946124,10.4030120236,10.4040771362,10.4051414631,10.4062050054,10.4072677642,10.4083297408, 10.4093909361,10.4104513515,10.411510988,10.4125698468,10.413627929,10.4146852358,10.4157417683,10.4167975276,10.4178525149,10.4189067313,10.4199601778,10.4210128558,10.4220647662,10.4231159101,10.4241662888,10.4252159033, 10.4262647547,10.4273128441,10.4283601727,10.4294067415,10.4304525517,10.4314976043,10.4325419004,10.4335854412,10.4346282276,10.4356702609,10.4367115421,10.4377520723,10.4387918526,10.439830884,10.4408691676,10.4419067045, 10.4429434958,10.4439795426,10.4450148459,10.4460494067,10.4470832262,10.4481163054,10.4491486454,10.4501802472,10.4512111118,10.4522412404,10.453270634,10.4542992936,10.4553272203,10.4563544151,10.4573808791,10.4584066132, 10.4594316186,10.4604558963,10.4614794473,10.4625022726,10.4635243733,10.4645457503,10.4655664048,10.4665863377,10.4676055501,10.4686240429,10.4696418172,10.4706588741,10.4716752144,10.4726908392,10.4737057496,10.4747199465, 10.475733431,10.4767462039,10.4777582664,10.4787696195,10.479780264,10.4807902011,10.4817994317,10.4828079567,10.4838157773,10.4848228943,10.4858293087,10.4868350216,10.4878400338,10.4888443465,10.4898479604,10.4908508767, 10.4918530963,10.4928546202,10.4938554492,10.4948555845,10.4958550269,10.4968537774,10.497851837,10.4988492065,10.4998458871,10.5008418796,10.5018371849,10.5028318041,10.503825738,10.5048189876,10.5058115539,10.5068034378, 10.5077946402,10.5087851621,10.5097750043,10.5107641679,10.5117526538,10.5127404628,10.513727596,10.5147140541,10.5156998383,10.5166849493,10.5176693881,10.5186531557,10.5196362528,10.5206186806,10.5216004397,10.5225815313, 10.5235619561,10.524541715,10.5255208091,10.5264992391,10.5274770061,10.5284541108,10.5294305541,10.5304063371,10.5313814605,10.5323559253,10.5333297323,10.5343028825,10.5352753766,10.5362472157,10.5372184005,10.5381889321, 10.5391588111,10.5401280386,10.5410966153,10.5420645423,10.5430318203,10.5439984501,10.5449644328,10.5459297691,10.5468944599,10.5478585061,10.5488219085,10.5497846679,10.5507467854,10.5517082616,10.5526690975,10.5536292939, 10.5545888517,10.5555477716,10.5565060547,10.5574637016,10.5584207133,10.5593770905,10.5603328342,10.5612879452,10.5622424242,10.5631962722,10.56414949,10.5651020784,10.5660540382,10.5670053702,10.5679560754,10.5689061545, 10.5698556083,10.5708044377,10.5717526435,10.5727002265,10.5736471875,10.5745935273,10.5755392468,10.5764843468,10.577428828,10.5783726914,10.5793159376,10.5802585675,10.5812005819,10.5821419817,10.5830827675,10.5840229403, 10.5849625007,10.5859014497,10.586839788,10.5877775163,10.5887146356,10.5896511465,10.5905870499,10.5915223466,10.5924570373,10.5933911228,10.5943246039,10.5952574814,10.5961897561,10.5971214288,10.5980525002,10.598982971, 10.5999128422,10.6008421144,10.6017707884,10.602698865,10.603626345,10.6045532291,10.6054795181,10.6064052127,10.6073303137,10.608254822,10.6091787381,10.610102063,10.6110247973,10.6119469418,10.6128684973,10.6137894645, 10.6147098441,10.615629637,10.6165488438,10.6174674653,10.6183855023,10.6193029554,10.6202198255,10.6211361133,10.6220518195,10.6229669448,10.62388149,10.6247954559,10.6257088431,10.6266216524,10.6275338845,10.6284455401, 10.6293566201,10.630267125,10.6311770557,10.6320864128,10.6329951971,10.6339034093,10.6348110502,10.6357181203,10.6366246205,10.6375305515,10.638435914,10.6393407087,10.6402449362,10.6411485974,10.6420516929,10.6429542235, 10.6438561898,10.6447575925,10.6456584324,10.6465587102,10.6474584265,10.648357582,10.6492561775,10.6501542137,10.6510516912,10.6519486107,10.652844973,10.6537407787,10.6546360285,10.6555307232,10.6564248633,10.6573184496, 10.6582114828,10.6591039635,10.6599958924,10.6608872703,10.6617780978,10.6626683755,10.6635581042,10.6644472845,10.6653359172,10.6662240028,10.6671115421,10.6679985357,10.6688849843,10.6697708885,10.6706562491,10.6715410667, 10.672425342,10.6733090756,10.6741922681,10.6750749204,10.6759570329,10.6768386065,10.6777196416,10.6786001391,10.6794800995,10.6803595235,10.6812384118,10.682116765,10.6829945837,10.6838718686,10.6847486204,10.6856248397, 10.6865005272,10.6873756834,10.6882503091,10.6891244049,10.6899979714,10.6908710093,10.6917435192,10.6926155017,10.6934869575,10.6943578872,10.6952282915,10.696098171,10.6969675262,10.697836358,10.6987046668,10.6995724533, 10.7004397181,10.701306462,10.7021726854,10.703038389,10.7039035734,10.7047682394,10.7056323874,10.7064960181,10.7073591321,10.70822173,10.7090838126,10.7099453802,10.7108064337,10.7116669736,10.7125270004,10.7133865149, 10.7142455177,10.7151040092,10.7159619903,10.7168194613,10.7176764231,10.7185328761,10.7193888209,10.7202442583,10.7210991887,10.7219536128,10.7228075312,10.7236609444,10.7245138531,10.7253662579,10.7262181593,10.727069558, 10.7279204546,10.7287708495,10.7296207436,10.7304701372,10.731319031,10.7321674257,10.7330153217,10.7338627197,10.7347096202,10.7355560239,10.7364019313,10.737247343,10.7380922596,10.7389366817,10.7397806098,10.7406240445, 10.7414669864,10.7423094361,10.7431513941,10.7439928611,10.7448338375,10.745674324,10.7465143211,10.7473538295,10.7481928496,10.749031382,10.7498694274,10.7507069862,10.7515440591,10.7523806466,10.7532167492,10.7540523675, 10.7548875022,10.7557221536,10.7565563225,10.7573900094,10.7582232147,10.7590559392,10.7598881832,10.7607199475,10.7615512324,10.7623820387,10.7632123668,10.7640422173,10.7648715907,10.7657004877,10.7665289086,10.7673568541, 10.7681843248,10.7690113211,10.7698378436,10.7706638929,10.7714894695,10.7723145739,10.7731392067,10.7739633684,10.7747870596,10.7756102808,10.7764330324,10.7772553152,10.7780771295,10.778898476,10.7797193551,10.7805397675, 10.7813597135,10.7821791938,10.7829982089,10.7838167593,10.7846348456,10.7854524682,10.7862696276,10.7870863246,10.7879025594,10.7887183327,10.789533645,10.7903484968,10.7911628886,10.7919768209,10.7927902943,10.7936033093, 10.7944158664,10.795227966,10.7960396088,10.7968507953,10.7976615259,10.7984718011,10.7992816215,10.8000909876,10.8008998999,10.8017083589,10.8025163651,10.803323919,10.8041310212,10.8049376721,10.8057438722,10.806549622, 10.8073549221,10.8081597729,10.8089641749,10.8097681287,10.8105716347,10.8113746935,10.8121773055,10.8129794713,10.8137811912,10.8145824659,10.8153832958,10.8161836814,10.8169836233,10.8177831218,10.8185821775,10.8193807909, 10.8201789624,10.8209766926,10.821773982,10.822570831,10.82336724,10.8241632097,10.8249587405,10.8257538329,10.8265484873,10.8273427042,10.8281364842,10.8289298277,10.8297227351,10.830515207,10.8313072438,10.832098846, 10.8328900142,10.8336807487,10.83447105,10.8352609186,10.8360503551,10.8368393597,10.8376279332,10.8384160758,10.8392037881,10.8399910705,10.8407779236,10.8415643477,10.8423503434,10.8431359111,10.8439210513,10.8447057644, 10.8454900509,10.8462739113,10.8470573461,10.8478403556,10.8486229404,10.8494051009,10.8501868376,10.850968151,10.8517490414,10.8525295094,10.8533095554,10.8540891799,10.8548683833,10.855647166,10.8564255286,10.8572034715, 10.8579809951,10.8587580999,10.8595347864,10.8603110549,10.861086906,10.8618623401,10.8626373576,10.8634119589,10.8641861447,10.8649599151,10.8657332709,10.8665062122,10.8672787397,10.8680508537,10.8688225548,10.8695938432, 10.8703647196,10.8711351842,10.8719052377,10.8726748803,10.8734441125,10.8742129348,10.8749813477,10.8757493514,10.8765169466,10.8772841335,10.8780509127,10.8788172846,10.8795832496,10.8803488082,10.8811139607,10.8818787076, 10.8826430494,10.8834069864,10.8841705191,10.8849336479,10.8856963733,10.8864586957,10.8872206155,10.8879821331,10.8887432489,10.8895039634,10.890264277,10.8910241901,10.8917837032,10.8925428166,10.8933015309,10.8940598463, 10.8948177633,10.8955752824,10.8963324039,10.8970891283,10.897845456,10.8986013874,10.8993569229,10.900112063,10.900866808,10.9016211583,10.9023751145,10.9031286768,10.9038818457,10.9046346217,10.905387005,10.9061389962, 10.9068905956,10.9076418037,10.9083926208,10.9091430473,10.9098930838,10.9106427305,10.9113919878,10.9121408563,10.9128893362,10.913637428,10.9143851322,10.915132449,10.9158793788,10.9166259222,10.9173720795,10.918117851, 10.9188632373,10.9196082386,10.9203528554,10.9210970881,10.9218409371,10.9225844027,10.9233274854,10.9240701856,10.9248125036,10.9255544399,10.9262959948,10.9270371687,10.9277779621,10.9285183753,10.9292584086,10.9299980626, 10.9307373376,10.9314762339,10.932214752,10.9329528922,10.933690655,10.9344280406,10.9351650496,10.9359016823,10.936637939,10.9373738202,10.9381093262,10.9388444575,10.9395792143,10.9403135971,10.9410476063,10.9417812423, 10.9425145053,10.9432473959,10.9439799143,10.944712061,10.9454438364,10.9461752407,10.9469062745,10.947636938,10.9483672316,10.9490971557,10.9498267108,10.950555897,10.951284715,10.9520131649,10.9527412472,10.9534689622, 10.9541963104,10.954923292,10.9556499075,10.9563761572,10.9571020416,10.9578275608,10.9585527154,10.9592775057,10.9600019321,10.9607259948,10.9614496944,10.9621730311,10.9628960053,10.9636186174,10.9643408678,10.9650627567, 10.9657842847,10.9665054519,10.9672262588,10.9679467058,10.9686667932,10.9693865213,10.9701058906,10.9708249014,10.971543554,10.9722618487,10.9729797861,10.9736973663,10.9744145898,10.9751314569,10.975847968,10.9765641234, 10.9772799235,10.9779953686,10.9787104591,10.9794251953,10.9801395776,10.9808536064,10.9815672819,10.9822806046,10.9829935747,10.9837061927,10.9844184588,10.9851303735,10.985841937,10.9865531498,10.9872640121,10.9879745243, 10.9886846868,10.9893944998,10.9901039639,10.9908130792,10.9915218461,10.992230265,10.9929383362,10.99364606,10.9943534369,10.995060467,10.9957671509,10.9964734887,10.9971794809,10.9978851278,10.9985904297,10.999295387, 11.0,11.000704269,11.0014081944,11.0021117765,11.0028150156,11.0035179121,11.0042204663,11.0049226786,11.0056245492,11.0063260785,11.0070272669,11.0077281146,11.0084286221,11.0091287895,11.0098286174,11.0105281059, 11.0112272554,11.0119260663,11.0126245389,11.0133226734,11.0140204703,11.0147179299,11.0154150524,11.0161118382,11.0168082877,11.0175044011,11.0182001788,11.0188956211,11.0195907284,11.0202855008,11.0209799389,11.0216740429, 11.022367813,11.0230612497,11.0237543533,11.024447124,11.0251395623,11.0258316683,11.0265234425,11.0272148852,11.0279059966,11.0285967771,11.029287227,11.0299773466,11.0306671362,11.0313565963,11.0320457269,11.0327345286, 11.0334230015,11.0341111461,11.0347989626,11.0354864513,11.0361736126,11.0368604467,11.037546954,11.0382331347,11.0389189893,11.039604518,11.040289721,11.0409745988,11.0416591516,11.0423433798,11.0430272836,11.0437108633, 11.0443941194,11.0450770519,11.0457596614,11.046441948,11.0471239121,11.047805554,11.048486874,11.0491678724,11.0498485495,11.0505289055,11.0512089409,11.0518886559,11.0525680508,11.0532471259,11.0539258815,11.054604318, 11.0552824355,11.0559602345,11.0566377151,11.0573148778,11.0579917228,11.0586682503,11.0593444608,11.0600203545,11.0606959317,11.0613711927,11.0620461377,11.0627207672,11.0633950813,11.0640690804,11.0647427648,11.0654161347, 11.0660891905,11.0667619324,11.0674343608,11.0681064759,11.068778278,11.0694497674,11.0701209445,11.0707918094,11.0714623626,11.0721326042,11.0728025345,11.073472154,11.0741414628,11.0748104612,11.0754791495,11.076147528, 11.0768155971,11.0774833569,11.0781508077,11.07881795,11.0794847838,11.0801513096,11.0808175276,11.0814834381,11.0821490414,11.0828143377,11.0834793273,11.0841440106,11.0848083878,11.0854724592,11.086136225,11.0867996856, 11.0874628413,11.0881256922,11.0887882387,11.0894504811,11.0901124197,11.0907740546,11.0914353863,11.092096415,11.0927571409,11.0934175644,11.0940776857,11.094737505,11.0953970228,11.0960562392,11.0967151545,11.097373769, 11.098032083,11.0986900967,11.0993478104,11.1000052244,11.100662339,11.1013191544,11.1019756709,11.1026318889,11.1032878084,11.1039434299,11.1045987536,11.1052537797,11.1059085086,11.1065629404,11.1072170756,11.1078709143, 11.1085244568,11.1091777034,11.1098306543,11.1104833098,11.1111356702,11.1117877358,11.1124395068,11.1130909834,11.113742166,11.1143930549,11.1150436502,11.1156939522,11.1163439612,11.1169936775,11.1176431014,11.118292233, 11.1189410727,11.1195896207,11.1202378773,11.1208858428,11.1215335173,11.1221809013,11.1228279948,11.1234747982,11.1241213118,11.1247675358,11.1254134705,11.1260591161,11.1267044728,11.1273495411,11.127994321,11.1286388129, 11.1292830169,11.1299269335,11.1305705628,11.1312139051,11.1318569606,11.1324997296,11.1331422124,11.1337844092,11.1344263202,11.1350679458,11.1357092861,11.1363503415,11.1369911121,11.1376315982,11.1382718002,11.1389117181, 11.1395513524,11.1401907032,11.1408297708,11.1414685554,11.1421070573,11.1427452768,11.143383214,11.1440208693,11.1446582428,11.1452953349,11.1459321458,11.1465686757,11.1472049249,11.1478408937,11.1484765822,11.1491119907, 11.1497471195,11.1503819688,11.1510165389,11.15165083,11.1522848423,11.1529185761,11.1535520317,11.1541852093,11.1548181091,11.1554507313,11.1560830763,11.1567151442,11.1573469354,11.1579784499,11.1586096882,11.1592406504, 11.1598713368,11.1605017476,11.161131883,11.1617617433,11.1623913288,11.1630206396,11.163649676,11.1642784383,11.1649069267,11.1655351414,11.1661630826,11.1667907507,11.1674181458,11.1680452682,11.1686721181,11.1692986958, 11.1699250014,11.1705510353,11.1711767977,11.1718022887,11.1724275086,11.1730524578,11.1736771363,11.1743015445,11.1749256825,11.1755495506,11.1761731491,11.1767964781,11.177419538,11.1780423289,11.178664851,11.1792871046, 11.17990909,11.1805308073,11.1811522569,11.1817734388,11.1823943534,11.1830150009,11.1836353815,11.1842554954,11.1848753429,11.1854949242,11.1861142395,11.1867332891,11.1873520732,11.187970592,11.1885888457,11.1892068346, 11.1898245589,11.1904420188,11.1910592145,11.1916761464,11.1922928145,11.1929092191,11.1935253605,11.1941412389,11.1947568544,11.1953722074,11.195987298,11.1966021265,11.1972166931,11.197830998,11.1984450415,11.1990588237, 11.1996723448,11.2002856052,11.200898605,11.2015113445,11.2021238238,11.2027360433,11.203348003,11.2039597032,11.2045711442,11.2051823262,11.2057932494,11.206403914,11.2070143202,11.2076244682,11.2082343583,11.2088439907, 11.2094533656,11.2100624832,11.2106713438,11.2112799475,11.2118882945,11.2124963852,11.2131042196,11.2137117981,11.2143191208,11.2149261879,11.2155329997,11.2161395564,11.2167458582,11.2173519053,11.2179576979,11.2185632362, 11.2191685205,11.2197735509,11.2203783277,11.2209828511,11.2215871213,11.2221911385,11.2227949029,11.2233984147,11.2240016742,11.2246046815,11.2252074369,11.2258099406,11.2264121928,11.2270141936,11.2276159434,11.2282174423, 11.2288186905,11.2294196882,11.2300204357,11.2306209331,11.2312211807,11.2318211787,11.2324209272,11.2330204265,11.2336196768,11.2342186782,11.2348174311,11.2354159356,11.2360141919,11.2366122002,11.2372099608,11.2378074737, 11.2384047393,11.2390017578,11.2395985292,11.240195054,11.2407913322,11.241387364,11.2419831497,11.2425786895,11.2431739835,11.243769032,11.2443638351,11.2449583932,11.2455527063,11.2461467746,11.2467405985,11.247334178, 11.2479275134,11.2485206049,11.2491134527,11.249706057,11.2502984179,11.2508905357,11.2514824106,11.2520740428,11.2526654325,11.2532565798,11.253847485,11.2544381483,11.2550285698,11.2556187498,11.2562086885,11.2567983861, 11.2573878427,11.2579770586,11.2585660339,11.2591547689,11.2597432637,11.2603315186,11.2609195337,11.2615073092,11.2620948454,11.2626821424,11.2632692004,11.2638560196,11.2644426002,11.2650289425,11.2656150465,11.2662009125, 11.2667865407,11.2673719313,11.2679570844,11.2685420003,11.2691266791,11.2697111211,11.2702953265,11.2708792953,11.2714630279,11.2720465244,11.272629785,11.2732128099,11.2737955992,11.2743781532,11.2749604721,11.2755425561, 11.2761244053,11.2767060199,11.2772874001,11.2778685462,11.2784494582,11.2790301364,11.2796105811,11.2801907922,11.2807707701,11.281350515,11.281930027,11.2825093062,11.283088353,11.2836671675,11.2842457498,11.2848241002, 11.2854022189,11.2859801059,11.2865577616,11.2871351861,11.2877123795,11.2882893422,11.2888660742,11.2894425757,11.2900188469,11.2905948881,11.2911706993,11.2917462808,11.2923216328,11.2928967554,11.2934716488,11.2940463133, 11.2946207489,11.2951949559,11.2957689344,11.2963426847,11.2969162069,11.2974895012,11.2980625677,11.2986354067,11.2992080184,11.2997804029,11.3003525603,11.300924491,11.301496195,11.3020676725,11.3026389238,11.3032099489, 11.3037807482,11.3043513217,11.3049216696,11.3054917921,11.3060616894,11.3066313617,11.3072008091,11.3077700319,11.3083390301,11.3089078041,11.3094763538,11.3100446796,11.3106127817,11.3111806601,11.311748315,11.3123157467, 11.3128829553,11.313449941,11.3140167039,11.3145832443,11.3151495623,11.315715658,11.3162815317,11.3168471836,11.3174126138,11.3179778224,11.3185428097,11.3191075758,11.3196721209,11.3202364452,11.3208005489,11.321364432, 11.3219280949,11.3224915376,11.3230547603,11.3236177633,11.3241805466,11.3247431105,11.3253054551,11.3258675806,11.3264294871,11.3269911749,11.3275526441,11.3281138948,11.3286749273,11.3292357417,11.3297963382,11.330356717, 11.3309168781,11.3314768219,11.3320365484,11.3325960578,11.3331553503,11.3337144261,11.3342732853,11.3348319281,11.3353903547,11.3359485652,11.3365065598,11.3370643387,11.337621902,11.3381792499,11.3387363826,11.3392933002, 11.3398500029,11.3404064909,11.3409627643,11.3415188232,11.342074668,11.3426302987,11.3431857154,11.3437409185,11.3442959079,11.3448506839,11.3454052467,11.3459595964,11.3465137332,11.3470676572,11.3476213686,11.3481748675, 11.3487281542,11.3492812288,11.3498340915,11.3503867423,11.3509391815,11.3514914093,11.3520434258,11.3525952311,11.3531468255,11.353698209,11.3542493819,11.3548003444,11.3553510964,11.3559016383,11.3564519702,11.3570020923, 11.3575520046,11.3581017074,11.3586512009,11.3592004851,11.3597495603,11.3602984266,11.3608470842,11.3613955332,11.3619437737,11.362491806,11.3630396303,11.3635872465,11.364134655,11.3646818559,11.3652288493,11.3657756353, 11.3663222142,11.3668685862,11.3674147512,11.3679607096,11.3685064615,11.369052007,11.3695973463,11.3701424795,11.3706874068,11.3712321284,11.3717766443,11.3723209549,11.3728650601,11.3734089602,11.3739526554,11.3744961457, 11.3750394313,11.3755825125,11.3761253893,11.3766680619,11.3772105304,11.377752795,11.3782948559,11.3788367132,11.3793783671,11.3799198176,11.3804610651,11.3810021096,11.3815429512,11.3820835901,11.3826240266,11.3831642606, 11.3837042925,11.3842441222,11.3847837501,11.3853231762,11.3858624006,11.3864014236,11.3869402453,11.3874788658,11.3880172853,11.388555504,11.3890935219,11.3896313393,11.3901689562,11.3907063729,11.3912435894,11.391780606, 11.3923174228,11.3928540399,11.3933904574,11.3939266756,11.3944626946,11.3949985145,11.3955341355,11.3960695576,11.3966047812,11.3971398062,11.3976746329,11.3982092615,11.3987436919,11.3992779245,11.3998119593,11.4003457965, 11.4008794363,11.4014128787,11.401946124,11.4024791722,11.4030120236,11.4035446782,11.4040771362,11.4046093978,11.4051414631,11.4056733323,11.4062050054,11.4067364827,11.4072677642,11.4077988502,11.4083297408,11.408860436, 11.4093909361,11.4099212412,11.4104513515,11.410981267,11.411510988,11.4120405146,11.4125698468,11.4130989849,11.413627929,11.4141566793,11.4146852358,11.4152135988,11.4157417683,11.4162697445,11.4167975276,11.4173251177, 11.4178525149,11.4183797194,11.4189067313,11.4194335507,11.4199601778,11.4204866128,11.4210128558,11.4215389068,11.4220647662,11.4225904339,11.4231159101,11.4236411951,11.4241662888,11.4246911915,11.4252159033,11.4257404243, 11.4262647547,11.4267888946,11.4273128441,11.4278366035,11.4283601727,11.428883552,11.4294067415,11.4299297414,11.4304525517,11.4309751726,11.4314976043,11.4320198468,11.4325419004,11.4330637651,11.4335854412,11.4341069286, 11.4346282276,11.4351493384,11.4356702609,11.4361909955,11.4367115421,11.437231901,11.4377520723,11.4382720561,11.4387918526,11.4393114618,11.439830884,11.4403501192,11.4408691676,11.4413880293,11.4419067045,11.4424251933, 11.4429434958,11.4434616122,11.4439795426,11.4444972871,11.4450148459,11.445532219,11.4460494067,11.4465664091,11.4470832262,11.4475998583,11.4481163054,11.4486325677,11.4491486454,11.4496645385,11.4501802472,11.4506957716, 11.4512111118,11.4517262681,11.4522412404,11.452756029,11.453270634,11.4537850555,11.4542992936,11.4548133485,11.4553272203,11.4558409091,11.4563544151,11.4568677384,11.4573808791,11.4578938373,11.4584066132,11.458919207, 11.4594316186,11.4599438484,11.4604558963,11.4609677626,11.4614794473,11.4619909506,11.4625022726,11.4630134134,11.4635243733,11.4640351522,11.4645457503,11.4650561678,11.4655664048,11.4660764614,11.4665863377,11.4670960339, 11.4676055501,11.4681148864,11.4686240429,11.4691330198,11.4696418172,11.4701504353,11.4706588741,11.4711671337,11.4716752144,11.4721831162,11.4726908392,11.4731983837,11.4737057496,11.4742129372,11.4747199465,11.4752267777, 11.475733431,11.4762399063,11.4767462039,11.4772523239,11.4777582664,11.4782640316,11.4787696195,11.4792750303,11.479780264,11.4802853209,11.4807902011,11.4812949046,11.4817994317,11.4823037823,11.4828079567,11.483311955, 11.4838157773,11.4843194236,11.4848228943,11.4853261892,11.4858293087,11.4863322528,11.4868350216,11.4873376152,11.4878400338,11.4883422775,11.4888443465,11.4893462407,11.4898479604,11.4903495057,11.4908508767,11.4913520736, 11.4918530963,11.4923539452,11.4928546202,11.4933551215,11.4938554492,11.4943556035,11.4948555845,11.4953553922,11.4958550269,11.4963544886,11.4968537774,11.4973528935,11.497851837,11.4983506079,11.4988492065,11.4993476329, 11.4998458871,11.5003439693,11.5008418796,11.5013396181,11.5018371849,11.5023345802,11.5028318041,11.5033288566,11.503825738,11.5043224483,11.5048189876,11.5053153561,11.5058115539,11.5063075811,11.5068034378,11.5072991241, 11.5077946402,11.5082899861,11.5087851621,11.5092801681,11.5097750043,11.5102696709,11.5107641679,11.5112584955,11.5117526538,11.5122466428,11.5127404628,11.5132341138,11.513727596,11.5142209094,11.5147140541,11.5152070304, 11.5156998383,11.5161924779,11.5166849493,11.5171772527,11.5176693881,11.5181613558,11.5186531557,11.519144788,11.5196362528,11.5201275503,11.5206186806,11.5211096437,11.5216004397,11.5220910689,11.5225815313,11.5230718269, 11.5235619561,11.5240519187,11.524541715,11.5250313451,11.5255208091,11.5260101071,11.5264992391,11.5269882054,11.5274770061,11.5279656411,11.5284541108,11.5289424151,11.5294305541,11.5299185281,11.5304063371,11.5308939812, 11.5313814605,11.5318687752,11.5323559253,11.532842911,11.5333297323,11.5338163894,11.5343028825,11.5347892115,11.5352753766,11.535761378,11.5362472157,11.5367328898,11.5372184005,11.5377037479,11.5381889321,11.5386739531, 11.5391588111,11.5396435062,11.5401280386,11.5406124082,11.5410966153,11.54158066,11.5420645423,11.5425482623,11.5430318203,11.5435152162,11.5439984501,11.5444815223,11.5449644328,11.5454471817,11.5459297691,11.5464121951, 11.5468944599,11.5473765635,11.5478585061,11.5483402877,11.5488219085,11.5493033685,11.5497846679,11.5502658069,11.5507467854,11.5512276036,11.5517082616,11.5521887596,11.5526690975,11.5531492756,11.5536292939,11.5541091526, 11.5545888517,11.5550683913,11.5555477716,11.5560269927,11.5565060547,11.5569849576,11.5574637016,11.5579422868,11.5584207133,11.5588989811,11.5593770905,11.5598550415,11.5603328342,11.5608104687,11.5612879452,11.5617652636, 11.5622424242,11.562719427,11.5631962722,11.5636729598,11.56414949,11.5646258628,11.5651020784,11.5655781368,11.5660540382,11.5665297826,11.5670053702,11.5674808011,11.5679560754,11.5684311932,11.5689061545,11.5693809595, 11.5698556083,11.570330101,11.5708044377,11.5712786185,11.5717526435,11.5722265128,11.5727002265,11.5731737847,11.5736471875,11.574120435,11.5745935273,11.5750664646,11.5755392468,11.5760118742,11.5764843468,11.5769566647, 11.577428828,11.5779008369,11.5783726914,11.5788443916,11.5793159376,11.5797873295,11.5802585675,11.5807296516,11.5812005819,11.5816713586,11.5821419817,11.5826124513,11.5830827675,11.5835529305,11.5840229403,11.584492797, 11.5849625007,11.5854320516,11.5859014497,11.5863706951,11.586839788,11.5873087283,11.5877775163,11.588246152,11.5887146356,11.589182967,11.5896511465,11.5901191741,11.5905870499,11.591054774,11.5915223466,11.5919897676, 11.5924570373,11.5929241556,11.5933911228,11.5938579389,11.5943246039,11.5947911181,11.5952574814,11.5957236941,11.5961897561,11.5966556677,11.5971214288,11.5975870396,11.5980525002,11.5985178106,11.598982971,11.5994479815, 11.5999128422,11.6003775531,11.6008421144,11.6013065261,11.6017707884,11.6022349013,11.602698865,11.6031626795,11.603626345,11.6040898615,11.6045532291,11.6050164479,11.6054795181,11.6059424396,11.6064052127,11.6068678374, 11.6073303137,11.6077926419,11.608254822,11.608716854,11.6091787381,11.6096404744,11.610102063,11.6105635039,11.6110247973,11.6114859432,11.6119469418,11.6124077931,11.6128684973,11.6133290544,11.6137894645,11.6142497277, 11.6147098441,11.6151698138,11.615629637,11.6160893136,11.6165488438,11.6170082277,11.6174674653,11.6179265568,11.6183855023,11.6188443018,11.6193029554,11.6197614633,11.6202198255,11.6206780421,11.6211361133,11.621594039, 11.6220518195,11.6225094547,11.6229669448,11.6234242899,11.62388149,11.6243385453,11.6247954559,11.6252522217,11.6257088431,11.6261653199,11.6266216524,11.6270778405,11.6275338845,11.6279897843,11.6284455401,11.628901152, 11.6293566201,11.6298119444,11.630267125,11.6307221621,11.6311770557,11.6316318059,11.6320864128,11.6325408765,11.6329951971,11.6334493747,11.6339034093,11.6343573011,11.6348110502,11.6352646565,11.6357181203,11.6361714416, 11.6366246205,11.6370776571,11.6375305515,11.6379833038,11.638435914,11.6388883823,11.6393407087,11.6397928933,11.6402449362,11.6406968376,11.6411485974,11.6416002158,11.6420516929,11.6425030288,11.6429542235,11.6434052771, 11.6438561898,11.6443069615,11.6447575925,11.6452080828,11.6456584324,11.6461086415,11.6465587102,11.6470086384,11.6474584265,11.6479080743,11.648357582,11.6488069497,11.6492561775,11.6497052655,11.6501542137,11.6506030222, 11.6510516912,11.6515002207,11.6519486107,11.6523968615,11.652844973,11.6532929454,11.6537407787,11.6541884731,11.6546360285,11.6550834452,11.6555307232,11.6559778625,11.6564248633,11.6568717256,11.6573184496,11.6577650353, 11.6582114828,11.6586577921,11.6591039635,11.6595499969,11.6599958924,11.6604416502,11.6608872703,11.6613327528,11.6617780978,11.6622233053,11.6626683755,11.6631133085,11.6635581042,11.6640027629,11.6644472845,11.6648916693, 11.6653359172,11.6657800283,11.6662240028,11.6666678407,11.6671115421,11.667555107,11.6679985357,11.6684418281,11.6688849843,11.6693280044,11.6697708885,11.6702136367,11.6706562491,11.6710987257,11.6715410667,11.6719832721, 11.672425342,11.6728672764,11.6733090756,11.6737507394,11.6741922681,11.6746336618,11.6750749204,11.6755160441,11.6759570329,11.676397887,11.6768386065,11.6772791913,11.6777196416,11.6781599575,11.6786001391,11.6790401864, 11.6794800995,11.6799198785,11.6803595235,11.6807990346,11.6812384118,11.6816776552,11.682116765,11.6825557411,11.6829945837,11.6834332928,11.6838718686,11.6843103111,11.6847486204,11.6851867966,11.6856248397,11.6860627499, 11.6865005272,11.6869381717,11.6873756834,11.6878130626,11.6882503091,11.6886874232,11.6891244049,11.6895612543,11.6899979714,11.6904345564,11.6908710093,11.6913073302,11.6917435192,11.6921795763,11.6926155017,11.6930512954, 11.6934869575,11.6939224881,11.6943578872,11.694793155,11.6952282915,11.6956632968,11.696098171,11.6965329141,11.6969675262,11.6974020075,11.697836358,11.6982705777,11.6987046668,11.6991386253,11.6995724533,11.7000061509, 11.7004397181,11.7008731551,11.701306462,11.7017396387,11.7021726854,11.7026056021,11.703038389,11.7034710461,11.7039035734,11.7043359712,11.7047682394,11.7052003781,11.7056323874,11.7060642673,11.7064960181,11.7069276396, 11.7073591321,11.7077904955,11.70822173,11.7086528357,11.7090838126,11.7095146607,11.7099453802,11.7103759712,11.7108064337,11.7112367678,11.7116669736,11.7120970511,11.7125270004,11.7129568217,11.7133865149,11.7138160802, 11.7142455177,11.7146748273,11.7151040092,11.7155330635,11.7159619903,11.7163907895,11.7168194613,11.7172480058,11.7176764231,11.7181047131,11.7185328761,11.718960912,11.7193888209,11.719816603,11.7202442583,11.7206717868, 11.7210991887,11.721526464,11.7219536128,11.7223806352,11.7228075312,11.7232343009,11.7236609444,11.7240874618,11.7245138531,11.7249401185,11.7253662579,11.7257922715,11.7262181593,11.7266439215,11.727069558,11.727495069, 11.7279204546,11.7283457147,11.7287708495,11.7291958591,11.7296207436,11.7300455029,11.7304701372,11.7308946465,11.731319031,11.7317432907,11.7321674257,11.732591436,11.7330153217,11.7334390829,11.7338627197,11.7342862321, 11.7347096202,11.7351328841,11.7355560239,11.7359790396,11.7364019313,11.7368246991,11.737247343,11.7376698632,11.7380922596,11.7385145324,11.7389366817,11.7393587074,11.7397806098,11.7402023888,11.7406240445,11.741045577, 11.7414669864,11.7418882727,11.7423094361,11.7427304765,11.7431513941,11.7435721889,11.7439928611,11.7444134106,11.7448338375,11.745254142,11.745674324,11.7460943837,11.7465143211,11.7469341364,11.7473538295,11.7477734005, 11.7481928496,11.7486121767,11.749031382,11.7494504656,11.7498694274,11.7502882676,11.7507069862,11.7511255834,11.7515440591,11.7519624135,11.7523806466,11.7527987584,11.7532167492,11.7536346189,11.7540523675,11.7544699953, 11.7548875022,11.7553048883,11.7557221536,11.7561392984,11.7565563225,11.7569732262,11.7573900094,11.7578066722,11.7582232147,11.758639637,11.7590559392,11.7594721212,11.7598881832,11.7603041253,11.7607199475,11.7611356498, 11.7615512324,11.7619666954,11.7623820387,11.7627972625,11.7632123668,11.7636273517,11.7640422173,11.7644569636,11.7648715907,11.7652860987,11.7657004877,11.7661147576,11.7665289086,11.7669429408,11.7673568541,11.7677706488, 11.7681843248,11.7685978822,11.7690113211,11.7694246416,11.7698378436,11.7702509274,11.7706638929,11.7710767403,11.7714894695,11.7719020807,11.7723145739,11.7727269492,11.7731392067,11.7735513464,11.7739633684,11.7743752728, 11.7747870596,11.7751987289,11.7756102808,11.7760217153,11.7764330324,11.7768442324,11.7772553152,11.7776662809,11.7780771295,11.7784878612,11.778898476,11.779308974,11.7797193551,11.7801296196,11.7805397675,11.7809497987, 11.7813597135,11.7817695119,11.7821791938,11.7825887595,11.7829982089,11.7834075422,11.7838167593,11.7842258604,11.7846348456,11.7850437148,11.7854524682,11.7858611058,11.7862696276,11.7866780339,11.7870863246,11.7874944997, 11.7879025594,11.7883105037,11.7887183327,11.7891260464,11.789533645,11.7899411284,11.7903484968,11.7907557501,11.7911628886,11.7915699121,11.7919768209,11.7923836149,11.7927902943,11.7931968591,11.7936033093,11.794009645, 11.7944158664,11.7948219733,11.795227966,11.7956338445,11.7960396088,11.7964452591,11.7968507953,11.7972562175,11.7976615259,11.7980667204,11.7984718011,11.7988767681,11.7992816215,11.7996863613,11.8000909876,11.8004955005, 11.8008998999,11.801304186,11.8017083589,11.8021124186,11.8025163651,11.8029201986,11.803323919,11.8037275266,11.8041310212,11.804534403,11.8049376721,11.8053408284,11.8057438722,11.8061468033,11.806549622,11.8069523282, 11.8073549221,11.8077574036,11.8081597729,11.80856203,11.8089641749,11.8093662078,11.8097681287,11.8101699377,11.8105716347,11.81097322,11.8113746935,11.8117760553,11.8121773055,11.8125784441,11.8129794713,11.8133803869, 11.8137811912,11.8141818842,11.8145824659,11.8149829364,11.8153832958,11.8157835441,11.8161836814,11.8165837078,11.8169836233,11.8173834279,11.8177831218,11.8181827049,11.8185821775,11.8189815394,11.8193807909,11.8197799318, 11.8201789624,11.8205778827,11.8209766926,11.8213753924,11.821773982,11.8221724615,11.822570831,11.8229690905,11.82336724,11.8237652798,11.8241632097,11.82456103,11.8249587405,11.8253563415,11.8257538329,11.8261512148, 11.8265484873,11.8269456504,11.8273427042,11.8277396488,11.8281364842,11.8285332105,11.8289298277,11.8293263358,11.8297227351,11.8301190254,11.830515207,11.8309112797,11.8313072438,11.8317030992,11.832098846,11.8324944843, 11.8328900142,11.8332854356,11.8336807487,11.8340759534,11.83447105,11.8348660384,11.8352609186,11.8356556908,11.8360503551,11.8364449113,11.8368393597,11.8372337003,11.8376279332,11.8380220583,11.8384160758,11.8388099857, 11.8392037881,11.839597483,11.8399910705,11.8403845507,11.8407779236,11.8411711892,11.8415643477,11.8419573991,11.8423503434,11.8427431807,11.8431359111,11.8435285346,11.8439210513,11.8443134612,11.8447057644,11.845097961, 11.8454900509,11.8458820344,11.8462739113,11.8466656819,11.8470573461,11.847448904,11.8478403556,11.8482317011,11.8486229404,11.8490140737,11.8494051009,11.8497960222,11.8501868376,11.8505775472,11.850968151,11.851358649, 11.8517490414,11.8521393282,11.8525295094,11.8529195851,11.8533095554,11.8536994203,11.8540891799,11.8544788342,11.8548683833,11.8552578272,11.855647166,11.8560363998,11.8564255286,11.8568145525,11.8572034715,11.8575922857, 11.8579809951,11.8583695999,11.8587580999,11.8591464954,11.8595347864,11.8599229729,11.8603110549,11.8606990326,11.861086906,11.8614746751,11.8618623401,11.8622499009,11.8626373576,11.8630247102,11.8634119589,11.8637991037, 11.8641861447,11.8645730818,11.8649599151,11.8653466448,11.8657332709,11.8661197933,11.8665062122,11.8668925277,11.8672787397,11.8676648484,11.8680508537,11.8684367559,11.8688225548,11.8692082506,11.8695938432,11.8699793329, 11.8703647196,11.8707500033,11.8711351842,11.8715202623,11.8719052377,11.8722901103,11.8726748803,11.8730595477,11.8734441125,11.8738285749,11.8742129348,11.8745971924,11.8749813477,11.8753654006,11.8757493514,11.8761332, 11.8765169466,11.876900591,11.8772841335,11.8776675741,11.8780509127,11.8784341496,11.8788172846,11.8792003179,11.8795832496,11.8799660797,11.8803488082,11.8807314351,11.8811139607,11.8814963848,11.8818787076,11.8822609291, 11.8826430494,11.8830250684,11.8834069864,11.8837888033,11.8841705191,11.884552134,11.8849336479,11.885315061,11.8856963733,11.8860775849,11.8864586957,11.8868397059,11.8872206155,11.8876014245,11.8879821331,11.8883627412, 11.8887432489,11.8891236563,11.8895039634,11.8898841703,11.890264277,11.8906442836,11.8910241901,11.8914039967,11.8917837032,11.8921633099,11.8925428166,11.8929222236,11.8933015309,11.8936807384,11.8940598463,11.8944388546, 11.8948177633,11.8951965726,11.8955752824,11.8959538928,11.8963324039,11.8967108157,11.8970891283,11.8974673417,11.897845456,11.8982234712,11.8986013874,11.8989792046,11.8993569229,11.8997345424,11.900112063,11.9004894848, 11.900866808,11.9012440325,11.9016211583,11.9019981857,11.9023751145,11.9027519449,11.9031286768,11.9035053104,11.9038818457,11.9042582828,11.9046346217,11.9050108624,11.905387005,11.9057630496,11.9061389962,11.9065148448, 11.9068905956,11.9072662485,11.9076418037,11.9080172611,11.9083926208,11.9087678828,11.9091430473,11.9095181143,11.9098930838,11.9102679558,11.9106427305,11.9110174078,11.9113919878,11.9117664707,11.9121408563,11.9125151448, 11.9128893362,11.9132634306,11.913637428,11.9140113285,11.9143851322,11.9147588389,11.915132449,11.9155059622,11.9158793788,11.9162526988,11.9166259222,11.9169990491,11.9173720795,11.9177450134,11.918117851,11.9184905923, 11.9188632373,11.919235786,11.9196082386,11.919980595,11.9203528554,11.9207250198,11.9210970881,11.9214690605,11.9218409371,11.9222127178,11.9225844027,11.9229559919,11.9233274854,11.9236988833,11.9240701856,11.9244413923, 11.9248125036,11.9251835194,11.9255544399,11.925925265,11.9262959948,11.9266666293,11.9270371687,11.9274076129,11.9277779621,11.9281482162,11.9285183753,11.9288884394,11.9292584086,11.929628283,11.9299980626,11.9303677474, 11.9307373376,11.931106833,11.9314762339,11.9318455402,11.932214752,11.9325838693,11.9329528922,11.9333218207,11.933690655,11.9340593949,11.9344280406,11.9347965922,11.9351650496,11.935533413,11.9359016823,11.9362698576, 11.936637939,11.9370059265,11.9373738202,11.9377416201,11.9381093262,11.9384769387,11.9388444575,11.9392118827,11.9395792143,11.9399464525,11.9403135971,11.9406806484,11.9410476063,11.9414144709,11.9417812423,11.9421479204, 11.9425145053,11.9428809972,11.9432473959,11.9436137016,11.9439799143,11.9443460341,11.944712061,11.9450779951,11.9454438364,11.9458095849,11.9461752407,11.9465408039,11.9469062745,11.9472716525,11.947636938,11.948002131, 11.9483672316,11.9487322398,11.9490971557,11.9494619794,11.9498267108,11.95019135,11.950555897,11.950920352,11.951284715,11.9516489859,11.9520131649,11.952377252,11.9527412472,11.9531051506,11.9534689622,11.9538326821, 11.9541963104,11.954559847,11.954923292,11.9552866455,11.9556499075,11.9560130781,11.9563761572,11.9567391451,11.9571020416,11.9574648468,11.9578275608,11.9581901837,11.9585527154,11.9589151561,11.9592775057,11.9596397644, 11.9600019321,11.9603640089,11.9607259948,11.96108789,11.9614496944,11.9618114081,11.9621730311,11.9625345635,11.9628960053,11.9632573566,11.9636186174,11.9639797878,11.9643408678,11.9647018574,11.9650627567,11.9654235658, 11.9657842847,11.9661449133,11.9665054519,11.9668659004,11.9672262588,11.9675865273,11.9679467058,11.9683067944,11.9686667932,11.9690267022,11.9693865213,11.9697462508,11.9701058906,11.9704654408,11.9708249014,11.9711842724, 11.971543554,11.971902746,11.9722618487,11.9726208621,11.9729797861,11.9733386208,11.9736973663,11.9740560226,11.9744145898,11.9747730679,11.9751314569,11.9754897569,11.975847968,11.9762060901,11.9765641234,11.9769220679, 11.9772799235,11.9776376904,11.9779953686,11.9783529582,11.9787104591,11.9790678715,11.9794251953,11.9797824307,11.9801395776,11.9804966362,11.9808536064,11.9812104883,11.9815672819,11.9819239873,11.9822806046,11.9826371337, 11.9829935747,11.9833499277,11.9837061927,11.9840623697,11.9844184588,11.98477446,11.9851303735,11.9854861991,11.985841937,11.9861975872,11.9865531498,11.9869086247,11.9872640121,11.9876193119,11.9879745243,11.9883296492, 11.9886846868,11.989039637,11.9893944998,11.9897492755,11.9901039639,11.9904585651,11.9908130792,11.9911675061,11.9915218461,11.991876099,11.992230265,11.992584344,11.9929383362,11.9932922415,11.99364606,11.9939997918, 11.9943534369,11.9947069953,11.995060467,11.9954138522,11.9957671509,11.996120363,11.9964734887,11.996826528,11.9971794809,11.9975323475,11.9978851278,11.9982378219,11.9985904297,11.9989429514,11.999295387,11.9996477365, 12.0,12.0003521775,12.000704269,12.0010562746,12.0014081944,12.0017600283,12.0021117765,12.0024634389,12.0028150156,12.0031665067,12.0035179121,12.003869232,12.0042204663,12.0045716152,12.0049226786,12.0052736566, 12.0056245492,12.0059753565,12.0063260785,12.0066767153,12.0070272669,12.0073777333,12.0077281146,12.0080784109,12.0084286221,12.0087787483,12.0091287895,12.0094787459,12.0098286174,12.010178404,12.0105281059,12.010877723, 12.0112272554,12.0115767032,12.0119260663,12.0122753449,12.0126245389,12.0129736484,12.0133226734,12.0136716141,12.0140204703,12.0143692422,12.0147179299,12.0150665332,12.0154150524,12.0157634874,12.0161118382,12.016460105, 12.0168082877,12.0171563864,12.0175044011,12.0178523319,12.0182001788,12.0185479419,12.0188956211,12.0192432166,12.0195907284,12.0199381564,12.0202855008,12.0206327617,12.0209799389,12.0213270326,12.0216740429,12.0220209696, 12.022367813,12.022714573,12.0230612497,12.0234078431,12.0237543533,12.0241007803,12.024447124,12.0247933847,12.0251395623,12.0254856568,12.0258316683,12.0261775969,12.0265234425,12.0268692053,12.0272148852,12.0275604822, 12.0279059966,12.0282514282,12.0285967771,12.0289420433,12.029287227,12.029632328,12.0299773466,12.0303222826,12.0306671362,12.0310119074,12.0313565963,12.0317012027,12.0320457269,12.0323901689,12.0327345286,12.0330788061, 12.0334230015,12.0337671148,12.0341111461,12.0344550953,12.0347989626,12.0351427479,12.0354864513,12.0358300728,12.0361736126,12.0365170705,12.0368604467,12.0372037412,12.037546954,12.0378900851,12.0382331347,12.0385761028, 12.0389189893,12.0392617943,12.039604518,12.0399471602,12.040289721,12.0406322006,12.0409745988,12.0413169158,12.0416591516,12.0420013063,12.0423433798,12.0426853722,12.0430272836,12.043369114,12.0437108633,12.0440525318, 12.0443941194,12.0447356261,12.0450770519,12.045418397,12.0457596614,12.046100845,12.046441948,12.0467829704,12.0471239121,12.0474647733,12.047805554,12.0481462542,12.048486874,12.0488274134,12.0491678724,12.0495082511, 12.0498485495,12.0501887676,12.0505289055,12.0508689633,12.0512089409,12.0515488384,12.0518886559,12.0522283933,12.0525680508,12.0529076283,12.0532471259,12.0535865436,12.0539258815,12.0542651396,12.054604318,12.0549434166, 12.0552824355,12.0556213748,12.0559602345,12.0562990146,12.0566377151,12.0569763362,12.0573148778,12.05765334,12.0579917228,12.0583300262,12.0586682503,12.0590063952,12.0593444608,12.0596824472,12.0600203545,12.0603581826, 12.0606959317,12.0610336017,12.0613711927,12.0617087047,12.0620461377,12.0623834919,12.0627207672,12.0630579636,12.0633950813,12.0637321202,12.0640690804,12.0644059619,12.0647427648,12.065079489,12.0654161347,12.0657527018, 12.0660891905,12.0664256006,12.0667619324,12.0670981857,12.0674343608,12.0677704574,12.0681064759,12.068442416,12.068778278,12.0691140618,12.0694497674,12.069785395,12.0701209445,12.0704564159,12.0707918094,12.0711271249, 12.0714623626,12.0717975223,12.0721326042,12.0724676082,12.0728025345,12.0731373831,12.073472154,12.0738068472,12.0741414628,12.0744760007,12.0748104612,12.0751448441,12.0754791495,12.0758133775,12.076147528,12.0764816012, 12.0768155971,12.0771495156,12.0774833569,12.0778171209,12.0781508077,12.0784844174,12.07881795,12.0791514054,12.0794847838,12.0798180852,12.0801513096,12.0804844571,12.0808175276,12.0811505213,12.0814834381,12.0818162781, 12.0821490414,12.0824817279,12.0828143377,12.0831468708,12.0834793273,12.0838117073,12.0841440106,12.0844762375,12.0848083878,12.0851404617,12.0854724592,12.0858043803,12.086136225,12.0864679935,12.0867996856,12.0871313015, 12.0874628413,12.0877943048,12.0881256922,12.0884570035,12.0887882387,12.0891193979,12.0894504811,12.0897814884,12.0901124197,12.0904432751,12.0907740546,12.0911047584,12.0914353863,12.0917659385,12.092096415,12.0924268158, 12.0927571409,12.0930873904,12.0934175644,12.0937476628,12.0940776857,12.0944076331,12.094737505,12.0950673016,12.0953970228,12.0957266686,12.0960562392,12.0963857345,12.0967151545,12.0970444993,12.097373769,12.0977029635, 12.098032083,12.0983611273,12.0986900967,12.099018991,12.0993478104,12.0996765549,12.1000052244,12.1003338191,12.100662339,12.1009907841,12.1013191544,12.10164745,12.1019756709,12.1023038172,12.1026318889,12.1029598859, 12.1032878084,12.1036156564,12.1039434299,12.1042711289,12.1045987536,12.1049263038,12.1052537797,12.1055811813,12.1059085086,12.1062357616,12.1065629404,12.1068900451,12.1072170756,12.107544032,12.1078709143,12.1081977225, 12.1085244568,12.108851117,12.1091777034,12.1095042158,12.1098306543,12.110157019,12.1104833098,12.1108095269,12.1111356702,12.1114617399,12.1117877358,12.1121136581,12.1124395068,12.1127652819,12.1130909834,12.1134166115, 12.113742166,12.1140676472,12.1143930549,12.1147183892,12.1150436502,12.1153688378,12.1156939522,12.1160189933,12.1163439612,12.116668856,12.1169936775,12.117318426,12.1176431014,12.1179677037,12.118292233,12.1186166894, 12.1189410727,12.1192653832,12.1195896207,12.1199137855,12.1202378773,12.1205618964,12.1208858428,12.1212097164,12.1215335173,12.1218572456,12.1221809013,12.1225044843,12.1228279948,12.1231514328,12.1234747982,12.1237980913, 12.1241213118,12.12444446,12.1247675358,12.1250905393,12.1254134705,12.1257363294,12.1260591161,12.1263818305,12.1267044728,12.127027043,12.1273495411,12.127671967,12.127994321,12.1283166029,12.1286388129,12.1289609509, 12.1292830169,12.1296050112,12.1299269335,12.1302487841,12.1305705628,12.1308922698,12.1312139051,12.1315354687,12.1318569606,12.1321783809,12.1324997296,12.1328210068,12.1331422124,12.1334633465,12.1337844092,12.1341054004, 12.1344263202,12.1347471687,12.1350679458,12.1353886516,12.1357092861,12.1360298494,12.1363503415,12.1366707623,12.1369911121,12.1373113907,12.1376315982,12.1379517347,12.1382718002,12.1385917946,12.1389117181,12.1392315707, 12.1395513524,12.1398710632,12.1401907032,12.1405102724,12.1408297708,12.1411491984,12.1414685554,12.1417878417,12.1421070573,12.1424262023,12.1427452768,12.1430642806,12.143383214,12.1437020769,12.1440208693,12.1443395912, 12.1446582428,12.1449768241,12.1452953349,12.1456137755,12.1459321458,12.1462504459,12.1465686757,12.1468868354,12.1472049249,12.1475229444,12.1478408937,12.1481587729,12.1484765822,12.1487943214,12.1491119907,12.1494295901, 12.1497471195,12.1500645791,12.1503819688,12.1506992887,12.1510165389,12.1513337193,12.15165083,12.151967871,12.1522848423,12.152601744,12.1529185761,12.1532353387,12.1535520317,12.1538686552,12.1541852093,12.1545016939, 12.1548181091,12.1551344549,12.1554507313,12.1557669384,12.1560830763,12.1563991449,12.1567151442,12.1570310744,12.1573469354,12.1576627272,12.1579784499,12.1582941036,12.1586096882,12.1589252038,12.1592406504,12.1595560281, 12.1598713368,12.1601865766,12.1605017476,12.1608168497,12.161131883,12.1614468475,12.1617617433,12.1620765704,12.1623913288,12.1627060185,12.1630206396,12.1633351921,12.163649676,12.1639640914,12.1642784383,12.1645927167, 12.1649069267,12.1652210682,12.1655351414,12.1658491462,12.1661630826,12.1664769508,12.1667907507,12.1671044824,12.1674181458,12.1677317411,12.1680452682,12.1683587272,12.1686721181,12.168985441,12.1692986958,12.1696118826, 12.1699250014,12.1702380523,12.1705510353,12.1708639504,12.1711767977,12.1714895771,12.1718022887,12.1721149325,12.1724275086,12.172740017,12.1730524578,12.1733648308,12.1736771363,12.1739893742,12.1743015445,12.1746136472, 12.1749256825,12.1752376503,12.1755495506,12.1758613836,12.1761731491,12.1764848473,12.1767964781,12.1771080417,12.177419538,12.177730967,12.1780423289,12.1783536235,12.178664851,12.1789760114,12.1792871046,12.1795981308, 12.17990909,12.1802199822,12.1805308073,12.1808415656,12.1811522569,12.1814628813,12.1817734388,12.1820839295,12.1823943534,12.1827047105,12.1830150009,12.1833252245,12.1836353815,12.1839454718,12.1842554954,12.1845654524, 12.1848753429,12.1851851668,12.1854949242,12.1858046151,12.1861142395,12.1864237975,12.1867332891,12.1870427143,12.1873520732,12.1876613657,12.187970592,12.188279752,12.1885888457,12.1888978732,12.1892068346,12.1895157298, 12.1898245589,12.1901333219,12.1904420188,12.1907506497,12.1910592145,12.1913677134,12.1916761464,12.1919845134,12.1922928145,12.1926010497,12.1929092191,12.1932173227,12.1935253605,12.1938333325,12.1941412389,12.1944490795, 12.1947568544,12.1950645637,12.1953722074,12.1956797855,12.195987298,12.196294745,12.1966021265,12.1969094425,12.1972166931,12.1975238783,12.197830998,12.1981380524,12.1984450415,12.1987519652,12.1990588237,12.1993656169, 12.1996723448,12.1999790076,12.2002856052,12.2005921377,12.200898605,12.2012050073,12.2015113445,12.2018176167,12.2021238238,12.202429966,12.2027360433,12.2030420556,12.203348003,12.2036538855,12.2039597032,12.2042654561, 12.2045711442,12.2048767676,12.2051823262,12.2054878202,12.2057932494,12.206098614,12.206403914,12.2067091494,12.2070143202,12.2073194265,12.2076244682,12.2079294455,12.2082343583,12.2085392067,12.2088439907,12.2091487104, 12.2094533656,12.2097579566,12.2100624832,12.2103669456,12.2106713438,12.2109756777,12.2112799475,12.2115841531,12.2118882945,12.2121923719,12.2124963852,12.2128003344,12.2131042196,12.2134080409,12.2137117981,12.2140154914, 12.2143191208,12.2146226863,12.2149261879,12.2152296257,12.2155329997,12.21583631,12.2161395564,12.2164427392,12.2167458582,12.2170489136,12.2173519053,12.2176548334,12.2179576979,12.2182604988,12.2185632362,12.2188659101, 12.2191685205,12.2194710674,12.2197735509,12.220075971,12.2203783277,12.2206806211,12.2209828511,12.2212850178,12.2215871213,12.2218891615,12.2221911385,12.2224930522,12.2227949029,12.2230966903,12.2233984147,12.223700076, 12.2240016742,12.2243032094,12.2246046815,12.2249060907,12.2252074369,12.2255087202,12.2258099406,12.2261110981,12.2264121928,12.2267132246,12.2270141936,12.2273150999,12.2276159434,12.2279167242,12.2282174423,12.2285180977, 12.2288186905,12.2291192207,12.2294196882,12.2297200932,12.2300204357,12.2303207157,12.2306209331,12.2309210881,12.2312211807,12.2315212109,12.2318211787,12.2321210841,12.2324209272,12.232720708,12.2330204265,12.2333200827, 12.2336196768,12.2339192086,12.2342186782,12.2345180857,12.2348174311,12.2351167144,12.2354159356,12.2357150948,12.2360141919,12.236313227,12.2366122002,12.2369111114,12.2372099608,12.2375087482,12.2378074737,12.2381061374, 12.2384047393,12.2387032794,12.2390017578,12.2393001744,12.2395985292,12.2398968224,12.240195054,12.2404932239,12.2407913322,12.2410893789,12.241387364,12.2416852876,12.2419831497,12.2422809503,12.2425786895,12.2428763672, 12.2431739835,12.2434715384,12.243769032,12.2440664642,12.2443638351,12.2446611448,12.2449583932,12.2452555803,12.2455527063,12.245849771,12.2461467746,12.2464437171,12.2467405985,12.2470374188,12.247334178,12.2476308762, 12.2479275134,12.2482240897,12.2485206049,12.2488170593,12.2491134527,12.2494097853,12.249706057,12.2500022678,12.2502984179,12.2505945072,12.2508905357,12.2511865035,12.2514824106,12.251778257,12.2520740428,12.2523697679, 12.2526654325,12.2529610364,12.2532565798,12.2535520626,12.253847485,12.2541428469,12.2544381483,12.2547333892,12.2550285698,12.25532369,12.2556187498,12.2559137493,12.2562086885,12.2565035674,12.2567983861,12.2570931445, 12.2573878427,12.2576824807,12.2579770586,12.2582715763,12.2585660339,12.2588604314,12.2591547689,12.2594490463,12.2597432637,12.2600374211,12.2603315186,12.2606255561,12.2609195337,12.2612134514,12.2615073092,12.2618011072, 12.2620948454,12.2623885238,12.2626821424,12.2629757012,12.2632692004,12.2635626398,12.2638560196,12.2641493397,12.2644426002,12.2647358011,12.2650289425,12.2653220242,12.2656150465,12.2659080092,12.2662009125,12.2664937563, 12.2667865407,12.2670792657,12.2673719313,12.2676645375,12.2679570844,12.268249572,12.2685420003,12.2688343693,12.2691266791,12.2694189297,12.2697111211,12.2700032534,12.2702953265,12.2705873404,12.2708792953,12.2711711911, 12.2714630279,12.2717548056,12.2720465244,12.2723381842,12.272629785,12.2729213269,12.2732128099,12.273504234,12.2737955992,12.2740869056,12.2743781532,12.2746693421,12.2749604721,12.2752515435,12.2755425561,12.27583351, 12.2761244053,12.2764152419,12.2767060199,12.2769967393,12.2772874001,12.2775780024,12.2778685462,12.2781590314,12.2784494582,12.2787398266,12.2790301364,12.2793203879,12.2796105811,12.2799007158,12.2801907922,12.2804808103, 12.2807707701,12.2810606717,12.281350515,12.2816403001,12.281930027,12.2822196957,12.2825093062,12.2827988587,12.283088353,12.2833777893,12.2836671675,12.2839564877,12.2842457498,12.284534954,12.2848241002,12.2851131885, 12.2854022189,12.2856911913,12.2859801059,12.2862689627,12.2865577616,12.2868465027,12.2871351861,12.2874238117,12.2877123795,12.2880008897,12.2882893422,12.288577737,12.2888660742,12.2891543537,12.2894425757,12.2897307401, 12.2900188469,12.2903068963,12.2905948881,12.2908828224,12.2911706993,12.2914585188,12.2917462808,12.2920339855,12.2923216328,12.2926092228,12.2928967554,12.2931842308,12.2934716488,12.2937590097,12.2940463133,12.2943335597, 12.2946207489,12.294907881,12.2951949559,12.2954819737,12.2957689344,12.2960558381,12.2963426847,12.2966294743,12.2969162069,12.2972028825,12.2974895012,12.2977760629,12.2980625677,12.2983490157,12.2986354067,12.298921741, 12.2992080184,12.299494239,12.2997804029,12.30006651,12.3003525603,12.300638554,12.300924491,12.3012103713,12.301496195,12.3017819621,12.3020676725,12.3023533264,12.3026389238,12.3029244646,12.3032099489,12.3034953768, 12.3037807482,12.3040660631,12.3043513217,12.3046365238,12.3049216696,12.305206759,12.3054917921,12.3057767689,12.3060616894,12.3063465537,12.3066313617,12.3069161135,12.3072008091,12.3074854486,12.3077700319,12.3080545591, 12.3083390301,12.3086234451,12.3089078041,12.309192107,12.3094763538,12.3097605447,12.3100446796,12.3103287586,12.3106127817,12.3108967488,12.3111806601,12.3114645154,12.311748315,12.3120320587,12.3123157467,12.3125993789, 12.3128829553,12.313166476,12.313449941,12.3137333503,12.3140167039,12.3143000019,12.3145832443,12.3148664311,12.3151495623,12.3154326379,12.315715658,12.3159986226,12.3162815317,12.3165643854,12.3168471836,12.3171299264, 12.3174126138,12.3176952458,12.3179778224,12.3182603437,12.3185428097,12.3188252204,12.3191075758,12.319389876,12.3196721209,12.3199543107,12.3202364452,12.3205185246,12.3208005489,12.321082518,12.321364432,12.321646291, 12.3219280949,12.3222098437,12.3224915376,12.3227731765,12.3230547603,12.3233362893,12.3236177633,12.3238991824,12.3241805466,12.324461856,12.3247431105,12.3250243102,12.3253054551,12.3255865452,12.3258675806,12.3261485612, 12.3264294871,12.3267103583,12.3269911749,12.3272719368,12.3275526441,12.3278332968,12.3281138948,12.3283944384,12.3286749273,12.3289553618,12.3292357417,12.3295160672,12.3297963382,12.3300765548,12.330356717,12.3306368247, 12.3309168781,12.3311968772,12.3314768219,12.3317567123,12.3320365484,12.3323163302,12.3325960578,12.3328757312,12.3331553503,12.3334349153,12.3337144261,12.3339938828,12.3342732853,12.3345526338,12.3348319281,12.3351111684, 12.3353903547,12.3356694869,12.3359485652,12.3362275895,12.3365065598,12.3367854762,12.3370643387,12.3373431473,12.337621902,12.3379006029,12.3381792499,12.3384578431,12.3387363826,12.3390148683,12.3392933002,12.3395716784, 12.3398500029,12.3401282737,12.3404064909,12.3406846544,12.3409627643,12.3412408205,12.3415188232,12.3417967724,12.342074668,12.3423525101,12.3426302987,12.3429080338,12.3431857154,12.3434633437,12.3437409185,12.3440184399, 12.3442959079,12.3445733226,12.3448506839,12.345127992,12.3454052467,12.3456824482,12.3459595964,12.3462366914,12.3465137332,12.3467907218,12.3470676572,12.3473445394,12.3476213686,12.3478981446,12.3481748675,12.3484515374, 12.3487281542,12.349004718,12.3492812288,12.3495576866,12.3498340915,12.3501104433,12.3503867423,12.3506629884,12.3509391815,12.3512153219,12.3514914093,12.351767444,12.3520434258,12.3523193548,12.3525952311,12.3528710547, 12.3531468255,12.3534225436,12.353698209,12.3539738218,12.3542493819,12.3545248894,12.3548003444,12.3550757467,12.3553510964,12.3556263936,12.3559016383,12.3561768305,12.3564519702,12.3567270575,12.3570020923,12.3572770746, 12.3575520046,12.3578268822,12.3581017074,12.3583764803,12.3586512009,12.3589258692,12.3592004851,12.3594750488,12.3597495603,12.3600240196,12.3602984266,12.3605727815,12.3608470842,12.3611213347,12.3613955332,12.3616696795, 12.3619437737,12.3622178159,12.362491806,12.3627657442,12.3630396303,12.3633134644,12.3635872465,12.3638609767,12.364134655,12.3644082814,12.3646818559,12.3649553785,12.3652288493,12.3655022682,12.3657756353,12.3660489507, 12.3663222142,12.3665954261,12.3668685862,12.3671416946,12.3674147512,12.3676877563,12.3679607096,12.3682336114,12.3685064615,12.36877926,12.369052007,12.3693247024,12.3695973463,12.3698699386,12.3701424795,12.3704149689, 12.3706874068,12.3709597933,12.3712321284,12.371504412,12.3717766443,12.3720488253,12.3723209549,12.3725930331,12.3728650601,12.3731370358,12.3734089602,12.3736808334,12.3739526554,12.3742244261,12.3744961457,12.3747678141, 12.3750394313,12.3753109975,12.3755825125,12.3758539764,12.3761253893,12.3763967511,12.3766680619,12.3769393216,12.3772105304,12.3774816882,12.377752795,12.3780238509,12.3782948559,12.37856581,12.3788367132,12.3791075656, 12.3793783671,12.3796491178,12.3799198176,12.3801904667,12.3804610651,12.3807316127,12.3810021096,12.3812725557,12.3815429512,12.381813296,12.3820835901,12.3823538337,12.3826240266,12.3828941689,12.3831642606,12.3834343018, 12.3837042925,12.3839742326,12.3842441222,12.3845139614,12.3847837501,12.3850534883,12.3853231762,12.3855928136,12.3858624006,12.3861319373,12.3864014236,12.3866708596,12.3869402453,12.3872095807,12.3874788658,12.3877481007, 12.3880172853,12.3882864198,12.388555504,12.388824538,12.3890935219,12.3893624556,12.3896313393,12.3899001728,12.3901689562,12.3904376896,12.3907063729,12.3909750062,12.3912435894,12.3915121227,12.391780606,12.3920490394, 12.3923174228,12.3925857563,12.3928540399,12.3931222736,12.3933904574,12.3936585915,12.3939266756,12.39419471,12.3944626946,12.3947306294,12.3949985145,12.3952663498,12.3955341355,12.3958018714,12.3960695576,12.3963371942, 12.3966047812,12.3968723185,12.3971398062,12.3974072444,12.3976746329,12.397941972,12.3982092615,12.3984765014,12.3987436919,12.399010833,12.3992779245,12.3995449666,12.3998119593,12.4000789026,12.4003457965,12.4006126411, 12.4008794363,12.4011461822,12.4014128787,12.401679526,12.401946124,12.4022126727,12.4024791722,12.4027456225,12.4030120236,12.4032783755,12.4035446782,12.4038109318,12.4040771362,12.4043432916,12.4046093978,12.404875455, 12.4051414631,12.4054074222,12.4056733323,12.4059391933,12.4062050054,12.4064707685,12.4067364827,12.4070021479,12.4072677642,12.4075333317,12.4077988502,12.4080643199,12.4083297408,12.4085951128,12.408860436,12.4091257105, 12.4093909361,12.4096561131,12.4099212412,12.4101863207,12.4104513515,12.4107163336,12.410981267,12.4112461518,12.411510988,12.4117757756,12.4120405146,12.412305205,12.4125698468,12.4128344401,12.4130989849,12.4133634812, 12.413627929,12.4138923284,12.4141566793,12.4144209817,12.4146852358,12.4149494415,12.4152135988,12.4154777077,12.4157417683,12.4160057806,12.4162697445,12.4165336602,12.4167975276,12.4170613468,12.4173251177,12.4175888404, 12.4178525149,12.4181161412,12.4183797194,12.4186432494,12.4189067313,12.419170165,12.4194335507,12.4196968883,12.4199601778,12.4202234193,12.4204866128,12.4207497583,12.4210128558,12.4212759053,12.4215389068,12.4218018605, 12.4220647662,12.422327624,12.4225904339,12.4228531959,12.4231159101,12.4233785765,12.4236411951,12.4239037658,12.4241662888,12.424428764,12.4246911915,12.4249535713,12.4252159033,12.4254781876,12.4257404243,12.4260026133, 12.4262647547,12.4265268485,12.4267888946,12.4270508932,12.4273128441,12.4275747476,12.4278366035,12.4280984118,12.4283601727,12.4286218861,12.428883552,12.4291451705,12.4294067415,12.4296682651,12.4299297414,12.4301911702, 12.4304525517,12.4307138858,12.4309751726,12.4312364121,12.4314976043,12.4317587492,12.4320198468,12.4322808972,12.4325419004,12.4328028564,12.4330637651,12.4333246267,12.4335854412,12.4338462084,12.4341069286,12.4343676017, 12.4346282276,12.4348888065,12.4351493384,12.4354098232,12.4356702609,12.4359306517,12.4361909955,12.4364512923,12.4367115421,12.436971745,12.437231901,12.4374920101,12.4377520723,12.4380120877,12.4382720561,12.4385319778, 12.4387918526,12.4390516806,12.4393114618,12.4395711963,12.439830884,12.440090525,12.4403501192,12.4406096667,12.4408691676,12.4411286218,12.4413880293,12.4416473903,12.4419067045,12.4421659722,12.4424251933,12.4426843679, 12.4429434958,12.4432025773,12.4434616122,12.4437206007,12.4439795426,12.4442384381,12.4444972871,12.4447560897,12.4450148459,12.4452735556,12.445532219,12.445790836,12.4460494067,12.4463079311,12.4465664091,12.4468248408, 12.4470832262,12.4473415654,12.4475998583,12.447858105,12.4481163054,12.4483744597,12.4486325677,12.4488906296,12.4491486454,12.449406615,12.4496645385,12.4499224159,12.4501802472,12.4504380324,12.4506957716,12.4509534647, 12.4512111118,12.4514687129,12.4517262681,12.4519837772,12.4522412404,12.4524986577,12.452756029,12.4530133545,12.453270634,12.4535278677,12.4537850555,12.4540421975,12.4542992936,12.454556344,12.4548133485,12.4550703073, 12.4553272203,12.4555840876,12.4558409091,12.456097685,12.4563544151,12.4566110996,12.4568677384,12.4571243315,12.4573808791,12.457637381,12.4578938373,12.4581502481,12.4584066132,12.4586629329,12.458919207,12.4591754356, 12.4594316186,12.4596877562,12.4599438484,12.4601998951,12.4604558963,12.4607118521,12.4609677626,12.4612236276,12.4614794473,12.4617352216,12.4619909506,12.4622466342,12.4625022726,12.4627578657,12.4630134134,12.463268916, 12.4635243733,12.4637797853,12.4640351522,12.4642904739,12.4645457503,12.4648009817,12.4650561678,12.4653113089,12.4655664048,12.4658214556,12.4660764614,12.4663314221,12.4665863377,12.4668412083,12.4670960339,12.4673508145, 12.4676055501,12.4678602407,12.4681148864,12.4683694871,12.4686240429,12.4688785538,12.4691330198,12.469387441,12.4696418172,12.4698961487,12.4701504353,12.4704046771,12.4706588741,12.4709130263,12.4711671337,12.4714211964, 12.4716752144,12.4719291876,12.4721831162,12.4724370001,12.4726908392,12.4729446338,12.4731983837,12.473452089,12.4737057496,12.4739593657,12.4742129372,12.4744664641,12.4747199465,12.4749733844,12.4752267777,12.4754801266, 12.475733431,12.4759866909,12.4762399063,12.4764930773,12.4767462039,12.4769992861,12.4772523239,12.4775053174,12.4777582664,12.4780111712,12.4782640316,12.4785168477,12.4787696195,12.479022347,12.4792750303,12.4795276693, 12.479780264,12.4800328146,12.4802853209,12.4805377831,12.4807902011,12.4810425749,12.4812949046,12.4815471902,12.4817994317,12.482051629,12.4823037823,12.4825558915,12.4828079567,12.4830599779,12.483311955,12.4835638881, 12.4838157773,12.4840676224,12.4843194236,12.4845711809,12.4848228943,12.4850745637,12.4853261892,12.4855777709,12.4858293087,12.4860808027,12.4863322528,12.4865836591,12.4868350216,12.4870863403,12.4873376152,12.4875888464, 12.4878400338,12.4880911775,12.4883422775,12.4885933338,12.4888443465,12.4890953154,12.4893462407,12.4895971224,12.4898479604,12.4900987549,12.4903495057,12.490600213,12.4908508767,12.4911014969,12.4913520736,12.4916026067, 12.4918530963,12.4921035425,12.4923539452,12.4926043044,12.4928546202,12.4931048925,12.4933551215,12.4936053071,12.4938554492,12.4941055481,12.4943556035,12.4946056157,12.4948555845,12.49510551,12.4953553922,12.4956052312, 12.4958550269,12.4961047793,12.4963544886,12.4966041546,12.4968537774,12.497103357,12.4973528935,12.4976023868,12.497851837,12.498101244,12.4983506079,12.4985999288,12.4988492065,12.4990984412,12.4993476329,12.4995967815, 12.4998458871,12.5000949497,12.5003439693,12.5005929459,12.5008418796,12.5010907703,12.5013396181,12.5015884229,12.5018371849,12.502085904,12.5023345802,12.5025832136,12.5028318041,12.5030803518,12.5033288566,12.5035773187, 12.503825738,12.5040741145,12.5043224483,12.5045707393,12.5048189876,12.5050671932,12.5053153561,12.5055634764,12.5058115539,12.5060595888,12.5063075811,12.5065555308,12.5068034378,12.5070513022,12.5072991241,12.5075469034, 12.5077946402,12.5080423344,12.5082899861,12.5085375953,12.5087851621,12.5090326863,12.5092801681,12.5095276074,12.5097750043,12.5100223588,12.5102696709,12.5105169406,12.5107641679,12.5110113529,12.5112584955,12.5115055958, 12.5117526538,12.5119996694,12.5122466428,12.5124935739,12.5127404628,12.5129873094,12.5132341138,12.513480876,12.513727596,12.5139742737,12.5142209094,12.5144675028,12.5147140541,12.5149605633,12.5152070304,12.5154534554, 12.5156998383,12.5159461791,12.5161924779,12.5164387346,12.5166849493,12.516931122,12.5171772527,12.5174233414,12.5176693881,12.5179153929,12.5181613558,12.5184072767,12.5186531557,12.5188989928,12.519144788,12.5193905413, 12.5196362528,12.5198819225,12.5201275503,12.5203731363,12.5206186806,12.520864183,12.5211096437,12.5213550626,12.5216004397,12.5218457752,12.5220910689,12.5223363209,12.5225815313,12.5228266999,12.5230718269,12.5233169123, 12.5235619561,12.5238069582,12.5240519187,12.5242968377,12.524541715,12.5247865509,12.5250313451,12.5252760979,12.5255208091,12.5257654788,12.5260101071,12.5262546938,12.5264992391,12.526743743,12.5269882054,12.5272326264, 12.5274770061,12.5277213443,12.5279656411,12.5282098966,12.5284541108,12.5286982836,12.5289424151,12.5291865053,12.5294305541,12.5296745618,12.5299185281,12.5301624532,12.5304063371,12.5306501798,12.5308939812,12.5311377414, 12.5313814605,12.5316251384,12.5318687752,12.5321123708,12.5323559253,12.5325994387,12.532842911,12.5330863422,12.5333297323,12.5335730814,12.5338163894,12.5340596565,12.5343028825,12.5345460675,12.5347892115,12.5350323145, 12.5352753766,12.5355183978,12.535761378,12.5360043173,12.5362472157,12.5364900732,12.5367328898,12.5369756656,12.5372184005,12.5374610946,12.5377037479,12.5379463604,12.5381889321,12.538431463,12.5386739531,12.5389164025, 12.5391588111,12.539401179,12.5396435062,12.5398857928,12.5401280386,12.5403702437,12.5406124082,12.5408545321,12.5410966153,12.541338658,12.54158066,12.5418226214,12.5420645423,12.5423064226,12.5425482623,12.5427900616, 12.5430318203,12.5432735384,12.5435152162,12.5437568534,12.5439984501,12.5442400064,12.5444815223,12.5447229978,12.5449644328,12.5452058274,12.5454471817,12.5456884956,12.5459297691,12.5461710023,12.5464121951,12.5466533477, 12.5468944599,12.5471355318,12.5473765635,12.5476175549,12.5478585061,12.548099417,12.5483402877,12.5485811182,12.5488219085,12.5490626586,12.5493033685,12.5495440383,12.5497846679,12.5500252575,12.5502658069,12.5505063162, 12.5507467854,12.5509872145,12.5512276036,12.5514679526,12.5517082616,12.5519485306,12.5521887596,12.5524289485,12.5526690975,12.5529092065,12.5531492756,12.5533893047,12.5536292939,12.5538692432,12.5541091526,12.5543490221, 12.5545888517,12.5548286414,12.5550683913,12.5553081014,12.5555477716,12.5557874021,12.5560269927,12.5562665436,12.5565060547,12.556745526,12.5569849576,12.5572243495,12.5574637016,12.557703014,12.5579422868,12.5581815199, 12.5584207133,12.558659867,12.5588989811,12.5591380556,12.5593770905,12.5596160858,12.5598550415,12.5600939576,12.5603328342,12.5605716712,12.5608104687,12.5610492267,12.5612879452,12.5615266241,12.5617652636,12.5620038637, 12.5622424242,12.5624809453,12.562719427,12.5629578693,12.5631962722,12.5634346357,12.5636729598,12.5639112446,12.56414949,12.5643876961,12.5646258628,12.5648639902,12.5651020784,12.5653401272,12.5655781368,12.5658161071, 12.5660540382,12.56629193,12.5665297826,12.566767596,12.5670053702,12.5672431053,12.5674808011,12.5677184579,12.5679560754,12.5681936539,12.5684311932,12.5686686934,12.5689061545,12.5691435765,12.5693809595,12.5696183034, 12.5698556083,12.5700928742,12.570330101,12.5705672889,12.5708044377,12.5710415476,12.5712786185,12.5715156505,12.5717526435,12.5719895976,12.5722265128,12.5724633891,12.5727002265,12.572937025,12.5731737847,12.5734105055, 12.5736471875,12.5738838307,12.574120435,12.5743570006,12.5745935273,12.5748300153,12.5750664646,12.5753028751,12.5755392468,12.5757755799,12.5760118742,12.5762481298,12.5764843468,12.5767205251,12.5769566647,12.5771927657, 12.577428828,12.5776648518,12.5779008369,12.5781367834,12.5783726914,12.5786085607,12.5788443916,12.5790801838,12.5793159376,12.5795516528,12.5797873295,12.5800229678,12.5802585675,12.5804941288,12.5807296516,12.580965136, 12.5812005819,12.5814359895,12.5816713586,12.5819066893,12.5821419817,12.5823772356,12.5826124513,12.5828476286,12.5830827675,12.5833178681,12.5835529305,12.5837879545,12.5840229403,12.5842578877,12.584492797,12.584727668, 12.5849625007,12.5851972953,12.5854320516,12.5856667697,12.5859014497,12.5861360915,12.5863706951,12.5866052606,12.586839788,12.5870742772,12.5873087283,12.5875431414,12.5877775163,12.5880118532,12.588246152,12.5884804128, 12.5887146356,12.5889488203,12.589182967,12.5894170758,12.5896511465,12.5898851793,12.5901191741,12.590353131,12.5905870499,12.5908209309,12.591054774,12.5912885792,12.5915223466,12.591756076,12.5919897676,12.5922234214, 12.5924570373,12.5926906154,12.5929241556,12.5931576581,12.5933911228,12.5936245497,12.5938579389,12.5940912903,12.5943246039,12.5945578799,12.5947911181,12.5950243186,12.5952574814,12.5954906066,12.5957236941,12.5959567439, 12.5961897561,12.5964227307,12.5966556677,12.596888567,12.5971214288,12.597354253,12.5975870396,12.5978197886,12.5980525002,12.5982851741,12.5985178106,12.5987504096,12.598982971,12.599215495,12.5994479815,12.5996804306, 12.5999128422,12.6001452164,12.6003775531,12.6006098524,12.6008421144,12.6010743389,12.6013065261,12.6015386759,12.6017707884,12.6020028635,12.6022349013,12.6024669018,12.602698865,12.6029307909,12.6031626795,12.6033945309, 12.603626345,12.6038581218,12.6040898615,12.6043215639,12.6045532291,12.6047848571,12.6050164479,12.6052480016,12.6054795181,12.6057109974,12.6059424396,12.6061738447,12.6064052127,12.6066365436,12.6068678374,12.6070990941, 12.6073303137,12.6075614964,12.6077926419,12.6080237505,12.608254822,12.6084858565,12.608716854,12.6089478146,12.6091787381,12.6094096248,12.6096404744,12.6098712872,12.610102063,12.6103328019,12.6105635039,12.6107941691, 12.6110247973,12.6112553887,12.6114859432,12.6117164609,12.6119469418,12.6121773859,12.6124077931,12.6126381636,12.6128684973,12.6130987942,12.6133290544,12.6135592778,12.6137894645,12.6140196144,12.6142497277,12.6144798042, 12.6147098441,12.6149398473,12.6151698138,12.6153997437,12.615629637,12.6158594936,12.6160893136,12.616319097,12.6165488438,12.616778554,12.6170082277,12.6172378647,12.6174674653,12.6176970293,12.6179265568,12.6181560478, 12.6183855023,12.6186149203,12.6188443018,12.6190736468,12.6193029554,12.6195322276,12.6197614633,12.6199906626,12.6202198255,12.620448952,12.6206780421,12.6209070959,12.6211361133,12.6213650943,12.621594039,12.6218229474, 12.6220518195,12.6222806552,12.6225094547,12.6227382179,12.6229669448,12.6231956355,12.6234242899,12.6236529081,12.62388149,12.6241100358,12.6243385453,12.6245670187,12.6247954559,12.6250238569,12.6252522217,12.6254805505, 12.6257088431,12.6259370995,12.6261653199,12.6263935042,12.6266216524,12.6268497645,12.6270778405,12.6273058805,12.6275338845,12.6277618524,12.6279897843,12.6282176802,12.6284455401,12.6286733641,12.628901152,12.629128904, 12.6293566201,12.6295843002,12.6298119444,12.6300395527,12.630267125,12.6304946615,12.6307221621,12.6309496268,12.6311770557,12.6314044487,12.6316318059,12.6318591273,12.6320864128,12.6323136626,12.6325408765,12.6327680547, 12.6329951971,12.6332223038,12.6334493747,12.6336764099,12.6339034093,12.6341303731,12.6343573011,12.6345841935,12.6348110502,12.6350378712,12.6352646565,12.6354914063,12.6357181203,12.6359447988,12.6361714416,12.6363980489, 12.6366246205,12.6368511566,12.6370776571,12.6373041221,12.6375305515,12.6377569454,12.6379833038,12.6382096266,12.638435914,12.6386621659,12.6388883823,12.6391145632,12.6393407087,12.6395668187,12.6397928933,12.6400189325, 12.6402449362,12.6404709046,12.6406968376,12.6409227352,12.6411485974,12.6413744243,12.6416002158,12.641825972,12.6420516929,12.6422773785,12.6425030288,12.6427286438,12.6429542235,12.6431797679,12.6434052771,12.6436307511, 12.6438561898,12.6440815933,12.6443069615,12.6445322946,12.6447575925,12.6449828552,12.6452080828,12.6454332752,12.6456584324,12.6458835545,12.6461086415,12.6463336934,12.6465587102,12.6467836918,12.6470086384,12.64723355, 12.6474584265,12.6476832679,12.6479080743,12.6481328457,12.648357582,12.6485822834,12.6488069497,12.6490315811,12.6492561775,12.649480739,12.6497052655,12.649929757,12.6501542137,12.6503786354,12.6506030222,12.6508273741, 12.6510516912,12.6512759733,12.6515002207,12.6517244331,12.6519486107,12.6521727535,12.6523968615,12.6526209346,12.652844973,12.6530689766,12.6532929454,12.6535168794,12.6537407787,12.6539646432,12.6541884731,12.6544122681, 12.6546360285,12.6548597542,12.6550834452,12.6553071015,12.6555307232,12.6557543101,12.6559778625,12.6562013802,12.6564248633,12.6566483117,12.6568717256,12.6570951049,12.6573184496,12.6575417597,12.6577650353,12.6579882763, 12.6582114828,12.6584346547,12.6586577921,12.658880895,12.6591039635,12.6593269974,12.6595499969,12.6597729619,12.6599958924,12.6602187885,12.6604416502,12.6606644775,12.6608872703,12.6611100287,12.6613327528,12.6615554425, 12.6617780978,12.6620007187,12.6622233053,12.6624458576,12.6626683755,12.6628908591,12.6631133085,12.6633357235,12.6635581042,12.6637804507,12.6640027629,12.6642250408,12.6644472845,12.664669494,12.6648916693,12.6651138103, 12.6653359172,12.6655579898,12.6657800283,12.6660020326,12.6662240028,12.6664459388,12.6666678407,12.6668897084,12.6671115421,12.6673333416,12.667555107,12.6677768384,12.6679985357,12.6682201989,12.6684418281,12.6686634232, 12.6688849843,12.6691065113,12.6693280044,12.6695494635,12.6697708885,12.6699922796,12.6702136367,12.6704349599,12.6706562491,12.6708775044,12.6710987257,12.6713199132,12.6715410667,12.6717621863,12.6719832721,12.672204324, 12.672425342,12.6726463261,12.6728672764,12.6730881929,12.6733090756,12.6735299244,12.6737507394,12.6739715207,12.6741922681,12.6744129818,12.6746336618,12.6748543079,12.6750749204,12.6752954991,12.6755160441,12.6757365554, 12.6759570329,12.6761774768,12.676397887,12.6766182636,12.6768386065,12.6770589157,12.6772791913,12.6774994333,12.6777196416,12.6779398164,12.6781599575,12.6783800651,12.6786001391,12.6788201795,12.6790401864,12.6792601597, 12.6794800995,12.6797000058,12.6799198785,12.6801397178,12.6803595235,12.6805792958,12.6807990346,12.6810187399,12.6812384118,12.6814580502,12.6816776552,12.6818972268,12.682116765,12.6823362697,12.6825557411,12.6827751791, 12.6829945837,12.6832139549,12.6834332928,12.6836525974,12.6838718686,12.6840911065,12.6843103111,12.6845294824,12.6847486204,12.6849677251,12.6851867966,12.6854058348,12.6856248397,12.6858438114,12.6860627499,12.6862816551, 12.6865005272,12.686719366,12.6869381717,12.6871569441,12.6873756834,12.6875943896,12.6878130626,12.6880317024,12.6882503091,12.6884688827,12.6886874232,12.6889059306,12.6891244049,12.6893428461,12.6895612543,12.6897796294, 12.6899979714,12.6902162804,12.6904345564,12.6906527993,12.6908710093,12.6910891862,12.6913073302,12.6915254412,12.6917435192,12.6919615642,12.6921795763,12.6923975555,12.6926155017,12.692833415,12.6930512954,12.6932691429, 12.6934869575,12.6937047392,12.6939224881,12.6941402041,12.6943578872,12.6945755375,12.694793155,12.6950107397,12.6952282915,12.6954458105,12.6956632968,12.6958807503,12.696098171,12.6963155589,12.6965329141,12.6967502365, 12.6969675262,12.6971847832,12.6974020075,12.6976191991,12.697836358,12.6980534842,12.6982705777,12.6984876386,12.6987046668,12.6989216623,12.6991386253,12.6993555556,12.6995724533,12.6997893184,12.7000061509,12.7002229508, 12.7004397181,12.7006564529,12.7008731551,12.7010898248,12.701306462,12.7015230666,12.7017396387,12.7019561783,12.7021726854,12.70238916,12.7026056021,12.7028220118,12.703038389,12.7032547337,12.7034710461,12.703687326, 12.7039035734,12.7041197885,12.7043359712,12.7045521215,12.7047682394,12.7049843249,12.7052003781,12.7054163989,12.7056323874,12.7058483435,12.7060642673,12.7062801588,12.7064960181,12.706711845,12.7069276396,12.707143402, 12.7073591321,12.7075748299,12.7077904955,12.7080061289,12.70822173,12.708437299,12.7086528357,12.7088683402,12.7090838126,12.7092992527,12.7095146607,12.7097300365,12.7099453802,12.7101606918,12.7103759712,12.7105912185, 12.7108064337,12.7110216168,12.7112367678,12.7114518867,12.7116669736,12.7118820284,12.7120970511,12.7123120418,12.7125270004,12.7127419271,12.7129568217,12.7131716843,12.7133865149,12.7136013136,12.7138160802,12.7140308149, 12.7142455177,12.7144601885,12.7146748273,12.7148894342,12.7151040092,12.7153185523,12.7155330635,12.7157475428,12.7159619903,12.7161764058,12.7163907895,12.7166051413,12.7168194613,12.7170337495,12.7172480058,12.7174622303, 12.7176764231,12.717890584,12.7181047131,12.7183188105,12.7185328761,12.7187469099,12.718960912,12.7191748823,12.7193888209,12.7196027278,12.719816603,12.7200304465,12.7202442583,12.7204580384,12.7206717868,12.7208855036, 12.7210991887,12.7213128422,12.721526464,12.7217400542,12.7219536128,12.7221671398,12.7223806352,12.722594099,12.7228075312,12.7230209318,12.7232343009,12.7234476384,12.7236609444,12.7238742189,12.7240874618,12.7243006732, 12.7245138531,12.7247270015,12.7249401185,12.7251532039,12.7253662579,12.7255792804,12.7257922715,12.7260052311,12.7262181593,12.7264310561,12.7266439215,12.7268567555,12.727069558,12.7272823292,12.727495069,12.7277077775, 12.7279204546,12.7281331003,12.7283457147,12.7285582978,12.7287708495,12.72898337,12.7291958591,12.729408317,12.7296207436,12.7298331388,12.7300455029,12.7302578357,12.7304701372,12.7306824075,12.7308946465,12.7311068544, 12.731319031,12.7315311765,12.7317432907,12.7319553738,12.7321674257,12.7323794464,12.732591436,12.7328033944,12.7330153217,12.7332272179,12.7334390829,12.7336509168,12.7338627197,12.7340744914,12.7342862321,12.7344979417, 12.7347096202,12.7349212677,12.7351328841,12.7353444695,12.7355560239,12.7357675473,12.7359790396,12.736190501,12.7364019313,12.7366133307,12.7368246991,12.7370360365,12.737247343,12.7374586186,12.7376698632,12.7378810769, 12.7380922596,12.7383034115,12.7385145324,12.7387256225,12.7389366817,12.73914771,12.7393587074,12.739569674,12.7397806098,12.7399915147,12.7402023888,12.740413232,12.7406240445,12.7408348261,12.741045577,12.7412562971, 12.7414669864,12.7416776449,12.7418882727,12.7420988698,12.7423094361,12.7425199717,12.7427304765,12.7429409507,12.7431513941,12.7433618069,12.7435721889,12.7437825403,12.7439928611,12.7442031511,12.7444134106,12.7446236393, 12.7448338375,12.745044005,12.745254142,12.7454642483,12.745674324,12.7458843691,12.7460943837,12.7463043677,12.7465143211,12.746724244,12.7469341364,12.7471439982,12.7473538295,12.7475636303,12.7477734005,12.7479831403, 12.7481928496,12.7484025284,12.7486121767,12.7488217946,12.749031382,12.749240939,12.7494504656,12.7496599617,12.7498694274,12.7500788627,12.7502882676,12.7504976421,12.7507069862,12.7509163,12.7511255834,12.7513348364, 12.7515440591,12.7517532514,12.7519624135,12.7521715452,12.7523806466,12.7525897176,12.7527987584,12.7530077689,12.7532167492,12.7534256991,12.7536346189,12.7538435083,12.7540523675,12.7542611965,12.7544699953,12.7546787638, 12.7548875022,12.7550962103,12.7553048883,12.755513536,12.7557221536,12.7559307411,12.7561392984,12.7563478255,12.7565563225,12.7567647894,12.7569732262,12.7571816328,12.7573900094,12.7575983558,12.7578066722,12.7580149585, 12.7582232147,12.7584314409,12.758639637,12.7588478031,12.7590559392,12.7592640452,12.7594721212,12.7596801672,12.7598881832,12.7600961692,12.7603041253,12.7605120514,12.7607199475,12.7609278136,12.7611356498,12.7613434561, 12.7615512324,12.7617589789,12.7619666954,12.762174382,12.7623820387,12.7625896655,12.7627972625,12.7630048296,12.7632123668,12.7634198742,12.7636273517,12.7638347994,12.7640422173,12.7642496054,12.7644569636,12.7646642921, 12.7648715907,12.7650788596,12.7652860987,12.7654933081,12.7657004877,12.7659076375,12.7661147576,12.766321848,12.7665289086,12.7667359395,12.7669429408,12.7671499123,12.7673568541,12.7675637663,12.7677706488,12.7679775016, 12.7681843248,12.7683911183,12.7685978822,12.7688046165,12.7690113211,12.7692179961,12.7694246416,12.7696312574,12.7698378436,12.7700444003,12.7702509274,12.7704574249,12.7706638929,12.7708703314,12.7710767403,12.7712831196, 12.7714894695,12.7716957899,12.7719020807,12.7721083421,12.7723145739,12.7725207763,12.7727269492,12.7729330927,12.7731392067,12.7733452913,12.7735513464,12.7737573721,12.7739633684,12.7741693353,12.7743752728,12.7745811809, 12.7747870596,12.7749929089,12.7751987289,12.7754045195,12.7756102808,12.7758160127,12.7760217153,12.7762273885,12.7764330324,12.7766386471,12.7768442324,12.7770497884,12.7772553152,12.7774608127,12.7776662809,12.7778717198, 12.7780771295,12.77828251,12.7784878612,12.7786931832,12.778898476,12.7791037396,12.779308974,12.7795141791,12.7797193551,12.779924502,12.7801296196,12.7803347081,12.7805397675,12.7807447977,12.7809497987,12.7811547707, 12.7813597135,12.7815646272,12.7817695119,12.7819743674,12.7821791938,12.7823839912,12.7825887595,12.7827934987,12.7829982089,12.7832028901,12.7834075422,12.7836121653,12.7838167593,12.7840213244,12.7842258604,12.7844303675, 12.7846348456,12.7848392947,12.7850437148,12.7852481059,12.7854524682,12.7856568014,12.7858611058,12.7860653812,12.7862696276,12.7864738452,12.7866780339,12.7868821937,12.7870863246,12.7872904266,12.7874944997,12.787698544, 12.7879025594,12.788106546,12.7883105037,12.7885144326,12.7887183327,12.788922204,12.7891260464,12.7893298601,12.789533645,12.7897374011,12.7899411284,12.7901448269,12.7903484968,12.7905521378,12.7907557501,12.7909593337, 12.7911628886,12.7913664147,12.7915699121,12.7917733809,12.7919768209,12.7921802323,12.7923836149,12.7925869689,12.7927902943,12.792993591,12.7931968591,12.7934000985,12.7936033093,12.7938064915,12.794009645,12.79421277, 12.7944158664,12.7946189341,12.7948219733,12.795024984,12.795227966,12.7954309195,12.7956338445,12.7958367409,12.7960396088,12.7962424482,12.7964452591,12.7966480414,12.7968507953,12.7970535206,12.7972562175,12.7974588859, 12.7976615259,12.7978641373,12.7980667204,12.7982692749,12.7984718011,12.7986742988,12.7988767681,12.799079209,12.7992816215,12.7994840056,12.7996863613,12.7998886887,12.8000909876,12.8002932582,12.8004955005,12.8006977144, 12.8008998999,12.8011020571,12.801304186,12.8015062866,12.8017083589,12.8019104029,12.8021124186,12.802314406,12.8025163651,12.802718296,12.8029201986,12.8031220729,12.803323919,12.8035257369,12.8037275266,12.803929288, 12.8041310212,12.8043327262,12.804534403,12.8047360516,12.8049376721,12.8051392643,12.8053408284,12.8055423644,12.8057438722,12.8059453518,12.8061468033,12.8063482267,12.806549622,12.8067509891,12.8069523282,12.8071536392, 12.8073549221,12.8075561769,12.8077574036,12.8079586023,12.8081597729,12.8083609154,12.80856203,12.8087631165,12.8089641749,12.8091652054,12.8093662078,12.8095671823,12.8097681287,12.8099690472,12.8101699377,12.8103708002, 12.8105716347,12.8107724413,12.81097322,12.8111739707,12.8113746935,12.8115753884,12.8117760553,12.8119766944,12.8121773055,12.8123778888,12.8125784441,12.8127789716,12.8129794713,12.813179943,12.8133803869,12.813580803, 12.8137811912,12.8139815516,12.8141818842,12.814382189,12.8145824659,12.8147827151,12.8149829364,12.81518313,12.8153832958,12.8155834339,12.8157835441,12.8159836267,12.8161836814,12.8163837085,12.8165837078,12.8167836794, 12.8169836233,12.8171835394,12.8173834279,12.8175832887,12.8177831218,12.8179829272,12.8181827049,12.818382455,12.8185821775,12.8187818723,12.8189815394,12.819181179,12.8193807909,12.8195803752,12.8197799318,12.8199794609, 12.8201789624,12.8203784363,12.8205778827,12.8207773014,12.8209766926,12.8211760563,12.8213753924,12.8215747009,12.821773982,12.8219732355,12.8221724615,12.82237166,12.822570831,12.8227699744,12.8229690905,12.823168179, 12.82336724,12.8235662736,12.8237652798,12.8239642585,12.8241632097,12.8243621336,12.82456103,12.824759899,12.8249587405,12.8251575547,12.8253563415,12.8255551009,12.8257538329,12.8259525375,12.8261512148,12.8263498647, 12.8265484873,12.8267470825,12.8269456504,12.827144191,12.8273427042,12.8275411902,12.8277396488,12.8279380801,12.8281364842,12.828334861,12.8285332105,12.8287315327,12.8289298277,12.8291280954,12.8293263358,12.8295245491, 12.8297227351,12.8299208939,12.8301190254,12.8303171298,12.830515207,12.830713257,12.8309112797,12.8311092754,12.8313072438,12.8315051851,12.8317030992,12.8319009862,12.832098846,12.8322966787,12.8324944843,12.8326922628, 12.8328900142,12.8330877384,12.8332854356,12.8334831057,12.8336807487,12.8338783646,12.8340759534,12.8342735152,12.83447105,12.8346685577,12.8348660384,12.835063492,12.8352609186,12.8354583182,12.8356556908,12.8358530364, 12.8360503551,12.8362476467,12.8364449113,12.836642149,12.8368393597,12.8370365435,12.8372337003,12.8374308302,12.8376279332,12.8378250092,12.8380220583,12.8382190805,12.8384160758,12.8386130442,12.8388099857,12.8390069003, 12.8392037881,12.839400649,12.839597483,12.8397942902,12.8399910705,12.840187824,12.8403845507,12.8405812506,12.8407779236,12.8409745698,12.8411711892,12.8413677819,12.8415643477,12.8417608868,12.8419573991,12.8421538846, 12.8423503434,12.8425467754,12.8427431807,12.8429395593,12.8431359111,12.8433322362,12.8435285346,12.8437248063,12.8439210513,12.8441172696,12.8443134612,12.8445096261,12.8447057644,12.844901876,12.845097961,12.8452940193, 12.8454900509,12.845686056,12.8458820344,12.8460779862,12.8462739113,12.8464698099,12.8466656819,12.8468615273,12.8470573461,12.8472531383,12.847448904,12.8476446431,12.8478403556,12.8480360416,12.8482317011,12.848427334, 12.8486229404,12.8488185203,12.8490140737,12.8492096006,12.8494051009,12.8496005748,12.8497960222,12.8499914432,12.8501868376,12.8503822057,12.8505775472,12.8507728623,12.850968151,12.8511634132,12.851358649,12.8515538584, 12.8517490414,12.851944198,12.8521393282,12.852334432,12.8525295094,12.8527245604,12.8529195851,12.8531145834,12.8533095554,12.853504501,12.8536994203,12.8538943132,12.8540891799,12.8542840202,12.8544788342,12.8546736219, 12.8548683833,12.8550631184,12.8552578272,12.8554525097,12.855647166,12.855841796,12.8560363998,12.8562309773,12.8564255286,12.8566200537,12.8568145525,12.8570090251,12.8572034715,12.8573978917,12.8575922857,12.8577866535, 12.8579809951,12.8581753106,12.8583695999,12.858563863,12.8587580999,12.8589523108,12.8591464954,12.859340654,12.8595347864,12.8597288927,12.8599229729,12.8601170269,12.8603110549,12.8605050568,12.8606990326,12.8608929823, 12.861086906,12.8612808036,12.8614746751,12.8616685206,12.8618623401,12.8620561335,12.8622499009,12.8624436422,12.8626373576,12.8628310469,12.8630247102,12.8632183476,12.8634119589,12.8636055443,12.8637991037,12.8639926372, 12.8641861447,12.8643796262,12.8645730818,12.8647665114,12.8649599151,12.8651532929,12.8653466448,12.8655399708,12.8657332709,12.865926545,12.8661197933,12.8663130157,12.8665062122,12.8666993829,12.8668925277,12.8670856466, 12.8672787397,12.867471807,12.8676648484,12.867857864,12.8680508537,12.8682438177,12.8684367559,12.8686296682,12.8688225548,12.8690154156,12.8692082506,12.8694010598,12.8695938432,12.8697866009,12.8699793329,12.8701720391, 12.8703647196,12.8705573743,12.8707500033,12.8709426066,12.8711351842,12.8713277361,12.8715202623,12.8717127628,12.8719052377,12.8720976868,12.8722901103,12.8724825081,12.8726748803,12.8728672268,12.8730595477,12.8732518429, 12.8734441125,12.8736363565,12.8738285749,12.8740207677,12.8742129348,12.8744050764,12.8745971924,12.8747892828,12.8749813477,12.8751733869,12.8753654006,12.8755573888,12.8757493514,12.8759412885,12.8761332,12.8763250861, 12.8765169466,12.8767087816,12.876900591,12.877092375,12.8772841335,12.8774758665,12.8776675741,12.8778592561,12.8780509127,12.8782425439,12.8784341496,12.8786257298,12.8788172846,12.879008814,12.8792003179,12.8793917965, 12.8795832496,12.8797746773,12.8799660797,12.8801574566,12.8803488082,12.8805401343,12.8807314351,12.8809227106,12.8811139607,12.8813051854,12.8814963848,12.8816875589,12.8818787076,12.882069831,12.8822609291,12.8824520019, 12.8826430494,12.8828340715,12.8830250684,12.8832160401,12.8834069864,12.8835979075,12.8837888033,12.8839796738,12.8841705191,12.8843613392,12.884552134,12.8847429036,12.8849336479,12.8851243671,12.885315061,12.8855057298, 12.8856963733,12.8858869917,12.8860775849,12.8862681529,12.8864586957,12.8866492134,12.8868397059,12.8870301732,12.8872206155,12.8874110326,12.8876014245,12.8877917913,12.8879821331,12.8881724497,12.8883627412,12.8885530076, 12.8887432489,12.8889334651,12.8891236563,12.8893138224,12.8895039634,12.8896940794,12.8898841703,12.8900742362,12.890264277,12.8904542928,12.8906442836,12.8908342494,12.8910241901,12.8912141059,12.8914039967,12.8915938624, 12.8917837032,12.891973519,12.8921633099,12.8923530757,12.8925428166,12.8927325326,12.8929222236,12.8931118897,12.8933015309,12.8934911471,12.8936807384,12.8938703048,12.8940598463,12.8942493629,12.8944388546,12.8946283214, 12.8948177633,12.8950071804,12.8951965726,12.8953859399,12.8955752824,12.8957646,12.8959538928,12.8961431608,12.8963324039,12.8965216222,12.8967108157,12.8968999844,12.8970891283,12.8972782474,12.8974673417,12.8976564113, 12.897845456,12.898034476,12.8982234712,12.8984124417,12.8986013874,12.8987903084,12.8989792046,12.8991680761,12.8993569229,12.899545745,12.8997345424,12.899923315,12.900112063,12.9003007862,12.9004894848,12.9006781587, 12.900866808,12.9010554326,12.9012440325,12.9014326077,12.9016211583,12.9018096843,12.9019981857,12.9021866624,12.9023751145,12.902563542,12.9027519449,12.9029403231,12.9031286768,12.9033170059,12.9035053104,12.9036935904, 12.9038818457,12.9040700765,12.9042582828,12.9044464645,12.9046346217,12.9048227543,12.9050108624,12.905198946,12.905387005,12.9055750396,12.9057630496,12.9059510351,12.9061389962,12.9063269328,12.9065148448,12.9067027325, 12.9068905956,12.9070784343,12.9072662485,12.9074540383,12.9076418037,12.9078295446,12.9080172611,12.9082049531,12.9083926208,12.908580264,12.9087678828,12.9089554773,12.9091430473,12.909330593,12.9095181143,12.9097056112, 12.9098930838,12.910080532,12.9102679558,12.9104553553,12.9106427305,12.9108300813,12.9110174078,12.91120471,12.9113919878,12.9115792414,12.9117664707,12.9119536756,12.9121408563,12.9123280127,12.9125151448,12.9127022526, 12.9128893362,12.9130763956,12.9132634306,12.9134504415,12.913637428,12.9138243904,12.9140113285,12.9141982425,12.9143851322,12.9145719976,12.9147588389,12.914945656,12.915132449,12.9153192177,12.9155059622,12.9156926826, 12.9158793788,12.9160660509,12.9162526988,12.9164393226,12.9166259222,12.9168124977,12.9169990491,12.9171855763,12.9173720795,12.9175585585,12.9177450134,12.9179314443,12.918117851,12.9183042337,12.9184905923,12.9186769268, 12.9188632373,12.9190495237,12.919235786,12.9194220243,12.9196082386,12.9197944288,12.919980595,12.9201667372,12.9203528554,12.9205389496,12.9207250198,12.9209110659,12.9210970881,12.9212830863,12.9214690605,12.9216550108, 12.9218409371,12.9220268394,12.9222127178,12.9223985722,12.9225844027,12.9227702093,12.9229559919,12.9231417506,12.9233274854,12.9235131963,12.9236988833,12.9238845464,12.9240701856,12.9242558009,12.9244413923,12.9246269599, 12.9248125036,12.9249980234,12.9251835194,12.9253689916,12.9255544399,12.9257398643,12.925925265,12.9261106418,12.9262959948,12.926481324,12.9266666293,12.9268519109,12.9270371687,12.9272224027,12.9274076129,12.9275927994, 12.9277779621,12.927963101,12.9281482162,12.9283333076,12.9285183753,12.9287034192,12.9288884394,12.9290734359,12.9292584086,12.9294433577,12.929628283,12.9298131847,12.9299980626,12.9301829169,12.9303677474,12.9305525543, 12.9307373376,12.9309220971,12.931106833,12.9312915453,12.9314762339,12.9316608989,12.9318455402,12.9320301579,12.932214752,12.9323993224,12.9325838693,12.9327683925,12.9329528922,12.9331373683,12.9333218207,12.9335062496, 12.933690655,12.9338750367,12.9340593949,12.9342437295,12.9344280406,12.9346123282,12.9347965922,12.9349808327,12.9351650496,12.935349243,12.935533413,12.9357175594,12.9359016823,12.9360857817,12.9362698576,12.93645391, 12.936637939,12.9368219445,12.9370059265,12.9371898851,12.9373738202,12.9375577319,12.9377416201,12.9379254849,12.9381093262,12.9382931442,12.9384769387,12.9386607098,12.9388444575,12.9390281818,12.9392118827,12.9393955602, 12.9395792143,12.9397628451,12.9399464525,12.9401300365,12.9403135971,12.9404971345,12.9406806484,12.940864139,12.9410476063,12.9412310503,12.9414144709,12.9415978683,12.9417812423,12.941964593,12.9421479204,12.9423312245, 12.9425145053,12.9426977629,12.9428809972,12.9430642082,12.9432473959,12.9434305604,12.9436137016,12.9437968196,12.9439799143,12.9441629859,12.9443460341,12.9445290592,12.944712061,12.9448950397,12.9450779951,12.9452609273, 12.9454438364,12.9456267222,12.9458095849,12.9459924244,12.9461752407,12.9463580339,12.9465408039,12.9467235507,12.9469062745,12.947088975,12.9472716525,12.9474543068,12.947636938,12.947819546,12.948002131,12.9481846928, 12.9483672316,12.9485497472,12.9487322398,12.9489147093,12.9490971557,12.9492795791,12.9494619794,12.9496443566,12.9498267108,12.9500090419,12.95019135,12.950373635,12.950555897,12.950738136,12.950920352,12.951102545, 12.951284715,12.9514668619,12.9516489859,12.9518310869,12.9520131649,12.9521952199,12.952377252,12.9525592611,12.9527412472,12.9529232104,12.9531051506,12.9532870679,12.9534689622,12.9536508336,12.9538326821,12.9540145077, 12.9541963104,12.9543780901,12.954559847,12.954741581,12.954923292,12.9551049802,12.9552866455,12.955468288,12.9556499075,12.9558315042,12.9560130781,12.9561946291,12.9563761572,12.9565576626,12.9567391451,12.9569206047, 12.9571020416,12.9572834556,12.9574648468,12.9576462152,12.9578275608,12.9580088837,12.9581901837,12.9583714609,12.9585527154,12.9587339471,12.9589151561,12.9590963423,12.9592775057,12.9594586464,12.9596397644,12.9598208596, 12.9600019321,12.9601829818,12.9603640089,12.9605450132,12.9607259948,12.9609069538,12.96108789,12.9612688035,12.9614496944,12.9616305626,12.9618114081,12.9619922309,12.9621730311,12.9623538086,12.9625345635,12.9627152957, 12.9628960053,12.9630766923,12.9632573566,12.9634379983,12.9636186174,12.9637992139,12.9639797878,12.9641603391,12.9643408678,12.9645213739,12.9647018574,12.9648823184,12.9650627567,12.9652431726,12.9654235658,12.9656039365, 12.9657842847,12.9659646103,12.9661449133,12.9663251939,12.9665054519,12.9666856874,12.9668659004,12.9670460909,12.9672262588,12.9674064043,12.9675865273,12.9677666278,12.9679467058,12.9681267614,12.9683067944,12.968486805, 12.9686667932,12.9688467589,12.9690267022,12.969206623,12.9693865213,12.9695663973,12.9697462508,12.9699260819,12.9701058906,12.9702856769,12.9704654408,12.9706451823,12.9708249014,12.9710045981,12.9711842724,12.9713639244, 12.971543554,12.9717231612,12.971902746,12.9720823086,12.9722618487,12.9724413666,12.9726208621,12.9728003352,12.9729797861,12.9731592146,12.9733386208,12.9735180047,12.9736973663,12.9738767056,12.9740560226,12.9742353174, 12.9744145898,12.97459384,12.9747730679,12.9749522735,12.9751314569,12.9753106181,12.9754897569,12.9756688736,12.975847968,12.9760270402,12.9762060901,12.9763851179,12.9765641234,12.9767431067,12.9769220679,12.9771010068, 12.9772799235,12.977458818,12.9776376904,12.9778165406,12.9779953686,12.9781741745,12.9783529582,12.9785317197,12.9787104591,12.9788891764,12.9790678715,12.9792465445,12.9794251953,12.9796038241,12.9797824307,12.9799610152, 12.9801395776,12.980318118,12.9804966362,12.9806751323,12.9808536064,12.9810320584,12.9812104883,12.9813888961,12.9815672819,12.9817456456,12.9819239873,12.982102307,12.9822806046,12.9824588801,12.9826371337,12.9828153652, 12.9829935747,12.9831717622,12.9833499277,12.9835280712,12.9837061927,12.9838842922,12.9840623697,12.9842404252,12.9844184588,12.9845964704,12.98477446,12.9849524277,12.9851303735,12.9853082973,12.9854861991,12.985664079, 12.985841937,12.9860197731,12.9861975872,12.9863753794,12.9865531498,12.9867308982,12.9869086247,12.9870863293,12.9872640121,12.9874416729,12.9876193119,12.987796929,12.9879745243,12.9881520977,12.9883296492,12.9885071789, 12.9886846868,12.9888621728,12.989039637,12.9892170793,12.9893944998,12.9895718986,12.9897492755,12.9899266306,12.9901039639,12.9902812754,12.9904585651,12.990635833,12.9908130792,12.9909903035,12.9911675061,12.991344687, 12.9915218461,12.9916989834,12.991876099,12.9920531929,12.992230265,12.9924073153,12.992584344,12.9927613509,12.9929383362,12.9931152997,12.9932922415,12.9934691616,12.99364606,12.9938229367,12.9939997918,12.9941766252, 12.9943534369,12.9945302269,12.9947069953,12.994883742,12.995060467,12.9952371704,12.9954138522,12.9955905124,12.9957671509,12.9959437678,12.996120363,12.9962969367,12.9964734887,12.9966500192,12.996826528,12.9970030153, 12.9971794809,12.997355925,12.9975323475,12.9977087485,12.9978851278,12.9980614856,12.9982378219,12.9984141366,12.9985904297,12.9987667014,12.9989429514,12.99911918,12.999295387,12.9994715725,12.9996477365,12.999823879, 13.0,13.0001760995,13.0003521775,13.000528234,13.000704269,13.0008802826,13.0010562746,13.0012322452,13.0014081944,13.0015841221,13.0017600283,13.0019359131,13.0021117765,13.0022876184,13.0024634389,13.002639238, 13.0028150156,13.0029907718,13.0031665067,13.0033422201,13.0035179121,13.0036935827,13.003869232,13.0040448598,13.0042204663,13.0043960514,13.0045716152,13.0047471575,13.0049226786,13.0050981782,13.0052736566,13.0054491135, 13.0056245492,13.0057999635,13.0059753565,13.0061507282,13.0063260785,13.0065014076,13.0066767153,13.0068520017,13.0070272669,13.0072025107,13.0073777333,13.0075529346,13.0077281146,13.0079032734,13.0080784109,13.0082535271, 13.0084286221,13.0086036958,13.0087787483,13.0089537795,13.0091287895,13.0093037783,13.0094787459,13.0096536922,13.0098286174,13.0100035213,13.010178404,13.0103532655,13.0105281059,13.010702925,13.010877723,13.0110524998, 13.0112272554,13.0114019899,13.0115767032,13.0117513953,13.0119260663,13.0121007162,13.0122753449,13.0124499524,13.0126245389,13.0127991042,13.0129736484,13.0131481715,13.0133226734,13.0134971543,13.0136716141,13.0138460527, 13.0140204703,13.0141948668,13.0143692422,13.0145435966,13.0147179299,13.0148922421,13.0150665332,13.0152408033,13.0154150524,13.0155892804,13.0157634874,13.0159376733,13.0161118382,13.0162859821,13.016460105,13.0166342068, 13.0168082877,13.0169823475,13.0171563864,13.0173304042,13.0175044011,13.017678377,13.0178523319,13.0180262658,13.0182001788,13.0183740708,13.0185479419,13.018721792,13.0188956211,13.0190694293,13.0192432166,13.0194169829, 13.0195907284,13.0197644528,13.0199381564,13.0201118391,13.0202855008,13.0204591417,13.0206327617,13.0208063607,13.0209799389,13.0211534962,13.0213270326,13.0215005482,13.0216740429,13.0218475167,13.0220209696,13.0221944018, 13.022367813,13.0225412035,13.022714573,13.0228879218,13.0230612497,13.0232345568,13.0234078431,13.0235811086,13.0237543533,13.0239275772,13.0241007803,13.0242739625,13.024447124,13.0246202648,13.0247933847,13.0249664839, 13.0251395623,13.0253126199,13.0254856568,13.0256586729,13.0258316683,13.026004643,13.0261775969,13.0263505301,13.0265234425,13.0266963342,13.0268692053,13.0270420556,13.0272148852,13.0273876941,13.0275604822,13.0277332498, 13.0279059966,13.0280787227,13.0282514282,13.0284241129,13.0285967771,13.0287694205,13.0289420433,13.0291146455,13.029287227,13.0294597878,13.029632328,13.0298048476,13.0299773466,13.0301498249,13.0303222826,13.0304947197, 13.0306671362,13.0308395321,13.0310119074,13.0311842621,13.0313565963,13.0315289098,13.0317012027,13.0318734751,13.0320457269,13.0322179582,13.0323901689,13.032562359,13.0327345286,13.0329066776,13.0330788061,13.0332509141, 13.0334230015,13.0335950685,13.0337671148,13.0339391407,13.0341111461,13.034283131,13.0344550953,13.0346270392,13.0347989626,13.0349708655,13.0351427479,13.0353146098,13.0354864513,13.0356582723,13.0358300728,13.0360018529, 13.0361736126,13.0363453517,13.0365170705,13.0366887688,13.0368604467,13.0370321041,13.0372037412,13.0373753578,13.037546954,13.0377185298,13.0378900851,13.0380616201,13.0382331347,13.0384046289,13.0385761028,13.0387475562, 13.0389189893,13.039090402,13.0392617943,13.0394331663,13.039604518,13.0397758492,13.0399471602,13.0401184508,13.040289721,13.040460971,13.0406322006,13.0408034098,13.0409745988,13.0411457675,13.0413169158,13.0414880439, 13.0416591516,13.0418302391,13.0420013063,13.0421723532,13.0423433798,13.0425143861,13.0426853722,13.042856338,13.0430272836,13.0431982089,13.043369114,13.0435399988,13.0437108633,13.0438817077,13.0440525318,13.0442233357, 13.0443941194,13.0445648828,13.0447356261,13.0449063491,13.0450770519,13.0452477346,13.045418397,13.0455890393,13.0457596614,13.0459302633,13.046100845,13.0462714066,13.046441948,13.0466124693,13.0467829704,13.0469534513, 13.0471239121,13.0472943528,13.0474647733,13.0476351737,13.047805554,13.0479759142,13.0481462542,13.0483165742,13.048486874,13.0486571537,13.0488274134,13.0489976529,13.0491678724,13.0493380718,13.0495082511,13.0496784103, 13.0498485495,13.0500186686,13.0501887676,13.0503588466,13.0505289055,13.0506989444,13.0508689633,13.0510389621,13.0512089409,13.0513788997,13.0515488384,13.0517187572,13.0518886559,13.0520585346,13.0522283933,13.0523982321, 13.0525680508,13.0527378495,13.0529076283,13.0530773871,13.0532471259,13.0534168448,13.0535865436,13.0537562226,13.0539258815,13.0540955206,13.0542651396,13.0544347388,13.054604318,13.0547738772,13.0549434166,13.055112936, 13.0552824355,13.0554519151,13.0556213748,13.0557908146,13.0559602345,13.0561296344,13.0562990146,13.0564683748,13.0566377151,13.0568070356,13.0569763362,13.0571456169,13.0573148778,13.0574841188,13.05765334,13.0578225413, 13.0579917228,13.0581608844,13.0583300262,13.0584991482,13.0586682503,13.0588373327,13.0590063952,13.0591754379,13.0593444608,13.0595134639,13.0596824472,13.0598514108,13.0600203545,13.0601892785,13.0603581826,13.060527067, 13.0606959317,13.0608647766,13.0610336017,13.061202407,13.0613711927,13.0615399585,13.0617087047,13.0618774311,13.0620461377,13.0622148247,13.0623834919,13.0625521394,13.0627207672,13.0628893752,13.0630579636,13.0632265323, 13.0633950813,13.0635636106,13.0637321202,13.0639006101,13.0640690804,13.064237531,13.0644059619,13.0645743731,13.0647427648,13.0649111367,13.065079489,13.0652478217,13.0654161347,13.0655844281,13.0657527018,13.0659209559, 13.0660891905,13.0662574054,13.0664256006,13.0665937763,13.0667619324,13.0669300689,13.0670981857,13.067266283,13.0674343608,13.0676024189,13.0677704574,13.0679384764,13.0681064759,13.0682744557,13.068442416,13.0686103568, 13.068778278,13.0689461796,13.0691140618,13.0692819244,13.0694497674,13.069617591,13.069785395,13.0699531795,13.0701209445,13.07028869,13.0704564159,13.0706241224,13.0707918094,13.0709594769,13.0711271249,13.0712947535, 13.0714623626,13.0716299522,13.0717975223,13.071965073,13.0721326042,13.0723001159,13.0724676082,13.0726350811,13.0728025345,13.0729699685,13.0731373831,13.0733047783,13.073472154,13.0736395103,13.0738068472,13.0739741647, 13.0741414628,13.0743087414,13.0744760007,13.0746432406,13.0748104612,13.0749776623,13.0751448441,13.0753120065,13.0754791495,13.0756462732,13.0758133775,13.0759804624,13.076147528,13.0763145743,13.0764816012,13.0766486088, 13.0768155971,13.076982566,13.0771495156,13.0773164459,13.0774833569,13.0776502485,13.0778171209,13.077983974,13.0781508077,13.0783176222,13.0784844174,13.0786511933,13.07881795,13.0789846873,13.0791514054,13.0793181043, 13.0794847838,13.0796514441,13.0798180852,13.079984707,13.0801513096,13.080317893,13.0804844571,13.0806510019,13.0808175276,13.080984034,13.0811505213,13.0813169893,13.0814834381,13.0816498677,13.0818162781,13.0819826693, 13.0821490414,13.0823153942,13.0824817279,13.0826480424,13.0828143377,13.0829806138,13.0831468708,13.0833131087,13.0834793273,13.0836455269,13.0838117073,13.0839778685,13.0841440106,13.0843101336,13.0844762375,13.0846423222, 13.0848083878,13.0849744343,13.0851404617,13.08530647,13.0854724592,13.0856384293,13.0858043803,13.0859703122,13.086136225,13.0863021188,13.0864679935,13.0866338491,13.0867996856,13.0869655031,13.0871313015,13.0872970809, 13.0874628413,13.0876285825,13.0877943048,13.087960008,13.0881256922,13.0882913573,13.0884570035,13.0886226306,13.0887882387,13.0889538278,13.0891193979,13.089284949,13.0894504811,13.0896159942,13.0897814884,13.0899469635, 13.0901124197,13.0902778569,13.0904432751,13.0906086743,13.0907740546,13.090939416,13.0911047584,13.0912700818,13.0914353863,13.0916006719,13.0917659385,13.0919311862,13.092096415,13.0922616248,13.0924268158,13.0925919878, 13.0927571409,13.0929222751,13.0930873904,13.0932524869,13.0934175644,13.093582623,13.0937476628,13.0939126837,13.0940776857,13.0942426688,13.0944076331,13.0945725785,13.094737505,13.0949024128,13.0950673016,13.0952321716, 13.0953970228,13.0955618551,13.0957266686,13.0958914633,13.0960562392,13.0962209962,13.0963857345,13.0965504539,13.0967151545,13.0968798363,13.0970444993,13.0972091436,13.097373769,13.0975383756,13.0977029635,13.0978675326, 13.098032083,13.0981966145,13.0983611273,13.0985256214,13.0986900967,13.0988545532,13.099018991,13.0991834101,13.0993478104,13.099512192,13.0996765549,13.099840899,13.1000052244,13.1001695311,13.1003338191,13.1004980884, 13.100662339,13.1008265709,13.1009907841,13.1011549786,13.1013191544,13.1014833116,13.10164745,13.1018115698,13.1019756709,13.1021397534,13.1023038172,13.1024678624,13.1026318889,13.1027958967,13.1029598859,13.1031238565, 13.1032878084,13.1034517417,13.1036156564,13.1037795525,13.1039434299,13.1041072887,13.1042711289,13.1044349506,13.1045987536,13.104762538,13.1049263038,13.105090051,13.1052537797,13.1054174898,13.1055811813,13.1057448542, 13.1059085086,13.1060721444,13.1062357616,13.1063993603,13.1065629404,13.106726502,13.1068900451,13.1070535696,13.1072170756,13.107380563,13.107544032,13.1077074824,13.1078709143,13.1080343277,13.1081977225,13.1083610989, 13.1085244568,13.1086877962,13.108851117,13.1090144194,13.1091777034,13.1093409688,13.1095042158,13.1096674443,13.1098306543,13.1099938458,13.110157019,13.1103201736,13.1104833098,13.1106464276,13.1108095269,13.1109726078, 13.1111356702,13.1112987143,13.1114617399,13.111624747,13.1117877358,13.1119507062,13.1121136581,13.1122765916,13.1124395068,13.1126024035,13.1127652819,13.1129281419,13.1130909834,13.1132538067,13.1134166115,13.113579398, 13.113742166,13.1139049158,13.1140676472,13.1142303602,13.1143930549,13.1145557312,13.1147183892,13.1148810288,13.1150436502,13.1152062532,13.1153688378,13.1155314042,13.1156939522,13.1158564819,13.1160189933,13.1161814864, 13.1163439612,13.1165064177,13.116668856,13.1168312759,13.1169936775,13.1171560609,13.117318426,13.1174807728,13.1176431014,13.1178054117,13.1179677037,13.1181299775,13.118292233,13.1184544703,13.1186166894,13.1187788902, 13.1189410727,13.1191032371,13.1192653832,13.1194275111,13.1195896207,13.1197517122,13.1199137855,13.1200758405,13.1202378773,13.120399896,13.1205618964,13.1207238787,13.1208858428,13.1210477887,13.1212097164,13.121371626, 13.1215335173,13.1216953906,13.1218572456,13.1220190825,13.1221809013,13.1223427019,13.1225044843,13.1226662486,13.1228279948,13.1229897229,13.1231514328,13.1233131246,13.1234747982,13.1236364538,13.1237980913,13.1239597106, 13.1241213118,13.124282895,13.12444446,13.124606007,13.1247675358,13.1249290466,13.1250905393,13.1252520139,13.1254134705,13.125574909,13.1257363294,13.1258977318,13.1260591161,13.1262204823,13.1263818305,13.1265431607, 13.1267044728,13.1268657669,13.127027043,13.127188301,13.1273495411,13.1275107631,13.127671967,13.127833153,13.127994321,13.1281554709,13.1283166029,13.1284777169,13.1286388129,13.1287998908,13.1289609509,13.1291219929, 13.1292830169,13.129444023,13.1296050112,13.1297659813,13.1299269335,13.1300878678,13.1302487841,13.1304096824,13.1305705628,13.1307314253,13.1308922698,13.1310530964,13.1312139051,13.1313746958,13.1315354687,13.1316962236, 13.1318569606,13.1320176797,13.1321783809,13.1323390642,13.1324997296,13.1326603771,13.1328210068,13.1329816185,13.1331422124,13.1333027884,13.1334633465,13.1336238868,13.1337844092,13.1339449137,13.1341054004,13.1342658692, 13.1344263202,13.1345867534,13.1347471687,13.1349075661,13.1350679458,13.1352283076,13.1353886516,13.1355489777,13.1357092861,13.1358695766,13.1360298494,13.1361901043,13.1363503415,13.1365105608,13.1366707623,13.1368309461, 13.1369911121,13.1371512603,13.1373113907,13.1374715034,13.1376315982,13.1377916754,13.1379517347,13.1381117763,13.1382718002,13.1384318063,13.1385917946,13.1387517653,13.1389117181,13.1390716533,13.1392315707,13.1393914704, 13.1395513524,13.1397112167,13.1398710632,13.1400308921,13.1401907032,13.1403504966,13.1405102724,13.1406700304,13.1408297708,13.1409894934,13.1411491984,13.1413088858,13.1414685554,13.1416282074,13.1417878417,13.1419474583, 13.1421070573,13.1422666386,13.1424262023,13.1425857484,13.1427452768,13.1429047875,13.1430642806,13.1432237561,13.143383214,13.1435426542,13.1437020769,13.1438614819,13.1440208693,13.1441802391,13.1443395912,13.1444989258, 13.1446582428,13.1448175422,13.1449768241,13.1451360883,13.1452953349,13.145454564,13.1456137755,13.1457729694,13.1459321458,13.1460913046,13.1462504459,13.1464095696,13.1465686757,13.1467277643,13.1468868354,13.1470458889, 13.1472049249,13.1473639434,13.1475229444,13.1476819278,13.1478408937,13.1479998421,13.1481587729,13.1483176863,13.1484765822,13.1486354605,13.1487943214,13.1489531648,13.1491119907,13.1492707991,13.1494295901,13.1495883635, 13.1497471195,13.149905858,13.1500645791,13.1502232827,13.1503819688,13.1505406375,13.1506992887,13.1508579225,13.1510165389,13.1511751378,13.1513337193,13.1514922833,13.15165083,13.1518093592,13.151967871,13.1521263653, 13.1522848423,13.1524433019,13.152601744,13.1527601688,13.1529185761,13.1530769661,13.1532353387,13.1533936939,13.1535520317,13.1537103522,13.1538686552,13.1540269409,13.1541852093,13.1543434602,13.1545016939,13.1546599101, 13.1548181091,13.1549762906,13.1551344549,13.1552926018,13.1554507313,13.1556088435,13.1557669384,13.155925016,13.1560830763,13.1562411192,13.1563991449,13.1565571532,13.1567151442,13.1568731179,13.1570310744,13.1571890135, 13.1573469354,13.1575048399,13.1576627272,13.1578205972,13.1579784499,13.1581362854,13.1582941036,13.1584519045,13.1586096882,13.1587674546,13.1589252038,13.1590829357,13.1592406504,13.1593983479,13.1595560281,13.159713691, 13.1598713368,13.1600289653,13.1601865766,13.1603441707,13.1605017476,13.1606593072,13.1608168497,13.1609743749,13.161131883,13.1612893738,13.1614468475,13.161604304,13.1617617433,13.1619191654,13.1620765704,13.1622339581, 13.1623913288,13.1625486822,13.1627060185,13.1628633376,13.1630206396,13.1631779244,13.1633351921,13.1634924426,13.163649676,13.1638068923,13.1639640914,13.1641212734,13.1642784383,13.1644355861,13.1645927167,13.1647498302, 13.1649069267,13.165064006,13.1652210682,13.1653781133,13.1655351414,13.1656921523,13.1658491462,13.166006123,13.1661630826,13.1663200253,13.1664769508,13.1666338593,13.1667907507,13.1669476251,13.1671044824,13.1672613226, 13.1674181458,13.167574952,13.1677317411,13.1678885132,13.1680452682,13.1682020062,13.1683587272,13.1685154312,13.1686721181,13.1688287881,13.168985441,13.1691420769,13.1692986958,13.1694552977,13.1696118826,13.1697684505, 13.1699250014,13.1700815354,13.1702380523,13.1703945523,13.1705510353,13.1707075013,13.1708639504,13.1710203825,13.1711767977,13.1713331958,13.1714895771,13.1716459413,13.1718022887,13.1719586191,13.1721149325,13.1722712291, 13.1724275086,13.1725837713,13.172740017,13.1728962459,13.1730524578,13.1732086528,13.1733648308,13.173520992,13.1736771363,13.1738332637,13.1739893742,13.1741454678,13.1743015445,13.1744576043,13.1746136472,13.1747696733, 13.1749256825,13.1750816748,13.1752376503,13.1753936089,13.1755495506,13.1757054755,13.1758613836,13.1760172748,13.1761731491,13.1763290066,13.1764848473,13.1766406711,13.1767964781,13.1769522683,13.1771080417,13.1772637983, 13.177419538,13.1775752609,13.177730967,13.1778866563,13.1780423289,13.1781979846,13.1783536235,13.1785092457,13.178664851,13.1788204396,13.1789760114,13.1791315664,13.1792871046,13.1794426261,13.1795981308,13.1797536188, 13.17990909,13.1800645445,13.1802199822,13.1803754031,13.1805308073,13.1806861948,13.1808415656,13.1809969196,13.1811522569,13.1813075774,13.1814628813,13.1816181684,13.1817734388,13.1819286925,13.1820839295,13.1822391498, 13.1823943534,13.1825495403,13.1827047105,13.182859864,13.1830150009,13.183170121,13.1833252245,13.1834803113,13.1836353815,13.1837904349,13.1839454718,13.1841004919,13.1842554954,13.1844104822,13.1845654524,13.184720406, 13.1848753429,13.1850302632,13.1851851668,13.1853400538,13.1854949242,13.185649778,13.1858046151,13.1859594356,13.1861142395,13.1862690268,13.1864237975,13.1865785516,13.1867332891,13.18688801,13.1870427143,13.1871974021, 13.1873520732,13.1875067278,13.1876613657,13.1878159871,13.187970592,13.1881251803,13.188279752,13.1884343071,13.1885888457,13.1887433677,13.1888978732,13.1890523622,13.1892068346,13.1893612905,13.1895157298,13.1896701526, 13.1898245589,13.1899789486,13.1901333219,13.1902876786,13.1904420188,13.1905963425,13.1907506497,13.1909049403,13.1910592145,13.1912134722,13.1913677134,13.1915219381,13.1916761464,13.1918303381,13.1919845134,13.1921386722, 13.1922928145,13.1924469403,13.1926010497,13.1927551426,13.1929092191,13.1930632791,13.1932173227,13.1933713498,13.1935253605,13.1936793547,13.1938333325,13.1939872939,13.1941412389,13.1942951674,13.1944490795,13.1946029752, 13.1947568544,13.1949107173,13.1950645637,13.1952183938,13.1953722074,13.1955260046,13.1956797855,13.19583355,13.195987298,13.1961410297,13.196294745,13.196448444,13.1966021265,13.1967557927,13.1969094425,13.197063076, 13.1972166931,13.1973702939,13.1975238783,13.1976774463,13.197830998,13.1979845334,13.1981380524,13.1982915551,13.1984450415,13.1985985115,13.1987519652,13.1989054026,13.1990588237,13.1992122284,13.1993656169,13.199518989, 13.1996723448,13.1998256844,13.1999790076,13.2001323146,13.2002856052,13.2004388796,13.2005921377,13.2007453795,13.200898605,13.2010518143,13.2012050073,13.201358184,13.2015113445,13.2016644887,13.2018176167,13.2019707284, 13.2021238238,13.202276903,13.202429966,13.2025830127,13.2027360433,13.2028890575,13.2030420556,13.2031950374,13.203348003,13.2035009524,13.2036538855,13.2038068025,13.2039597032,13.2041125878,13.2042654561,13.2044183083, 13.2045711442,13.204723964,13.2048767676,13.205029555,13.2051823262,13.2053350813,13.2054878202,13.2056405429,13.2057932494,13.2059459398,13.206098614,13.2062512721,13.206403914,13.2065565397,13.2067091494,13.2068617428, 13.2070143202,13.2071668814,13.2073194265,13.2074719554,13.2076244682,13.2077769649,13.2079294455,13.20808191,13.2082343583,13.2083867906,13.2085392067,13.2086916068,13.2088439907,13.2089963586,13.2091487104,13.209301046, 13.2094533656,13.2096056691,13.2097579566,13.2099102279,13.2100624832,13.2102147225,13.2103669456,13.2105191527,13.2106713438,13.2108235188,13.2109756777,13.2111278206,13.2112799475,13.2114320583,13.2115841531,13.2117362318, 13.2118882945,13.2120403412,13.2121923719,13.2123443866,13.2124963852,13.2126483678,13.2128003344,13.212952285,13.2131042196,13.2132561382,13.2134080409,13.2135599275,13.2137117981,13.2138636527,13.2140154914,13.2141673141, 13.2143191208,13.2144709115,13.2146226863,13.2147744451,13.2149261879,13.2150779148,13.2152296257,13.2153813207,13.2155329997,13.2156846628,13.21583631,13.2159879412,13.2161395564,13.2162911558,13.2164427392,13.2165943066, 13.2167458582,13.2168973938,13.2170489136,13.2172004174,13.2173519053,13.2175033773,13.2176548334,13.2178062736,13.2179576979,13.2181091063,13.2182604988,13.2184118754,13.2185632362,13.2187145811,13.2188659101,13.2190172232, 13.2191685205,13.2193198019,13.2194710674,13.2196223171,13.2197735509,13.2199247689,13.220075971,13.2202271573,13.2203783277,13.2205294823,13.2206806211,13.220831744,13.2209828511,13.2211339424,13.2212850178,13.2214360774, 13.2215871213,13.2217381493,13.2218891615,13.2220401579,13.2221911385,13.2223421032,13.2224930522,13.2226439855,13.2227949029,13.2229458045,13.2230966903,13.2232475604,13.2233984147,13.2235492532,13.223700076,13.223850883, 13.2240016742,13.2241524497,13.2243032094,13.2244539533,13.2246046815,13.224755394,13.2249060907,13.2250567717,13.2252074369,13.2253580865,13.2255087202,13.2256593383,13.2258099406,13.2259605272,13.2261110981,13.2262616533, 13.2264121928,13.2265627166,13.2267132246,13.226863717,13.2270141936,13.2271646546,13.2273150999,13.2274655295,13.2276159434,13.2277663416,13.2279167242,13.2280670911,13.2282174423,13.2283677778,13.2285180977,13.2286684019, 13.2288186905,13.2289689634,13.2291192207,13.2292694623,13.2294196882,13.2295698986,13.2297200932,13.2298702723,13.2300204357,13.2301705835,13.2303207157,13.2304708322,13.2306209331,13.2307710184,13.2309210881,13.2310711422, 13.2312211807,13.2313712036,13.2315212109,13.2316712026,13.2318211787,13.2319711392,13.2321210841,13.2322710134,13.2324209272,13.2325708254,13.232720708,13.232870575,13.2330204265,13.2331702624,13.2333200827,13.2334698875, 13.2336196768,13.2337694504,13.2339192086,13.2340689512,13.2342186782,13.2343683898,13.2345180857,13.2346677662,13.2348174311,13.2349670805,13.2351167144,13.2352663328,13.2354159356,13.2355655229,13.2357150948,13.2358646511, 13.2360141919,13.2361637172,13.236313227,13.2364627214,13.2366122002,13.2367616636,13.2369111114,13.2370605438,13.2372099608,13.2373593622,13.2375087482,13.2376581187,13.2378074737,13.2379568133,13.2381061374,13.2382554461, 13.2384047393,13.2385540171,13.2387032794,13.2388525263,13.2390017578,13.2391509738,13.2393001744,13.2394493595,13.2395985292,13.2397476836,13.2398968224,13.2400459459,13.240195054,13.2403441466,13.2404932239,13.2406422857, 13.2407913322,13.2409403632,13.2410893789,13.2412383791,13.241387364,13.2415363335,13.2416852876,13.2418342263,13.2419831497,13.2421320577,13.2422809503,13.2424298276,13.2425786895,13.242727536,13.2428763672,13.243025183, 13.2431739835,13.2433227686,13.2434715384,13.2436202928,13.243769032,13.2439177557,13.2440664642,13.2442151573,13.2443638351,13.2445124976,13.2446611448,13.2448097766,13.2449583932,13.2451069944,13.2452555803,13.2454041509, 13.2455527063,13.2457012463,13.245849771,13.2459982805,13.2461467746,13.2462952535,13.2464437171,13.2465921654,13.2467405985,13.2468890163,13.2470374188,13.247185806,13.247334178,13.2474825348,13.2476308762,13.2477792025, 13.2479275134,13.2480758092,13.2482240897,13.2483723549,13.2485206049,13.2486688397,13.2488170593,13.2489652636,13.2491134527,13.2492616266,13.2494097853,13.2495579287,13.249706057,13.24985417,13.2500022678,13.2501503505, 13.2502984179,13.2504464701,13.2505945072,13.2507425291,13.2508905357,13.2510385272,13.2511865035,13.2513344647,13.2514824106,13.2516303414,13.251778257,13.2519261575,13.2520740428,13.2522219129,13.2523697679,13.2525176078, 13.2526654325,13.252813242,13.2529610364,13.2531088157,13.2532565798,13.2534043288,13.2535520626,13.2536997814,13.253847485,13.2539951735,13.2541428469,13.2542905051,13.2544381483,13.2545857763,13.2547333892,13.2548809871, 13.2550285698,13.2551761375,13.25532369,13.2554712275,13.2556187498,13.2557662571,13.2559137493,13.2560612265,13.2562086885,13.2563561355,13.2565035674,13.2566509843,13.2567983861,13.2569457728,13.2570931445,13.2572405011, 13.2573878427,13.2575351692,13.2576824807,13.2578297772,13.2579770586,13.2581243249,13.2582715763,13.2584188126,13.2585660339,13.2587132402,13.2588604314,13.2590076076,13.2591547689,13.2593019151,13.2594490463,13.2595961625, 13.2597432637,13.2598903499,13.2600374211,13.2601844773,13.2603315186,13.2604785448,13.2606255561,13.2607725524,13.2609195337,13.2610665,13.2612134514,13.2613603878,13.2615073092,13.2616542157,13.2618011072,13.2619479838, 13.2620948454,13.262241692,13.2623885238,13.2625353405,13.2626821424,13.2628289293,13.2629757012,13.2631224583,13.2632692004,13.2634159276,13.2635626398,13.2637093372,13.2638560196,13.2640026871,13.2641493397,13.2642959774, 13.2644426002,13.2645892081,13.2647358011,13.2648823792,13.2650289425,13.2651754908,13.2653220242,13.2654685428,13.2656150465,13.2657615353,13.2659080092,13.2660544683,13.2662009125,13.2663473418,13.2664937563,13.2666401559, 13.2667865407,13.2669329106,13.2670792657,13.2672256059,13.2673719313,13.2675182418,13.2676645375,13.2678108184,13.2679570844,13.2681033356,13.268249572,13.2683957936,13.2685420003,13.2686881922,13.2688343693,13.2689805316, 13.2691266791,13.2692728118,13.2694189297,13.2695650328,13.2697111211,13.2698571947,13.2700032534,13.2701492973,13.2702953265,13.2704413408,13.2705873404,13.2707333253,13.2708792953,13.2710252506,13.2711711911,13.2713171169, 13.2714630279,13.2716089242,13.2717548056,13.2719006724,13.2720465244,13.2721923616,13.2723381842,13.2724839919,13.272629785,13.2727755633,13.2729213269,13.2730670757,13.2732128099,13.2733585293,13.273504234,13.2736499239, 13.2737955992,13.2739412598,13.2740869056,13.2742325368,13.2743781532,13.274523755,13.2746693421,13.2748149145,13.2749604721,13.2751060151,13.2752515435,13.2753970571,13.2755425561,13.2756880404,13.27583351,13.275978965, 13.2761244053,13.2762698309,13.2764152419,13.2765606382,13.2767060199,13.2768513869,13.2769967393,13.277142077,13.2772874001,13.2774327086,13.2775780024,13.2777232816,13.2778685462,13.2780137961,13.2781590314,13.2783042521, 13.2784494582,13.2785946497,13.2787398266,13.2788849888,13.2790301364,13.2791752695,13.2793203879,13.2794654918,13.2796105811,13.2797556557,13.2799007158,13.2800457613,13.2801907922,13.2803358086,13.2804808103,13.2806257975, 13.2807707701,13.2809157282,13.2810606717,13.2812056006,13.281350515,13.2814954148,13.2816403001,13.2817851708,13.281930027,13.2820748686,13.2822196957,13.2823645082,13.2825093062,13.2826540897,13.2827988587,13.2829436131, 13.283088353,13.2832330784,13.2833777893,13.2835224856,13.2836671675,13.2838118348,13.2839564877,13.284101126,13.2842457498,13.2843903592,13.284534954,13.2846795344,13.2848241002,13.2849686516,13.2851131885,13.2852577109, 13.2854022189,13.2855467123,13.2856911913,13.2858356559,13.2859801059,13.2861245415,13.2862689627,13.2864133694,13.2865577616,13.2867021394,13.2868465027,13.2869908516,13.2871351861,13.2872795061,13.2874238117,13.2875681028, 13.2877123795,13.2878566418,13.2880008897,13.2881451232,13.2882893422,13.2884335468,13.288577737,13.2887219128,13.2888660742,13.2890102211,13.2891543537,13.2892984719,13.2894425757,13.2895866651,13.2897307401,13.2898748007, 13.2900188469,13.2901628788,13.2903068963,13.2904508994,13.2905948881,13.2907388624,13.2908828224,13.2910267681,13.2911706993,13.2913146162,13.2914585188,13.291602407,13.2917462808,13.2918901403,13.2920339855,13.2921778163, 13.2923216328,13.2924654349,13.2926092228,13.2927529962,13.2928967554,13.2930405002,13.2931842308,13.293327947,13.2934716488,13.2936153364,13.2937590097,13.2939026686,13.2940463133,13.2941899436,13.2943335597,13.2944771614, 13.2946207489,13.2947643221,13.294907881,13.2950514256,13.2951949559,13.2953384719,13.2954819737,13.2956254612,13.2957689344,13.2959123934,13.2960558381,13.2961992685,13.2963426847,13.2964860866,13.2966294743,13.2967728477, 13.2969162069,13.2970595518,13.2972028825,13.2973461989,13.2974895012,13.2976327891,13.2977760629,13.2979193224,13.2980625677,13.2982057988,13.2983490157,13.2984922183,13.2986354067,13.298778581,13.298921741,13.2990648868, 13.2992080184,13.2993511358,13.299494239,13.299637328,13.2997804029,13.2999234635,13.30006651,13.3002095422,13.3003525603,13.3004955642,13.300638554,13.3007815296,13.300924491,13.3010674382,13.3012103713,13.3013532902, 13.301496195,13.3016390856,13.3017819621,13.3019248244,13.3020676725,13.3022105065,13.3023533264,13.3024961322,13.3026389238,13.3027817013,13.3029244646,13.3030672138,13.3032099489,13.3033526699,13.3034953768,13.3036380695, 13.3037807482,13.3039234127,13.3040660631,13.3042086994,13.3043513217,13.3044939298,13.3046365238,13.3047791037,13.3049216696,13.3050642213,13.305206759,13.3053492826,13.3054917921,13.3056342875,13.3057767689,13.3059192362, 13.3060616894,13.3062041286,13.3063465537,13.3064889647,13.3066313617,13.3067737446,13.3069161135,13.3070584684,13.3072008091,13.3073431359,13.3074854486,13.3076277473,13.3077700319,13.3079123025,13.3080545591,13.3081968016, 13.3083390301,13.3084812446,13.3086234451,13.3087656316,13.3089078041,13.3090499625,13.309192107,13.3093342374,13.3094763538,13.3096184563,13.3097605447,13.3099026192,13.3100446796,13.3101867261,13.3103287586,13.3104707771, 13.3106127817,13.3107547722,13.3108967488,13.3110387114,13.3111806601,13.3113225947,13.3114645154,13.3116064222,13.311748315,13.3118901939,13.3120320587,13.3121739097,13.3123157467,13.3124575697,13.3125993789,13.312741174, 13.3128829553,13.3130247226,13.313166476,13.3133082154,13.313449941,13.3135916526,13.3137333503,13.313875034,13.3140167039,13.3141583599,13.3143000019,13.31444163,13.3145832443,13.3147248446,13.3148664311,13.3150080036, 13.3151495623,13.315291107,13.3154326379,13.3155741549,13.315715658,13.3158571473,13.3159986226,13.3161400841,13.3162815317,13.3164229655,13.3165643854,13.3167057914,13.3168471836,13.3169885619,13.3171299264,13.317271277, 13.3174126138,13.3175539367,13.3176952458,13.317836541,13.3179778224,13.31811909,13.3182603437,13.3184015836,13.3185428097,13.318684022,13.3188252204,13.318966405,13.3191075758,13.3192487328,13.319389876,13.3195310054, 13.3196721209,13.3198132227,13.3199543107,13.3200953849,13.3202364452,13.3203774918,13.3205185246,13.3206595436,13.3208005489,13.3209415403,13.321082518,13.3212234819,13.321364432,13.3215053684,13.321646291,13.3217871998, 13.3219280949,13.3220689762,13.3222098437,13.3223506975,13.3224915376,13.3226323639,13.3227731765,13.3229139753,13.3230547603,13.3231955317,13.3233362893,13.3234770332,13.3236177633,13.3237584797,13.3238991824,13.3240398714, 13.3241805466,13.3243212082,13.324461856,13.3246024901,13.3247431105,13.3248837172,13.3250243102,13.3251648895,13.3253054551,13.325446007,13.3255865452,13.3257270697,13.3258675806,13.3260080777,13.3261485612,13.326289031, 13.3264294871,13.3265699296,13.3267103583,13.3268507735,13.3269911749,13.3271315627,13.3272719368,13.3274122973,13.3275526441,13.3276929772,13.3278332968,13.3279736026,13.3281138948,13.3282541734,13.3283944384,13.3285346897, 13.3286749273,13.3288151514,13.3289553618,13.3290955586,13.3292357417,13.3293759113,13.3295160672,13.3296562095,13.3297963382,13.3299364533,13.3300765548,13.3302166427,13.330356717,13.3304967776,13.3306368247,13.3307768582, 13.3309168781,13.3310568844,13.3311968772,13.3313368563,13.3314768219,13.3316167738,13.3317567123,13.3318966371,13.3320365484,13.3321764461,13.3323163302,13.3324562008,13.3325960578,13.3327359012,13.3328757312,13.3330155475, 13.3331553503,13.3332951396,13.3334349153,13.3335746775,13.3337144261,13.3338541612,13.3339938828,13.3341335908,13.3342732853,13.3344129663,13.3345526338,13.3346922877,13.3348319281,13.334971555,13.3351111684,13.3352507683, 13.3353903547,13.3355299276,13.3356694869,13.3358090328,13.3359485652,13.3360880841,13.3362275895,13.3363670814,13.3365065598,13.3366460247,13.3367854762,13.3369249142,13.3370643387,13.3372037497,13.3373431473,13.3374825314, 13.337621902,13.3377612592,13.3379006029,13.3380399331,13.3381792499,13.3383185532,13.3384578431,13.3385971196,13.3387363826,13.3388756321,13.3390148683,13.3391540909,13.3392933002,13.339432496,13.3395716784,13.3397108473, 13.3398500029,13.339989145,13.3401282737,13.340267389,13.3404064909,13.3405455793,13.3406846544,13.340823716,13.3409627643,13.3411017991,13.3412408205,13.3413798286,13.3415188232,13.3416578045,13.3417967724,13.3419357269, 13.342074668,13.3422135957,13.3423525101,13.3424914111,13.3426302987,13.3427691729,13.3429080338,13.3430468813,13.3431857154,13.3433245362,13.3434633437,13.3436021377,13.3437409185,13.3438796858,13.3440184399,13.3441571806, 13.3442959079,13.3444346219,13.3445733226,13.3447120099,13.3448506839,13.3449893446,13.345127992,13.345266626,13.3454052467,13.3455438541,13.3456824482,13.345821029,13.3459595964,13.3460981505,13.3462366914,13.3463752189, 13.3465137332,13.3466522341,13.3467907218,13.3469291961,13.3470676572,13.3472061049,13.3473445394,13.3474829606,13.3476213686,13.3477597632,13.3478981446,13.3480365127,13.3481748675,13.3483132091,13.3484515374,13.3485898524, 13.3487281542,13.3488664428,13.349004718,13.34914298,13.3492812288,13.3494194643,13.3495576866,13.3496958957,13.3498340915,13.349972274,13.3501104433,13.3502485994,13.3503867423,13.350524872,13.3506629884,13.3508010916, 13.3509391815,13.3510772583,13.3512153219,13.3513533722,13.3514914093,13.3516294332,13.351767444,13.3519054415,13.3520434258,13.3521813969,13.3523193548,13.3524572996,13.3525952311,13.3527331495,13.3528710547,13.3530089467, 13.3531468255,13.3532846911,13.3534225436,13.3535603829,13.353698209,13.353836022,13.3539738218,13.3541116085,13.3542493819,13.3543871423,13.3545248894,13.3546626235,13.3548003444,13.3549380521,13.3550757467,13.3552134281, 13.3553510964,13.3554887516,13.3556263936,13.3557640225,13.3559016383,13.356039241,13.3561768305,13.3563144069,13.3564519702,13.3565895204,13.3567270575,13.3568645814,13.3570020923,13.35713959,13.3572770746,13.3574145462, 13.3575520046,13.35768945,13.3578268822,13.3579643014,13.3581017074,13.3582391004,13.3583764803,13.3585138471,13.3586512009,13.3587885416,13.3589258692,13.3590631837,13.3592004851,13.3593377735,13.3594750488,13.3596123111, 13.3597495603,13.3598867965,13.3600240196,13.3601612296,13.3602984266,13.3604356106,13.3605727815,13.3607099393,13.3608470842,13.360984216,13.3611213347,13.3612584405,13.3613955332,13.3615326128,13.3616696795,13.3618067331, 13.3619437737,13.3620808013,13.3622178159,13.3623548175,13.362491806,13.3626287816,13.3627657442,13.3629026937,13.3630396303,13.3631765538,13.3633134644,13.3634503619,13.3635872465,13.3637241181,13.3638609767,13.3639978224, 13.364134655,13.3642714747,13.3644082814,13.3645450751,13.3646818559,13.3648186237,13.3649553785,13.3650921203,13.3652288493,13.3653655652,13.3655022682,13.3656389582,13.3657756353,13.3659122995,13.3660489507,13.3661855889, 13.3663222142,13.3664588266,13.3665954261,13.3667320126,13.3668685862,13.3670051468,13.3671416946,13.3672782294,13.3674147512,13.3675512602,13.3676877563,13.3678242394,13.3679607096,13.368097167,13.3682336114,13.3683700429, 13.3685064615,13.3686428672,13.36877926,13.36891564,13.369052007,13.3691883611,13.3693247024,13.3694610308,13.3695973463,13.3697336489,13.3698699386,13.3700062155,13.3701424795,13.3702787306,13.3704149689,13.3705511943, 13.3706874068,13.3708236065,13.3709597933,13.3710959673,13.3712321284,13.3713682766,13.371504412,13.3716405346,13.3717766443,13.3719127412,13.3720488253,13.3721848965,13.3723209549,13.3724570004,13.3725930331,13.372729053, 13.3728650601,13.3730010544,13.3731370358,13.3732730044,13.3734089602,13.3735449032,13.3736808334,13.3738167508,13.3739526554,13.3740885471,13.3742244261,13.3743602923,13.3744961457,13.3746319863,13.3747678141,13.3749036291, 13.3750394313,13.3751752208,13.3753109975,13.3754467614,13.3755825125,13.3757182508,13.3758539764,13.3759896892,13.3761253893,13.3762610766,13.3763967511,13.3765324128,13.3766680619,13.3768036981,13.3769393216,13.3770749324, 13.3772105304,13.3773461157,13.3774816882,13.377617248,13.377752795,13.3778883293,13.3780238509,13.3781593598,13.3782948559,13.3784303393,13.37856581,13.378701268,13.3788367132,13.3789721457,13.3791075656,13.3792429727, 13.3793783671,13.3795137488,13.3796491178,13.3797844741,13.3799198176,13.3800551485,13.3801904667,13.3803257723,13.3804610651,13.3805963452,13.3807316127,13.3808668675,13.3810021096,13.381137339,13.3812725557,13.3814077598, 13.3815429512,13.3816781299,13.381813296,13.3819484494,13.3820835901,13.3822187182,13.3823538337,13.3824889364,13.3826240266,13.3827591041,13.3828941689,13.3830292211,13.3831642606,13.3832992875,13.3834343018,13.3835693035, 13.3837042925,13.3838392689,13.3839742326,13.3841091837,13.3842441222,13.3843790481,13.3845139614,13.3846488621,13.3847837501,13.3849186255,13.3850534883,13.3851883386,13.3853231762,13.3854580012,13.3855928136,13.3857276134, 13.3858624006,13.3859971753,13.3861319373,13.3862666868,13.3864014236,13.3865361479,13.3866708596,13.3868055588,13.3869402453,13.3870749193,13.3872095807,13.3873442296,13.3874788658,13.3876134896,13.3877481007,13.3878826993, 13.3880172853,13.3881518588,13.3882864198,13.3884209681,13.388555504,13.3886900273,13.388824538,13.3889590362,13.3890935219,13.389227995,13.3893624556,13.3894969037,13.3896313393,13.3897657623,13.3899001728,13.3900345707, 13.3901689562,13.3903033291,13.3904376896,13.3905720375,13.3907063729,13.3908406958,13.3909750062,13.391109304,13.3912435894,13.3913778623,13.3915121227,13.3916463706,13.391780606,13.3919148289,13.3920490394,13.3921832373, 13.3923174228,13.3924515958,13.3925857563,13.3927199043,13.3928540399,13.392988163,13.3931222736,13.3932563717,13.3933904574,13.3935245307,13.3936585915,13.3937926398,13.3939266756,13.3940606991,13.39419471,13.3943287085, 13.3944626946,13.3945966682,13.3947306294,13.3948645782,13.3949985145,13.3951324384,13.3952663498,13.3954002489,13.3955341355,13.3956680096,13.3958018714,13.3959357207,13.3960695576,13.3962033821,13.3963371942,13.3964709939, 13.3966047812,13.396738556,13.3968723185,13.3970060686,13.3971398062,13.3972735315,13.3974072444,13.3975409449,13.3976746329,13.3978083087,13.397941972,13.3980756229,13.3982092615,13.3983428876,13.3984765014,13.3986101029, 13.3987436919,13.3988772686,13.399010833,13.3991443849,13.3992779245,13.3994114517,13.3995449666,13.3996784692,13.3998119593,13.3999454371,13.4000789026,13.4002123558,13.4003457965,13.400479225,13.4006126411,13.4007460448, 13.4008794363,13.4010128154,13.4011461822,13.4012795366,13.4014128787,13.4015462085,13.401679526,13.4018128311,13.401946124,13.4020794045,13.4022126727,13.4023459286,13.4024791722,13.4026124035,13.4027456225,13.4028788292, 13.4030120236,13.4031452057,13.4032783755,13.403411533,13.4035446782,13.4036778111,13.4038109318,13.4039440402,13.4040771362,13.4042102201,13.4043432916,13.4044763508,13.4046093978,13.4047424326,13.404875455,13.4050084652, 13.4051414631,13.4052744488,13.4054074222,13.4055403834,13.4056733323,13.4058062689,13.4059391933,13.4060721055,13.4062050054,13.4063378931,13.4064707685,13.4066036317,13.4067364827,13.4068693214,13.4070021479,13.4071349622, 13.4072677642,13.4074005541,13.4075333317,13.4076660971,13.4077988502,13.4079315912,13.4080643199,13.4081970364,13.4083297408,13.4084624329,13.4085951128,13.4087277805,13.408860436,13.4089930793,13.4091257105,13.4092583294, 13.4093909361,13.4095235307,13.4096561131,13.4097886832,13.4099212412,13.4100537871,13.4101863207,13.4103188422,13.4104513515,13.4105838486,13.4107163336,13.4108488064,13.410981267,13.4111137155,13.4112461518,13.411378576, 13.411510988,13.4116433879,13.4117757756,13.4119081511,13.4120405146,13.4121728658,13.412305205,13.4124375319,13.4125698468,13.4127021495,13.4128344401,13.4129667186,13.4130989849,13.4132312391,13.4133634812,13.4134957112, 13.413627929,13.4137601348,13.4138923284,13.4140245099,13.4141566793,13.4142888366,13.4144209817,13.4145531148,13.4146852358,13.4148173447,13.4149494415,13.4150815262,13.4152135988,13.4153456593,13.4154777077,13.415609744, 13.4157417683,13.4158737805,13.4160057806,13.4161377686,13.4162697445,13.4164017084,13.4165336602,13.4166655999,13.4167975276,13.4169294432,13.4170613468,13.4171932382,13.4173251177,13.4174569851,13.4175888404,13.4177206837, 13.4178525149,13.4179843341,13.4181161412,13.4182479363,13.4183797194,13.4185114904,13.4186432494,13.4187749963,13.4189067313,13.4190384542,13.419170165,13.4193018639,13.4194335507,13.4195652255,13.4196968883,13.4198285391, 13.4199601778,13.4200918046,13.4202234193,13.4203550221,13.4204866128,13.4206181916,13.4207497583,13.420881313,13.4210128558,13.4211443865,13.4212759053,13.4214074121,13.4215389068,13.4216703897,13.4218018605,13.4219333193, 13.4220647662,13.4221962011,13.422327624,13.4224590349,13.4225904339,13.4227218209,13.4228531959,13.422984559,13.4231159101,13.4232472493,13.4233785765,13.4235098918,13.4236411951,13.4237724864,13.4239037658,13.4240350333, 13.4241662888,13.4242975324,13.424428764,13.4245599837,13.4246911915,13.4248223874,13.4249535713,13.4250847432,13.4252159033,13.4253470514,13.4254781876,13.4256093119,13.4257404243,13.4258715248,13.4260026133,13.42613369, 13.4262647547,13.4263958075,13.4265268485,13.4266578775,13.4267888946,13.4269198998,13.4270508932,13.4271818746,13.4273128441,13.4274438018,13.4275747476,13.4277056815,13.4278366035,13.4279675136,13.4280984118,13.4282292982, 13.4283601727,13.4284910353,13.4286218861,13.428752725,13.428883552,13.4290143672,13.4291451705,13.4292759619,13.4294067415,13.4295375092,13.4296682651,13.4297990092,13.4299297414,13.4300604617,13.4301911702,13.4303218668, 13.4304525517,13.4305832246,13.4307138858,13.4308445351,13.4309751726,13.4311057982,13.4312364121,13.4313670141,13.4314976043,13.4316281826,13.4317587492,13.4318893039,13.4320198468,13.4321503779,13.4322808972,13.4324114047, 13.4325419004,13.4326723843,13.4328028564,13.4329333166,13.4330637651,13.4331942018,13.4333246267,13.4334550398,13.4335854412,13.4337158307,13.4338462084,13.4339765744,13.4341069286,13.434237271,13.4343676017,13.4344979205, 13.4346282276,13.434758523,13.4348888065,13.4350190783,13.4351493384,13.4352795866,13.4354098232,13.4355400479,13.4356702609,13.4358004622,13.4359306517,13.4360608295,13.4361909955,13.4363211498,13.4364512923,13.4365814231, 13.4367115421,13.4368416495,13.436971745,13.4371018289,13.437231901,13.4373619614,13.4374920101,13.4376220471,13.4377520723,13.4378820858,13.4380120877,13.4381420777,13.4382720561,13.4384020228,13.4385319778,13.438661921, 13.4387918526,13.4389217724,13.4390516806,13.4391815771,13.4393114618,13.4394413349,13.4395711963,13.439701046,13.439830884,13.4399607103,13.440090525,13.4402203279,13.4403501192,13.4404798988,13.4406096667,13.440739423, 13.4408691676,13.4409989005,13.4411286218,13.4412583314,13.4413880293,13.4415177156,13.4416473903,13.4417770532,13.4419067045,13.4420363442,13.4421659722,13.4422955886,13.4424251933,13.4425547864,13.4426843679,13.4428139377, 13.4429434958,13.4430730424,13.4432025773,13.4433321006,13.4434616122,13.4435911123,13.4437206007,13.4438500774,13.4439795426,13.4441089961,13.4442384381,13.4443678684,13.4444972871,13.4446266942,13.4447560897,13.4448854736, 13.4450148459,13.4451442066,13.4452735556,13.4454028931,13.445532219,13.4456615333,13.445790836,13.4459201272,13.4460494067,13.4461786747,13.4463079311,13.4464371758,13.4465664091,13.4466956307,13.4468248408,13.4469540393, 13.4470832262,13.4472124016,13.4473415654,13.4474707176,13.4475998583,13.4477289874,13.447858105,13.447987211,13.4481163054,13.4482453883,13.4483744597,13.4485035195,13.4486325677,13.4487616045,13.4488906296,13.4490196433, 13.4491486454,13.4492776359,13.449406615,13.4495355825,13.4496645385,13.4497934829,13.4499224159,13.4500513373,13.4501802472,13.4503091455,13.4504380324,13.4505669077,13.4506957716,13.4508246239,13.4509534647,13.451082294, 13.4512111118,13.4513399181,13.4514687129,13.4515974963,13.4517262681,13.4518550284,13.4519837772,13.4521125146,13.4522412404,13.4523699548,13.4524986577,13.4526273491,13.452756029,13.4528846975,13.4530133545,13.453142, 13.453270634,13.4533992566,13.4535278677,13.4536564673,13.4537850555,13.4539136322,13.4540421975,13.4541707513,13.4542992936,13.4544278245,13.454556344,13.454684852,13.4548133485,13.4549418336,13.4550703073,13.4551987695, 13.4553272203,13.4554556597,13.4555840876,13.4557125041,13.4558409091,13.4559693028,13.456097685,13.4562260557,13.4563544151,13.4564827631,13.4566110996,13.4567394247,13.4568677384,13.4569960407,13.4571243315,13.457252611, 13.4573808791,13.4575091357,13.457637381,13.4577656149,13.4578938373,13.4580220484,13.4581502481,13.4582784363,13.4584066132,13.4585347787,13.4586629329,13.4587910756,13.458919207,13.4590473269,13.4591754356,13.4593035328, 13.4594316186,13.4595596931,13.4596877562,13.459815808,13.4599438484,13.4600718774,13.4601998951,13.4603279014,13.4604558963,13.4605838799,13.4607118521,13.460839813,13.4609677626,13.4610957008,13.4612236276,13.4613515431, 13.4614794473,13.4616073401,13.4617352216,13.4618630918,13.4619909506,13.4621187981,13.4622466342,13.4623744591,13.4625022726,13.4626300748,13.4627578657,13.4628856452,13.4630134134,13.4631411704,13.463268916,13.4633966503, 13.4635243733,13.463652085,13.4637797853,13.4639074744,13.4640351522,13.4641628187,13.4642904739,13.4644181177,13.4645457503,13.4646733716,13.4648009817,13.4649285804,13.4650561678,13.465183744,13.4653113089,13.4654388625, 13.4655664048,13.4656939359,13.4658214556,13.4659489642,13.4660764614,13.4662039474,13.4663314221,13.4664588855,13.4665863377,13.4667137786,13.4668412083,13.4669686267,13.4670960339,13.4672234298,13.4673508145,13.4674781879, 13.4676055501,13.467732901,13.4678602407,13.4679875692,13.4681148864,13.4682421924,13.4683694871,13.4684967706,13.4686240429,13.468751304,13.4688785538,13.4690057924,13.4691330198,13.469260236,13.469387441,13.4695146347, 13.4696418172,13.4697689886,13.4698961487,13.4700232976,13.4701504353,13.4702775618,13.4704046771,13.4705317812,13.4706588741,13.4707859558,13.4709130263,13.4710400856,13.4711671337,13.4712941707,13.4714211964,13.471548211, 13.4716752144,13.4718022066,13.4719291876,13.4720561575,13.4721831162,13.4723100637,13.4724370001,13.4725639252,13.4726908392,13.4728177421,13.4729446338,13.4730715143,13.4731983837,13.4733252419,13.473452089,13.4735789249, 13.4737057496,13.4738325632,13.4739593657,13.474086157,13.4742129372,13.4743397062,13.4744664641,13.4745932109,13.4747199465,13.474846671,13.4749733844,13.4751000866,13.4752267777,13.4753534577,13.4754801266,13.4756067843, 13.475733431,13.4758600665,13.4759866909,13.4761133042,13.4762399063,13.4763664974,13.4764930773,13.4766196462,13.4767462039,13.4768727506,13.4769992861,13.4771258106,13.4772523239,13.4773788262,13.4775053174,13.4776317975, 13.4777582664,13.4778847244,13.4780111712,13.4781376069,13.4782640316,13.4783904452,13.4785168477,13.4786432391,13.4787696195,13.4788959888,13.479022347,13.4791486942,13.4792750303,13.4794013553,13.4795276693,13.4796539722, 13.479780264,13.4799065448,13.4800328146,13.4801590733,13.4802853209,13.4804115575,13.4805377831,13.4806639976,13.4807902011,13.4809163935,13.4810425749,13.4811687453,13.4812949046,13.4814210529,13.4815471902,13.4816733164, 13.4817994317,13.4819255359,13.482051629,13.4821777112,13.4823037823,13.4824298424,13.4825558915,13.4826819296,13.4828079567,13.4829339728,13.4830599779,13.4831859719,13.483311955,13.4834379271,13.4835638881,13.4836898382, 13.4838157773,13.4839417053,13.4840676224,13.4841935285,13.4843194236,13.4844453078,13.4845711809,13.4846970431,13.4848228943,13.4849487345,13.4850745637,13.485200382,13.4853261892,13.4854519856,13.4855777709,13.4857035453, 13.4858293087,13.4859550612,13.4860808027,13.4862065332,13.4863322528,13.4864579614,13.4865836591,13.4867093458,13.4868350216,13.4869606864,13.4870863403,13.4872119832,13.4873376152,13.4874632363,13.4875888464,13.4877144456, 13.4878400338,13.4879656111,13.4880911775,13.488216733,13.4883422775,13.4884678111,13.4885933338,13.4887188456,13.4888443465,13.4889698364,13.4890953154,13.4892207835,13.4893462407,13.489471687,13.4895971224,13.4897225469, 13.4898479604,13.4899733631,13.4900987549,13.4902241358,13.4903495057,13.4904748648,13.490600213,13.4907255503,13.4908508767,13.4909761923,13.4911014969,13.4912267907,13.4913520736,13.4914773456,13.4916026067,13.4917278569, 13.4918530963,13.4919783248,13.4921035425,13.4922287493,13.4923539452,13.4924791302,13.4926043044,13.4927294677,13.4928546202,13.4929797618,13.4931048925,13.4932300124,13.4933551215,13.4934802197,13.4936053071,13.4937303836, 13.4938554492,13.4939805041,13.4941055481,13.4942305812,13.4943556035,13.494480615,13.4946056157,13.4947306055,13.4948555845,13.4949805527,13.49510551,13.4952304565,13.4953553922,13.4954803171,13.4956052312,13.4957301344, 13.4958550269,13.4959799085,13.4961047793,13.4962296394,13.4963544886,13.496479327,13.4966041546,13.4967289714,13.4968537774,13.4969785726,13.497103357,13.4972281306,13.4973528935,13.4974776455,13.4976023868,13.4977271173, 13.497851837,13.4979765459,13.498101244,13.4982259313,13.4983506079,13.4984752737,13.4985999288,13.498724573,13.4988492065,13.4989738293,13.4990984412,13.4992230424,13.4993476329,13.4994722126,13.4995967815,13.4997213397, 13.4998458871,13.4999704238,13.5000949497,13.5002194648,13.5003439693,13.500468463,13.5005929459,13.5007174181,13.5008418796,13.5009663303,13.5010907703,13.5012151995,13.5013396181,13.5014640259,13.5015884229,13.5017128093, 13.5018371849,13.5019615498,13.502085904,13.5022102474,13.5023345802,13.5024589022,13.5025832136,13.5027075142,13.5028318041,13.5029560833,13.5030803518,13.5032046095,13.5033288566,13.503453093,13.5035773187,13.5037015337, 13.503825738,13.5039499316,13.5040741145,13.5041982867,13.5043224483,13.5044465991,13.5045707393,13.5046948688,13.5048189876,13.5049430958,13.5050671932,13.50519128,13.5053153561,13.5054394216,13.5055634764,13.5056875205, 13.5058115539,13.5059355767,13.5060595888,13.5061835903,13.5063075811,13.5064315613,13.5065555308,13.5066794896,13.5068034378,13.5069273753,13.5070513022,13.5071752185,13.5072991241,13.5074230191,13.5075469034,13.5076707771, 13.5077946402,13.5079184926,13.5080423344,13.5081661656,13.5082899861,13.5084137961,13.5085375953,13.508661384,13.5087851621,13.5089089295,13.5090326863,13.5091564325,13.5092801681,13.5094038931,13.5095276074,13.5096513112, 13.5097750043,13.5098986869,13.5100223588,13.5101460202,13.5102696709,13.510393311,13.5105169406,13.5106405596,13.5107641679,13.5108877657,13.5110113529,13.5111349295,13.5112584955,13.5113820509,13.5115055958,13.5116291301, 13.5117526538,13.5118761669,13.5119996694,13.5121231614,13.5122466428,13.5123701137,13.5124935739,13.5126170237,13.5127404628,13.5128638914,13.5129873094,13.5131107169,13.5132341138,13.5133575002,13.513480876,13.5136042412, 13.513727596,13.5138509401,13.5139742737,13.5140975968,13.5142209094,13.5143442114,13.5144675028,13.5145907837,13.5147140541,13.514837314,13.5149605633,13.5150838021,13.5152070304,13.5153302482,13.5154534554,13.5155766521, 13.5156998383,13.515823014,13.5159461791,13.5160693338,13.5161924779,13.5163156115,13.5164387346,13.5165618472,13.5166849493,13.5168080409,13.516931122,13.5170541926,13.5171772527,13.5173003023,13.5174233414,13.51754637, 13.5176693881,13.5177923958,13.5179153929,13.5180383796,13.5181613558,13.5182843215,13.5184072767,13.5185302214,13.5186531557,13.5187760795,13.5188989928,13.5190218956,13.519144788,13.5192676699,13.5193905413,13.5195134023, 13.5196362528,13.5197590929,13.5198819225,13.5200047416,13.5201275503,13.5202503486,13.5203731363,13.5204959137,13.5206186806,13.520741437,13.520864183,13.5209869185,13.5211096437,13.5212323583,13.5213550626,13.5214777564, 13.5216004397,13.5217231127,13.5218457752,13.5219684272,13.5220910689,13.5222137001,13.5223363209,13.5224589313,13.5225815313,13.5227041208,13.5228266999,13.5229492686,13.5230718269,13.5231943748,13.5233169123,13.5234394394, 13.5235619561,13.5236844623,13.5238069582,13.5239294437,13.5240519187,13.5241743834,13.5242968377,13.5244192815,13.524541715,13.5246641381,13.5247865509,13.5249089532,13.5250313451,13.5251537267,13.5252760979,13.5253984587, 13.5255208091,13.5256431491,13.5257654788,13.5258877981,13.5260101071,13.5261324056,13.5262546938,13.5263769717,13.5264992391,13.5266214962,13.526743743,13.5268659794,13.5269882054,13.5271104211,13.5272326264,13.5273548214, 13.5274770061,13.5275991803,13.5277213443,13.5278434979,13.5279656411,13.528087774,13.5282098966,13.5283320089,13.5284541108,13.5285762023,13.5286982836,13.5288203545,13.5289424151,13.5290644653,13.5291865053,13.5293085349, 13.5294305541,13.5295525631,13.5296745618,13.5297965501,13.5299185281,13.5300404958,13.5301624532,13.5302844003,13.5304063371,13.5305282636,13.5306501798,13.5307720856,13.5308939812,13.5310158665,13.5311377414,13.5312596061, 13.5313814605,13.5315033046,13.5316251384,13.5317469619,13.5318687752,13.5319905781,13.5321123708,13.5322341532,13.5323559253,13.5324776871,13.5325994387,13.53272118,13.532842911,13.5329646317,13.5330863422,13.5332080424, 13.5333297323,13.533451412,13.5335730814,13.5336947405,13.5338163894,13.5339380281,13.5340596565,13.5341812746,13.5343028825,13.5344244801,13.5345460675,13.5346676446,13.5347892115,13.5349107681,13.5350323145,13.5351538507, 13.5352753766,13.5353968923,13.5355183978,13.535639893,13.535761378,13.5358828528,13.5360043173,13.5361257716,13.5362472157,13.5363686496,13.5364900732,13.5366114866,13.5367328898,13.5368542828,13.5369756656,13.5370970382, 13.5372184005,13.5373397527,13.5374610946,13.5375824264,13.5377037479,13.5378250592,13.5379463604,13.5380676513,13.5381889321,13.5383102026,13.538431463,13.5385527131,13.5386739531,13.5387951829,13.5389164025,13.5390376119, 13.5391588111,13.5392800002,13.539401179,13.5395223477,13.5396435062,13.5397646546,13.5398857928,13.5400069208,13.5401280386,13.5402491462,13.5403702437,13.5404913311,13.5406124082,13.5407334753,13.5408545321,13.5409755788, 13.5410966153,13.5412176417,13.541338658,13.5414596641,13.54158066,13.5417016458,13.5418226214,13.5419435869,13.5420645423,13.5421854875,13.5423064226,13.5424273475,13.5425482623,13.542669167,13.5427900616,13.542910946, 13.5430318203,13.5431526844,13.5432735384,13.5433943824,13.5435152162,13.5436360398,13.5437568534,13.5438776568,13.5439984501,13.5441192333,13.5442400064,13.5443607694,13.5444815223,13.5446022651,13.5447229978,13.5448437203, 13.5449644328,13.5450851352,13.5452058274,13.5453265096,13.5454471817,13.5455678437,13.5456884956,13.5458091374,13.5459297691,13.5460503907,13.5461710023,13.5462916037,13.5464121951,13.5465327764,13.5466533477,13.5467739088, 13.5468944599,13.5470150009,13.5471355318,13.5472560527,13.5473765635,13.5474970642,13.5476175549,13.5477380355,13.5478585061,13.5479789665,13.548099417,13.5482198574,13.5483402877,13.5484607079,13.5485811182,13.5487015183, 13.5488219085,13.5489422885,13.5490626586,13.5491830186,13.5493033685,13.5494237084,13.5495440383,13.5496643581,13.5497846679,13.5499049677,13.5500252575,13.5501455372,13.5502658069,13.5503860665,13.5505063162,13.5506265558, 13.5507467854,13.550867005,13.5509872145,13.5511074141,13.5512276036,13.5513477831,13.5514679526,13.5515881121,13.5517082616,13.5518284011,13.5519485306,13.5520686501,13.5521887596,13.552308859,13.5524289485,13.552549028, 13.5526690975,13.552789157,13.5529092065,13.5530292461,13.5531492756,13.5532692952,13.5533893047,13.5535093043,13.5536292939,13.5537492735,13.5538692432,13.5539892029,13.5541091526,13.5542290923,13.5543490221,13.5544689419, 13.5545888517,13.5547087515,13.5548286414,13.5549485214,13.5550683913,13.5551882513,13.5553081014,13.5554279415,13.5555477716,13.5556675918,13.5557874021,13.5559072024,13.5560269927,13.5561467731,13.5562665436,13.5563863041, 13.5565060547,13.5566257953,13.556745526,13.5568652468,13.5569849576,13.5571046585,13.5572243495,13.5573440305,13.5574637016,13.5575833628,13.557703014,13.5578226554,13.5579422868,13.5580619083,13.5581815199,13.5583011215, 13.5584207133,13.5585402951,13.558659867,13.558779429,13.5588989811,13.5590185233,13.5591380556,13.559257578,13.5593770905,13.5594965931,13.5596160858,13.5597355686,13.5598550415,13.5599745045,13.5600939576,13.5602134009, 13.5603328342,13.5604522577,13.5605716712,13.5606910749,13.5608104687,13.5609298527,13.5610492267,13.5611685909,13.5612879452,13.5614072896,13.5615266241,13.5616459488,13.5617652636,13.5618845686,13.5620038637,13.5621231489, 13.5622424242,13.5623616897,13.5624809453,13.5626001911,13.562719427,13.5628386531,13.5629578693,13.5630770757,13.5631962722,13.5633154589,13.5634346357,13.5635538027,13.5636729598,13.5637921071,13.5639112446,13.5640303722, 13.56414949,13.5642685979,13.5643876961,13.5645067843,13.5646258628,13.5647449314,13.5648639902,13.5649830392,13.5651020784,13.5652211077,13.5653401272,13.5654591369,13.5655781368,13.5656971268,13.5658161071,13.5659350775, 13.5660540382,13.566172989,13.56629193,13.5664108612,13.5665297826,13.5666486942,13.566767596,13.566886488,13.5670053702,13.5671242427,13.5672431053,13.5673619581,13.5674808011,13.5675996344,13.5677184579,13.5678372715, 13.5679560754,13.5680748695,13.5681936539,13.5683124284,13.5684311932,13.5685499482,13.5686686934,13.5687874288,13.5689061545,13.5690248704,13.5691435765,13.5692622729,13.5693809595,13.5694996364,13.5696183034,13.5697369608, 13.5698556083,13.5699742461,13.5700928742,13.5702114925,13.570330101,13.5704486998,13.5705672889,13.5706858682,13.5708044377,13.5709229975,13.5710415476,13.5711600879,13.5712786185,13.5713971394,13.5715156505,13.5716341519, 13.5717526435,13.5718711254,13.5719895976,13.5721080601,13.5722265128,13.5723449558,13.5724633891,13.5725818126,13.5727002265,13.5728186306,13.572937025,13.5730554097,13.5731737847,13.57329215,13.5734105055,13.5735288514, 13.5736471875,13.5737655139,13.5738838307,13.5740021377,13.574120435,13.5742387226,13.5743570006,13.5744752688,13.5745935273,13.5747117762,13.5748300153,13.5749482448,13.5750664646,13.5751846747,13.5753028751,13.5754210658, 13.5755392468,13.5756574182,13.5757755799,13.5758937319,13.5760118742,13.5761300069,13.5762481298,13.5763662432,13.5764843468,13.5766024408,13.5767205251,13.5768385997,13.5769566647,13.57707472,13.5771927657,13.5773108017, 13.577428828,13.5775468447,13.5776648518,13.5777828492,13.5779008369,13.578018815,13.5781367834,13.5782547422,13.5783726914,13.5784906309,13.5786085607,13.578726481,13.5788443916,13.5789622925,13.5790801838,13.5791980655, 13.5793159376,13.5794338,13.5795516528,13.579669496,13.5797873295,13.5799051535,13.5800229678,13.5801407724,13.5802585675,13.5803763529,13.5804941288,13.580611895,13.5807296516,13.5808473986,13.580965136,13.5810828638, 13.5812005819,13.5813182905,13.5814359895,13.5815536788,13.5816713586,13.5817890287,13.5819066893,13.5820243403,13.5821419817,13.5822596134,13.5823772356,13.5824948482,13.5826124513,13.5827300447,13.5828476286,13.5829652028, 13.5830827675,13.5832003226,13.5833178681,13.5834354041,13.5835529305,13.5836704473,13.5837879545,13.5839054522,13.5840229403,13.5841404188,13.5842578877,13.5843753471,13.584492797,13.5846102372,13.584727668,13.5848450891, 13.5849625007,13.5850799028,13.5851972953,13.5853146782,13.5854320516,13.5855494154,13.5856667697,13.5857841145,13.5859014497,13.5860187754,13.5861360915,13.5862533981,13.5863706951,13.5864879826,13.5866052606,13.586722529, 13.586839788,13.5869570373,13.5870742772,13.5871915075,13.5873087283,13.5874259396,13.5875431414,13.5876603336,13.5877775163,13.5878946895,13.5880118532,13.5881290074,13.588246152,13.5883632872,13.5884804128,13.588597529, 13.5887146356,13.5888317327,13.5889488203,13.5890658984,13.589182967,13.5893000262,13.5894170758,13.5895341159,13.5896511465,13.5897681676,13.5898851793,13.5900021814,13.5901191741,13.5902361573,13.590353131,13.5904700952, 13.5905870499,13.5907039952,13.5908209309,13.5909378572,13.591054774,13.5911716814,13.5912885792,13.5914054676,13.5915223466,13.591639216,13.591756076,13.5918729266,13.5919897676,13.5921065992,13.5922234214,13.592340234, 13.5924570373,13.592573831,13.5926906154,13.5928073902,13.5929241556,13.5930409116,13.5931576581,13.5932743952,13.5933911228,13.593507841,13.5936245497,13.593741249,13.5938579389,13.5939746193,13.5940912903,13.5942079518, 13.5943246039,13.5944412466,13.5945578799,13.5946745037,13.5947911181,13.5949077231,13.5950243186,13.5951409047,13.5952574814,13.5953740487,13.5954906066,13.5956071551,13.5957236941,13.5958402237,13.5959567439,13.5960732547, 13.5961897561,13.5963062481,13.5964227307,13.5965392039,13.5966556677,13.5967721221,13.596888567,13.5970050026,13.5971214288,13.5972378456,13.597354253,13.597470651,13.5975870396,13.5977034188,13.5978197886,13.5979361491, 13.5980525002,13.5981688418,13.5982851741,13.5984014971,13.5985178106,13.5986341148,13.5987504096,13.598866695,13.598982971,13.5990992377,13.599215495,13.599331743,13.5994479815,13.5995642107,13.5996804306,13.5997966411, 13.5999128422,13.600029034,13.6001452164,13.6002613894,13.6003775531,13.6004937075,13.6006098524,13.6007259881,13.6008421144,13.6009582313,13.6010743389,13.6011904372,13.6013065261,13.6014226057,13.6015386759,13.6016547368, 13.6017707884,13.6018868306,13.6020028635,13.6021188871,13.6022349013,13.6023509062,13.6024669018,13.6025828881,13.602698865,13.6028148326,13.6029307909,13.6030467399,13.6031626795,13.6032786099,13.6033945309,13.6035104426, 13.603626345,13.6037422381,13.6038581218,13.6039739963,13.6040898615,13.6042057173,13.6043215639,13.6044374011,13.6045532291,13.6046690477,13.6047848571,13.6049006571,13.6050164479,13.6051322294,13.6052480016,13.6053637645, 13.6054795181,13.6055952624,13.6057109974,13.6058267232,13.6059424396,13.6060581468,13.6061738447,13.6062895333,13.6064052127,13.6065208828,13.6066365436,13.6067521951,13.6068678374,13.6069834704,13.6070990941,13.6072147086, 13.6073303137,13.6074459097,13.6075614964,13.6076770738,13.6077926419,13.6079082008,13.6080237505,13.6081392908,13.608254822,13.6083703439,13.6084858565,13.6086013599,13.608716854,13.6088323389,13.6089478146,13.609063281, 13.6091787381,13.6092941861,13.6094096248,13.6095250542,13.6096404744,13.6097558854,13.6098712872,13.6099866797,13.610102063,13.6102174371,13.6103328019,13.6104481575,13.6105635039,13.6106788411,13.6107941691,13.6109094878, 13.6110247973,13.6111400976,13.6112553887,13.6113706706,13.6114859432,13.6116012067,13.6117164609,13.611831706,13.6119469418,13.6120621685,13.6121773859,13.6122925941,13.6124077931,13.612522983,13.6126381636,13.612753335, 13.6128684973,13.6129836503,13.6130987942,13.6132139289,13.6133290544,13.6134441707,13.6135592778,13.6136743757,13.6137894645,13.613904544,13.6140196144,13.6141346757,13.6142497277,13.6143647706,13.6144798042,13.6145948288, 13.6147098441,13.6148248503,13.6149398473,13.6150548352,13.6151698138,13.6152847834,13.6153997437,13.6155146949,13.615629637,13.6157445699,13.6158594936,13.6159744082,13.6160893136,13.6162042099,13.616319097,13.616433975, 13.6165488438,13.6166637035,13.616778554,13.6168933954,13.6170082277,13.6171230508,13.6172378647,13.6173526696,13.6174674653,13.6175822519,13.6176970293,13.6178117976,13.6179265568,13.6180413069,13.6181560478,13.6182707796, 13.6183855023,13.6185002158,13.6186149203,13.6187296156,13.6188443018,13.6189589788,13.6190736468,13.6191883057,13.6193029554,13.619417596,13.6195322276,13.61964685,13.6197614633,13.6198760675,13.6199906626,13.6201052486, 13.6202198255,13.6203343933,13.620448952,13.6205635016,13.6206780421,13.6207925736,13.6209070959,13.6210216091,13.6211361133,13.6212506083,13.6213650943,13.6214795712,13.621594039,13.6217084977,13.6218229474,13.621937388, 13.6220518195,13.6221662419,13.6222806552,13.6223950595,13.6225094547,13.6226238408,13.6227382179,13.6228525859,13.6229669448,13.6230812947,13.6231956355,13.6233099672,13.6234242899,13.6235386035,13.6236529081,13.6237672036, 13.62388149,13.6239957674,13.6241100358,13.6242242951,13.6243385453,13.6244527865,13.6245670187,13.6246812418,13.6247954559,13.6249096609,13.6250238569,13.6251380438,13.6252522217,13.6253663906,13.6254805505,13.6255947013, 13.6257088431,13.6258229758,13.6259370995,13.6260512142,13.6261653199,13.6262794166,13.6263935042,13.6265075828,13.6266216524,13.6267357129,13.6268497645,13.626963807,13.6270778405,13.627191865,13.6273058805,13.627419887, 13.6275338845,13.6276478729,13.6277618524,13.6278758229,13.6279897843,13.6281037368,13.6282176802,13.6283316147,13.6284455401,13.6285594566,13.6286733641,13.6287872625,13.628901152,13.6290150325,13.629128904,13.6292427665, 13.6293566201,13.6294704646,13.6295843002,13.6296981268,13.6298119444,13.629925753,13.6300395527,13.6301533433,13.630267125,13.6303808978,13.6304946615,13.6306084163,13.6307221621,13.630835899,13.6309496268,13.6310633457, 13.6311770557,13.6312907567,13.6314044487,13.6315181318,13.6316318059,13.6317454711,13.6318591273,13.6319727745,13.6320864128,13.6322000422,13.6323136626,13.632427274,13.6325408765,13.6326544701,13.6327680547,13.6328816304, 13.6329951971,13.6331087549,13.6332223038,13.6333358437,13.6334493747,13.6335628968,13.6336764099,13.6337899141,13.6339034093,13.6340168957,13.6341303731,13.6342438416,13.6343573011,13.6344707518,13.6345841935,13.6346976263, 13.6348110502,13.6349244651,13.6350378712,13.6351512683,13.6352646565,13.6353780359,13.6354914063,13.6356047677,13.6357181203,13.635831464,13.6359447988,13.6360581247,13.6361714416,13.6362847497,13.6363980489,13.6365113392, 13.6366246205,13.636737893,13.6368511566,13.6369644113,13.6370776571,13.6371908941,13.6373041221,13.6374173413,13.6375305515,13.6376437529,13.6377569454,13.637870129,13.6379833038,13.6380964696,13.6382096266,13.6383227747, 13.638435914,13.6385490444,13.6386621659,13.6387752785,13.6388883823,13.6390014771,13.6391145632,13.6392276403,13.6393407087,13.6394537681,13.6395668187,13.6396798604,13.6397928933,13.6399059173,13.6400189325,13.6401319388, 13.6402449362,13.6403579248,13.6404709046,13.6405838755,13.6406968376,13.6408097908,13.6409227352,13.6410356707,13.6411485974,13.6412615153,13.6413744243,13.6414873245,13.6416002158,13.6417130984,13.641825972,13.6419388369, 13.6420516929,13.6421645401,13.6422773785,13.6423902081,13.6425030288,13.6426158407,13.6427286438,13.642841438,13.6429542235,13.6430670001,13.6431797679,13.6432925269,13.6434052771,13.6435180185,13.6436307511,13.6437434748, 13.6438561898,13.6439688959,13.6440815933,13.6441942818,13.6443069615,13.6444196325,13.6445322946,13.644644948,13.6447575925,13.6448702283,13.6449828552,13.6450954734,13.6452080828,13.6453206834,13.6454332752,13.6455458582, 13.6456584324,13.6457709979,13.6458835545,13.6459961024,13.6461086415,13.6462211718,13.6463336934,13.6464462062,13.6465587102,13.6466712054,13.6467836918,13.6468961695,13.6470086384,13.6471210986,13.64723355,13.6473459926, 13.6474584265,13.6475708516,13.6476832679,13.6477956755,13.6479080743,13.6480204643,13.6481328457,13.6482452182,13.648357582,13.6484699371,13.6485822834,13.6486946209,13.6488069497,13.6489192698,13.6490315811,13.6491438837, 13.6492561775,13.6493684626,13.649480739,13.6495930066,13.6497052655,13.6498175156,13.649929757,13.6500419897,13.6501542137,13.6502664289,13.6503786354,13.6504908332,13.6506030222,13.6507152025,13.6508273741,13.650939537, 13.6510516912,13.6511638366,13.6512759733,13.6513881014,13.6515002207,13.6516123312,13.6517244331,13.6518365263,13.6519486107,13.6520606865,13.6521727535,13.6522848118,13.6523968615,13.6525089024,13.6526209346,13.6527329582, 13.652844973,13.6529569791,13.6530689766,13.6531809653,13.6532929454,13.6534049167,13.6535168794,13.6536288334,13.6537407787,13.6538527153,13.6539646432,13.6540765625,13.6541884731,13.6543003749,13.6544122681,13.6545241527, 13.6546360285,13.6547478957,13.6548597542,13.654971604,13.6550834452,13.6551952777,13.6553071015,13.6554189167,13.6555307232,13.655642521,13.6557543101,13.6558660906,13.6559778625,13.6560896257,13.6562013802,13.6563131261, 13.6564248633,13.6565365918,13.6566483117,13.656760023,13.6568717256,13.6569834196,13.6570951049,13.6572067816,13.6573184496,13.657430109,13.6575417597,13.6576534018,13.6577650353,13.6578766601,13.6579882763,13.6580998838, 13.6582114828,13.658323073,13.6584346547,13.6585462277,13.6586577921,13.6587693479,13.658880895,13.6589924336,13.6591039635,13.6592154848,13.6593269974,13.6594385015,13.6595499969,13.6596614837,13.6597729619,13.6598844315, 13.6599958924,13.6601073448,13.6602187885,13.6603302237,13.6604416502,13.6605530681,13.6606644775,13.6607758782,13.6608872703,13.6609986538,13.6611100287,13.6612213951,13.6613327528,13.6614441019,13.6615554425,13.6616667744, 13.6617780978,13.6618894125,13.6620007187,13.6621120163,13.6622233053,13.6623345857,13.6624458576,13.6625571208,13.6626683755,13.6627796216,13.6628908591,13.6630020881,13.6631133085,13.6632245203,13.6633357235,13.6634469181, 13.6635581042,13.6636692817,13.6637804507,13.6638916111,13.6640027629,13.6641139061,13.6642250408,13.664336167,13.6644472845,13.6645583936,13.664669494,13.6647805859,13.6648916693,13.6650027441,13.6651138103,13.665224868, 13.6653359172,13.6654469578,13.6655579898,13.6656690134,13.6657800283,13.6658910348,13.6660020326,13.666113022,13.6662240028,13.6663349751,13.6664459388,13.666556894,13.6666678407,13.6667787788,13.6668897084,13.6670006295, 13.6671115421,13.6672224461,13.6673333416,13.6674442286,13.667555107,13.667665977,13.6677768384,13.6678876913,13.6679985357,13.6681093715,13.6682201989,13.6683310177,13.6684418281,13.6685526299,13.6686634232,13.668774208, 13.6688849843,13.6689957521,13.6691065113,13.6692172621,13.6693280044,13.6694387382,13.6695494635,13.6696601802,13.6697708885,13.6698815883,13.6699922796,13.6701029624,13.6702136367,13.6703243026,13.6704349599,13.6705456088, 13.6706562491,13.670766881,13.6708775044,13.6709881193,13.6710987257,13.6712093237,13.6713199132,13.6714304942,13.6715410667,13.6716516308,13.6717621863,13.6718727335,13.6719832721,13.6720938023,13.672204324,13.6723148372, 13.672425342,13.6725358383,13.6726463261,13.6727568055,13.6728672764,13.6729777389,13.6730881929,13.6731986385,13.6733090756,13.6734195042,13.6735299244,13.6736403361,13.6737507394,13.6738611343,13.6739715207,13.6740818986, 13.6741922681,13.6743026292,13.6744129818,13.674523326,13.6746336618,13.6747439891,13.6748543079,13.6749646184,13.6750749204,13.675185214,13.6752954991,13.6754057758,13.6755160441,13.6756263039,13.6757365554,13.6758467984, 13.6759570329,13.6760672591,13.6761774768,13.6762876861,13.676397887,13.6765080795,13.6766182636,13.6767284392,13.6768386065,13.6769487653,13.6770589157,13.6771690577,13.6772791913,13.6773893165,13.6774994333,13.6776095417, 13.6777196416,13.6778297332,13.6779398164,13.6780498912,13.6781599575,13.6782700155,13.6783800651,13.6784901063,13.6786001391,13.6787101635,13.6788201795,13.6789301872,13.6790401864,13.6791501772,13.6792601597,13.6793701338, 13.6794800995,13.6795900568,13.6797000058,13.6798099463,13.6799198785,13.6800298023,13.6801397178,13.6802496248,13.6803595235,13.6804694138,13.6805792958,13.6806891694,13.6807990346,13.6809088914,13.6810187399,13.68112858, 13.6812384118,13.6813482352,13.6814580502,13.6815678569,13.6816776552,13.6817874452,13.6818972268,13.682007,13.682116765,13.6822265215,13.6823362697,13.6824460096,13.6825557411,13.6826654642,13.6827751791,13.6828848855, 13.6829945837,13.6831042735,13.6832139549,13.6833236281,13.6834332928,13.6835429493,13.6836525974,13.6837622372,13.6838718686,13.6839814917,13.6840911065,13.684200713,13.6843103111,13.6844199009,13.6845294824,13.6846390556, 13.6847486204,13.6848581769,13.6849677251,13.685077265,13.6851867966,13.6852963198,13.6854058348,13.6855153414,13.6856248397,13.6857343297,13.6858438114,13.6859532848,13.6860627499,13.6861722067,13.6862816551,13.6863910953, 13.6865005272,13.6866099508,13.686719366,13.686828773,13.6869381717,13.6870475621,13.6871569441,13.6872663179,13.6873756834,13.6874850407,13.6875943896,13.6877037302,13.6878130626,13.6879223866,13.6880317024,13.6881410099, 13.6882503091,13.6883596001,13.6884688827,13.6885781571,13.6886874232,13.6887966811,13.6889059306,13.6890151719,13.6891244049,13.6892336297,13.6893428461,13.6894520543,13.6895612543,13.689670446,13.6897796294,13.6898888045, 13.6899979714,13.6901071301,13.6902162804,13.6903254225,13.6904345564,13.690543682,13.6906527993,13.6907619084,13.6908710093,13.6909801019,13.6910891862,13.6911982623,13.6913073302,13.6914163898,13.6915254412,13.6916344843, 13.6917435192,13.6918525458,13.6919615642,13.6920705744,13.6921795763,13.69228857,13.6923975555,13.6925065327,13.6926155017,13.6927244625,13.692833415,13.6929423593,13.6930512954,13.6931602233,13.6932691429,13.6933780543, 13.6934869575,13.6935958525,13.6937047392,13.6938136178,13.6939224881,13.6940313502,13.6941402041,13.6942490498,13.6943578872,13.6944667165,13.6945755375,13.6946843504,13.694793155,13.6949019514,13.6950107397,13.6951195197, 13.6952282915,13.6953370551,13.6954458105,13.6955545578,13.6956632968,13.6957720276,13.6958807503,13.6959894647,13.696098171,13.696206869,13.6963155589,13.6964242406,13.6965329141,13.6966415794,13.6967502365,13.6968588855, 13.6969675262,13.6970761588,13.6971847832,13.6972933995,13.6974020075,13.6975106074,13.6976191991,13.6977277826,13.697836358,13.6979449251,13.6980534842,13.698162035,13.6982705777,13.6983791122,13.6984876386,13.6985961567, 13.6987046668,13.6988131686,13.6989216623,13.6990301479,13.6991386253,13.6992470945,13.6993555556,13.6994640085,13.6995724533,13.6996808899,13.6997893184,13.6998977387,13.7000061509,13.7001145549,13.7002229508,13.7003313385, 13.7004397181,13.7005480896,13.7006564529,13.7007648081,13.7008731551,13.700981494,13.7010898248,13.7011981475,13.701306462,13.7014147683,13.7015230666,13.7016313567,13.7017396387,13.7018479125,13.7019561783,13.7020644359, 13.7021726854,13.7022809267,13.70238916,13.7024973851,13.7026056021,13.702713811,13.7028220118,13.7029302044,13.703038389,13.7031465654,13.7032547337,13.703362894,13.7034710461,13.7035791901,13.703687326,13.7037954538, 13.7039035734,13.704011685,13.7041197885,13.7042278839,13.7043359712,13.7044440504,13.7045521215,13.7046601845,13.7047682394,13.7048762862,13.7049843249,13.7050923555,13.7052003781,13.7053083925,13.7054163989,13.7055243972, 13.7056323874,13.7057403695,13.7058483435,13.7059563095,13.7060642673,13.7061722171,13.7062801588,13.7063880925,13.7064960181,13.7066039356,13.706711845,13.7068197463,13.7069276396,13.7070355248,13.707143402,13.7072512711, 13.7073591321,13.707466985,13.7075748299,13.7076826668,13.7077904955,13.7078983162,13.7080061289,13.7081139335,13.70822173,13.7083295185,13.708437299,13.7085450714,13.7086528357,13.708760592,13.7088683402,13.7089760804, 13.7090838126,13.7091915367,13.7092992527,13.7094069607,13.7095146607,13.7096223526,13.7097300365,13.7098377124,13.7099453802,13.71005304,13.7101606918,13.7102683355,13.7103759712,13.7104835989,13.7105912185,13.7106988301, 13.7108064337,13.7109140293,13.7110216168,13.7111291963,13.7112367678,13.7113443313,13.7114518867,13.7115594341,13.7116669736,13.711774505,13.7118820284,13.7119895437,13.7120970511,13.7122045504,13.7123120418,13.7124195251, 13.7125270004,13.7126344678,13.7127419271,13.7128493784,13.7129568217,13.713064257,13.7131716843,13.7132791036,13.7133865149,13.7134939183,13.7136013136,13.7137087009,13.7138160802,13.7139234516,13.7140308149,13.7141381703, 13.7142455177,13.7143528571,13.7144601885,13.7145675119,13.7146748273,13.7147821348,13.7148894342,13.7149967257,13.7151040092,13.7152112848,13.7153185523,13.7154258119,13.7155330635,13.7156403072,13.7157475428,13.7158547705, 13.7159619903,13.716069202,13.7161764058,13.7162836016,13.7163907895,13.7164979694,13.7166051413,13.7167123053,13.7168194613,13.7169266094,13.7170337495,13.7171408816,13.7172480058,13.7173551221,13.7174622303,13.7175693307, 13.7176764231,13.7177835075,13.717890584,13.7179976525,13.7181047131,13.7182117658,13.7183188105,13.7184258472,13.7185328761,13.718639897,13.7187469099,13.7188539149,13.718960912,13.7190679011,13.7191748823,13.7192818556, 13.7193888209,13.7194957784,13.7196027278,13.7197096694,13.719816603,13.7199235287,13.7200304465,13.7201373564,13.7202442583,13.7203511523,13.7204580384,13.7205649166,13.7206717868,13.7207786492,13.7208855036,13.7209923501, 13.7210991887,13.7212060194,13.7213128422,13.721419657,13.721526464,13.7216332631,13.7217400542,13.7218468375,13.7219536128,13.7220603802,13.7221671398,13.7222738914,13.7223806352,13.722487371,13.722594099,13.722700819, 13.7228075312,13.7229142354,13.7230209318,13.7231276203,13.7232343009,13.7233409736,13.7234476384,13.7235542954,13.7236609444,13.7237675856,13.7238742189,13.7239808443,13.7240874618,13.7241940714,13.7243006732,13.7244072671, 13.7245138531,13.7246204313,13.7247270015,13.7248335639,13.7249401185,13.7250466651,13.7251532039,13.7252597348,13.7253662579,13.7254727731,13.7255792804,13.7256857799,13.7257922715,13.7258987552,13.7260052311,13.7261116992, 13.7262181593,13.7263246117,13.7264310561,13.7265374927,13.7266439215,13.7267503424,13.7268567555,13.7269631607,13.727069558,13.7271759475,13.7272823292,13.727388703,13.727495069,13.7276014272,13.7277077775,13.7278141199, 13.7279204546,13.7280267814,13.7281331003,13.7282394114,13.7283457147,13.7284520102,13.7285582978,13.7286645776,13.7287708495,13.7288771137,13.72898337,13.7290896185,13.7291958591,13.729302092,13.729408317,13.7295145342, 13.7296207436,13.7297269451,13.7298331388,13.7299393248,13.7300455029,13.7301516732,13.7302578357,13.7303639903,13.7304701372,13.7305762762,13.7306824075,13.7307885309,13.7308946465,13.7310007544,13.7311068544,13.7312129466, 13.731319031,13.7314251076,13.7315311765,13.7316372375,13.7317432907,13.7318493361,13.7319553738,13.7320614036,13.7321674257,13.7322734399,13.7323794464,13.7324854451,13.732591436,13.7326974191,13.7328033944,13.7329093619, 13.7330153217,13.7331212737,13.7332272179,13.7333331543,13.7334390829,13.7335450038,13.7336509168,13.7337568221,13.7338627197,13.7339686094,13.7340744914,13.7341803656,13.7342862321,13.7343920908,13.7344979417,13.7346037848, 13.7347096202,13.7348154478,13.7349212677,13.7350270798,13.7351328841,13.7352386807,13.7353444695,13.7354502506,13.7355560239,13.7356617895,13.7357675473,13.7358732973,13.7359790396,13.7360847742,13.736190501,13.73629622, 13.7364019313,13.7365076349,13.7366133307,13.7367190188,13.7368246991,13.7369303717,13.7370360365,13.7371416937,13.737247343,13.7373529847,13.7374586186,13.7375642447,13.7376698632,13.7377754739,13.7378810769,13.7379866721, 13.7380922596,13.7381978394,13.7383034115,13.7384089758,13.7385145324,13.7386200813,13.7387256225,13.7388311559,13.7389366817,13.7390421997,13.73914771,13.7392532126,13.7393587074,13.7394641946,13.739569674,13.7396751458, 13.7397806098,13.7398860661,13.7399915147,13.7400969556,13.7402023888,13.7403078143,13.740413232,13.7405186421,13.7406240445,13.7407294392,13.7408348261,13.7409402054,13.741045577,13.7411509409,13.7412562971,13.7413616456, 13.7414669864,13.7415723195,13.7416776449,13.7417829627,13.7418882727,13.7419935751,13.7420988698,13.7422041568,13.7423094361,13.7424147077,13.7425199717,13.7426252279,13.7427304765,13.7428357174,13.7429409507,13.7430461762, 13.7431513941,13.7432566043,13.7433618069,13.7434670017,13.7435721889,13.7436773685,13.7437825403,13.7438877045,13.7439928611,13.7440980099,13.7442031511,13.7443082847,13.7444134106,13.7445185288,13.7446236393,13.7447287422, 13.7448338375,13.7449389251,13.745044005,13.7451490773,13.745254142,13.7453591989,13.7454642483,13.74556929,13.745674324,13.7457793504,13.7458843691,13.7459893802,13.7460943837,13.7461993795,13.7463043677,13.7464093482, 13.7465143211,13.7466192864,13.746724244,13.746829194,13.7469341364,13.7470390711,13.7471439982,13.7472489176,13.7473538295,13.7474587337,13.7475636303,13.7476685192,13.7477734005,13.7478782742,13.7479831403,13.7480879988, 13.7481928496,13.7482976928,13.7484025284,13.7485073564,13.7486121767,13.7487169895,13.7488217946,13.7489265921,13.749031382,13.7491361643,13.749240939,13.7493457061,13.7494504656,13.7495552174,13.7496599617,13.7497646983, 13.7498694274,13.7499741488,13.7500788627,13.7501835689,13.7502882676,13.7503929586,13.7504976421,13.750602318,13.7507069862,13.7508116469,13.7509163,13.7510209455,13.7511255834,13.7512302137,13.7513348364,13.7514394515, 13.7515440591,13.7516486591,13.7517532514,13.7518578362,13.7519624135,13.7520669831,13.7521715452,13.7522760996,13.7523806466,13.7524851859,13.7525897176,13.7526942418,13.7527987584,13.7529032675,13.7530077689,13.7531122628, 13.7532167492,13.7533212279,13.7534256991,13.7535301628,13.7536346189,13.7537390674,13.7538435083,13.7539479417,13.7540523675,13.7541567858,13.7542611965,13.7543655997,13.7544699953,13.7545743833,13.7546787638,13.7547831368, 13.7548875022,13.75499186,13.7550962103,13.7552005531,13.7553048883,13.7554092159,13.755513536,13.7556178486,13.7557221536,13.7558264511,13.7559307411,13.7560350235,13.7561392984,13.7562435657,13.7563478255,13.7564520778, 13.7565563225,13.7566605597,13.7567647894,13.7568690115,13.7569732262,13.7570774333,13.7571816328,13.7572858249,13.7573900094,13.7574941864,13.7575983558,13.7577025178,13.7578066722,13.7579108191,13.7580149585,13.7581190904, 13.7582232147,13.7583273316,13.7584314409,13.7585355427,13.758639637,13.7587437238,13.7588478031,13.7589518749,13.7590559392,13.7591599959,13.7592640452,13.7593680869,13.7594721212,13.759576148,13.7596801672,13.759784179, 13.7598881832,13.75999218,13.7600961692,13.760200151,13.7603041253,13.7604080921,13.7605120514,13.7606160032,13.7607199475,13.7608238843,13.7609278136,13.7610317355,13.7611356498,13.7612395567,13.7613434561,13.761447348, 13.7615512324,13.7616551094,13.7617589789,13.7618628409,13.7619666954,13.7620705424,13.762174382,13.7622782141,13.7623820387,13.7624858559,13.7625896655,13.7626934678,13.7627972625,13.7629010498,13.7630048296,13.7631086019, 13.7632123668,13.7633161242,13.7634198742,13.7635236167,13.7636273517,13.7637310793,13.7638347994,13.7639385121,13.7640422173,13.7641459151,13.7642496054,13.7643532882,13.7644569636,13.7645606316,13.7646642921,13.7647679451, 13.7648715907,13.7649752289,13.7650788596,13.7651824829,13.7652860987,13.7653897071,13.7654933081,13.7655969016,13.7657004877,13.7658040663,13.7659076375,13.7660112013,13.7661147576,13.7662183065,13.766321848,13.766425382, 13.7665289086,13.7666324278,13.7667359395,13.7668394439,13.7669429408,13.7670464302,13.7671499123,13.7672533869,13.7673568541,13.7674603139,13.7675637663,13.7676672112,13.7677706488,13.7678740789,13.7679775016,13.7680809169, 13.7681843248,13.7682877252,13.7683911183,13.768494504,13.7685978822,13.768701253,13.7688046165,13.7689079725,13.7690113211,13.7691146623,13.7692179961,13.7693213225,13.7694246416,13.7695279532,13.7696312574,13.7697345542, 13.7698378436,13.7699411257,13.7700444003,13.7701476675,13.7702509274,13.7703541799,13.7704574249,13.7705606626,13.7706638929,13.7707671158,13.7708703314,13.7709735395,13.7710767403,13.7711799336,13.7712831196,13.7713862983, 13.7714894695,13.7715926334,13.7716957899,13.771798939,13.7719020807,13.7720052151,13.7721083421,13.7722114617,13.7723145739,13.7724176788,13.7725207763,13.7726238665,13.7727269492,13.7728300247,13.7729330927,13.7730361534, 13.7731392067,13.7732422527,13.7733452913,13.7734483225,13.7735513464,13.773654363,13.7737573721,13.773860374,13.7739633684,13.7740663556,13.7741693353,13.7742723077,13.7743752728,13.7744782305,13.7745811809,13.7746841239, 13.7747870596,13.7748899879,13.7749929089,13.7750958226,13.7751987289,13.7753016279,13.7754045195,13.7755074038,13.7756102808,13.7757131504,13.7758160127,13.7759188676,13.7760217153,13.7761245555,13.7762273885,13.7763302141, 13.7764330324,13.7765358434,13.7766386471,13.7767414434,13.7768442324,13.7769470141,13.7770497884,13.7771525555,13.7772553152,13.7773580676,13.7774608127,13.7775635504,13.7776662809,13.777769004,13.7778717198,13.7779744283, 13.7780771295,13.7781798234,13.77828251,13.7783851893,13.7784878612,13.7785905259,13.7786931832,13.7787958333,13.778898476,13.7790011114,13.7791037396,13.7792063604,13.779308974,13.7794115802,13.7795141791,13.7796167708, 13.7797193551,13.7798219322,13.779924502,13.7800270644,13.7801296196,13.7802321675,13.7803347081,13.7804372414,13.7805397675,13.7806422862,13.7807447977,13.7808473019,13.7809497987,13.7810522884,13.7811547707,13.7812572457, 13.7813597135,13.781462174,13.7815646272,13.7816670732,13.7817695119,13.7818719433,13.7819743674,13.7820767842,13.7821791938,13.7822815961,13.7823839912,13.782486379,13.7825887595,13.7826911327,13.7827934987,13.7828958575, 13.7829982089,13.7831005531,13.7832028901,13.7833052197,13.7834075422,13.7835098573,13.7836121653,13.7837144659,13.7838167593,13.7839190455,13.7840213244,13.784123596,13.7842258604,13.7843281176,13.7844303675,13.7845326101, 13.7846348456,13.7847370737,13.7848392947,13.7849415083,13.7850437148,13.785145914,13.7852481059,13.7853502907,13.7854524682,13.7855546384,13.7856568014,13.7857589572,13.7858611058,13.7859632471,13.7860653812,13.786167508, 13.7862696276,13.78637174,13.7864738452,13.7865759432,13.7866780339,13.7867801174,13.7868821937,13.7869842627,13.7870863246,13.7871883792,13.7872904266,13.7873924667,13.7874944997,13.7875965254,13.787698544,13.7878005553, 13.7879025594,13.7880045563,13.788106546,13.7882085284,13.7883105037,13.7884124718,13.7885144326,13.7886163863,13.7887183327,13.7888202719,13.788922204,13.7890241288,13.7891260464,13.7892279569,13.7893298601,13.7894317561, 13.789533645,13.7896355266,13.7897374011,13.7898392683,13.7899411284,13.7900429813,13.7901448269,13.7902466654,13.7903484968,13.7904503209,13.7905521378,13.7906539476,13.7907557501,13.7908575455,13.7909593337,13.7910611147, 13.7911628886,13.7912646552,13.7913664147,13.791468167,13.7915699121,13.7916716501,13.7917733809,13.7918751045,13.7919768209,13.7920785302,13.7921802323,13.7922819272,13.7923836149,13.7924852955,13.7925869689,13.7926886352, 13.7927902943,13.7928919462,13.792993591,13.7930952286,13.7931968591,13.7932984824,13.7934000985,13.7935017075,13.7936033093,13.7937049039,13.7938064915,13.7939080718,13.794009645,13.7941112111,13.79421277,13.7943143217, 13.7944158664,13.7945174038,13.7946189341,13.7947204573,13.7948219733,13.7949234822,13.795024984,13.7951264786,13.795227966,13.7953294464,13.7954309195,13.7955323856,13.7956338445,13.7957352963,13.7958367409,13.7959381784, 13.7960396088,13.7961410321,13.7962424482,13.7963438572,13.7964452591,13.7965466538,13.7966480414,13.7967494219,13.7968507953,13.7969521615,13.7970535206,13.7971548726,13.7972562175,13.7973575553,13.7974588859,13.7975602094, 13.7976615259,13.7977628352,13.7978641373,13.7979654324,13.7980667204,13.7981680012,13.7982692749,13.7983705416,13.7984718011,13.7985730535,13.7986742988,13.798775537,13.7988767681,13.7989779921,13.799079209,13.7991804188, 13.7992816215,13.7993828171,13.7994840056,13.799585187,13.7996863613,13.7997875285,13.7998886887,13.7999898417,13.8000909876,13.8001921265,13.8002932582,13.8003943829,13.8004955005,13.800596611,13.8006977144,13.8007988107, 13.8008998999,13.8010009821,13.8011020571,13.8012031251,13.801304186,13.8014052399,13.8015062866,13.8016073263,13.8017083589,13.8018093844,13.8019104029,13.8020114143,13.8021124186,13.8022134158,13.802314406,13.8024153891, 13.8025163651,13.8026173341,13.802718296,13.8028192508,13.8029201986,13.8030211393,13.8031220729,13.8032229995,13.803323919,13.8034248315,13.8035257369,13.8036266353,13.8037275266,13.8038284108,13.803929288,13.8040301581, 13.8041310212,13.8042318772,13.8043327262,13.8044335681,13.804534403,13.8046352308,13.8047360516,13.8048368654,13.8049376721,13.8050384717,13.8051392643,13.8052400499,13.8053408284,13.8054415999,13.8055423644,13.8056431218, 13.8057438722,13.8058446155,13.8059453518,13.8060460811,13.8061468033,13.8062475185,13.8063482267,13.8064489279,13.806549622,13.8066503091,13.8067509891,13.8068516622,13.8069523282,13.8070529872,13.8071536392,13.8072542841, 13.8073549221,13.807455553,13.8075561769,13.8076567937,13.8077574036,13.8078580064,13.8079586023,13.8080591911,13.8081597729,13.8082603477,13.8083609154,13.8084614762,13.80856203,13.8086625767,13.8087631165,13.8088636492, 13.8089641749,13.8090646936,13.8091652054,13.8092657101,13.8093662078,13.8094666985,13.8095671823,13.809667659,13.8097681287,13.8098685914,13.8099690472,13.8100694959,13.8101699377,13.8102703724,13.8103708002,13.810471221, 13.8105716347,13.8106720415,13.8107724413,13.8108728342,13.81097322,13.8110735989,13.8111739707,13.8112743356,13.8113746935,13.8114750444,13.8115753884,13.8116757253,13.8117760553,13.8118763783,13.8119766944,13.8120770034, 13.8121773055,13.8122776006,13.8123778888,13.8124781699,13.8125784441,13.8126787114,13.8127789716,13.8128792249,13.8129794713,13.8130797106,13.813179943,13.8132801685,13.8133803869,13.8134805984,13.813580803,13.8136810006, 13.8137811912,13.8138813749,13.8139815516,13.8140817214,13.8141818842,13.81428204,13.814382189,13.8144823309,13.8145824659,13.814682594,13.8147827151,13.8148828292,13.8149829364,13.8150830367,13.81518313,13.8152832164, 13.8153832958,13.8154833683,13.8155834339,13.8156834925,13.8157835441,13.8158835889,13.8159836267,13.8160836575,13.8161836814,13.8162836984,13.8163837085,13.8164837116,13.8165837078,13.816683697,13.8167836794,13.8168836548, 13.8169836233,13.8170835848,13.8171835394,13.8172834871,13.8173834279,13.8174833617,13.8175832887,13.8176832087,13.8177831218,13.8178830279,13.8179829272,13.8180828195,13.8181827049,13.8182825835,13.818382455,13.8184823197, 13.8185821775,13.8186820283,13.8187818723,13.8188817093,13.8189815394,13.8190813626,13.819181179,13.8192809884,13.8193807909,13.8194805865,13.8195803752,13.8196801569,13.8197799318,13.8198796998,13.8199794609,13.8200792151, 13.8201789624,13.8202787028,13.8203784363,13.8204781629,13.8205778827,13.8206775955,13.8207773014,13.8208770005,13.8209766926,13.8210763779,13.8211760563,13.8212757278,13.8213753924,13.8214750501,13.8215747009,13.8216743449, 13.821773982,13.8218736122,13.8219732355,13.8220728519,13.8221724615,13.8222720642,13.82237166,13.8224712489,13.822570831,13.8226704061,13.8227699744,13.8228695359,13.8229690905,13.8230686382,13.823168179,13.8232677129, 13.82336724,13.8234667603,13.8235662736,13.8236657801,13.8237652798,13.8238647726,13.8239642585,13.8240637375,13.8241632097,13.8242626751,13.8243621336,13.8244615852,13.82456103,13.8246604679,13.824759899,13.8248593232, 13.8249587405,13.825058151,13.8251575547,13.8252569515,13.8253563415,13.8254557246,13.8255551009,13.8256544703,13.8257538329,13.8258531886,13.8259525375,13.8260518796,13.8261512148,13.8262505432,13.8263498647,13.8264491794, 13.8265484873,13.8266477883,13.8267470825,13.8268463699,13.8269456504,13.8270449241,13.827144191,13.827243451,13.8273427042,13.8274419506,13.8275411902,13.8276404229,13.8277396488,13.8278388679,13.8279380801,13.8280372856, 13.8281364842,13.828235676,13.828334861,13.8284340391,13.8285332105,13.828632375,13.8287315327,13.8288306836,13.8289298277,13.8290289649,13.8291280954,13.829227219,13.8293263358,13.8294254459,13.8295245491,13.8296236455, 13.8297227351,13.8298218179,13.8299208939,13.8300199631,13.8301190254,13.830218081,13.8303171298,13.8304161718,13.830515207,13.8306142354,13.830713257,13.8308122717,13.8309112797,13.8310102809,13.8311092754,13.831208263, 13.8313072438,13.8314062178,13.8315051851,13.8316041455,13.8317030992,13.8318020461,13.8319009862,13.8319999195,13.832098846,13.8321977658,13.8322966787,13.8323955849,13.8324944843,13.832593377,13.8326922628,13.8327911419, 13.8328900142,13.8329888797,13.8330877384,13.8331865904,13.8332854356,13.833384274,13.8334831057,13.8335819305,13.8336807487,13.83377956,13.8338783646,13.8339771624,13.8340759534,13.8341747377,13.8342735152,13.834372286, 13.83447105,13.8345698072,13.8346685577,13.8347673014,13.8348660384,13.8349647686,13.835063492,13.8351622087,13.8352609186,13.8353596218,13.8354583182,13.8355570079,13.8356556908,13.835754367,13.8358530364,13.8359516991, 13.8360503551,13.8361490042,13.8362476467,13.8363462824,13.8364449113,13.8365435336,13.836642149,13.8367407578,13.8368393597,13.836937955,13.8370365435,13.8371351253,13.8372337003,13.8373322686,13.8374308302,13.8375293851, 13.8376279332,13.8377264745,13.8378250092,13.8379235371,13.8380220583,13.8381205728,13.8382190805,13.8383175815,13.8384160758,13.8385145634,13.8386130442,13.8387115183,13.8388099857,13.8389084464,13.8390069003,13.8391053476, 13.8392037881,13.8393022219,13.839400649,13.8394990694,13.839597483,13.83969589,13.8397942902,13.8398926837,13.8399910705,13.8400894506,13.840187824,13.8402861907,13.8403845507,13.840482904,13.8405812506,13.8406795904, 13.8407779236,13.8408762501,13.8409745698,13.8410728829,13.8411711892,13.8412694889,13.8413677819,13.8414660682,13.8415643477,13.8416626206,13.8417608868,13.8418591463,13.8419573991,13.8420556452,13.8421538846,13.8422521174, 13.8423503434,13.8424485628,13.8425467754,13.8426449814,13.8427431807,13.8428413733,13.8429395593,13.8430377385,13.8431359111,13.843234077,13.8433322362,13.8434303888,13.8435285346,13.8436266738,13.8437248063,13.8438229321, 13.8439210513,13.8440191638,13.8441172696,13.8442153687,13.8443134612,13.844411547,13.8445096261,13.8446076986,13.8447057644,13.8448038235,13.844901876,13.8449999218,13.845097961,13.8451959935,13.8452940193,13.8453920384, 13.8454900509,13.8455880568,13.845686056,13.8457840485,13.8458820344,13.8459800136,13.8460779862,13.8461759521,13.8462739113,13.846371864,13.8464698099,13.8465677492,13.8466656819,13.8467636079,13.8468615273,13.84695944, 13.8470573461,13.8471552455,13.8472531383,13.8473510245,13.847448904,13.8475467769,13.8476446431,13.8477425027,13.8478403556,13.8479382019,13.8480360416,13.8481338747,13.8482317011,13.8483295209,13.848427334,13.8485251405, 13.8486229404,13.8487207337,13.8488185203,13.8489163003,13.8490140737,13.8491118404,13.8492096006,13.8493073541,13.8494051009,13.8495028412,13.8496005748,13.8496983019,13.8497960222,13.849893736,13.8499914432,13.8500891437, 13.8501868376,13.850284525,13.8503822057,13.8504798797,13.8505775472,13.8506752081,13.8507728623,13.85087051,13.850968151,13.8510657854,13.8511634132,13.8512610344,13.851358649,13.851456257,13.8515538584,13.8516514532, 13.8517490414,13.851846623,13.851944198,13.8520417664,13.8521393282,13.8522368834,13.852334432,13.852431974,13.8525295094,13.8526270382,13.8527245604,13.8528220761,13.8529195851,13.8530170876,13.8531145834,13.8532120727, 13.8533095554,13.8534070315,13.853504501,13.853601964,13.8536994203,13.8537968701,13.8538943132,13.8539917498,13.8540891799,13.8541866033,13.8542840202,13.8543814305,13.8544788342,13.8545762313,13.8546736219,13.8547710058, 13.8548683833,13.8549657541,13.8550631184,13.8551604761,13.8552578272,13.8553551718,13.8554525097,13.8555498412,13.855647166,13.8557444843,13.855841796,13.8559391012,13.8560363998,13.8561336919,13.8562309773,13.8563282563, 13.8564255286,13.8565227944,13.8566200537,13.8567173064,13.8568145525,13.8569117921,13.8570090251,13.8571062516,13.8572034715,13.8573006849,13.8573978917,13.857495092,13.8575922857,13.8576894729,13.8577866535,13.8578838276, 13.8579809951,13.8580781561,13.8581753106,13.8582724585,13.8583695999,13.8584667347,13.858563863,13.8586609847,13.8587580999,13.8588552086,13.8589523108,13.8590494064,13.8591464954,13.859243578,13.859340654,13.8594377234, 13.8595347864,13.8596318428,13.8597288927,13.859825936,13.8599229729,13.8600200032,13.8601170269,13.8602140442,13.8603110549,13.8604080591,13.8605050568,13.860602048,13.8606990326,13.8607960107,13.8608929823,13.8609899474, 13.861086906,13.861183858,13.8612808036,13.8613777426,13.8614746751,13.8615716011,13.8616685206,13.8617654336,13.8618623401,13.86195924,13.8620561335,13.8621530204,13.8622499009,13.8623467748,13.8624436422,13.8625405031, 13.8626373576,13.8627342055,13.8628310469,13.8629278818,13.8630247102,13.8631215322,13.8632183476,13.8633151565,13.8634119589,13.8635087549,13.8636055443,13.8637023273,13.8637991037,13.8638958737,13.8639926372,13.8640893942, 13.8641861447,13.8642828887,13.8643796262,13.8644763572,13.8645730818,13.8646697998,13.8647665114,13.8648632165,13.8649599151,13.8650566073,13.8651532929,13.8652499721,13.8653466448,13.865443311,13.8655399708,13.8656366241, 13.8657332709,13.8658299112,13.865926545,13.8660231724,13.8661197933,13.8662164077,13.8663130157,13.8664096172,13.8665062122,13.8666028008,13.8666993829,13.8667959585,13.8668925277,13.8669890904,13.8670856466,13.8671821964, 13.8672787397,13.8673752766,13.867471807,13.8675683309,13.8676648484,13.8677613594,13.867857864,13.8679543621,13.8680508537,13.868147339,13.8682438177,13.86834029,13.8684367559,13.8685332153,13.8686296682,13.8687261147, 13.8688225548,13.8689189884,13.8690154156,13.8691118363,13.8692082506,13.8693046584,13.8694010598,13.8694974547,13.8695938432,13.8696902253,13.8697866009,13.8698829701,13.8699793329,13.8700756892,13.8701720391,13.8702683826, 13.8703647196,13.8704610502,13.8705573743,13.8706536921,13.8707500033,13.8708463082,13.8709426066,13.8710388987,13.8711351842,13.8712314634,13.8713277361,13.8714240024,13.8715202623,13.8716165158,13.8717127628,13.8718090035, 13.8719052377,13.8720014654,13.8720976868,13.8721939018,13.8722901103,13.8723863124,13.8724825081,13.8725786974,13.8726748803,13.8727710567,13.8728672268,13.8729633904,13.8730595477,13.8731556985,13.8732518429,13.8733479809, 13.8734441125,13.8735402377,13.8736363565,13.8737324689,13.8738285749,13.8739246745,13.8740207677,13.8741168544,13.8742129348,13.8743090088,13.8744050764,13.8745011376,13.8745971924,13.8746932408,13.8747892828,13.8748853184, 13.8749813477,13.8750773705,13.8751733869,13.875269397,13.8753654006,13.8754613979,13.8755573888,13.8756533733,13.8757493514,13.8758453232,13.8759412885,13.8760372475,13.8761332,13.8762291462,13.8763250861,13.8764210195, 13.8765169466,13.8766128672,13.8767087816,13.8768046895,13.876900591,13.8769964862,13.877092375,13.8771882575,13.8772841335,13.8773800032,13.8774758665,13.8775717235,13.8776675741,13.8777634183,13.8778592561,13.8779550876, 13.8780509127,13.8781467315,13.8782425439,13.8783383499,13.8784341496,13.8785299429,13.8786257298,13.8787215104,13.8788172846,13.8789130525,13.879008814,13.8791045691,13.8792003179,13.8792960604,13.8793917965,13.8794875262, 13.8795832496,13.8796789666,13.8797746773,13.8798703817,13.8799660797,13.8800617713,13.8801574566,13.8802531356,13.8803488082,13.8804444744,13.8805401343,13.8806357879,13.8807314351,13.880827076,13.8809227106,13.8810183388, 13.8811139607,13.8812095762,13.8813051854,13.8814007883,13.8814963848,13.881591975,13.8816875589,13.8817831364,13.8818787076,13.8819742725,13.882069831,13.8821653832,13.8822609291,13.8823564687,13.8824520019,13.8825475288, 13.8826430494,13.8827385636,13.8828340715,13.8829295732,13.8830250684,13.8831205574,13.8832160401,13.8833115164,13.8834069864,13.8835024501,13.8835979075,13.8836933585,13.8837888033,13.8838842417,13.8839796738,13.8840750996, 13.8841705191,13.8842659323,13.8843613392,13.8844567397,13.884552134,13.8846475219,13.8847429036,13.8848382789,13.8849336479,13.8850290107,13.8851243671,13.8852197172,13.885315061,13.8854103986,13.8855057298,13.8856010547, 13.8856963733,13.8857916857,13.8858869917,13.8859822914,13.8860775849,13.886172872,13.8862681529,13.8863634274,13.8864586957,13.8865539577,13.8866492134,13.8867444628,13.8868397059,13.8869349427,13.8870301732,13.8871253975, 13.8872206155,13.8873158272,13.8874110326,13.8875062317,13.8876014245,13.8876966111,13.8877917913,13.8878869653,13.8879821331,13.8880772945,13.8881724497,13.8882675986,13.8883627412,13.8884578775,13.8885530076,13.8886481314, 13.8887432489,13.8888383602,13.8889334651,13.8890285638,13.8891236563,13.8892187425,13.8893138224,13.889408896,13.8895039634,13.8895990245,13.8896940794,13.889789128,13.8898841703,13.8899792064,13.8900742362,13.8901692597, 13.890264277,13.8903592881,13.8904542928,13.8905492914,13.8906442836,13.8907392696,13.8908342494,13.8909292229,13.8910241901,13.8911191512,13.8912141059,13.8913090544,13.8914039967,13.8914989327,13.8915938624,13.8916887859, 13.8917837032,13.8918786142,13.891973519,13.8920684176,13.8921633099,13.8922581959,13.8923530757,13.8924479493,13.8925428166,13.8926376777,13.8927325326,13.8928273812,13.8929222236,13.8930170598,13.8931118897,13.8932067134, 13.8933015309,13.8933963421,13.8934911471,13.8935859459,13.8936807384,13.8937755247,13.8938703048,13.8939650786,13.8940598463,13.8941546077,13.8942493629,13.8943441118,13.8944388546,13.8945335911,13.8946283214,13.8947230455, 13.8948177633,13.8949124749,13.8950071804,13.8951018796,13.8951965726,13.8952912593,13.8953859399,13.8954806142,13.8955752824,13.8956699443,13.8957646,13.8958592495,13.8959538928,13.8960485299,13.8961431608,13.8962377854, 13.8963324039,13.8964270162,13.8965216222,13.8966162221,13.8967108157,13.8968054032,13.8968999844,13.8969945595,13.8970891283,13.897183691,13.8972782474,13.8973727977,13.8974673417,13.8975618796,13.8976564113,13.8977509367, 13.897845456,13.8979399691,13.898034476,13.8981289767,13.8982234712,13.8983179595,13.8984124417,13.8985069176,13.8986013874,13.898695851,13.8987903084,13.8988847596,13.8989792046,13.8990736435,13.8991680761,13.8992625026, 13.8993569229,13.899451337,13.899545745,13.8996401468,13.8997345424,13.8998289318,13.899923315,13.9000176921,13.900112063,13.9002064277,13.9003007862,13.9003951386,13.9004894848,13.9005838249,13.9006781587,13.9007724864, 13.900866808,13.9009611233,13.9010554326,13.9011497356,13.9012440325,13.9013383232,13.9014326077,13.9015268861,13.9016211583,13.9017154244,13.9018096843,13.9019039381,13.9019981857,13.9020924271,13.9021866624,13.9022808915, 13.9023751145,13.9024693313,13.902563542,13.9026577465,13.9027519449,13.9028461371,13.9029403231,13.903034503,13.9031286768,13.9032228444,13.9033170059,13.9034111612,13.9035053104,13.9035994535,13.9036935904,13.9037877211, 13.9038818457,13.9039759642,13.9040700765,13.9041641827,13.9042582828,13.9043523767,13.9044464645,13.9045405462,13.9046346217,13.904728691,13.9048227543,13.9049168114,13.9050108624,13.9051049072,13.905198946,13.9052929786, 13.905387005,13.9054810254,13.9055750396,13.9056690476,13.9057630496,13.9058570454,13.9059510351,13.9060450187,13.9061389962,13.9062329675,13.9063269328,13.9064208919,13.9065148448,13.9066087917,13.9067027325,13.9067966671, 13.9068905956,13.906984518,13.9070784343,13.9071723445,13.9072662485,13.9073601465,13.9074540383,13.907547924,13.9076418037,13.9077356772,13.9078295446,13.9079234059,13.9080172611,13.9081111101,13.9082049531,13.90829879, 13.9083926208,13.9084864454,13.908580264,13.9086740765,13.9087678828,13.9088616831,13.9089554773,13.9090492654,13.9091430473,13.9092368232,13.909330593,13.9094243567,13.9095181143,13.9096118658,13.9097056112,13.9097993505, 13.9098930838,13.9099868109,13.910080532,13.9101742469,13.9102679558,13.9103616586,13.9104553553,13.9105490459,13.9106427305,13.9107364089,13.9108300813,13.9109237476,13.9110174078,13.9111110619,13.91120471,13.9112983519, 13.9113919878,13.9114856177,13.9115792414,13.9116728591,13.9117664707,13.9118600762,13.9119536756,13.912047269,13.9121408563,13.9122344375,13.9123280127,13.9124215818,13.9125151448,13.9126087018,13.9127022526,13.9127957975, 13.9128893362,13.9129828689,13.9130763956,13.9131699161,13.9132634306,13.9133569391,13.9134504415,13.9135439378,13.913637428,13.9137309123,13.9138243904,13.9139178625,13.9140113285,13.9141047885,13.9141982425,13.9142916903, 13.9143851322,13.9144785679,13.9145719976,13.9146654213,13.9147588389,13.9148522505,13.914945656,13.9150390555,13.915132449,13.9152258363,13.9153192177,13.915412593,13.9155059622,13.9155993254,13.9156926826,13.9157860337, 13.9158793788,13.9159727179,13.9160660509,13.9161593779,13.9162526988,13.9163460137,13.9164393226,13.9165326254,13.9166259222,13.916719213,13.9168124977,13.9169057764,13.9169990491,13.9170923157,13.9171855763,13.9172788309, 13.9173720795,13.917465322,13.9175585585,13.917651789,13.9177450134,13.9178382319,13.9179314443,13.9180246507,13.918117851,13.9182110454,13.9183042337,13.918397416,13.9184905923,13.9185837626,13.9186769268,13.9187700851, 13.9188632373,13.9189563835,13.9190495237,13.9191426579,13.919235786,13.9193289082,13.9194220243,13.9195151345,13.9196082386,13.9197013367,13.9197944288,13.9198875149,13.919980595,13.9200736691,13.9201667372,13.9202597993, 13.9203528554,13.9204459055,13.9205389496,13.9206319877,13.9207250198,13.9208180458,13.9209110659,13.92100408,13.9210970881,13.9211900902,13.9212830863,13.9213760764,13.9214690605,13.9215620387,13.9216550108,13.9217479769, 13.9218409371,13.9219338912,13.9220268394,13.9221197816,13.9222127178,13.922305648,13.9223985722,13.9224914905,13.9225844027,13.922677309,13.9227702093,13.9228631036,13.9229559919,13.9230488743,13.9231417506,13.923234621, 13.9233274854,13.9234203439,13.9235131963,13.9236060428,13.9236988833,13.9237917178,13.9238845464,13.923977369,13.9240701856,13.9241629962,13.9242558009,13.9243485996,13.9244413923,13.9245341791,13.9246269599,13.9247197347, 13.9248125036,13.9249052665,13.9249980234,13.9250907744,13.9251835194,13.9252762585,13.9253689916,13.9254617187,13.9255544399,13.9256471551,13.9257398643,13.9258325676,13.925925265,13.9260179564,13.9261106418,13.9262033213, 13.9262959948,13.9263886623,13.926481324,13.9265739796,13.9266666293,13.9267592731,13.9268519109,13.9269445428,13.9270371687,13.9271297887,13.9272224027,13.9273150108,13.9274076129,13.9275002091,13.9275927994,13.9276853837, 13.9277779621,13.9278705345,13.927963101,13.9280556616,13.9281482162,13.9282407648,13.9283333076,13.9284258444,13.9285183753,13.9286109002,13.9287034192,13.9287959323,13.9288884394,13.9289809406,13.9290734359,13.9291659252, 13.9292584086,13.9293508861,13.9294433577,13.9295358233,13.929628283,13.9297207368,13.9298131847,13.9299056266,13.9299980626,13.9300904927,13.9301829169,13.9302753351,13.9303677474,13.9304601538,13.9305525543,13.9306449489, 13.9307373376,13.9308297203,13.9309220971,13.931014468,13.931106833,13.9311991921,13.9312915453,13.9313838925,13.9314762339,13.9315685693,13.9316608989,13.9317532225,13.9318455402,13.931937852,13.9320301579,13.9321224579, 13.932214752,13.9323070402,13.9323993224,13.9324915988,13.9325838693,13.9326761339,13.9327683925,13.9328606453,13.9329528922,13.9330451332,13.9331373683,13.9332295974,13.9333218207,13.9334140381,13.9335062496,13.9335984552, 13.933690655,13.9337828488,13.9338750367,13.9339672187,13.9340593949,13.9341515652,13.9342437295,13.934335888,13.9344280406,13.9345201873,13.9346123282,13.9347044631,13.9347965922,13.9348887154,13.9349808327,13.9350729441, 13.9351650496,13.9352571493,13.935349243,13.9354413309,13.935533413,13.9356254891,13.9357175594,13.9358096238,13.9359016823,13.9359937349,13.9360857817,13.9361778226,13.9362698576,13.9363618868,13.93645391,13.9365459275, 13.936637939,13.9367299447,13.9368219445,13.9369139384,13.9370059265,13.9370979087,13.9371898851,13.9372818556,13.9373738202,13.937465779,13.9375577319,13.9376496789,13.9377416201,13.9378335554,13.9379254849,13.9380174085, 13.9381093262,13.9382012381,13.9382931442,13.9383850443,13.9384769387,13.9385688271,13.9386607098,13.9387525865,13.9388444575,13.9389363225,13.9390281818,13.9391200351,13.9392118827,13.9393037243,13.9393955602,13.9394873902, 13.9395792143,13.9396710326,13.9397628451,13.9398546517,13.9399464525,13.9400382474,13.9401300365,13.9402218197,13.9403135971,13.9404053687,13.9404971345,13.9405888944,13.9406806484,13.9407723967,13.940864139,13.9409558756, 13.9410476063,13.9411393312,13.9412310503,13.9413227635,13.9414144709,13.9415061725,13.9415978683,13.9416895582,13.9417812423,13.9418729205,13.941964593,13.9420562596,13.9421479204,13.9422395754,13.9423312245,13.9424228678, 13.9425145053,13.942606137,13.9426977629,13.9427893829,13.9428809972,13.9429726056,13.9430642082,13.9431558049,13.9432473959,13.943338981,13.9434305604,13.9435221339,13.9436137016,13.9437052635,13.9437968196,13.9438883699, 13.9439799143,13.944071453,13.9441629859,13.9442545129,13.9443460341,13.9444375496,13.9445290592,13.944620563,13.944712061,13.9448035533,13.9448950397,13.9449865203,13.9450779951,13.9451694641,13.9452609273,13.9453523848, 13.9454438364,13.9455352822,13.9456267222,13.9457181565,13.9458095849,13.9459010075,13.9459924244,13.9460838355,13.9461752407,13.9462666402,13.9463580339,13.9464494218,13.9465408039,13.9466321802,13.9467235507,13.9468149155, 13.9469062745,13.9469976276,13.947088975,13.9471803166,13.9472716525,13.9473629825,13.9474543068,13.9475456252,13.947636938,13.9477282449,13.947819546,13.9479108414,13.948002131,13.9480934148,13.9481846928,13.9482759651, 13.9483672316,13.9484584923,13.9485497472,13.9486409964,13.9487322398,13.9488234775,13.9489147093,13.9490059354,13.9490971557,13.9491883703,13.9492795791,13.9493707821,13.9494619794,13.9495531709,13.9496443566,13.9497355366, 13.9498267108,13.9499178792,13.9500090419,13.9501001988,13.95019135,13.9502824954,13.950373635,13.9504647689,13.950555897,13.9506470194,13.950738136,13.9508292469,13.950920352,13.9510114514,13.951102545,13.9511936329, 13.951284715,13.9513757913,13.9514668619,13.9515579268,13.9516489859,13.9517400393,13.9518310869,13.9519221288,13.9520131649,13.9521041953,13.9521952199,13.9522862388,13.952377252,13.9524682594,13.9525592611,13.952650257, 13.9527412472,13.9528322316,13.9529232104,13.9530141833,13.9531051506,13.9531961121,13.9532870679,13.9533780179,13.9534689622,13.9535599008,13.9536508336,13.9537417608,13.9538326821,13.9539235978,13.9540145077,13.9541054119, 13.9541963104,13.9542872031,13.9543780901,13.9544689714,13.954559847,13.9546507168,13.954741581,13.9548324394,13.954923292,13.955014139,13.9551049802,13.9551958157,13.9552866455,13.9553774696,13.955468288,13.9555591006, 13.9556499075,13.9557407087,13.9558315042,13.955922294,13.9560130781,13.9561038564,13.9561946291,13.956285396,13.9563761572,13.9564669128,13.9565576626,13.9566484067,13.9567391451,13.9568298777,13.9569206047,13.957011326, 13.9571020416,13.9571927514,13.9572834556,13.957374154,13.9574648468,13.9575555339,13.9576462152,13.9577368909,13.9578275608,13.9579182251,13.9580088837,13.9580995365,13.9581901837,13.9582808252,13.9583714609,13.958462091, 13.9585527154,13.9586433341,13.9587339471,13.9588245545,13.9589151561,13.959005752,13.9590963423,13.9591869268,13.9592775057,13.9593680789,13.9594586464,13.9595492082,13.9596397644,13.9597303148,13.9598208596,13.9599113987, 13.9600019321,13.9600924598,13.9601829818,13.9602734982,13.9603640089,13.9604545139,13.9605450132,13.9606355069,13.9607259948,13.9608164771,13.9609069538,13.9609974247,13.96108789,13.9611783496,13.9612688035,13.9613592518, 13.9614496944,13.9615401313,13.9616305626,13.9617209882,13.9618114081,13.9619018223,13.9619922309,13.9620826339,13.9621730311,13.9622634227,13.9623538086,13.9624441889,13.9625345635,13.9626249325,13.9627152957,13.9628056534, 13.9628960053,13.9629863516,13.9630766923,13.9631670273,13.9632573566,13.9633476803,13.9634379983,13.9635283107,13.9636186174,13.9637089185,13.9637992139,13.9638895037,13.9639797878,13.9640700663,13.9641603391,13.9642506063, 13.9643408678,13.9644311237,13.9645213739,13.9646116185,13.9647018574,13.9647920907,13.9648823184,13.9649725404,13.9650627567,13.9651529675,13.9652431726,13.965333372,13.9654235658,13.965513754,13.9656039365,13.9656941134, 13.9657842847,13.9658744503,13.9659646103,13.9660547646,13.9661449133,13.9662350564,13.9663251939,13.9664153257,13.9665054519,13.9665955725,13.9666856874,13.9667757967,13.9668659004,13.9669559984,13.9670460909,13.9671361777, 13.9672262588,13.9673163344,13.9674064043,13.9674964686,13.9675865273,13.9676765804,13.9677666278,13.9678566696,13.9679467058,13.9680367364,13.9681267614,13.9682167807,13.9683067944,13.9683968025,13.968486805,13.9685768019, 13.9686667932,13.9687567789,13.9688467589,13.9689367333,13.9690267022,13.9691166654,13.969206623,13.969296575,13.9693865213,13.9694764621,13.9695663973,13.9696563269,13.9697462508,13.9698361692,13.9699260819,13.9700159891, 13.9701058906,13.9701957866,13.9702856769,13.9703755616,13.9704654408,13.9705553143,13.9706451823,13.9707350446,13.9708249014,13.9709147525,13.9710045981,13.971094438,13.9711842724,13.9712741012,13.9713639244,13.971453742, 13.971543554,13.9716333604,13.9717231612,13.9718129564,13.971902746,13.9719925301,13.9720823086,13.9721720814,13.9722618487,13.9723516104,13.9724413666,13.9725311171,13.9726208621,13.9727106014,13.9728003352,13.9728900634, 13.9729797861,13.9730695031,13.9731592146,13.9732489205,13.9733386208,13.9734283155,13.9735180047,13.9736076883,13.9736973663,13.9737870387,13.9738767056,13.9739663669,13.9740560226,13.9741456728,13.9742353174,13.9743249564, 13.9744145898,13.9745042177,13.97459384,13.9746834567,13.9747730679,13.9748626735,13.9749522735,13.975041868,13.9751314569,13.9752210403,13.9753106181,13.9754001903,13.9754897569,13.975579318,13.9756688736,13.9757584236, 13.975847968,13.9759375069,13.9760270402,13.9761165679,13.9762060901,13.9762956068,13.9763851179,13.9764746234,13.9765641234,13.9766536179,13.9767431067,13.9768325901,13.9769220679,13.9770115401,13.9771010068,13.9771904679, 13.9772799235,13.9773693735,13.977458818,13.977548257,13.9776376904,13.9777271183,13.9778165406,13.9779059574,13.9779953686,13.9780847743,13.9781741745,13.9782635691,13.9783529582,13.9784423417,13.9785317197,13.9786210922, 13.9787104591,13.9787998205,13.9788891764,13.9789785267,13.9790678715,13.9791572107,13.9792465445,13.9793358727,13.9794251953,13.9795145125,13.9796038241,13.9796931302,13.9797824307,13.9798717257,13.9799610152,13.9800502992, 13.9801395776,13.9802288506,13.980318118,13.9804073798,13.9804966362,13.980585887,13.9806751323,13.9807643721,13.9808536064,13.9809428351,13.9810320584,13.9811212761,13.9812104883,13.981299695,13.9813888961,13.9814780918, 13.9815672819,13.9816564665,13.9817456456,13.9818348192,13.9819239873,13.9820131499,13.982102307,13.9821914585,13.9822806046,13.9823697451,13.9824588801,13.9825480097,13.9826371337,13.9827262522,13.9828153652,13.9829044727, 13.9829935747,13.9830826712,13.9831717622,13.9832608477,13.9833499277,13.9834390022,13.9835280712,13.9836171347,13.9837061927,13.9837952452,13.9838842922,13.9839733337,13.9840623697,13.9841514002,13.9842404252,13.9843294448, 13.9844184588,13.9845074673,13.9845964704,13.984685468,13.98477446,13.9848634466,13.9849524277,13.9850414033,13.9851303735,13.9852193381,13.9853082973,13.9853972509,13.9854861991,13.9855751418,13.985664079,13.9857530108, 13.985841937,13.9859308578,13.9860197731,13.9861086829,13.9861975872,13.9862864861,13.9863753794,13.9864642673,13.9865531498,13.9866420267,13.9867308982,13.9868197642,13.9869086247,13.9869974797,13.9870863293,13.9871751734, 13.9872640121,13.9873528452,13.9874416729,13.9875304952,13.9876193119,13.9877081232,13.987796929,13.9878857294,13.9879745243,13.9880633137,13.9881520977,13.9882408762,13.9883296492,13.9884184168,13.9885071789,13.9885959356, 13.9886846868,13.9887734325,13.9888621728,13.9889509076,13.989039637,13.9891283609,13.9892170793,13.9893057923,13.9893944998,13.9894832019,13.9895718986,13.9896605897,13.9897492755,13.9898379557,13.9899266306,13.9900152999, 13.9901039639,13.9901926223,13.9902812754,13.9903699229,13.9904585651,13.9905472018,13.990635833,13.9907244588,13.9908130792,13.9909016941,13.9909903035,13.9910789076,13.9911675061,13.9912560993,13.991344687,13.9914332693, 13.9915218461,13.9916104175,13.9916989834,13.9917875439,13.991876099,13.9919646486,13.9920531929,13.9921417316,13.992230265,13.9923187929,13.9924073153,13.9924958324,13.992584344,13.9926728502,13.9927613509,13.9928498463, 13.9929383362,13.9930268206,13.9931152997,13.9932037733,13.9932922415,13.9933807043,13.9934691616,13.9935576135,13.99364606,13.9937345011,13.9938229367,13.993911367,13.9939997918,13.9940882112,13.9941766252,13.9942650337, 13.9943534369,13.9944418346,13.9945302269,13.9946186138,13.9947069953,13.9947953713,13.994883742,13.9949721072,13.995060467,13.9951488214,13.9952371704,13.995325514,13.9954138522,13.995502185,13.9955905124,13.9956788343, 13.9957671509,13.995855462,13.9959437678,13.9960320681,13.996120363,13.9962086526,13.9962969367,13.9963852154,13.9964734887,13.9965617567,13.9966500192,13.9967382763,13.996826528,13.9969147743,13.9970030153,13.9970912508, 13.9971794809,13.9972677057,13.997355925,13.997444139,13.9975323475,13.9976205507,13.9977087485,13.9977969408,13.9978851278,13.9979733094,13.9980614856,13.9981496565,13.9982378219,13.9983259819,13.9984141366,13.9985022859, 13.9985904297,13.9986785682,13.9987667014,13.9988548291,13.9989429514,13.9990310684,13.99911918,13.9992072862,13.999295387,13.9993834825,13.9994715725,13.9995596572,13.9996477365,13.9997358105,13.999823879,13.9999119422, 14.0,14.0000880524,14.0001760995,14.0002641412,14.0003521775,14.0004402084,14.000528234,14.0006162542,14.000704269,14.0007922785,14.0008802826,14.0009682813,14.0010562746,14.0011442626,14.0012322452,14.0013202225, 14.0014081944,14.0014961609,14.0015841221,14.0016720779,14.0017600283,14.0018479734,14.0019359131,14.0020238475,14.0021117765,14.0021997001,14.0022876184,14.0023755313,14.0024634389,14.0025513411,14.002639238,14.0027271295, 14.0028150156,14.0029028964,14.0029907718,14.0030786419,14.0031665067,14.0032543661,14.0033422201,14.0034300688,14.0035179121,14.0036057501,14.0036935827,14.00378141,14.003869232,14.0039570486,14.0040448598,14.0041326657, 14.0042204663,14.0043082615,14.0043960514,14.004483836,14.0045716152,14.004659389,14.0047471575,14.0048349207,14.0049226786,14.0050104311,14.0050981782,14.0051859201,14.0052736566,14.0053613877,14.0054491135,14.005536834, 14.0056245492,14.005712259,14.0057999635,14.0058876627,14.0059753565,14.006063045,14.0061507282,14.006238406,14.0063260785,14.0064137457,14.0065014076,14.0065890641,14.0066767153,14.0067643612,14.0068520017,14.006939637, 14.0070272669,14.0071148915,14.0072025107,14.0072901247,14.0073777333,14.0074653366,14.0075529346,14.0076405273,14.0077281146,14.0078156967,14.0079032734,14.0079908448,14.0080784109,14.0081659716,14.0082535271,14.0083410772, 14.0084286221,14.0085161616,14.0086036958,14.0086912247,14.0087787483,14.0088662666,14.0089537795,14.0090412872,14.0091287895,14.0092162866,14.0093037783,14.0093912648,14.0094787459,14.0095662217,14.0096536922,14.0097411575, 14.0098286174,14.009916072,14.0100035213,14.0100909653,14.010178404,14.0102658374,14.0103532655,14.0104406884,14.0105281059,14.0106155181,14.010702925,14.0107903267,14.010877723,14.0109651141,14.0110524998,14.0111398803, 14.0112272554,14.0113146253,14.0114019899,14.0114893492,14.0115767032,14.0116640519,14.0117513953,14.0118387335,14.0119260663,14.0120133939,14.0121007162,14.0121880331,14.0122753449,14.0123626513,14.0124499524,14.0125372483, 14.0126245389,14.0127118242,14.0127991042,14.0128863789,14.0129736484,14.0130609126,14.0131481715,14.0132354251,14.0133226734,14.0134099165,14.0134971543,14.0135843868,14.0136716141,14.013758836,14.0138460527,14.0139332642, 14.0140204703,14.0141076712,14.0141948668,14.0142820572,14.0143692422,14.014456422,14.0145435966,14.0146307659,14.0147179299,14.0148050886,14.0148922421,14.0149793903,14.0150665332,14.0151536709,14.0152408033,14.0153279305, 14.0154150524,14.015502169,14.0155892804,14.0156763865,14.0157634874,14.015850583,14.0159376733,14.0160247584,14.0161118382,14.0161989128,14.0162859821,14.0163730462,14.016460105,14.0165471585,14.0166342068,14.0167212499, 14.0168082877,14.0168953202,14.0169823475,14.0170693696,14.0171563864,14.0172433979,14.0173304042,14.0174174053,14.0175044011,14.0175913917,14.017678377,14.0177653571,14.0178523319,14.0179393015,14.0180262658,14.0181132249, 14.0182001788,14.0182871274,14.0183740708,14.018461009,14.0185479419,14.0186348695,14.018721792,14.0188087092,14.0188956211,14.0189825278,14.0190694293,14.0191563256,14.0192432166,14.0193301024,14.0194169829,14.0195038583, 14.0195907284,14.0196775932,14.0197644528,14.0198513073,14.0199381564,14.0200250004,14.0201118391,14.0201986726,14.0202855008,14.0203723239,14.0204591417,14.0205459543,14.0206327617,14.0207195638,14.0208063607,14.0208931524, 14.0209799389,14.0210667202,14.0211534962,14.021240267,14.0213270326,14.021413793,14.0215005482,14.0215872981,14.0216740429,14.0217607824,14.0218475167,14.0219342458,14.0220209696,14.0221076883,14.0221944018,14.02228111, 14.022367813,14.0224545108,14.0225412035,14.0226278909,14.022714573,14.02280125,14.0228879218,14.0229745884,14.0230612497,14.0231479059,14.0232345568,14.0233212026,14.0234078431,14.0234944785,14.0235811086,14.0236677336, 14.0237543533,14.0238409678,14.0239275772,14.0240141813,14.0241007803,14.024187374,14.0242739625,14.0243605459,14.024447124,14.024533697,14.0246202648,14.0247068273,14.0247933847,14.0248799369,14.0249664839,14.0250530257, 14.0251395623,14.0252260937,14.0253126199,14.025399141,14.0254856568,14.0255721675,14.0256586729,14.0257451732,14.0258316683,14.0259181582,14.026004643,14.0260911225,14.0261775969,14.0262640661,14.0263505301,14.0264369889, 14.0265234425,14.026609891,14.0266963342,14.0267827723,14.0268692053,14.026955633,14.0270420556,14.027128473,14.0272148852,14.0273012922,14.0273876941,14.0274740907,14.0275604822,14.0276468686,14.0277332498,14.0278196257, 14.0279059966,14.0279923622,14.0280787227,14.028165078,14.0282514282,14.0283377731,14.0284241129,14.0285104476,14.0285967771,14.0286831014,14.0287694205,14.0288557345,14.0289420433,14.029028347,14.0291146455,14.0292009388, 14.029287227,14.02937351,14.0294597878,14.0295460605,14.029632328,14.0297185904,14.0298048476,14.0298910997,14.0299773466,14.0300635883,14.0301498249,14.0302360564,14.0303222826,14.0304085038,14.0304947197,14.0305809306, 14.0306671362,14.0307533368,14.0308395321,14.0309257224,14.0310119074,14.0310980874,14.0311842621,14.0312704318,14.0313565963,14.0314427556,14.0315289098,14.0316150588,14.0317012027,14.0317873415,14.0318734751,14.0319596036, 14.0320457269,14.0321318451,14.0322179582,14.0323040661,14.0323901689,14.0324762665,14.032562359,14.0326484464,14.0327345286,14.0328206057,14.0329066776,14.0329927444,14.0330788061,14.0331648627,14.0332509141,14.0333369604, 14.0334230015,14.0335090376,14.0335950685,14.0336810942,14.0337671148,14.0338531304,14.0339391407,14.034025146,14.0341111461,14.0341971411,14.034283131,14.0343691157,14.0344550953,14.0345410698,14.0346270392,14.0347130034, 14.0347989626,14.0348849166,14.0349708655,14.0350568092,14.0351427479,14.0352286814,14.0353146098,14.0354005331,14.0354864513,14.0355723644,14.0356582723,14.0357441751,14.0358300728,14.0359159654,14.0360018529,14.0360877353, 14.0361736126,14.0362594847,14.0363453517,14.0364312137,14.0365170705,14.0366029222,14.0366887688,14.0367746103,14.0368604467,14.036946278,14.0370321041,14.0371179252,14.0372037412,14.037289552,14.0373753578,14.0374611584, 14.037546954,14.0376327444,14.0377185298,14.03780431,14.0378900851,14.0379758552,14.0380616201,14.03814738,14.0382331347,14.0383188844,14.0384046289,14.0384903684,14.0385761028,14.038661832,14.0387475562,14.0388332753, 14.0389189893,14.0390046982,14.039090402,14.0391761007,14.0392617943,14.0393474829,14.0394331663,14.0395188447,14.039604518,14.0396901861,14.0397758492,14.0398615072,14.0399471602,14.040032808,14.0401184508,14.0402040884, 14.040289721,14.0403753485,14.040460971,14.0405465883,14.0406322006,14.0407178077,14.0408034098,14.0408890069,14.0409745988,14.0410601857,14.0411457675,14.0412313442,14.0413169158,14.0414024824,14.0414880439,14.0415736003, 14.0416591516,14.0417446979,14.0418302391,14.0419157752,14.0420013063,14.0420868323,14.0421723532,14.042257869,14.0423433798,14.0424288855,14.0425143861,14.0425998817,14.0426853722,14.0427708577,14.042856338,14.0429418133, 14.0430272836,14.0431127488,14.0431982089,14.043283664,14.043369114,14.0434545589,14.0435399988,14.0436254336,14.0437108633,14.043796288,14.0438817077,14.0439671223,14.0440525318,14.0441379363,14.0442233357,14.0443087301, 14.0443941194,14.0444795036,14.0445648828,14.044650257,14.0447356261,14.0448209901,14.0449063491,14.044991703,14.0450770519,14.0451623958,14.0452477346,14.0453330683,14.045418397,14.0455037207,14.0455890393,14.0456743529, 14.0457596614,14.0458449649,14.0459302633,14.0460155567,14.046100845,14.0461861283,14.0462714066,14.0463566798,14.046441948,14.0465272112,14.0466124693,14.0466977223,14.0467829704,14.0468682133,14.0469534513,14.0470386842, 14.0471239121,14.047209135,14.0472943528,14.0473795656,14.0474647733,14.047549976,14.0476351737,14.0477203664,14.047805554,14.0478907366,14.0479759142,14.0480610867,14.0481462542,14.0482314167,14.0483165742,14.0484017266, 14.048486874,14.0485720164,14.0486571537,14.0487422861,14.0488274134,14.0489125356,14.0489976529,14.0490827652,14.0491678724,14.0492529746,14.0493380718,14.0494231639,14.0495082511,14.0495933332,14.0496784103,14.0497634824, 14.0498485495,14.0499336115,14.0500186686,14.0501037206,14.0501887676,14.0502738096,14.0503588466,14.0504438786,14.0505289055,14.0506139275,14.0506989444,14.0507839564,14.0508689633,14.0509539652,14.0510389621,14.051123954, 14.0512089409,14.0512939228,14.0513788997,14.0514638716,14.0515488384,14.0516338003,14.0517187572,14.051803709,14.0518886559,14.0519735978,14.0520585346,14.0521434665,14.0522283933,14.0523133152,14.0523982321,14.0524831439, 14.0525680508,14.0526529527,14.0527378495,14.0528227414,14.0529076283,14.0529925102,14.0530773871,14.053162259,14.0532471259,14.0533319878,14.0534168448,14.0535016967,14.0535865436,14.0536713856,14.0537562226,14.0538410545, 14.0539258815,14.0540107035,14.0540955206,14.0541803326,14.0542651396,14.0543499417,14.0544347388,14.0545195309,14.054604318,14.0546891001,14.0547738772,14.0548586494,14.0549434166,14.0550281788,14.055112936,14.0551976882, 14.0552824355,14.0553671778,14.0554519151,14.0555366474,14.0556213748,14.0557060972,14.0557908146,14.055875527,14.0559602345,14.0560449369,14.0561296344,14.056214327,14.0562990146,14.0563836971,14.0564683748,14.0565530474, 14.0566377151,14.0567223778,14.0568070356,14.0568916884,14.0569763362,14.057060979,14.0571456169,14.0572302498,14.0573148778,14.0573995008,14.0574841188,14.0575687319,14.05765334,14.0577379431,14.0578225413,14.0579071345, 14.0579917228,14.0580763061,14.0581608844,14.0582454578,14.0583300262,14.0584145897,14.0584991482,14.0585837017,14.0586682503,14.058752794,14.0588373327,14.0589218664,14.0590063952,14.059090919,14.0591754379,14.0592599518, 14.0593444608,14.0594289649,14.0595134639,14.0595979581,14.0596824472,14.0597669315,14.0598514108,14.0599358851,14.0600203545,14.060104819,14.0601892785,14.060273733,14.0603581826,14.0604426273,14.060527067,14.0606115018, 14.0606959317,14.0607803566,14.0608647766,14.0609491916,14.0610336017,14.0611180068,14.061202407,14.0612868023,14.0613711927,14.0614555781,14.0615399585,14.0616243341,14.0617087047,14.0617930703,14.0618774311,14.0619617869, 14.0620461377,14.0621304837,14.0622148247,14.0622991607,14.0623834919,14.0624678181,14.0625521394,14.0626364557,14.0627207672,14.0628050737,14.0628893752,14.0629736719,14.0630579636,14.0631422504,14.0632265323,14.0633108093, 14.0633950813,14.0634793484,14.0635636106,14.0636478679,14.0637321202,14.0638163676,14.0639006101,14.0639848477,14.0640690804,14.0641533081,14.064237531,14.0643217489,14.0644059619,14.06449017,14.0645743731,14.0646585714, 14.0647427648,14.0648269532,14.0649111367,14.0649953153,14.065079489,14.0651636578,14.0652478217,14.0653319806,14.0654161347,14.0655002838,14.0655844281,14.0656685674,14.0657527018,14.0658368313,14.0659209559,14.0660050757, 14.0660891905,14.0661733004,14.0662574054,14.0663415054,14.0664256006,14.0665096909,14.0665937763,14.0666778568,14.0667619324,14.0668460031,14.0669300689,14.0670141298,14.0670981857,14.0671822368,14.067266283,14.0673503243, 14.0674343608,14.0675183923,14.0676024189,14.0676864406,14.0677704574,14.0678544694,14.0679384764,14.0680224786,14.0681064759,14.0681904682,14.0682744557,14.0683584383,14.068442416,14.0685263888,14.0686103568,14.0686943198, 14.068778278,14.0688622313,14.0689461796,14.0690301232,14.0691140618,14.0691979955,14.0692819244,14.0693658483,14.0694497674,14.0695336816,14.069617591,14.0697014954,14.069785395,14.0698692897,14.0699531795,14.0700370644, 14.0701209445,14.0702048197,14.07028869,14.0703725554,14.0704564159,14.0705402716,14.0706241224,14.0707079684,14.0707918094,14.0708756456,14.0709594769,14.0710433034,14.0711271249,14.0712109417,14.0712947535,14.0713785605, 14.0714623626,14.0715461598,14.0716299522,14.0717137397,14.0717975223,14.0718813001,14.071965073,14.072048841,14.0721326042,14.0722163625,14.0723001159,14.0723838645,14.0724676082,14.0725513471,14.0726350811,14.0727188103, 14.0728025345,14.072886254,14.0729699685,14.0730536783,14.0731373831,14.0732210831,14.0733047783,14.0733884685,14.073472154,14.0735558346,14.0736395103,14.0737231812,14.0738068472,14.0738905083,14.0739741647,14.0740578161, 14.0741414628,14.0742251045,14.0743087414,14.0743923735,14.0744760007,14.0745596231,14.0746432406,14.0747268533,14.0748104612,14.0748940642,14.0749776623,14.0750612556,14.0751448441,14.0752284277,14.0753120065,14.0753955804, 14.0754791495,14.0755627137,14.0756462732,14.0757298277,14.0758133775,14.0758969224,14.0759804624,14.0760639976,14.076147528,14.0762310536,14.0763145743,14.0763980902,14.0764816012,14.0765651074,14.0766486088,14.0767321053, 14.0768155971,14.0768990839,14.076982566,14.0770660432,14.0771495156,14.0772329831,14.0773164459,14.0773999038,14.0774833569,14.0775668051,14.0776502485,14.0777336871,14.0778171209,14.0779005498,14.077983974,14.0780673933, 14.0781508077,14.0782342174,14.0783176222,14.0784010222,14.0784844174,14.0785678078,14.0786511933,14.0787345741,14.07881795,14.0789013211,14.0789846873,14.0790680488,14.0791514054,14.0792347572,14.0793181043,14.0794014464, 14.0794847838,14.0795681164,14.0796514441,14.0797347671,14.0798180852,14.0799013985,14.079984707,14.0800680107,14.0801513096,14.0802346037,14.080317893,14.0804011774,14.0804844571,14.0805677319,14.0806510019,14.0807342672, 14.0808175276,14.0809007832,14.080984034,14.0810672801,14.0811505213,14.0812337577,14.0813169893,14.0814002161,14.0814834381,14.0815666553,14.0816498677,14.0817330753,14.0818162781,14.0818994761,14.0819826693,14.0820658577, 14.0821490414,14.0822322202,14.0823153942,14.0823985634,14.0824817279,14.0825648875,14.0826480424,14.0827311924,14.0828143377,14.0828974781,14.0829806138,14.0830637447,14.0831468708,14.0832299921,14.0833131087,14.0833962204, 14.0834793273,14.0835624295,14.0836455269,14.0837286195,14.0838117073,14.0838947903,14.0839778685,14.084060942,14.0841440106,14.0842270745,14.0843101336,14.0843931879,14.0844762375,14.0845592822,14.0846423222,14.0847253574, 14.0848083878,14.0848914134,14.0849744343,14.0850574504,14.0851404617,14.0852234682,14.08530647,14.085389467,14.0854724592,14.0855554466,14.0856384293,14.0857214072,14.0858043803,14.0858873486,14.0859703122,14.086053271, 14.086136225,14.0862191743,14.0863021188,14.0863850585,14.0864679935,14.0865509237,14.0866338491,14.0867167697,14.0867996856,14.0868825967,14.0869655031,14.0870484047,14.0871313015,14.0872141936,14.0872970809,14.0873799635, 14.0874628413,14.0875457143,14.0876285825,14.087711446,14.0877943048,14.0878771588,14.087960008,14.0880428525,14.0881256922,14.0882085271,14.0882913573,14.0883741828,14.0884570035,14.0885398194,14.0886226306,14.088705437, 14.0887882387,14.0888710356,14.0889538278,14.0890366152,14.0891193979,14.0892021758,14.089284949,14.0893677174,14.0894504811,14.08953324,14.0896159942,14.0896987437,14.0897814884,14.0898642283,14.0899469635,14.090029694, 14.0901124197,14.0901951406,14.0902778569,14.0903605683,14.0904432751,14.0905259771,14.0906086743,14.0906913669,14.0907740546,14.0908567377,14.090939416,14.0910220895,14.0911047584,14.0911874225,14.0912700818,14.0913527364, 14.0914353863,14.0915180315,14.0916006719,14.0916833076,14.0917659385,14.0918485647,14.0919311862,14.092013803,14.092096415,14.0921790223,14.0922616248,14.0923442227,14.0924268158,14.0925094042,14.0925919878,14.0926745667, 14.0927571409,14.0928397104,14.0929222751,14.0930048352,14.0930873904,14.093169941,14.0932524869,14.093335028,14.0934175644,14.0935000961,14.093582623,14.0936651453,14.0937476628,14.0938301756,14.0939126837,14.093995187, 14.0940776857,14.0941601796,14.0942426688,14.0943251533,14.0944076331,14.0944901081,14.0945725785,14.0946550441,14.094737505,14.0948199613,14.0949024128,14.0949848595,14.0950673016,14.095149739,14.0952321716,14.0953145996, 14.0953970228,14.0954794413,14.0955618551,14.0956442642,14.0957266686,14.0958090683,14.0958914633,14.0959738536,14.0960562392,14.0961386201,14.0962209962,14.0963033677,14.0963857345,14.0964680965,14.0965504539,14.0966328065, 14.0967151545,14.0967974977,14.0968798363,14.0969621702,14.0970444993,14.0971268238,14.0972091436,14.0972914586,14.097373769,14.0974560747,14.0975383756,14.0976206719,14.0977029635,14.0977852504,14.0978675326,14.0979498101, 14.098032083,14.0981143511,14.0981966145,14.0982788733,14.0983611273,14.0984433767,14.0985256214,14.0986078614,14.0986900967,14.0987723273,14.0988545532,14.0989367745,14.099018991,14.0991012029,14.0991834101,14.0992656126, 14.0993478104,14.0994300035,14.099512192,14.0995943758,14.0996765549,14.0997587293,14.099840899,14.0999230641,14.1000052244,14.1000873801,14.1001695311,14.1002516775,14.1003338191,14.1004159561,14.1004980884,14.100580216, 14.100662339,14.1007444573,14.1008265709,14.1009086798,14.1009907841,14.1010728837,14.1011549786,14.1012370688,14.1013191544,14.1014012353,14.1014833116,14.1015653831,14.10164745,14.1017295123,14.1018115698,14.1018936227, 14.1019756709,14.1020577145,14.1021397534,14.1022217876,14.1023038172,14.1023858421,14.1024678624,14.1025498779,14.1026318889,14.1027138951,14.1027958967,14.1028778936,14.1029598859,14.1030418735,14.1031238565,14.1032058348, 14.1032878084,14.1033697774,14.1034517417,14.1035337014,14.1036156564,14.1036976068,14.1037795525,14.1038614935,14.1039434299,14.1040253616,14.1041072887,14.1041892112,14.1042711289,14.1043530421,14.1044349506,14.1045168544, 14.1045987536,14.1046806481,14.104762538,14.1048444232,14.1049263038,14.1050081798,14.105090051,14.1051719177,14.1052537797,14.1053356371,14.1054174898,14.1054993378,14.1055811813,14.1056630201,14.1057448542,14.1058266837, 14.1059085086,14.1059903288,14.1060721444,14.1061539553,14.1062357616,14.1063175633,14.1063993603,14.1064811527,14.1065629404,14.1066447236,14.106726502,14.1068082759,14.1068900451,14.1069718097,14.1070535696,14.1071353249, 14.1072170756,14.1072988216,14.107380563,14.1074622998,14.107544032,14.1076257595,14.1077074824,14.1077892006,14.1078709143,14.1079526233,14.1080343277,14.1081160274,14.1081977225,14.108279413,14.1083610989,14.1084427802, 14.1085244568,14.1086061288,14.1086877962,14.1087694589,14.108851117,14.1089327706,14.1090144194,14.1090960637,14.1091777034,14.1092593384,14.1093409688,14.1094225946,14.1095042158,14.1095858323,14.1096674443,14.1097490516, 14.1098306543,14.1099122524,14.1099938458,14.1100754347,14.110157019,14.1102385986,14.1103201736,14.110401744,14.1104833098,14.110564871,14.1106464276,14.1107279795,14.1108095269,14.1108910696,14.1109726078,14.1110541413, 14.1111356702,14.1112171945,14.1112987143,14.1113802294,14.1114617399,14.1115432457,14.111624747,14.1117062437,14.1117877358,14.1118692233,14.1119507062,14.1120321844,14.1121136581,14.1121951272,14.1122765916,14.1123580515, 14.1124395068,14.1125209575,14.1126024035,14.112683845,14.1127652819,14.1128467142,14.1129281419,14.1130095649,14.1130909834,14.1131723973,14.1132538067,14.1133352114,14.1134166115,14.113498007,14.113579398,14.1136607843, 14.113742166,14.1138235432,14.1139049158,14.1139862838,14.1140676472,14.114149006,14.1142303602,14.1143117098,14.1143930549,14.1144743953,14.1145557312,14.1146370625,14.1147183892,14.1147997113,14.1148810288,14.1149623418, 14.1150436502,14.1151249539,14.1152062532,14.1152875478,14.1153688378,14.1154501233,14.1155314042,14.1156126805,14.1156939522,14.1157752193,14.1158564819,14.1159377399,14.1160189933,14.1161002422,14.1161814864,14.1162627261, 14.1163439612,14.1164251918,14.1165064177,14.1165876391,14.116668856,14.1167500682,14.1168312759,14.116912479,14.1169936775,14.1170748715,14.1171560609,14.1172372457,14.117318426,14.1173996017,14.1174807728,14.1175619394, 14.1176431014,14.1177242588,14.1178054117,14.11788656,14.1179677037,14.1180488429,14.1181299775,14.1182111075,14.118292233,14.1183733539,14.1184544703,14.1185355821,14.1186166894,14.118697792,14.1187788902,14.1188599837, 14.1189410727,14.1190221572,14.1191032371,14.1191843124,14.1192653832,14.1193464494,14.1194275111,14.1195085682,14.1195896207,14.1196706687,14.1197517122,14.1198327511,14.1199137855,14.1199948153,14.1200758405,14.1201568612, 14.1202378773,14.1203188889,14.120399896,14.1204808985,14.1205618964,14.1206428898,14.1207238787,14.120804863,14.1208858428,14.120966818,14.1210477887,14.1211287548,14.1212097164,14.1212906735,14.121371626,14.1214525739, 14.1215335173,14.1216144562,14.1216953906,14.1217763204,14.1218572456,14.1219381663,14.1220190825,14.1220999942,14.1221809013,14.1222618038,14.1223427019,14.1224235954,14.1225044843,14.1225853687,14.1226662486,14.122747124, 14.1228279948,14.1229088611,14.1229897229,14.1230705801,14.1231514328,14.1232322809,14.1233131246,14.1233939637,14.1234747982,14.1235556283,14.1236364538,14.1237172748,14.1237980913,14.1238789032,14.1239597106,14.1240405135, 14.1241213118,14.1242021057,14.124282895,14.1243636797,14.12444446,14.1245252357,14.124606007,14.1246867737,14.1247675358,14.1248482935,14.1249290466,14.1250097952,14.1250905393,14.1251712789,14.1252520139,14.1253327445, 14.1254134705,14.125494192,14.125574909,14.1256556214,14.1257363294,14.1258170328,14.1258977318,14.1259784262,14.1260591161,14.1261398015,14.1262204823,14.1263011587,14.1263818305,14.1264624979,14.1265431607,14.126623819, 14.1267044728,14.1267851221,14.1268657669,14.1269464072,14.127027043,14.1271076743,14.127188301,14.1272689233,14.1273495411,14.1274301543,14.1275107631,14.1275913673,14.127671967,14.1277525623,14.127833153,14.1279137392, 14.127994321,14.1280748982,14.1281554709,14.1282360392,14.1283166029,14.1283971621,14.1284777169,14.1285582671,14.1286388129,14.1287193541,14.1287998908,14.1288804231,14.1289609509,14.1290414741,14.1291219929,14.1292025072, 14.1292830169,14.1293635222,14.129444023,14.1295245193,14.1296050112,14.1296854985,14.1297659813,14.1298464597,14.1299269335,14.1300074029,14.1300878678,14.1301683281,14.1302487841,14.1303292355,14.1304096824,14.1304901248, 14.1305705628,14.1306509963,14.1307314253,14.1308118498,14.1308922698,14.1309726853,14.1310530964,14.131133503,14.1312139051,14.1312943027,14.1313746958,14.1314550845,14.1315354687,14.1316158484,14.1316962236,14.1317765943, 14.1318569606,14.1319373224,14.1320176797,14.1320980326,14.1321783809,14.1322587248,14.1323390642,14.1324193992,14.1324997296,14.1325800556,14.1326603771,14.1327406942,14.1328210068,14.1329013149,14.1329816185,14.1330619177, 14.1331422124,14.1332225026,14.1333027884,14.1333830697,14.1334633465,14.1335436189,14.1336238868,14.1337041502,14.1337844092,14.1338646637,14.1339449137,14.1340251593,14.1341054004,14.134185637,14.1342658692,14.134346097, 14.1344263202,14.134506539,14.1345867534,14.1346669632,14.1347471687,14.1348273696,14.1349075661,14.1349877582,14.1350679458,14.1351481289,14.1352283076,14.1353084818,14.1353886516,14.1354688169,14.1355489777,14.1356291342, 14.1357092861,14.1357894336,14.1358695766,14.1359497152,14.1360298494,14.1361099791,14.1361901043,14.1362702251,14.1363503415,14.1364304533,14.1365105608,14.1365906638,14.1366707623,14.1367508564,14.1368309461,14.1369110313, 14.1369911121,14.1370711884,14.1371512603,14.1372313277,14.1373113907,14.1373914492,14.1374715034,14.137551553,14.1376315982,14.137711639,14.1377916754,14.1378717073,14.1379517347,14.1380317577,14.1381117763,14.1381917905, 14.1382718002,14.1383518054,14.1384318063,14.1385118027,14.1385917946,14.1386717822,14.1387517653,14.1388317439,14.1389117181,14.1389916879,14.1390716533,14.1391516142,14.1392315707,14.1393115228,14.1393914704,14.1394714136, 14.1395513524,14.1396312867,14.1397112167,14.1397911422,14.1398710632,14.1399509798,14.1400308921,14.1401107998,14.1401907032,14.1402706021,14.1403504966,14.1404303867,14.1405102724,14.1405901536,14.1406700304,14.1407499028, 14.1408297708,14.1409096343,14.1409894934,14.1410693482,14.1411491984,14.1412290443,14.1413088858,14.1413887228,14.1414685554,14.1415483836,14.1416282074,14.1417080267,14.1417878417,14.1418676522,14.1419474583,14.14202726, 14.1421070573,14.1421868502,14.1422666386,14.1423464227,14.1424262023,14.1425059775,14.1425857484,14.1426655148,14.1427452768,14.1428250343,14.1429047875,14.1429845363,14.1430642806,14.1431440206,14.1432237561,14.1433034873, 14.143383214,14.1434629363,14.1435426542,14.1436223677,14.1437020769,14.1437817816,14.1438614819,14.1439411778,14.1440208693,14.1441005564,14.1441802391,14.1442599174,14.1443395912,14.1444192607,14.1444989258,14.1445785865, 14.1446582428,14.1447378947,14.1448175422,14.1448971853,14.1449768241,14.1450564584,14.1451360883,14.1452157138,14.1452953349,14.1453749517,14.145454564,14.145534172,14.1456137755,14.1456933747,14.1457729694,14.1458525598, 14.1459321458,14.1460117274,14.1460913046,14.1461708775,14.1462504459,14.1463300099,14.1464095696,14.1464891249,14.1465686757,14.1466482222,14.1467277643,14.1468073021,14.1468868354,14.1469663644,14.1470458889,14.1471254091, 14.1472049249,14.1472844364,14.1473639434,14.1474434461,14.1475229444,14.1476024383,14.1476819278,14.1477614129,14.1478408937,14.1479203701,14.1479998421,14.1480793097,14.1481587729,14.1482382318,14.1483176863,14.1483971364, 14.1484765822,14.1485560236,14.1486354605,14.1487148932,14.1487943214,14.1488737453,14.1489531648,14.1490325799,14.1491119907,14.1491913971,14.1492707991,14.1493501968,14.1494295901,14.149508979,14.1495883635,14.1496677437, 14.1497471195,14.1498264909,14.149905858,14.1499852207,14.1500645791,14.1501439331,14.1502232827,14.1503026279,14.1503819688,14.1504613053,14.1505406375,14.1506199653,14.1506992887,14.1507786078,14.1508579225,14.1509372329, 14.1510165389,14.1510958405,14.1511751378,14.1512544307,14.1513337193,14.1514130035,14.1514922833,14.1515715588,14.15165083,14.1517300968,14.1518093592,14.1518886173,14.151967871,14.1520471203,14.1521263653,14.152205606, 14.1522848423,14.1523640743,14.1524433019,14.1525225251,14.152601744,14.1526809586,14.1527601688,14.1528393746,14.1529185761,14.1529977733,14.1530769661,14.1531561546,14.1532353387,14.1533145185,14.1533936939,14.153472865, 14.1535520317,14.1536311941,14.1537103522,14.1537895059,14.1538686552,14.1539478002,14.1540269409,14.1541060773,14.1541852093,14.1542643369,14.1543434602,14.1544225792,14.1545016939,14.1545808042,14.1546599101,14.1547390118, 14.1548181091,14.154897202,14.1549762906,14.1550553749,14.1551344549,14.1552135305,14.1552926018,14.1553716687,14.1554507313,14.1555297896,14.1556088435,14.1556878932,14.1557669384,14.1558459794,14.155925016,14.1560040483, 14.1560830763,14.1561620999,14.1562411192,14.1563201342,14.1563991449,14.1564781512,14.1565571532,14.1566361509,14.1567151442,14.1567941332,14.1568731179,14.1569520983,14.1570310744,14.1571100461,14.1571890135,14.1572679766, 14.1573469354,14.1574258898,14.1575048399,14.1575837857,14.1576627272,14.1577416644,14.1578205972,14.1578995257,14.1579784499,14.1580573698,14.1581362854,14.1582151967,14.1582941036,14.1583730062,14.1584519045,14.1585307985, 14.1586096882,14.1586885736,14.1587674546,14.1588463314,14.1589252038,14.1590040719,14.1590829357,14.1591617952,14.1592406504,14.1593195013,14.1593983479,14.1594771901,14.1595560281,14.1596348617,14.159713691,14.1597925161, 14.1598713368,14.1599501532,14.1600289653,14.1601077731,14.1601865766,14.1602653758,14.1603441707,14.1604229613,14.1605017476,14.1605805295,14.1606593072,14.1607380806,14.1608168497,14.1608956145,14.1609743749,14.1610531311, 14.161131883,14.1612106306,14.1612893738,14.1613681128,14.1614468475,14.1615255779,14.161604304,14.1616830258,14.1617617433,14.1618404565,14.1619191654,14.16199787,14.1620765704,14.1621552664,14.1622339581,14.1623126456, 14.1623913288,14.1624700076,14.1625486822,14.1626273525,14.1627060185,14.1627846802,14.1628633376,14.1629419907,14.1630206396,14.1630992841,14.1631779244,14.1632565604,14.1633351921,14.1634138195,14.1634924426,14.1635710615, 14.163649676,14.1637282863,14.1638068923,14.163885494,14.1639640914,14.1640426846,14.1641212734,14.164199858,14.1642784383,14.1643570143,14.1644355861,14.1645141535,14.1645927167,14.1646712756,14.1647498302,14.1648283806, 14.1649069267,14.1649854685,14.165064006,14.1651425392,14.1652210682,14.1652995929,14.1653781133,14.1654566295,14.1655351414,14.165613649,14.1656921523,14.1657706514,14.1658491462,14.1659276367,14.166006123,14.1660846049, 14.1661630826,14.1662415561,14.1663200253,14.1663984902,14.1664769508,14.1665554072,14.1666338593,14.1667123071,14.1667907507,14.16686919,14.1669476251,14.1670260559,14.1671044824,14.1671829046,14.1672613226,14.1673397364, 14.1674181458,14.167496551,14.167574952,14.1676533487,14.1677317411,14.1678101293,14.1678885132,14.1679668928,14.1680452682,14.1681236394,14.1682020062,14.1682803689,14.1683587272,14.1684370813,14.1685154312,14.1685937768, 14.1686721181,14.1687504552,14.1688287881,14.1689071166,14.168985441,14.1690637611,14.1691420769,14.1692203885,14.1692986958,14.1693769989,14.1694552977,14.1695335923,14.1696118826,14.1696901687,14.1697684505,14.1698467281, 14.1699250014,14.1700032705,14.1700815354,14.170159796,14.1702380523,14.1703163044,14.1703945523,14.1704727959,14.1705510353,14.1706292705,14.1707075013,14.170785728,14.1708639504,14.1709421686,14.1710203825,14.1710985922, 14.1711767977,14.1712549989,14.1713331958,14.1714113886,14.1714895771,14.1715677613,14.1716459413,14.1717241171,14.1718022887,14.171880456,14.1719586191,14.1720367779,14.1721149325,14.1721930829,14.1722712291,14.172349371, 14.1724275086,14.1725056421,14.1725837713,14.1726618963,14.172740017,14.1728181336,14.1728962459,14.1729743539,14.1730524578,14.1731305574,14.1732086528,14.1732867439,14.1733648308,14.1734429136,14.173520992,14.1735990663, 14.1736771363,14.1737552021,14.1738332637,14.173911321,14.1739893742,14.1740674231,14.1741454678,14.1742235082,14.1743015445,14.1743795765,14.1744576043,14.1745356279,14.1746136472,14.1746916624,14.1747696733,14.17484768, 14.1749256825,14.1750036808,14.1750816748,14.1751596647,14.1752376503,14.1753156317,14.1753936089,14.1754715819,14.1755495506,14.1756275152,14.1757054755,14.1757834317,14.1758613836,14.1759393313,14.1760172748,14.176095214, 14.1761731491,14.17625108,14.1763290066,14.1764069291,14.1764848473,14.1765627613,14.1766406711,14.1767185767,14.1767964781,14.1768743753,14.1769522683,14.1770301571,14.1771080417,14.1771859221,14.1772637983,14.1773416702, 14.177419538,14.1774974016,14.1775752609,14.1776531161,14.177730967,14.1778088138,14.1778866563,14.1779644947,14.1780423289,14.1781201588,14.1781979846,14.1782758061,14.1783536235,14.1784314367,14.1785092457,14.1785870504, 14.178664851,14.1787426474,14.1788204396,14.1788982276,14.1789760114,14.179053791,14.1791315664,14.1792093376,14.1792871046,14.1793648675,14.1794426261,14.1795203806,14.1795981308,14.1796758769,14.1797536188,14.1798313565, 14.17990909,14.1799868193,14.1800645445,14.1801422654,14.1802199822,14.1802976947,14.1803754031,14.1804531073,14.1805308073,14.1806085032,14.1806861948,14.1807638823,14.1808415656,14.1809192447,14.1809969196,14.1810745903, 14.1811522569,14.1812299192,14.1813075774,14.1813852314,14.1814628813,14.1815405269,14.1816181684,14.1816958057,14.1817734388,14.1818510677,14.1819286925,14.1820063131,14.1820839295,14.1821615417,14.1822391498,14.1823167537, 14.1823943534,14.1824719489,14.1825495403,14.1826271275,14.1827047105,14.1827822894,14.182859864,14.1829374345,14.1830150009,14.183092563,14.183170121,14.1832476749,14.1833252245,14.18340277,14.1834803113,14.1835578485, 14.1836353815,14.1837129103,14.1837904349,14.1838679554,14.1839454718,14.1840229839,14.1841004919,14.1841779957,14.1842554954,14.1843329909,14.1844104822,14.1844879694,14.1845654524,14.1846429313,14.184720406,14.1847978765, 14.1848753429,14.1849528051,14.1850302632,14.1851077171,14.1851851668,14.1852626124,14.1853400538,14.1854174911,14.1854949242,14.1855723532,14.185649778,14.1857271986,14.1858046151,14.1858820274,14.1859594356,14.1860368397, 14.1861142395,14.1861916353,14.1862690268,14.1863464143,14.1864237975,14.1865011767,14.1865785516,14.1866559225,14.1867332891,14.1868106517,14.18688801,14.1869653643,14.1870427143,14.1871200603,14.1871974021,14.1872747397, 14.1873520732,14.1874294026,14.1875067278,14.1875840488,14.1876613657,14.1877386785,14.1878159871,14.1878932916,14.187970592,14.1880478882,14.1881251803,14.1882024682,14.188279752,14.1883570316,14.1884343071,14.1885115785, 14.1885888457,14.1886661088,14.1887433677,14.1888206226,14.1888978732,14.1889751198,14.1890523622,14.1891296005,14.1892068346,14.1892840646,14.1893612905,14.1894385122,14.1895157298,14.1895929433,14.1896701526,14.1897473578, 14.1898245589,14.1899017558,14.1899789486,14.1900561373,14.1901333219,14.1902105023,14.1902876786,14.1903648507,14.1904420188,14.1905191827,14.1905963425,14.1906734981,14.1907506497,14.1908277971,14.1909049403,14.1909820795, 14.1910592145,14.1911363454,14.1912134722,14.1912905949,14.1913677134,14.1914448278,14.1915219381,14.1915990443,14.1916761464,14.1917532443,14.1918303381,14.1919074278,14.1919845134,14.1920615948,14.1921386722,14.1922157454, 14.1922928145,14.1923698795,14.1924469403,14.1925239971,14.1926010497,14.1926780982,14.1927551426,14.1928321829,14.1929092191,14.1929862512,14.1930632791,14.193140303,14.1932173227,14.1932943383,14.1933713498,14.1934483572, 14.1935253605,14.1936023597,14.1936793547,14.1937563457,14.1938333325,14.1939103153,14.1939872939,14.1940642684,14.1941412389,14.1942182052,14.1942951674,14.1943721255,14.1944490795,14.1945260294,14.1946029752,14.1946799168, 14.1947568544,14.1948337879,14.1949107173,14.1949876425,14.1950645637,14.1951414808,14.1952183938,14.1952953026,14.1953722074,14.1954491081,14.1955260046,14.1956028971,14.1956797855,14.1957566698,14.19583355,14.195910426, 14.195987298,14.1960641659,14.1961410297,14.1962178894,14.196294745,14.1963715965,14.196448444,14.1965252873,14.1966021265,14.1966789617,14.1967557927,14.1968326197,14.1969094425,14.1969862613,14.197063076,14.1971398866, 14.1972166931,14.1972934955,14.1973702939,14.1974470881,14.1975238783,14.1976006643,14.1976774463,14.1977542242,14.197830998,14.1979077677,14.1979845334,14.1980612949,14.1981380524,14.1982148058,14.1982915551,14.1983683003, 14.1984450415,14.1985217785,14.1985985115,14.1986752404,14.1987519652,14.1988286859,14.1989054026,14.1989821152,14.1990588237,14.1991355281,14.1992122284,14.1992889247,14.1993656169,14.199442305,14.199518989,14.199595669, 14.1996723448,14.1997490166,14.1998256844,14.199902348,14.1999790076,14.2000556631,14.2001323146,14.2002089619,14.2002856052,14.2003622444,14.2004388796,14.2005155107,14.2005921377,14.2006687606,14.2007453795,14.2008219943, 14.200898605,14.2009752117,14.2010518143,14.2011284128,14.2012050073,14.2012815977,14.201358184,14.2014347663,14.2015113445,14.2015879186,14.2016644887,14.2017410547,14.2018176167,14.2018941746,14.2019707284,14.2020472781, 14.2021238238,14.2022003655,14.202276903,14.2023534366,14.202429966,14.2025064914,14.2025830127,14.20265953,14.2027360433,14.2028125524,14.2028890575,14.2029655586,14.2030420556,14.2031185485,14.2031950374,14.2032715222, 14.203348003,14.2034244797,14.2035009524,14.203577421,14.2036538855,14.203730346,14.2038068025,14.2038832549,14.2039597032,14.2040361475,14.2041125878,14.204189024,14.2042654561,14.2043418842,14.2044183083,14.2044947283, 14.2045711442,14.2046475562,14.204723964,14.2048003678,14.2048767676,14.2049531633,14.205029555,14.2051059426,14.2051823262,14.2052587058,14.2053350813,14.2054114527,14.2054878202,14.2055641835,14.2056405429,14.2057168981, 14.2057932494,14.2058695966,14.2059459398,14.2060222789,14.206098614,14.206174945,14.2062512721,14.206327595,14.206403914,14.2064802289,14.2065565397,14.2066328466,14.2067091494,14.2067854481,14.2068617428,14.2069380335, 14.2070143202,14.2070906028,14.2071668814,14.2072431559,14.2073194265,14.2073956929,14.2074719554,14.2075482138,14.2076244682,14.2077007186,14.2077769649,14.2078532072,14.2079294455,14.2080056798,14.20808191,14.2081581362, 14.2082343583,14.2083105765,14.2083867906,14.2084630007,14.2085392067,14.2086154088,14.2086916068,14.2087678008,14.2088439907,14.2089201767,14.2089963586,14.2090725365,14.2091487104,14.2092248802,14.209301046,14.2093772078, 14.2094533656,14.2095295194,14.2096056691,14.2096818149,14.2097579566,14.2098340943,14.2099102279,14.2099863576,14.2100624832,14.2101386049,14.2102147225,14.2102908361,14.2103669456,14.2104430512,14.2105191527,14.2105952503, 14.2106713438,14.2107474333,14.2108235188,14.2108996003,14.2109756777,14.2110517512,14.2111278206,14.2112038861,14.2112799475,14.2113560049,14.2114320583,14.2115081077,14.2115841531,14.2116601945,14.2117362318,14.2118122652, 14.2118882945,14.2119643199,14.2120403412,14.2121163586,14.2121923719,14.2122683812,14.2123443866,14.2124203879,14.2124963852,14.2125723785,14.2126483678,14.2127243531,14.2128003344,14.2128763117,14.212952285,14.2130282543, 14.2131042196,14.2131801809,14.2132561382,14.2133320916,14.2134080409,14.2134839862,14.2135599275,14.2136358648,14.2137117981,14.2137877274,14.2138636527,14.2139395741,14.2140154914,14.2140914047,14.2141673141,14.2142432194, 14.2143191208,14.2143950182,14.2144709115,14.2145468009,14.2146226863,14.2146985677,14.2147744451,14.2148503185,14.2149261879,14.2150020534,14.2150779148,14.2151537723,14.2152296257,14.2153054752,14.2153813207,14.2154571622, 14.2155329997,14.2156088333,14.2156846628,14.2157604884,14.21583631,14.2159121276,14.2159879412,14.2160637508,14.2161395564,14.2162153581,14.2162911558,14.2163669494,14.2164427392,14.2165185249,14.2165943066,14.2166700844, 14.2167458582,14.216821628,14.2168973938,14.2169731557,14.2170489136,14.2171246675,14.2172004174,14.2172761633,14.2173519053,14.2174276433,14.2175033773,14.2175791073,14.2176548334,14.2177305554,14.2178062736,14.2178819877, 14.2179576979,14.2180334041,14.2181091063,14.2181848045,14.2182604988,14.2183361891,14.2184118754,14.2184875578,14.2185632362,14.2186389106,14.2187145811,14.2187902476,14.2188659101,14.2189415686,14.2190172232,14.2190928738, 14.2191685205,14.2192441631,14.2193198019,14.2193954366,14.2194710674,14.2195466942,14.2196223171,14.219697936,14.2197735509,14.2198491619,14.2199247689,14.2200003719,14.220075971,14.2201515661,14.2202271573,14.2203027445, 14.2203783277,14.220453907,14.2205294823,14.2206050537,14.2206806211,14.2207561845,14.220831744,14.2209072995,14.2209828511,14.2210583987,14.2211339424,14.2212094821,14.2212850178,14.2213605496,14.2214360774,14.2215116013, 14.2215871213,14.2216626372,14.2217381493,14.2218136573,14.2218891615,14.2219646616,14.2220401579,14.2221156501,14.2221911385,14.2222666228,14.2223421032,14.2224175797,14.2224930522,14.2225685208,14.2226439855,14.2227194461, 14.2227949029,14.2228703557,14.2229458045,14.2230212494,14.2230966903,14.2231721274,14.2232475604,14.2233229895,14.2233984147,14.2234738359,14.2235492532,14.2236246666,14.223700076,14.2237754815,14.223850883,14.2239262806, 14.2240016742,14.2240770639,14.2241524497,14.2242278315,14.2243032094,14.2243785833,14.2244539533,14.2245293194,14.2246046815,14.2246800397,14.224755394,14.2248307443,14.2249060907,14.2249814332,14.2250567717,14.2251321063, 14.2252074369,14.2252827637,14.2253580865,14.2254334053,14.2255087202,14.2255840312,14.2256593383,14.2257346414,14.2258099406,14.2258852359,14.2259605272,14.2260358146,14.2261110981,14.2261863777,14.2262616533,14.226336925, 14.2264121928,14.2264874566,14.2265627166,14.2266379725,14.2267132246,14.2267884728,14.226863717,14.2269389573,14.2270141936,14.2270894261,14.2271646546,14.2272398792,14.2273150999,14.2273903167,14.2274655295,14.2275407384, 14.2276159434,14.2276911445,14.2277663416,14.2278415349,14.2279167242,14.2279919096,14.2280670911,14.2281422686,14.2282174423,14.228292612,14.2283677778,14.2284429397,14.2285180977,14.2285932518,14.2286684019,14.2287435482, 14.2288186905,14.2288938289,14.2289689634,14.229044094,14.2291192207,14.2291943434,14.2292694623,14.2293445772,14.2294196882,14.2294947953,14.2295698986,14.2296449978,14.2297200932,14.2297951847,14.2298702723,14.229945356, 14.2300204357,14.2300955116,14.2301705835,14.2302456515,14.2303207157,14.2303957759,14.2304708322,14.2305458846,14.2306209331,14.2306959777,14.2307710184,14.2308460552,14.2309210881,14.2309961171,14.2310711422,14.2311461634, 14.2312211807,14.2312961941,14.2313712036,14.2314462092,14.2315212109,14.2315962087,14.2316712026,14.2317461926,14.2318211787,14.2318961609,14.2319711392,14.2320461136,14.2321210841,14.2321960507,14.2322710134,14.2323459722, 14.2324209272,14.2324958782,14.2325708254,14.2326457686,14.232720708,14.2327956434,14.232870575,14.2329455027,14.2330204265,14.2330953464,14.2331702624,14.2332451745,14.2333200827,14.2333949871,14.2334698875,14.2335447841, 14.2336196768,14.2336945655,14.2337694504,14.2338443315,14.2339192086,14.2339940818,14.2340689512,14.2341438167,14.2342186782,14.2342935359,14.2343683898,14.2344432397,14.2345180857,14.2345929279,14.2346677662,14.2347426006, 14.2348174311,14.2348922578,14.2349670805,14.2350418994,14.2351167144,14.2351915255,14.2352663328,14.2353411361,14.2354159356,14.2354907312,14.2355655229,14.2356403108,14.2357150948,14.2357898749,14.2358646511,14.2359394234, 14.2360141919,14.2360889565,14.2361637172,14.2362384741,14.236313227,14.2363879761,14.2364627214,14.2365374627,14.2366122002,14.2366869338,14.2367616636,14.2368363894,14.2369111114,14.2369858296,14.2370605438,14.2371352542, 14.2372099608,14.2372846634,14.2373593622,14.2374340571,14.2375087482,14.2375834354,14.2376581187,14.2377327981,14.2378074737,14.2378821454,14.2379568133,14.2380314773,14.2381061374,14.2381807937,14.2382554461,14.2383300946, 14.2384047393,14.2384793801,14.2385540171,14.2386286502,14.2387032794,14.2387779048,14.2388525263,14.238927144,14.2390017578,14.2390763677,14.2391509738,14.239225576,14.2393001744,14.2393747689,14.2394493595,14.2395239463, 14.2395985292,14.2396731083,14.2397476836,14.2398222549,14.2398968224,14.2399713861,14.2400459459,14.2401205019,14.240195054,14.2402696022,14.2403441466,14.2404186872,14.2404932239,14.2405677567,14.2406422857,14.2407168109, 14.2407913322,14.2408658496,14.2409403632,14.241014873,14.2410893789,14.2411638809,14.2412383791,14.2413128735,14.241387364,14.2414618507,14.2415363335,14.2416108125,14.2416852876,14.2417597589,14.2418342263,14.2419086899, 14.2419831497,14.2420576056,14.2421320577,14.2422065059,14.2422809503,14.2423553909,14.2424298276,14.2425042604,14.2425786895,14.2426531146,14.242727536,14.2428019535,14.2428763672,14.242950777,14.243025183,14.2430995852, 14.2431739835,14.243248378,14.2433227686,14.2433971554,14.2434715384,14.2435459175,14.2436202928,14.2436946643,14.243769032,14.2438433958,14.2439177557,14.2439921119,14.2440664642,14.2441408127,14.2442151573,14.2442894981, 14.2443638351,14.2444381683,14.2445124976,14.2445868231,14.2446611448,14.2447354626,14.2448097766,14.2448840868,14.2449583932,14.2450326957,14.2451069944,14.2451812893,14.2452555803,14.2453298675,14.2454041509,14.2454784305, 14.2455527063,14.2456269782,14.2457012463,14.2457755106,14.245849771,14.2459240277,14.2459982805,14.2460725295,14.2461467746,14.246221016,14.2462952535,14.2463694872,14.2464437171,14.2465179432,14.2465921654,14.2466663839, 14.2467405985,14.2468148093,14.2468890163,14.2469632194,14.2470374188,14.2471116143,14.247185806,14.2472599939,14.247334178,14.2474083583,14.2474825348,14.2475567074,14.2476308762,14.2477050413,14.2477792025,14.2478533599, 14.2479275134,14.2480016632,14.2480758092,14.2481499513,14.2482240897,14.2482982242,14.2483723549,14.2484464818,14.2485206049,14.2485947242,14.2486688397,14.2487429514,14.2488170593,14.2488911633,14.2489652636,14.2490393601, 14.2491134527,14.2491875416,14.2492616266,14.2493357078,14.2494097853,14.2494838589,14.2495579287,14.2496319947,14.249706057,14.2497801154,14.24985417,14.2499282208,14.2500022678,14.2500763111,14.2501503505,14.2502243861, 14.2502984179,14.2503724459,14.2504464701,14.2505204906,14.2505945072,14.25066852,14.2507425291,14.2508165343,14.2508905357,14.2509645334,14.2510385272,14.2511125173,14.2511865035,14.251260486,14.2513344647,14.2514084395, 14.2514824106,14.2515563779,14.2516303414,14.2517043011,14.251778257,14.2518522092,14.2519261575,14.252000102,14.2520740428,14.2521479798,14.2522219129,14.2522958423,14.2523697679,14.2524436897,14.2525176078,14.252591522, 14.2526654325,14.2527393391,14.252813242,14.2528871411,14.2529610364,14.2530349279,14.2531088157,14.2531826996,14.2532565798,14.2533304562,14.2534043288,14.2534781976,14.2535520626,14.2536259239,14.2536997814,14.2537736351, 14.253847485,14.2539213311,14.2539951735,14.2540690121,14.2541428469,14.2542166779,14.2542905051,14.2543643286,14.2544381483,14.2545119642,14.2545857763,14.2546595847,14.2547333892,14.2548071901,14.2548809871,14.2549547803, 14.2550285698,14.2551023555,14.2551761375,14.2552499156,14.25532369,14.2553974606,14.2554712275,14.2555449905,14.2556187498,14.2556925054,14.2557662571,14.2558400051,14.2559137493,14.2559874898,14.2560612265,14.2561349594, 14.2562086885,14.2562824139,14.2563561355,14.2564298534,14.2565035674,14.2565772777,14.2566509843,14.2567246871,14.2567983861,14.2568720813,14.2569457728,14.2570194605,14.2570931445,14.2571668247,14.2572405011,14.2573141738, 14.2573878427,14.2574615078,14.2575351692,14.2576088268,14.2576824807,14.2577561308,14.2578297772,14.2579034197,14.2579770586,14.2580506936,14.2581243249,14.2581979525,14.2582715763,14.2583451963,14.2584188126,14.2584924251, 14.2585660339,14.2586396389,14.2587132402,14.2587868377,14.2588604314,14.2589340214,14.2590076076,14.2590811901,14.2591547689,14.2592283438,14.2593019151,14.2593754826,14.2594490463,14.2595226063,14.2595961625,14.259669715, 14.2597432637,14.2598168087,14.2598903499,14.2599638874,14.2600374211,14.2601109511,14.2601844773,14.2602579998,14.2603315186,14.2604050336,14.2604785448,14.2605520523,14.2606255561,14.2606990561,14.2607725524,14.2608460449, 14.2609195337,14.2609930187,14.2610665,14.2611399776,14.2612134514,14.2612869214,14.2613603878,14.2614338504,14.2615073092,14.2615807643,14.2616542157,14.2617276633,14.2618011072,14.2618745473,14.2619479838,14.2620214164, 14.2620948454,14.2621682706,14.262241692,14.2623151098,14.2623885238,14.262461934,14.2625353405,14.2626087433,14.2626821424,14.2627555377,14.2628289293,14.2629023171,14.2629757012,14.2630490816,14.2631224583,14.2631958312, 14.2632692004,14.2633425658,14.2634159276,14.2634892856,14.2635626398,14.2636359904,14.2637093372,14.2637826802,14.2638560196,14.2639293552,14.2640026871,14.2640760153,14.2641493397,14.2642226604,14.2642959774,14.2643692907, 14.2644426002,14.264515906,14.2645892081,14.2646625065,14.2647358011,14.264809092,14.2648823792,14.2649556627,14.2650289425,14.2651022185,14.2651754908,14.2652487594,14.2653220242,14.2653952854,14.2654685428,14.2655417965, 14.2656150465,14.2656882927,14.2657615353,14.2658347741,14.2659080092,14.2659812406,14.2660544683,14.2661276923,14.2662009125,14.266274129,14.2663473418,14.2664205509,14.2664937563,14.266566958,14.2666401559,14.2667133502, 14.2667865407,14.2668597275,14.2669329106,14.26700609,14.2670792657,14.2671524376,14.2672256059,14.2672987704,14.2673719313,14.2674450884,14.2675182418,14.2675913915,14.2676645375,14.2677376798,14.2678108184,14.2678839532, 14.2679570844,14.2680302119,14.2681033356,14.2681764557,14.268249572,14.2683226846,14.2683957936,14.2684688988,14.2685420003,14.2686150981,14.2686881922,14.2687612826,14.2688343693,14.2689074523,14.2689805316,14.2690536073, 14.2691266791,14.2691997473,14.2692728118,14.2693458726,14.2694189297,14.2694919831,14.2695650328,14.2696380788,14.2697111211,14.2697841597,14.2698571947,14.2699302259,14.2700032534,14.2700762772,14.2701492973,14.2702223137, 14.2702953265,14.2703683355,14.2704413408,14.2705143425,14.2705873404,14.2706603347,14.2707333253,14.2708063121,14.2708792953,14.2709522748,14.2710252506,14.2710982227,14.2711711911,14.2712441559,14.2713171169,14.2713900742, 14.2714630279,14.2715359779,14.2716089242,14.2716818667,14.2717548056,14.2718277409,14.2719006724,14.2719736002,14.2720465244,14.2721194449,14.2721923616,14.2722652747,14.2723381842,14.2724110899,14.2724839919,14.2725568903, 14.272629785,14.272702676,14.2727755633,14.2728484469,14.2729213269,14.2729942031,14.2730670757,14.2731399446,14.2732128099,14.2732856714,14.2733585293,14.2734313835,14.273504234,14.2735770808,14.2736499239,14.2737227634, 14.2737955992,14.2738684313,14.2739412598,14.2740140845,14.2740869056,14.274159723,14.2742325368,14.2743053469,14.2743781532,14.274450956,14.274523755,14.2745965504,14.2746693421,14.2747421301,14.2748149145,14.2748876951, 14.2749604721,14.2750332455,14.2751060151,14.2751787811,14.2752515435,14.2753243021,14.2753970571,14.2754698084,14.2755425561,14.2756153001,14.2756880404,14.275760777,14.27583351,14.2759062393,14.275978965,14.276051687, 14.2761244053,14.2761971199,14.2762698309,14.2763425382,14.2764152419,14.2764879419,14.2765606382,14.2766333309,14.2767060199,14.2767787052,14.2768513869,14.2769240649,14.2769967393,14.27706941,14.277142077,14.2772147404, 14.2772874001,14.2773600562,14.2774327086,14.2775053573,14.2775780024,14.2776506438,14.2777232816,14.2777959157,14.2778685462,14.277941173,14.2780137961,14.2780864156,14.2781590314,14.2782316436,14.2783042521,14.278376857, 14.2784494582,14.2785220558,14.2785946497,14.2786672399,14.2787398266,14.2788124095,14.2788849888,14.2789575645,14.2790301364,14.2791027048,14.2791752695,14.2792478305,14.2793203879,14.2793929417,14.2794654918,14.2795380382, 14.2796105811,14.2796831202,14.2797556557,14.2798281876,14.2799007158,14.2799732404,14.2800457613,14.2801182786,14.2801907922,14.2802633022,14.2803358086,14.2804083113,14.2804808103,14.2805533057,14.2806257975,14.2806982856, 14.2807707701,14.280843251,14.2809157282,14.2809882018,14.2810606717,14.281133138,14.2812056006,14.2812780596,14.281350515,14.2814229667,14.2814954148,14.2815678593,14.2816403001,14.2817127372,14.2817851708,14.2818576007, 14.281930027,14.2820024496,14.2820748686,14.2821472839,14.2822196957,14.2822921038,14.2823645082,14.282436909,14.2825093062,14.2825816998,14.2826540897,14.282726476,14.2827988587,14.2828712377,14.2829436131,14.2830159849, 14.283088353,14.2831607175,14.2832330784,14.2833054357,14.2833777893,14.2834501393,14.2835224856,14.2835948284,14.2836671675,14.283739503,14.2838118348,14.2838841631,14.2839564877,14.2840288086,14.284101126,14.2841734397, 14.2842457498,14.2843180563,14.2843903592,14.2844626584,14.284534954,14.284607246,14.2846795344,14.2847518191,14.2848241002,14.2848963777,14.2849686516,14.2850409219,14.2851131885,14.2851854515,14.2852577109,14.2853299667, 14.2854022189,14.2854744674,14.2855467123,14.2856189536,14.2856911913,14.2857634254,14.2858356559,14.2859078827,14.2859801059,14.2860523255,14.2861245415,14.2861967539,14.2862689627,14.2863411678,14.2864133694,14.2864855673, 14.2865577616,14.2866299523,14.2867021394,14.2867743229,14.2868465027,14.286918679,14.2869908516,14.2870630207,14.2871351861,14.2872073479,14.2872795061,14.2873516607,14.2874238117,14.2874959591,14.2875681028,14.287640243, 14.2877123795,14.2877845125,14.2878566418,14.2879287676,14.2880008897,14.2880730082,14.2881451232,14.2882172345,14.2882893422,14.2883614463,14.2884335468,14.2885056437,14.288577737,14.2886498267,14.2887219128,14.2887939953, 14.2888660742,14.2889381495,14.2890102211,14.2890822892,14.2891543537,14.2892264146,14.2892984719,14.2893705256,14.2894425757,14.2895146222,14.2895866651,14.2896587044,14.2897307401,14.2898027722,14.2898748007,14.2899468256, 14.2900188469,14.2900908647,14.2901628788,14.2902348893,14.2903068963,14.2903788996,14.2904508994,14.2905228955,14.2905948881,14.2906668771,14.2907388624,14.2908108442,14.2908828224,14.290954797,14.2910267681,14.2910987355, 14.2911706993,14.2912426596,14.2913146162,14.2913865693,14.2914585188,14.2915304647,14.291602407,14.2916743457,14.2917462808,14.2918182124,14.2918901403,14.2919620647,14.2920339855,14.2921059027,14.2921778163,14.2922497264, 14.2923216328,14.2923935357,14.2924654349,14.2925373306,14.2926092228,14.2926811113,14.2927529962,14.2928248776,14.2928967554,14.2929686296,14.2930405002,14.2931123673,14.2931842308,14.2932560906,14.293327947,14.2933997997, 14.2934716488,14.2935434944,14.2936153364,14.2936871748,14.2937590097,14.2938308409,14.2939026686,14.2939744927,14.2940463133,14.2941181302,14.2941899436,14.2942617534,14.2943335597,14.2944053623,14.2944771614,14.2945489569, 14.2946207489,14.2946925373,14.2947643221,14.2948361033,14.294907881,14.294979655,14.2950514256,14.2951231925,14.2951949559,14.2952667157,14.2953384719,14.2954102246,14.2954819737,14.2955537192,14.2956254612,14.2956971996, 14.2957689344,14.2958406657,14.2959123934,14.2959841175,14.2960558381,14.2961275551,14.2961992685,14.2962709784,14.2963426847,14.2964143874,14.2964860866,14.2965577822,14.2966294743,14.2967011628,14.2967728477,14.2968445291, 14.2969162069,14.2969878811,14.2970595518,14.2971312189,14.2972028825,14.2972745425,14.2973461989,14.2974178518,14.2974895012,14.2975611469,14.2976327891,14.2977044278,14.2977760629,14.2978476944,14.2979193224,14.2979909468, 14.2980625677,14.298134185,14.2982057988,14.298277409,14.2983490157,14.2984206188,14.2984922183,14.2985638143,14.2986354067,14.2987069956,14.298778581,14.2988501627,14.298921741,14.2989933156,14.2990648868,14.2991364544, 14.2992080184,14.2992795789,14.2993511358,14.2994226892,14.299494239,14.2995657853,14.299637328,14.2997088672,14.2997804029,14.299851935,14.2999234635,14.2999949885,14.30006651,14.3001380279,14.3002095422,14.3002810531, 14.3003525603,14.3004240641,14.3004955642,14.3005670609,14.300638554,14.3007100436,14.3007815296,14.300853012,14.300924491,14.3009959664,14.3010674382,14.3011389065,14.3012103713,14.3012818325,14.3013532902,14.3014247444, 14.301496195,14.3015676421,14.3016390856,14.3017105256,14.3017819621,14.301853395,14.3019248244,14.3019962502,14.3020676725,14.3021390913,14.3022105065,14.3022819183,14.3023533264,14.3024247311,14.3024961322,14.3025675297, 14.3026389238,14.3027103143,14.3027817013,14.3028530847,14.3029244646,14.302995841,14.3030672138,14.3031385832,14.3032099489,14.3032813112,14.3033526699,14.3034240251,14.3034953768,14.3035667249,14.3036380695,14.3037094106, 14.3037807482,14.3038520822,14.3039234127,14.3039947397,14.3040660631,14.304137383,14.3042086994,14.3042800123,14.3043513217,14.3044226275,14.3044939298,14.3045652286,14.3046365238,14.3047078155,14.3047791037,14.3048503884, 14.3049216696,14.3049929472,14.3050642213,14.3051354919,14.305206759,14.3052780226,14.3053492826,14.3054205391,14.3054917921,14.3055630416,14.3056342875,14.30570553,14.3057767689,14.3058480043,14.3059192362,14.3059904646, 14.3060616894,14.3061329108,14.3062041286,14.3062753429,14.3063465537,14.306417761,14.3064889647,14.306560165,14.3066313617,14.3067025549,14.3067737446,14.3068449308,14.3069161135,14.3069872927,14.3070584684,14.3071296405, 14.3072008091,14.3072719743,14.3073431359,14.307414294,14.3074854486,14.3075565997,14.3076277473,14.3076988913,14.3077700319,14.3078411689,14.3079123025,14.3079834325,14.3080545591,14.3081256821,14.3081968016,14.3082679176, 14.3083390301,14.3084101391,14.3084812446,14.3085523466,14.3086234451,14.3086945401,14.3087656316,14.3088367196,14.3089078041,14.308978885,14.3090499625,14.3091210365,14.309192107,14.3092631739,14.3093342374,14.3094052974, 14.3094763538,14.3095474068,14.3096184563,14.3096895023,14.3097605447,14.3098315837,14.3099026192,14.3099736512,14.3100446796,14.3101157046,14.3101867261,14.3102577441,14.3103287586,14.3103997696,14.3104707771,14.3105417811, 14.3106127817,14.3106837787,14.3107547722,14.3108257623,14.3108967488,14.3109677318,14.3110387114,14.3111096875,14.3111806601,14.3112516291,14.3113225947,14.3113935568,14.3114645154,14.3115354706,14.3116064222,14.3116773703, 14.311748315,14.3118192562,14.3118901939,14.311961128,14.3120320587,14.312102986,14.3121739097,14.3122448299,14.3123157467,14.31238666,14.3124575697,14.312528476,14.3125993789,14.3126702782,14.312741174,14.3128120664, 14.3128829553,14.3129538407,14.3130247226,14.313095601,14.313166476,14.3132373474,14.3133082154,14.3133790799,14.313449941,14.3135207985,14.3135916526,14.3136625032,14.3137333503,14.3138041939,14.313875034,14.3139458707, 14.3140167039,14.3140875336,14.3141583599,14.3142291826,14.3143000019,14.3143708177,14.31444163,14.3145124389,14.3145832443,14.3146540462,14.3147248446,14.3147956396,14.3148664311,14.3149372191,14.3150080036,14.3150787847, 14.3151495623,14.3152203364,14.315291107,14.3153618742,14.3154326379,14.3155033981,14.3155741549,14.3156449082,14.315715658,14.3157864044,14.3158571473,14.3159278867,14.3159986226,14.3160693551,14.3161400841,14.3162108097, 14.3162815317,14.3163522504,14.3164229655,14.3164936772,14.3165643854,14.3166350901,14.3167057914,14.3167764892,14.3168471836,14.3169178745,14.3169885619,14.3170592459,14.3171299264,14.3172006034,14.317271277,14.3173419471, 14.3174126138,14.317483277,14.3175539367,14.317624593,14.3176952458,14.3177658951,14.317836541,14.3179071834,14.3179778224,14.3180484579,14.31811909,14.3181897186,14.3182603437,14.3183309654,14.3184015836,14.3184721984, 14.3185428097,14.3186134176,14.318684022,14.3187546229,14.3188252204,14.3188958144,14.318966405,14.3190369921,14.3191075758,14.319178156,14.3192487328,14.3193193061,14.319389876,14.3194604424,14.3195310054,14.3196015649, 14.3196721209,14.3197426736,14.3198132227,14.3198837684,14.3199543107,14.3200248495,14.3200953849,14.3201659168,14.3202364452,14.3203069703,14.3203774918,14.32044801,14.3205185246,14.3205890359,14.3206595436,14.320730048, 14.3208005489,14.3208710463,14.3209415403,14.3210120309,14.321082518,14.3211530017,14.3212234819,14.3212939587,14.321364432,14.3214349019,14.3215053684,14.3215758314,14.321646291,14.3217167471,14.3217871998,14.3218576491, 14.3219280949,14.3219985373,14.3220689762,14.3221394117,14.3222098437,14.3222802724,14.3223506975,14.3224211193,14.3224915376,14.3225619525,14.3226323639,14.3227027719,14.3227731765,14.3228435776,14.3229139753,14.3229843695, 14.3230547603,14.3231251477,14.3231955317,14.3232659122,14.3233362893,14.3234066629,14.3234770332,14.3235473999,14.3236177633,14.3236881232,14.3237584797,14.3238288328,14.3238991824,14.3239695286,14.3240398714,14.3241102107, 14.3241805466,14.3242508791,14.3243212082,14.3243915338,14.324461856,14.3245321747,14.3246024901,14.324672802,14.3247431105,14.3248134156,14.3248837172,14.3249540154,14.3250243102,14.3250946016,14.3251648895,14.325235174, 14.3253054551,14.3253757328,14.325446007,14.3255162778,14.3255865452,14.3256568092,14.3257270697,14.3257973269,14.3258675806,14.3259378309,14.3260080777,14.3260783212,14.3261485612,14.3262187978,14.326289031,14.3263592608, 14.3264294871,14.3264997101,14.3265699296,14.3266401457,14.3267103583,14.3267805676,14.3268507735,14.3269209759,14.3269911749,14.3270613705,14.3271315627,14.3272017515,14.3272719368,14.3273421187,14.3274122973,14.3274824724, 14.3275526441,14.3276228124,14.3276929772,14.3277631387,14.3278332968,14.3279034514,14.3279736026,14.3280437504,14.3281138948,14.3281840358,14.3282541734,14.3283243076,14.3283944384,14.3284645657,14.3285346897,14.3286048102, 14.3286749273,14.3287450411,14.3288151514,14.3288852583,14.3289553618,14.3290254619,14.3290955586,14.3291656519,14.3292357417,14.3293058282,14.3293759113,14.3294459909,14.3295160672,14.3295861401,14.3296562095,14.3297262756, 14.3297963382,14.3298663975,14.3299364533,14.3300065058,14.3300765548,14.3301466004,14.3302166427,14.3302866815,14.330356717,14.330426749,14.3304967776,14.3305668029,14.3306368247,14.3307068432,14.3307768582,14.3308468699, 14.3309168781,14.330986883,14.3310568844,14.3311268825,14.3311968772,14.3312668684,14.3313368563,14.3314068408,14.3314768219,14.3315467995,14.3316167738,14.3316867447,14.3317567123,14.3318266764,14.3318966371,14.3319665944, 14.3320365484,14.3321064989,14.3321764461,14.3322463898,14.3323163302,14.3323862672,14.3324562008,14.332526131,14.3325960578,14.3326659812,14.3327359012,14.3328058179,14.3328757312,14.332945641,14.3330155475,14.3330854506, 14.3331553503,14.3332252466,14.3332951396,14.3333650291,14.3334349153,14.3335047981,14.3335746775,14.3336445535,14.3337144261,14.3337842953,14.3338541612,14.3339240237,14.3339938828,14.3340637385,14.3341335908,14.3342034397, 14.3342732853,14.3343431275,14.3344129663,14.3344828017,14.3345526338,14.3346224624,14.3346922877,14.3347621096,14.3348319281,14.3349017433,14.334971555,14.3350413634,14.3351111684,14.3351809701,14.3352507683,14.3353205632, 14.3353903547,14.3354601428,14.3355299276,14.3355997089,14.3356694869,14.3357392616,14.3358090328,14.3358788007,14.3359485652,14.3360183263,14.3360880841,14.3361578385,14.3362275895,14.3362973371,14.3363670814,14.3364368223, 14.3365065598,14.336576294,14.3366460247,14.3367157522,14.3367854762,14.3368551969,14.3369249142,14.3369946281,14.3370643387,14.3371340459,14.3372037497,14.3372734502,14.3373431473,14.337412841,14.3374825314,14.3375522184, 14.337621902,14.3376915823,14.3377612592,14.3378309327,14.3379006029,14.3379702697,14.3380399331,14.3381095932,14.3381792499,14.3382489033,14.3383185532,14.3383881999,14.3384578431,14.338527483,14.3385971196,14.3386667528, 14.3387363826,14.338806009,14.3388756321,14.3389452519,14.3390148683,14.3390844813,14.3391540909,14.3392236972,14.3392933002,14.3393628998,14.339432496,14.3395020889,14.3395716784,14.3396412645,14.3397108473,14.3397804268, 14.3398500029,14.3399195756,14.339989145,14.340058711,14.3401282737,14.340197833,14.340267389,14.3403369416,14.3404064909,14.3404760368,14.3405455793,14.3406151185,14.3406846544,14.3407541869,14.340823716,14.3408932418, 14.3409627643,14.3410322833,14.3411017991,14.3411713115,14.3412408205,14.3413103262,14.3413798286,14.3414493276,14.3415188232,14.3415883156,14.3416578045,14.3417272901,14.3417967724,14.3418662513,14.3419357269,14.3420051991, 14.342074668,14.3421441335,14.3422135957,14.3422830546,14.3423525101,14.3424219623,14.3424914111,14.3425608565,14.3426302987,14.3426997375,14.3427691729,14.342838605,14.3429080338,14.3429774592,14.3430468813,14.3431163, 14.3431857154,14.3432551275,14.3433245362,14.3433939416,14.3434633437,14.3435327424,14.3436021377,14.3436715298,14.3437409185,14.3438103038,14.3438796858,14.3439490645,14.3440184399,14.3440878119,14.3441571806,14.3442265459, 14.3442959079,14.3443652666,14.3444346219,14.3445039739,14.3445733226,14.3446426679,14.3447120099,14.3447813486,14.3448506839,14.3449200159,14.3449893446,14.34505867,14.345127992,14.3451973107,14.345266626,14.345335938, 14.3454052467,14.3454745521,14.3455438541,14.3456131528,14.3456824482,14.3457517402,14.345821029,14.3458903143,14.3459595964,14.3460288751,14.3460981505,14.3461674226,14.3462366914,14.3463059568,14.3463752189,14.3464444777, 14.3465137332,14.3465829853,14.3466522341,14.3467214796,14.3467907218,14.3468599606,14.3469291961,14.3469984283,14.3470676572,14.3471368827,14.3472061049,14.3472753238,14.3473445394,14.3474137517,14.3474829606,14.3475521663, 14.3476213686,14.3476905676,14.3477597632,14.3478289556,14.3478981446,14.3479673303,14.3480365127,14.3481056918,14.3481748675,14.34824404,14.3483132091,14.3483823749,14.3484515374,14.3485206966,14.3485898524,14.348659005, 14.3487281542,14.3487973002,14.3488664428,14.348935582,14.349004718,14.3490738507,14.34914298,14.3492121061,14.3492812288,14.3493503482,14.3494194643,14.3494885771,14.3495576866,14.3496267928,14.3496958957,14.3497649952, 14.3498340915,14.3499031844,14.349972274,14.3500413603,14.3501104433,14.3501795231,14.3502485994,14.3503176725,14.3503867423,14.3504558088,14.350524872,14.3505939318,14.3506629884,14.3507320416,14.3508010916,14.3508701382, 14.3509391815,14.3510082216,14.3510772583,14.3511462917,14.3512153219,14.3512843487,14.3513533722,14.3514223924,14.3514914093,14.3515604229,14.3516294332,14.3516984403,14.351767444,14.3518364444,14.3519054415,14.3519744353, 14.3520434258,14.352112413,14.3521813969,14.3522503775,14.3523193548,14.3523883289,14.3524572996,14.352526267,14.3525952311,14.352664192,14.3527331495,14.3528021037,14.3528710547,14.3529400023,14.3530089467,14.3530778877, 14.3531468255,14.35321576,14.3532846911,14.353353619,14.3534225436,14.3534914649,14.3535603829,14.3536292976,14.353698209,14.3537671172,14.353836022,14.3539049236,14.3539738218,14.3540427168,14.3541116085,14.3541804968, 14.3542493819,14.3543182638,14.3543871423,14.3544560175,14.3545248894,14.3545937581,14.3546626235,14.3547314856,14.3548003444,14.3548691999,14.3549380521,14.355006901,14.3550757467,14.355144589,14.3552134281,14.3552822639, 14.3553510964,14.3554199257,14.3554887516,14.3555575743,14.3556263936,14.3556952097,14.3557640225,14.3558328321,14.3559016383,14.3559704413,14.356039241,14.3561080374,14.3561768305,14.3562456204,14.3563144069,14.3563831902, 14.3564519702,14.356520747,14.3565895204,14.3566582906,14.3567270575,14.3567958211,14.3568645814,14.3569333385,14.3570020923,14.3570708428,14.35713959,14.357208334,14.3572770746,14.357345812,14.3574145462,14.357483277, 14.3575520046,14.3576207289,14.35768945,14.3577581677,14.3578268822,14.3578955934,14.3579643014,14.358033006,14.3581017074,14.3581704056,14.3582391004,14.358307792,14.3583764803,14.3584451654,14.3585138471,14.3585825257, 14.3586512009,14.3587198729,14.3587885416,14.358857207,14.3589258692,14.3589945281,14.3590631837,14.359131836,14.3592004851,14.359269131,14.3593377735,14.3594064128,14.3594750488,14.3595436816,14.3596123111,14.3596809374, 14.3597495603,14.35981818,14.3598867965,14.3599554097,14.3600240196,14.3600926262,14.3601612296,14.3602298297,14.3602984266,14.3603670202,14.3604356106,14.3605041977,14.3605727815,14.360641362,14.3607099393,14.3607785134, 14.3608470842,14.3609156517,14.360984216,14.361052777,14.3611213347,14.3611898892,14.3612584405,14.3613269884,14.3613955332,14.3614640746,14.3615326128,14.3616011478,14.3616696795,14.3617382079,14.3618067331,14.3618752551, 14.3619437737,14.3620122892,14.3620808013,14.3621493102,14.3622178159,14.3622863183,14.3623548175,14.3624233134,14.362491806,14.3625602954,14.3626287816,14.3626972645,14.3627657442,14.3628342206,14.3629026937,14.3629711636, 14.3630396303,14.3631080937,14.3631765538,14.3632450107,14.3633134644,14.3633819148,14.3634503619,14.3635188059,14.3635872465,14.3636556839,14.3637241181,14.363792549,14.3638609767,14.3639294012,14.3639978224,14.3640662403, 14.364134655,14.3642030665,14.3642714747,14.3643398797,14.3644082814,14.3644766799,14.3645450751,14.3646134671,14.3646818559,14.3647502414,14.3648186237,14.3648870027,14.3649553785,14.365023751,14.3650921203,14.3651604864, 14.3652288493,14.3652972088,14.3653655652,14.3654339183,14.3655022682,14.3655706148,14.3656389582,14.3657072984,14.3657756353,14.365843969,14.3659122995,14.3659806267,14.3660489507,14.3661172714,14.3661855889,14.3662539032, 14.3663222142,14.3663905221,14.3664588266,14.366527128,14.3665954261,14.3666637209,14.3667320126,14.366800301,14.3668685862,14.3669368681,14.3670051468,14.3670734223,14.3671416946,14.3672099636,14.3672782294,14.3673464919, 14.3674147512,14.3674830073,14.3675512602,14.3676195099,14.3676877563,14.3677559995,14.3678242394,14.3678924761,14.3679607096,14.3680289399,14.368097167,14.3681653908,14.3682336114,14.3683018288,14.3683700429,14.3684382538, 14.3685064615,14.368574666,14.3686428672,14.3687110652,14.36877926,14.3688474516,14.36891564,14.3689838251,14.369052007,14.3691201857,14.3691883611,14.3692565334,14.3693247024,14.3693928682,14.3694610308,14.3695291901, 14.3695973463,14.3696654992,14.3697336489,14.3698017954,14.3698699386,14.3699380787,14.3700062155,14.3700743491,14.3701424795,14.3702106067,14.3702787306,14.3703468514,14.3704149689,14.3704830832,14.3705511943,14.3706193021, 14.3706874068,14.3707555083,14.3708236065,14.3708917015,14.3709597933,14.3710278819,14.3710959673,14.3711640494,14.3712321284,14.3713002041,14.3713682766,14.3714363459,14.371504412,14.3715724749,14.3716405346,14.3717085911, 14.3717766443,14.3718446944,14.3719127412,14.3719807849,14.3720488253,14.3721168625,14.3721848965,14.3722529273,14.3723209549,14.3723889792,14.3724570004,14.3725250184,14.3725930331,14.3726610447,14.372729053,14.3727970582, 14.3728650601,14.3729330588,14.3730010544,14.3730690467,14.3731370358,14.3732050217,14.3732730044,14.3733409839,14.3734089602,14.3734769333,14.3735449032,14.3736128699,14.3736808334,14.3737487937,14.3738167508,14.3738847047, 14.3739526554,14.3740206029,14.3740885471,14.3741564882,14.3742244261,14.3742923608,14.3743602923,14.3744282206,14.3744961457,14.3745640676,14.3746319863,14.3746999018,14.3747678141,14.3748357232,14.3749036291,14.3749715318, 14.3750394313,14.3751073277,14.3751752208,14.3752431107,14.3753109975,14.375378881,14.3754467614,14.3755146385,14.3755825125,14.3756503833,14.3757182508,14.3757861152,14.3758539764,14.3759218344,14.3759896892,14.3760575408, 14.3761253893,14.3761932345,14.3762610766,14.3763289154,14.3763967511,14.3764645836,14.3765324128,14.3766002389,14.3766680619,14.3767358816,14.3768036981,14.3768715115,14.3769393216,14.3770071286,14.3770749324,14.377142733, 14.3772105304,14.3772783246,14.3773461157,14.3774139035,14.3774816882,14.3775494697,14.377617248,14.3776850231,14.377752795,14.3778205638,14.3778883293,14.3779560917,14.3780238509,14.3780916069,14.3781593598,14.3782271094, 14.3782948559,14.3783625992,14.3784303393,14.3784980762,14.37856581,14.3786335406,14.378701268,14.3787689922,14.3788367132,14.3789044311,14.3789721457,14.3790398572,14.3791075656,14.3791752707,14.3792429727,14.3793106715, 14.3793783671,14.3794460595,14.3795137488,14.3795814349,14.3796491178,14.3797167975,14.3797844741,14.3798521474,14.3799198176,14.3799874847,14.3800551485,14.3801228092,14.3801904667,14.3802581211,14.3803257723,14.3803934203, 14.3804610651,14.3805287067,14.3805963452,14.3806639805,14.3807316127,14.3807992417,14.3808668675,14.3809344901,14.3810021096,14.3810697258,14.381137339,14.3812049489,14.3812725557,14.3813401593,14.3814077598,14.3814753571, 14.3815429512,14.3816105421,14.3816781299,14.3817457145,14.381813296,14.3818808743,14.3819484494,14.3820160214,14.3820835901,14.3821511558,14.3822187182,14.3822862775,14.3823538337,14.3824213866,14.3824889364,14.3825564831, 14.3826240266,14.3826915669,14.3827591041,14.3828266381,14.3828941689,14.3829616966,14.3830292211,14.3830967424,14.3831642606,14.3832317757,14.3832992875,14.3833667963,14.3834343018,14.3835018042,14.3835693035,14.3836367995, 14.3837042925,14.3837717822,14.3838392689,14.3839067523,14.3839742326,14.3840417098,14.3841091837,14.3841766546,14.3842441222,14.3843115868,14.3843790481,14.3844465063,14.3845139614,14.3845814133,14.3846488621,14.3847163076, 14.3847837501,14.3848511894,14.3849186255,14.3849860585,14.3850534883,14.385120915,14.3851883386,14.3852557589,14.3853231762,14.3853905903,14.3854580012,14.385525409,14.3855928136,14.3856602151,14.3857276134,14.3857950086, 14.3858624006,14.3859297895,14.3859971753,14.3860645579,14.3861319373,14.3861993136,14.3862666868,14.3863340568,14.3864014236,14.3864687874,14.3865361479,14.3866035054,14.3866708596,14.3867382108,14.3868055588,14.3868729036, 14.3869402453,14.3870075839,14.3870749193,14.3871422516,14.3872095807,14.3872769067,14.3873442296,14.3874115493,14.3874788658,14.3875461793,14.3876134896,14.3876807967,14.3877481007,14.3878154016,14.3878826993,14.3879499939, 14.3880172853,14.3880845737,14.3881518588,14.3882191409,14.3882864198,14.3883536955,14.3884209681,14.3884882376,14.388555504,14.3886227672,14.3886900273,14.3887572842,14.388824538,14.3888917887,14.3889590362,14.3890262806, 14.3890935219,14.38916076,14.389227995,14.3892952269,14.3893624556,14.3894296812,14.3894969037,14.3895641231,14.3896313393,14.3896985523,14.3897657623,14.3898329691,14.3899001728,14.3899673733,14.3900345707,14.390101765, 14.3901689562,14.3902361442,14.3903033291,14.3903705109,14.3904376896,14.3905048651,14.3905720375,14.3906392067,14.3907063729,14.3907735359,14.3908406958,14.3909078525,14.3909750062,14.3910421567,14.391109304,14.3911764483, 14.3912435894,14.3913107274,14.3913778623,14.3914449941,14.3915121227,14.3915792482,14.3916463706,14.3917134899,14.391780606,14.391847719,14.3919148289,14.3919819357,14.3920490394,14.3921161399,14.3921832373,14.3922503316, 14.3923174228,14.3923845108,14.3924515958,14.3925186776,14.3925857563,14.3926528319,14.3927199043,14.3927869737,14.3928540399,14.392921103,14.392988163,14.3930552198,14.3931222736,14.3931893242,14.3932563717,14.3933234162, 14.3933904574,14.3934574956,14.3935245307,14.3935915626,14.3936585915,14.3937256172,14.3937926398,14.3938596593,14.3939266756,14.3939936889,14.3940606991,14.3941277061,14.39419471,14.3942617108,14.3943287085,14.3943957031, 14.3944626946,14.394529683,14.3945966682,14.3946636504,14.3947306294,14.3947976054,14.3948645782,14.3949315479,14.3949985145,14.395065478,14.3951324384,14.3951993957,14.3952663498,14.3953333009,14.3954002489,14.3954671937, 14.3955341355,14.3956010741,14.3956680096,14.3957349421,14.3958018714,14.3958687976,14.3959357207,14.3960026407,14.3960695576,14.3961364714,14.3962033821,14.3962702897,14.3963371942,14.3964040956,14.3964709939,14.3965378891, 14.3966047812,14.3966716702,14.396738556,14.3968054388,14.3968723185,14.3969391951,14.3970060686,14.397072939,14.3971398062,14.3972066704,14.3972735315,14.3973403895,14.3974072444,14.3974740962,14.3975409449,14.3976077905, 14.3976746329,14.3977414723,14.3978083087,14.3978751419,14.397941972,14.398008799,14.3980756229,14.3981424437,14.3982092615,14.3982760761,14.3983428876,14.3984096961,14.3984765014,14.3985433037,14.3986101029,14.398676899, 14.3987436919,14.3988104818,14.3988772686,14.3989440523,14.399010833,14.3990776105,14.3991443849,14.3992111563,14.3992779245,14.3993446897,14.3994114517,14.3994782107,14.3995449666,14.3996117194,14.3996784692,14.3997452158, 14.3998119593,14.3998786998,14.3999454371,14.4000121714,14.4000789026,14.4001456307,14.4002123558,14.4002790777,14.4003457965,14.4004125123,14.400479225,14.4005459346,14.4006126411,14.4006793445,14.4007460448,14.4008127421, 14.4008794363,14.4009461274,14.4010128154,14.4010795003,14.4011461822,14.4012128609,14.4012795366,14.4013462092,14.4014128787,14.4014795452,14.4015462085,14.4016128688,14.401679526,14.4017461801,14.4018128311,14.4018794791, 14.401946124,14.4020127658,14.4020794045,14.4021460401,14.4022126727,14.4022793022,14.4023459286,14.402412552,14.4024791722,14.4025457894,14.4026124035,14.4026790145,14.4027456225,14.4028122274,14.4028788292,14.4029454279, 14.4030120236,14.4030786162,14.4031452057,14.4032117921,14.4032783755,14.4033449558,14.403411533,14.4034781071,14.4035446782,14.4036112462,14.4036778111,14.403744373,14.4038109318,14.4038774875,14.4039440402,14.4040105897, 14.4040771362,14.4041436797,14.4042102201,14.4042767574,14.4043432916,14.4044098228,14.4044763508,14.4045428759,14.4046093978,14.4046759167,14.4047424326,14.4048089453,14.404875455,14.4049419616,14.4050084652,14.4050749657, 14.4051414631,14.4052079575,14.4052744488,14.405340937,14.4054074222,14.4054739043,14.4055403834,14.4056068594,14.4056733323,14.4057398021,14.4058062689,14.4058727327,14.4059391933,14.406005651,14.4060721055,14.406138557, 14.4062050054,14.4062714508,14.4063378931,14.4064043323,14.4064707685,14.4065372017,14.4066036317,14.4066700587,14.4067364827,14.4068029036,14.4068693214,14.4069357362,14.4070021479,14.4070685566,14.4071349622,14.4072013647, 14.4072677642,14.4073341607,14.4074005541,14.4074669444,14.4075333317,14.4075997159,14.4076660971,14.4077324752,14.4077988502,14.4078652222,14.4079315912,14.4079979571,14.4080643199,14.4081306797,14.4081970364,14.4082633901, 14.4083297408,14.4083960884,14.4084624329,14.4085287744,14.4085951128,14.4086614482,14.4087277805,14.4087941098,14.408860436,14.4089267592,14.4089930793,14.4090593964,14.4091257105,14.4091920215,14.4092583294,14.4093246343, 14.4093909361,14.4094572349,14.4095235307,14.4095898234,14.4096561131,14.4097223997,14.4097886832,14.4098549638,14.4099212412,14.4099875157,14.4100537871,14.4101200554,14.4101863207,14.410252583,14.4103188422,14.4103850984, 14.4104513515,14.4105176016,14.4105838486,14.4106500926,14.4107163336,14.4107825715,14.4108488064,14.4109150382,14.410981267,14.4110474928,14.4111137155,14.4111799352,14.4112461518,14.4113123654,14.411378576,14.4114447835, 14.411510988,14.4115771895,14.4116433879,14.4117095832,14.4117757756,14.4118419649,14.4119081511,14.4119743344,14.4120405146,14.4121066917,14.4121728658,14.4122390369,14.412305205,14.41237137,14.4124375319,14.4125036909, 14.4125698468,14.4126359997,14.4127021495,14.4127682963,14.4128344401,14.4129005809,14.4129667186,14.4130328533,14.4130989849,14.4131651135,14.4132312391,14.4132973617,14.4133634812,14.4134295977,14.4134957112,14.4135618216, 14.413627929,14.4136940334,14.4137601348,14.4138262331,14.4138923284,14.4139584206,14.4140245099,14.4140905961,14.4141566793,14.4142227594,14.4142888366,14.4143549107,14.4144209817,14.4144870498,14.4145531148,14.4146191768, 14.4146852358,14.4147512918,14.4148173447,14.4148833946,14.4149494415,14.4150154853,14.4150815262,14.415147564,14.4152135988,14.4152796305,14.4153456593,14.415411685,14.4154777077,14.4155437274,14.415609744,14.4156757577, 14.4157417683,14.4158077759,14.4158737805,14.415939782,14.4160057806,14.4160717761,14.4161377686,14.4162037581,14.4162697445,14.416335728,14.4164017084,14.4164676858,14.4165336602,14.4165996316,14.4166655999,14.4167315653, 14.4167975276,14.4168634869,14.4169294432,14.4169953965,14.4170613468,14.417127294,14.4171932382,14.4172591795,14.4173251177,14.4173910529,14.4174569851,14.4175229142,14.4175888404,14.4176547635,14.4177206837,14.4177866008, 14.4178525149,14.417918426,14.4179843341,14.4180502391,14.4181161412,14.4181820403,14.4182479363,14.4183138293,14.4183797194,14.4184456064,14.4185114904,14.4185773714,14.4186432494,14.4187091244,14.4187749963,14.4188408653, 14.4189067313,14.4189725942,14.4190384542,14.4191043111,14.419170165,14.419236016,14.4193018639,14.4193677088,14.4194335507,14.4194993896,14.4195652255,14.4196310584,14.4196968883,14.4197627152,14.4198285391,14.41989436, 14.4199601778,14.4200259927,14.4200918046,14.4201576135,14.4202234193,14.4202892222,14.4203550221,14.420420819,14.4204866128,14.4205524037,14.4206181916,14.4206839764,14.4207497583,14.4208155372,14.420881313,14.4209470859, 14.4210128558,14.4210786227,14.4211443865,14.4212101474,14.4212759053,14.4213416602,14.4214074121,14.421473161,14.4215389068,14.4216046497,14.4216703897,14.4217361266,14.4218018605,14.4218675914,14.4219333193,14.4219990442, 14.4220647662,14.4221304851,14.4221962011,14.422261914,14.422327624,14.4223933309,14.4224590349,14.4225247359,14.4225904339,14.4226561289,14.4227218209,14.4227875099,14.4228531959,14.422918879,14.422984559,14.4230502361, 14.4231159101,14.4231815812,14.4232472493,14.4233129144,14.4233785765,14.4234442356,14.4235098918,14.4235755449,14.4236411951,14.4237068422,14.4237724864,14.4238381276,14.4239037658,14.4239694011,14.4240350333,14.4241006626, 14.4241662888,14.4242319121,14.4242975324,14.4243631497,14.424428764,14.4244943754,14.4245599837,14.4246255891,14.4246911915,14.4247567909,14.4248223874,14.4248879808,14.4249535713,14.4250191587,14.4250847432,14.4251503248, 14.4252159033,14.4252814789,14.4253470514,14.425412621,14.4254781876,14.4255437513,14.4256093119,14.4256748696,14.4257404243,14.425805976,14.4258715248,14.4259370705,14.4260026133,14.4260681531,14.42613369,14.4261992238, 14.4262647547,14.4263302826,14.4263958075,14.4264613295,14.4265268485,14.4265923645,14.4266578775,14.4267233875,14.4267888946,14.4268543987,14.4269198998,14.426985398,14.4270508932,14.4271163854,14.4271818746,14.4272473608, 14.4273128441,14.4273783245,14.4274438018,14.4275092762,14.4275747476,14.427640216,14.4277056815,14.4277711439,14.4278366035,14.42790206,14.4279675136,14.4280329642,14.4280984118,14.4281638565,14.4282292982,14.4282947369, 14.4283601727,14.4284256055,14.4284910353,14.4285564622,14.4286218861,14.428687307,14.428752725,14.42881814,14.428883552,14.4289489611,14.4290143672,14.4290797703,14.4291451705,14.4292105677,14.4292759619,14.4293413532, 14.4294067415,14.4294721269,14.4295375092,14.4296028887,14.4296682651,14.4297336386,14.4297990092,14.4298643767,14.4299297414,14.429995103,14.4300604617,14.4301258174,14.4301911702,14.43025652,14.4303218668,14.4303872107, 14.4304525517,14.4305178896,14.4305832246,14.4306485567,14.4307138858,14.4307792119,14.4308445351,14.4309098553,14.4309751726,14.4310404869,14.4311057982,14.4311711066,14.4312364121,14.4313017146,14.4313670141,14.4314323106, 14.4314976043,14.4315628949,14.4316281826,14.4316934674,14.4317587492,14.431824028,14.4318893039,14.4319545768,14.4320198468,14.4320851138,14.4321503779,14.432215639,14.4322808972,14.4323461524,14.4324114047,14.432476654, 14.4325419004,14.4326071438,14.4326723843,14.4327376218,14.4328028564,14.432868088,14.4329333166,14.4329985424,14.4330637651,14.4331289849,14.4331942018,14.4332594157,14.4333246267,14.4333898347,14.4334550398,14.433520242, 14.4335854412,14.4336506374,14.4337158307,14.433781021,14.4338462084,14.4339113929,14.4339765744,14.434041753,14.4341069286,14.4341721013,14.434237271,14.4343024378,14.4343676017,14.4344327626,14.4344979205,14.4345630756, 14.4346282276,14.4346933768,14.434758523,14.4348236662,14.4348888065,14.4349539439,14.4350190783,14.4350842098,14.4351493384,14.435214464,14.4352795866,14.4353447064,14.4354098232,14.435474937,14.4355400479,14.4356051559, 14.4356702609,14.435735363,14.4358004622,14.4358655584,14.4359306517,14.4359957421,14.4360608295,14.4361259139,14.4361909955,14.4362560741,14.4363211498,14.4363862225,14.4364512923,14.4365163592,14.4365814231,14.4366464841, 14.4367115421,14.4367765973,14.4368416495,14.4369066987,14.436971745,14.4370367884,14.4371018289,14.4371668664,14.437231901,14.4372969327,14.4373619614,14.4374269873,14.4374920101,14.4375570301,14.4376220471,14.4376870612, 14.4377520723,14.4378170805,14.4378820858,14.4379470882,14.4380120877,14.4380770842,14.4381420777,14.4382070684,14.4382720561,14.4383370409,14.4384020228,14.4384670017,14.4385319778,14.4385969509,14.438661921,14.4387268883, 14.4387918526,14.438856814,14.4389217724,14.438986728,14.4390516806,14.4391166303,14.4391815771,14.4392465209,14.4393114618,14.4393763998,14.4394413349,14.439506267,14.4395711963,14.4396361226,14.439701046,14.4397659664, 14.439830884,14.4398957986,14.4399607103,14.4400256191,14.440090525,14.4401554279,14.4402203279,14.440285225,14.4403501192,14.4404150105,14.4404798988,14.4405447842,14.4406096667,14.4406745463,14.440739423,14.4408042968, 14.4408691676,14.4409340355,14.4409989005,14.4410637626,14.4411286218,14.4411934781,14.4412583314,14.4413231818,14.4413880293,14.4414528739,14.4415177156,14.4415825544,14.4416473903,14.4417122232,14.4417770532,14.4418418803, 14.4419067045,14.4419715258,14.4420363442,14.4421011597,14.4421659722,14.4422307819,14.4422955886,14.4423603924,14.4424251933,14.4424899913,14.4425547864,14.4426195786,14.4426843679,14.4427491542,14.4428139377,14.4428787182, 14.4429434958,14.4430082706,14.4430730424,14.4431378113,14.4432025773,14.4432673404,14.4433321006,14.4433968579,14.4434616122,14.4435263637,14.4435911123,14.4436558579,14.4437206007,14.4437853405,14.4438500774,14.4439148115, 14.4439795426,14.4440442708,14.4441089961,14.4441737186,14.4442384381,14.4443031547,14.4443678684,14.4444325792,14.4444972871,14.4445619921,14.4446266942,14.4446913934,14.4447560897,14.4448207831,14.4448854736,14.4449501612, 14.4450148459,14.4450795277,14.4451442066,14.4452088825,14.4452735556,14.4453382258,14.4454028931,14.4454675575,14.445532219,14.4455968776,14.4456615333,14.4457261861,14.445790836,14.4458554831,14.4459201272,14.4459847684, 14.4460494067,14.4461140421,14.4461786747,14.4462433043,14.4463079311,14.4463725549,14.4464371758,14.4465017939,14.4465664091,14.4466310213,14.4466956307,14.4467602372,14.4468248408,14.4468894415,14.4469540393,14.4470186342, 14.4470832262,14.4471478153,14.4472124016,14.4472769849,14.4473415654,14.4474061429,14.4474707176,14.4475352894,14.4475998583,14.4476644243,14.4477289874,14.4477935476,14.447858105,14.4479226594,14.447987211,14.4480517596, 14.4481163054,14.4481808483,14.4482453883,14.4483099254,14.4483744597,14.448438991,14.4485035195,14.448568045,14.4486325677,14.4486970875,14.4487616045,14.4488261185,14.4488906296,14.4489551379,14.4490196433,14.4490841458, 14.4491486454,14.4492131421,14.4492776359,14.4493421269,14.449406615,14.4494711002,14.4495355825,14.4496000619,14.4496645385,14.4497290121,14.4497934829,14.4498579508,14.4499224159,14.449986878,14.4500513373,14.4501157937, 14.4501802472,14.4502446978,14.4503091455,14.4503735904,14.4504380324,14.4505024715,14.4505669077,14.4506313411,14.4506957716,14.4507601992,14.4508246239,14.4508890457,14.4509534647,14.4510178808,14.451082294,14.4511467044, 14.4512111118,14.4512755164,14.4513399181,14.451404317,14.4514687129,14.451533106,14.4515974963,14.4516618836,14.4517262681,14.4517906497,14.4518550284,14.4519194043,14.4519837772,14.4520481473,14.4521125146,14.4521768789, 14.4522412404,14.4523055991,14.4523699548,14.4524343077,14.4524986577,14.4525630048,14.4526273491,14.4526916905,14.452756029,14.4528203647,14.4528846975,14.4529490274,14.4530133545,14.4530776787,14.453142,14.4532063184, 14.453270634,14.4533349467,14.4533992566,14.4534635636,14.4535278677,14.4535921689,14.4536564673,14.4537207628,14.4537850555,14.4538493453,14.4539136322,14.4539779163,14.4540421975,14.4541064758,14.4541707513,14.4542350239, 14.4542992936,14.4543635605,14.4544278245,14.4544920857,14.454556344,14.4546205994,14.454684852,14.4547491017,14.4548133485,14.4548775925,14.4549418336,14.4550060719,14.4550703073,14.4551345398,14.4551987695,14.4552629963, 14.4553272203,14.4553914414,14.4554556597,14.455519875,14.4555840876,14.4556482973,14.4557125041,14.455776708,14.4558409091,14.4559051074,14.4559693028,14.4560334953,14.456097685,14.4561618718,14.4562260557,14.4562902369, 14.4563544151,14.4564185905,14.4564827631,14.4565469327,14.4566110996,14.4566752636,14.4567394247,14.456803583,14.4568677384,14.4569318909,14.4569960407,14.4570601875,14.4571243315,14.4571884727,14.457252611,14.4573167465, 14.4573808791,14.4574450088,14.4575091357,14.4575732598,14.457637381,14.4577014993,14.4577656149,14.4578297275,14.4578938373,14.4579579443,14.4580220484,14.4580861496,14.4581502481,14.4582143436,14.4582784363,14.4583425262, 14.4584066132,14.4584706974,14.4585347787,14.4585988572,14.4586629329,14.4587270057,14.4587910756,14.4588551427,14.458919207,14.4589832684,14.4590473269,14.4591113827,14.4591754356,14.4592394856,14.4593035328,14.4593675771, 14.4594316186,14.4594956573,14.4595596931,14.4596237261,14.4596877562,14.4597517835,14.459815808,14.4598798296,14.4599438484,14.4600078643,14.4600718774,14.4601358876,14.4601998951,14.4602638996,14.4603279014,14.4603919003, 14.4604558963,14.4605198895,14.4605838799,14.4606478674,14.4607118521,14.460775834,14.460839813,14.4609037892,14.4609677626,14.4610317331,14.4610957008,14.4611596656,14.4612236276,14.4612875868,14.4613515431,14.4614154966, 14.4614794473,14.4615433951,14.4616073401,14.4616712823,14.4617352216,14.4617991581,14.4618630918,14.4619270226,14.4619909506,14.4620548757,14.4621187981,14.4621827176,14.4622466342,14.4623105481,14.4623744591,14.4624383673, 14.4625022726,14.4625661751,14.4626300748,14.4626939716,14.4627578657,14.4628217569,14.4628856452,14.4629495307,14.4630134134,14.4630772933,14.4631411704,14.4632050446,14.463268916,14.4633327845,14.4633966503,14.4634605132, 14.4635243733,14.4635882305,14.463652085,14.4637159366,14.4637797853,14.4638436313,14.4639074744,14.4639713147,14.4640351522,14.4640989868,14.4641628187,14.4642266477,14.4642904739,14.4643542972,14.4644181177,14.4644819354, 14.4645457503,14.4646095624,14.4646733716,14.4647371781,14.4648009817,14.4648647824,14.4649285804,14.4649923755,14.4650561678,14.4651199573,14.465183744,14.4652475278,14.4653113089,14.4653750871,14.4654388625,14.4655026351, 14.4655664048,14.4656301717,14.4656939359,14.4657576972,14.4658214556,14.4658852113,14.4659489642,14.4660127142,14.4660764614,14.4661402058,14.4662039474,14.4662676861,14.4663314221,14.4663951552,14.4664588855,14.466522613, 14.4665863377,14.4666500596,14.4667137786,14.4667774949,14.4668412083,14.4669049189,14.4669686267,14.4670323317,14.4670960339,14.4671597333,14.4672234298,14.4672871236,14.4673508145,14.4674145026,14.4674781879,14.4675418704, 14.4676055501,14.467669227,14.467732901,14.4677965723,14.4678602407,14.4679239063,14.4679875692,14.4680512292,14.4681148864,14.4681785408,14.4682421924,14.4683058411,14.4683694871,14.4684331303,14.4684967706,14.4685604082, 14.4686240429,14.4686876749,14.468751304,14.4688149303,14.4688785538,14.4689421745,14.4690057924,14.4690694075,14.4691330198,14.4691966293,14.469260236,14.4693238399,14.469387441,14.4694510392,14.4695146347,14.4695782274, 14.4696418172,14.4697054043,14.4697689886,14.46983257,14.4698961487,14.4699597245,14.4700232976,14.4700868678,14.4701504353,14.4702139999,14.4702775618,14.4703411208,14.4704046771,14.4704682305,14.4705317812,14.470595329, 14.4706588741,14.4707224163,14.4707859558,14.4708494924,14.4709130263,14.4709765573,14.4710400856,14.4711036111,14.4711671337,14.4712306536,14.4712941707,14.4713576849,14.4714211964,14.4714847051,14.471548211,14.4716117141, 14.4716752144,14.4717387119,14.4718022066,14.4718656985,14.4719291876,14.471992674,14.4720561575,14.4721196382,14.4721831162,14.4722465913,14.4723100637,14.4723735333,14.4724370001,14.472500464,14.4725639252,14.4726273836, 14.4726908392,14.4727542921,14.4728177421,14.4728811893,14.4729446338,14.4730080754,14.4730715143,14.4731349504,14.4731983837,14.4732618142,14.4733252419,14.4733886668,14.473452089,14.4735155083,14.4735789249,14.4736423386, 14.4737057496,14.4737691578,14.4738325632,14.4738959659,14.4739593657,14.4740227627,14.474086157,14.4741495485,14.4742129372,14.4742763231,14.4743397062,14.4744030866,14.4744664641,14.4745298389,14.4745932109,14.4746565801, 14.4747199465,14.4747833102,14.474846671,14.4749100291,14.4749733844,14.4750367369,14.4751000866,14.4751634336,14.4752267777,14.4752901191,14.4753534577,14.4754167936,14.4754801266,14.4755434569,14.4756067843,14.475670109, 14.475733431,14.4757967501,14.4758600665,14.4759233801,14.4759866909,14.4760499989,14.4761133042,14.4761766066,14.4762399063,14.4763032032,14.4763664974,14.4764297888,14.4764930773,14.4765563632,14.4766196462,14.4766829265, 14.4767462039,14.4768094787,14.4768727506,14.4769360197,14.4769992861,14.4770625497,14.4771258106,14.4771890686,14.4772523239,14.4773155765,14.4773788262,14.4774420732,14.4775053174,14.4775685588,14.4776317975,14.4776950333, 14.4777582664,14.4778214968,14.4778847244,14.4779479491,14.4780111712,14.4780743904,14.4781376069,14.4782008206,14.4782640316,14.4783272398,14.4783904452,14.4784536478,14.4785168477,14.4785800448,14.4786432391,14.4787064307, 14.4787696195,14.4788328055,14.4788959888,14.4789591693,14.479022347,14.479085522,14.4791486942,14.4792118636,14.4792750303,14.4793381941,14.4794013553,14.4794645137,14.4795276693,14.4795908221,14.4796539722,14.4797171195, 14.479780264,14.4798434058,14.4799065448,14.4799696811,14.4800328146,14.4800959453,14.4801590733,14.4802221985,14.4802853209,14.4803484406,14.4804115575,14.4804746717,14.4805377831,14.4806008917,14.4806639976,14.4807271007, 14.4807902011,14.4808532987,14.4809163935,14.4809794856,14.4810425749,14.4811056615,14.4811687453,14.4812318263,14.4812949046,14.4813579802,14.4814210529,14.4814841229,14.4815471902,14.4816102547,14.4816733164,14.4817363754, 14.4817994317,14.4818624851,14.4819255359,14.4819885838,14.482051629,14.4821146715,14.4821777112,14.4822407481,14.4823037823,14.4823668138,14.4824298424,14.4824928684,14.4825558915,14.482618912,14.4826819296,14.4827449446, 14.4828079567,14.4828709661,14.4829339728,14.4829969767,14.4830599779,14.4831229763,14.4831859719,14.4832489648,14.483311955,14.4833749424,14.4834379271,14.483500909,14.4835638881,14.4836268645,14.4836898382,14.4837528091, 14.4838157773,14.4838787427,14.4839417053,14.4840046653,14.4840676224,14.4841305769,14.4841935285,14.4842564775,14.4843194236,14.4843823671,14.4844453078,14.4845082457,14.4845711809,14.4846341134,14.4846970431,14.48475997, 14.4848228943,14.4848858157,14.4849487345,14.4850116505,14.4850745637,14.4851374742,14.485200382,14.485263287,14.4853261892,14.4853890888,14.4854519856,14.4855148796,14.4855777709,14.4856406595,14.4857035453,14.4857664284, 14.4858293087,14.4858921863,14.4859550612,14.4860179333,14.4860808027,14.4861436693,14.4862065332,14.4862693943,14.4863322528,14.4863951085,14.4864579614,14.4865208116,14.4865836591,14.4866465038,14.4867093458,14.486772185, 14.4868350216,14.4868978553,14.4869606864,14.4870235147,14.4870863403,14.4871491631,14.4872119832,14.4872748006,14.4873376152,14.4874004271,14.4874632363,14.4875260427,14.4875888464,14.4876516473,14.4877144456,14.4877772411, 14.4878400338,14.4879028238,14.4879656111,14.4880283957,14.4880911775,14.4881539566,14.488216733,14.4882795066,14.4883422775,14.4884050457,14.4884678111,14.4885305739,14.4885933338,14.4886560911,14.4887188456,14.4887815974, 14.4888443465,14.4889070928,14.4889698364,14.4890325773,14.4890953154,14.4891580508,14.4892207835,14.4892835135,14.4893462407,14.4894089652,14.489471687,14.4895344061,14.4895971224,14.489659836,14.4897225469,14.489785255, 14.4898479604,14.4899106631,14.4899733631,14.4900360604,14.4900987549,14.4901614467,14.4902241358,14.4902868221,14.4903495057,14.4904121866,14.4904748648,14.4905375403,14.490600213,14.490662883,14.4907255503,14.4907882149, 14.4908508767,14.4909135359,14.4909761923,14.491038846,14.4911014969,14.4911641452,14.4912267907,14.4912894335,14.4913520736,14.4914147109,14.4914773456,14.4915399775,14.4916026067,14.4916652332,14.4917278569,14.491790478, 14.4918530963,14.4919157119,14.4919783248,14.492040935,14.4921035425,14.4921661472,14.4922287493,14.4922913486,14.4923539452,14.492416539,14.4924791302,14.4925417187,14.4926043044,14.4926668874,14.4927294677,14.4927920453, 14.4928546202,14.4929171923,14.4929797618,14.4930423285,14.4931048925,14.4931674538,14.4932300124,14.4932925683,14.4933551215,14.493417672,14.4934802197,14.4935427647,14.4936053071,14.4936678467,14.4937303836,14.4937929178, 14.4938554492,14.493917978,14.4939805041,14.4940430274,14.4941055481,14.494168066,14.4942305812,14.4942930937,14.4943556035,14.4944181106,14.494480615,14.4945431167,14.4946056157,14.4946681119,14.4947306055,14.4947930963, 14.4948555845,14.4949180699,14.4949805527,14.4950430327,14.49510551,14.4951679846,14.4952304565,14.4952929257,14.4953553922,14.495417856,14.4954803171,14.4955427755,14.4956052312,14.4956676842,14.4957301344,14.495792582, 14.4958550269,14.4959174691,14.4959799085,14.4960423453,14.4961047793,14.4961672107,14.4962296394,14.4962920653,14.4963544886,14.4964169091,14.496479327,14.4965417421,14.4966041546,14.4966665643,14.4967289714,14.4967913757, 14.4968537774,14.4969161763,14.4969785726,14.4970409662,14.497103357,14.4971657452,14.4972281306,14.4972905134,14.4973528935,14.4974152708,14.4974776455,14.4975400175,14.4976023868,14.4976647534,14.4977271173,14.4977894785, 14.497851837,14.4979141928,14.4979765459,14.4980388963,14.498101244,14.498163589,14.4982259313,14.498288271,14.4983506079,14.4984129422,14.4984752737,14.4985376026,14.4985999288,14.4986622522,14.498724573,14.4987868911, 14.4988492065,14.4989115192,14.4989738293,14.4990361366,14.4990984412,14.4991607432,14.4992230424,14.499285339,14.4993476329,14.4994099241,14.4994722126,14.4995344984,14.4995967815,14.4996590619,14.4997213397,14.4997836147, 14.4998458871,14.4999081568,14.4999704238,14.5000326881,14.5000949497,14.5001572086,14.5002194648,14.5002817184,14.5003439693,14.5004062175,14.500468463,14.5005307058,14.5005929459,14.5006551833,14.5007174181,14.5007796502, 14.5008418796,14.5009041063,14.5009663303,14.5010285516,14.5010907703,14.5011529862,14.5012151995,14.5012774101,14.5013396181,14.5014018233,14.5014640259,14.5015262257,14.5015884229,14.5016506174,14.5017128093,14.5017749984, 14.5018371849,14.5018993687,14.5019615498,14.5020237282,14.502085904,14.5021480771,14.5022102474,14.5022724152,14.5023345802,14.5023967426,14.5024589022,14.5025210592,14.5025832136,14.5026453652,14.5027075142,14.5027696605, 14.5028318041,14.502893945,14.5029560833,14.5030182188,14.5030803518,14.503142482,14.5032046095,14.5032667344,14.5033288566,14.5033909762,14.503453093,14.5035152072,14.5035773187,14.5036394275,14.5037015337,14.5037636372, 14.503825738,14.5038878361,14.5039499316,14.5040120244,14.5040741145,14.504136202,14.5041982867,14.5042603689,14.5043224483,14.5043845251,14.5044465991,14.5045086706,14.5045707393,14.5046328054,14.5046948688,14.5047569296, 14.5048189876,14.504881043,14.5049430958,14.5050051458,14.5050671932,14.505129238,14.50519128,14.5052533194,14.5053153561,14.5053773902,14.5054394216,14.5055014503,14.5055634764,14.5056254997,14.5056875205,14.5057495385, 14.5058115539,14.5058735666,14.5059355767,14.5059975841,14.5060595888,14.5061215909,14.5061835903,14.506245587,14.5063075811,14.5063695725,14.5064315613,14.5064935473,14.5065555308,14.5066175115,14.5066794896,14.506741465, 14.5068034378,14.5068654079,14.5069273753,14.5069893401,14.5070513022,14.5071132617,14.5071752185,14.5072371726,14.5072991241,14.5073610729,14.5074230191,14.5074849626,14.5075469034,14.5076088416,14.5076707771,14.50773271, 14.5077946402,14.5078565677,14.5079184926,14.5079804149,14.5080423344,14.5081042513,14.5081661656,14.5082280772,14.5082899861,14.5083518924,14.5084137961,14.508475697,14.5085375953,14.508599491,14.508661384,14.5087232744, 14.5087851621,14.5088470471,14.5089089295,14.5089708092,14.5090326863,14.5090945607,14.5091564325,14.5092183016,14.5092801681,14.5093420319,14.5094038931,14.5094657516,14.5095276074,14.5095894606,14.5096513112,14.5097131591, 14.5097750043,14.5098368469,14.5098986869,14.5099605242,14.5100223588,14.5100841908,14.5101460202,14.5102078469,14.5102696709,14.5103314923,14.510393311,14.5104551271,14.5105169406,14.5105787514,14.5106405596,14.5107023651, 14.5107641679,14.5108259681,14.5108877657,14.5109495606,14.5110113529,14.5110731425,14.5111349295,14.5111967138,14.5112584955,14.5113202745,14.5113820509,14.5114438247,14.5115055958,14.5115673643,14.5116291301,14.5116908932, 14.5117526538,14.5118144117,14.5118761669,14.5119379195,14.5119996694,14.5120614168,14.5121231614,14.5121849034,14.5122466428,14.5123083796,14.5123701137,14.5124318451,14.5124935739,14.5125553001,14.5126170237,14.5126787445, 14.5127404628,14.5128021784,14.5128638914,14.5129256017,14.5129873094,14.5130490145,14.5131107169,14.5131724167,14.5132341138,14.5132958083,14.5133575002,14.5134191894,14.513480876,14.5135425599,14.5136042412,14.5136659199, 14.513727596,14.5137892694,14.5138509401,14.5139126082,14.5139742737,14.5140359366,14.5140975968,14.5141592544,14.5142209094,14.5142825617,14.5143442114,14.5144058584,14.5144675028,14.5145291446,14.5145907837,14.5146524203, 14.5147140541,14.5147756854,14.514837314,14.51489894,14.5149605633,14.515022184,14.5150838021,14.5151454176,14.5152070304,14.5152686406,14.5153302482,14.5153918531,14.5154534554,14.5155150551,14.5155766521,14.5156382465, 14.5156998383,14.5157614274,14.515823014,14.5158845978,14.5159461791,14.5160077577,14.5160693338,14.5161309071,14.5161924779,14.516254046,14.5163156115,14.5163771744,14.5164387346,14.5165002922,14.5165618472,14.5166233996, 14.5166849493,14.5167464964,14.5168080409,14.5168695828,14.516931122,14.5169926586,14.5170541926,14.517115724,14.5171772527,14.5172387788,14.5173003023,14.5173618232,14.5174233414,14.517484857,14.51754637,14.5176078804, 14.5176693881,14.5177308933,14.5177923958,14.5178538957,14.5179153929,14.5179768876,14.5180383796,14.518099869,14.5181613558,14.5182228399,14.5182843215,14.5183458004,14.5184072767,14.5184687504,14.5185302214,14.5185916899, 14.5186531557,14.5187146189,14.5187760795,14.5188375374,14.5188989928,14.5189604455,14.5190218956,14.5190833431,14.519144788,14.5192062303,14.5192676699,14.5193291069,14.5193905413,14.5194519731,14.5195134023,14.5195748289, 14.5196362528,14.5196976742,14.5197590929,14.519820509,14.5198819225,14.5199433334,14.5200047416,14.5200661473,14.5201275503,14.5201889507,14.5202503486,14.5203117438,14.5203731363,14.5204345263,14.5204959137,14.5205572984, 14.5206186806,14.5206800601,14.520741437,14.5208028113,14.520864183,14.5209255521,14.5209869185,14.5210482824,14.5211096437,14.5211710023,14.5212323583,14.5212937117,14.5213550626,14.5214164108,14.5214777564,14.5215390993, 14.5216004397,14.5216617775,14.5217231127,14.5217844452,14.5218457752,14.5219071025,14.5219684272,14.5220297494,14.5220910689,14.5221523858,14.5222137001,14.5222750118,14.5223363209,14.5223976274,14.5224589313,14.5225202326, 14.5225815313,14.5226428273,14.5227041208,14.5227654117,14.5228266999,14.5228879856,14.5229492686,14.5230105491,14.5230718269,14.5231331022,14.5231943748,14.5232556449,14.5233169123,14.5233781772,14.5234394394,14.523500699, 14.5235619561,14.5236232105,14.5236844623,14.5237457116,14.5238069582,14.5238682022,14.5239294437,14.5239906825,14.5240519187,14.5241131524,14.5241743834,14.5242356118,14.5242968377,14.5243580609,14.5244192815,14.5244804996, 14.524541715,14.5246029279,14.5246641381,14.5247253458,14.5247865509,14.5248477533,14.5249089532,14.5249701504,14.5250313451,14.5250925372,14.5251537267,14.5252149136,14.5252760979,14.5253372796,14.5253984587,14.5254596352, 14.5255208091,14.5255819804,14.5256431491,14.5257043153,14.5257654788,14.5258266398,14.5258877981,14.5259489539,14.5260101071,14.5260712576,14.5261324056,14.526193551,14.5262546938,14.526315834,14.5263769717,14.5264381067, 14.5264992391,14.526560369,14.5266214962,14.5266826209,14.526743743,14.5268048625,14.5268659794,14.5269270937,14.5269882054,14.5270493146,14.5271104211,14.5271715251,14.5272326264,14.5272937252,14.5273548214,14.527415915, 14.5274770061,14.5275380945,14.5275991803,14.5276602636,14.5277213443,14.5277824224,14.5278434979,14.5279045708,14.5279656411,14.5280267089,14.528087774,14.5281488366,14.5282098966,14.528270954,14.5283320089,14.5283930611, 14.5284541108,14.5285151578,14.5285762023,14.5286372442,14.5286982836,14.5287593203,14.5288203545,14.5288813861,14.5289424151,14.5290034415,14.5290644653,14.5291254866,14.5291865053,14.5292475213,14.5293085349,14.5293695458, 14.5294305541,14.5294915599,14.5295525631,14.5296135637,14.5296745618,14.5297355572,14.5297965501,14.5298575404,14.5299185281,14.5299795133,14.5300404958,14.5301014758,14.5301624532,14.5302234281,14.5302844003,14.53034537, 14.5304063371,14.5304673016,14.5305282636,14.530589223,14.5306501798,14.530711134,14.5307720856,14.5308330347,14.5308939812,14.5309549251,14.5310158665,14.5310768052,14.5311377414,14.5311986751,14.5312596061,14.5313205346, 14.5313814605,14.5314423839,14.5315033046,14.5315642228,14.5316251384,14.5316860515,14.5317469619,14.5318078698,14.5318687752,14.5319296779,14.5319905781,14.5320514757,14.5321123708,14.5321732633,14.5322341532,14.5322950405, 14.5323559253,14.5324168075,14.5324776871,14.5325385642,14.5325994387,14.5326603106,14.53272118,14.5327820467,14.532842911,14.5329037726,14.5329646317,14.5330254882,14.5330863422,14.5331471936,14.5332080424,14.5332688886, 14.5333297323,14.5333905734,14.533451412,14.533512248,14.5335730814,14.5336339122,14.5336947405,14.5337555663,14.5338163894,14.53387721,14.5339380281,14.5339988435,14.5340596565,14.5341204668,14.5341812746,14.5342420798, 14.5343028825,14.5343636825,14.5344244801,14.5344852751,14.5345460675,14.5346068573,14.5346676446,14.5347284293,14.5347892115,14.5348499911,14.5349107681,14.5349715426,14.5350323145,14.5350930839,14.5351538507,14.5352146149, 14.5352753766,14.5353361357,14.5353968923,14.5354576463,14.5355183978,14.5355791467,14.535639893,14.5357006368,14.535761378,14.5358221166,14.5358828528,14.5359435863,14.5360043173,14.5360650457,14.5361257716,14.5361864949, 14.5362472157,14.5363079339,14.5363686496,14.5364293627,14.5364900732,14.5365507812,14.5366114866,14.5366721895,14.5367328898,14.5367935876,14.5368542828,14.5369149755,14.5369756656,14.5370363532,14.5370970382,14.5371577206, 14.5372184005,14.5372790779,14.5373397527,14.5374004249,14.5374610946,14.5375217618,14.5375824264,14.5376430884,14.5377037479,14.5377644048,14.5378250592,14.5378857111,14.5379463604,14.5380070071,14.5380676513,14.538128293, 14.5381889321,14.5382495686,14.5383102026,14.538370834,14.538431463,14.5384920893,14.5385527131,14.5386133344,14.5386739531,14.5387345692,14.5387951829,14.5388557939,14.5389164025,14.5389770084,14.5390376119,14.5390982128, 14.5391588111,14.5392194069,14.5392800002,14.5393405909,14.539401179,14.5394617646,14.5395223477,14.5395829283,14.5396435062,14.5397040817,14.5397646546,14.5398252249,14.5398857928,14.539946358,14.5400069208,14.5400674809, 14.5401280386,14.5401885937,14.5402491462,14.5403096963,14.5403702437,14.5404307887,14.5404913311,14.5405518709,14.5406124082,14.540672943,14.5407334753,14.540794005,14.5408545321,14.5409150567,14.5409755788,14.5410360983, 14.5410966153,14.5411571298,14.5412176417,14.5412781511,14.541338658,14.5413991623,14.5414596641,14.5415201633,14.54158066,14.5416411542,14.5417016458,14.5417621349,14.5418226214,14.5418831054,14.5419435869,14.5420040659, 14.5420645423,14.5421250162,14.5421854875,14.5422459563,14.5423064226,14.5423668863,14.5424273475,14.5424878062,14.5425482623,14.5426087159,14.542669167,14.5427296155,14.5427900616,14.542850505,14.542910946,14.5429713844, 14.5430318203,14.5430922536,14.5431526844,14.5432131127,14.5432735384,14.5433339617,14.5433943824,14.5434548005,14.5435152162,14.5435756293,14.5436360398,14.5436964479,14.5437568534,14.5438172564,14.5438776568,14.5439380547, 14.5439984501,14.544058843,14.5441192333,14.5441796212,14.5442400064,14.5443003892,14.5443607694,14.5444211471,14.5444815223,14.544541895,14.5446022651,14.5446626327,14.5447229978,14.5447833603,14.5448437203,14.5449040778, 14.5449644328,14.5450247852,14.5450851352,14.5451454826,14.5452058274,14.5452661698,14.5453265096,14.5453868469,14.5454471817,14.5455075139,14.5455678437,14.5456281709,14.5456884956,14.5457488177,14.5458091374,14.5458694545, 14.5459297691,14.5459900812,14.5460503907,14.5461106978,14.5461710023,14.5462313043,14.5462916037,14.5463519007,14.5464121951,14.546472487,14.5465327764,14.5465930633,14.5466533477,14.5467136295,14.5467739088,14.5468341856, 14.5468944599,14.5469547317,14.5470150009,14.5470752676,14.5471355318,14.5471957935,14.5472560527,14.5473163094,14.5473765635,14.5474368151,14.5474970642,14.5475573108,14.5476175549,14.5476777965,14.5477380355,14.547798272, 14.5478585061,14.5479187376,14.5479789665,14.548039193,14.548099417,14.5481596384,14.5482198574,14.5482800738,14.5483402877,14.5484004991,14.5484607079,14.5485209143,14.5485811182,14.5486413195,14.5487015183,14.5487617147, 14.5488219085,14.5488820998,14.5489422885,14.5490024748,14.5490626586,14.5491228398,14.5491830186,14.5492431948,14.5493033685,14.5493635397,14.5494237084,14.5494838746,14.5495440383,14.5496041995,14.5496643581,14.5497245143, 14.5497846679,14.5498448191,14.5499049677,14.5499651138,14.5500252575,14.5500853986,14.5501455372,14.5502056733,14.5502658069,14.550325938,14.5503860665,14.5504461926,14.5505063162,14.5505664372,14.5506265558,14.5506866718, 14.5507467854,14.5508068964,14.550867005,14.550927111,14.5509872145,14.5510473155,14.5511074141,14.5511675101,14.5512276036,14.5512876946,14.5513477831,14.5514078691,14.5514679526,14.5515280336,14.5515881121,14.5516481881, 14.5517082616,14.5517683326,14.5518284011,14.5518884671,14.5519485306,14.5520085916,14.5520686501,14.5521287061,14.5521887596,14.5522488105,14.552308859,14.552368905,14.5524289485,14.5524889895,14.552549028,14.552609064, 14.5526690975,14.5527291285,14.552789157,14.552849183,14.5529092065,14.5529692275,14.5530292461,14.5530892621,14.5531492756,14.5532092866,14.5532692952,14.5533293012,14.5533893047,14.5534493058,14.5535093043,14.5535693004, 14.5536292939,14.553689285,14.5537492735,14.5538092596,14.5538692432,14.5539292243,14.5539892029,14.554049179,14.5541091526,14.5541691237,14.5542290923,14.5542890584,14.5543490221,14.5544089832,14.5544689419,14.554528898, 14.5545888517,14.5546488029,14.5547087515,14.5547686977,14.5548286414,14.5548885826,14.5549485214,14.5550084576,14.5550683913,14.5551283226,14.5551882513,14.5552481776,14.5553081014,14.5553680227,14.5554279415,14.5554878578, 14.5555477716,14.555607683,14.5556675918,14.5557274982,14.5557874021,14.5558473035,14.5559072024,14.5559670988,14.5560269927,14.5560868842,14.5561467731,14.5562066596,14.5562665436,14.5563264251,14.5563863041,14.5564461806, 14.5565060547,14.5565659262,14.5566257953,14.5566856619,14.556745526,14.5568053876,14.5568652468,14.5569251034,14.5569849576,14.5570448093,14.5571046585,14.5571645052,14.5572243495,14.5572841912,14.5573440305,14.5574038673, 14.5574637016,14.5575235334,14.5575833628,14.5576431896,14.557703014,14.5577628359,14.5578226554,14.5578824723,14.5579422868,14.5580020988,14.5580619083,14.5581217153,14.5581815199,14.5582413219,14.5583011215,14.5583609186, 14.5584207133,14.5584805054,14.5585402951,14.5586000823,14.558659867,14.5587196493,14.558779429,14.5588392063,14.5588989811,14.5589587535,14.5590185233,14.5590782907,14.5591380556,14.5591978181,14.559257578,14.5593173355, 14.5593770905,14.5594368431,14.5594965931,14.5595563407,14.5596160858,14.5596758284,14.5597355686,14.5597953063,14.5598550415,14.5599147743,14.5599745045,14.5600342323,14.5600939576,14.5601536805,14.5602134009,14.5602731188, 14.5603328342,14.5603925472,14.5604522577,14.5605119657,14.5605716712,14.5606313743,14.5606910749,14.5607507731,14.5608104687,14.5608701619,14.5609298527,14.5609895409,14.5610492267,14.56110891,14.5611685909,14.5612282693, 14.5612879452,14.5613476186,14.5614072896,14.5614669581,14.5615266241,14.5615862877,14.5616459488,14.5617056075,14.5617652636,14.5618249173,14.5618845686,14.5619442173,14.5620038637,14.5620635075,14.5621231489,14.5621827878, 14.5622424242,14.5623020582,14.5623616897,14.5624213188,14.5624809453,14.5625405695,14.5626001911,14.5626598103,14.562719427,14.5627790413,14.5628386531,14.5628982625,14.5629578693,14.5630174737,14.5630770757,14.5631366752, 14.5631962722,14.5632558668,14.5633154589,14.5633750485,14.5634346357,14.5634942204,14.5635538027,14.5636133825,14.5636729598,14.5637325347,14.5637921071,14.5638516771,14.5639112446,14.5639708096,14.5640303722,14.5640899323, 14.56414949,14.5642090452,14.5642685979,14.5643281482,14.5643876961,14.5644472414,14.5645067843,14.5645663248,14.5646258628,14.5646853983,14.5647449314,14.5648044621,14.5648639902,14.5649235159,14.5649830392,14.56504256, 14.5651020784,14.5651615943,14.5652211077,14.5652806187,14.5653401272,14.5653996333,14.5654591369,14.5655186381,14.5655781368,14.565637633,14.5656971268,14.5657566182,14.5658161071,14.5658755935,14.5659350775,14.5659945591, 14.5660540382,14.5661135148,14.566172989,14.5662324607,14.56629193,14.5663513968,14.5664108612,14.5664703231,14.5665297826,14.5665892397,14.5666486942,14.5667081464,14.566767596,14.5668270433,14.566886488,14.5669459304, 14.5670053702,14.5670648077,14.5671242427,14.5671836752,14.5672431053,14.5673025329,14.5673619581,14.5674213808,14.5674808011,14.567540219,14.5675996344,14.5676590473,14.5677184579,14.5677778659,14.5678372715,14.5678966747, 14.5679560754,14.5680154737,14.5680748695,14.5681342629,14.5681936539,14.5682530423,14.5683124284,14.568371812,14.5684311932,14.5684905719,14.5685499482,14.568609322,14.5686686934,14.5687280623,14.5687874288,14.5688467929, 14.5689061545,14.5689655137,14.5690248704,14.5690842247,14.5691435765,14.569202926,14.5692622729,14.5693216174,14.5693809595,14.5694402992,14.5694996364,14.5695589711,14.5696183034,14.5696776333,14.5697369608,14.5697962858, 14.5698556083,14.5699149285,14.5699742461,14.5700335614,14.5700928742,14.5701521846,14.5702114925,14.570270798,14.570330101,14.5703894016,14.5704486998,14.5705079956,14.5705672889,14.5706265797,14.5706858682,14.5707451542, 14.5708044377,14.5708637188,14.5709229975,14.5709822738,14.5710415476,14.571100819,14.5711600879,14.5712193544,14.5712786185,14.5713378802,14.5713971394,14.5714563961,14.5715156505,14.5715749024,14.5716341519,14.5716933989, 14.5717526435,14.5718118857,14.5718711254,14.5719303627,14.5719895976,14.57204883,14.5721080601,14.5721672876,14.5722265128,14.5722857355,14.5723449558,14.5724041737,14.5724633891,14.5725226021,14.5725818126,14.5726410208, 14.5727002265,14.5727594298,14.5728186306,14.572877829,14.572937025,14.5729962186,14.5730554097,14.5731145984,14.5731737847,14.5732329685,14.57329215,14.5733513289,14.5734105055,14.5734696796,14.5735288514,14.5735880206, 14.5736471875,14.5737063519,14.5737655139,14.5738246735,14.5738838307,14.5739429854,14.5740021377,14.5740612876,14.574120435,14.57417958,14.5742387226,14.5742978628,14.5743570006,14.5744161359,14.5744752688,14.5745343993, 14.5745935273,14.574652653,14.5747117762,14.574770897,14.5748300153,14.5748891313,14.5749482448,14.5750073559,14.5750664646,14.5751255708,14.5751846747,14.5752437761,14.5753028751,14.5753619716,14.5754210658,14.5754801575, 14.5755392468,14.5755983337,14.5756574182,14.5757165002,14.5757755799,14.5758346571,14.5758937319,14.5759528043,14.5760118742,14.5760709417,14.5761300069,14.5761890696,14.5762481298,14.5763071877,14.5763662432,14.5764252962, 14.5764843468,14.576543395,14.5766024408,14.5766614841,14.5767205251,14.5767795636,14.5768385997,14.5768976334,14.5769566647,14.5770156936,14.57707472,14.5771337441,14.5771927657,14.5772517849,14.5773108017,14.5773698161, 14.577428828,14.5774878376,14.5775468447,14.5776058495,14.5776648518,14.5777238517,14.5777828492,14.5778418442,14.5779008369,14.5779598271,14.578018815,14.5780778004,14.5781367834,14.578195764,14.5782547422,14.578313718, 14.5783726914,14.5784316623,14.5784906309,14.578549597,14.5786085607,14.5786675221,14.578726481,14.5787854375,14.5788443916,14.5789033432,14.5789622925,14.5790212394,14.5790801838,14.5791391259,14.5791980655,14.5792570028, 14.5793159376,14.57937487,14.5794338,14.5794927276,14.5795516528,14.5796105756,14.579669496,14.579728414,14.5797873295,14.5798462427,14.5799051535,14.5799640618,14.5800229678,14.5800818713,14.5801407724,14.5801996712, 14.5802585675,14.5803174614,14.5803763529,14.5804352421,14.5804941288,14.5805530131,14.580611895,14.5806707745,14.5807296516,14.5807885263,14.5808473986,14.5809062685,14.580965136,14.5810240011,14.5810828638,14.581141724, 14.5812005819,14.5812594374,14.5813182905,14.5813771412,14.5814359895,14.5814948353,14.5815536788,14.5816125199,14.5816713586,14.5817301949,14.5817890287,14.5818478602,14.5819066893,14.581965516,14.5820243403,14.5820831622, 14.5821419817,14.5822007988,14.5822596134,14.5823184257,14.5823772356,14.5824360431,14.5824948482,14.582553651,14.5826124513,14.5826712492,14.5827300447,14.5827888378,14.5828476286,14.5829064169,14.5829652028,14.5830239864, 14.5830827675,14.5831415463,14.5832003226,14.5832590966,14.5833178681,14.5833766373,14.5834354041,14.5834941685,14.5835529305,14.5836116901,14.5836704473,14.5837292021,14.5837879545,14.5838467045,14.5839054522,14.5839641974, 14.5840229403,14.5840816807,14.5841404188,14.5841991545,14.5842578877,14.5843166186,14.5843753471,14.5844340733,14.584492797,14.5845515183,14.5846102372,14.5846689538,14.584727668,14.5847863797,14.5848450891,14.5849037961, 14.5849625007,14.5850212029,14.5850799028,14.5851386002,14.5851972953,14.5852559879,14.5853146782,14.5853733661,14.5854320516,14.5854907347,14.5855494154,14.5856080938,14.5856667697,14.5857254433,14.5857841145,14.5858427833, 14.5859014497,14.5859601137,14.5860187754,14.5860774346,14.5861360915,14.586194746,14.5862533981,14.5863120478,14.5863706951,14.5864293401,14.5864879826,14.5865466228,14.5866052606,14.586663896,14.586722529,14.5867811597, 14.586839788,14.5868984138,14.5869570373,14.5870156585,14.5870742772,14.5871328936,14.5871915075,14.5872501191,14.5873087283,14.5873673352,14.5874259396,14.5874845417,14.5875431414,14.5876017387,14.5876603336,14.5877189262, 14.5877775163,14.5878361041,14.5878946895,14.5879532726,14.5880118532,14.5880704315,14.5881290074,14.5881875809,14.588246152,14.5883047208,14.5883632872,14.5884218512,14.5884804128,14.5885389721,14.588597529,14.5886560835, 14.5887146356,14.5887731853,14.5888317327,14.5888902777,14.5889488203,14.5890073606,14.5890658984,14.5891244339,14.589182967,14.5892414978,14.5893000262,14.5893585521,14.5894170758,14.589475597,14.5895341159,14.5895926324, 14.5896511465,14.5897096583,14.5897681676,14.5898266747,14.5898851793,14.5899436816,14.5900021814,14.590060679,14.5901191741,14.5901776669,14.5902361573,14.5902946453,14.590353131,14.5904116143,14.5904700952,14.5905285737, 14.5905870499,14.5906455237,14.5907039952,14.5907624642,14.5908209309,14.5908793953,14.5909378572,14.5909963168,14.591054774,14.5911132289,14.5911716814,14.5912301315,14.5912885792,14.5913470246,14.5914054676,14.5914639083, 14.5915223466,14.5915807825,14.591639216,14.5916976472,14.591756076,14.5918145025,14.5918729266,14.5919313483,14.5919897676,14.5920481846,14.5921065992,14.5921650115,14.5922234214,14.5922818289,14.592340234,14.5923986368, 14.5924570373,14.5925154353,14.592573831,14.5926322244,14.5926906154,14.592749004,14.5928073902,14.5928657741,14.5929241556,14.5929825348,14.5930409116,14.593099286,14.5931576581,14.5932160278,14.5932743952,14.5933327602, 14.5933911228,14.5934494831,14.593507841,14.5935661965,14.5936245497,14.5936829005,14.593741249,14.5937995951,14.5938579389,14.5939162802,14.5939746193,14.5940329559,14.5940912903,14.5941496222,14.5942079518,14.594266279, 14.5943246039,14.5943829264,14.5944412466,14.5944995644,14.5945578799,14.594616193,14.5946745037,14.5947328121,14.5947911181,14.5948494218,14.5949077231,14.594966022,14.5950243186,14.5950826129,14.5951409047,14.5951991943, 14.5952574814,14.5953157663,14.5953740487,14.5954323288,14.5954906066,14.595548882,14.5956071551,14.5956654258,14.5957236941,14.5957819601,14.5958402237,14.595898485,14.5959567439,14.5960150005,14.5960732547,14.5961315066, 14.5961897561,14.5962480033,14.5963062481,14.5963644906,14.5964227307,14.5964809685,14.5965392039,14.596597437,14.5966556677,14.596713896,14.5967721221,14.5968303457,14.596888567,14.596946786,14.5970050026,14.5970632169, 14.5971214288,14.5971796384,14.5972378456,14.5972960504,14.597354253,14.5974124531,14.597470651,14.5975288465,14.5975870396,14.5976452304,14.5977034188,14.5977616049,14.5978197886,14.59787797,14.5979361491,14.5979943258, 14.5980525002,14.5981106722,14.5981688418,14.5982270092,14.5982851741,14.5983433368,14.5984014971,14.598459655,14.5985178106,14.5985759639,14.5986341148,14.5986922633,14.5987504096,14.5988085535,14.598866695,14.5989248342, 14.598982971,14.5990411055,14.5990992377,14.5991573675,14.599215495,14.5992736202,14.599331743,14.5993898634,14.5994479815,14.5995060973,14.5995642107,14.5996223218,14.5996804306,14.599738537,14.5997966411,14.5998547428, 14.5999128422,14.5999709392,14.600029034,14.6000871263,14.6001452164,14.6002033041,14.6002613894,14.6003194724,14.6003775531,14.6004356314,14.6004937075,14.6005517811,14.6006098524,14.6006679214,14.6007259881,14.6007840524, 14.6008421144,14.600900174,14.6009582313,14.6010162863,14.6010743389,14.6011323892,14.6011904372,14.6012484828,14.6013065261,14.6013645671,14.6014226057,14.601480642,14.6015386759,14.6015967076,14.6016547368,14.6017127638, 14.6017707884,14.6018288107,14.6018868306,14.6019448483,14.6020028635,14.6020608765,14.6021188871,14.6021768954,14.6022349013,14.602292905,14.6023509062,14.6024089052,14.6024669018,14.6025248961,14.6025828881,14.6026408777, 14.602698865,14.60275685,14.6028148326,14.6028728129,14.6029307909,14.6029887666,14.6030467399,14.6031047109,14.6031626795,14.6032206459,14.6032786099,14.6033365715,14.6033945309,14.6034524879,14.6035104426,14.603568395, 14.603626345,14.6036842927,14.6037422381,14.6038001811,14.6038581218,14.6039160602,14.6039739963,14.6040319301,14.6040898615,14.6041477906,14.6042057173,14.6042636418,14.6043215639,14.6043794837,14.6044374011,14.6044953163, 14.6045532291,14.6046111396,14.6046690477,14.6047269536,14.6047848571,14.6048427583,14.6049006571,14.6049585537,14.6050164479,14.6050743398,14.6051322294,14.6051901166,14.6052480016,14.6053058842,14.6053637645,14.6054216424, 14.6054795181,14.6055373914,14.6055952624,14.6056531311,14.6057109974,14.6057688614,14.6058267232,14.6058845826,14.6059424396,14.6060002944,14.6060581468,14.6061159969,14.6061738447,14.6062316902,14.6062895333,14.6063473742, 14.6064052127,14.6064630489,14.6065208828,14.6065787143,14.6066365436,14.6066943705,14.6067521951,14.6068100174,14.6068678374,14.606925655,14.6069834704,14.6070412834,14.6070990941,14.6071569025,14.6072147086,14.6072725123, 14.6073303137,14.6073881129,14.6074459097,14.6075037042,14.6075614964,14.6076192862,14.6076770738,14.607734859,14.6077926419,14.6078504225,14.6079082008,14.6079659768,14.6080237505,14.6080815218,14.6081392908,14.6081970576, 14.608254822,14.6083125841,14.6083703439,14.6084281013,14.6084858565,14.6085436093,14.6086013599,14.6086591081,14.608716854,14.6087745976,14.6088323389,14.6088900779,14.6089478146,14.6090055489,14.609063281,14.6091210107, 14.6091787381,14.6092364633,14.6092941861,14.6093519066,14.6094096248,14.6094673406,14.6095250542,14.6095827655,14.6096404744,14.6096981811,14.6097558854,14.6098135875,14.6098712872,14.6099289846,14.6099866797,14.6100443725, 14.610102063,14.6101597512,14.6102174371,14.6102751206,14.6103328019,14.6103904809,14.6104481575,14.6105058319,14.6105635039,14.6106211737,14.6106788411,14.6107365062,14.6107941691,14.6108518296,14.6109094878,14.6109671437, 14.6110247973,14.6110824486,14.6111400976,14.6111977443,14.6112553887,14.6113130308,14.6113706706,14.6114283081,14.6114859432,14.6115435761,14.6116012067,14.611658835,14.6117164609,14.6117740846,14.611831706,14.6118893251, 14.6119469418,14.6120045563,14.6120621685,14.6121197783,14.6121773859,14.6122349911,14.6122925941,14.6123501948,14.6124077931,14.6124653892,14.612522983,14.6125805744,14.6126381636,14.6126957505,14.612753335,14.6128109173, 14.6128684973,14.612926075,14.6129836503,14.6130412234,14.6130987942,14.6131563627,14.6132139289,14.6132714928,14.6133290544,14.6133866137,14.6134441707,14.6135017254,14.6135592778,14.6136168279,14.6136743757,14.6137319212, 14.6137894645,14.6138470054,14.613904544,14.6139620804,14.6140196144,14.6140771462,14.6141346757,14.6141922028,14.6142497277,14.6143072503,14.6143647706,14.6144222885,14.6144798042,14.6145373177,14.6145948288,14.6146523376, 14.6147098441,14.6147673484,14.6148248503,14.6148823499,14.6149398473,14.6149973424,14.6150548352,14.6151123256,14.6151698138,14.6152272997,14.6152847834,14.6153422647,14.6153997437,14.6154572205,14.6155146949,14.6155721671, 14.615629637,14.6156871046,14.6157445699,14.6158020329,14.6158594936,14.615916952,14.6159744082,14.616031862,14.6160893136,14.6161467629,14.6162042099,14.6162616546,14.616319097,14.6163765371,14.616433975,14.6164914105, 14.6165488438,14.6166062748,14.6166637035,14.6167211299,14.616778554,14.6168359758,14.6168933954,14.6169508127,14.6170082277,14.6170656404,14.6171230508,14.6171804589,14.6172378647,14.6172952683,14.6173526696,14.6174100686, 14.6174674653,14.6175248597,14.6175822519,14.6176396417,14.6176970293,14.6177544146,14.6178117976,14.6178691783,14.6179265568,14.617983933,14.6180413069,14.6180986785,14.6181560478,14.6182134148,14.6182707796,14.6183281421, 14.6183855023,14.6184428602,14.6185002158,14.6185575692,14.6186149203,14.618672269,14.6187296156,14.6187869598,14.6188443018,14.6189016414,14.6189589788,14.619016314,14.6190736468,14.6191309774,14.6191883057,14.6192456317, 14.6193029554,14.6193602769,14.619417596,14.6194749129,14.6195322276,14.6195895399,14.61964685,14.6197041578,14.6197614633,14.6198187665,14.6198760675,14.6199333662,14.6199906626,14.6200479567,14.6201052486,14.6201625382, 14.6202198255,14.6202771105,14.6203343933,14.6203916738,14.620448952,14.620506228,14.6205635016,14.620620773,14.6206780421,14.620735309,14.6207925736,14.6208498359,14.6209070959,14.6209643536,14.6210216091,14.6210788623, 14.6211361133,14.6211933619,14.6212506083,14.6213078525,14.6213650943,14.6214223339,14.6214795712,14.6215368062,14.621594039,14.6216512695,14.6217084977,14.6217657237,14.6218229474,14.6218801688,14.621937388,14.6219946048, 14.6220518195,14.6221090318,14.6221662419,14.6222234497,14.6222806552,14.6223378585,14.6223950595,14.6224522582,14.6225094547,14.6225666489,14.6226238408,14.6226810305,14.6227382179,14.622795403,14.6228525859,14.6229097665, 14.6229669448,14.6230241209,14.6230812947,14.6231384662,14.6231956355,14.6232528025,14.6233099672,14.6233671297,14.6234242899,14.6234814478,14.6235386035,14.6235957569,14.6236529081,14.6237100569,14.6237672036,14.6238243479, 14.62388149,14.6239386298,14.6239957674,14.6240529027,14.6241100358,14.6241671665,14.6242242951,14.6242814213,14.6243385453,14.624395667,14.6244527865,14.6245099037,14.6245670187,14.6246241314,14.6246812418,14.62473835, 14.6247954559,14.6248525595,14.6249096609,14.62496676,14.6250238569,14.6250809515,14.6251380438,14.6251951339,14.6252522217,14.6253093073,14.6253663906,14.6254234717,14.6254805505,14.625537627,14.6255947013,14.6256517733, 14.6257088431,14.6257659106,14.6258229758,14.6258800388,14.6259370995,14.625994158,14.6260512142,14.6261082682,14.6261653199,14.6262223694,14.6262794166,14.6263364615,14.6263935042,14.6264505446,14.6265075828,14.6265646187, 14.6266216524,14.6266786838,14.6267357129,14.6267927398,14.6268497645,14.6269067869,14.626963807,14.6270208249,14.6270778405,14.6271348539,14.627191865,14.6272488739,14.6273058805,14.6273628849,14.627419887,14.6274768869, 14.6275338845,14.6275908798,14.6276478729,14.6277048638,14.6277618524,14.6278188388,14.6278758229,14.6279328047,14.6279897843,14.6280467617,14.6281037368,14.6281607096,14.6282176802,14.6282746486,14.6283316147,14.6283885785, 14.6284455401,14.6285024995,14.6285594566,14.6286164115,14.6286733641,14.6287303144,14.6287872625,14.6288442084,14.628901152,14.6289580934,14.6290150325,14.6290719694,14.629128904,14.6291858364,14.6292427665,14.6292996944, 14.6293566201,14.6294135435,14.6294704646,14.6295273835,14.6295843002,14.6296412146,14.6296981268,14.6297550367,14.6298119444,14.6298688498,14.629925753,14.629982654,14.6300395527,14.6300964491,14.6301533433,14.6302102353, 14.630267125,14.6303240125,14.6303808978,14.6304377808,14.6304946615,14.63055154,14.6306084163,14.6306652903,14.6307221621,14.6307790316,14.630835899,14.630892764,14.6309496268,14.6310064874,14.6310633457,14.6311202018, 14.6311770557,14.6312339073,14.6312907567,14.6313476038,14.6314044487,14.6314612914,14.6315181318,14.63157497,14.6316318059,14.6316886396,14.6317454711,14.6318023003,14.6318591273,14.631915952,14.6319727745,14.6320295948, 14.6320864128,14.6321432286,14.6322000422,14.6322568535,14.6323136626,14.6323704694,14.632427274,14.6324840764,14.6325408765,14.6325976744,14.6326544701,14.6327112635,14.6327680547,14.6328248437,14.6328816304,14.6329384149, 14.6329951971,14.6330519772,14.6331087549,14.6331655305,14.6332223038,14.6332790749,14.6333358437,14.6333926103,14.6334493747,14.6335061369,14.6335628968,14.6336196544,14.6336764099,14.6337331631,14.6337899141,14.6338466628, 14.6339034093,14.6339601536,14.6340168957,14.6340736355,14.6341303731,14.6341871085,14.6342438416,14.6343005725,14.6343573011,14.6344140276,14.6344707518,14.6345274737,14.6345841935,14.634640911,14.6346976263,14.6347543393, 14.6348110502,14.6348677588,14.6349244651,14.6349811693,14.6350378712,14.6350945709,14.6351512683,14.6352079635,14.6352646565,14.6353213473,14.6353780359,14.6354347222,14.6354914063,14.6355480881,14.6356047677,14.6356614452, 14.6357181203,14.6357747933,14.635831464,14.6358881325,14.6359447988,14.6360014628,14.6360581247,14.6361147843,14.6361714416,14.6362280968,14.6362847497,14.6363414004,14.6363980489,14.6364546951,14.6365113392,14.636567981, 14.6366246205,14.6366812579,14.636737893,14.6367945259,14.6368511566,14.6369077851,14.6369644113,14.6370210353,14.6370776571,14.6371342767,14.6371908941,14.6372475092,14.6373041221,14.6373607328,14.6374173413,14.6374739475, 14.6375305515,14.6375871533,14.6376437529,14.6377003503,14.6377569454,14.6378135383,14.637870129,14.6379267175,14.6379833038,14.6380398878,14.6380964696,14.6381530492,14.6382096266,14.6382662018,14.6383227747,14.6383793455, 14.638435914,14.6384924803,14.6385490444,14.6386056062,14.6386621659,14.6387187233,14.6387752785,14.6388318315,14.6388883823,14.6389449308,14.6390014771,14.6390580213,14.6391145632,14.6391711029,14.6392276403,14.6392841756, 14.6393407087,14.6393972395,14.6394537681,14.6395102945,14.6395668187,14.6396233407,14.6396798604,14.639736378,14.6397928933,14.6398494064,14.6399059173,14.639962426,14.6400189325,14.6400754367,14.6401319388,14.6401884386, 14.6402449362,14.6403014316,14.6403579248,14.6404144158,14.6404709046,14.6405273912,14.6405838755,14.6406403576,14.6406968376,14.6407533153,14.6408097908,14.6408662641,14.6409227352,14.640979204,14.6410356707,14.6410921352, 14.6411485974,14.6412050574,14.6412615153,14.6413179709,14.6413744243,14.6414308755,14.6414873245,14.6415437713,14.6416002158,14.6416566582,14.6417130984,14.6417695363,14.641825972,14.6418824056,14.6419388369,14.641995266, 14.6420516929,14.6421081176,14.6421645401,14.6422209604,14.6422773785,14.6423337944,14.6423902081,14.6424466195,14.6425030288,14.6425594358,14.6426158407,14.6426722433,14.6427286438,14.642785042,14.642841438,14.6428978319, 14.6429542235,14.6430106129,14.6430670001,14.6431233851,14.6431797679,14.6432361485,14.6432925269,14.6433489031,14.6434052771,14.6434616489,14.6435180185,14.6435743859,14.6436307511,14.643687114,14.6437434748,14.6437998334, 14.6438561898,14.6439125439,14.6439688959,14.6440252457,14.6440815933,14.6441379386,14.6441942818,14.6442506228,14.6443069615,14.6443632981,14.6444196325,14.6444759647,14.6445322946,14.6445886224,14.644644948,14.6447012713, 14.6447575925,14.6448139115,14.6448702283,14.6449265428,14.6449828552,14.6450391654,14.6450954734,14.6451517792,14.6452080828,14.6452643842,14.6453206834,14.6453769804,14.6454332752,14.6454895678,14.6455458582,14.6456021464, 14.6456584324,14.6457147162,14.6457709979,14.6458272773,14.6458835545,14.6459398296,14.6459961024,14.6460523731,14.6461086415,14.6461649078,14.6462211718,14.6462774337,14.6463336934,14.6463899509,14.6464462062,14.6465024593, 14.6465587102,14.6466149589,14.6466712054,14.6467274497,14.6467836918,14.6468399318,14.6468961695,14.6469524051,14.6470086384,14.6470648696,14.6471210986,14.6471773254,14.64723355,14.6472897724,14.6473459926,14.6474022106, 14.6474584265,14.6475146401,14.6475708516,14.6476270608,14.6476832679,14.6477394728,14.6477956755,14.647851876,14.6479080743,14.6479642704,14.6480204643,14.6480766561,14.6481328457,14.648189033,14.6482452182,14.6483014012, 14.648357582,14.6484137606,14.6484699371,14.6485261113,14.6485822834,14.6486384532,14.6486946209,14.6487507864,14.6488069497,14.6488631109,14.6489192698,14.6489754265,14.6490315811,14.6490877335,14.6491438837,14.6492000317, 14.6492561775,14.6493123212,14.6493684626,14.6494246019,14.649480739,14.6495368739,14.6495930066,14.6496491371,14.6497052655,14.6497613916,14.6498175156,14.6498736374,14.649929757,14.6499858745,14.6500419897,14.6500981028, 14.6501542137,14.6502103224,14.6502664289,14.6503225332,14.6503786354,14.6504347354,14.6504908332,14.6505469288,14.6506030222,14.6506591135,14.6507152025,14.6507712894,14.6508273741,14.6508834567,14.650939537,14.6509956152, 14.6510516912,14.651107765,14.6511638366,14.6512199061,14.6512759733,14.6513320384,14.6513881014,14.6514441621,14.6515002207,14.651556277,14.6516123312,14.6516683833,14.6517244331,14.6517804808,14.6518365263,14.6518925696, 14.6519486107,14.6520046497,14.6520606865,14.6521167211,14.6521727535,14.6522287838,14.6522848118,14.6523408377,14.6523968615,14.652452883,14.6525089024,14.6525649196,14.6526209346,14.6526769475,14.6527329582,14.6527889667, 14.652844973,14.6529009772,14.6529569791,14.6530129789,14.6530689766,14.653124972,14.6531809653,14.6532369564,14.6532929454,14.6533489322,14.6534049167,14.6534608992,14.6535168794,14.6535728575,14.6536288334,14.6536848071, 14.6537407787,14.6537967481,14.6538527153,14.6539086804,14.6539646432,14.654020604,14.6540765625,14.6541325189,14.6541884731,14.6542444251,14.6543003749,14.6543563226,14.6544122681,14.6544682115,14.6545241527,14.6545800917, 14.6546360285,14.6546919632,14.6547478957,14.654803826,14.6548597542,14.6549156802,14.654971604,14.6550275257,14.6550834452,14.6551393625,14.6551952777,14.6552511907,14.6553071015,14.6553630102,14.6554189167,14.655474821, 14.6555307232,14.6555866232,14.655642521,14.6556984166,14.6557543101,14.6558102015,14.6558660906,14.6559219776,14.6559778625,14.6560337452,14.6560896257,14.656145504,14.6562013802,14.6562572542,14.6563131261,14.6563689958, 14.6564248633,14.6564807286,14.6565365918,14.6565924529,14.6566483117,14.6567041685,14.656760023,14.6568158754,14.6568717256,14.6569275737,14.6569834196,14.6570392633,14.6570951049,14.6571509443,14.6572067816,14.6572626166, 14.6573184496,14.6573742804,14.657430109,14.6574859354,14.6575417597,14.6575975818,14.6576534018,14.6577092196,14.6577650353,14.6578208488,14.6578766601,14.6579324693,14.6579882763,14.6580440811,14.6580998838,14.6581556844, 14.6582114828,14.658267279,14.658323073,14.6583788649,14.6584346547,14.6584904423,14.6585462277,14.658602011,14.6586577921,14.6587135711,14.6587693479,14.6588251226,14.658880895,14.6589366654,14.6589924336,14.6590481996, 14.6591039635,14.6591597252,14.6592154848,14.6592712422,14.6593269974,14.6593827505,14.6594385015,14.6594942502,14.6595499969,14.6596057414,14.6596614837,14.6597172239,14.6597729619,14.6598286977,14.6598844315,14.659940163, 14.6599958924,14.6600516197,14.6601073448,14.6601630677,14.6602187885,14.6602745072,14.6603302237,14.660385938,14.6604416502,14.6604973602,14.6605530681,14.6606087739,14.6606644775,14.6607201789,14.6607758782,14.6608315753, 14.6608872703,14.6609429631,14.6609986538,14.6610543424,14.6611100287,14.661165713,14.6612213951,14.661277075,14.6613327528,14.6613884284,14.6614441019,14.6614997733,14.6615554425,14.6616111095,14.6616667744,14.6617224372, 14.6617780978,14.6618337562,14.6618894125,14.6619450667,14.6620007187,14.6620563686,14.6621120163,14.6621676619,14.6622233053,14.6622789466,14.6623345857,14.6623902227,14.6624458576,14.6625014903,14.6625571208,14.6626127493, 14.6626683755,14.6627239996,14.6627796216,14.6628352415,14.6628908591,14.6629464747,14.6630020881,14.6630576993,14.6631133085,14.6631689154,14.6632245203,14.6632801229,14.6633357235,14.6633913219,14.6634469181,14.6635025122, 14.6635581042,14.663613694,14.6636692817,14.6637248673,14.6637804507,14.6638360319,14.6638916111,14.663947188,14.6640027629,14.6640583356,14.6641139061,14.6641694746,14.6642250408,14.664280605,14.664336167,14.6643917268, 14.6644472845,14.6645028401,14.6645583936,14.6646139449,14.664669494,14.664725041,14.6647805859,14.6648361287,14.6648916693,14.6649472078,14.6650027441,14.6650582783,14.6651138103,14.6651693403,14.665224868,14.6652803937, 14.6653359172,14.6653914386,14.6654469578,14.6655024749,14.6655579898,14.6656135027,14.6656690134,14.6657245219,14.6657800283,14.6658355326,14.6658910348,14.6659465348,14.6660020326,14.6660575284,14.666113022,14.6661685135, 14.6662240028,14.66627949,14.6663349751,14.666390458,14.6664459388,14.6665014175,14.666556894,14.6666123684,14.6666678407,14.6667233108,14.6667787788,14.6668342447,14.6668897084,14.66694517,14.6670006295,14.6670560869, 14.6671115421,14.6671669952,14.6672224461,14.6672778949,14.6673333416,14.6673887862,14.6674442286,14.6674996689,14.667555107,14.6676105431,14.667665977,14.6677214088,14.6677768384,14.6678322659,14.6678876913,14.6679431145, 14.6679985357,14.6680539547,14.6681093715,14.6681647863,14.6682201989,14.6682756094,14.6683310177,14.668386424,14.6684418281,14.66849723,14.6685526299,14.6686080276,14.6686634232,14.6687188166,14.668774208,14.6688295972, 14.6688849843,14.6689403692,14.6689957521,14.6690511328,14.6691065113,14.6691618878,14.6692172621,14.6692726343,14.6693280044,14.6693833723,14.6694387382,14.6694941019,14.6695494635,14.6696048229,14.6696601802,14.6697155354, 14.6697708885,14.6698262395,14.6698815883,14.669936935,14.6699922796,14.6700476221,14.6701029624,14.6701583006,14.6702136367,14.6702689707,14.6703243026,14.6703796323,14.6704349599,14.6704902854,14.6705456088,14.67060093, 14.6706562491,14.6707115661,14.670766881,14.6708221938,14.6708775044,14.6709328129,14.6709881193,14.6710434236,14.6710987257,14.6711540258,14.6712093237,14.6712646195,14.6713199132,14.6713752047,14.6714304942,14.6714857815, 14.6715410667,14.6715963498,14.6716516308,14.6717069096,14.6717621863,14.671817461,14.6718727335,14.6719280038,14.6719832721,14.6720385382,14.6720938023,14.6721490642,14.672204324,14.6722595816,14.6723148372,14.6723700906, 14.672425342,14.6724805912,14.6725358383,14.6725910833,14.6726463261,14.6727015669,14.6727568055,14.672812042,14.6728672764,14.6729225087,14.6729777389,14.673032967,14.6730881929,14.6731434167,14.6731986385,14.6732538581, 14.6733090756,14.6733642909,14.6734195042,14.6734747154,14.6735299244,14.6735851313,14.6736403361,14.6736955388,14.6737507394,14.6738059379,14.6738611343,14.6739163285,14.6739715207,14.6740267107,14.6740818986,14.6741370844, 14.6741922681,14.6742474497,14.6743026292,14.6743578066,14.6744129818,14.674468155,14.674523326,14.6745784949,14.6746336618,14.6746888265,14.6747439891,14.6747991496,14.6748543079,14.6749094642,14.6749646184,14.6750197704, 14.6750749204,14.6751300682,14.675185214,14.6752403576,14.6752954991,14.6753506385,14.6754057758,14.675460911,14.6755160441,14.6755711751,14.6756263039,14.6756814307,14.6757365554,14.6757916779,14.6758467984,14.6759019167, 14.6759570329,14.6760121471,14.6760672591,14.676122369,14.6761774768,14.6762325825,14.6762876861,14.6763427876,14.676397887,14.6764529843,14.6765080795,14.6765631726,14.6766182636,14.6766733525,14.6767284392,14.6767835239, 14.6768386065,14.6768936869,14.6769487653,14.6770038416,14.6770589157,14.6771139878,14.6771690577,14.6772241256,14.6772791913,14.677334255,14.6773893165,14.6774443759,14.6774994333,14.6775544885,14.6776095417,14.6776645927, 14.6777196416,14.6777746885,14.6778297332,14.6778847759,14.6779398164,14.6779948548,14.6780498912,14.6781049254,14.6781599575,14.6782149876,14.6782700155,14.6783250414,14.6783800651,14.6784350868,14.6784901063,14.6785451237, 14.6786001391,14.6786551524,14.6787101635,14.6787651726,14.6788201795,14.6788751844,14.6789301872,14.6789851878,14.6790401864,14.6790951829,14.6791501772,14.6792051695,14.6792601597,14.6793151478,14.6793701338,14.6794251177, 14.6794800995,14.6795350792,14.6795900568,14.6796450323,14.6797000058,14.6797549771,14.6798099463,14.6798649135,14.6799198785,14.6799748415,14.6800298023,14.6800847611,14.6801397178,14.6801946723,14.6802496248,14.6803045752, 14.6803595235,14.6804144697,14.6804694138,14.6805243559,14.6805792958,14.6806342336,14.6806891694,14.680744103,14.6807990346,14.680853964,14.6809088914,14.6809638167,14.6810187399,14.681073661,14.68112858,14.6811834969, 14.6812384118,14.6812933245,14.6813482352,14.6814031437,14.6814580502,14.6815129546,14.6815678569,14.6816227571,14.6816776552,14.6817325512,14.6817874452,14.681842337,14.6818972268,14.6819521145,14.682007,14.6820618835, 14.682116765,14.6821716443,14.6822265215,14.6822813967,14.6823362697,14.6823911407,14.6824460096,14.6825008764,14.6825557411,14.6826106037,14.6826654642,14.6827203227,14.6827751791,14.6828300333,14.6828848855,14.6829397357, 14.6829945837,14.6830494296,14.6831042735,14.6831591152,14.6832139549,14.6832687925,14.6833236281,14.6833784615,14.6834332928,14.6834881221,14.6835429493,14.6835977744,14.6836525974,14.6837074183,14.6837622372,14.6838170539, 14.6838718686,14.6839266812,14.6839814917,14.6840363002,14.6840911065,14.6841459108,14.684200713,14.6842555131,14.6843103111,14.6843651071,14.6844199009,14.6844746927,14.6845294824,14.68458427,14.6846390556,14.684693839, 14.6847486204,14.6848033997,14.6848581769,14.6849129521,14.6849677251,14.6850224961,14.685077265,14.6851320319,14.6851867966,14.6852415593,14.6852963198,14.6853510784,14.6854058348,14.6854605891,14.6855153414,14.6855700916, 14.6856248397,14.6856795858,14.6857343297,14.6857890716,14.6858438114,14.6858985492,14.6859532848,14.6860080184,14.6860627499,14.6861174793,14.6861722067,14.6862269319,14.6862816551,14.6863363763,14.6863910953,14.6864458123, 14.6865005272,14.68655524,14.6866099508,14.6866646594,14.686719366,14.6867740705,14.686828773,14.6868834734,14.6869381717,14.6869928679,14.6870475621,14.6871022541,14.6871569441,14.6872116321,14.6872663179,14.6873210017, 14.6873756834,14.6874303631,14.6874850407,14.6875397161,14.6875943896,14.6876490609,14.6877037302,14.6877583974,14.6878130626,14.6878677256,14.6879223866,14.6879770456,14.6880317024,14.6880863572,14.6881410099,14.6881956606, 14.6882503091,14.6883049556,14.6883596001,14.6884142424,14.6884688827,14.688523521,14.6885781571,14.6886327912,14.6886874232,14.6887420532,14.6887966811,14.6888513069,14.6889059306,14.6889605523,14.6890151719,14.6890697894, 14.6891244049,14.6891790183,14.6892336297,14.6892882389,14.6893428461,14.6893974513,14.6894520543,14.6895066553,14.6895612543,14.6896158512,14.689670446,14.6897250387,14.6897796294,14.689834218,14.6898888045,14.689943389, 14.6899979714,14.6900525518,14.6901071301,14.6901617063,14.6902162804,14.6902708525,14.6903254225,14.6903799905,14.6904345564,14.6904891202,14.690543682,14.6905982417,14.6906527993,14.6907073549,14.6907619084,14.6908164599, 14.6908710093,14.6909255566,14.6909801019,14.6910346451,14.6910891862,14.6911437253,14.6911982623,14.6912527973,14.6913073302,14.691361861,14.6914163898,14.6914709165,14.6915254412,14.6915799638,14.6916344843,14.6916890028, 14.6917435192,14.6917980335,14.6918525458,14.691907056,14.6919615642,14.6920160703,14.6920705744,14.6921250764,14.6921795763,14.6922340742,14.69228857,14.6923430638,14.6923975555,14.6924520451,14.6925065327,14.6925610182, 14.6926155017,14.6926699831,14.6927244625,14.6927789398,14.692833415,14.6928878882,14.6929423593,14.6929968284,14.6930512954,14.6931057604,14.6931602233,14.6932146841,14.6932691429,14.6933235996,14.6933780543,14.6934325069, 14.6934869575,14.693541406,14.6935958525,14.6936502969,14.6937047392,14.6937591795,14.6938136178,14.6938680539,14.6939224881,14.6939769202,14.6940313502,14.6940857782,14.6941402041,14.6941946279,14.6942490498,14.6943034695, 14.6943578872,14.6944123029,14.6944667165,14.694521128,14.6945755375,14.694629945,14.6946843504,14.6947387537,14.694793155,14.6948475542,14.6949019514,14.6949563466,14.6950107397,14.6950651307,14.6951195197,14.6951739066, 14.6952282915,14.6952826743,14.6953370551,14.6953914339,14.6954458105,14.6955001852,14.6955545578,14.6956089283,14.6956632968,14.6957176632,14.6957720276,14.69582639,14.6958807503,14.6959351085,14.6959894647,14.6960438189, 14.696098171,14.696152521,14.696206869,14.696261215,14.6963155589,14.6963699008,14.6964242406,14.6964785784,14.6965329141,14.6965872478,14.6966415794,14.696695909,14.6967502365,14.696804562,14.6968588855,14.6969132069, 14.6969675262,14.6970218435,14.6970761588,14.697130472,14.6971847832,14.6972390924,14.6972933995,14.6973477045,14.6974020075,14.6974563085,14.6975106074,14.6975649043,14.6976191991,14.6976734919,14.6977277826,14.6977820713, 14.697836358,14.6978906426,14.6979449251,14.6979992057,14.6980534842,14.6981077606,14.698162035,14.6982163074,14.6982705777,14.698324846,14.6983791122,14.6984333764,14.6984876386,14.6985418987,14.6985961567,14.6986504128, 14.6987046668,14.6987589187,14.6988131686,14.6988674165,14.6989216623,14.6989759061,14.6990301479,14.6990843876,14.6991386253,14.6991928609,14.6992470945,14.6993013261,14.6993555556,14.6994097831,14.6994640085,14.6995182319, 14.6995724533,14.6996266726,14.6996808899,14.6997351052,14.6997893184,14.6998435296,14.6998977387,14.6999519458,14.7000061509,14.7000603539,14.7001145549,14.7001687539,14.7002229508,14.7002771457,14.7003313385,14.7003855294, 14.7004397181,14.7004939049,14.7005480896,14.7006022723,14.7006564529,14.7007106315,14.7007648081,14.7008189826,14.7008731551,14.7009273256,14.700981494,14.7010356604,14.7010898248,14.7011439872,14.7011981475,14.7012523057, 14.701306462,14.7013606162,14.7014147683,14.7014689185,14.7015230666,14.7015772126,14.7016313567,14.7016854987,14.7017396387,14.7017937766,14.7018479125,14.7019020464,14.7019561783,14.7020103081,14.7020644359,14.7021185616, 14.7021726854,14.7022268071,14.7022809267,14.7023350444,14.70238916,14.7024432736,14.7024973851,14.7025514946,14.7026056021,14.7026597076,14.702713811,14.7027679124,14.7028220118,14.7028761091,14.7029302044,14.7029842977, 14.703038389,14.7030924782,14.7031465654,14.7032006506,14.7032547337,14.7033088149,14.703362894,14.703416971,14.7034710461,14.7035251191,14.7035791901,14.703633259,14.703687326,14.7037413909,14.7037954538,14.7038495146, 14.7039035734,14.7039576302,14.704011685,14.7040657378,14.7041197885,14.7041738372,14.7042278839,14.7042819286,14.7043359712,14.7043900118,14.7044440504,14.7044980869,14.7045521215,14.704606154,14.7046601845,14.7047142129, 14.7047682394,14.7048222638,14.7048762862,14.7049303065,14.7049843249,14.7050383412,14.7050923555,14.7051463678,14.7052003781,14.7052543863,14.7053083925,14.7053623967,14.7054163989,14.705470399,14.7055243972,14.7055783933, 14.7056323874,14.7056863794,14.7057403695,14.7057943575,14.7058483435,14.7059023275,14.7059563095,14.7060102894,14.7060642673,14.7061182432,14.7061722171,14.706226189,14.7062801588,14.7063341267,14.7063880925,14.7064420563, 14.7064960181,14.7065499778,14.7066039356,14.7066578913,14.706711845,14.7067657967,14.7068197463,14.706873694,14.7069276396,14.7069815832,14.7070355248,14.7070894644,14.707143402,14.7071973375,14.7072512711,14.7073052026, 14.7073591321,14.7074130596,14.707466985,14.7075209085,14.7075748299,14.7076287493,14.7076826668,14.7077365822,14.7077904955,14.7078444069,14.7078983162,14.7079522236,14.7080061289,14.7080600322,14.7081139335,14.7081678328, 14.70822173,14.7082756253,14.7083295185,14.7083834098,14.708437299,14.7084911862,14.7085450714,14.7085989545,14.7086528357,14.7087067148,14.708760592,14.7088144671,14.7088683402,14.7089222113,14.7089760804,14.7090299475, 14.7090838126,14.7091376756,14.7091915367,14.7092453957,14.7092992527,14.7093531077,14.7094069607,14.7094608117,14.7095146607,14.7095685077,14.7096223526,14.7096761956,14.7097300365,14.7097838755,14.7098377124,14.7098915473, 14.7099453802,14.7099992111,14.71005304,14.7101068669,14.7101606918,14.7102145147,14.7102683355,14.7103221544,14.7103759712,14.710429786,14.7104835989,14.7105374097,14.7105912185,14.7106450253,14.7106988301,14.7107526329, 14.7108064337,14.7108602325,14.7109140293,14.710967824,14.7110216168,14.7110754076,14.7111291963,14.7111829831,14.7112367678,14.7112905505,14.7113443313,14.71139811,14.7114518867,14.7115056614,14.7115594341,14.7116132049, 14.7116669736,14.7117207403,14.711774505,14.7118282677,14.7118820284,14.711935787,14.7119895437,14.7120432984,14.7120970511,14.7121508018,14.7122045504,14.7122582971,14.7123120418,14.7123657844,14.7124195251,14.7124732638, 14.7125270004,14.7125807351,14.7126344678,14.7126881984,14.7127419271,14.7127956537,14.7128493784,14.712903101,14.7129568217,14.7130105404,14.713064257,14.7131179717,14.7131716843,14.713225395,14.7132791036,14.7133328103, 14.7133865149,14.7134402176,14.7134939183,14.7135476169,14.7136013136,14.7136550082,14.7137087009,14.7137623916,14.7138160802,14.7138697669,14.7139234516,14.7139771343,14.7140308149,14.7140844936,14.7141381703,14.714191845, 14.7142455177,14.7142991884,14.7143528571,14.7144065238,14.7144601885,14.7145138512,14.7145675119,14.7146211706,14.7146748273,14.714728482,14.7147821348,14.7148357855,14.7148894342,14.714943081,14.7149967257,14.7150503685, 14.7151040092,14.715157648,14.7152112848,14.7152649195,14.7153185523,14.7153721831,14.7154258119,14.7154794387,14.7155330635,14.7155866863,14.7156403072,14.715693926,14.7157475428,14.7158011577,14.7158547705,14.7159083814, 14.7159619903,14.7160155971,14.716069202,14.7161228049,14.7161764058,14.7162300047,14.7162836016,14.7163371966,14.7163907895,14.7164443804,14.7164979694,14.7165515564,14.7166051413,14.7166587243,14.7167123053,14.7167658843, 14.7168194613,14.7168730364,14.7169266094,14.7169801804,14.7170337495,14.7170873166,14.7171408816,14.7171944447,14.7172480058,14.7173015649,14.7173551221,14.7174086772,14.7174622303,14.7175157815,14.7175693307,14.7176228779, 14.7176764231,14.7177299663,14.7177835075,14.7178370467,14.717890584,14.7179441193,14.7179976525,14.7180511838,14.7181047131,14.7181582404,14.7182117658,14.7182652891,14.7183188105,14.7183723299,14.7184258472,14.7184793626, 14.7185328761,14.7185863875,14.718639897,14.7186934044,14.7187469099,14.7188004134,14.7188539149,14.7189074144,14.718960912,14.7190144075,14.7190679011,14.7191213927,14.7191748823,14.71922837,14.7192818556,14.7193353393, 14.7193888209,14.7194423006,14.7194957784,14.7195492541,14.7196027278,14.7196561996,14.7197096694,14.7197631372,14.719816603,14.7198700669,14.7199235287,14.7199769886,14.7200304465,14.7200839024,14.7201373564,14.7201908083, 14.7202442583,14.7202977063,14.7203511523,14.7204045963,14.7204580384,14.7205114785,14.7205649166,14.7206183527,14.7206717868,14.720725219,14.7207786492,14.7208320774,14.7208855036,14.7209389278,14.7209923501,14.7210457704, 14.7210991887,14.721152605,14.7212060194,14.7212594318,14.7213128422,14.7213662506,14.721419657,14.7214730615,14.721526464,14.7215798645,14.7216332631,14.7216866596,14.7217400542,14.7217934468,14.7218468375,14.7219002261, 14.7219536128,14.7220069975,14.7220603802,14.722113761,14.7221671398,14.7222205166,14.7222738914,14.7223272643,14.7223806352,14.7224340041,14.722487371,14.722540736,14.722594099,14.72264746,14.722700819,14.7227541761, 14.7228075312,14.7228608843,14.7229142354,14.7229675846,14.7230209318,14.723074277,14.7231276203,14.7231809616,14.7232343009,14.7232876382,14.7233409736,14.723394307,14.7234476384,14.7235009679,14.7235542954,14.7236076209, 14.7236609444,14.723714266,14.7237675856,14.7238209032,14.7238742189,14.7239275326,14.7239808443,14.724034154,14.7240874618,14.7241407676,14.7241940714,14.7242473733,14.7243006732,14.7243539711,14.7244072671,14.7244605611, 14.7245138531,14.7245671432,14.7246204313,14.7246737174,14.7247270015,14.7247802837,14.7248335639,14.7248868422,14.7249401185,14.7249933928,14.7250466651,14.7250999355,14.7251532039,14.7252064704,14.7252597348,14.7253129973, 14.7253662579,14.7254195165,14.7254727731,14.7255260277,14.7255792804,14.7256325311,14.7256857799,14.7257390267,14.7257922715,14.7258455143,14.7258987552,14.7259519942,14.7260052311,14.7260584661,14.7261116992,14.7261649302, 14.7262181593,14.7262713865,14.7263246117,14.7263778349,14.7264310561,14.7264842754,14.7265374927,14.7265907081,14.7266439215,14.7266971329,14.7267503424,14.7268035499,14.7268567555,14.726909959,14.7269631607,14.7270163603, 14.727069558,14.7271227538,14.7271759475,14.7272291394,14.7272823292,14.7273355171,14.727388703,14.727441887,14.727495069,14.7275482491,14.7276014272,14.7276546033,14.7277077775,14.7277609497,14.7278141199,14.7278672882, 14.7279204546,14.7279736189,14.7280267814,14.7280799418,14.7281331003,14.7281862568,14.7282394114,14.728292564,14.7283457147,14.7283988634,14.7284520102,14.728505155,14.7285582978,14.7286114387,14.7286645776,14.7287177145, 14.7287708495,14.7288239826,14.7288771137,14.7289302428,14.72898337,14.7290364952,14.7290896185,14.7291427398,14.7291958591,14.7292489765,14.729302092,14.7293552055,14.729408317,14.7294614266,14.7295145342,14.7295676398, 14.7296207436,14.7296738453,14.7297269451,14.729780043,14.7298331388,14.7298862328,14.7299393248,14.7299924148,14.7300455029,14.730098589,14.7301516732,14.7302047554,14.7302578357,14.730310914,14.7303639903,14.7304170647, 14.7304701372,14.7305232077,14.7305762762,14.7306293428,14.7306824075,14.7307354702,14.7307885309,14.7308415897,14.7308946465,14.7309477014,14.7310007544,14.7310538054,14.7311068544,14.7311599015,14.7312129466,14.7312659898, 14.731319031,14.7313720703,14.7314251076,14.731478143,14.7315311765,14.7315842079,14.7316372375,14.7316902651,14.7317432907,14.7317963144,14.7318493361,14.7319023559,14.7319553738,14.7320083897,14.7320614036,14.7321144156, 14.7321674257,14.7322204338,14.7322734399,14.7323264441,14.7323794464,14.7324324467,14.7324854451,14.7325384415,14.732591436,14.7326444285,14.7326974191,14.7327504077,14.7328033944,14.7328563791,14.7329093619,14.7329623428, 14.7330153217,14.7330682986,14.7331212737,14.7331742467,14.7332272179,14.733280187,14.7333331543,14.7333861196,14.7334390829,14.7334920443,14.7335450038,14.7335979613,14.7336509168,14.7337038705,14.7337568221,14.7338097719, 14.7338627197,14.7339156655,14.7339686094,14.7340215514,14.7340744914,14.7341274295,14.7341803656,14.7342332998,14.7342862321,14.7343391624,14.7343920908,14.7344450172,14.7344979417,14.7345508642,14.7346037848,14.7346567035, 14.7347096202,14.734762535,14.7348154478,14.7348683587,14.7349212677,14.7349741747,14.7350270798,14.7350799829,14.7351328841,14.7351857834,14.7352386807,14.7352915761,14.7353444695,14.735397361,14.7354502506,14.7355031382, 14.7355560239,14.7356089077,14.7356617895,14.7357146693,14.7357675473,14.7358204233,14.7358732973,14.7359261694,14.7359790396,14.7360319079,14.7360847742,14.7361376385,14.736190501,14.7362433615,14.73629622,14.7363490766, 14.7364019313,14.7364547841,14.7365076349,14.7365604838,14.7366133307,14.7366661757,14.7367190188,14.7367718599,14.7368246991,14.7368775364,14.7369303717,14.7369832051,14.7370360365,14.7370888661,14.7371416937,14.7371945193, 14.737247343,14.7373001648,14.7373529847,14.7374058026,14.7374586186,14.7375114326,14.7375642447,14.7376170549,14.7376698632,14.7377226695,14.7377754739,14.7378282763,14.7378810769,14.7379338754,14.7379866721,14.7380394668, 14.7380922596,14.7381450505,14.7381978394,14.7382506264,14.7383034115,14.7383561946,14.7384089758,14.7384617551,14.7385145324,14.7385673078,14.7386200813,14.7386728529,14.7387256225,14.7387783902,14.7388311559,14.7388839198, 14.7389366817,14.7389894416,14.7390421997,14.7390949558,14.73914771,14.7392004622,14.7392532126,14.739305961,14.7393587074,14.739411452,14.7394641946,14.7395169353,14.739569674,14.7396224109,14.7396751458,14.7397278787, 14.7397806098,14.7398333389,14.7398860661,14.7399387913,14.7399915147,14.7400442361,14.7400969556,14.7401496731,14.7402023888,14.7402551025,14.7403078143,14.7403605241,14.740413232,14.740465938,14.7405186421,14.7405713443, 14.7406240445,14.7406767428,14.7407294392,14.7407821336,14.7408348261,14.7408875167,14.7409402054,14.7409928922,14.741045577,14.7410982599,14.7411509409,14.74120362,14.7412562971,14.7413089723,14.7413616456,14.741414317, 14.7414669864,14.7415196539,14.7415723195,14.7416249832,14.7416776449,14.7417303048,14.7417829627,14.7418356187,14.7418882727,14.7419409249,14.7419935751,14.7420462234,14.7420988698,14.7421515142,14.7422041568,14.7422567974, 14.7423094361,14.7423620729,14.7424147077,14.7424673406,14.7425199717,14.7425726008,14.7426252279,14.7426778532,14.7427304765,14.7427830979,14.7428357174,14.742888335,14.7429409507,14.7429935644,14.7430461762,14.7430987861, 14.7431513941,14.7432040002,14.7432566043,14.7433092066,14.7433618069,14.7434144053,14.7434670017,14.7435195963,14.7435721889,14.7436247797,14.7436773685,14.7437299554,14.7437825403,14.7438351234,14.7438877045,14.7439402838, 14.7439928611,14.7440454365,14.7440980099,14.7441505815,14.7442031511,14.7442557189,14.7443082847,14.7443608486,14.7444134106,14.7444659706,14.7445185288,14.744571085,14.7446236393,14.7446761918,14.7447287422,14.7447812908, 14.7448338375,14.7448863823,14.7449389251,14.744991466,14.745044005,14.7450965421,14.7451490773,14.7452016106,14.745254142,14.7453066714,14.7453591989,14.7454117246,14.7454642483,14.7455167701,14.74556929,14.7456218079, 14.745674324,14.7457268382,14.7457793504,14.7458318607,14.7458843691,14.7459368756,14.7459893802,14.7460418829,14.7460943837,14.7461468826,14.7461993795,14.7462518746,14.7463043677,14.7463568589,14.7464093482,14.7464618356, 14.7465143211,14.7465668047,14.7466192864,14.7466717662,14.746724244,14.74677672,14.746829194,14.7468816661,14.7469341364,14.7469866047,14.7470390711,14.7470915356,14.7471439982,14.7471964589,14.7472489176,14.7473013745, 14.7473538295,14.7474062825,14.7474587337,14.7475111829,14.7475636303,14.7476160757,14.7476685192,14.7477209608,14.7477734005,14.7478258383,14.7478782742,14.7479307082,14.7479831403,14.7480355705,14.7480879988,14.7481404251, 14.7481928496,14.7482452721,14.7482976928,14.7483501116,14.7484025284,14.7484549433,14.7485073564,14.7485597675,14.7486121767,14.7486645841,14.7487169895,14.748769393,14.7488217946,14.7488741943,14.7489265921,14.748978988, 14.749031382,14.7490837741,14.7491361643,14.7491885526,14.749240939,14.7492933235,14.7493457061,14.7493980868,14.7494504656,14.7495028425,14.7495552174,14.7496075905,14.7496599617,14.749712331,14.7497646983,14.7498170638, 14.7498694274,14.7499217891,14.7499741488,14.7500265067,14.7500788627,14.7501312168,14.7501835689,14.7502359192,14.7502882676,14.7503406141,14.7503929586,14.7504453013,14.7504976421,14.750549981,14.750602318,14.750654653, 14.7507069862,14.7507593175,14.7508116469,14.7508639744,14.7509163,14.7509686237,14.7510209455,14.7510732654,14.7511255834,14.7511778995,14.7512302137,14.751282526,14.7513348364,14.7513871449,14.7514394515,14.7514917563, 14.7515440591,14.75159636,14.7516486591,14.7517009562,14.7517532514,14.7518055448,14.7518578362,14.7519101258,14.7519624135,14.7520146992,14.7520669831,14.7521192651,14.7521715452,14.7522238234,14.7522760996,14.752328374, 14.7523806466,14.7524329172,14.7524851859,14.7525374527,14.7525897176,14.7526419807,14.7526942418,14.7527465011,14.7527987584,14.7528510139,14.7529032675,14.7529555192,14.7530077689,14.7530600168,14.7531122628,14.753164507, 14.7532167492,14.7532689895,14.7533212279,14.7533734645,14.7534256991,14.7534779319,14.7535301628,14.7535823918,14.7536346189,14.7536868441,14.7537390674,14.7537912888,14.7538435083,14.753895726,14.7539479417,14.7540001556, 14.7540523675,14.7541045776,14.7541567858,14.7542089921,14.7542611965,14.754313399,14.7543655997,14.7544177984,14.7544699953,14.7545221902,14.7545743833,14.7546265745,14.7546787638,14.7547309512,14.7547831368,14.7548353204, 14.7548875022,14.754939682,14.75499186,14.7550440361,14.7550962103,14.7551483826,14.7552005531,14.7552527216,14.7553048883,14.755357053,14.7554092159,14.7554613769,14.755513536,14.7555656933,14.7556178486,14.7556700021, 14.7557221536,14.7557743033,14.7558264511,14.7558785971,14.7559307411,14.7559828832,14.7560350235,14.7560871619,14.7561392984,14.756191433,14.7562435657,14.7562956966,14.7563478255,14.7563999526,14.7564520778,14.7565042011, 14.7565563225,14.7566084421,14.7566605597,14.7567126755,14.7567647894,14.7568169014,14.7568690115,14.7569211198,14.7569732262,14.7570253307,14.7570774333,14.757129534,14.7571816328,14.7572337298,14.7572858249,14.7573379181, 14.7573900094,14.7574420988,14.7574941864,14.757546272,14.7575983558,14.7576504377,14.7577025178,14.7577545959,14.7578066722,14.7578587466,14.7579108191,14.7579628897,14.7580149585,14.7580670254,14.7581190904,14.7581711535, 14.7582232147,14.7582752741,14.7583273316,14.7583793872,14.7584314409,14.7584834927,14.7585355427,14.7585875908,14.758639637,14.7586916814,14.7587437238,14.7587957644,14.7588478031,14.7588998399,14.7589518749,14.759003908, 14.7590559392,14.7591079685,14.7591599959,14.7592120215,14.7592640452,14.759316067,14.7593680869,14.759420105,14.7594721212,14.7595241355,14.759576148,14.7596281585,14.7596801672,14.759732174,14.759784179,14.759836182, 14.7598881832,14.7599401825,14.75999218,14.7600441755,14.7600961692,14.7601481611,14.760200151,14.7602521391,14.7603041253,14.7603561096,14.7604080921,14.7604600726,14.7605120514,14.7605640282,14.7606160032,14.7606679762, 14.7607199475,14.7607719168,14.7608238843,14.7608758499,14.7609278136,14.7609797755,14.7610317355,14.7610836936,14.7611356498,14.7611876042,14.7612395567,14.7612915073,14.7613434561,14.761395403,14.761447348,14.7614992912, 14.7615512324,14.7616031719,14.7616551094,14.7617070451,14.7617589789,14.7618109108,14.7618628409,14.7619147691,14.7619666954,14.7620186198,14.7620705424,14.7621224631,14.762174382,14.762226299,14.7622782141,14.7623301273, 14.7623820387,14.7624339482,14.7624858559,14.7625377616,14.7625896655,14.7626415676,14.7626934678,14.7627453661,14.7627972625,14.7628491571,14.7629010498,14.7629529406,14.7630048296,14.7630567167,14.7631086019,14.7631604853, 14.7632123668,14.7632642465,14.7633161242,14.7633680001,14.7634198742,14.7634717464,14.7635236167,14.7635754851,14.7636273517,14.7636792164,14.7637310793,14.7637829403,14.7638347994,14.7638866567,14.7639385121,14.7639903656, 14.7640422173,14.7640940671,14.7641459151,14.7641977611,14.7642496054,14.7643014477,14.7643532882,14.7644051269,14.7644569636,14.7645087985,14.7645606316,14.7646124628,14.7646642921,14.7647161195,14.7647679451,14.7648197689, 14.7648715907,14.7649234107,14.7649752289,14.7650270452,14.7650788596,14.7651306722,14.7651824829,14.7652342917,14.7652860987,14.7653379038,14.7653897071,14.7654415085,14.7654933081,14.7655451058,14.7655969016,14.7656486955, 14.7657004877,14.7657522779,14.7658040663,14.7658558528,14.7659076375,14.7659594203,14.7660112013,14.7660629803,14.7661147576,14.766166533,14.7662183065,14.7662700781,14.766321848,14.7663736159,14.766425382,14.7664771462, 14.7665289086,14.7665806691,14.7666324278,14.7666841846,14.7667359395,14.7667876926,14.7668394439,14.7668911932,14.7669429408,14.7669946864,14.7670464302,14.7670981722,14.7671499123,14.7672016505,14.7672533869,14.7673051214, 14.7673568541,14.7674085849,14.7674603139,14.767512041,14.7675637663,14.7676154897,14.7676672112,14.7677189309,14.7677706488,14.7678223648,14.7678740789,14.7679257912,14.7679775016,14.7680292102,14.7680809169,14.7681326218, 14.7681843248,14.7682360259,14.7682877252,14.7683394227,14.7683911183,14.7684428121,14.768494504,14.768546194,14.7685978822,14.7686495685,14.768701253,14.7687529357,14.7688046165,14.7688562954,14.7689079725,14.7689596477, 14.7690113211,14.7690629926,14.7691146623,14.7691663301,14.7692179961,14.7692696603,14.7693213225,14.769372983,14.7694246416,14.7694762983,14.7695279532,14.7695796062,14.7696312574,14.7696829067,14.7697345542,14.7697861998, 14.7698378436,14.7698894856,14.7699411257,14.7699927639,14.7700444003,14.7700960348,14.7701476675,14.7701992984,14.7702509274,14.7703025546,14.7703541799,14.7704058033,14.7704574249,14.7705090447,14.7705606626,14.7706122787, 14.7706638929,14.7707155053,14.7707671158,14.7708187245,14.7708703314,14.7709219364,14.7709735395,14.7710251408,14.7710767403,14.7711283379,14.7711799336,14.7712315276,14.7712831196,14.7713347099,14.7713862983,14.7714378848, 14.7714894695,14.7715410524,14.7715926334,14.7716442125,14.7716957899,14.7717473653,14.771798939,14.7718505108,14.7719020807,14.7719536488,14.7720052151,14.7720567795,14.7721083421,14.7721599028,14.7722114617,14.7722630187, 14.7723145739,14.7723661273,14.7724176788,14.7724692285,14.7725207763,14.7725723223,14.7726238665,14.7726754088,14.7727269492,14.7727784879,14.7728300247,14.7728815596,14.7729330927,14.772984624,14.7730361534,14.773087681, 14.7731392067,14.7731907306,14.7732422527,14.7732937729,14.7733452913,14.7733968078,14.7734483225,14.7734998354,14.7735513464,14.7736028556,14.773654363,14.7737058685,14.7737573721,14.773808874,14.773860374,14.7739118721, 14.7739633684,14.7740148629,14.7740663556,14.7741178464,14.7741693353,14.7742208224,14.7742723077,14.7743237912,14.7743752728,14.7744267526,14.7744782305,14.7745297066,14.7745811809,14.7746326533,14.7746841239,14.7747355927, 14.7747870596,14.7748385247,14.7748899879,14.7749414494,14.7749929089,14.7750443667,14.7750958226,14.7751472767,14.7751987289,14.7752501793,14.7753016279,14.7753530746,14.7754045195,14.7754559626,14.7755074038,14.7755588432, 14.7756102808,14.7756617165,14.7757131504,14.7757645824,14.7758160127,14.7758674411,14.7759188676,14.7759702924,14.7760217153,14.7760731363,14.7761245555,14.7761759729,14.7762273885,14.7762788022,14.7763302141,14.7763816242, 14.7764330324,14.7764844388,14.7765358434,14.7765872462,14.7766386471,14.7766900462,14.7767414434,14.7767928388,14.7768442324,14.7768956242,14.7769470141,14.7769984022,14.7770497884,14.7771011729,14.7771525555,14.7772039362, 14.7772553152,14.7773066923,14.7773580676,14.777409441,14.7774608127,14.7775121825,14.7775635504,14.7776149166,14.7776662809,14.7777176434,14.777769004,14.7778203628,14.7778717198,14.777923075,14.7779744283,14.7780257799, 14.7780771295,14.7781284774,14.7781798234,14.7782311676,14.77828251,14.7783338505,14.7783851893,14.7784365262,14.7784878612,14.7785391945,14.7785905259,14.7786418555,14.7786931832,14.7787445092,14.7787958333,14.7788471556, 14.778898476,14.7789497946,14.7790011114,14.7790524264,14.7791037396,14.7791550509,14.7792063604,14.7792576681,14.779308974,14.779360278,14.7794115802,14.7794628806,14.7795141791,14.7795654759,14.7796167708,14.7796680639, 14.7797193551,14.7797706446,14.7798219322,14.779873218,14.779924502,14.7799757841,14.7800270644,14.7800783429,14.7801296196,14.7801808945,14.7802321675,14.7802834387,14.7803347081,14.7803859757,14.7804372414,14.7804885054, 14.7805397675,14.7805910278,14.7806422862,14.7806935429,14.7807447977,14.7807960507,14.7808473019,14.7808985512,14.7809497987,14.7810010445,14.7810522884,14.7811035304,14.7811547707,14.7812060091,14.7812572457,14.7813084805, 14.7813597135,14.7814109447,14.781462174,14.7815134015,14.7815646272,14.7816158511,14.7816670732,14.7817182934,14.7817695119,14.7818207285,14.7818719433,14.7819231562,14.7819743674,14.7820255767,14.7820767842,14.7821279899, 14.7821791938,14.7822303959,14.7822815961,14.7823327946,14.7823839912,14.782435186,14.782486379,14.7825375701,14.7825887595,14.782639947,14.7826911327,14.7827423166,14.7827934987,14.782844679,14.7828958575,14.7829470341, 14.7829982089,14.7830493819,14.7831005531,14.7831517225,14.7832028901,14.7832540558,14.7833052197,14.7833563819,14.7834075422,14.7834587007,14.7835098573,14.7835610122,14.7836121653,14.7836633165,14.7837144659,14.7837656135, 14.7838167593,14.7838679033,14.7839190455,14.7839701858,14.7840213244,14.7840724611,14.784123596,14.7841747291,14.7842258604,14.7842769899,14.7843281176,14.7843792434,14.7844303675,14.7844814897,14.7845326101,14.7845837288, 14.7846348456,14.7846859605,14.7847370737,14.7847881851,14.7848392947,14.7848904024,14.7849415083,14.7849926125,14.7850437148,14.7850948153,14.785145914,14.7851970109,14.7852481059,14.7852991992,14.7853502907,14.7854013803, 14.7854524682,14.7855035542,14.7855546384,14.7856057208,14.7856568014,14.7857078802,14.7857589572,14.7858100324,14.7858611058,14.7859121773,14.7859632471,14.786014315,14.7860653812,14.7861164455,14.786167508,14.7862185687, 14.7862696276,14.7863206848,14.78637174,14.7864227935,14.7864738452,14.7865248951,14.7865759432,14.7866269894,14.7866780339,14.7867290765,14.7867801174,14.7868311564,14.7868821937,14.7869332291,14.7869842627,14.7870352945, 14.7870863246,14.7871373528,14.7871883792,14.7872394038,14.7872904266,14.7873414476,14.7873924667,14.7874434841,14.7874944997,14.7875455135,14.7875965254,14.7876475356,14.787698544,14.7877495505,14.7878005553,14.7878515582, 14.7879025594,14.7879535587,14.7880045563,14.788055552,14.788106546,14.7881575381,14.7882085284,14.788259517,14.7883105037,14.7883614886,14.7884124718,14.7884634531,14.7885144326,14.7885654103,14.7886163863,14.7886673604, 14.7887183327,14.7887693032,14.7888202719,14.7888712388,14.788922204,14.7889731673,14.7890241288,14.7890750885,14.7891260464,14.7891770025,14.7892279569,14.7892789094,14.7893298601,14.789380809,14.7894317561,14.7894827014, 14.789533645,14.7895845867,14.7896355266,14.7896864647,14.7897374011,14.7897883356,14.7898392683,14.7898901993,14.7899411284,14.7899920557,14.7900429813,14.790093905,14.7901448269,14.7901957471,14.7902466654,14.790297582, 14.7903484968,14.7903994097,14.7904503209,14.7905012302,14.7905521378,14.7906030436,14.7906539476,14.7907048497,14.7907557501,14.7908066487,14.7908575455,14.7909084405,14.7909593337,14.7910102251,14.7910611147,14.7911120025, 14.7911628886,14.7912137728,14.7912646552,14.7913155359,14.7913664147,14.7914172917,14.791468167,14.7915190405,14.7915699121,14.791620782,14.7916716501,14.7917225164,14.7917733809,14.7918242436,14.7918751045,14.7919259636, 14.7919768209,14.7920276764,14.7920785302,14.7921293821,14.7921802323,14.7922310806,14.7922819272,14.792332772,14.7923836149,14.7924344561,14.7924852955,14.7925361331,14.7925869689,14.792637803,14.7926886352,14.7927394656, 14.7927902943,14.7928411212,14.7928919462,14.7929427695,14.792993591,14.7930444107,14.7930952286,14.7931460447,14.7931968591,14.7932476716,14.7932984824,14.7933492913,14.7934000985,14.7934509039,14.7935017075,14.7935525093, 14.7936033093,14.7936541075,14.7937049039,14.7937556986,14.7938064915,14.7938572825,14.7939080718,14.7939588593,14.794009645,14.7940604289,14.7941112111,14.7941619914,14.79421277,14.7942635468,14.7943143217,14.7943650949, 14.7944158664,14.794466636,14.7945174038,14.7945681699,14.7946189341,14.7946696966,14.7947204573,14.7947712162,14.7948219733,14.7948727287,14.7949234822,14.794974234,14.795024984,14.7950757322,14.7951264786,14.7951772232, 14.795227966,14.7952787071,14.7953294464,14.7953801838,14.7954309195,14.7954816535,14.7955323856,14.7955831159,14.7956338445,14.7956845713,14.7957352963,14.7957860195,14.7958367409,14.7958874606,14.7959381784,14.7959888945, 14.7960396088,14.7960903213,14.7961410321,14.796191741,14.7962424482,14.7962931536,14.7963438572,14.796394559,14.7964452591,14.7964959573,14.7965466538,14.7965973485,14.7966480414,14.7966987325,14.7967494219,14.7968001095, 14.7968507953,14.7969014793,14.7969521615,14.797002842,14.7970535206,14.7971041975,14.7971548726,14.797205546,14.7972562175,14.7973068873,14.7973575553,14.7974082215,14.7974588859,14.7975095486,14.7975602094,14.7976108685, 14.7976615259,14.7977121814,14.7977628352,14.7978134871,14.7978641373,14.7979147858,14.7979654324,14.7980160773,14.7980667204,14.7981173617,14.7981680012,14.798218639,14.7982692749,14.7983199092,14.7983705416,14.7984211722, 14.7984718011,14.7985224282,14.7985730535,14.7986236771,14.7986742988,14.7987249188,14.798775537,14.7988261535,14.7988767681,14.798927381,14.7989779921,14.7990286015,14.799079209,14.7991298148,14.7991804188,14.7992310211, 14.7992816215,14.7993322202,14.7993828171,14.7994334123,14.7994840056,14.7995345972,14.799585187,14.7996357751,14.7996863613,14.7997369458,14.7997875285,14.7998381095,14.7998886887,14.7999392661,14.7999898417,14.8000404155, 14.8000909876,14.8001415579,14.8001921265,14.8002426932,14.8002932582,14.8003438214,14.8003943829,14.8004449426,14.8004955005,14.8005460566,14.800596611,14.8006471635,14.8006977144,14.8007482634,14.8007988107,14.8008493562, 14.8008998999,14.8009504419,14.8010009821,14.8010515205,14.8011020571,14.801152592,14.8012031251,14.8012536565,14.801304186,14.8013547139,14.8014052399,14.8014557641,14.8015062866,14.8015568074,14.8016073263,14.8016578435, 14.8017083589,14.8017588726,14.8018093844,14.8018598946,14.8019104029,14.8019609095,14.8020114143,14.8020619173,14.8021124186,14.8021629181,14.8022134158,14.8022639118,14.802314406,14.8023648984,14.8024153891,14.802465878, 14.8025163651,14.8025668505,14.8026173341,14.8026678159,14.802718296,14.8027687743,14.8028192508,14.8028697256,14.8029201986,14.8029706698,14.8030211393,14.803071607,14.8031220729,14.8031725371,14.8032229995,14.8032734602, 14.803323919,14.8033743762,14.8034248315,14.8034752851,14.8035257369,14.803576187,14.8036266353,14.8036770818,14.8037275266,14.8037779696,14.8038284108,14.8038788503,14.803929288,14.8039797239,14.8040301581,14.8040805905, 14.8041310212,14.8041814501,14.8042318772,14.8042823026,14.8043327262,14.804383148,14.8044335681,14.8044839864,14.804534403,14.8045848178,14.8046352308,14.8046856421,14.8047360516,14.8047864594,14.8048368654,14.8048872696, 14.8049376721,14.8049880728,14.8050384717,14.8050888689,14.8051392643,14.805189658,14.8052400499,14.80529044,14.8053408284,14.805391215,14.8054415999,14.805491983,14.8055423644,14.8055927439,14.8056431218,14.8056934978, 14.8057438722,14.8057942447,14.8058446155,14.8058949845,14.8059453518,14.8059957173,14.8060460811,14.8060964431,14.8061468033,14.8061971618,14.8062475185,14.8062978735,14.8063482267,14.8063985782,14.8064489279,14.8064992758, 14.806549622,14.8065999664,14.8066503091,14.80670065,14.8067509891,14.8068013265,14.8068516622,14.8069019961,14.8069523282,14.8070026586,14.8070529872,14.8071033141,14.8071536392,14.8072039625,14.8072542841,14.807304604, 14.8073549221,14.8074052384,14.807455553,14.8075058658,14.8075561769,14.8076064862,14.8076567937,14.8077070995,14.8077574036,14.8078077059,14.8078580064,14.8079083052,14.8079586023,14.8080088975,14.8080591911,14.8081094828, 14.8081597729,14.8082100611,14.8082603477,14.8083106324,14.8083609154,14.8084111967,14.8084614762,14.808511754,14.80856203,14.8086123042,14.8086625767,14.8087128475,14.8087631165,14.8088133837,14.8088636492,14.8089139129, 14.8089641749,14.8090144352,14.8090646936,14.8091149504,14.8091652054,14.8092154586,14.8092657101,14.8093159598,14.8093662078,14.8094164541,14.8094666985,14.8095169413,14.8095671823,14.8096174215,14.809667659,14.8097178947, 14.8097681287,14.809818361,14.8098685914,14.8099188202,14.8099690472,14.8100192724,14.8100694959,14.8101197177,14.8101699377,14.8102201559,14.8102703724,14.8103205872,14.8103708002,14.8104210114,14.810471221,14.8105214287, 14.8105716347,14.810621839,14.8106720415,14.8107222423,14.8107724413,14.8108226386,14.8108728342,14.810923028,14.81097322,14.8110234103,14.8110735989,14.8111237857,14.8111739707,14.811224154,14.8112743356,14.8113245154, 14.8113746935,14.8114248698,14.8114750444,14.8115252173,14.8115753884,14.8116255577,14.8116757253,14.8117258912,14.8117760553,14.8118262177,14.8118763783,14.8119265372,14.8119766944,14.8120268498,14.8120770034,14.8121271553, 14.8121773055,14.8122274539,14.8122776006,14.8123277456,14.8123778888,14.8124280302,14.8124781699,14.8125283079,14.8125784441,14.8126285786,14.8126787114,14.8127288424,14.8127789716,14.8128290991,14.8128792249,14.812929349, 14.8129794713,14.8130295918,14.8130797106,14.8131298277,14.813179943,14.8132300566,14.8132801685,14.8133302786,14.8133803869,14.8134304936,14.8134805984,14.8135307016,14.813580803,14.8136309027,14.8136810006,14.8137310968, 14.8137811912,14.8138312839,14.8138813749,14.8139314641,14.8139815516,14.8140316374,14.8140817214,14.8141318037,14.8141818842,14.814231963,14.81428204,14.8143321154,14.814382189,14.8144322608,14.8144823309,14.8145323993, 14.8145824659,14.8146325308,14.814682594,14.8147326554,14.8147827151,14.814832773,14.8148828292,14.8149328837,14.8149829364,14.8150329874,14.8150830367,14.8151330842,14.81518313,14.8152331741,14.8152832164,14.815333257, 14.8153832958,14.8154333329,14.8154833683,14.8155334019,14.8155834339,14.815633464,14.8156834925,14.8157335192,14.8157835441,14.8158335674,14.8158835889,14.8159336086,14.8159836267,14.8160336429,14.8160836575,14.8161336703, 14.8161836814,14.8162336908,14.8162836984,14.8163337043,14.8163837085,14.8164337109,14.8164837116,14.8165337106,14.8165837078,14.8166337033,14.816683697,14.8167336891,14.8167836794,14.8168336679,14.8168836548,14.8169336399, 14.8169836233,14.8170336049,14.8170835848,14.817133563,14.8171835394,14.8172335141,14.8172834871,14.8173334584,14.8173834279,14.8174333957,14.8174833617,14.8175333261,14.8175832887,14.8176332495,14.8176832087,14.8177331661, 14.8177831218,14.8178330757,14.8178830279,14.8179329784,14.8179829272,14.8180328742,14.8180828195,14.8181327631,14.8181827049,14.8182326451,14.8182825835,14.8183325201,14.818382455,14.8184323882,14.8184823197,14.8185322495, 14.8185821775,14.8186321038,14.8186820283,14.8187319512,14.8187818723,14.8188317917,14.8188817093,14.8189316252,14.8189815394,14.8190314519,14.8190813626,14.8191312717,14.819181179,14.8192310845,14.8192809884,14.8193308905, 14.8193807909,14.8194306895,14.8194805865,14.8195304817,14.8195803752,14.8196302669,14.8196801569,14.8197300453,14.8197799318,14.8198298167,14.8198796998,14.8199295812,14.8199794609,14.8200293389,14.8200792151,14.8201290896, 14.8201789624,14.8202288335,14.8202787028,14.8203285704,14.8203784363,14.8204283005,14.8204781629,14.8205280237,14.8205778827,14.8206277399,14.8206775955,14.8207274493,14.8207773014,14.8208271518,14.8208770005,14.8209268474, 14.8209766926,14.8210265361,14.8210763779,14.8211262179,14.8211760563,14.8212258929,14.8212757278,14.8213255609,14.8213753924,14.8214252221,14.8214750501,14.8215248764,14.8215747009,14.8216245238,14.8216743449,14.8217241643, 14.821773982,14.8218237979,14.8218736122,14.8219234247,14.8219732355,14.8220230446,14.8220728519,14.8221226576,14.8221724615,14.8222222637,14.8222720642,14.8223218629,14.82237166,14.8224214553,14.8224712489,14.8225210408, 14.822570831,14.8226206194,14.8226704061,14.8227201911,14.8227699744,14.822819756,14.8228695359,14.822919314,14.8229690905,14.8230188652,14.8230686382,14.8231184094,14.823168179,14.8232179468,14.8232677129,14.8233174774, 14.82336724,14.823417001,14.8234667603,14.8235165178,14.8235662736,14.8236160278,14.8236657801,14.8237155308,14.8237652798,14.823815027,14.8238647726,14.8239145164,14.8239642585,14.8240139989,14.8240637375,14.8241134745, 14.8241632097,14.8242129433,14.8242626751,14.8243124052,14.8243621336,14.8244118602,14.8244615852,14.8245113084,14.82456103,14.8246107498,14.8246604679,14.8247101843,14.824759899,14.8248096119,14.8248593232,14.8249090327, 14.8249587405,14.8250084466,14.825058151,14.8251078537,14.8251575547,14.825207254,14.8252569515,14.8253066474,14.8253563415,14.8254060339,14.8254557246,14.8255054136,14.8255551009,14.8256047864,14.8256544703,14.8257041524, 14.8257538329,14.8258035116,14.8258531886,14.8259028639,14.8259525375,14.8260022094,14.8260518796,14.826101548,14.8261512148,14.8262008798,14.8262505432,14.8263002048,14.8263498647,14.8263995229,14.8264491794,14.8264988342, 14.8265484873,14.8265981387,14.8266477883,14.8266974363,14.8267470825,14.8267967271,14.8268463699,14.826896011,14.8269456504,14.8269952881,14.8270449241,14.8270945584,14.827144191,14.8271938219,14.827243451,14.8272930785, 14.8273427042,14.8273923283,14.8274419506,14.8274915712,14.8275411902,14.8275908074,14.8276404229,14.8276900367,14.8277396488,14.8277892592,14.8278388679,14.8278884749,14.8279380801,14.8279876837,14.8280372856,14.8280868857, 14.8281364842,14.8281860809,14.828235676,14.8282852693,14.828334861,14.8283844509,14.8284340391,14.8284836256,14.8285332105,14.8285827936,14.828632375,14.8286819547,14.8287315327,14.828781109,14.8288306836,14.8288802565, 14.8289298277,14.8289793971,14.8290289649,14.829078531,14.8291280954,14.829177658,14.829227219,14.8292767783,14.8293263358,14.8293758917,14.8294254459,14.8294749983,14.8295245491,14.8295740981,14.8296236455,14.8296731911, 14.8297227351,14.8297722773,14.8298218179,14.8298713567,14.8299208939,14.8299704293,14.8300199631,14.8300694951,14.8301190254,14.8301685541,14.830218081,14.8302676063,14.8303171298,14.8303666517,14.8304161718,14.8304656902, 14.830515207,14.830564722,14.8306142354,14.830663747,14.830713257,14.8307627652,14.8308122717,14.8308617766,14.8309112797,14.8309607812,14.8310102809,14.831059779,14.8311092754,14.83115877,14.831208263,14.8312577542, 14.8313072438,14.8313567317,14.8314062178,14.8314557023,14.8315051851,14.8315546662,14.8316041455,14.8316536232,14.8317030992,14.8317525735,14.8318020461,14.831851517,14.8319009862,14.8319504537,14.8319999195,14.8320493836, 14.832098846,14.8321483068,14.8321977658,14.8322472231,14.8322966787,14.8323461327,14.8323955849,14.8324450355,14.8324944843,14.8325439315,14.832593377,14.8326428207,14.8326922628,14.8327417032,14.8327911419,14.8328405789, 14.8328900142,14.8329394478,14.8329888797,14.8330383099,14.8330877384,14.8331371653,14.8331865904,14.8332360138,14.8332854356,14.8333348556,14.833384274,14.8334336907,14.8334831057,14.8335325189,14.8335819305,14.8336313404, 14.8336807487,14.8337301552,14.83377956,14.8338289631,14.8338783646,14.8339277643,14.8339771624,14.8340265588,14.8340759534,14.8341253464,14.8341747377,14.8342241273,14.8342735152,14.8343229015,14.834372286,14.8344216688, 14.83447105,14.8345204294,14.8345698072,14.8346191833,14.8346685577,14.8347179304,14.8347673014,14.8348166707,14.8348660384,14.8349154043,14.8349647686,14.8350141311,14.835063492,14.8351128512,14.8351622087,14.8352115645, 14.8352609186,14.8353102711,14.8353596218,14.8354089709,14.8354583182,14.8355076639,14.8355570079,14.8356063502,14.8356556908,14.8357050298,14.835754367,14.8358037026,14.8358530364,14.8359023686,14.8359516991,14.8360010279, 14.8360503551,14.8360996805,14.8361490042,14.8361983263,14.8362476467,14.8362969654,14.8363462824,14.8363955977,14.8364449113,14.8364942233,14.8365435336,14.8365928421,14.836642149,14.8366914542,14.8367407578,14.8367900596, 14.8368393597,14.8368886582,14.836937955,14.8369872501,14.8370365435,14.8370858352,14.8371351253,14.8371844137,14.8372337003,14.8372829853,14.8373322686,14.8373815503,14.8374308302,14.8374801085,14.8375293851,14.83757866, 14.8376279332,14.8376772047,14.8377264745,14.8377757427,14.8378250092,14.837874274,14.8379235371,14.8379727986,14.8380220583,14.8380713164,14.8381205728,14.8381698275,14.8382190805,14.8382683318,14.8383175815,14.8383668295, 14.8384160758,14.8384653204,14.8385145634,14.8385638046,14.8386130442,14.8386622821,14.8387115183,14.8387607529,14.8388099857,14.8388592169,14.8389084464,14.8389576742,14.8390069003,14.8390561248,14.8391053476,14.8391545687, 14.8392037881,14.8392530058,14.8393022219,14.8393514363,14.839400649,14.83944986,14.8394990694,14.839548277,14.839597483,14.8396466873,14.83969589,14.8397450909,14.8397942902,14.8398434878,14.8398926837,14.839941878, 14.8399910705,14.8400402614,14.8400894506,14.8401386382,14.840187824,14.8402370082,14.8402861907,14.8403353716,14.8403845507,14.8404337282,14.840482904,14.8405320781,14.8405812506,14.8406304213,14.8406795904,14.8407287578, 14.8407779236,14.8408270877,14.8408762501,14.8409254108,14.8409745698,14.8410237272,14.8410728829,14.8411220369,14.8411711892,14.8412203399,14.8412694889,14.8413186362,14.8413677819,14.8414169259,14.8414660682,14.8415152088, 14.8415643477,14.841613485,14.8416626206,14.8417117545,14.8417608868,14.8418100174,14.8418591463,14.8419082735,14.8419573991,14.842006523,14.8420556452,14.8421047658,14.8421538846,14.8422030018,14.8422521174,14.8423012312, 14.8423503434,14.8423994539,14.8424485628,14.8424976699,14.8425467754,14.8425958793,14.8426449814,14.8426940819,14.8427431807,14.8427922779,14.8428413733,14.8428904672,14.8429395593,14.8429886497,14.8430377385,14.8430868257, 14.8431359111,14.8431849949,14.843234077,14.8432831574,14.8433322362,14.8433813133,14.8434303888,14.8434794625,14.8435285346,14.843577605,14.8436266738,14.8436757409,14.8437248063,14.84377387,14.8438229321,14.8438719925, 14.8439210513,14.8439701084,14.8440191638,14.8440682175,14.8441172696,14.84416632,14.8442153687,14.8442644158,14.8443134612,14.8443625049,14.844411547,14.8444605874,14.8445096261,14.8445586632,14.8446076986,14.8446567323, 14.8447057644,14.8447547948,14.8448038235,14.8448528506,14.844901876,14.8449508998,14.8449999218,14.8450489422,14.845097961,14.845146978,14.8451959935,14.8452450072,14.8452940193,14.8453430297,14.8453920384,14.8454410455, 14.8454900509,14.8455390547,14.8455880568,14.8456370572,14.845686056,14.8457350531,14.8457840485,14.8458330423,14.8458820344,14.8459310248,14.8459800136,14.8460290007,14.8460779862,14.84612697,14.8461759521,14.8462249325, 14.8462739113,14.8463228885,14.846371864,14.8464208378,14.8464698099,14.8465187804,14.8465677492,14.8466167164,14.8466656819,14.8467146457,14.8467636079,14.8468125684,14.8468615273,14.8469104845,14.84695944,14.8470083939, 14.8470573461,14.8471062966,14.8471552455,14.8472041928,14.8472531383,14.8473020822,14.8473510245,14.8473999651,14.847448904,14.8474978412,14.8475467769,14.8475957108,14.8476446431,14.8476935737,14.8477425027,14.84779143, 14.8478403556,14.8478892796,14.8479382019,14.8479871226,14.8480360416,14.848084959,14.8481338747,14.8481827887,14.8482317011,14.8482806118,14.8483295209,14.8483784283,14.848427334,14.8484762381,14.8485251405,14.8485740413, 14.8486229404,14.8486718379,14.8487207337,14.8487696278,14.8488185203,14.8488674111,14.8489163003,14.8489651878,14.8490140737,14.8490629579,14.8491118404,14.8491607213,14.8492096006,14.8492584781,14.8493073541,14.8493562283, 14.8494051009,14.8494539719,14.8495028412,14.8495517088,14.8496005748,14.8496494392,14.8496983019,14.8497471629,14.8497960222,14.84984488,14.849893736,14.8499425904,14.8499914432,14.8500402943,14.8500891437,14.8501379915, 14.8501868376,14.8502356821,14.850284525,14.8503333661,14.8503822057,14.8504310435,14.8504798797,14.8505287143,14.8505775472,14.8506263785,14.8506752081,14.850724036,14.8507728623,14.850821687,14.85087051,14.8509193313, 14.850968151,14.851016969,14.8510657854,14.8511146001,14.8511634132,14.8512122247,14.8512610344,14.8513098426,14.851358649,14.8514074539,14.851456257,14.8515050586,14.8515538584,14.8516026567,14.8516514532,14.8517002481, 14.8517490414,14.851797833,14.851846623,14.8518954113,14.851944198,14.851992983,14.8520417664,14.8520905481,14.8521393282,14.8521881066,14.8522368834,14.8522856585,14.852334432,14.8523832038,14.852431974,14.8524807425, 14.8525295094,14.8525782746,14.8526270382,14.8526758002,14.8527245604,14.8527733191,14.8528220761,14.8528708314,14.8529195851,14.8529683372,14.8530170876,14.8530658363,14.8531145834,14.8531633289,14.8532120727,14.8532608149, 14.8533095554,14.8533582943,14.8534070315,14.8534557671,14.853504501,14.8535532333,14.853601964,14.8536506929,14.8536994203,14.853748146,14.8537968701,14.8538455925,14.8538943132,14.8539430324,14.8539917498,14.8540404657, 14.8540891799,14.8541378924,14.8541866033,14.8542353126,14.8542840202,14.8543327261,14.8543814305,14.8544301331,14.8544788342,14.8545275336,14.8545762313,14.8546249274,14.8546736219,14.8547223147,14.8547710058,14.8548196954, 14.8548683833,14.8549170695,14.8549657541,14.8550144371,14.8550631184,14.855111798,14.8551604761,14.8552091525,14.8552578272,14.8553065003,14.8553551718,14.8554038416,14.8554525097,14.8555011763,14.8555498412,14.8555985044, 14.855647166,14.855695826,14.8557444843,14.855793141,14.855841796,14.8558904495,14.8559391012,14.8559877513,14.8560363998,14.8560850467,14.8561336919,14.8561823354,14.8562309773,14.8562796176,14.8563282563,14.8563768933, 14.8564255286,14.8564741623,14.8565227944,14.8565714249,14.8566200537,14.8566686808,14.8567173064,14.8567659303,14.8568145525,14.8568631731,14.8569117921,14.8569604094,14.8570090251,14.8570576392,14.8571062516,14.8571548624, 14.8572034715,14.857252079,14.8573006849,14.8573492891,14.8573978917,14.8574464927,14.857495092,14.8575436897,14.8575922857,14.8576408801,14.8576894729,14.857738064,14.8577866535,14.8578352414,14.8578838276,14.8579324122, 14.8579809951,14.8580295764,14.8580781561,14.8581267342,14.8581753106,14.8582238853,14.8582724585,14.85832103,14.8583695999,14.8584181681,14.8584667347,14.8585152996,14.858563863,14.8586124247,14.8586609847,14.8587095431, 14.8587580999,14.8588066551,14.8588552086,14.8589037605,14.8589523108,14.8590008594,14.8590494064,14.8590979517,14.8591464954,14.8591950375,14.859243578,14.8592921168,14.859340654,14.8593891895,14.8594377234,14.8594862557, 14.8595347864,14.8595833154,14.8596318428,14.8596803686,14.8597288927,14.8597774152,14.859825936,14.8598744553,14.8599229729,14.8599714888,14.8600200032,14.8600685159,14.8601170269,14.8601655364,14.8602140442,14.8602625504, 14.8603110549,14.8603595578,14.8604080591,14.8604565588,14.8605050568,14.8605535532,14.860602048,14.8606505411,14.8606990326,14.8607475225,14.8607960107,14.8608444974,14.8608929823,14.8609414657,14.8609899474,14.8610384275, 14.861086906,14.8611353828,14.861183858,14.8612323316,14.8612808036,14.8613292739,14.8613777426,14.8614262097,14.8614746751,14.8615231389,14.8615716011,14.8616200617,14.8616685206,14.8617169779,14.8617654336,14.8618138876, 14.8618623401,14.8619107909,14.86195924,14.8620076876,14.8620561335,14.8621045778,14.8621530204,14.8622014614,14.8622499009,14.8622983386,14.8623467748,14.8623952093,14.8624436422,14.8624920735,14.8625405031,14.8625889312, 14.8626373576,14.8626857823,14.8627342055,14.862782627,14.8628310469,14.8628794652,14.8629278818,14.8629762968,14.8630247102,14.863073122,14.8631215322,14.8631699407,14.8632183476,14.8632667529,14.8633151565,14.8633635585, 14.8634119589,14.8634603577,14.8635087549,14.8635571504,14.8636055443,14.8636539366,14.8637023273,14.8637507163,14.8637991037,14.8638474895,14.8638958737,14.8639442562,14.8639926372,14.8640410165,14.8640893942,14.8641377702, 14.8641861447,14.8642345175,14.8642828887,14.8643312582,14.8643796262,14.8644279925,14.8644763572,14.8645247203,14.8645730818,14.8646214416,14.8646697998,14.8647181564,14.8647665114,14.8648148648,14.8648632165,14.8649115666, 14.8649599151,14.865008262,14.8650566073,14.8651049509,14.8651532929,14.8652016333,14.8652499721,14.8652983093,14.8653466448,14.8653949787,14.865443311,14.8654916417,14.8655399708,14.8655882982,14.8656366241,14.8656849483, 14.8657332709,14.8657815918,14.8658299112,14.8658782289,14.865926545,14.8659748595,14.8660231724,14.8660714837,14.8661197933,14.8661681013,14.8662164077,14.8662647125,14.8663130157,14.8663613173,14.8664096172,14.8664579155, 14.8665062122,14.8665545073,14.8666028008,14.8666510926,14.8666993829,14.8667476715,14.8667959585,14.8668442439,14.8668925277,14.8669408098,14.8669890904,14.8670373693,14.8670856466,14.8671339223,14.8671821964,14.8672304689, 14.8672787397,14.8673270089,14.8673752766,14.8674235426,14.867471807,14.8675200697,14.8675683309,14.8676165904,14.8676648484,14.8677131047,14.8677613594,14.8678096125,14.867857864,14.8679061138,14.8679543621,14.8680026087, 14.8680508537,14.8680990972,14.868147339,14.8681955791,14.8682438177,14.8682920547,14.86834029,14.8683885237,14.8684367559,14.8684849864,14.8685332153,14.8685814425,14.8686296682,14.8686778923,14.8687261147,14.8687743356, 14.8688225548,14.8688707724,14.8689189884,14.8689672028,14.8690154156,14.8690636267,14.8691118363,14.8691600442,14.8692082506,14.8692564553,14.8693046584,14.8693528599,14.8694010598,14.8694492581,14.8694974547,14.8695456498, 14.8695938432,14.8696420351,14.8696902253,14.8697384139,14.8697866009,14.8698347863,14.8698829701,14.8699311523,14.8699793329,14.8700275119,14.8700756892,14.870123865,14.8701720391,14.8702202116,14.8702683826,14.8703165519, 14.8703647196,14.8704128857,14.8704610502,14.8705092131,14.8705573743,14.870605534,14.8706536921,14.8707018485,14.8707500033,14.8707981566,14.8708463082,14.8708944582,14.8709426066,14.8709907535,14.8710388987,14.8710870423, 14.8711351842,14.8711833246,14.8712314634,14.8712796006,14.8713277361,14.8713758701,14.8714240024,14.8714721332,14.8715202623,14.8715683899,14.8716165158,14.8716646401,14.8717127628,14.8717608839,14.8718090035,14.8718571214, 14.8719052377,14.8719533524,14.8720014654,14.8720495769,14.8720976868,14.8721457951,14.8721939018,14.8722420068,14.8722901103,14.8723382121,14.8723863124,14.8724344111,14.8724825081,14.8725306036,14.8725786974,14.8726267896, 14.8726748803,14.8727229693,14.8727710567,14.8728191426,14.8728672268,14.8729153094,14.8729633904,14.8730114698,14.8730595477,14.8731076239,14.8731556985,14.8732037715,14.8732518429,14.8732999127,14.8733479809,14.8733960475, 14.8734441125,14.8734921759,14.8735402377,14.8735882979,14.8736363565,14.8736844135,14.8737324689,14.8737805227,14.8738285749,14.8738766255,14.8739246745,14.8739727219,14.8740207677,14.8740688119,14.8741168544,14.8741648954, 14.8742129348,14.8742609726,14.8743090088,14.8743570434,14.8744050764,14.8744531078,14.8745011376,14.8745491658,14.8745971924,14.8746452174,14.8746932408,14.8747412626,14.8747892828,14.8748373014,14.8748853184,14.8749333338, 14.8749813477,14.8750293599,14.8750773705,14.8751253795,14.8751733869,14.8752213928,14.875269397,14.8753173996,14.8753654006,14.8754134001,14.8754613979,14.8755093942,14.8755573888,14.8756053819,14.8756533733,14.8757013632, 14.8757493514,14.8757973381,14.8758453232,14.8758933066,14.8759412885,14.8759892688,14.8760372475,14.8760852245,14.8761332,14.8761811739,14.8762291462,14.876277117,14.8763250861,14.8763730536,14.8764210195,14.8764689838, 14.8765169466,14.8765649077,14.8766128672,14.8766608252,14.8767087816,14.8767567363,14.8768046895,14.8768526411,14.876900591,14.8769485394,14.8769964862,14.8770444314,14.877092375,14.877140317,14.8771882575,14.8772361963, 14.8772841335,14.8773320692,14.8773800032,14.8774279357,14.8774758665,14.8775237958,14.8775717235,14.8776196496,14.8776675741,14.877715497,14.8777634183,14.877811338,14.8778592561,14.8779071727,14.8779550876,14.878003001, 14.8780509127,14.8780988229,14.8781467315,14.8781946385,14.8782425439,14.8782904477,14.8783383499,14.8783862505,14.8784341496,14.878482047,14.8785299429,14.8785778371,14.8786257298,14.8786736209,14.8787215104,14.8787693983, 14.8788172846,14.8788651693,14.8789130525,14.878960934,14.879008814,14.8790566924,14.8791045691,14.8791524443,14.8792003179,14.87924819,14.8792960604,14.8793439292,14.8793917965,14.8794396621,14.8794875262,14.8795353887, 14.8795832496,14.8796311089,14.8796789666,14.8797268228,14.8797746773,14.8798225303,14.8798703817,14.8799182315,14.8799660797,14.8800139263,14.8800617713,14.8801096147,14.8801574566,14.8802052969,14.8802531356,14.8803009726, 14.8803488082,14.8803966421,14.8804444744,14.8804923052,14.8805401343,14.8805879619,14.8806357879,14.8806836123,14.8807314351,14.8807792564,14.880827076,14.8808748941,14.8809227106,14.8809705255,14.8810183388,14.8810661505, 14.8811139607,14.8811617692,14.8812095762,14.8812573816,14.8813051854,14.8813529876,14.8814007883,14.8814485873,14.8814963848,14.8815441807,14.881591975,14.8816397677,14.8816875589,14.8817353484,14.8817831364,14.8818309228, 14.8818787076,14.8819264908,14.8819742725,14.8820220525,14.882069831,14.8821176079,14.8821653832,14.8822131569,14.8822609291,14.8823086997,14.8823564687,14.8824042361,14.8824520019,14.8824997661,14.8825475288,14.8825952899, 14.8826430494,14.8826908073,14.8827385636,14.8827863184,14.8828340715,14.8828818231,14.8829295732,14.8829773216,14.8830250684,14.8830728137,14.8831205574,14.8831682995,14.8832160401,14.883263779,14.8833115164,14.8833592522, 14.8834069864,14.883454719,14.8835024501,14.8835501796,14.8835979075,14.8836456338,14.8836933585,14.8837410817,14.8837888033,14.8838365233,14.8838842417,14.8839319585,14.8839796738,14.8840273875,14.8840750996,14.8841228102, 14.8841705191,14.8842182265,14.8842659323,14.8843136365,14.8843613392,14.8844090402,14.8844567397,14.8845044376,14.884552134,14.8845998288,14.8846475219,14.8846952135,14.8847429036,14.884790592,14.8848382789,14.8848859642, 14.8849336479,14.8849813301,14.8850290107,14.8850766897,14.8851243671,14.885172043,14.8852197172,14.8852673899,14.885315061,14.8853627306,14.8854103986,14.885458065,14.8855057298,14.885553393,14.8856010547,14.8856487148, 14.8856963733,14.8857440303,14.8857916857,14.8858393395,14.8858869917,14.8859346424,14.8859822914,14.8860299389,14.8860775849,14.8861252292,14.886172872,14.8862205132,14.8862681529,14.8863157909,14.8863634274,14.8864110624, 14.8864586957,14.8865063275,14.8865539577,14.8866015863,14.8866492134,14.8866968389,14.8867444628,14.8867920851,14.8868397059,14.8868873251,14.8869349427,14.8869825588,14.8870301732,14.8870777862,14.8871253975,14.8871730073, 14.8872206155,14.8872682221,14.8873158272,14.8873634306,14.8874110326,14.8874586329,14.8875062317,14.8875538289,14.8876014245,14.8876490186,14.8876966111,14.887744202,14.8877917913,14.8878393791,14.8878869653,14.88793455, 14.8879821331,14.8880297146,14.8880772945,14.8881248729,14.8881724497,14.8882200249,14.8882675986,14.8883151706,14.8883627412,14.8884103101,14.8884578775,14.8885054433,14.8885530076,14.8886005703,14.8886481314,14.8886956909, 14.8887432489,14.8887908053,14.8888383602,14.8888859134,14.8889334651,14.8889810153,14.8890285638,14.8890761109,14.8891236563,14.8891712002,14.8892187425,14.8892662832,14.8893138224,14.88936136,14.889408896,14.8894564305, 14.8895039634,14.8895514948,14.8895990245,14.8896465527,14.8896940794,14.8897416045,14.889789128,14.8898366499,14.8898841703,14.8899316891,14.8899792064,14.8900267221,14.8900742362,14.8901217487,14.8901692597,14.8902167692, 14.890264277,14.8903117833,14.8903592881,14.8904067912,14.8904542928,14.8905017929,14.8905492914,14.8905967883,14.8906442836,14.8906917774,14.8907392696,14.8907867603,14.8908342494,14.8908817369,14.8909292229,14.8909767073, 14.8910241901,14.8910716714,14.8911191512,14.8911666293,14.8912141059,14.8912615809,14.8913090544,14.8913565263,14.8914039967,14.8914514654,14.8914989327,14.8915463983,14.8915938624,14.891641325,14.8916887859,14.8917362454, 14.8917837032,14.8918311595,14.8918786142,14.8919260674,14.891973519,14.8920209691,14.8920684176,14.8921158645,14.8921633099,14.8922107537,14.8922581959,14.8923056366,14.8923530757,14.8924005133,14.8924479493,14.8924953838, 14.8925428166,14.892590248,14.8926376777,14.892685106,14.8927325326,14.8927799577,14.8928273812,14.8928748032,14.8929222236,14.8929696425,14.8930170598,14.8930644755,14.8931118897,14.8931593023,14.8932067134,14.8932541229, 14.8933015309,14.8933489373,14.8933963421,14.8934437454,14.8934911471,14.8935385472,14.8935859459,14.8936333429,14.8936807384,14.8937281323,14.8937755247,14.8938229155,14.8938703048,14.8939176925,14.8939650786,14.8940124632, 14.8940598463,14.8941072278,14.8941546077,14.8942019861,14.8942493629,14.8942967381,14.8943441118,14.894391484,14.8944388546,14.8944862236,14.8945335911,14.894580957,14.8946283214,14.8946756842,14.8947230455,14.8947704052, 14.8948177633,14.8948651199,14.8949124749,14.8949598284,14.8950071804,14.8950545307,14.8951018796,14.8951492268,14.8951965726,14.8952439167,14.8952912593,14.8953386004,14.8953859399,14.8954332778,14.8954806142,14.8955279491, 14.8955752824,14.8956226141,14.8956699443,14.8957172729,14.8957646,14.8958119255,14.8958592495,14.8959065719,14.8959538928,14.8960012121,14.8960485299,14.8960958461,14.8961431608,14.8961904739,14.8962377854,14.8962850955, 14.8963324039,14.8963797108,14.8964270162,14.89647432,14.8965216222,14.8965689229,14.8966162221,14.8966635197,14.8967108157,14.8967581102,14.8968054032,14.8968526946,14.8968999844,14.8969472727,14.8969945595,14.8970418447, 14.8970891283,14.8971364104,14.897183691,14.89723097,14.8972782474,14.8973255233,14.8973727977,14.8974200705,14.8974673417,14.8975146114,14.8975618796,14.8976091462,14.8976564113,14.8977036748,14.8977509367,14.8977981971, 14.897845456,14.8978927133,14.8979399691,14.8979872233,14.898034476,14.8980817271,14.8981289767,14.8981762247,14.8982234712,14.8982707162,14.8983179595,14.8983652014,14.8984124417,14.8984596804,14.8985069176,14.8985541533, 14.8986013874,14.89864862,14.898695851,14.8987430805,14.8987903084,14.8988375348,14.8988847596,14.8989319829,14.8989792046,14.8990264248,14.8990736435,14.8991208606,14.8991680761,14.8992152901,14.8992625026,14.8993097135, 14.8993569229,14.8994041308,14.899451337,14.8994985418,14.899545745,14.8995929467,14.8996401468,14.8996873453,14.8997345424,14.8997817378,14.8998289318,14.8998761242,14.899923315,14.8999705043,14.9000176921,14.9000648783, 14.900112063,14.9001592461,14.9002064277,14.9002536077,14.9003007862,14.9003479632,14.9003951386,14.9004423125,14.9004894848,14.9005366556,14.9005838249,14.9006309926,14.9006781587,14.9007253234,14.9007724864,14.900819648, 14.900866808,14.9009139664,14.9009611233,14.9010082787,14.9010554326,14.9011025848,14.9011497356,14.9011968848,14.9012440325,14.9012911786,14.9013383232,14.9013854662,14.9014326077,14.9014797477,14.9015268861,14.901574023, 14.9016211583,14.9016682922,14.9017154244,14.9017625551,14.9018096843,14.901856812,14.9019039381,14.9019510626,14.9019981857,14.9020453072,14.9020924271,14.9021395455,14.9021866624,14.9022337777,14.9022808915,14.9023280038, 14.9023751145,14.9024222237,14.9024693313,14.9025164374,14.902563542,14.902610645,14.9026577465,14.9027048464,14.9027519449,14.9027990417,14.9028461371,14.9028932309,14.9029403231,14.9029874139,14.903034503,14.9030815907, 14.9031286768,14.9031757614,14.9032228444,14.9032699259,14.9033170059,14.9033640843,14.9034111612,14.9034582366,14.9035053104,14.9035523827,14.9035994535,14.9036465227,14.9036935904,14.9037406565,14.9037877211,14.9038347842, 14.9038818457,14.9039289057,14.9039759642,14.9040230211,14.9040700765,14.9041171304,14.9041641827,14.9042112335,14.9042582828,14.9043053305,14.9043523767,14.9043994214,14.9044464645,14.9044935061,14.9045405462,14.9045875847, 14.9046346217,14.9046816571,14.904728691,14.9047757234,14.9048227543,14.9048697836,14.9049168114,14.9049638377,14.9050108624,14.9050578856,14.9051049072,14.9051519274,14.905198946,14.905245963,14.9052929786,14.9053399926, 14.905387005,14.905434016,14.9054810254,14.9055280332,14.9055750396,14.9056220444,14.9056690476,14.9057160494,14.9057630496,14.9058100483,14.9058570454,14.9059040411,14.9059510351,14.9059980277,14.9060450187,14.9060920082, 14.9061389962,14.9061859826,14.9062329675,14.9062799509,14.9063269328,14.9063739131,14.9064208919,14.9064678691,14.9065148448,14.906561819,14.9066087917,14.9066557629,14.9067027325,14.9067497005,14.9067966671,14.9068436321, 14.9068905956,14.9069375576,14.906984518,14.9070314769,14.9070784343,14.9071253901,14.9071723445,14.9072192973,14.9072662485,14.9073131983,14.9073601465,14.9074070932,14.9074540383,14.9075009819,14.907547924,14.9075948646, 14.9076418037,14.9076887412,14.9077356772,14.9077826116,14.9078295446,14.907876476,14.9079234059,14.9079703342,14.9080172611,14.9080641864,14.9081111101,14.9081580324,14.9082049531,14.9082518723,14.90829879,14.9083457062, 14.9083926208,14.9084395339,14.9084864454,14.9085333555,14.908580264,14.908627171,14.9086740765,14.9087209804,14.9087678828,14.9088147837,14.9088616831,14.908908581,14.9089554773,14.9090023721,14.9090492654,14.9090961571, 14.9091430473,14.909189936,14.9092368232,14.9092837089,14.909330593,14.9093774756,14.9094243567,14.9094712363,14.9095181143,14.9095649908,14.9096118658,14.9096587393,14.9097056112,14.9097524816,14.9097993505,14.9098462179, 14.9098930838,14.9099399481,14.9099868109,14.9100336722,14.910080532,14.9101273902,14.9101742469,14.9102211021,14.9102679558,14.910314808,14.9103616586,14.9104085077,14.9104553553,14.9105022014,14.9105490459,14.910595889, 14.9106427305,14.9106895705,14.9107364089,14.9107832459,14.9108300813,14.9108769152,14.9109237476,14.9109705785,14.9110174078,14.9110642356,14.9111110619,14.9111578867,14.91120471,14.9112515317,14.9112983519,14.9113451707, 14.9113919878,14.9114388035,14.9114856177,14.9115324303,14.9115792414,14.911626051,14.9116728591,14.9117196656,14.9117664707,14.9118132742,14.9118600762,14.9119068767,14.9119536756,14.9120004731,14.912047269,14.9120940634, 14.9121408563,14.9121876477,14.9122344375,14.9122812259,14.9123280127,14.912374798,14.9124215818,14.912468364,14.9125151448,14.912561924,14.9126087018,14.912655478,14.9127022526,14.9127490258,14.9127957975,14.9128425676, 14.9128893362,14.9129361033,14.9129828689,14.913029633,14.9130763956,14.9131231566,14.9131699161,14.9132166741,14.9132634306,14.9133101856,14.9133569391,14.913403691,14.9134504415,14.9134971904,14.9135439378,14.9135906837, 14.913637428,14.9136841709,14.9137309123,14.9137776521,14.9138243904,14.9138711272,14.9139178625,14.9139645963,14.9140113285,14.9140580593,14.9141047885,14.9141515162,14.9141982425,14.9142449671,14.9142916903,14.914338412, 14.9143851322,14.9144318508,14.9144785679,14.9145252835,14.9145719976,14.9146187102,14.9146654213,14.9147121309,14.9147588389,14.9148055455,14.9148522505,14.914898954,14.914945656,14.9149923565,14.9150390555,14.915085753, 14.915132449,14.9151791434,14.9152258363,14.9152725278,14.9153192177,14.9153659061,14.915412593,14.9154592784,14.9155059622,14.9155526446,14.9155993254,14.9156460048,14.9156926826,14.9157393589,14.9157860337,14.915832707, 14.9158793788,14.9159260491,14.9159727179,14.9160193851,14.9160660509,14.9161127151,14.9161593779,14.9162060391,14.9162526988,14.916299357,14.9163460137,14.9163926689,14.9164393226,14.9164859748,14.9165326254,14.9165792746, 14.9166259222,14.9166725683,14.916719213,14.9167658561,14.9168124977,14.9168591378,14.9169057764,14.9169524135,14.9169990491,14.9170456832,14.9170923157,14.9171389468,14.9171855763,14.9172322044,14.9172788309,14.917325456, 14.9173720795,14.9174187015,14.917465322,14.917511941,14.9175585585,14.9176051745,14.917651789,14.917698402,14.9177450134,14.9177916234,14.9178382319,14.9178848388,14.9179314443,14.9179780482,14.9180246507,14.9180712516, 14.918117851,14.918164449,14.9182110454,14.9182576403,14.9183042337,14.9183508256,14.918397416,14.9184440049,14.9184905923,14.9185371782,14.9185837626,14.9186303454,14.9186769268,14.9187235067,14.9187700851,14.9188166619, 14.9188632373,14.9189098111,14.9189563835,14.9190029543,14.9190495237,14.9190960915,14.9191426579,14.9191892227,14.919235786,14.9192823479,14.9193289082,14.919375467,14.9194220243,14.9194685802,14.9195151345,14.9195616873, 14.9196082386,14.9196547884,14.9197013367,14.9197478835,14.9197944288,14.9198409726,14.9198875149,14.9199340557,14.919980595,14.9200271328,14.9200736691,14.9201202039,14.9201667372,14.920213269,14.9202597993,14.9203063281, 14.9203528554,14.9203993812,14.9204459055,14.9204924283,14.9205389496,14.9205854694,14.9206319877,14.9206785045,14.9207250198,14.9207715335,14.9208180458,14.9208645566,14.9209110659,14.9209575737,14.92100408,14.9210505848, 14.9210970881,14.9211435899,14.9211900902,14.921236589,14.9212830863,14.9213295821,14.9213760764,14.9214225692,14.9214690605,14.9215155503,14.9215620387,14.9216085255,14.9216550108,14.9217014946,14.9217479769,14.9217944577, 14.9218409371,14.9218874149,14.9219338912,14.9219803661,14.9220268394,14.9220733112,14.9221197816,14.9221662504,14.9222127178,14.9222591836,14.922305648,14.9223521109,14.9223985722,14.9224450321,14.9224914905,14.9225379473, 14.9225844027,14.9226308566,14.922677309,14.9227237599,14.9227702093,14.9228166572,14.9228631036,14.9229095485,14.9229559919,14.9230024338,14.9230488743,14.9230953132,14.9231417506,14.9231881866,14.923234621,14.923281054, 14.9233274854,14.9233739154,14.9234203439,14.9234667708,14.9235131963,14.9235596203,14.9236060428,14.9236524638,14.9236988833,14.9237453013,14.9237917178,14.9238381329,14.9238845464,14.9239309584,14.923977369,14.924023778, 14.9240701856,14.9241165917,14.9241629962,14.9242093993,14.9242558009,14.924302201,14.9243485996,14.9243949967,14.9244413923,14.9244877865,14.9245341791,14.9245805703,14.9246269599,14.9246733481,14.9247197347,14.9247661199, 14.9248125036,14.9248588858,14.9249052665,14.9249516457,14.9249980234,14.9250443997,14.9250907744,14.9251371477,14.9251835194,14.9252298897,14.9252762585,14.9253226258,14.9253689916,14.9254153559,14.9254617187,14.92550808, 14.9255544399,14.9256007982,14.9256471551,14.9256935105,14.9257398643,14.9257862167,14.9258325676,14.925878917,14.925925265,14.9259716114,14.9260179564,14.9260642998,14.9261106418,14.9261569823,14.9262033213,14.9262496588, 14.9262959948,14.9263423293,14.9263886623,14.9264349939,14.926481324,14.9265276525,14.9265739796,14.9266203052,14.9266666293,14.926712952,14.9267592731,14.9268055928,14.9268519109,14.9268982276,14.9269445428,14.9269908565, 14.9270371687,14.9270834795,14.9271297887,14.9271760965,14.9272224027,14.9272687075,14.9273150108,14.9273613126,14.9274076129,14.9274539118,14.9275002091,14.927546505,14.9275927994,14.9276390923,14.9276853837,14.9277316736, 14.9277779621,14.927824249,14.9278705345,14.9279168185,14.927963101,14.928009382,14.9280556616,14.9281019396,14.9281482162,14.9281944912,14.9282407648,14.928287037,14.9283333076,14.9283795767,14.9284258444,14.9284721106, 14.9285183753,14.9285646385,14.9286109002,14.9286571604,14.9287034192,14.9287496765,14.9287959323,14.9288421866,14.9288884394,14.9289346907,14.9289809406,14.929027189,14.9290734359,14.9291196813,14.9291659252,14.9292121677, 14.9292584086,14.9293046481,14.9293508861,14.9293971226,14.9294433577,14.9294895912,14.9295358233,14.9295820539,14.929628283,14.9296745107,14.9297207368,14.9297669615,14.9298131847,14.9298594064,14.9299056266,14.9299518453, 14.9299980626,14.9300442784,14.9300904927,14.9301367055,14.9301829169,14.9302291267,14.9302753351,14.930321542,14.9303677474,14.9304139514,14.9304601538,14.9305063548,14.9305525543,14.9305987524,14.9306449489,14.930691144, 14.9307373376,14.9307835297,14.9308297203,14.9308759095,14.9309220971,14.9309682833,14.931014468,14.9310606513,14.931106833,14.9311530133,14.9311991921,14.9312453694,14.9312915453,14.9313377196,14.9313838925,14.931430064, 14.9314762339,14.9315224023,14.9315685693,14.9316147348,14.9316608989,14.9317070614,14.9317532225,14.9317993821,14.9318455402,14.9318916968,14.931937852,14.9319840057,14.9320301579,14.9320763086,14.9321224579,14.9321686057, 14.932214752,14.9322608968,14.9323070402,14.932353182,14.9323993224,14.9324454614,14.9324915988,14.9325377348,14.9325838693,14.9326300023,14.9326761339,14.9327222639,14.9327683925,14.9328145197,14.9328606453,14.9329067695, 14.9329528922,14.9329990134,14.9330451332,14.9330912515,14.9331373683,14.9331834836,14.9332295974,14.9332757098,14.9333218207,14.9333679302,14.9334140381,14.9334601446,14.9335062496,14.9335523532,14.9335984552,14.9336445558, 14.933690655,14.9337367526,14.9337828488,14.9338289435,14.9338750367,14.9339211285,14.9339672187,14.9340133076,14.9340593949,14.9341054808,14.9341515652,14.9341976481,14.9342437295,14.9342898095,14.934335888,14.9343819651, 14.9344280406,14.9344741147,14.9345201873,14.9345662585,14.9346123282,14.9346583964,14.9347044631,14.9347505284,14.9347965922,14.9348426545,14.9348887154,14.9349347747,14.9349808327,14.9350268891,14.9350729441,14.9351189976, 14.9351650496,14.9352111002,14.9352571493,14.9353031969,14.935349243,14.9353952877,14.9354413309,14.9354873727,14.935533413,14.9355794518,14.9356254891,14.935671525,14.9357175594,14.9357635923,14.9358096238,14.9358556537, 14.9359016823,14.9359477093,14.9359937349,14.936039759,14.9360857817,14.9361318029,14.9361778226,14.9362238408,14.9362698576,14.9363158729,14.9363618868,14.9364078991,14.93645391,14.9364999195,14.9365459275,14.936591934, 14.936637939,14.9366839426,14.9367299447,14.9367759453,14.9368219445,14.9368679422,14.9369139384,14.9369599332,14.9370059265,14.9370519184,14.9370979087,14.9371438976,14.9371898851,14.9372358711,14.9372818556,14.9373278386, 14.9373738202,14.9374198003,14.937465779,14.9375117561,14.9375577319,14.9376037061,14.9376496789,14.9376956502,14.9377416201,14.9377875885,14.9378335554,14.9378795209,14.9379254849,14.9379714474,14.9380174085,14.9380633681, 14.9381093262,14.9381552829,14.9382012381,14.9382471919,14.9382931442,14.938339095,14.9383850443,14.9384309922,14.9384769387,14.9385228836,14.9385688271,14.9386147692,14.9386607098,14.9387066489,14.9387525865,14.9387985227, 14.9388444575,14.9388903907,14.9389363225,14.9389822529,14.9390281818,14.9390741092,14.9391200351,14.9391659596,14.9392118827,14.9392578042,14.9393037243,14.939349643,14.9393955602,14.9394414759,14.9394873902,14.939533303, 14.9395792143,14.9396251242,14.9396710326,14.9397169396,14.9397628451,14.9398087491,14.9398546517,14.9399005528,14.9399464525,14.9399923507,14.9400382474,14.9400841427,14.9401300365,14.9401759288,14.9402218197,14.9402677092, 14.9403135971,14.9403594837,14.9404053687,14.9404512523,14.9404971345,14.9405430151,14.9405888944,14.9406347721,14.9406806484,14.9407265233,14.9407723967,14.9408182686,14.940864139,14.9409100081,14.9409558756,14.9410017417, 14.9410476063,14.9410934695,14.9411393312,14.9411851915,14.9412310503,14.9412769076,14.9413227635,14.941368618,14.9414144709,14.9414603225,14.9415061725,14.9415520211,14.9415978683,14.941643714,14.9416895582,14.941735401, 14.9417812423,14.9418270821,14.9418729205,14.9419187575,14.941964593,14.942010427,14.9420562596,14.9421020907,14.9421479204,14.9421937486,14.9422395754,14.9422854007,14.9423312245,14.9423770469,14.9424228678,14.9424686873, 14.9425145053,14.9425603219,14.942606137,14.9426519507,14.9426977629,14.9427435736,14.9427893829,14.9428351908,14.9428809972,14.9429268021,14.9429726056,14.9430184076,14.9430642082,14.9431100073,14.9431558049,14.9432016011, 14.9432473959,14.9432931892,14.943338981,14.9433847714,14.9434305604,14.9434763479,14.9435221339,14.9435679185,14.9436137016,14.9436594833,14.9437052635,14.9437510423,14.9437968196,14.9438425955,14.9438883699,14.9439341428, 14.9439799143,14.9440256844,14.944071453,14.9441172202,14.9441629859,14.9442087501,14.9442545129,14.9443002742,14.9443460341,14.9443917926,14.9444375496,14.9444833051,14.9445290592,14.9445748118,14.944620563,14.9446663128, 14.944712061,14.9447578079,14.9448035533,14.9448492972,14.9448950397,14.9449407807,14.9449865203,14.9450322584,14.9450779951,14.9451237303,14.9451694641,14.9452151965,14.9452609273,14.9453066568,14.9453523848,14.9453981113, 14.9454438364,14.94548956,14.9455352822,14.9455810029,14.9456267222,14.9456724401,14.9457181565,14.9457638714,14.9458095849,14.9458552969,14.9459010075,14.9459467167,14.9459924244,14.9460381307,14.9460838355,14.9461295388, 14.9461752407,14.9462209412,14.9462666402,14.9463123378,14.9463580339,14.9464037286,14.9464494218,14.9464951136,14.9465408039,14.9465864928,14.9466321802,14.9466778662,14.9467235507,14.9467692338,14.9468149155,14.9468605957, 14.9469062745,14.9469519518,14.9469976276,14.9470433021,14.947088975,14.9471346466,14.9471803166,14.9472259853,14.9472716525,14.9473173182,14.9473629825,14.9474086454,14.9474543068,14.9474999667,14.9475456252,14.9475912823, 14.947636938,14.9476825921,14.9477282449,14.9477738962,14.947819546,14.9478651944,14.9479108414,14.9479564869,14.948002131,14.9480477736,14.9480934148,14.9481390545,14.9481846928,14.9482303297,14.9482759651,14.9483215991, 14.9483672316,14.9484128627,14.9484584923,14.9485041205,14.9485497472,14.9485953726,14.9486409964,14.9486866188,14.9487322398,14.9487778594,14.9488234775,14.9488690941,14.9489147093,14.9489603231,14.9490059354,14.9490515463, 14.9490971557,14.9491427637,14.9491883703,14.9492339754,14.9492795791,14.9493251813,14.9493707821,14.9494163815,14.9494619794,14.9495075758,14.9495531709,14.9495987644,14.9496443566,14.9496899473,14.9497355366,14.9497811244, 14.9498267108,14.9498722957,14.9499178792,14.9499634613,14.9500090419,14.9500546211,14.9501001988,14.9501457751,14.95019135,14.9502369234,14.9502824954,14.9503280659,14.950373635,14.9504192027,14.9504647689,14.9505103337, 14.950555897,14.950601459,14.9506470194,14.9506925785,14.950738136,14.9507836922,14.9508292469,14.9508748002,14.950920352,14.9509659024,14.9510114514,14.9510569989,14.951102545,14.9511480896,14.9511936329,14.9512391746, 14.951284715,14.9513302539,14.9513757913,14.9514213273,14.9514668619,14.9515123951,14.9515579268,14.9516034571,14.9516489859,14.9516945133,14.9517400393,14.9517855638,14.9518310869,14.9518766085,14.9519221288,14.9519676475, 14.9520131649,14.9520586808,14.9521041953,14.9521497083,14.9521952199,14.9522407301,14.9522862388,14.9523317461,14.952377252,14.9524227564,14.9524682594,14.9525137609,14.9525592611,14.9526047597,14.952650257,14.9526957528, 14.9527412472,14.9527867401,14.9528322316,14.9528777217,14.9529232104,14.9529686976,14.9530141833,14.9530596677,14.9531051506,14.9531506321,14.9531961121,14.9532415907,14.9532870679,14.9533325436,14.9533780179,14.9534234908, 14.9534689622,14.9535144322,14.9535599008,14.9536053679,14.9536508336,14.9536962979,14.9537417608,14.9537872222,14.9538326821,14.9538781407,14.9539235978,14.9539690535,14.9540145077,14.9540599605,14.9541054119,14.9541508619, 14.9541963104,14.9542417575,14.9542872031,14.9543326474,14.9543780901,14.9544235315,14.9544689714,14.9545144099,14.954559847,14.9546052826,14.9546507168,14.9546961496,14.954741581,14.9547870109,14.9548324394,14.9548778664, 14.954923292,14.9549687162,14.955014139,14.9550595603,14.9551049802,14.9551503987,14.9551958157,14.9552412313,14.9552866455,14.9553320583,14.9553774696,14.9554228795,14.955468288,14.955513695,14.9555591006,14.9556045048, 14.9556499075,14.9556953088,14.9557407087,14.9557861072,14.9558315042,14.9558768998,14.955922294,14.9559676868,14.9560130781,14.956058468,14.9561038564,14.9561492435,14.9561946291,14.9562400133,14.956285396,14.9563307774, 14.9563761572,14.9564215357,14.9564669128,14.9565122884,14.9565576626,14.9566030353,14.9566484067,14.9566937766,14.9567391451,14.9567845121,14.9568298777,14.9568752419,14.9569206047,14.9569659661,14.957011326,14.9570566845, 14.9571020416,14.9571473972,14.9571927514,14.9572381042,14.9572834556,14.9573288055,14.957374154,14.9574195011,14.9574648468,14.957510191,14.9575555339,14.9576008753,14.9576462152,14.9576915538,14.9577368909,14.9577822266, 14.9578275608,14.9578728937,14.9579182251,14.9579635551,14.9580088837,14.9580542108,14.9580995365,14.9581448608,14.9581901837,14.9582355051,14.9582808252,14.9583261438,14.9583714609,14.9584167767,14.958462091,14.9585074039, 14.9585527154,14.9585980255,14.9586433341,14.9586886413,14.9587339471,14.9587792515,14.9588245545,14.958869856,14.9589151561,14.9589604548,14.959005752,14.9590510479,14.9590963423,14.9591416353,14.9591869268,14.959232217, 14.9592775057,14.959322793,14.9593680789,14.9594133634,14.9594586464,14.959503928,14.9595492082,14.959594487,14.9596397644,14.9596850403,14.9597303148,14.9597755879,14.9598208596,14.9598661298,14.9599113987,14.9599566661, 14.9600019321,14.9600471966,14.9600924598,14.9601377215,14.9601829818,14.9602282407,14.9602734982,14.9603187542,14.9603640089,14.9604092621,14.9604545139,14.9604997643,14.9605450132,14.9605902607,14.9606355069,14.9606807516, 14.9607259948,14.9607712367,14.9608164771,14.9608617162,14.9609069538,14.96095219,14.9609974247,14.9610426581,14.96108789,14.9611331205,14.9611783496,14.9612235773,14.9612688035,14.9613140284,14.9613592518,14.9614044738, 14.9614496944,14.9614949136,14.9615401313,14.9615853477,14.9616305626,14.9616757761,14.9617209882,14.9617661988,14.9618114081,14.9618566159,14.9619018223,14.9619470273,14.9619922309,14.9620374331,14.9620826339,14.9621278332, 14.9621730311,14.9622182276,14.9622634227,14.9623086164,14.9623538086,14.9623989995,14.9624441889,14.9624893769,14.9625345635,14.9625797487,14.9626249325,14.9626701148,14.9627152957,14.9627604753,14.9628056534,14.9628508301, 14.9628960053,14.9629411792,14.9629863516,14.9630315227,14.9630766923,14.9631218605,14.9631670273,14.9632121927,14.9632573566,14.9633025192,14.9633476803,14.96339284,14.9634379983,14.9634831552,14.9635283107,14.9635734648, 14.9636186174,14.9636637687,14.9637089185,14.9637540669,14.9637992139,14.9638443595,14.9638895037,14.9639346465,14.9639797878,14.9640249278,14.9640700663,14.9641152034,14.9641603391,14.9642054734,14.9642506063,14.9642957377, 14.9643408678,14.9643859964,14.9644311237,14.9644762495,14.9645213739,14.9645664969,14.9646116185,14.9646567387,14.9647018574,14.9647469748,14.9647920907,14.9648372052,14.9648823184,14.9649274301,14.9649725404,14.9650176493, 14.9650627567,14.9651078628,14.9651529675,14.9651980707,14.9652431726,14.965288273,14.965333372,14.9653784696,14.9654235658,14.9654686606,14.965513754,14.9655588459,14.9656039365,14.9656490257,14.9656941134,14.9657391997, 14.9657842847,14.9658293682,14.9658744503,14.965919531,14.9659646103,14.9660096882,14.9660547646,14.9660998397,14.9661449133,14.9661899856,14.9662350564,14.9662801259,14.9663251939,14.9663702605,14.9664153257,14.9664603895, 14.9665054519,14.9665505129,14.9665955725,14.9666406306,14.9666856874,14.9667307428,14.9667757967,14.9668208493,14.9668659004,14.9669109501,14.9669559984,14.9670010454,14.9670460909,14.967091135,14.9671361777,14.967181219, 14.9672262588,14.9672712973,14.9673163344,14.9673613701,14.9674064043,14.9674514372,14.9674964686,14.9675414987,14.9675865273,14.9676315545,14.9676765804,14.9677216048,14.9677666278,14.9678116494,14.9678566696,14.9679016884, 14.9679467058,14.9679917218,14.9680367364,14.9680817496,14.9681267614,14.9681717717,14.9682167807,14.9682617883,14.9683067944,14.9683517992,14.9683968025,14.9684418045,14.968486805,14.9685318042,14.9685768019,14.9686217983, 14.9686667932,14.9687117867,14.9687567789,14.9688017696,14.9688467589,14.9688917468,14.9689367333,14.9689817184,14.9690267022,14.9690716845,14.9691166654,14.9691616449,14.969206623,14.9692515997,14.969296575,14.9693415489, 14.9693865213,14.9694314924,14.9694764621,14.9695214304,14.9695663973,14.9696113628,14.9696563269,14.9697012895,14.9697462508,14.9697912107,14.9698361692,14.9698811262,14.9699260819,14.9699710362,14.9700159891,14.9700609405, 14.9701058906,14.9701508393,14.9701957866,14.9702407324,14.9702856769,14.97033062,14.9703755616,14.9704205019,14.9704654408,14.9705103783,14.9705553143,14.970600249,14.9706451823,14.9706901141,14.9707350446,14.9707799737, 14.9708249014,14.9708698276,14.9709147525,14.970959676,14.9710045981,14.9710495188,14.971094438,14.9711393559,14.9711842724,14.9712291875,14.9712741012,14.9713190135,14.9713639244,14.9714088339,14.971453742,14.9714986487, 14.971543554,14.9715884579,14.9716333604,14.9716782615,14.9717231612,14.9717680595,14.9718129564,14.9718578519,14.971902746,14.9719476388,14.9719925301,14.97203742,14.9720823086,14.9721271957,14.9721720814,14.9722169658, 14.9722618487,14.9723067303,14.9723516104,14.9723964892,14.9724413666,14.9724862425,14.9725311171,14.9725759903,14.9726208621,14.9726657324,14.9727106014,14.972755469,14.9728003352,14.9728452,14.9728900634,14.9729349254, 14.9729797861,14.9730246453,14.9730695031,14.9731143596,14.9731592146,14.9732040682,14.9732489205,14.9732937713,14.9733386208,14.9733834689,14.9734283155,14.9734731608,14.9735180047,14.9735628472,14.9736076883,14.973652528, 14.9736973663,14.9737422032,14.9737870387,14.9738318729,14.9738767056,14.973921537,14.9739663669,14.9740111955,14.9740560226,14.9741008484,14.9741456728,14.9741904958,14.9742353174,14.9742801376,14.9743249564,14.9743697738, 14.9744145898,14.9744594044,14.9745042177,14.9745490295,14.97459384,14.974638649,14.9746834567,14.974728263,14.9747730679,14.9748178714,14.9748626735,14.9749074742,14.9749522735,14.9749970715,14.975041868,14.9750866632, 14.9751314569,14.9751762493,14.9752210403,14.9752658299,14.9753106181,14.9753554049,14.9754001903,14.9754449743,14.9754897569,14.9755345382,14.975579318,14.9756240965,14.9756688736,14.9757136493,14.9757584236,14.9758031965, 14.975847968,14.9758927381,14.9759375069,14.9759822742,14.9760270402,14.9760718048,14.9761165679,14.9761613297,14.9762060901,14.9762508492,14.9762956068,14.976340363,14.9763851179,14.9764298714,14.9764746234,14.9765193741, 14.9765641234,14.9766088713,14.9766536179,14.976698363,14.9767431067,14.9767878491,14.9768325901,14.9768773297,14.9769220679,14.9769668047,14.9770115401,14.9770562741,14.9771010068,14.977145738,14.9771904679,14.9772351964, 14.9772799235,14.9773246492,14.9773693735,14.9774140965,14.977458818,14.9775035382,14.977548257,14.9775929744,14.9776376904,14.977682405,14.9777271183,14.9777718301,14.9778165406,14.9778612497,14.9779059574,14.9779506637, 14.9779953686,14.9780400722,14.9780847743,14.9781294751,14.9781741745,14.9782188725,14.9782635691,14.9783082643,14.9783529582,14.9783976506,14.9784423417,14.9784870314,14.9785317197,14.9785764066,14.9786210922,14.9786657763, 14.9787104591,14.9787551405,14.9787998205,14.9788444991,14.9788891764,14.9789338522,14.9789785267,14.9790231998,14.9790678715,14.9791125418,14.9791572107,14.9792018783,14.9792465445,14.9792912093,14.9793358727,14.9793805347, 14.9794251953,14.9794698546,14.9795145125,14.979559169,14.9796038241,14.9796484778,14.9796931302,14.9797377811,14.9797824307,14.9798270789,14.9798717257,14.9799163712,14.9799610152,14.9800056579,14.9800502992,14.9800949391, 14.9801395776,14.9801842148,14.9802288506,14.9802734849,14.980318118,14.9803627496,14.9804073798,14.9804520087,14.9804966362,14.9805412623,14.980585887,14.9806305104,14.9806751323,14.9807197529,14.9807643721,14.9808089899, 14.9808536064,14.9808982214,14.9809428351,14.9809874474,14.9810320584,14.9810766679,14.9811212761,14.9811658829,14.9812104883,14.9812550923,14.981299695,14.9813442962,14.9813888961,14.9814334946,14.9814780918,14.9815226875, 14.9815672819,14.9816118749,14.9816564665,14.9817010568,14.9817456456,14.9817902331,14.9818348192,14.981879404,14.9819239873,14.9819685693,14.9820131499,14.9820577291,14.982102307,14.9821468834,14.9821914585,14.9822360322, 14.9822806046,14.9823251755,14.9823697451,14.9824143133,14.9824588801,14.9825034456,14.9825480097,14.9825925723,14.9826371337,14.9826816936,14.9827262522,14.9827708094,14.9828153652,14.9828599196,14.9829044727,14.9829490244, 14.9829935747,14.9830381236,14.9830826712,14.9831272174,14.9831717622,14.9832163056,14.9832608477,14.9833053884,14.9833499277,14.9833944656,14.9834390022,14.9834835374,14.9835280712,14.9835726036,14.9836171347,14.9836616643, 14.9837061927,14.9837507196,14.9837952452,14.9838397693,14.9838842922,14.9839288136,14.9839733337,14.9840178524,14.9840623697,14.9841068856,14.9841514002,14.9841959134,14.9842404252,14.9842849357,14.9843294448,14.9843739525, 14.9844184588,14.9844629638,14.9845074673,14.9845519696,14.9845964704,14.9846409699,14.984685468,14.9847299647,14.98477446,14.984818954,14.9848634466,14.9849079379,14.9849524277,14.9849969162,14.9850414033,14.9850858891, 14.9851303735,14.9851748565,14.9852193381,14.9852638184,14.9853082973,14.9853527748,14.9853972509,14.9854417257,14.9854861991,14.9855306711,14.9855751418,14.9856196111,14.985664079,14.9857085456,14.9857530108,14.9857974746, 14.985841937,14.9858863981,14.9859308578,14.9859753161,14.9860197731,14.9860642287,14.9861086829,14.9861531357,14.9861975872,14.9862420373,14.9862864861,14.9863309334,14.9863753794,14.9864198241,14.9864642673,14.9865087092, 14.9865531498,14.9865975889,14.9866420267,14.9866864631,14.9867308982,14.9867753319,14.9868197642,14.9868641951,14.9869086247,14.9869530529,14.9869974797,14.9870419052,14.9870863293,14.9871307521,14.9871751734,14.9872195934, 14.9872640121,14.9873084293,14.9873528452,14.9873972598,14.9874416729,14.9874860847,14.9875304952,14.9875749042,14.9876193119,14.9876637183,14.9877081232,14.9877525268,14.987796929,14.9878413299,14.9878857294,14.9879301275, 14.9879745243,14.9880189197,14.9880633137,14.9881077064,14.9881520977,14.9881964876,14.9882408762,14.9882852634,14.9883296492,14.9883740337,14.9884184168,14.9884627985,14.9885071789,14.9885515579,14.9885959356,14.9886403119, 14.9886846868,14.9887290603,14.9887734325,14.9888178033,14.9888621728,14.9889065409,14.9889509076,14.988995273,14.989039637,14.9890839996,14.9891283609,14.9891727208,14.9892170793,14.9892614365,14.9893057923,14.9893501468, 14.9893944998,14.9894388516,14.9894832019,14.9895275509,14.9895718986,14.9896162448,14.9896605897,14.9897049333,14.9897492755,14.9897936163,14.9898379557,14.9898822938,14.9899266306,14.9899709659,14.9900152999,14.9900596326, 14.9901039639,14.9901482938,14.9901926223,14.9902369495,14.9902812754,14.9903255998,14.9903699229,14.9904142447,14.9904585651,14.9905028841,14.9905472018,14.9905915181,14.990635833,14.9906801466,14.9907244588,14.9907687697, 14.9908130792,14.9908573873,14.9909016941,14.9909459995,14.9909903035,14.9910346062,14.9910789076,14.9911232075,14.9911675061,14.9912118034,14.9912560993,14.9913003938,14.991344687,14.9913889788,14.9914332693,14.9914775583, 14.9915218461,14.9915661324,14.9916104175,14.9916547011,14.9916989834,14.9917432643,14.9917875439,14.9918318221,14.991876099,14.9919203745,14.9919646486,14.9920089214,14.9920531929,14.9920974629,14.9921417316,14.992185999, 14.992230265,14.9922745296,14.9923187929,14.9923630548,14.9924073153,14.9924515745,14.9924958324,14.9925400889,14.992584344,14.9926285978,14.9926728502,14.9927171012,14.9927613509,14.9928055993,14.9928498463,14.9928940919, 14.9929383362,14.9929825791,14.9930268206,14.9930710608,14.9931152997,14.9931595372,14.9932037733,14.9932480081,14.9932922415,14.9933364736,14.9933807043,14.9934249336,14.9934691616,14.9935133882,14.9935576135,14.9936018374, 14.99364606,14.9936902812,14.9937345011,14.9937787196,14.9938229367,14.9938671525,14.993911367,14.9939555801,14.9939997918,14.9940440022,14.9940882112,14.9941324189,14.9941766252,14.9942208301,14.9942650337,14.994309236, 14.9943534369,14.9943976364,14.9944418346,14.9944860314,14.9945302269,14.994574421,14.9946186138,14.9946628052,14.9947069953,14.994751184,14.9947953713,14.9948395573,14.994883742,14.9949279253,14.9949721072,14.9950162878, 14.995060467,14.9951046449,14.9951488214,14.9951929966,14.9952371704,14.9952813429,14.995325514,14.9953696838,14.9954138522,14.9954580193,14.995502185,14.9955463494,14.9955905124,14.995634674,14.9956788343,14.9957229933, 14.9957671509,14.9958113071,14.995855462,14.9958996156,14.9959437678,14.9959879186,14.9960320681,14.9960762162,14.996120363,14.9961645085,14.9962086526,14.9962527953,14.9962969367,14.9963410767,14.9963852154,14.9964293527, 14.9964734887,14.9965176234,14.9965617567,14.9966058886,14.9966500192,14.9966941484,14.9967382763,14.9967824028,14.996826528,14.9968706519,14.9969147743,14.9969588955,14.9970030153,14.9970471337,14.9970912508,14.9971353665, 14.9971794809,14.997223594,14.9972677057,14.997311816,14.997355925,14.9974000327,14.997444139,14.9974882439,14.9975323475,14.9975764498,14.9976205507,14.9976646502,14.9977087485,14.9977528453,14.9977969408,14.997841035, 14.9978851278,14.9979292193,14.9979733094,14.9980173982,14.9980614856,14.9981055717,14.9981496565,14.9981937398,14.9982378219,14.9982819026,14.9983259819,14.9983700599,14.9984141366,14.9984582119,14.9985022859,14.9985463585, 14.9985904297,14.9986344997,14.9986785682,14.9987226355,14.9987667014,14.9988107659,14.9988548291,14.9988988909,14.9989429514,14.9989870106,14.9990310684,14.9990751249,14.99911918,14.9991632338,14.9992072862,14.9992513373, 14.999295387,14.9993394354,14.9993834825,14.9994275282,14.9994715725,14.9995156155,14.9995596572,14.9996036975,14.9996477365,14.9996917742,14.9997358105,14.9997798454,14.999823879,14.9998679113,14.9999119422,14.9999559718, 15.0,15.0000440269,15.0000880524,15.0001320766,15.0001760995,15.000220121,15.0002641412,15.00030816,15.0003521775,15.0003961936,15.0004402084,15.0004842219,15.000528234,15.0005722448,15.0006162542,15.0006602623, 15.000704269,15.0007482744,15.0007922785,15.0008362812,15.0008802826,15.0009242826,15.0009682813,15.0010122786,15.0010562746,15.0011002693,15.0011442626,15.0011882546,15.0012322452,15.0012762345,15.0013202225,15.0013642091, 15.0014081944,15.0014521783,15.0014961609,15.0015401422,15.0015841221,15.0016281007,15.0016720779,15.0017160538,15.0017600283,15.0018040015,15.0018479734,15.0018919439,15.0019359131,15.001979881,15.0020238475,15.0020678127, 15.0021117765,15.002155739,15.0021997001,15.0022436599,15.0022876184,15.0023315755,15.0023755313,15.0024194858,15.0024634389,15.0025073907,15.0025513411,15.0025952902,15.002639238,15.0026831844,15.0027271295,15.0027710732, 15.0028150156,15.0028589567,15.0029028964,15.0029468348,15.0029907718,15.0030347076,15.0030786419,15.003122575,15.0031665067,15.003210437,15.0032543661,15.0032982937,15.0033422201,15.0033861451,15.0034300688,15.0034739911, 15.0035179121,15.0035618318,15.0036057501,15.0036496671,15.0036935827,15.0037374971,15.00378141,15.0038253217,15.003869232,15.0039131409,15.0039570486,15.0040009549,15.0040448598,15.0040887635,15.0041326657,15.0041765667, 15.0042204663,15.0042643646,15.0043082615,15.0043521572,15.0043960514,15.0044399444,15.004483836,15.0045277262,15.0045716152,15.0046155028,15.004659389,15.004703274,15.0047471575,15.0047910398,15.0048349207,15.0048788003, 15.0049226786,15.0049665555,15.0050104311,15.0050543053,15.0050981782,15.0051420498,15.0051859201,15.005229789,15.0052736566,15.0053175228,15.0053613877,15.0054052513,15.0054491135,15.0054929745,15.005536834,15.0055806923, 15.0056245492,15.0056684048,15.005712259,15.0057561119,15.0057999635,15.0058438138,15.0058876627,15.0059315103,15.0059753565,15.0060192014,15.006063045,15.0061068873,15.0061507282,15.0061945678,15.006238406,15.0062822429, 15.0063260785,15.0063699128,15.0064137457,15.0064575773,15.0065014076,15.0065452365,15.0065890641,15.0066328904,15.0066767153,15.0067205389,15.0067643612,15.0068081821,15.0068520017,15.00689582,15.006939637,15.0069834526, 15.0070272669,15.0070710799,15.0071148915,15.0071587018,15.0072025107,15.0072463184,15.0072901247,15.0073339297,15.0073777333,15.0074215356,15.0074653366,15.0075091363,15.0075529346,15.0075967316,15.0076405273,15.0076843216, 15.0077281146,15.0077719063,15.0078156967,15.0078594857,15.0079032734,15.0079470597,15.0079908448,15.0080346285,15.0080784109,15.0081221919,15.0081659716,15.00820975,15.0082535271,15.0082973028,15.0083410772,15.0083848503, 15.0084286221,15.0084723925,15.0085161616,15.0085599294,15.0086036958,15.0086474609,15.0086912247,15.0087349872,15.0087787483,15.0088225081,15.0088662666,15.0089100237,15.0089537795,15.008997534,15.0090412872,15.009085039, 15.0091287895,15.0091725387,15.0092162866,15.0092600331,15.0093037783,15.0093475222,15.0093912648,15.009435006,15.0094787459,15.0095224845,15.0095662217,15.0096099576,15.0096536922,15.0096974255,15.0097411575,15.0097848881, 15.0098286174,15.0098723453,15.009916072,15.0099597973,15.0100035213,15.010047244,15.0100909653,15.0101346853,15.010178404,15.0102221214,15.0102658374,15.0103095522,15.0103532655,15.0103969776,15.0104406884,15.0104843978, 15.0105281059,15.0105718127,15.0106155181,15.0106592222,15.010702925,15.0107466265,15.0107903267,15.0108340255,15.010877723,15.0109214192,15.0109651141,15.0110088076,15.0110524998,15.0110961907,15.0111398803,15.0111835685, 15.0112272554,15.011270941,15.0113146253,15.0113583082,15.0114019899,15.0114456702,15.0114893492,15.0115330268,15.0115767032,15.0116203782,15.0116640519,15.0117077243,15.0117513953,15.011795065,15.0118387335,15.0118824005, 15.0119260663,15.0119697308,15.0120133939,15.0120570557,15.0121007162,15.0121443753,15.0121880331,15.0122316897,15.0122753449,15.0123189987,15.0123626513,15.0124063025,15.0124499524,15.012493601,15.0125372483,15.0125808942, 15.0126245389,15.0126681822,15.0127118242,15.0127554648,15.0127991042,15.0128427422,15.0128863789,15.0129300143,15.0129736484,15.0130172811,15.0130609126,15.0131045427,15.0131481715,15.0131917989,15.0132354251,15.0132790499, 15.0133226734,15.0133662956,15.0134099165,15.0134535361,15.0134971543,15.0135407712,15.0135843868,15.0136280011,15.0136716141,15.0137152257,15.013758836,15.013802445,15.0138460527,15.0138896591,15.0139332642,15.0139768679, 15.0140204703,15.0140640714,15.0141076712,15.0141512697,15.0141948668,15.0142384626,15.0142820572,15.0143256504,15.0143692422,15.0144128328,15.014456422,15.01450001,15.0145435966,15.0145871819,15.0146307659,15.0146743485, 15.0147179299,15.0147615099,15.0148050886,15.014848666,15.0148922421,15.0149358168,15.0149793903,15.0150229624,15.0150665332,15.0151101027,15.0151536709,15.0151972378,15.0152408033,15.0152843676,15.0153279305,15.0153714921, 15.0154150524,15.0154586114,15.015502169,15.0155457254,15.0155892804,15.0156328341,15.0156763865,15.0157199376,15.0157634874,15.0158070358,15.015850583,15.0158941288,15.0159376733,15.0159812165,15.0160247584,15.016068299, 15.0161118382,15.0161553762,15.0161989128,15.0162424481,15.0162859821,15.0163295148,15.0163730462,15.0164165762,15.016460105,15.0165036324,15.0165471585,15.0165906833,15.0166342068,15.016677729,15.0167212499,15.0167647694, 15.0168082877,15.0168518046,15.0168953202,15.0169388345,15.0169823475,15.0170258592,15.0170693696,15.0171128786,15.0171563864,15.0171998928,15.0172433979,15.0172869017,15.0173304042,15.0173739054,15.0174174053,15.0174609039, 15.0175044011,15.017547897,15.0175913917,15.017634885,15.017678377,15.0177218677,15.0177653571,15.0178088451,15.0178523319,15.0178958174,15.0179393015,15.0179827843,15.0180262658,15.0180697461,15.0181132249,15.0181567025, 15.0182001788,15.0182436538,15.0182871274,15.0183305998,15.0183740708,15.0184175405,15.018461009,15.0185044761,15.0185479419,15.0185914064,15.0186348695,15.0186783314,15.018721792,15.0187652512,15.0188087092,15.0188521658, 15.0188956211,15.0189390751,15.0189825278,15.0190259792,15.0190694293,15.0191128781,15.0191563256,15.0191997717,15.0192432166,15.0192866602,15.0193301024,15.0193735433,15.0194169829,15.0194604213,15.0195038583,15.019547294, 15.0195907284,15.0196341614,15.0196775932,15.0197210237,15.0197644528,15.0198078807,15.0198513073,15.0198947325,15.0199381564,15.0199815791,15.0200250004,15.0200684204,15.0201118391,15.0201552565,15.0201986726,15.0202420874, 15.0202855008,15.020328913,15.0203723239,15.0204157334,15.0204591417,15.0205025486,15.0205459543,15.0205893586,15.0206327617,15.0206761634,15.0207195638,15.0207629629,15.0208063607,15.0208497572,15.0208931524,15.0209365463, 15.0209799389,15.0210233302,15.0210667202,15.0211101088,15.0211534962,15.0211968823,15.021240267,15.0212836505,15.0213270326,15.0213704135,15.021413793,15.0214571712,15.0215005482,15.0215439238,15.0215872981,15.0216306711, 15.0216740429,15.0217174133,15.0217607824,15.0218041502,15.0218475167,15.0218908819,15.0219342458,15.0219776084,15.0220209696,15.0220643296,15.0221076883,15.0221510457,15.0221944018,15.0222377565,15.02228111,15.0223244622, 15.022367813,15.0224111626,15.0224545108,15.0224978578,15.0225412035,15.0225845478,15.0226278909,15.0226712326,15.022714573,15.0227579122,15.02280125,15.0228445866,15.0228879218,15.0229312557,15.0229745884,15.0230179197, 15.0230612497,15.0231045785,15.0231479059,15.023191232,15.0232345568,15.0232778804,15.0233212026,15.0233645235,15.0234078431,15.0234511615,15.0234944785,15.0235377942,15.0235811086,15.0236244217,15.0236677336,15.0237110441, 15.0237543533,15.0237976612,15.0238409678,15.0238842732,15.0239275772,15.0239708799,15.0240141813,15.0240574814,15.0241007803,15.0241440778,15.024187374,15.0242306689,15.0242739625,15.0243172549,15.0243605459,15.0244038356, 15.024447124,15.0244904112,15.024533697,15.0245769815,15.0246202648,15.0246635467,15.0247068273,15.0247501067,15.0247933847,15.0248366614,15.0248799369,15.024923211,15.0249664839,15.0250097554,15.0250530257,15.0250962946, 15.0251395623,15.0251828286,15.0252260937,15.0252693575,15.0253126199,15.0253558811,15.025399141,15.0254423995,15.0254856568,15.0255289128,15.0255721675,15.0256154209,15.0256586729,15.0257019237,15.0257451732,15.0257884214, 15.0258316683,15.0258749139,15.0259181582,15.0259614013,15.026004643,15.0260478834,15.0260911225,15.0261343604,15.0261775969,15.0262208321,15.0262640661,15.0263072987,15.0263505301,15.0263937601,15.0264369889,15.0264802163, 15.0265234425,15.0265666674,15.026609891,15.0266531133,15.0266963342,15.0267395539,15.0267827723,15.0268259895,15.0268692053,15.0269124198,15.026955633,15.0269988449,15.0270420556,15.0270852649,15.027128473,15.0271716797, 15.0272148852,15.0272580893,15.0273012922,15.0273444938,15.0273876941,15.027430893,15.0274740907,15.0275172871,15.0275604822,15.0276036761,15.0276468686,15.0276900598,15.0277332498,15.0277764384,15.0278196257,15.0278628118, 15.0279059966,15.02794918,15.0279923622,15.0280355431,15.0280787227,15.028121901,15.028165078,15.0282082537,15.0282514282,15.0282946013,15.0283377731,15.0283809437,15.0284241129,15.0284672809,15.0285104476,15.028553613, 15.0285967771,15.0286399399,15.0286831014,15.0287262616,15.0287694205,15.0288125782,15.0288557345,15.0288988896,15.0289420433,15.0289851958,15.029028347,15.0290714969,15.0291146455,15.0291577928,15.0292009388,15.0292440835, 15.029287227,15.0293303691,15.02937351,15.0294166495,15.0294597878,15.0295029248,15.0295460605,15.0295891949,15.029632328,15.0296754599,15.0297185904,15.0297617197,15.0298048476,15.0298479743,15.0298910997,15.0299342238, 15.0299773466,15.0300204681,15.0300635883,15.0301067073,15.0301498249,15.0301929413,15.0302360564,15.0302791701,15.0303222826,15.0303653939,15.0304085038,15.0304516124,15.0304947197,15.0305378258,15.0305809306,15.0306240341, 15.0306671362,15.0307102372,15.0307533368,15.0307964351,15.0308395321,15.0308826279,15.0309257224,15.0309688155,15.0310119074,15.031054998,15.0310980874,15.0311411754,15.0311842621,15.0312273476,15.0312704318,15.0313135147, 15.0313565963,15.0313996766,15.0314427556,15.0314858333,15.0315289098,15.031571985,15.0316150588,15.0316581314,15.0317012027,15.0317442728,15.0317873415,15.031830409,15.0318734751,15.03191654,15.0319596036,15.0320026659, 15.0320457269,15.0320887867,15.0321318451,15.0321749023,15.0322179582,15.0322610128,15.0323040661,15.0323471181,15.0323901689,15.0324332183,15.0324762665,15.0325193134,15.032562359,15.0326054033,15.0326484464,15.0326914881, 15.0327345286,15.0327775678,15.0328206057,15.0328636423,15.0329066776,15.0329497117,15.0329927444,15.0330357759,15.0330788061,15.033121835,15.0331648627,15.033207889,15.0332509141,15.0332939379,15.0333369604,15.0333799816, 15.0334230015,15.0334660202,15.0335090376,15.0335520536,15.0335950685,15.033638082,15.0336810942,15.0337241052,15.0337671148,15.0338101232,15.0338531304,15.0338961362,15.0339391407,15.033982144,15.034025146,15.0340681467, 15.0341111461,15.0341541442,15.0341971411,15.0342401367,15.034283131,15.034326124,15.0343691157,15.0344121062,15.0344550953,15.0344980832,15.0345410698,15.0345840552,15.0346270392,15.034670022,15.0347130034,15.0347559837, 15.0347989626,15.0348419402,15.0348849166,15.0349278917,15.0349708655,15.035013838,15.0350568092,15.0350997792,15.0351427479,15.0351857153,15.0352286814,15.0352716463,15.0353146098,15.0353575721,15.0354005331,15.0354434928, 15.0354864513,15.0355294085,15.0355723644,15.035615319,15.0356582723,15.0357012243,15.0357441751,15.0357871246,15.0358300728,15.0358730198,15.0359159654,15.0359589098,15.0360018529,15.0360447947,15.0360877353,15.0361306746, 15.0361736126,15.0362165493,15.0362594847,15.0363024189,15.0363453517,15.0363882833,15.0364312137,15.0364741427,15.0365170705,15.036559997,15.0366029222,15.0366458461,15.0366887688,15.0367316902,15.0367746103,15.0368175291, 15.0368604467,15.036903363,15.036946278,15.0369891917,15.0370321041,15.0370750153,15.0371179252,15.0371608338,15.0372037412,15.0372466472,15.037289552,15.0373324555,15.0373753578,15.0374182587,15.0374611584,15.0375040568, 15.037546954,15.0375898498,15.0376327444,15.0376756377,15.0377185298,15.0377614205,15.03780431,15.0378471982,15.0378900851,15.0379329708,15.0379758552,15.0380187383,15.0380616201,15.0381045007,15.03814738,15.038190258, 15.0382331347,15.0382760102,15.0383188844,15.0383617573,15.0384046289,15.0384474993,15.0384903684,15.0385332362,15.0385761028,15.038618968,15.038661832,15.0387046948,15.0387475562,15.0387904164,15.0388332753,15.0388761329, 15.0389189893,15.0389618444,15.0390046982,15.0390475507,15.039090402,15.039133252,15.0391761007,15.0392189482,15.0392617943,15.0393046392,15.0393474829,15.0393903252,15.0394331663,15.0394760061,15.0395188447,15.039561682, 15.039604518,15.0396473527,15.0396901861,15.0397330183,15.0397758492,15.0398186789,15.0398615072,15.0399043343,15.0399471602,15.0399899847,15.040032808,15.04007563,15.0401184508,15.0401612702,15.0402040884,15.0402469054, 15.040289721,15.0403325354,15.0403753485,15.0404181604,15.040460971,15.0405037803,15.0405465883,15.0405893951,15.0406322006,15.0406750048,15.0407178077,15.0407606094,15.0408034098,15.040846209,15.0408890069,15.0409318035, 15.0409745988,15.0410173929,15.0410601857,15.0411029772,15.0411457675,15.0411885565,15.0412313442,15.0412741306,15.0413169158,15.0413596997,15.0414024824,15.0414452638,15.0414880439,15.0415308227,15.0415736003,15.0416163766, 15.0416591516,15.0417019254,15.0417446979,15.0417874691,15.0418302391,15.0418730078,15.0419157752,15.0419585414,15.0420013063,15.0420440699,15.0420868323,15.0421295934,15.0421723532,15.0422151117,15.042257869,15.042300625, 15.0423433798,15.0423861333,15.0424288855,15.0424716365,15.0425143861,15.0425571346,15.0425998817,15.0426426276,15.0426853722,15.0427281156,15.0427708577,15.0428135985,15.042856338,15.0428990763,15.0429418133,15.0429845491, 15.0430272836,15.0430700168,15.0431127488,15.0431554795,15.0431982089,15.0432409371,15.043283664,15.0433263896,15.043369114,15.0434118371,15.0434545589,15.0434972795,15.0435399988,15.0435827168,15.0436254336,15.0436681491, 15.0437108633,15.0437535763,15.043796288,15.0438389985,15.0438817077,15.0439244156,15.0439671223,15.0440098277,15.0440525318,15.0440952347,15.0441379363,15.0441806366,15.0442233357,15.0442660335,15.0443087301,15.0443514253, 15.0443941194,15.0444368121,15.0444795036,15.0445221938,15.0445648828,15.0446075705,15.044650257,15.0446929421,15.0447356261,15.0447783087,15.0448209901,15.0448636702,15.0449063491,15.0449490267,15.044991703,15.0450343781, 15.0450770519,15.0451197245,15.0451623958,15.0452050658,15.0452477346,15.0452904021,15.0453330683,15.0453757333,15.045418397,15.0454610595,15.0455037207,15.0455463806,15.0455890393,15.0456316967,15.0456743529,15.0457170078, 15.0457596614,15.0458023138,15.0458449649,15.0458876147,15.0459302633,15.0459729106,15.0460155567,15.0460582015,15.046100845,15.0461434873,15.0461861283,15.0462287681,15.0462714066,15.0463140438,15.0463566798,15.0463993145, 15.046441948,15.0464845802,15.0465272112,15.0465698408,15.0466124693,15.0466550964,15.0466977223,15.046740347,15.0467829704,15.0468255925,15.0468682133,15.046910833,15.0469534513,15.0469960684,15.0470386842,15.0470812988, 15.0471239121,15.0471665242,15.047209135,15.0472517445,15.0472943528,15.0473369598,15.0473795656,15.0474221701,15.0474647733,15.0475073753,15.047549976,15.0475925755,15.0476351737,15.0476777707,15.0477203664,15.0477629608, 15.047805554,15.0478481459,15.0478907366,15.047933326,15.0479759142,15.0480185011,15.0480610867,15.0481036711,15.0481462542,15.0481888361,15.0482314167,15.0482739961,15.0483165742,15.048359151,15.0484017266,15.0484443009, 15.048486874,15.0485294458,15.0485720164,15.0486145857,15.0486571537,15.0486997205,15.0487422861,15.0487848503,15.0488274134,15.0488699751,15.0489125356,15.0489550949,15.0489976529,15.0490402097,15.0490827652,15.0491253194, 15.0491678724,15.0492104241,15.0492529746,15.0492955238,15.0493380718,15.0493806185,15.0494231639,15.0494657081,15.0495082511,15.0495507927,15.0495933332,15.0496358724,15.0496784103,15.049720947,15.0497634824,15.0498060165, 15.0498485495,15.0498910811,15.0499336115,15.0499761407,15.0500186686,15.0500611952,15.0501037206,15.0501462447,15.0501887676,15.0502312892,15.0502738096,15.0503163287,15.0503588466,15.0504013632,15.0504438786,15.0504863927, 15.0505289055,15.0505714171,15.0506139275,15.0506564366,15.0506989444,15.050741451,15.0507839564,15.0508264605,15.0508689633,15.0509114649,15.0509539652,15.0509964643,15.0510389621,15.0510814587,15.051123954,15.0511664481, 15.0512089409,15.0512514325,15.0512939228,15.0513364119,15.0513788997,15.0514213863,15.0514638716,15.0515063556,15.0515488384,15.05159132,15.0516338003,15.0516762794,15.0517187572,15.0517612337,15.051803709,15.0518461831, 15.0518886559,15.0519311275,15.0519735978,15.0520160668,15.0520585346,15.0521010012,15.0521434665,15.0521859305,15.0522283933,15.0522708549,15.0523133152,15.0523557743,15.0523982321,15.0524406886,15.0524831439,15.052525598, 15.0525680508,15.0526105024,15.0526529527,15.0526954017,15.0527378495,15.0527802961,15.0528227414,15.0528651855,15.0529076283,15.0529500699,15.0529925102,15.0530349493,15.0530773871,15.0531198237,15.053162259,15.0532046931, 15.0532471259,15.0532895575,15.0533319878,15.0533744169,15.0534168448,15.0534592713,15.0535016967,15.0535441208,15.0535865436,15.0536289652,15.0536713856,15.0537138047,15.0537562226,15.0537986392,15.0538410545,15.0538834687, 15.0539258815,15.0539682932,15.0540107035,15.0540531127,15.0540955206,15.0541379272,15.0541803326,15.0542227367,15.0542651396,15.0543075413,15.0543499417,15.0543923408,15.0544347388,15.0544771354,15.0545195309,15.054561925, 15.054604318,15.0546467096,15.0546891001,15.0547314893,15.0547738772,15.0548162639,15.0548586494,15.0549010336,15.0549434166,15.0549857983,15.0550281788,15.055070558,15.055112936,15.0551553127,15.0551976882,15.0552400625, 15.0552824355,15.0553248073,15.0553671778,15.0554095471,15.0554519151,15.0554942819,15.0555366474,15.0555790117,15.0556213748,15.0556637366,15.0557060972,15.0557484565,15.0557908146,15.0558331714,15.055875527,15.0559178813, 15.0559602345,15.0560025863,15.0560449369,15.0560872863,15.0561296344,15.0561719813,15.056214327,15.0562566714,15.0562990146,15.0563413565,15.0563836971,15.0564260366,15.0564683748,15.0565107117,15.0565530474,15.0565953819, 15.0566377151,15.0566800471,15.0567223778,15.0567647073,15.0568070356,15.0568493626,15.0568916884,15.0569340129,15.0569763362,15.0570186582,15.057060979,15.0571032986,15.0571456169,15.057187934,15.0572302498,15.0572725644, 15.0573148778,15.0573571899,15.0573995008,15.0574418104,15.0574841188,15.057526426,15.0575687319,15.0576110365,15.05765334,15.0576956422,15.0577379431,15.0577802428,15.0578225413,15.0578648385,15.0579071345,15.0579494292, 15.0579917228,15.058034015,15.0580763061,15.0581185958,15.0581608844,15.0582031717,15.0582454578,15.0582877426,15.0583300262,15.0583723086,15.0584145897,15.0584568695,15.0584991482,15.0585414256,15.0585837017,15.0586259767, 15.0586682503,15.0587105228,15.058752794,15.058795064,15.0588373327,15.0588796002,15.0589218664,15.0589641314,15.0590063952,15.0590486577,15.059090919,15.0591331791,15.0591754379,15.0592176955,15.0592599518,15.059302207, 15.0593444608,15.0593867135,15.0594289649,15.059471215,15.0595134639,15.0595557116,15.0595979581,15.0596402033,15.0596824472,15.05972469,15.0597669315,15.0598091717,15.0598514108,15.0598936486,15.0599358851,15.0599781204, 15.0600203545,15.0600625874,15.060104819,15.0601470493,15.0601892785,15.0602315064,15.060273733,15.0603159585,15.0603581826,15.0604004056,15.0604426273,15.0604848478,15.060527067,15.0605692851,15.0606115018,15.0606537174, 15.0606959317,15.0607381448,15.0607803566,15.0608225672,15.0608647766,15.0609069847,15.0609491916,15.0609913973,15.0610336017,15.0610758049,15.0611180068,15.0611602076,15.061202407,15.0612446053,15.0612868023,15.0613289981, 15.0613711927,15.061413386,15.0614555781,15.0614977689,15.0615399585,15.0615821469,15.0616243341,15.06166652,15.0617087047,15.0617508881,15.0617930703,15.0618352513,15.0618774311,15.0619196096,15.0619617869,15.0620039629, 15.0620461377,15.0620883113,15.0621304837,15.0621726548,15.0622148247,15.0622569933,15.0622991607,15.0623413269,15.0623834919,15.0624256556,15.0624678181,15.0625099793,15.0625521394,15.0625942982,15.0626364557,15.0626786121, 15.0627207672,15.062762921,15.0628050737,15.0628472251,15.0628893752,15.0629315242,15.0629736719,15.0630158184,15.0630579636,15.0631001076,15.0631422504,15.063184392,15.0632265323,15.0632686714,15.0633108093,15.0633529459, 15.0633950813,15.0634372155,15.0634793484,15.0635214801,15.0635636106,15.0636057398,15.0636478679,15.0636899946,15.0637321202,15.0637742445,15.0638163676,15.0638584895,15.0639006101,15.0639427295,15.0639848477,15.0640269647, 15.0640690804,15.0641111949,15.0641533081,15.0641954202,15.064237531,15.0642796405,15.0643217489,15.064363856,15.0644059619,15.0644480665,15.06449017,15.0645322722,15.0645743731,15.0646164729,15.0646585714,15.0647006687, 15.0647427648,15.0647848596,15.0648269532,15.0648690456,15.0649111367,15.0649532266,15.0649953153,15.0650374028,15.065079489,15.065121574,15.0651636578,15.0652057403,15.0652478217,15.0652899018,15.0653319806,15.0653740583, 15.0654161347,15.0654582099,15.0655002838,15.0655423566,15.0655844281,15.0656264983,15.0656685674,15.0657106352,15.0657527018,15.0657947672,15.0658368313,15.0658788943,15.0659209559,15.0659630164,15.0660050757,15.0660471337, 15.0660891905,15.066131246,15.0661733004,15.0662153535,15.0662574054,15.066299456,15.0663415054,15.0663835537,15.0664256006,15.0664676464,15.0665096909,15.0665517342,15.0665937763,15.0666358172,15.0666778568,15.0667198952, 15.0667619324,15.0668039683,15.0668460031,15.0668880366,15.0669300689,15.0669720999,15.0670141298,15.0670561584,15.0670981857,15.0671402119,15.0671822368,15.0672242606,15.067266283,15.0673083043,15.0673503243,15.0673923432, 15.0674343608,15.0674763771,15.0675183923,15.0675604062,15.0676024189,15.0676444304,15.0676864406,15.0677284496,15.0677704574,15.067812464,15.0678544694,15.0678964735,15.0679384764,15.0679804781,15.0680224786,15.0680644778, 15.0681064759,15.0681484727,15.0681904682,15.0682324626,15.0682744557,15.0683164476,15.0683584383,15.0684004278,15.068442416,15.068484403,15.0685263888,15.0685683734,15.0686103568,15.0686523389,15.0686943198,15.0687362995, 15.068778278,15.0688202552,15.0688622313,15.0689042061,15.0689461796,15.068988152,15.0690301232,15.0690720931,15.0691140618,15.0691560293,15.0691979955,15.0692399605,15.0692819244,15.069323887,15.0693658483,15.0694078085, 15.0694497674,15.0694917251,15.0695336816,15.0695756369,15.069617591,15.0696595438,15.0697014954,15.0697434458,15.069785395,15.0698273429,15.0698692897,15.0699112352,15.0699531795,15.0699951226,15.0700370644,15.0700790051, 15.0701209445,15.0701628827,15.0702048197,15.0702467554,15.07028869,15.0703306233,15.0703725554,15.0704144863,15.0704564159,15.0704983444,15.0705402716,15.0705821976,15.0706241224,15.070666046,15.0707079684,15.0707498895, 15.0707918094,15.0708337281,15.0708756456,15.0709175619,15.0709594769,15.0710013908,15.0710433034,15.0710852148,15.0711271249,15.0711690339,15.0712109417,15.0712528482,15.0712947535,15.0713366576,15.0713785605,15.0714204621, 15.0714623626,15.0715042618,15.0715461598,15.0715880566,15.0716299522,15.0716718465,15.0717137397,15.0717556316,15.0717975223,15.0718394118,15.0718813001,15.0719231871,15.071965073,15.0720069576,15.072048841,15.0720907232, 15.0721326042,15.0721744839,15.0722163625,15.0722582398,15.0723001159,15.0723419908,15.0723838645,15.072425737,15.0724676082,15.0725094783,15.0725513471,15.0725932147,15.0726350811,15.0726769463,15.0727188103,15.072760673, 15.0728025345,15.0728443949,15.072886254,15.0729281119,15.0729699685,15.073011824,15.0730536783,15.0730955313,15.0731373831,15.0731792337,15.0732210831,15.0732629313,15.0733047783,15.073346624,15.0733884685,15.0734303119, 15.073472154,15.0735139949,15.0735558346,15.073597673,15.0736395103,15.0736813463,15.0737231812,15.0737650148,15.0738068472,15.0738486784,15.0738905083,15.0739323371,15.0739741647,15.074015991,15.0740578161,15.07409964, 15.0741414628,15.0741832842,15.0742251045,15.0742669236,15.0743087414,15.0743505581,15.0743923735,15.0744341877,15.0744760007,15.0745178125,15.0745596231,15.0746014325,15.0746432406,15.0746850476,15.0747268533,15.0747686578, 15.0748104612,15.0748522633,15.0748940642,15.0749358638,15.0749776623,15.0750194596,15.0750612556,15.0751030504,15.0751448441,15.0751866365,15.0752284277,15.0752702177,15.0753120065,15.075353794,15.0753955804,15.0754373655, 15.0754791495,15.0755209322,15.0755627137,15.0756044941,15.0756462732,15.075688051,15.0757298277,15.0757716032,15.0758133775,15.0758551505,15.0758969224,15.075938693,15.0759804624,15.0760222306,15.0760639976,15.0761057634, 15.076147528,15.0761892914,15.0762310536,15.0762728145,15.0763145743,15.0763563328,15.0763980902,15.0764398463,15.0764816012,15.0765233549,15.0765651074,15.0766068587,15.0766486088,15.0766903577,15.0767321053,15.0767738518, 15.0768155971,15.0768573411,15.0768990839,15.0769408256,15.076982566,15.0770243052,15.0770660432,15.07710778,15.0771495156,15.07719125,15.0772329831,15.0772747151,15.0773164459,15.0773581754,15.0773999038,15.0774416309, 15.0774833569,15.0775250816,15.0775668051,15.0776085274,15.0776502485,15.0776919684,15.0777336871,15.0777754046,15.0778171209,15.077858836,15.0779005498,15.0779422625,15.077983974,15.0780256842,15.0780673933,15.0781091011, 15.0781508077,15.0781925132,15.0782342174,15.0782759204,15.0783176222,15.0783593228,15.0784010222,15.0784427204,15.0784844174,15.0785261132,15.0785678078,15.0786095012,15.0786511933,15.0786928843,15.0787345741,15.0787762626, 15.07881795,15.0788596361,15.0789013211,15.0789430048,15.0789846873,15.0790263687,15.0790680488,15.0791097277,15.0791514054,15.0791930819,15.0792347572,15.0792764314,15.0793181043,15.079359776,15.0794014464,15.0794431157, 15.0794847838,15.0795264507,15.0795681164,15.0796097809,15.0796514441,15.0796931062,15.0797347671,15.0797764267,15.0798180852,15.0798597425,15.0799013985,15.0799430534,15.079984707,15.0800263595,15.0800680107,15.0801096608, 15.0801513096,15.0801929573,15.0802346037,15.0802762489,15.080317893,15.0803595358,15.0804011774,15.0804428178,15.0804844571,15.0805260951,15.0805677319,15.0806093675,15.0806510019,15.0806926352,15.0807342672,15.080775898, 15.0808175276,15.080859156,15.0809007832,15.0809424092,15.080984034,15.0810256577,15.0810672801,15.0811089013,15.0811505213,15.0811921401,15.0812337577,15.0812753741,15.0813169893,15.0813586033,15.0814002161,15.0814418277, 15.0814834381,15.0815250473,15.0815666553,15.0816082621,15.0816498677,15.0816914721,15.0817330753,15.0817746773,15.0818162781,15.0818578777,15.0818994761,15.0819410733,15.0819826693,15.0820242641,15.0820658577,15.0821074501, 15.0821490414,15.0821906314,15.0822322202,15.0822738078,15.0823153942,15.0823569794,15.0823985634,15.0824401462,15.0824817279,15.0825233083,15.0825648875,15.0826064655,15.0826480424,15.082689618,15.0827311924,15.0827727656, 15.0828143377,15.0828559085,15.0828974781,15.0829390466,15.0829806138,15.0830221799,15.0830637447,15.0831053084,15.0831468708,15.0831884321,15.0832299921,15.083271551,15.0833131087,15.0833546651,15.0833962204,15.0834377745, 15.0834793273,15.083520879,15.0835624295,15.0836039788,15.0836455269,15.0836870738,15.0837286195,15.083770164,15.0838117073,15.0838532494,15.0838947903,15.08393633,15.0839778685,15.0840194058,15.084060942,15.0841024769, 15.0841440106,15.0841855432,15.0842270745,15.0842686046,15.0843101336,15.0843516614,15.0843931879,15.0844347133,15.0844762375,15.0845177604,15.0845592822,15.0846008028,15.0846423222,15.0846838404,15.0847253574,15.0847668732, 15.0848083878,15.0848499012,15.0848914134,15.0849329245,15.0849744343,15.0850159429,15.0850574504,15.0850989566,15.0851404617,15.0851819656,15.0852234682,15.0852649697,15.08530647,15.0853479691,15.085389467,15.0854309637, 15.0854724592,15.0855139535,15.0855554466,15.0855969385,15.0856384293,15.0856799188,15.0857214072,15.0857628943,15.0858043803,15.085845865,15.0858873486,15.085928831,15.0859703122,15.0860117922,15.086053271,15.0860947486, 15.086136225,15.0861777003,15.0862191743,15.0862606471,15.0863021188,15.0863435892,15.0863850585,15.0864265266,15.0864679935,15.0865094592,15.0865509237,15.086592387,15.0866338491,15.08667531,15.0867167697,15.0867582283, 15.0867996856,15.0868411418,15.0868825967,15.0869240505,15.0869655031,15.0870069545,15.0870484047,15.0870898537,15.0871313015,15.0871727482,15.0872141936,15.0872556379,15.0872970809,15.0873385228,15.0873799635,15.087421403, 15.0874628413,15.0875042784,15.0875457143,15.087587149,15.0876285825,15.0876700149,15.087711446,15.087752876,15.0877943048,15.0878357324,15.0878771588,15.087918584,15.087960008,15.0880014308,15.0880428525,15.0880842729, 15.0881256922,15.0881671103,15.0882085271,15.0882499428,15.0882913573,15.0883327707,15.0883741828,15.0884155937,15.0884570035,15.088498412,15.0885398194,15.0885812256,15.0886226306,15.0886640344,15.088705437,15.0887468385, 15.0887882387,15.0888296378,15.0888710356,15.0889124323,15.0889538278,15.0889952221,15.0890366152,15.0890780072,15.0891193979,15.0891607875,15.0892021758,15.089243563,15.089284949,15.0893263338,15.0893677174,15.0894090999, 15.0894504811,15.0894918612,15.08953324,15.0895746177,15.0896159942,15.0896573695,15.0896987437,15.0897401166,15.0897814884,15.0898228589,15.0898642283,15.0899055965,15.0899469635,15.0899883293,15.090029694,15.0900710574, 15.0901124197,15.0901537807,15.0901951406,15.0902364993,15.0902778569,15.0903192132,15.0903605683,15.0904019223,15.0904432751,15.0904846267,15.0905259771,15.0905673263,15.0906086743,15.0906500212,15.0906913669,15.0907327113, 15.0907740546,15.0908153968,15.0908567377,15.0908980774,15.090939416,15.0909807534,15.0910220895,15.0910634246,15.0911047584,15.091146091,15.0911874225,15.0912287527,15.0912700818,15.0913114097,15.0913527364,15.091394062, 15.0914353863,15.0914767095,15.0915180315,15.0915593523,15.0916006719,15.0916419903,15.0916833076,15.0917246236,15.0917659385,15.0918072522,15.0918485647,15.0918898761,15.0919311862,15.0919724952,15.092013803,15.0920551096, 15.092096415,15.0921377192,15.0921790223,15.0922203242,15.0922616248,15.0923029244,15.0923442227,15.0923855198,15.0924268158,15.0924681106,15.0925094042,15.0925506966,15.0925919878,15.0926332779,15.0926745667,15.0927158544, 15.0927571409,15.0927984262,15.0928397104,15.0928809934,15.0929222751,15.0929635557,15.0930048352,15.0930461134,15.0930873904,15.0931286663,15.093169941,15.0932112145,15.0932524869,15.093293758,15.093335028,15.0933762968, 15.0934175644,15.0934588308,15.0935000961,15.0935413601,15.093582623,15.0936238847,15.0936651453,15.0937064046,15.0937476628,15.0937889198,15.0938301756,15.0938714302,15.0939126837,15.0939539359,15.093995187,15.0940364369, 15.0940776857,15.0941189332,15.0941601796,15.0942014248,15.0942426688,15.0942839116,15.0943251533,15.0943663938,15.0944076331,15.0944488712,15.0944901081,15.0945313439,15.0945725785,15.0946138119,15.0946550441,15.0946962752, 15.094737505,15.0947787337,15.0948199613,15.0948611876,15.0949024128,15.0949436367,15.0949848595,15.0950260812,15.0950673016,15.0951085209,15.095149739,15.0951909559,15.0952321716,15.0952733862,15.0953145996,15.0953558118, 15.0953970228,15.0954382326,15.0954794413,15.0955206488,15.0955618551,15.0956030603,15.0956442642,15.095685467,15.0957266686,15.0957678691,15.0958090683,15.0958502664,15.0958914633,15.0959326591,15.0959738536,15.096015047, 15.0960562392,15.0960974302,15.0961386201,15.0961798087,15.0962209962,15.0962621825,15.0963033677,15.0963445517,15.0963857345,15.0964269161,15.0964680965,15.0965092758,15.0965504539,15.0965916308,15.0966328065,15.0966739811, 15.0967151545,15.0967563267,15.0967974977,15.0968386676,15.0968798363,15.0969210038,15.0969621702,15.0970033353,15.0970444993,15.0970856621,15.0971268238,15.0971679843,15.0972091436,15.0972503017,15.0972914586,15.0973326144, 15.097373769,15.0974149224,15.0974560747,15.0974972257,15.0975383756,15.0975795244,15.0976206719,15.0976618183,15.0977029635,15.0977441076,15.0977852504,15.0978263921,15.0978675326,15.097908672,15.0979498101,15.0979909471, 15.098032083,15.0980732176,15.0981143511,15.0981554834,15.0981966145,15.0982377445,15.0982788733,15.0983200009,15.0983611273,15.0984022526,15.0984433767,15.0984844996,15.0985256214,15.098566742,15.0986078614,15.0986489796, 15.0986900967,15.0987312126,15.0987723273,15.0988134408,15.0988545532,15.0988956644,15.0989367745,15.0989778833,15.099018991,15.0990600975,15.0991012029,15.0991423071,15.0991834101,15.0992245119,15.0992656126,15.0993067121, 15.0993478104,15.0993889076,15.0994300035,15.0994710984,15.099512192,15.0995532845,15.0995943758,15.0996354659,15.0996765549,15.0997176427,15.0997587293,15.0997998147,15.099840899,15.0998819821,15.0999230641,15.0999641448, 15.1000052244,15.1000463029,15.1000873801,15.1001284562,15.1001695311,15.1002106049,15.1002516775,15.1002927489,15.1003338191,15.1003748882,15.1004159561,15.1004570228,15.1004980884,15.1005391528,15.100580216,15.1006212781, 15.100662339,15.1007033987,15.1007444573,15.1007855147,15.1008265709,15.1008676259,15.1009086798,15.1009497325,15.1009907841,15.1010318345,15.1010728837,15.1011139317,15.1011549786,15.1011960243,15.1012370688,15.1012781122, 15.1013191544,15.1013601955,15.1014012353,15.101442274,15.1014833116,15.1015243479,15.1015653831,15.1016064172,15.10164745,15.1016884817,15.1017295123,15.1017705416,15.1018115698,15.1018525969,15.1018936227,15.1019346474, 15.1019756709,15.1020166933,15.1020577145,15.1020987345,15.1021397534,15.1021807711,15.1022217876,15.102262803,15.1023038172,15.1023448302,15.1023858421,15.1024268528,15.1024678624,15.1025088707,15.1025498779,15.102590884, 15.1026318889,15.1026728926,15.1027138951,15.1027548965,15.1027958967,15.1028368958,15.1028778936,15.1029188904,15.1029598859,15.1030008803,15.1030418735,15.1030828656,15.1031238565,15.1031648462,15.1032058348,15.1032468222, 15.1032878084,15.1033287935,15.1033697774,15.1034107601,15.1034517417,15.1034927221,15.1035337014,15.1035746795,15.1036156564,15.1036566322,15.1036976068,15.1037385802,15.1037795525,15.1038205236,15.1038614935,15.1039024623, 15.1039434299,15.1039843963,15.1040253616,15.1040663258,15.1041072887,15.1041482505,15.1041892112,15.1042301706,15.1042711289,15.1043120861,15.1043530421,15.1043939969,15.1044349506,15.104475903,15.1045168544,15.1045578046, 15.1045987536,15.1046397014,15.1046806481,15.1047215936,15.104762538,15.1048034812,15.1048444232,15.1048853641,15.1049263038,15.1049672424,15.1050081798,15.105049116,15.105090051,15.105130985,15.1051719177,15.1052128493, 15.1052537797,15.105294709,15.1053356371,15.105376564,15.1054174898,15.1054584144,15.1054993378,15.1055402601,15.1055811813,15.1056221013,15.1056630201,15.1057039377,15.1057448542,15.1057857695,15.1058266837,15.1058675967, 15.1059085086,15.1059494193,15.1059903288,15.1060312372,15.1060721444,15.1061130504,15.1061539553,15.106194859,15.1062357616,15.106276663,15.1063175633,15.1063584624,15.1063993603,15.1064402571,15.1064811527,15.1065220471, 15.1065629404,15.1066038326,15.1066447236,15.1066856134,15.106726502,15.1067673895,15.1068082759,15.1068491611,15.1068900451,15.106930928,15.1069718097,15.1070126902,15.1070535696,15.1070944478,15.1071353249,15.1071762008, 15.1072170756,15.1072579492,15.1072988216,15.1073396929,15.107380563,15.107421432,15.1074622998,15.1075031665,15.107544032,15.1075848963,15.1076257595,15.1076666215,15.1077074824,15.1077483421,15.1077892006,15.107830058, 15.1078709143,15.1079117694,15.1079526233,15.1079934761,15.1080343277,15.1080751781,15.1081160274,15.1081568756,15.1081977225,15.1082385684,15.108279413,15.1083202565,15.1083610989,15.1084019401,15.1084427802,15.108483619, 15.1085244568,15.1085652934,15.1086061288,15.108646963,15.1086877962,15.1087286281,15.1087694589,15.1088102886,15.108851117,15.1088919444,15.1089327706,15.1089735956,15.1090144194,15.1090552422,15.1090960637,15.1091368841, 15.1091777034,15.1092185214,15.1092593384,15.1093001542,15.1093409688,15.1093817823,15.1094225946,15.1094634057,15.1095042158,15.1095450246,15.1095858323,15.1096266389,15.1096674443,15.1097082485,15.1097490516,15.1097898535, 15.1098306543,15.1098714539,15.1099122524,15.1099530497,15.1099938458,15.1100346409,15.1100754347,15.1101162274,15.110157019,15.1101978093,15.1102385986,15.1102793867,15.1103201736,15.1103609594,15.110401744,15.1104425275, 15.1104833098,15.110524091,15.110564871,15.1106056499,15.1106464276,15.1106872041,15.1107279795,15.1107687538,15.1108095269,15.1108502988,15.1108910696,15.1109318393,15.1109726078,15.1110133751,15.1110541413,15.1110949063, 15.1111356702,15.111176433,15.1112171945,15.111257955,15.1112987143,15.1113394724,15.1113802294,15.1114209852,15.1114617399,15.1115024934,15.1115432457,15.111583997,15.111624747,15.111665496,15.1117062437,15.1117469903, 15.1117877358,15.1118284801,15.1118692233,15.1119099653,15.1119507062,15.1119914459,15.1120321844,15.1120729218,15.1121136581,15.1121543932,15.1121951272,15.11223586,15.1122765916,15.1123173221,15.1123580515,15.1123987797, 15.1124395068,15.1124802327,15.1125209575,15.1125616811,15.1126024035,15.1126431248,15.112683845,15.112724564,15.1127652819,15.1128059986,15.1128467142,15.1128874286,15.1129281419,15.112968854,15.1130095649,15.1130502748, 15.1130909834,15.113131691,15.1131723973,15.1132131026,15.1132538067,15.1132945096,15.1133352114,15.113375912,15.1134166115,15.1134573098,15.113498007,15.1135387031,15.113579398,15.1136200917,15.1136607843,15.1137014757, 15.113742166,15.1137828552,15.1138235432,15.1138642301,15.1139049158,15.1139456004,15.1139862838,15.114026966,15.1140676472,15.1141083271,15.114149006,15.1141896837,15.1142303602,15.1142710356,15.1143117098,15.1143523829, 15.1143930549,15.1144337257,15.1144743953,15.1145150638,15.1145557312,15.1145963974,15.1146370625,15.1146777264,15.1147183892,15.1147590508,15.1147997113,15.1148403706,15.1148810288,15.1149216859,15.1149623418,15.1150029966, 15.1150436502,15.1150843026,15.1151249539,15.1151656041,15.1152062532,15.115246901,15.1152875478,15.1153281934,15.1153688378,15.1154094811,15.1154501233,15.1154907643,15.1155314042,15.1155720429,15.1156126805,15.1156533169, 15.1156939522,15.1157345863,15.1157752193,15.1158158512,15.1158564819,15.1158971115,15.1159377399,15.1159783672,15.1160189933,15.1160596183,15.1161002422,15.1161408649,15.1161814864,15.1162221068,15.1162627261,15.1163033443, 15.1163439612,15.1163845771,15.1164251918,15.1164658053,15.1165064177,15.116547029,15.1165876391,15.1166282481,15.116668856,15.1167094627,15.1167500682,15.1167906726,15.1168312759,15.116871878,15.116912479,15.1169530788, 15.1169936775,15.1170342751,15.1170748715,15.1171154668,15.1171560609,15.1171966539,15.1172372457,15.1172778364,15.117318426,15.1173590144,15.1173996017,15.1174401878,15.1174807728,15.1175213567,15.1175619394,15.117602521, 15.1176431014,15.1176836807,15.1177242588,15.1177648358,15.1178054117,15.1178459864,15.11788656,15.1179271324,15.1179677037,15.1180082739,15.1180488429,15.1180894108,15.1181299775,15.1181705431,15.1182111075,15.1182516709, 15.118292233,15.1183327941,15.1183733539,15.1184139127,15.1184544703,15.1184950268,15.1185355821,15.1185761363,15.1186166894,15.1186572413,15.118697792,15.1187383417,15.1187788902,15.1188194375,15.1188599837,15.1189005288, 15.1189410727,15.1189816155,15.1190221572,15.1190626977,15.1191032371,15.1191437753,15.1191843124,15.1192248484,15.1192653832,15.1193059169,15.1193464494,15.1193869808,15.1194275111,15.1194680402,15.1195085682,15.119549095, 15.1195896207,15.1196301453,15.1196706687,15.119711191,15.1197517122,15.1197922322,15.1198327511,15.1198732688,15.1199137855,15.1199543009,15.1199948153,15.1200353284,15.1200758405,15.1201163514,15.1201568612,15.1201973698, 15.1202378773,15.1202783837,15.1203188889,15.120359393,15.120399896,15.1204403978,15.1204808985,15.120521398,15.1205618964,15.1206023937,15.1206428898,15.1206833848,15.1207238787,15.1207643714,15.120804863,15.1208453535, 15.1208858428,15.120926331,15.120966818,15.1210073039,15.1210477887,15.1210882723,15.1211287548,15.1211692362,15.1212097164,15.1212501955,15.1212906735,15.1213311503,15.121371626,15.1214121005,15.1214525739,15.1214930462, 15.1215335173,15.1215739873,15.1216144562,15.121654924,15.1216953906,15.121735856,15.1217763204,15.1218167836,15.1218572456,15.1218977065,15.1219381663,15.121978625,15.1220190825,15.1220595389,15.1220999942,15.1221404483, 15.1221809013,15.1222213531,15.1222618038,15.1223022534,15.1223427019,15.1223831492,15.1224235954,15.1224640404,15.1225044843,15.1225449271,15.1225853687,15.1226258093,15.1226662486,15.1227066869,15.122747124,15.12278756, 15.1228279948,15.1228684285,15.1229088611,15.1229492925,15.1229897229,15.123030152,15.1230705801,15.123111007,15.1231514328,15.1231918574,15.1232322809,15.1232727033,15.1233131246,15.1233535447,15.1233939637,15.1234343815, 15.1234747982,15.1235152138,15.1235556283,15.1235960416,15.1236364538,15.1236768649,15.1237172748,15.1237576836,15.1237980913,15.1238384978,15.1238789032,15.1239193075,15.1239597106,15.1240001126,15.1240405135,15.1240809132, 15.1241213118,15.1241617093,15.1242021057,15.1242425009,15.124282895,15.1243232879,15.1243636797,15.1244040704,15.12444446,15.1244848484,15.1245252357,15.1245656219,15.124606007,15.1246463909,15.1246867737,15.1247271553, 15.1247675358,15.1248079152,15.1248482935,15.1248886706,15.1249290466,15.1249694215,15.1250097952,15.1250501678,15.1250905393,15.1251309097,15.1251712789,15.125211647,15.1252520139,15.1252923798,15.1253327445,15.125373108, 15.1254134705,15.1254538318,15.125494192,15.125534551,15.125574909,15.1256152658,15.1256556214,15.125695976,15.1257363294,15.1257766817,15.1258170328,15.1258573829,15.1258977318,15.1259380795,15.1259784262,15.1260187717, 15.1260591161,15.1260994593,15.1261398015,15.1261801425,15.1262204823,15.1262608211,15.1263011587,15.1263414952,15.1263818305,15.1264221648,15.1264624979,15.1265028299,15.1265431607,15.1265834904,15.126623819,15.1266641465, 15.1267044728,15.1267447981,15.1267851221,15.1268254451,15.1268657669,15.1269060876,15.1269464072,15.1269867257,15.127027043,15.1270673592,15.1271076743,15.1271479882,15.127188301,15.1272286127,15.1272689233,15.1273092327, 15.1273495411,15.1273898482,15.1274301543,15.1274704592,15.1275107631,15.1275510657,15.1275913673,15.1276316677,15.127671967,15.1277122652,15.1277525623,15.1277928582,15.127833153,15.1278734467,15.1279137392,15.1279540307, 15.127994321,15.1280346102,15.1280748982,15.1281151851,15.1281554709,15.1281957556,15.1282360392,15.1282763216,15.1283166029,15.1283568831,15.1283971621,15.1284374401,15.1284777169,15.1285179926,15.1285582671,15.1285985405, 15.1286388129,15.128679084,15.1287193541,15.128759623,15.1287998908,15.1288401575,15.1288804231,15.1289206875,15.1289609509,15.129001213,15.1290414741,15.1290817341,15.1291219929,15.1291622506,15.1292025072,15.1292427626, 15.1292830169,15.1293232702,15.1293635222,15.1294037732,15.129444023,15.1294842717,15.1295245193,15.1295647658,15.1296050112,15.1296452554,15.1296854985,15.1297257405,15.1297659813,15.129806221,15.1298464597,15.1298866971, 15.1299269335,15.1299671688,15.1300074029,15.1300476359,15.1300878678,15.1301280985,15.1301683281,15.1302085567,15.1302487841,15.1302890103,15.1303292355,15.1303694595,15.1304096824,15.1304499042,15.1304901248,15.1305303444, 15.1305705628,15.1306107801,15.1306509963,15.1306912113,15.1307314253,15.1307716381,15.1308118498,15.1308520604,15.1308922698,15.1309324781,15.1309726853,15.1310128914,15.1310530964,15.1310933003,15.131133503,15.1311737046, 15.1312139051,15.1312541045,15.1312943027,15.1313344998,15.1313746958,15.1314148907,15.1314550845,15.1314952771,15.1315354687,15.1315756591,15.1316158484,15.1316560365,15.1316962236,15.1317364095,15.1317765943,15.131816778, 15.1318569606,15.1318971421,15.1319373224,15.1319775016,15.1320176797,15.1320578567,15.1320980326,15.1321382073,15.1321783809,15.1322185534,15.1322587248,15.1322988951,15.1323390642,15.1323792322,15.1324193992,15.132459565, 15.1324997296,15.1325398932,15.1325800556,15.1326202169,15.1326603771,15.1327005362,15.1327406942,15.132780851,15.1328210068,15.1328611614,15.1329013149,15.1329414673,15.1329816185,15.1330217687,15.1330619177,15.1331020656, 15.1331422124,15.1331823581,15.1332225026,15.1332626461,15.1333027884,15.1333429296,15.1333830697,15.1334232087,15.1334633465,15.1335034833,15.1335436189,15.1335837534,15.1336238868,15.1336640191,15.1337041502,15.1337442803, 15.1337844092,15.133824537,15.1338646637,15.1339047893,15.1339449137,15.1339850371,15.1340251593,15.1340652804,15.1341054004,15.1341455193,15.134185637,15.1342257537,15.1342658692,15.1343059837,15.134346097,15.1343862091, 15.1344263202,15.1344664302,15.134506539,15.1345466468,15.1345867534,15.1346268589,15.1346669632,15.1347070665,15.1347471687,15.1347872697,15.1348273696,15.1348674684,15.1349075661,15.1349476627,15.1349877582,15.1350278525, 15.1350679458,15.1351080379,15.1351481289,15.1351882188,15.1352283076,15.1352683953,15.1353084818,15.1353485673,15.1353886516,15.1354287348,15.1354688169,15.1355088979,15.1355489777,15.1355890565,15.1356291342,15.1356692107, 15.1357092861,15.1357493604,15.1357894336,15.1358295057,15.1358695766,15.1359096465,15.1359497152,15.1359897829,15.1360298494,15.1360699148,15.1361099791,15.1361500423,15.1361901043,15.1362301653,15.1362702251,15.1363102838, 15.1363503415,15.136390398,15.1364304533,15.1364705076,15.1365105608,15.1365506128,15.1365906638,15.1366307136,15.1366707623,15.1367108099,15.1367508564,15.1367909018,15.1368309461,15.1368709893,15.1369110313,15.1369510723, 15.1369911121,15.1370311508,15.1370711884,15.1371112249,15.1371512603,15.1371912946,15.1372313277,15.1372713598,15.1373113907,15.1373514205,15.1373914492,15.1374314769,15.1374715034,15.1375115287,15.137551553,15.1375915762, 15.1376315982,15.1376716192,15.137711639,15.1377516577,15.1377916754,15.1378316919,15.1378717073,15.1379117215,15.1379517347,15.1379917468,15.1380317577,15.1380717676,15.1381117763,15.1381517839,15.1381917905,15.1382317959, 15.1382718002,15.1383118034,15.1383518054,15.1383918064,15.1384318063,15.138471805,15.1385118027,15.1385517992,15.1385917946,15.138631789,15.1386717822,15.1387117743,15.1387517653,15.1387917551,15.1388317439,15.1388717316, 15.1389117181,15.1389517036,15.1389916879,15.1390316712,15.1390716533,15.1391116343,15.1391516142,15.139191593,15.1392315707,15.1392715473,15.1393115228,15.1393514972,15.1393914704,15.1394314426,15.1394714136,15.1395113836, 15.1395513524,15.1395913201,15.1396312867,15.1396712523,15.1397112167,15.13975118,15.1397911422,15.1398311032,15.1398710632,15.1399110221,15.1399509798,15.1399909365,15.1400308921,15.1400708465,15.1401107998,15.1401507521, 15.1401907032,15.1402306532,15.1402706021,15.1403105499,15.1403504966,15.1403904422,15.1404303867,15.1404703301,15.1405102724,15.1405502135,15.1405901536,15.1406300926,15.1406700304,15.1407099672,15.1407499028,15.1407898373, 15.1408297708,15.1408697031,15.1409096343,15.1409495644,15.1409894934,15.1410294214,15.1410693482,15.1411092738,15.1411491984,15.1411891219,15.1412290443,15.1412689656,15.1413088858,15.1413488048,15.1413887228,15.1414286396, 15.1414685554,15.14150847,15.1415483836,15.141588296,15.1416282074,15.1416681176,15.1417080267,15.1417479348,15.1417878417,15.1418277475,15.1418676522,15.1419075558,15.1419474583,15.1419873597,15.14202726,15.1420671592, 15.1421070573,15.1421469543,15.1421868502,15.142226745,15.1422666386,15.1423065312,15.1423464227,15.1423863131,15.1424262023,15.1424660905,15.1425059775,15.1425458635,15.1425857484,15.1426256321,15.1426655148,15.1427053963, 15.1427452768,15.1427851561,15.1428250343,15.1428649115,15.1429047875,15.1429446624,15.1429845363,15.143024409,15.1430642806,15.1431041512,15.1431440206,15.1431838889,15.1432237561,15.1432636222,15.1433034873,15.1433433512, 15.143383214,15.1434230757,15.1434629363,15.1435027958,15.1435426542,15.1435825115,15.1436223677,15.1436622229,15.1437020769,15.1437419298,15.1437817816,15.1438216323,15.1438614819,15.1439013304,15.1439411778,15.1439810241, 15.1440208693,15.1440607134,15.1441005564,15.1441403983,15.1441802391,15.1442200788,15.1442599174,15.1442997549,15.1443395912,15.1443794265,15.1444192607,15.1444590938,15.1444989258,15.1445387567,15.1445785865,15.1446184152, 15.1446582428,15.1446980693,15.1447378947,15.144777719,15.1448175422,15.1448573643,15.1448971853,15.1449370052,15.1449768241,15.1450166418,15.1450564584,15.1450962739,15.1451360883,15.1451759016,15.1452157138,15.1452555249, 15.1452953349,15.1453351439,15.1453749517,15.1454147584,15.145454564,15.1454943685,15.145534172,15.1455739743,15.1456137755,15.1456535756,15.1456933747,15.1457331726,15.1457729694,15.1458127652,15.1458525598,15.1458923534, 15.1459321458,15.1459719372,15.1460117274,15.1460515166,15.1460913046,15.1461310916,15.1461708775,15.1462106622,15.1462504459,15.1462902285,15.1463300099,15.1463697903,15.1464095696,15.1464493478,15.1464891249,15.1465289008, 15.1465686757,15.1466084495,15.1466482222,15.1466879938,15.1467277643,15.1467675338,15.1468073021,15.1468470693,15.1468868354,15.1469266004,15.1469663644,15.1470061272,15.1470458889,15.1470856496,15.1471254091,15.1471651676, 15.1472049249,15.1472446812,15.1472844364,15.1473241904,15.1473639434,15.1474036953,15.1474434461,15.1474831958,15.1475229444,15.1475626918,15.1476024383,15.1476421836,15.1476819278,15.1477216709,15.1477614129,15.1478011538, 15.1478408937,15.1478806324,15.1479203701,15.1479601066,15.1479998421,15.1480395764,15.1480793097,15.1481190419,15.1481587729,15.1481985029,15.1482382318,15.1482779596,15.1483176863,15.1483574119,15.1483971364,15.1484368599, 15.1484765822,15.1485163034,15.1485560236,15.1485957426,15.1486354605,15.1486751774,15.1487148932,15.1487546078,15.1487943214,15.1488340339,15.1488737453,15.1489134556,15.1489531648,15.1489928729,15.1490325799,15.1490722859, 15.1491119907,15.1491516944,15.1491913971,15.1492310987,15.1492707991,15.1493104985,15.1493501968,15.149389894,15.1494295901,15.1494692851,15.149508979,15.1495486718,15.1495883635,15.1496280542,15.1496677437,15.1497074321, 15.1497471195,15.1497868058,15.1498264909,15.149866175,15.149905858,15.1499455399,15.1499852207,15.1500249005,15.1500645791,15.1501042566,15.1501439331,15.1501836084,15.1502232827,15.1502629558,15.1503026279,15.1503422989, 15.1503819688,15.1504216376,15.1504613053,15.150500972,15.1505406375,15.150580302,15.1506199653,15.1506596276,15.1506992887,15.1507389488,15.1507786078,15.1508182657,15.1508579225,15.1508975783,15.1509372329,15.1509768864, 15.1510165389,15.1510561903,15.1510958405,15.1511354897,15.1511751378,15.1512147848,15.1512544307,15.1512940756,15.1513337193,15.1513733619,15.1514130035,15.151452644,15.1514922833,15.1515319216,15.1515715588,15.1516111949, 15.15165083,15.1516904639,15.1517300968,15.1517697285,15.1518093592,15.1518489888,15.1518886173,15.1519282447,15.151967871,15.1520074962,15.1520471203,15.1520867434,15.1521263653,15.1521659862,15.152205606,15.1522452247, 15.1522848423,15.1523244588,15.1523640743,15.1524036886,15.1524433019,15.152482914,15.1525225251,15.1525621351,15.152601744,15.1526413518,15.1526809586,15.1527205642,15.1527601688,15.1527997722,15.1528393746,15.1528789759, 15.1529185761,15.1529581753,15.1529977733,15.1530373702,15.1530769661,15.1531165609,15.1531561546,15.1531957472,15.1532353387,15.1532749291,15.1533145185,15.1533541067,15.1533936939,15.15343328,15.153472865,15.1535124489, 15.1535520317,15.1535916134,15.1536311941,15.1536707737,15.1537103522,15.1537499295,15.1537895059,15.1538290811,15.1538686552,15.1539082283,15.1539478002,15.1539873711,15.1540269409,15.1540665096,15.1541060773,15.1541456438, 15.1541852093,15.1542247736,15.1542643369,15.1543038991,15.1543434602,15.1543830203,15.1544225792,15.1544621371,15.1545016939,15.1545412496,15.1545808042,15.1546203577,15.1546599101,15.1546994615,15.1547390118,15.1547785609, 15.1548181091,15.1548576561,15.154897202,15.1549367469,15.1549762906,15.1550158333,15.1550553749,15.1550949154,15.1551344549,15.1551739932,15.1552135305,15.1552530667,15.1552926018,15.1553321358,15.1553716687,15.1554112005, 15.1554507313,15.155490261,15.1555297896,15.1555693171,15.1556088435,15.1556483689,15.1556878932,15.1557274163,15.1557669384,15.1558064595,15.1558459794,15.1558854983,15.155925016,15.1559645327,15.1560040483,15.1560435628, 15.1560830763,15.1561225886,15.1561620999,15.1562016101,15.1562411192,15.1562806273,15.1563201342,15.1563596401,15.1563991449,15.1564386486,15.1564781512,15.1565176527,15.1565571532,15.1565966526,15.1566361509,15.1566756481, 15.1567151442,15.1567546393,15.1567941332,15.1568336261,15.1568731179,15.1569126087,15.1569520983,15.1569915869,15.1570310744,15.1570705608,15.1571100461,15.1571495304,15.1571890135,15.1572284956,15.1572679766,15.1573074565, 15.1573469354,15.1573864131,15.1574258898,15.1574653654,15.1575048399,15.1575443134,15.1575837857,15.157623257,15.1576627272,15.1577021963,15.1577416644,15.1577811313,15.1578205972,15.157860062,15.1578995257,15.1579389884, 15.1579784499,15.1580179104,15.1580573698,15.1580968282,15.1581362854,15.1581757416,15.1582151967,15.1582546507,15.1582941036,15.1583335555,15.1583730062,15.1584124559,15.1584519045,15.1584913521,15.1585307985,15.1585702439, 15.1586096882,15.1586491314,15.1586885736,15.1587280146,15.1587674546,15.1588068935,15.1588463314,15.1588857681,15.1589252038,15.1589646384,15.1590040719,15.1590435044,15.1590829357,15.159122366,15.1591617952,15.1592012234, 15.1592406504,15.1592800764,15.1593195013,15.1593589251,15.1593983479,15.1594377695,15.1594771901,15.1595166096,15.1595560281,15.1595954454,15.1596348617,15.1596742769,15.159713691,15.1597531041,15.1597925161,15.159831927, 15.1598713368,15.1599107455,15.1599501532,15.1599895598,15.1600289653,15.1600683697,15.1601077731,15.1601471754,15.1601865766,15.1602259767,15.1602653758,15.1603047738,15.1603441707,15.1603835665,15.1604229613,15.160462355, 15.1605017476,15.1605411391,15.1605805295,15.1606199189,15.1606593072,15.1606986944,15.1607380806,15.1607774657,15.1608168497,15.1608562326,15.1608956145,15.1609349952,15.1609743749,15.1610137536,15.1610531311,15.1610925076, 15.161131883,15.1611712573,15.1612106306,15.1612500027,15.1612893738,15.1613287439,15.1613681128,15.1614074807,15.1614468475,15.1614862133,15.1615255779,15.1615649415,15.161604304,15.1616436654,15.1616830258,15.1617223851, 15.1617617433,15.1618011004,15.1618404565,15.1618798115,15.1619191654,15.1619585183,15.16199787,15.1620372207,15.1620765704,15.1621159189,15.1621552664,15.1621946128,15.1622339581,15.1622733024,15.1623126456,15.1623519877, 15.1623913288,15.1624306687,15.1624700076,15.1625093454,15.1625486822,15.1625880179,15.1626273525,15.162666686,15.1627060185,15.1627453499,15.1627846802,15.1628240094,15.1628633376,15.1629026647,15.1629419907,15.1629813157, 15.1630206396,15.1630599624,15.1630992841,15.1631386048,15.1631779244,15.1632172429,15.1632565604,15.1632958768,15.1633351921,15.1633745063,15.1634138195,15.1634531316,15.1634924426,15.1635317526,15.1635710615,15.1636103693, 15.163649676,15.1636889817,15.1637282863,15.1637675898,15.1638068923,15.1638461937,15.163885494,15.1639247932,15.1639640914,15.1640033885,15.1640426846,15.1640819795,15.1641212734,15.1641605662,15.164199858,15.1642391487, 15.1642784383,15.1643177268,15.1643570143,15.1643963007,15.1644355861,15.1644748703,15.1645141535,15.1645534357,15.1645927167,15.1646319967,15.1646712756,15.1647105535,15.1647498302,15.164789106,15.1648283806,15.1648676542, 15.1649069267,15.1649461981,15.1649854685,15.1650247378,15.165064006,15.1651032732,15.1651425392,15.1651818043,15.1652210682,15.1652603311,15.1652995929,15.1653388537,15.1653781133,15.165417372,15.1654566295,15.165495886, 15.1655351414,15.1655743957,15.165613649,15.1656529012,15.1656921523,15.1657314024,15.1657706514,15.1658098993,15.1658491462,15.165888392,15.1659276367,15.1659668804,15.166006123,15.1660453645,15.1660846049,15.1661238443, 15.1661630826,15.1662023199,15.1662415561,15.1662807912,15.1663200253,15.1663592583,15.1663984902,15.166437721,15.1664769508,15.1665161795,15.1665554072,15.1665946338,15.1666338593,15.1666730838,15.1667123071,15.1667515295, 15.1667907507,15.1668299709,15.16686919,15.1669084081,15.1669476251,15.166986841,15.1670260559,15.1670652697,15.1671044824,15.167143694,15.1671829046,15.1672221142,15.1672613226,15.16730053,15.1673397364,15.1673789416, 15.1674181458,15.167457349,15.167496551,15.167535752,15.167574952,15.1676141509,15.1676533487,15.1676925454,15.1677317411,15.1677709357,15.1678101293,15.1678493218,15.1678885132,15.1679277035,15.1679668928,15.1680060811, 15.1680452682,15.1680844543,15.1681236394,15.1681628233,15.1682020062,15.1682411881,15.1682803689,15.1683195486,15.1683587272,15.1683979048,15.1684370813,15.1684762568,15.1685154312,15.1685546045,15.1685937768,15.168632948, 15.1686721181,15.1687112872,15.1687504552,15.1687896222,15.1688287881,15.1688679529,15.1689071166,15.1689462793,15.168985441,15.1690246016,15.1690637611,15.1691029195,15.1691420769,15.1691812332,15.1692203885,15.1692595427, 15.1692986958,15.1693378479,15.1693769989,15.1694161488,15.1694552977,15.1694944455,15.1695335923,15.169572738,15.1696118826,15.1696510262,15.1696901687,15.1697293101,15.1697684505,15.1698075898,15.1698467281,15.1698858653, 15.1699250014,15.1699641365,15.1700032705,15.1700424035,15.1700815354,15.1701206662,15.170159796,15.1701989247,15.1702380523,15.1702771789,15.1703163044,15.1703554289,15.1703945523,15.1704336747,15.1704727959,15.1705119162, 15.1705510353,15.1705901534,15.1706292705,15.1706683864,15.1707075013,15.1707466152,15.170785728,15.1708248397,15.1708639504,15.17090306,15.1709421686,15.1709812761,15.1710203825,15.1710594879,15.1710985922,15.1711376955, 15.1711767977,15.1712158988,15.1712549989,15.1712940979,15.1713331958,15.1713722927,15.1714113886,15.1714504833,15.1714895771,15.1715286697,15.1715677613,15.1716068519,15.1716459413,15.1716850298,15.1717241171,15.1717632034, 15.1718022887,15.1718413729,15.171880456,15.1719195381,15.1719586191,15.171997699,15.1720367779,15.1720758558,15.1721149325,15.1721540083,15.1721930829,15.1722321565,15.1722712291,15.1723103005,15.172349371,15.1723884403, 15.1724275086,15.1724665759,15.1725056421,15.1725447072,15.1725837713,15.1726228343,15.1726618963,15.1727009572,15.172740017,15.1727790758,15.1728181336,15.1728571903,15.1728962459,15.1729353004,15.1729743539,15.1730134064, 15.1730524578,15.1730915081,15.1731305574,15.1731696056,15.1732086528,15.1732476989,15.1732867439,15.1733257879,15.1733648308,15.1734038727,15.1734429136,15.1734819533,15.173520992,15.1735600297,15.1735990663,15.1736381018, 15.1736771363,15.1737161697,15.1737552021,15.1737942334,15.1738332637,15.1738722929,15.173911321,15.1739503481,15.1739893742,15.1740283991,15.1740674231,15.1741064459,15.1741454678,15.1741844885,15.1742235082,15.1742625269, 15.1743015445,15.174340561,15.1743795765,15.1744185909,15.1744576043,15.1744966166,15.1745356279,15.1745746381,15.1746136472,15.1746526553,15.1746916624,15.1747306684,15.1747696733,15.1748086772,15.17484768,15.1748866818, 15.1749256825,15.1749646822,15.1750036808,15.1750426783,15.1750816748,15.1751206703,15.1751596647,15.175198658,15.1752376503,15.1752766415,15.1753156317,15.1753546208,15.1753936089,15.1754325959,15.1754715819,15.1755105668, 15.1755495506,15.1755885334,15.1756275152,15.1756664959,15.1757054755,15.1757444541,15.1757834317,15.1758224081,15.1758613836,15.1759003579,15.1759393313,15.1759783035,15.1760172748,15.1760562449,15.176095214,15.1761341821, 15.1761731491,15.1762121151,15.17625108,15.1762900438,15.1763290066,15.1763679684,15.1764069291,15.1764458887,15.1764848473,15.1765238048,15.1765627613,15.1766017168,15.1766406711,15.1766796245,15.1767185767,15.176757528, 15.1767964781,15.1768354273,15.1768743753,15.1769133224,15.1769522683,15.1769912133,15.1770301571,15.1770690999,15.1771080417,15.1771469824,15.1771859221,15.1772248607,15.1772637983,15.1773027348,15.1773416702,15.1773806046, 15.177419538,15.1774584703,15.1774974016,15.1775363318,15.1775752609,15.177614189,15.1776531161,15.1776920421,15.177730967,15.1777698909,15.1778088138,15.1778477356,15.1778866563,15.1779255761,15.1779644947,15.1780034123, 15.1780423289,15.1780812444,15.1781201588,15.1781590722,15.1781979846,15.1782368959,15.1782758061,15.1783147154,15.1783536235,15.1783925306,15.1784314367,15.1784703417,15.1785092457,15.1785481486,15.1785870504,15.1786259512, 15.178664851,15.1787037497,15.1787426474,15.178781544,15.1788204396,15.1788593341,15.1788982276,15.17893712,15.1789760114,15.1790149017,15.179053791,15.1790926792,15.1791315664,15.1791704525,15.1792093376,15.1792482217, 15.1792871046,15.1793259866,15.1793648675,15.1794037473,15.1794426261,15.1794815039,15.1795203806,15.1795592562,15.1795981308,15.1796370044,15.1796758769,15.1797147484,15.1797536188,15.1797924882,15.1798313565,15.1798702238, 15.17990909,15.1799479552,15.1799868193,15.1800256824,15.1800645445,15.1801034055,15.1801422654,15.1801811243,15.1802199822,15.180258839,15.1802976947,15.1803365495,15.1803754031,15.1804142558,15.1804531073,15.1804919579, 15.1805308073,15.1805696558,15.1806085032,15.1806473495,15.1806861948,15.1807250391,15.1807638823,15.1808027244,15.1808415656,15.1808804056,15.1809192447,15.1809580826,15.1809969196,15.1810357555,15.1810745903,15.1811134241, 15.1811522569,15.1811910886,15.1812299192,15.1812687489,15.1813075774,15.181346405,15.1813852314,15.1814240569,15.1814628813,15.1815017046,15.1815405269,15.1815793482,15.1816181684,15.1816569876,15.1816958057,15.1817346228, 15.1817734388,15.1818122538,15.1818510677,15.1818898807,15.1819286925,15.1819675033,15.1820063131,15.1820451218,15.1820839295,15.1821227362,15.1821615417,15.1822003463,15.1822391498,15.1822779523,15.1823167537,15.1823555541, 15.1823943534,15.1824331517,15.1824719489,15.1825107451,15.1825495403,15.1825883344,15.1826271275,15.1826659195,15.1827047105,15.1827435005,15.1827822894,15.1828210772,15.182859864,15.1828986498,15.1829374345,15.1829762182, 15.1830150009,15.1830537825,15.183092563,15.1831313426,15.183170121,15.1832088985,15.1832476749,15.1832864502,15.1833252245,15.1833639978,15.18340277,15.1834415412,15.1834803113,15.1835190804,15.1835578485,15.1835966155, 15.1836353815,15.1836741464,15.1837129103,15.1837516731,15.1837904349,15.1838291957,15.1838679554,15.1839067141,15.1839454718,15.1839842284,15.1840229839,15.1840617384,15.1841004919,15.1841392443,15.1841779957,15.1842167461, 15.1842554954,15.1842942437,15.1843329909,15.1843717371,15.1844104822,15.1844492264,15.1844879694,15.1845267115,15.1845654524,15.1846041924,15.1846429313,15.1846816692,15.184720406,15.1847591418,15.1847978765,15.1848366102, 15.1848753429,15.1849140745,15.1849528051,15.1849915347,15.1850302632,15.1850689907,15.1851077171,15.1851464425,15.1851851668,15.1852238901,15.1852626124,15.1853013336,15.1853400538,15.185378773,15.1854174911,15.1854562082, 15.1854949242,15.1855336392,15.1855723532,15.1856110661,15.185649778,15.1856884888,15.1857271986,15.1857659074,15.1858046151,15.1858433218,15.1858820274,15.1859207321,15.1859594356,15.1859981382,15.1860368397,15.1860755401, 15.1861142395,15.1861529379,15.1861916353,15.1862303316,15.1862690268,15.1863077211,15.1863464143,15.1863851064,15.1864237975,15.1864624876,15.1865011767,15.1865398647,15.1865785516,15.1866172376,15.1866559225,15.1866946063, 15.1867332891,15.1867719709,15.1868106517,15.1868493314,15.18688801,15.1869266877,15.1869653643,15.1870040398,15.1870427143,15.1870813878,15.1871200603,15.1871587317,15.1871974021,15.1872360714,15.1872747397,15.187313407, 15.1873520732,15.1873907384,15.1874294026,15.1874680657,15.1875067278,15.1875453888,15.1875840488,15.1876227078,15.1876613657,15.1877000226,15.1877386785,15.1877773333,15.1878159871,15.1878546399,15.1878932916,15.1879319423, 15.187970592,15.1880092406,15.1880478882,15.1880865347,15.1881251803,15.1881638247,15.1882024682,15.1882411106,15.188279752,15.1883183923,15.1883570316,15.1883956699,15.1884343071,15.1884729433,15.1885115785,15.1885502126, 15.1885888457,15.1886274778,15.1886661088,15.1887047388,15.1887433677,15.1887819957,15.1888206226,15.1888592484,15.1888978732,15.188936497,15.1889751198,15.1890137415,15.1890523622,15.1890909818,15.1891296005,15.189168218, 15.1892068346,15.1892454501,15.1892840646,15.189322678,15.1893612905,15.1893999018,15.1894385122,15.1894771215,15.1895157298,15.1895543371,15.1895929433,15.1896315485,15.1896701526,15.1897087557,15.1897473578,15.1897859589, 15.1898245589,15.1898631579,15.1899017558,15.1899403527,15.1899789486,15.1900175435,15.1900561373,15.1900947301,15.1901333219,15.1901719126,15.1902105023,15.1902490909,15.1902876786,15.1903262652,15.1903648507,15.1904034353, 15.1904420188,15.1904806013,15.1905191827,15.1905577631,15.1905963425,15.1906349208,15.1906734981,15.1907120744,15.1907506497,15.1907892239,15.1908277971,15.1908663692,15.1909049403,15.1909435104,15.1909820795,15.1910206475, 15.1910592145,15.1910977805,15.1911363454,15.1911749093,15.1912134722,15.1912520341,15.1912905949,15.1913291547,15.1913677134,15.1914062711,15.1914448278,15.1914833835,15.1915219381,15.1915604917,15.1915990443,15.1916375958, 15.1916761464,15.1917146958,15.1917532443,15.1917917917,15.1918303381,15.1918688835,15.1919074278,15.1919459711,15.1919845134,15.1920230546,15.1920615948,15.192100134,15.1921386722,15.1921772093,15.1922157454,15.1922542804, 15.1922928145,15.1923313475,15.1923698795,15.1924084104,15.1924469403,15.1924854692,15.1925239971,15.1925625239,15.1926010497,15.1926395745,15.1926780982,15.192716621,15.1927551426,15.1927936633,15.1928321829,15.1928707015, 15.1929092191,15.1929477357,15.1929862512,15.1930247657,15.1930632791,15.1931017916,15.193140303,15.1931788133,15.1932173227,15.193255831,15.1932943383,15.1933328446,15.1933713498,15.193409854,15.1934483572,15.1934868594, 15.1935253605,15.1935638606,15.1936023597,15.1936408577,15.1936793547,15.1937178507,15.1937563457,15.1937948396,15.1938333325,15.1938718244,15.1939103153,15.1939488051,15.1939872939,15.1940257817,15.1940642684,15.1941027542, 15.1941412389,15.1941797225,15.1942182052,15.1942566868,15.1942951674,15.1943336469,15.1943721255,15.194410603,15.1944490795,15.1944875549,15.1945260294,15.1945645028,15.1946029752,15.1946414465,15.1946799168,15.1947183861, 15.1947568544,15.1947953217,15.1948337879,15.1948722531,15.1949107173,15.1949491804,15.1949876425,15.1950261036,15.1950645637,15.1951030228,15.1951414808,15.1951799378,15.1952183938,15.1952568487,15.1952953026,15.1953337555, 15.1953722074,15.1954106583,15.1954491081,15.1954875569,15.1955260046,15.1955644514,15.1956028971,15.1956413418,15.1956797855,15.1957182281,15.1957566698,15.1957951104,15.19583355,15.1958719885,15.195910426,15.1959488625, 15.195987298,15.1960257325,15.1960641659,15.1961025983,15.1961410297,15.1961794601,15.1962178894,15.1962563177,15.196294745,15.1963331713,15.1963715965,15.1964100208,15.196448444,15.1964868661,15.1965252873,15.1965637074, 15.1966021265,15.1966405446,15.1966789617,15.1967173777,15.1967557927,15.1967942067,15.1968326197,15.1968710316,15.1969094425,15.1969478524,15.1969862613,15.1970246692,15.197063076,15.1971014818,15.1971398866,15.1971782904, 15.1972166931,15.1972550948,15.1972934955,15.1973318952,15.1973702939,15.1974086915,15.1974470881,15.1974854837,15.1975238783,15.1975622718,15.1976006643,15.1976390558,15.1976774463,15.1977158358,15.1977542242,15.1977926116, 15.197830998,15.1978693834,15.1979077677,15.1979461511,15.1979845334,15.1980229147,15.1980612949,15.1980996742,15.1981380524,15.1981764296,15.1982148058,15.198253181,15.1982915551,15.1983299282,15.1983683003,15.1984066714, 15.1984450415,15.1984834105,15.1985217785,15.1985601455,15.1985985115,15.1986368764,15.1986752404,15.1987136033,15.1987519652,15.1987903261,15.1988286859,15.1988670448,15.1989054026,15.1989437594,15.1989821152,15.1990204699, 15.1990588237,15.1990971764,15.1991355281,15.1991738788,15.1992122284,15.1992505771,15.1992889247,15.1993272713,15.1993656169,15.1994039614,15.199442305,15.1994806475,15.199518989,15.1995573295,15.199595669,15.1996340074, 15.1996723448,15.1997106812,15.1997490166,15.199787351,15.1998256844,15.1998640167,15.199902348,15.1999406783,15.1999790076,15.2000173359,15.2000556631,15.2000939894,15.2001323146,15.2001706388,15.2002089619,15.2002472841, 15.2002856052,15.2003239253,15.2003622444,15.2004005625,15.2004388796,15.2004771956,15.2005155107,15.2005538247,15.2005921377,15.2006304497,15.2006687606,15.2007070706,15.2007453795,15.2007836874,15.2008219943,15.2008603002, 15.200898605,15.2009369089,15.2009752117,15.2010135135,15.2010518143,15.2010901141,15.2011284128,15.2011667106,15.2012050073,15.201243303,15.2012815977,15.2013198914,15.201358184,15.2013964757,15.2014347663,15.2014730559, 15.2015113445,15.2015496321,15.2015879186,15.2016262042,15.2016644887,15.2017027722,15.2017410547,15.2017793362,15.2018176167,15.2018558961,15.2018941746,15.201932452,15.2019707284,15.2020090038,15.2020472781,15.2020855515, 15.2021238238,15.2021620952,15.2022003655,15.2022386348,15.202276903,15.2023151703,15.2023534366,15.2023917018,15.202429966,15.2024682292,15.2025064914,15.2025447526,15.2025830127,15.2026212719,15.20265953,15.2026977871, 15.2027360433,15.2027742983,15.2028125524,15.2028508055,15.2028890575,15.2029273086,15.2029655586,15.2030038076,15.2030420556,15.2030803025,15.2031185485,15.2031567934,15.2031950374,15.2032332803,15.2032715222,15.2033097631, 15.203348003,15.2033862418,15.2034244797,15.2034627165,15.2035009524,15.2035391872,15.203577421,15.2036156538,15.2036538855,15.2036921163,15.203730346,15.2037685748,15.2038068025,15.2038450292,15.2038832549,15.2039214796, 15.2039597032,15.2039979259,15.2040361475,15.2040743682,15.2041125878,15.2041508064,15.204189024,15.2042272406,15.2042654561,15.2043036707,15.2043418842,15.2043800968,15.2044183083,15.2044565188,15.2044947283,15.2045329368, 15.2045711442,15.2046093507,15.2046475562,15.2046857606,15.204723964,15.2047621664,15.2048003678,15.2048385682,15.2048767676,15.204914966,15.2049531633,15.2049913597,15.205029555,15.2050677493,15.2051059426,15.2051441349, 15.2051823262,15.2052205165,15.2052587058,15.205296894,15.2053350813,15.2053732675,15.2054114527,15.2054496369,15.2054878202,15.2055260023,15.2055641835,15.2056023637,15.2056405429,15.205678721,15.2057168981,15.2057550743, 15.2057932494,15.2058314235,15.2058695966,15.2059077687,15.2059459398,15.2059841098,15.2060222789,15.206060447,15.206098614,15.20613678,15.206174945,15.2062131091,15.2062512721,15.2062894341,15.206327595,15.206365755, 15.206403914,15.2064420719,15.2064802289,15.2065183848,15.2065565397,15.2065946937,15.2066328466,15.2066709985,15.2067091494,15.2067472992,15.2067854481,15.206823596,15.2068617428,15.2068998887,15.2069380335,15.2069761774, 15.2070143202,15.207052462,15.2070906028,15.2071287426,15.2071668814,15.2072050192,15.2072431559,15.2072812917,15.2073194265,15.2073575602,15.2073956929,15.2074338247,15.2074719554,15.2075100851,15.2075482138,15.2075863415, 15.2076244682,15.2076625939,15.2077007186,15.2077388423,15.2077769649,15.2078150866,15.2078532072,15.2078913269,15.2079294455,15.2079675631,15.2080056798,15.2080437954,15.20808191,15.2081200236,15.2081581362,15.2081962478, 15.2082343583,15.2082724679,15.2083105765,15.208348684,15.2083867906,15.2084248961,15.2084630007,15.2085011042,15.2085392067,15.2085773083,15.2086154088,15.2086535083,15.2086916068,15.2087297043,15.2087678008,15.2088058963, 15.2088439907,15.2088820842,15.2089201767,15.2089582681,15.2089963586,15.209034448,15.2090725365,15.2091106239,15.2091487104,15.2091867958,15.2092248802,15.2092629636,15.209301046,15.2093391274,15.2093772078,15.2094152872, 15.2094533656,15.209491443,15.2095295194,15.2095675948,15.2096056691,15.2096437425,15.2096818149,15.2097198862,15.2097579566,15.2097960259,15.2098340943,15.2098721616,15.2099102279,15.2099482933,15.2099863576,15.2100244209, 15.2100624832,15.2101005446,15.2101386049,15.2101766642,15.2102147225,15.2102527798,15.2102908361,15.2103288913,15.2103669456,15.2104049989,15.2104430512,15.2104811025,15.2105191527,15.210557202,15.2105952503,15.2106332975, 15.2106713438,15.210709389,15.2107474333,15.2107854765,15.2108235188,15.21086156,15.2108996003,15.2109376395,15.2109756777,15.211013715,15.2110517512,15.2110897864,15.2111278206,15.2111658538,15.2112038861,15.2112419173, 15.2112799475,15.2113179767,15.2113560049,15.2113940321,15.2114320583,15.2114700835,15.2115081077,15.2115461309,15.2115841531,15.2116221743,15.2116601945,15.2116982136,15.2117362318,15.211774249,15.2118122652,15.2118502804, 15.2118882945,15.2119263077,15.2119643199,15.2120023311,15.2120403412,15.2120783504,15.2121163586,15.2121543657,15.2121923719,15.2122303771,15.2122683812,15.2123063844,15.2123443866,15.2123823877,15.2124203879,15.212458387, 15.2124963852,15.2125343824,15.2125723785,15.2126103737,15.2126483678,15.212686361,15.2127243531,15.2127623443,15.2128003344,15.2128383236,15.2128763117,15.2129142989,15.212952285,15.2129902702,15.2130282543,15.2130662375, 15.2131042196,15.2131422008,15.2131801809,15.2132181601,15.2132561382,15.2132941154,15.2133320916,15.2133700667,15.2134080409,15.213446014,15.2134839862,15.2135219573,15.2135599275,15.2135978966,15.2136358648,15.2136738319, 15.2137117981,15.2137497633,15.2137877274,15.2138256906,15.2138636527,15.2139016139,15.2139395741,15.2139775332,15.2140154914,15.2140534486,15.2140914047,15.2141293599,15.2141673141,15.2142052673,15.2142432194,15.2142811706, 15.2143191208,15.21435707,15.2143950182,15.2144329653,15.2144709115,15.2145088567,15.2145468009,15.2145847441,15.2146226863,15.2146606275,15.2146985677,15.2147365069,15.2147744451,15.2148123823,15.2148503185,15.2148882537, 15.2149261879,15.2149641212,15.2150020534,15.2150399846,15.2150779148,15.215115844,15.2151537723,15.2151916995,15.2152296257,15.215267551,15.2153054752,15.2153433985,15.2153813207,15.215419242,15.2154571622,15.2154950815, 15.2155329997,15.215570917,15.2156088333,15.2156467485,15.2156846628,15.2157225761,15.2157604884,15.2157983997,15.21583631,15.2158742193,15.2159121276,15.2159500349,15.2159879412,15.2160258465,15.2160637508,15.2161016541, 15.2161395564,15.2161774578,15.2162153581,15.2162532574,15.2162911558,15.2163290531,15.2163669494,15.2164048448,15.2164427392,15.2164806325,15.2165185249,15.2165564163,15.2165943066,15.216632196,15.2166700844,15.2167079718, 15.2167458582,15.2167837436,15.216821628,15.2168595114,15.2168973938,15.2169352753,15.2169731557,15.2170110351,15.2170489136,15.217086791,15.2171246675,15.2171625429,15.2172004174,15.2172382908,15.2172761633,15.2173140348, 15.2173519053,15.2173897748,15.2174276433,15.2174655108,15.2175033773,15.2175412428,15.2175791073,15.2176169708,15.2176548334,15.2176926949,15.2177305554,15.217768415,15.2178062736,15.2178441311,15.2178819877,15.2179198433, 15.2179576979,15.2179955515,15.2180334041,15.2180712557,15.2181091063,15.2181469559,15.2181848045,15.2182226522,15.2182604988,15.2182983444,15.2183361891,15.2183740328,15.2184118754,15.2184497171,15.2184875578,15.2185253975, 15.2185632362,15.2186010739,15.2186389106,15.2186767463,15.2187145811,15.2187524148,15.2187902476,15.2188280793,15.2188659101,15.2189037398,15.2189415686,15.2189793964,15.2190172232,15.219055049,15.2190928738,15.2191306976, 15.2191685205,15.2192063423,15.2192441631,15.219281983,15.2193198019,15.2193576197,15.2193954366,15.2194332525,15.2194710674,15.2195088813,15.2195466942,15.2195845061,15.2196223171,15.219660127,15.219697936,15.2197357439, 15.2197735509,15.2198113569,15.2198491619,15.2198869659,15.2199247689,15.2199625709,15.2200003719,15.2200381719,15.220075971,15.220113769,15.2201515661,15.2201893622,15.2202271573,15.2202649514,15.2203027445,15.2203405366, 15.2203783277,15.2204161178,15.220453907,15.2204916951,15.2205294823,15.2205672685,15.2206050537,15.2206428378,15.2206806211,15.2207184033,15.2207561845,15.2207939647,15.220831744,15.2208695222,15.2209072995,15.2209450758, 15.2209828511,15.2210206254,15.2210583987,15.221096171,15.2211339424,15.2211717127,15.2212094821,15.2212472504,15.2212850178,15.2213227842,15.2213605496,15.221398314,15.2214360774,15.2214738399,15.2215116013,15.2215493618, 15.2215871213,15.2216248797,15.2216626372,15.2217003938,15.2217381493,15.2217759038,15.2218136573,15.2218514099,15.2218891615,15.2219269121,15.2219646616,15.2220024102,15.2220401579,15.2220779045,15.2221156501,15.2221533948, 15.2221911385,15.2222288811,15.2222666228,15.2223043635,15.2223421032,15.222379842,15.2224175797,15.2224553165,15.2224930522,15.222530787,15.2225685208,15.2226062536,15.2226439855,15.2226817163,15.2227194461,15.222757175, 15.2227949029,15.2228326298,15.2228703557,15.2229080806,15.2229458045,15.2229835274,15.2230212494,15.2230589704,15.2230966903,15.2231344093,15.2231721274,15.2232098444,15.2232475604,15.2232852755,15.2233229895,15.2233607026, 15.2233984147,15.2234361258,15.2234738359,15.2235115451,15.2235492532,15.2235869604,15.2236246666,15.2236623718,15.223700076,15.2237377792,15.2237754815,15.2238131827,15.223850883,15.2238885823,15.2239262806,15.2239639779, 15.2240016742,15.2240393695,15.2240770639,15.2241147573,15.2241524497,15.2241901411,15.2242278315,15.2242655209,15.2243032094,15.2243408968,15.2243785833,15.2244162688,15.2244539533,15.2244916369,15.2245293194,15.224567001, 15.2246046815,15.2246423611,15.2246800397,15.2247177174,15.224755394,15.2247930697,15.2248307443,15.224868418,15.2249060907,15.2249437624,15.2249814332,15.2250191029,15.2250567717,15.2250944395,15.2251321063,15.2251697721, 15.2252074369,15.2252451008,15.2252827637,15.2253204256,15.2253580865,15.2253957464,15.2254334053,15.2254710633,15.2255087202,15.2255463762,15.2255840312,15.2256216853,15.2256593383,15.2256969903,15.2257346414,15.2257722915, 15.2258099406,15.2258475888,15.2258852359,15.2259228821,15.2259605272,15.2259981714,15.2260358146,15.2260734569,15.2261110981,15.2261487384,15.2261863777,15.226224016,15.2262616533,15.2262992897,15.226336925,15.2263745594, 15.2264121928,15.2264498252,15.2264874566,15.2265250871,15.2265627166,15.226600345,15.2266379725,15.2266755991,15.2267132246,15.2267508492,15.2267884728,15.2268260954,15.226863717,15.2269013376,15.2269389573,15.226976576, 15.2270141936,15.2270518104,15.2270894261,15.2271270409,15.2271646546,15.2272022674,15.2272398792,15.2272774901,15.2273150999,15.2273527088,15.2273903167,15.2274279236,15.2274655295,15.2275031345,15.2275407384,15.2275783414, 15.2276159434,15.2276535444,15.2276911445,15.2277287436,15.2277663416,15.2278039388,15.2278415349,15.22787913,15.2279167242,15.2279543174,15.2279919096,15.2280295008,15.2280670911,15.2281046804,15.2281422686,15.228179856, 15.2282174423,15.2282550276,15.228292612,15.2283301954,15.2283677778,15.2284053593,15.2284429397,15.2284805192,15.2285180977,15.2285556752,15.2285932518,15.2286308273,15.2286684019,15.2287059755,15.2287435482,15.2287811198, 15.2288186905,15.2288562602,15.2288938289,15.2289313966,15.2289689634,15.2290065292,15.229044094,15.2290816578,15.2291192207,15.2291567825,15.2291943434,15.2292319033,15.2292694623,15.2293070202,15.2293445772,15.2293821332, 15.2294196882,15.2294572423,15.2294947953,15.2295323474,15.2295698986,15.2296074487,15.2296449978,15.229682546,15.2297200932,15.2297576395,15.2297951847,15.229832729,15.2298702723,15.2299078146,15.229945356,15.2299828963, 15.2300204357,15.2300579741,15.2300955116,15.230133048,15.2301705835,15.230208118,15.2302456515,15.2302831841,15.2303207157,15.2303582463,15.2303957759,15.2304333045,15.2304708322,15.2305083589,15.2305458846,15.2305834094, 15.2306209331,15.2306584559,15.2306959777,15.2307334986,15.2307710184,15.2308085373,15.2308460552,15.2308835722,15.2309210881,15.2309586031,15.2309961171,15.2310336302,15.2310711422,15.2311086533,15.2311461634,15.2311836726, 15.2312211807,15.2312586879,15.2312961941,15.2313336993,15.2313712036,15.2314087069,15.2314462092,15.2314837105,15.2315212109,15.2315587103,15.2315962087,15.2316337061,15.2316712026,15.231708698,15.2317461926,15.2317836861, 15.2318211787,15.2318586702,15.2318961609,15.2319336505,15.2319711392,15.2320086269,15.2320461136,15.2320835993,15.2321210841,15.2321585679,15.2321960507,15.2322335325,15.2322710134,15.2323084933,15.2323459722,15.2323834502, 15.2324209272,15.2324584032,15.2324958782,15.2325333523,15.2325708254,15.2326082975,15.2326457686,15.2326832388,15.232720708,15.2327581762,15.2327956434,15.2328331097,15.232870575,15.2329080393,15.2329455027,15.2329829651, 15.2330204265,15.2330578869,15.2330953464,15.2331328049,15.2331702624,15.2332077189,15.2332451745,15.2332826291,15.2333200827,15.2333575354,15.2333949871,15.2334324378,15.2334698875,15.2335073363,15.2335447841,15.2335822309, 15.2336196768,15.2336571216,15.2336945655,15.2337320085,15.2337694504,15.2338068914,15.2338443315,15.2338817705,15.2339192086,15.2339566457,15.2339940818,15.234031517,15.2340689512,15.2341063844,15.2341438167,15.2341812479, 15.2342186782,15.2342561076,15.2342935359,15.2343309633,15.2343683898,15.2344058152,15.2344432397,15.2344806632,15.2345180857,15.2345555073,15.2345929279,15.2346303475,15.2346677662,15.2347051839,15.2347426006,15.2347800163, 15.2348174311,15.2348548449,15.2348922578,15.2349296696,15.2349670805,15.2350044904,15.2350418994,15.2350793074,15.2351167144,15.2351541204,15.2351915255,15.2352289296,15.2352663328,15.2353037349,15.2353411361,15.2353785363, 15.2354159356,15.2354533339,15.2354907312,15.2355281276,15.2355655229,15.2356029173,15.2356403108,15.2356777033,15.2357150948,15.2357524853,15.2357898749,15.2358272635,15.2358646511,15.2359020377,15.2359394234,15.2359768081, 15.2360141919,15.2360515747,15.2360889565,15.2361263373,15.2361637172,15.2362010961,15.2362384741,15.236275851,15.236313227,15.2363506021,15.2363879761,15.2364253492,15.2364627214,15.2365000925,15.2365374627,15.236574832, 15.2366122002,15.2366495675,15.2366869338,15.2367242992,15.2367616636,15.236799027,15.2368363894,15.2368737509,15.2369111114,15.236948471,15.2369858296,15.2370231872,15.2370605438,15.2370978995,15.2371352542,15.237172608, 15.2372099608,15.2372473126,15.2372846634,15.2373220133,15.2373593622,15.2373967101,15.2374340571,15.2374714031,15.2375087482,15.2375460922,15.2375834354,15.2376207775,15.2376581187,15.2376954589,15.2377327981,15.2377701364, 15.2378074737,15.2378448101,15.2378821454,15.2379194799,15.2379568133,15.2379941458,15.2380314773,15.2380688078,15.2381061374,15.238143466,15.2381807937,15.2382181204,15.2382554461,15.2382927709,15.2383300946,15.2383674175, 15.2384047393,15.2384420602,15.2384793801,15.2385166991,15.2385540171,15.2385913341,15.2386286502,15.2386659653,15.2387032794,15.2387405926,15.2387779048,15.238815216,15.2388525263,15.2388898356,15.238927144,15.2389644514, 15.2390017578,15.2390390632,15.2390763677,15.2391136712,15.2391509738,15.2391882754,15.239225576,15.2392628757,15.2393001744,15.2393374721,15.2393747689,15.2394120647,15.2394493595,15.2394866534,15.2395239463,15.2395612383, 15.2395985292,15.2396358193,15.2396731083,15.2397103964,15.2397476836,15.2397849697,15.2398222549,15.2398595392,15.2398968224,15.2399341048,15.2399713861,15.2400086665,15.2400459459,15.2400832244,15.2401205019,15.2401577784, 15.240195054,15.2402323286,15.2402696022,15.2403068749,15.2403441466,15.2403814174,15.2404186872,15.240455956,15.2404932239,15.2405304908,15.2405677567,15.2406050217,15.2406422857,15.2406795488,15.2407168109,15.240754072, 15.2407913322,15.2408285914,15.2408658496,15.2409031069,15.2409403632,15.2409776186,15.241014873,15.2410521264,15.2410893789,15.2411266304,15.2411638809,15.2412011305,15.2412383791,15.2412756268,15.2413128735,15.2413501192, 15.241387364,15.2414246078,15.2414618507,15.2414990926,15.2415363335,15.2415735735,15.2416108125,15.2416480505,15.2416852876,15.2417225237,15.2417597589,15.2417969931,15.2418342263,15.2418714586,15.2419086899,15.2419459203, 15.2419831497,15.2420203781,15.2420576056,15.2420948321,15.2421320577,15.2421692823,15.2422065059,15.2422437286,15.2422809503,15.2423181711,15.2423553909,15.2423926097,15.2424298276,15.2424670445,15.2425042604,15.2425414754, 15.2425786895,15.2426159025,15.2426531146,15.2426903258,15.242727536,15.2427647452,15.2428019535,15.2428391608,15.2428763672,15.2429135726,15.242950777,15.2429879805,15.243025183,15.2430623846,15.2430995852,15.2431367848, 15.2431739835,15.2432111812,15.243248378,15.2432855738,15.2433227686,15.2433599625,15.2433971554,15.2434343474,15.2434715384,15.2435087284,15.2435459175,15.2435831057,15.2436202928,15.2436574791,15.2436946643,15.2437318486, 15.243769032,15.2438062143,15.2438433958,15.2438805762,15.2439177557,15.2439549343,15.2439921119,15.2440292885,15.2440664642,15.2441036389,15.2441408127,15.2441779855,15.2442151573,15.2442523282,15.2442894981,15.2443266671, 15.2443638351,15.2444010022,15.2444381683,15.2444753334,15.2445124976,15.2445496608,15.2445868231,15.2446239844,15.2446611448,15.2446983042,15.2447354626,15.2447726201,15.2448097766,15.2448469322,15.2448840868,15.2449212405, 15.2449583932,15.2449955449,15.2450326957,15.2450698455,15.2451069944,15.2451441423,15.2451812893,15.2452184353,15.2452555803,15.2452927244,15.2453298675,15.2453670097,15.2454041509,15.2454412912,15.2454784305,15.2455155689, 15.2455527063,15.2455898427,15.2456269782,15.2456641127,15.2457012463,15.2457383789,15.2457755106,15.2458126413,15.245849771,15.2458868998,15.2459240277,15.2459611545,15.2459982805,15.2460354054,15.2460725295,15.2461096525, 15.2461467746,15.2461838958,15.246221016,15.2462581352,15.2462952535,15.2463323708,15.2463694872,15.2464066026,15.2464437171,15.2464808306,15.2465179432,15.2465550548,15.2465921654,15.2466292751,15.2466663839,15.2467034917, 15.2467405985,15.2467777044,15.2468148093,15.2468519133,15.2468890163,15.2469261183,15.2469632194,15.2470003196,15.2470374188,15.247074517,15.2471116143,15.2471487107,15.247185806,15.2472229005,15.2472599939,15.2472970865, 15.247334178,15.2473712686,15.2474083583,15.247445447,15.2474825348,15.2475196216,15.2475567074,15.2475937923,15.2476308762,15.2476679592,15.2477050413,15.2477421223,15.2477792025,15.2478162816,15.2478533599,15.2478904371, 15.2479275134,15.2479645888,15.2480016632,15.2480387367,15.2480758092,15.2481128807,15.2481499513,15.248187021,15.2482240897,15.2482611574,15.2482982242,15.24833529,15.2483723549,15.2484094189,15.2484464818,15.2484835439, 15.2485206049,15.2485576651,15.2485947242,15.2486317825,15.2486688397,15.248705896,15.2487429514,15.2487800058,15.2488170593,15.2488541118,15.2488911633,15.248928214,15.2489652636,15.2490023123,15.2490393601,15.2490764069, 15.2491134527,15.2491504976,15.2491875416,15.2492245846,15.2492616266,15.2492986677,15.2493357078,15.249372747,15.2494097853,15.2494468226,15.2494838589,15.2495208943,15.2495579287,15.2495949622,15.2496319947,15.2496690263, 15.249706057,15.2497430867,15.2497801154,15.2498171432,15.24985417,15.2498911959,15.2499282208,15.2499652448,15.2500022678,15.2500392899,15.2500763111,15.2501133312,15.2501503505,15.2501873688,15.2502243861,15.2502614025, 15.2502984179,15.2503354324,15.2503724459,15.2504094585,15.2504464701,15.2504834808,15.2505204906,15.2505574994,15.2505945072,15.2506315141,15.25066852,15.250705525,15.2507425291,15.2507795321,15.2508165343,15.2508535355, 15.2508905357,15.250927535,15.2509645334,15.2510015308,15.2510385272,15.2510755227,15.2511125173,15.2511495109,15.2511865035,15.2512234952,15.251260486,15.2512974758,15.2513344647,15.2513714526,15.2514084395,15.2514454256, 15.2514824106,15.2515193947,15.2515563779,15.2515933601,15.2516303414,15.2516673217,15.2517043011,15.2517412796,15.251778257,15.2518152336,15.2518522092,15.2518891838,15.2519261575,15.2519631302,15.252000102,15.2520370729, 15.2520740428,15.2521110118,15.2521479798,15.2521849468,15.2522219129,15.2522588781,15.2522958423,15.2523328056,15.2523697679,15.2524067293,15.2524436897,15.2524806492,15.2525176078,15.2525545654,15.252591522,15.2526284777, 15.2526654325,15.2527023863,15.2527393391,15.252776291,15.252813242,15.252850192,15.2528871411,15.2529240892,15.2529610364,15.2529979826,15.2530349279,15.2530718723,15.2531088157,15.2531457581,15.2531826996,15.2532196402, 15.2532565798,15.2532935184,15.2533304562,15.2533673929,15.2534043288,15.2534412637,15.2534781976,15.2535151306,15.2535520626,15.2535889937,15.2536259239,15.2536628531,15.2536997814,15.2537367087,15.2537736351,15.2538105605, 15.253847485,15.2538844085,15.2539213311,15.2539582528,15.2539951735,15.2540320932,15.2540690121,15.2541059299,15.2541428469,15.2541797628,15.2542166779,15.254253592,15.2542905051,15.2543274173,15.2543643286,15.2544012389, 15.2544381483,15.2544750567,15.2545119642,15.2545488707,15.2545857763,15.254622681,15.2546595847,15.2546964874,15.2547333892,15.2547702901,15.2548071901,15.254844089,15.2548809871,15.2549178842,15.2549547803,15.2549916755, 15.2550285698,15.2550654631,15.2551023555,15.255139247,15.2551761375,15.255213027,15.2552499156,15.2552868033,15.25532369,15.2553605758,15.2553974606,15.2554343445,15.2554712275,15.2555081095,15.2555449905,15.2555818707, 15.2556187498,15.2556556281,15.2556925054,15.2557293817,15.2557662571,15.2558031316,15.2558400051,15.2558768777,15.2559137493,15.25595062,15.2559874898,15.2560243586,15.2560612265,15.2560980934,15.2561349594,15.2561718244, 15.2562086885,15.2562455517,15.2562824139,15.2563192752,15.2563561355,15.2563929949,15.2564298534,15.2564667109,15.2565035674,15.2565404231,15.2565772777,15.2566141315,15.2566509843,15.2566878361,15.2567246871,15.256761537, 15.2567983861,15.2568352342,15.2568720813,15.2569089275,15.2569457728,15.2569826171,15.2570194605,15.257056303,15.2570931445,15.2571299851,15.2571668247,15.2572036634,15.2572405011,15.2572773379,15.2573141738,15.2573510087, 15.2573878427,15.2574246757,15.2574615078,15.257498339,15.2575351692,15.2575719985,15.2576088268,15.2576456542,15.2576824807,15.2577193062,15.2577561308,15.2577929545,15.2578297772,15.2578665989,15.2579034197,15.2579402396, 15.2579770586,15.2580138766,15.2580506936,15.2580875098,15.2581243249,15.2581611392,15.2581979525,15.2582347649,15.2582715763,15.2583083868,15.2583451963,15.2583820049,15.2584188126,15.2584556193,15.2584924251,15.25852923, 15.2585660339,15.2586028369,15.2586396389,15.25867644,15.2587132402,15.2587500394,15.2587868377,15.258823635,15.2588604314,15.2588972269,15.2589340214,15.258970815,15.2590076076,15.2590443994,15.2590811901,15.25911798, 15.2591547689,15.2591915568,15.2592283438,15.2592651299,15.2593019151,15.2593386993,15.2593754826,15.2594122649,15.2594490463,15.2594858267,15.2595226063,15.2595593848,15.2595961625,15.2596329392,15.259669715,15.2597064898, 15.2597432637,15.2597800366,15.2598168087,15.2598535798,15.2598903499,15.2599271191,15.2599638874,15.2600006547,15.2600374211,15.2600741866,15.2601109511,15.2601477147,15.2601844773,15.260221239,15.2602579998,15.2602947597, 15.2603315186,15.2603682765,15.2604050336,15.2604417896,15.2604785448,15.260515299,15.2605520523,15.2605888047,15.2606255561,15.2606623065,15.2606990561,15.2607358047,15.2607725524,15.2608092991,15.2608460449,15.2608827897, 15.2609195337,15.2609562767,15.2609930187,15.2610297598,15.2610665,15.2611032392,15.2611399776,15.2611767149,15.2612134514,15.2612501869,15.2612869214,15.2613236551,15.2613603878,15.2613971195,15.2614338504,15.2614705802, 15.2615073092,15.2615440372,15.2615807643,15.2616174905,15.2616542157,15.26169094,15.2617276633,15.2617643857,15.2618011072,15.2618378277,15.2618745473,15.261911266,15.2619479838,15.2619847006,15.2620214164,15.2620581314, 15.2620948454,15.2621315584,15.2621682706,15.2622049818,15.262241692,15.2622784014,15.2623151098,15.2623518172,15.2623885238,15.2624252293,15.262461934,15.2624986377,15.2625353405,15.2625720424,15.2626087433,15.2626454433, 15.2626821424,15.2627188405,15.2627555377,15.2627922339,15.2628289293,15.2628656237,15.2629023171,15.2629390096,15.2629757012,15.2630123919,15.2630490816,15.2630857704,15.2631224583,15.2631591452,15.2631958312,15.2632325162, 15.2632692004,15.2633058836,15.2633425658,15.2633792472,15.2634159276,15.263452607,15.2634892856,15.2635259632,15.2635626398,15.2635993156,15.2636359904,15.2636726642,15.2637093372,15.2637460092,15.2637826802,15.2638193504, 15.2638560196,15.2638926879,15.2639293552,15.2639660216,15.2640026871,15.2640393517,15.2640760153,15.264112678,15.2641493397,15.2641860005,15.2642226604,15.2642593194,15.2642959774,15.2643326345,15.2643692907,15.2644059459, 15.2644426002,15.2644792536,15.264515906,15.2645525575,15.2645892081,15.2646258578,15.2646625065,15.2646991543,15.2647358011,15.2647724471,15.264809092,15.2648457361,15.2648823792,15.2649190214,15.2649556627,15.264992303, 15.2650289425,15.2650655809,15.2651022185,15.2651388551,15.2651754908,15.2652121255,15.2652487594,15.2652853923,15.2653220242,15.2653586553,15.2653952854,15.2654319146,15.2654685428,15.2655051701,15.2655417965,15.265578422, 15.2656150465,15.2656516701,15.2656882927,15.2657249145,15.2657615353,15.2657981552,15.2658347741,15.2658713921,15.2659080092,15.2659446254,15.2659812406,15.2660178549,15.2660544683,15.2660910807,15.2661276923,15.2661643028, 15.2662009125,15.2662375212,15.266274129,15.2663107359,15.2663473418,15.2663839468,15.2664205509,15.2664571541,15.2664937563,15.2665303576,15.266566958,15.2666035574,15.2666401559,15.2666767535,15.2667133502,15.2667499459, 15.2667865407,15.2668231346,15.2668597275,15.2668963195,15.2669329106,15.2669695008,15.26700609,15.2670426783,15.2670792657,15.2671158521,15.2671524376,15.2671890222,15.2672256059,15.2672621886,15.2672987704,15.2673353513, 15.2673719313,15.2674085103,15.2674450884,15.2674816656,15.2675182418,15.2675548171,15.2675913915,15.267627965,15.2676645375,15.2677011091,15.2677376798,15.2677742495,15.2678108184,15.2678473863,15.2678839532,15.2679205193, 15.2679570844,15.2679936486,15.2680302119,15.2680667742,15.2681033356,15.2681398961,15.2681764557,15.2682130143,15.268249572,15.2682861288,15.2683226846,15.2683592396,15.2683957936,15.2684323466,15.2684688988,15.26850545, 15.2685420003,15.2685785497,15.2686150981,15.2686516456,15.2686881922,15.2687247379,15.2687612826,15.2687978265,15.2688343693,15.2688709113,15.2689074523,15.2689439925,15.2689805316,15.2690170699,15.2690536073,15.2690901437, 15.2691266791,15.2691632137,15.2691997473,15.2692362801,15.2692728118,15.2693093427,15.2693458726,15.2693824017,15.2694189297,15.2694554569,15.2694919831,15.2695285085,15.2695650328,15.2696015563,15.2696380788,15.2696746005, 15.2697111211,15.2697476409,15.2697841597,15.2698206777,15.2698571947,15.2698937107,15.2699302259,15.2699667401,15.2700032534,15.2700397657,15.2700762772,15.2701127877,15.2701492973,15.270185806,15.2702223137,15.2702588206, 15.2702953265,15.2703318315,15.2703683355,15.2704048386,15.2704413408,15.2704778421,15.2705143425,15.2705508419,15.2705873404,15.270623838,15.2706603347,15.2706968305,15.2707333253,15.2707698192,15.2708063121,15.2708428042, 15.2708792953,15.2709157855,15.2709522748,15.2709887632,15.2710252506,15.2710617371,15.2710982227,15.2711347074,15.2711711911,15.271207674,15.2712441559,15.2712806368,15.2713171169,15.271353596,15.2713900742,15.2714265515, 15.2714630279,15.2714995033,15.2715359779,15.2715724515,15.2716089242,15.2716453959,15.2716818667,15.2717183367,15.2717548056,15.2717912737,15.2718277409,15.2718642071,15.2719006724,15.2719371368,15.2719736002,15.2720100628, 15.2720465244,15.2720829851,15.2721194449,15.2721559037,15.2721923616,15.2722288187,15.2722652747,15.2723017299,15.2723381842,15.2723746375,15.2724110899,15.2724475414,15.2724839919,15.2725204416,15.2725568903,15.2725933381, 15.272629785,15.2726662309,15.272702676,15.2727391201,15.2727755633,15.2728120056,15.2728484469,15.2728848874,15.2729213269,15.2729577655,15.2729942031,15.2730306399,15.2730670757,15.2731035106,15.2731399446,15.2731763777, 15.2732128099,15.2732492411,15.2732856714,15.2733221008,15.2733585293,15.2733949568,15.2734313835,15.2734678092,15.273504234,15.2735406578,15.2735770808,15.2736135028,15.2736499239,15.2736863441,15.2737227634,15.2737591818, 15.2737955992,15.2738320157,15.2738684313,15.273904846,15.2739412598,15.2739776726,15.2740140845,15.2740504955,15.2740869056,15.2741233148,15.274159723,15.2741961304,15.2742325368,15.2742689423,15.2743053469,15.2743417505, 15.2743781532,15.2744145551,15.274450956,15.2744873559,15.274523755,15.2745601532,15.2745965504,15.2746329467,15.2746693421,15.2747057365,15.2747421301,15.2747785227,15.2748149145,15.2748513053,15.2748876951,15.2749240841, 15.2749604721,15.2749968593,15.2750332455,15.2750696308,15.2751060151,15.2751423986,15.2751787811,15.2752151628,15.2752515435,15.2752879233,15.2753243021,15.2753606801,15.2753970571,15.2754334332,15.2754698084,15.2755061827, 15.2755425561,15.2755789285,15.2756153001,15.2756516707,15.2756880404,15.2757244092,15.275760777,15.275797144,15.27583351,15.2758698751,15.2759062393,15.2759426026,15.275978965,15.2760153264,15.276051687,15.2760880466, 15.2761244053,15.2761607631,15.2761971199,15.2762334759,15.2762698309,15.276306185,15.2763425382,15.2763788905,15.2764152419,15.2764515923,15.2764879419,15.2765242905,15.2765606382,15.276596985,15.2766333309,15.2766696758, 15.2767060199,15.276742363,15.2767787052,15.2768150465,15.2768513869,15.2768877264,15.2769240649,15.2769604026,15.2769967393,15.2770330751,15.27706941,15.277105744,15.277142077,15.2771784092,15.2772147404,15.2772510707, 15.2772874001,15.2773237286,15.2773600562,15.2773963828,15.2774327086,15.2774690334,15.2775053573,15.2775416803,15.2775780024,15.2776143236,15.2776506438,15.2776869632,15.2777232816,15.2777595991,15.2777959157,15.2778322314, 15.2778685462,15.27790486,15.277941173,15.277977485,15.2780137961,15.2780501063,15.2780864156,15.278122724,15.2781590314,15.278195338,15.2782316436,15.2782679483,15.2783042521,15.278340555,15.278376857,15.2784131581, 15.2784494582,15.2784857575,15.2785220558,15.2785583532,15.2785946497,15.2786309453,15.2786672399,15.2787035337,15.2787398266,15.2787761185,15.2788124095,15.2788486996,15.2788849888,15.2789212771,15.2789575645,15.2789938509, 15.2790301364,15.2790664211,15.2791027048,15.2791389876,15.2791752695,15.2792115505,15.2792478305,15.2792841097,15.2793203879,15.2793566653,15.2793929417,15.2794292172,15.2794654918,15.2795017655,15.2795380382,15.2795743101, 15.2796105811,15.2796468511,15.2796831202,15.2797193884,15.2797556557,15.2797919221,15.2798281876,15.2798644521,15.2799007158,15.2799369785,15.2799732404,15.2800095013,15.2800457613,15.2800820204,15.2801182786,15.2801545359, 15.2801907922,15.2802270477,15.2802633022,15.2802995558,15.2803358086,15.2803720604,15.2804083113,15.2804445612,15.2804808103,15.2805170585,15.2805533057,15.2805895521,15.2806257975,15.280662042,15.2806982856,15.2807345283, 15.2807707701,15.280807011,15.280843251,15.28087949,15.2809157282,15.2809519654,15.2809882018,15.2810244372,15.2810606717,15.2810969053,15.281133138,15.2811693697,15.2812056006,15.2812418306,15.2812780596,15.2813142878, 15.281350515,15.2813867413,15.2814229667,15.2814591912,15.2814954148,15.2815316375,15.2815678593,15.2816040801,15.2816403001,15.2816765191,15.2817127372,15.2817489545,15.2817851708,15.2818213862,15.2818576007,15.2818938143, 15.281930027,15.2819662387,15.2820024496,15.2820386595,15.2820748686,15.2821110767,15.2821472839,15.2821834903,15.2822196957,15.2822559002,15.2822921038,15.2823283064,15.2823645082,15.2824007091,15.282436909,15.2824731081, 15.2825093062,15.2825455035,15.2825816998,15.2826178952,15.2826540897,15.2826902833,15.282726476,15.2827626678,15.2827988587,15.2828350487,15.2828712377,15.2829074259,15.2829436131,15.2829797995,15.2830159849,15.2830521694, 15.283088353,15.2831245357,15.2831607175,15.2831968984,15.2832330784,15.2832692575,15.2833054357,15.2833416129,15.2833777893,15.2834139647,15.2834501393,15.2834863129,15.2835224856,15.2835586575,15.2835948284,15.2836309984, 15.2836671675,15.2837033357,15.283739503,15.2837756694,15.2838118348,15.2838479994,15.2838841631,15.2839203258,15.2839564877,15.2839926486,15.2840288086,15.2840649678,15.284101126,15.2841372833,15.2841734397,15.2842095952, 15.2842457498,15.2842819035,15.2843180563,15.2843542082,15.2843903592,15.2844265092,15.2844626584,15.2844988067,15.284534954,15.2845711005,15.284607246,15.2846433906,15.2846795344,15.2847156772,15.2847518191,15.2847879601, 15.2848241002,15.2848602394,15.2848963777,15.2849325151,15.2849686516,15.2850047872,15.2850409219,15.2850770556,15.2851131885,15.2851493205,15.2851854515,15.2852215817,15.2852577109,15.2852938393,15.2853299667,15.2853660932, 15.2854022189,15.2854383436,15.2854744674,15.2855105903,15.2855467123,15.2855828334,15.2856189536,15.2856550729,15.2856911913,15.2857273088,15.2857634254,15.2857995411,15.2858356559,15.2858717697,15.2859078827,15.2859439948, 15.2859801059,15.2860162162,15.2860523255,15.286088434,15.2861245415,15.2861606482,15.2861967539,15.2862328587,15.2862689627,15.2863050657,15.2863411678,15.2863772691,15.2864133694,15.2864494688,15.2864855673,15.2865216649, 15.2865577616,15.2865938574,15.2866299523,15.2866660463,15.2867021394,15.2867382316,15.2867743229,15.2868104133,15.2868465027,15.2868825913,15.286918679,15.2869547658,15.2869908516,15.2870269366,15.2870630207,15.2870991038, 15.2871351861,15.2871712674,15.2872073479,15.2872434275,15.2872795061,15.2873155839,15.2873516607,15.2873877366,15.2874238117,15.2874598858,15.2874959591,15.2875320314,15.2875681028,15.2876041734,15.287640243,15.2876763117, 15.2877123795,15.2877484465,15.2877845125,15.2878205776,15.2878566418,15.2878927052,15.2879287676,15.2879648291,15.2880008897,15.2880369494,15.2880730082,15.2881090661,15.2881451232,15.2881811793,15.2882172345,15.2882532888, 15.2882893422,15.2883253947,15.2883614463,15.288397497,15.2884335468,15.2884695957,15.2885056437,15.2885416908,15.288577737,15.2886137823,15.2886498267,15.2886858702,15.2887219128,15.2887579545,15.2887939953,15.2888300352, 15.2888660742,15.2889021123,15.2889381495,15.2889741858,15.2890102211,15.2890462556,15.2890822892,15.2891183219,15.2891543537,15.2891903846,15.2892264146,15.2892624437,15.2892984719,15.2893344992,15.2893705256,15.2894065511, 15.2894425757,15.2894785994,15.2895146222,15.2895506441,15.2895866651,15.2896226852,15.2896587044,15.2896947227,15.2897307401,15.2897667566,15.2898027722,15.2898387869,15.2898748007,15.2899108136,15.2899468256,15.2899828367, 15.2900188469,15.2900548562,15.2900908647,15.2901268722,15.2901628788,15.2901988845,15.2902348893,15.2902708932,15.2903068963,15.2903428984,15.2903788996,15.2904148999,15.2904508994,15.2904868979,15.2905228955,15.2905588922, 15.2905948881,15.290630883,15.2906668771,15.2907028702,15.2907388624,15.2907748538,15.2908108442,15.2908468338,15.2908828224,15.2909188102,15.290954797,15.290990783,15.2910267681,15.2910627522,15.2910987355,15.2911347179, 15.2911706993,15.2912066799,15.2912426596,15.2912786383,15.2913146162,15.2913505932,15.2913865693,15.2914225445,15.2914585188,15.2914944922,15.2915304647,15.2915664363,15.291602407,15.2916383768,15.2916743457,15.2917103137, 15.2917462808,15.2917822471,15.2918182124,15.2918541768,15.2918901403,15.291926103,15.2919620647,15.2919980256,15.2920339855,15.2920699445,15.2921059027,15.29214186,15.2921778163,15.2922137718,15.2922497264,15.29228568, 15.2923216328,15.2923575847,15.2923935357,15.2924294858,15.2924654349,15.2925013832,15.2925373306,15.2925732772,15.2926092228,15.2926451675,15.2926811113,15.2927170542,15.2927529962,15.2927889374,15.2928248776,15.292860817, 15.2928967554,15.292932693,15.2929686296,15.2930045654,15.2930405002,15.2930764342,15.2931123673,15.2931482995,15.2931842308,15.2932201612,15.2932560906,15.2932920192,15.293327947,15.2933638738,15.2933997997,15.2934357247, 15.2934716488,15.2935075721,15.2935434944,15.2935794159,15.2936153364,15.2936512561,15.2936871748,15.2937230927,15.2937590097,15.2937949257,15.2938308409,15.2938667552,15.2939026686,15.2939385811,15.2939744927,15.2940104034, 15.2940463133,15.2940822222,15.2941181302,15.2941540374,15.2941899436,15.294225849,15.2942617534,15.294297657,15.2943335597,15.2943694615,15.2944053623,15.2944412623,15.2944771614,15.2945130596,15.2945489569,15.2945848534, 15.2946207489,15.2946566435,15.2946925373,15.2947284301,15.2947643221,15.2948002131,15.2948361033,15.2948719926,15.294907881,15.2949437684,15.294979655,15.2950155407,15.2950514256,15.2950873095,15.2951231925,15.2951590746, 15.2951949559,15.2952308362,15.2952667157,15.2953025943,15.2953384719,15.2953743487,15.2954102246,15.2954460996,15.2954819737,15.2955178469,15.2955537192,15.2955895907,15.2956254612,15.2956613308,15.2956971996,15.2957330675, 15.2957689344,15.2958048005,15.2958406657,15.29587653,15.2959123934,15.2959482559,15.2959841175,15.2960199782,15.2960558381,15.296091697,15.2961275551,15.2961634122,15.2961992685,15.2962351239,15.2962709784,15.296306832, 15.2963426847,15.2963785365,15.2964143874,15.2964502375,15.2964860866,15.2965219349,15.2965577822,15.2965936287,15.2966294743,15.296665319,15.2967011628,15.2967370057,15.2967728477,15.2968086888,15.2968445291,15.2968803684, 15.2969162069,15.2969520444,15.2969878811,15.2970237169,15.2970595518,15.2970953858,15.2971312189,15.2971670512,15.2972028825,15.2972387129,15.2972745425,15.2973103712,15.2973461989,15.2973820258,15.2974178518,15.2974536769, 15.2974895012,15.2975253245,15.2975611469,15.2975969685,15.2976327891,15.2976686089,15.2977044278,15.2977402458,15.2977760629,15.2978118791,15.2978476944,15.2978835089,15.2979193224,15.2979551351,15.2979909468,15.2980267577, 15.2980625677,15.2980983768,15.298134185,15.2981699924,15.2982057988,15.2982416043,15.298277409,15.2983132128,15.2983490157,15.2983848177,15.2984206188,15.298456419,15.2984922183,15.2985280167,15.2985638143,15.298599611, 15.2986354067,15.2986712016,15.2987069956,15.2987427887,15.298778581,15.2988143723,15.2988501627,15.2988859523,15.298921741,15.2989575288,15.2989933156,15.2990291017,15.2990648868,15.299100671,15.2991364544,15.2991722368, 15.2992080184,15.2992437991,15.2992795789,15.2993153578,15.2993511358,15.2993869129,15.2994226892,15.2994584645,15.299494239,15.2995300126,15.2995657853,15.2996015571,15.299637328,15.2996730981,15.2997088672,15.2997446355, 15.2997804029,15.2998161693,15.299851935,15.2998876997,15.2999234635,15.2999592264,15.2999949885,15.3000307497,15.30006651,15.3001022694,15.3001380279,15.3001737855,15.3002095422,15.3002452981,15.3002810531,15.3003168071, 15.3003525603,15.3003883126,15.3004240641,15.3004598146,15.3004955642,15.300531313,15.3005670609,15.3006028079,15.300638554,15.3006742992,15.3007100436,15.300745787,15.3007815296,15.3008172712,15.300853012,15.300888752, 15.300924491,15.3009602291,15.3009959664,15.3010317027,15.3010674382,15.3011031728,15.3011389065,15.3011746394,15.3012103713,15.3012461024,15.3012818325,15.3013175618,15.3013532902,15.3013890177,15.3014247444,15.3014604701, 15.301496195,15.301531919,15.3015676421,15.3016033643,15.3016390856,15.301674806,15.3017105256,15.3017462443,15.3017819621,15.301817679,15.301853395,15.3018891101,15.3019248244,15.3019605377,15.3019962502,15.3020319618, 15.3020676725,15.3021033824,15.3021390913,15.3021747994,15.3022105065,15.3022462128,15.3022819183,15.3023176228,15.3023533264,15.3023890292,15.3024247311,15.3024604321,15.3024961322,15.3025318314,15.3025675297,15.3026032272, 15.3026389238,15.3026746195,15.3027103143,15.3027460082,15.3027817013,15.3028173934,15.3028530847,15.3028887751,15.3029244646,15.3029601532,15.302995841,15.3030315279,15.3030672138,15.3031028989,15.3031385832,15.3031742665, 15.3032099489,15.3032456305,15.3032813112,15.303316991,15.3033526699,15.303388348,15.3034240251,15.3034597014,15.3034953768,15.3035310513,15.3035667249,15.3036023977,15.3036380695,15.3036737405,15.3037094106,15.3037450798, 15.3037807482,15.3038164156,15.3038520822,15.3038877479,15.3039234127,15.3039590766,15.3039947397,15.3040304018,15.3040660631,15.3041017235,15.304137383,15.3041730417,15.3042086994,15.3042443563,15.3042800123,15.3043156674, 15.3043513217,15.304386975,15.3044226275,15.3044582791,15.3044939298,15.3045295796,15.3045652286,15.3046008766,15.3046365238,15.3046721701,15.3047078155,15.3047434601,15.3047791037,15.3048147465,15.3048503884,15.3048860294, 15.3049216696,15.3049573088,15.3049929472,15.3050285847,15.3050642213,15.3050998571,15.3051354919,15.3051711259,15.305206759,15.3052423912,15.3052780226,15.305313653,15.3053492826,15.3053849113,15.3054205391,15.3054561661, 15.3054917921,15.3055274173,15.3055630416,15.305598665,15.3056342875,15.3056699092,15.30570553,15.3057411499,15.3057767689,15.3058123871,15.3058480043,15.3058836207,15.3059192362,15.3059548508,15.3059904646,15.3060260774, 15.3060616894,15.3060973005,15.3061329108,15.3061685201,15.3062041286,15.3062397362,15.3062753429,15.3063109487,15.3063465537,15.3063821578,15.306417761,15.3064533633,15.3064889647,15.3065245653,15.306560165,15.3065957638, 15.3066313617,15.3066669588,15.3067025549,15.3067381502,15.3067737446,15.3068093382,15.3068449308,15.3068805226,15.3069161135,15.3069517035,15.3069872927,15.307022881,15.3070584684,15.3070940549,15.3071296405,15.3071652253, 15.3072008091,15.3072363921,15.3072719743,15.3073075555,15.3073431359,15.3073787154,15.307414294,15.3074498717,15.3074854486,15.3075210246,15.3075565997,15.3075921739,15.3076277473,15.3076633197,15.3076988913,15.307734462, 15.3077700319,15.3078056009,15.3078411689,15.3078767362,15.3079123025,15.307947868,15.3079834325,15.3080189962,15.3080545591,15.308090121,15.3081256821,15.3081612423,15.3081968016,15.3082323601,15.3082679176,15.3083034743, 15.3083390301,15.3083745851,15.3084101391,15.3084456923,15.3084812446,15.3085167961,15.3085523466,15.3085878963,15.3086234451,15.3086589931,15.3086945401,15.3087300863,15.3087656316,15.308801176,15.3088367196,15.3088722623, 15.3089078041,15.308943345,15.308978885,15.3090144242,15.3090499625,15.3090854999,15.3091210365,15.3091565722,15.309192107,15.3092276409,15.3092631739,15.3092987061,15.3093342374,15.3093697678,15.3094052974,15.309440826, 15.3094763538,15.3095118808,15.3095474068,15.309582932,15.3096184563,15.3096539797,15.3096895023,15.3097250239,15.3097605447,15.3097960647,15.3098315837,15.3098671019,15.3099026192,15.3099381356,15.3099736512,15.3100091658, 15.3100446796,15.3100801926,15.3101157046,15.3101512158,15.3101867261,15.3102222356,15.3102577441,15.3102932518,15.3103287586,15.3103642646,15.3103997696,15.3104352738,15.3104707771,15.3105062796,15.3105417811,15.3105772818, 15.3106127817,15.3106482806,15.3106837787,15.3107192759,15.3107547722,15.3107902677,15.3108257623,15.310861256,15.3108967488,15.3109322408,15.3109677318,15.3110032221,15.3110387114,15.3110741999,15.3111096875,15.3111451742, 15.3111806601,15.311216145,15.3112516291,15.3112871124,15.3113225947,15.3113580762,15.3113935568,15.3114290366,15.3114645154,15.3114999934,15.3115354706,15.3115709468,15.3116064222,15.3116418967,15.3116773703,15.3117128431, 15.311748315,15.311783786,15.3118192562,15.3118547254,15.3118901939,15.3119256614,15.311961128,15.3119965938,15.3120320587,15.3120675228,15.312102986,15.3121384483,15.3121739097,15.3122093702,15.3122448299,15.3122802887, 15.3123157467,15.3123512038,15.31238666,15.3124221153,15.3124575697,15.3124930233,15.312528476,15.3125639279,15.3125993789,15.312634829,15.3126702782,15.3127057266,15.312741174,15.3127766207,15.3128120664,15.3128475113, 15.3128829553,15.3129183984,15.3129538407,15.3129892821,15.3130247226,15.3130601622,15.313095601,15.3131310389,15.313166476,15.3132019121,15.3132373474,15.3132727819,15.3133082154,15.3133436481,15.3133790799,15.3134145109, 15.313449941,15.3134853702,15.3135207985,15.313556226,15.3135916526,15.3136270783,15.3136625032,15.3136979271,15.3137333503,15.3137687725,15.3138041939,15.3138396144,15.313875034,15.3139104528,15.3139458707,15.3139812877, 15.3140167039,15.3140521192,15.3140875336,15.3141229472,15.3141583599,15.3141937717,15.3142291826,15.3142645927,15.3143000019,15.3143354102,15.3143708177,15.3144062243,15.31444163,15.3144770349,15.3145124389,15.314547842, 15.3145832443,15.3146186457,15.3146540462,15.3146894458,15.3147248446,15.3147602425,15.3147956396,15.3148310357,15.3148664311,15.3149018255,15.3149372191,15.3149726118,15.3150080036,15.3150433946,15.3150787847,15.3151141739, 15.3151495623,15.3151849498,15.3152203364,15.3152557221,15.315291107,15.315326491,15.3153618742,15.3153972565,15.3154326379,15.3154680185,15.3155033981,15.315538777,15.3155741549,15.315609532,15.3156449082,15.3156802835, 15.315715658,15.3157510316,15.3157864044,15.3158217763,15.3158571473,15.3158925174,15.3159278867,15.3159632551,15.3159986226,15.3160339893,15.3160693551,15.31610472,15.3161400841,15.3161754473,15.3162108097,15.3162461711, 15.3162815317,15.3163168915,15.3163522504,15.3163876084,15.3164229655,15.3164583218,15.3164936772,15.3165290317,15.3165643854,15.3165997382,15.3166350901,15.3166704412,15.3167057914,15.3167411408,15.3167764892,15.3168118369, 15.3168471836,15.3168825295,15.3169178745,15.3169532186,15.3169885619,15.3170239043,15.3170592459,15.3170945866,15.3171299264,15.3171652653,15.3172006034,15.3172359406,15.317271277,15.3173066125,15.3173419471,15.3173772809, 15.3174126138,15.3174479458,15.317483277,15.3175186073,15.3175539367,15.3175892653,15.317624593,15.3176599198,15.3176952458,15.3177305709,15.3177658951,15.3178012185,15.317836541,15.3178718627,15.3179071834,15.3179425034, 15.3179778224,15.3180131406,15.3180484579,15.3180837744,15.31811909,15.3181544047,15.3181897186,15.3182250316,15.3182603437,15.318295655,15.3183309654,15.3183662749,15.3184015836,15.3184368914,15.3184721984,15.3185075045, 15.3185428097,15.3185781141,15.3186134176,15.3186487202,15.318684022,15.3187193229,15.3187546229,15.3187899221,15.3188252204,15.3188605179,15.3188958144,15.3189311102,15.318966405,15.319001699,15.3190369921,15.3190722844, 15.3191075758,15.3191428664,15.319178156,15.3192134449,15.3192487328,15.3192840199,15.3193193061,15.3193545915,15.319389876,15.3194251596,15.3194604424,15.3194957243,15.3195310054,15.3195662856,15.3196015649,15.3196368433, 15.3196721209,15.3197073977,15.3197426736,15.3197779486,15.3198132227,15.319848496,15.3198837684,15.31991904,15.3199543107,15.3199895805,15.3200248495,15.3200601176,15.3200953849,15.3201306512,15.3201659168,15.3202011814, 15.3202364452,15.3202717082,15.3203069703,15.3203422315,15.3203774918,15.3204127513,15.32044801,15.3204832677,15.3205185246,15.3205537807,15.3205890359,15.3206242902,15.3206595436,15.3206947962,15.320730048,15.3207652989, 15.3208005489,15.320835798,15.3208710463,15.3209062938,15.3209415403,15.320976786,15.3210120309,15.3210472749,15.321082518,15.3211177603,15.3211530017,15.3211882422,15.3212234819,15.3212587207,15.3212939587,15.3213291958, 15.321364432,15.3213996674,15.3214349019,15.3214701356,15.3215053684,15.3215406003,15.3215758314,15.3216110616,15.321646291,15.3216815195,15.3217167471,15.3217519739,15.3217871998,15.3218224249,15.3218576491,15.3218928724, 15.3219280949,15.3219633165,15.3219985373,15.3220337572,15.3220689762,15.3221041944,15.3221394117,15.3221746282,15.3222098437,15.3222450585,15.3222802724,15.3223154854,15.3223506975,15.3223859088,15.3224211193,15.3224563289, 15.3224915376,15.3225267455,15.3225619525,15.3225971586,15.3226323639,15.3226675683,15.3227027719,15.3227379746,15.3227731765,15.3228083774,15.3228435776,15.3228787769,15.3229139753,15.3229491728,15.3229843695,15.3230195654, 15.3230547603,15.3230899545,15.3231251477,15.3231603401,15.3231955317,15.3232307224,15.3232659122,15.3233011012,15.3233362893,15.3233714765,15.3234066629,15.3234418485,15.3234770332,15.323512217,15.3235473999,15.323582582, 15.3236177633,15.3236529437,15.3236881232,15.3237233019,15.3237584797,15.3237936567,15.3238288328,15.323864008,15.3238991824,15.3239343559,15.3239695286,15.3240047004,15.3240398714,15.3240750415,15.3241102107,15.3241453791, 15.3241805466,15.3242157133,15.3242508791,15.3242860441,15.3243212082,15.3243563714,15.3243915338,15.3244266953,15.324461856,15.3244970158,15.3245321747,15.3245673328,15.3246024901,15.3246376465,15.324672802,15.3247079567, 15.3247431105,15.3247782635,15.3248134156,15.3248485668,15.3248837172,15.3249188667,15.3249540154,15.3249891632,15.3250243102,15.3250594563,15.3250946016,15.3251297459,15.3251648895,15.3252000322,15.325235174,15.325270315, 15.3253054551,15.3253405943,15.3253757328,15.3254108703,15.325446007,15.3254811428,15.3255162778,15.3255514119,15.3255865452,15.3256216776,15.3256568092,15.3256919399,15.3257270697,15.3257621987,15.3257973269,15.3258324541, 15.3258675806,15.3259027061,15.3259378309,15.3259729547,15.3260080777,15.3260431999,15.3260783212,15.3261134416,15.3261485612,15.3261836799,15.3262187978,15.3262539148,15.326289031,15.3263241463,15.3263592608,15.3263943744, 15.3264294871,15.326464599,15.3264997101,15.3265348202,15.3265699296,15.326605038,15.3266401457,15.3266752524,15.3267103583,15.3267454634,15.3267805676,15.326815671,15.3268507735,15.3268858751,15.3269209759,15.3269560758, 15.3269911749,15.3270262731,15.3270613705,15.327096467,15.3271315627,15.3271666575,15.3272017515,15.3272368446,15.3272719368,15.3273070282,15.3273421187,15.3273772084,15.3274122973,15.3274473853,15.3274824724,15.3275175587, 15.3275526441,15.3275877287,15.3276228124,15.3276578952,15.3276929772,15.3277280584,15.3277631387,15.3277982182,15.3278332968,15.3278683745,15.3279034514,15.3279385274,15.3279736026,15.3280086769,15.3280437504,15.3280788231, 15.3281138948,15.3281489658,15.3281840358,15.328219105,15.3282541734,15.3282892409,15.3283243076,15.3283593734,15.3283944384,15.3284295025,15.3284645657,15.3284996281,15.3285346897,15.3285697504,15.3286048102,15.3286398692, 15.3286749273,15.3287099846,15.3287450411,15.3287800966,15.3288151514,15.3288502052,15.3288852583,15.3289203105,15.3289553618,15.3289904123,15.3290254619,15.3290605106,15.3290955586,15.3291306056,15.3291656519,15.3292006972, 15.3292357417,15.3292707854,15.3293058282,15.3293408702,15.3293759113,15.3294109515,15.3294459909,15.3294810295,15.3295160672,15.3295511041,15.3295861401,15.3296211752,15.3296562095,15.329691243,15.3297262756,15.3297613073, 15.3297963382,15.3298313683,15.3298663975,15.3299014258,15.3299364533,15.32997148,15.3300065058,15.3300415307,15.3300765548,15.330111578,15.3301466004,15.330181622,15.3302166427,15.3302516625,15.3302866815,15.3303216997, 15.330356717,15.3303917334,15.330426749,15.3304617637,15.3304967776,15.3305317907,15.3305668029,15.3306018142,15.3306368247,15.3306718344,15.3307068432,15.3307418511,15.3307768582,15.3308118645,15.3308468699,15.3308818744, 15.3309168781,15.330951881,15.330986883,15.3310218841,15.3310568844,15.3310918839,15.3311268825,15.3311618802,15.3311968772,15.3312318732,15.3312668684,15.3313018628,15.3313368563,15.331371849,15.3314068408,15.3314418317, 15.3314768219,15.3315118111,15.3315467995,15.3315817871,15.3316167738,15.3316517597,15.3316867447,15.3317217289,15.3317567123,15.3317916947,15.3318266764,15.3318616572,15.3318966371,15.3319316162,15.3319665944,15.3320015718, 15.3320365484,15.3320715241,15.3321064989,15.3321414729,15.3321764461,15.3322114184,15.3322463898,15.3322813604,15.3323163302,15.3323512991,15.3323862672,15.3324212344,15.3324562008,15.3324911663,15.332526131,15.3325610948, 15.3325960578,15.3326310199,15.3326659812,15.3327009417,15.3327359012,15.33277086,15.3328058179,15.3328407749,15.3328757312,15.3329106865,15.332945641,15.3329805947,15.3330155475,15.3330504995,15.3330854506,15.3331204009, 15.3331553503,15.3331902989,15.3332252466,15.3332601935,15.3332951396,15.3333300848,15.3333650291,15.3333999726,15.3334349153,15.3334698571,15.3335047981,15.3335397382,15.3335746775,15.3336096159,15.3336445535,15.3336794902, 15.3337144261,15.3337493611,15.3337842953,15.3338192287,15.3338541612,15.3338890929,15.3339240237,15.3339589536,15.3339938828,15.334028811,15.3340637385,15.3340986651,15.3341335908,15.3341685157,15.3342034397,15.3342383629, 15.3342732853,15.3343082068,15.3343431275,15.3343780473,15.3344129663,15.3344478844,15.3344828017,15.3345177182,15.3345526338,15.3345875485,15.3346224624,15.3346573755,15.3346922877,15.3347271991,15.3347621096,15.3347970193, 15.3348319281,15.3348668361,15.3349017433,15.3349366496,15.334971555,15.3350064596,15.3350413634,15.3350762663,15.3351111684,15.3351460697,15.3351809701,15.3352158696,15.3352507683,15.3352856662,15.3353205632,15.3353554594, 15.3353903547,15.3354252492,15.3354601428,15.3354950356,15.3355299276,15.3355648187,15.3355997089,15.3356345984,15.3356694869,15.3357043747,15.3357392616,15.3357741476,15.3358090328,15.3358439172,15.3358788007,15.3359136834, 15.3359485652,15.3359834462,15.3360183263,15.3360532056,15.3360880841,15.3361229617,15.3361578385,15.3361927144,15.3362275895,15.3362624637,15.3362973371,15.3363322097,15.3363670814,15.3364019523,15.3364368223,15.3364716915, 15.3365065598,15.3365414273,15.336576294,15.3366111598,15.3366460247,15.3366808889,15.3367157522,15.3367506146,15.3367854762,15.336820337,15.3368551969,15.336890056,15.3369249142,15.3369597716,15.3369946281,15.3370294838, 15.3370643387,15.3370991927,15.3371340459,15.3371688982,15.3372037497,15.3372386004,15.3372734502,15.3373082991,15.3373431473,15.3373779946,15.337412841,15.3374476866,15.3374825314,15.3375173753,15.3375522184,15.3375870606, 15.337621902,15.3376567425,15.3376915823,15.3377264211,15.3377612592,15.3377960963,15.3378309327,15.3378657682,15.3379006029,15.3379354367,15.3379702697,15.3380051018,15.3380399331,15.3380747636,15.3381095932,15.338144422, 15.3381792499,15.338214077,15.3382489033,15.3382837287,15.3383185532,15.338353377,15.3383881999,15.3384230219,15.3384578431,15.3384926635,15.338527483,15.3385623017,15.3385971196,15.3386319366,15.3386667528,15.3387015681, 15.3387363826,15.3387711962,15.338806009,15.338840821,15.3388756321,15.3389104424,15.3389452519,15.3389800605,15.3390148683,15.3390496752,15.3390844813,15.3391192865,15.3391540909,15.3391888945,15.3392236972,15.3392584991, 15.3392933002,15.3393281004,15.3393628998,15.3393976983,15.339432496,15.3394672929,15.3395020889,15.339536884,15.3395716784,15.3396064719,15.3396412645,15.3396760564,15.3397108473,15.3397456375,15.3397804268,15.3398152153, 15.3398500029,15.3398847897,15.3399195756,15.3399543607,15.339989145,15.3400239284,15.340058711,15.3400934928,15.3401282737,15.3401630538,15.340197833,15.3402326114,15.340267389,15.3403021657,15.3403369416,15.3403717166, 15.3404064909,15.3404412642,15.3404760368,15.3405108085,15.3405455793,15.3405803493,15.3406151185,15.3406498869,15.3406846544,15.340719421,15.3407541869,15.3407889519,15.340823716,15.3408584793,15.3408932418,15.3409280034, 15.3409627643,15.3409975242,15.3410322833,15.3410670416,15.3411017991,15.3411365557,15.3411713115,15.3412060664,15.3412408205,15.3412755738,15.3413103262,15.3413450778,15.3413798286,15.3414145785,15.3414493276,15.3414840758, 15.3415188232,15.3415535698,15.3415883156,15.3416230605,15.3416578045,15.3416925477,15.3417272901,15.3417620317,15.3417967724,15.3418315123,15.3418662513,15.3419009895,15.3419357269,15.3419704634,15.3420051991,15.342039934, 15.342074668,15.3421094012,15.3421441335,15.3421788651,15.3422135957,15.3422483256,15.3422830546,15.3423177828,15.3423525101,15.3423872366,15.3424219623,15.3424566871,15.3424914111,15.3425261342,15.3425608565,15.342595578, 15.3426302987,15.3426650185,15.3426997375,15.3427344556,15.3427691729,15.3428038894,15.342838605,15.3428733198,15.3429080338,15.3429427469,15.3429774592,15.3430121707,15.3430468813,15.3430815911,15.3431163,15.3431510082, 15.3431857154,15.3432204219,15.3432551275,15.3432898323,15.3433245362,15.3433592393,15.3433939416,15.3434286431,15.3434633437,15.3434980434,15.3435327424,15.3435674405,15.3436021377,15.3436368342,15.3436715298,15.3437062245, 15.3437409185,15.3437756116,15.3438103038,15.3438449953,15.3438796858,15.3439143756,15.3439490645,15.3439837526,15.3440184399,15.3440531263,15.3440878119,15.3441224966,15.3441571806,15.3441918637,15.3442265459,15.3442612273, 15.3442959079,15.3443305877,15.3443652666,15.3443999447,15.3444346219,15.3444692983,15.3445039739,15.3445386487,15.3445733226,15.3446079957,15.3446426679,15.3446773394,15.3447120099,15.3447466797,15.3447813486,15.3448160167, 15.3448506839,15.3448853504,15.3449200159,15.3449546807,15.3449893446,15.3450240077,15.34505867,15.3450933314,15.345127992,15.3451626517,15.3451973107,15.3452319687,15.345266626,15.3453012824,15.345335938,15.3453705928, 15.3454052467,15.3454398998,15.3454745521,15.3455092035,15.3455438541,15.3455785039,15.3456131528,15.3456478009,15.3456824482,15.3457170946,15.3457517402,15.345786385,15.345821029,15.3458556721,15.3458903143,15.3459249558, 15.3459595964,15.3459942362,15.3460288751,15.3460635133,15.3460981505,15.346132787,15.3461674226,15.3462020574,15.3462366914,15.3462713245,15.3463059568,15.3463405883,15.3463752189,15.3464098487,15.3464444777,15.3464791059, 15.3465137332,15.3465483596,15.3465829853,15.3466176101,15.3466522341,15.3466868573,15.3467214796,15.3467561011,15.3467907218,15.3468253416,15.3468599606,15.3468945788,15.3469291961,15.3469638126,15.3469984283,15.3470330431, 15.3470676572,15.3471022704,15.3471368827,15.3471714942,15.3472061049,15.3472407148,15.3472753238,15.3473099321,15.3473445394,15.347379146,15.3474137517,15.3474483566,15.3474829606,15.3475175639,15.3475521663,15.3475867678, 15.3476213686,15.3476559685,15.3476905676,15.3477251658,15.3477597632,15.3477943598,15.3478289556,15.3478635505,15.3478981446,15.3479327379,15.3479673303,15.3480019219,15.3480365127,15.3480711027,15.3481056918,15.3481402801, 15.3481748675,15.3482094542,15.34824404,15.348278625,15.3483132091,15.3483477924,15.3483823749,15.3484169566,15.3484515374,15.3484861174,15.3485206966,15.3485552749,15.3485898524,15.3486244291,15.348659005,15.34869358, 15.3487281542,15.3487627276,15.3487973002,15.3488318719,15.3488664428,15.3489010128,15.348935582,15.3489701505,15.349004718,15.3490392848,15.3490738507,15.3491084158,15.34914298,15.3491775435,15.3492121061,15.3492466679, 15.3492812288,15.3493157889,15.3493503482,15.3493849067,15.3494194643,15.3494540212,15.3494885771,15.3495231323,15.3495576866,15.3495922401,15.3496267928,15.3496613446,15.3496958957,15.3497304458,15.3497649952,15.3497995437, 15.3498340915,15.3498686383,15.3499031844,15.3499377296,15.349972274,15.3500068176,15.3500413603,15.3500759023,15.3501104433,15.3501449836,15.3501795231,15.3502140617,15.3502485994,15.3502831364,15.3503176725,15.3503522078, 15.3503867423,15.350421276,15.3504558088,15.3504903408,15.350524872,15.3505594023,15.3505939318,15.3506284605,15.3506629884,15.3506975154,15.3507320416,15.350766567,15.3508010916,15.3508356153,15.3508701382,15.3509046603, 15.3509391815,15.350973702,15.3510082216,15.3510427404,15.3510772583,15.3511117754,15.3511462917,15.3511808072,15.3512153219,15.3512498357,15.3512843487,15.3513188608,15.3513533722,15.3513878827,15.3514223924,15.3514569013, 15.3514914093,15.3515259165,15.3515604229,15.3515949285,15.3516294332,15.3516639372,15.3516984403,15.3517329425,15.351767444,15.3518019446,15.3518364444,15.3518709433,15.3519054415,15.3519399388,15.3519744353,15.352008931, 15.3520434258,15.3520779198,15.352112413,15.3521469054,15.3521813969,15.3522158876,15.3522503775,15.3522848666,15.3523193548,15.3523538423,15.3523883289,15.3524228146,15.3524572996,15.3524917837,15.352526267,15.3525607495, 15.3525952311,15.352629712,15.352664192,15.3526986711,15.3527331495,15.352767627,15.3528021037,15.3528365796,15.3528710547,15.3529055289,15.3529400023,15.3529744749,15.3530089467,15.3530434176,15.3530778877,15.353112357, 15.3531468255,15.3531812931,15.35321576,15.353250226,15.3532846911,15.3533191555,15.353353619,15.3533880817,15.3534225436,15.3534570047,15.3534914649,15.3535259243,15.3535603829,15.3535948407,15.3536292976,15.3536637537, 15.353698209,15.3537326635,15.3537671172,15.35380157,15.353836022,15.3538704732,15.3539049236,15.3539393731,15.3539738218,15.3540082697,15.3540427168,15.354077163,15.3541116085,15.3541460531,15.3541804968,15.3542149398, 15.3542493819,15.3542838233,15.3543182638,15.3543527034,15.3543871423,15.3544215803,15.3544560175,15.3544904539,15.3545248894,15.3545593242,15.3545937581,15.3546281912,15.3546626235,15.3546970549,15.3547314856,15.3547659154, 15.3548003444,15.3548347725,15.3548691999,15.3549036264,15.3549380521,15.354972477,15.355006901,15.3550413243,15.3550757467,15.3551101683,15.355144589,15.355179009,15.3552134281,15.3552478464,15.3552822639,15.3553166806, 15.3553510964,15.3553855114,15.3554199257,15.355454339,15.3554887516,15.3555231633,15.3555575743,15.3555919844,15.3556263936,15.3556608021,15.3556952097,15.3557296166,15.3557640225,15.3557984277,15.3558328321,15.3558672356, 15.3559016383,15.3559360402,15.3559704413,15.3560048416,15.356039241,15.3560736396,15.3561080374,15.3561424344,15.3561768305,15.3562112258,15.3562456204,15.3562800141,15.3563144069,15.356348799,15.3563831902,15.3564175806, 15.3564519702,15.356486359,15.356520747,15.3565551341,15.3565895204,15.3566239059,15.3566582906,15.3566926744,15.3567270575,15.3567614397,15.3567958211,15.3568302017,15.3568645814,15.3568989604,15.3569333385,15.3569677158, 15.3570020923,15.3570364679,15.3570708428,15.3571052168,15.35713959,15.3571739624,15.357208334,15.3572427047,15.3572770746,15.3573114438,15.357345812,15.3573801795,15.3574145462,15.357448912,15.357483277,15.3575176412, 15.3575520046,15.3575863672,15.3576207289,15.3576550899,15.35768945,15.3577238093,15.3577581677,15.3577925254,15.3578268822,15.3578612382,15.3578955934,15.3579299478,15.3579643014,15.3579986541,15.358033006,15.3580673571, 15.3581017074,15.3581360569,15.3581704056,15.3582047534,15.3582391004,15.3582734466,15.358307792,15.3583421366,15.3583764803,15.3584108233,15.3584451654,15.3584795067,15.3585138471,15.3585481868,15.3585825257,15.3586168637, 15.3586512009,15.3586855373,15.3587198729,15.3587542076,15.3587885416,15.3588228747,15.358857207,15.3588915385,15.3589258692,15.358960199,15.3589945281,15.3590288563,15.3590631837,15.3590975103,15.359131836,15.359166161, 15.3592004851,15.3592348085,15.359269131,15.3593034527,15.3593377735,15.3593720936,15.3594064128,15.3594407312,15.3594750488,15.3595093656,15.3595436816,15.3595779968,15.3596123111,15.3596466246,15.3596809374,15.3597152492, 15.3597495603,15.3597838706,15.35981818,15.3598524887,15.3598867965,15.3599211035,15.3599554097,15.359989715,15.3600240196,15.3600583233,15.3600926262,15.3601269283,15.3601612296,15.3601955301,15.3602298297,15.3602641286, 15.3602984266,15.3603327238,15.3603670202,15.3604013158,15.3604356106,15.3604699045,15.3605041977,15.36053849,15.3605727815,15.3606070722,15.360641362,15.3606756511,15.3607099393,15.3607442268,15.3607785134,15.3608127992, 15.3608470842,15.3608813684,15.3609156517,15.3609499342,15.360984216,15.3610184969,15.361052777,15.3610870563,15.3611213347,15.3611556124,15.3611898892,15.3612241653,15.3612584405,15.3612927149,15.3613269884,15.3613612612, 15.3613955332,15.3614298043,15.3614640746,15.3614983441,15.3615326128,15.3615668807,15.3616011478,15.3616354141,15.3616696795,15.3617039441,15.3617382079,15.3617724709,15.3618067331,15.3618409945,15.3618752551,15.3619095148, 15.3619437737,15.3619780319,15.3620122892,15.3620465457,15.3620808013,15.3621150562,15.3621493102,15.3621835635,15.3622178159,15.3622520675,15.3622863183,15.3623205683,15.3623548175,15.3623890658,15.3624233134,15.3624575601, 15.362491806,15.3625260512,15.3625602954,15.3625945389,15.3626287816,15.3626630235,15.3626972645,15.3627315047,15.3627657442,15.3627999828,15.3628342206,15.3628684575,15.3629026937,15.3629369291,15.3629711636,15.3630053973, 15.3630396303,15.3630738624,15.3631080937,15.3631423241,15.3631765538,15.3632107827,15.3632450107,15.363279238,15.3633134644,15.36334769,15.3633819148,15.3634161388,15.3634503619,15.3634845843,15.3635188059,15.3635530266, 15.3635872465,15.3636214656,15.3636556839,15.3636899014,15.3637241181,15.363758334,15.363792549,15.3638267633,15.3638609767,15.3638951894,15.3639294012,15.3639636122,15.3639978224,15.3640320317,15.3640662403,15.3641004481, 15.364134655,15.3641688611,15.3642030665,15.364237271,15.3642714747,15.3643056776,15.3643398797,15.3643740809,15.3644082814,15.364442481,15.3644766799,15.3645108779,15.3645450751,15.3645792715,15.3646134671,15.3646476619, 15.3646818559,15.364716049,15.3647502414,15.3647844329,15.3648186237,15.3648528136,15.3648870027,15.364921191,15.3649553785,15.3649895652,15.365023751,15.3650579361,15.3650921203,15.3651263038,15.3651604864,15.3651946682, 15.3652288493,15.3652630295,15.3652972088,15.3653313874,15.3653655652,15.3653997422,15.3654339183,15.3654680937,15.3655022682,15.3655364419,15.3655706148,15.3656047869,15.3656389582,15.3656731287,15.3657072984,15.3657414673, 15.3657756353,15.3658098026,15.365843969,15.3658781346,15.3659122995,15.3659464635,15.3659806267,15.3660147891,15.3660489507,15.3660831114,15.3661172714,15.3661514306,15.3661855889,15.3662197465,15.3662539032,15.3662880591, 15.3663222142,15.3663563686,15.3663905221,15.3664246747,15.3664588266,15.3664929777,15.366527128,15.3665612774,15.3665954261,15.3666295739,15.3666637209,15.3666978672,15.3667320126,15.3667661572,15.366800301,15.366834444, 15.3668685862,15.3669027275,15.3669368681,15.3669710079,15.3670051468,15.367039285,15.3670734223,15.3671075588,15.3671416946,15.3671758295,15.3672099636,15.3672440969,15.3672782294,15.367312361,15.3673464919,15.367380622, 15.3674147512,15.3674488797,15.3674830073,15.3675171342,15.3675512602,15.3675853854,15.3676195099,15.3676536335,15.3676877563,15.3677218783,15.3677559995,15.3677901198,15.3678242394,15.3678583582,15.3678924761,15.3679265933, 15.3679607096,15.3679948252,15.3680289399,15.3680630538,15.368097167,15.3681312793,15.3681653908,15.3681995015,15.3682336114,15.3682677205,15.3683018288,15.3683359362,15.3683700429,15.3684041488,15.3684382538,15.3684723581, 15.3685064615,15.3685405641,15.368574666,15.368608767,15.3686428672,15.3686769666,15.3687110652,15.368745163,15.36877926,15.3688133562,15.3688474516,15.3688815462,15.36891564,15.3689497329,15.3689838251,15.3690179165, 15.369052007,15.3690860967,15.3691201857,15.3691542738,15.3691883611,15.3692224477,15.3692565334,15.3692906183,15.3693247024,15.3693587857,15.3693928682,15.3694269499,15.3694610308,15.3694951109,15.3695291901,15.3695632686, 15.3695973463,15.3696314231,15.3696654992,15.3696995744,15.3697336489,15.3697677225,15.3698017954,15.3698358674,15.3698699386,15.3699040091,15.3699380787,15.3699721475,15.3700062155,15.3700402827,15.3700743491,15.3701084147, 15.3701424795,15.3701765435,15.3702106067,15.370244669,15.3702787306,15.3703127914,15.3703468514,15.3703809105,15.3704149689,15.3704490264,15.3704830832,15.3705171391,15.3705511943,15.3705852486,15.3706193021,15.3706533549, 15.3706874068,15.3707214579,15.3707555083,15.3707895578,15.3708236065,15.3708576544,15.3708917015,15.3709257478,15.3709597933,15.370993838,15.3710278819,15.371061925,15.3710959673,15.3711300087,15.3711640494,15.3711980893, 15.3712321284,15.3712661666,15.3713002041,15.3713342408,15.3713682766,15.3714023117,15.3714363459,15.3714703794,15.371504412,15.3715384439,15.3715724749,15.3716065052,15.3716405346,15.3716745632,15.3717085911,15.3717426181, 15.3717766443,15.3718106698,15.3718446944,15.3718787182,15.3719127412,15.3719467634,15.3719807849,15.3720148055,15.3720488253,15.3720828443,15.3721168625,15.3721508799,15.3721848965,15.3722189123,15.3722529273,15.3722869415, 15.3723209549,15.3723549675,15.3723889792,15.3724229902,15.3724570004,15.3724910098,15.3725250184,15.3725590262,15.3725930331,15.3726270393,15.3726610447,15.3726950493,15.372729053,15.372763056,15.3727970582,15.3728310595, 15.3728650601,15.3728990599,15.3729330588,15.372967057,15.3730010544,15.3730350509,15.3730690467,15.3731030416,15.3731370358,15.3731710292,15.3732050217,15.3732390135,15.3732730044,15.3733069946,15.3733409839,15.3733749725, 15.3734089602,15.3734429472,15.3734769333,15.3735109187,15.3735449032,15.373578887,15.3736128699,15.3736468521,15.3736808334,15.373714814,15.3737487937,15.3737827726,15.3738167508,15.3738507281,15.3738847047,15.3739186804, 15.3739526554,15.3739866295,15.3740206029,15.3740545754,15.3740885471,15.3741225181,15.3741564882,15.3741904576,15.3742244261,15.3742583939,15.3742923608,15.374326327,15.3743602923,15.3743942569,15.3744282206,15.3744621835, 15.3744961457,15.374530107,15.3745640676,15.3745980273,15.3746319863,15.3746659444,15.3746999018,15.3747338583,15.3747678141,15.374801769,15.3748357232,15.3748696766,15.3749036291,15.3749375809,15.3749715318,15.375005482, 15.3750394313,15.3750733799,15.3751073277,15.3751412746,15.3751752208,15.3752091662,15.3752431107,15.3752770545,15.3753109975,15.3753449396,15.375378881,15.3754128216,15.3754467614,15.3754807003,15.3755146385,15.3755485759, 15.3755825125,15.3756164483,15.3756503833,15.3756843174,15.3757182508,15.3757521834,15.3757861152,15.3758200462,15.3758539764,15.3758879058,15.3759218344,15.3759557622,15.3759896892,15.3760236154,15.3760575408,15.3760914655, 15.3761253893,15.3761593123,15.3761932345,15.3762271559,15.3762610766,15.3762949964,15.3763289154,15.3763628336,15.3763967511,15.3764306677,15.3764645836,15.3764984986,15.3765324128,15.3765663263,15.3766002389,15.3766341508, 15.3766680619,15.3767019721,15.3767358816,15.3767697902,15.3768036981,15.3768376052,15.3768715115,15.3769054169,15.3769393216,15.3769732255,15.3770071286,15.3770410309,15.3770749324,15.3771088331,15.377142733,15.3771766321, 15.3772105304,15.3772444279,15.3772783246,15.3773122205,15.3773461157,15.37738001,15.3774139035,15.3774477962,15.3774816882,15.3775155793,15.3775494697,15.3775833592,15.377617248,15.3776511359,15.3776850231,15.3777189095, 15.377752795,15.3777866798,15.3778205638,15.377854447,15.3778883293,15.3779222109,15.3779560917,15.3779899717,15.3780238509,15.3780577293,15.3780916069,15.3781254838,15.3781593598,15.378193235,15.3782271094,15.3782609831, 15.3782948559,15.378328728,15.3783625992,15.3783964697,15.3784303393,15.3784642082,15.3784980762,15.3785319435,15.37856581,15.3785996757,15.3786335406,15.3786674047,15.378701268,15.3787351305,15.3787689922,15.3788028531, 15.3788367132,15.3788705725,15.3789044311,15.3789382888,15.3789721457,15.3790060019,15.3790398572,15.3790737118,15.3791075656,15.3791414185,15.3791752707,15.3792091221,15.3792429727,15.3792768225,15.3793106715,15.3793445197, 15.3793783671,15.3794122137,15.3794460595,15.3794799045,15.3795137488,15.3795475922,15.3795814349,15.3796152767,15.3796491178,15.379682958,15.3797167975,15.3797506362,15.3797844741,15.3798183111,15.3798521474,15.3798859829, 15.3799198176,15.3799536516,15.3799874847,15.380021317,15.3800551485,15.3800889793,15.3801228092,15.3801566384,15.3801904667,15.3802242943,15.3802581211,15.3802919471,15.3803257723,15.3803595967,15.3803934203,15.3804272431, 15.3804610651,15.3804948863,15.3805287067,15.3805625264,15.3805963452,15.3806301633,15.3806639805,15.380697797,15.3807316127,15.3807654276,15.3807992417,15.380833055,15.3808668675,15.3809006792,15.3809344901,15.3809683002, 15.3810021096,15.3810359181,15.3810697258,15.3811035328,15.381137339,15.3811711443,15.3812049489,15.3812387527,15.3812725557,15.3813063579,15.3813401593,15.38137396,15.3814077598,15.3814415588,15.3814753571,15.3815091545, 15.3815429512,15.3815767471,15.3816105421,15.3816443364,15.3816781299,15.3817119226,15.3817457145,15.3817795057,15.381813296,15.3818470855,15.3818808743,15.3819146622,15.3819484494,15.3819822358,15.3820160214,15.3820498061, 15.3820835901,15.3821173734,15.3821511558,15.3821849374,15.3822187182,15.3822524983,15.3822862775,15.382320056,15.3823538337,15.3823876105,15.3824213866,15.3824551619,15.3824889364,15.3825227102,15.3825564831,15.3825902552, 15.3826240266,15.3826577971,15.3826915669,15.3827253359,15.3827591041,15.3827928715,15.3828266381,15.3828604039,15.3828941689,15.3829279331,15.3829616966,15.3829954592,15.3830292211,15.3830629822,15.3830967424,15.3831305019, 15.3831642606,15.3831980185,15.3832317757,15.383265532,15.3832992875,15.3833330423,15.3833667963,15.3834005494,15.3834343018,15.3834680534,15.3835018042,15.3835355542,15.3835693035,15.3836030519,15.3836367995,15.3836705464, 15.3837042925,15.3837380378,15.3837717822,15.3838055259,15.3838392689,15.383873011,15.3839067523,15.3839404929,15.3839742326,15.3840079716,15.3840417098,15.3840754471,15.3841091837,15.3841429195,15.3841766546,15.3842103888, 15.3842441222,15.3842778549,15.3843115868,15.3843453178,15.3843790481,15.3844127776,15.3844465063,15.3844802343,15.3845139614,15.3845476877,15.3845814133,15.3846151381,15.3846488621,15.3846825852,15.3847163076,15.3847500293, 15.3847837501,15.3848174701,15.3848511894,15.3848849078,15.3849186255,15.3849523424,15.3849860585,15.3850197738,15.3850534883,15.3850872021,15.385120915,15.3851546272,15.3851883386,15.3852220491,15.3852557589,15.385289468, 15.3853231762,15.3853568836,15.3853905903,15.3854242961,15.3854580012,15.3854917055,15.385525409,15.3855591117,15.3855928136,15.3856265147,15.3856602151,15.3856939146,15.3857276134,15.3857613114,15.3857950086,15.385828705, 15.3858624006,15.3858960955,15.3859297895,15.3859634828,15.3859971753,15.386030867,15.3860645579,15.386098248,15.3861319373,15.3861656259,15.3861993136,15.3862330006,15.3862666868,15.3863003722,15.3863340568,15.3863677406, 15.3864014236,15.3864351059,15.3864687874,15.386502468,15.3865361479,15.386569827,15.3866035054,15.3866371829,15.3866708596,15.3867045356,15.3867382108,15.3867718852,15.3868055588,15.3868392316,15.3868729036,15.3869065749, 15.3869402453,15.386973915,15.3870075839,15.387041252,15.3870749193,15.3871085858,15.3871422516,15.3871759165,15.3872095807,15.3872432441,15.3872769067,15.3873105685,15.3873442296,15.3873778898,15.3874115493,15.387445208, 15.3874788658,15.3875125229,15.3875461793,15.3875798348,15.3876134896,15.3876471435,15.3876807967,15.3877144491,15.3877481007,15.3877817515,15.3878154016,15.3878490508,15.3878826993,15.387916347,15.3879499939,15.38798364, 15.3880172853,15.3880509299,15.3880845737,15.3881182166,15.3881518588,15.3881855002,15.3882191409,15.3882527807,15.3882864198,15.388320058,15.3883536955,15.3883873322,15.3884209681,15.3884546033,15.3884882376,15.3885218712, 15.388555504,15.388589136,15.3886227672,15.3886563976,15.3886900273,15.3887236561,15.3887572842,15.3887909115,15.388824538,15.3888581638,15.3888917887,15.3889254129,15.3889590362,15.3889926588,15.3890262806,15.3890599017, 15.3890935219,15.3891271414,15.38916076,15.3891943779,15.389227995,15.3892616114,15.3892952269,15.3893288417,15.3893624556,15.3893960688,15.3894296812,15.3894632929,15.3894969037,15.3895305138,15.3895641231,15.3895977315, 15.3896313393,15.3896649462,15.3896985523,15.3897321577,15.3897657623,15.3897993661,15.3898329691,15.3898665713,15.3899001728,15.3899337734,15.3899673733,15.3900009724,15.3900345707,15.3900681683,15.390101765,15.390135361, 15.3901689562,15.3902025506,15.3902361442,15.3902697371,15.3903033291,15.3903369204,15.3903705109,15.3904041006,15.3904376896,15.3904712777,15.3905048651,15.3905384517,15.3905720375,15.3906056225,15.3906392067,15.3906727902, 15.3907063729,15.3907399548,15.3907735359,15.3908071162,15.3908406958,15.3908742745,15.3909078525,15.3909414297,15.3909750062,15.3910085818,15.3910421567,15.3910757307,15.391109304,15.3911428766,15.3911764483,15.3912100193, 15.3912435894,15.3912771588,15.3913107274,15.3913442953,15.3913778623,15.3914114286,15.3914449941,15.3914785588,15.3915121227,15.3915456859,15.3915792482,15.3916128098,15.3916463706,15.3916799306,15.3917134899,15.3917470483, 15.391780606,15.3918141629,15.391847719,15.3918812744,15.3919148289,15.3919483827,15.3919819357,15.3920154879,15.3920490394,15.39208259,15.3921161399,15.392149689,15.3921832373,15.3922167848,15.3922503316,15.3922838776, 15.3923174228,15.3923509672,15.3923845108,15.3924180537,15.3924515958,15.3924851371,15.3925186776,15.3925522173,15.3925857563,15.3926192945,15.3926528319,15.3926863685,15.3927199043,15.3927534394,15.3927869737,15.3928205072, 15.3928540399,15.3928875718,15.392921103,15.3929546334,15.392988163,15.3930216918,15.3930552198,15.3930887471,15.3931222736,15.3931557993,15.3931893242,15.3932228484,15.3932563717,15.3932898943,15.3933234162,15.3933569372, 15.3933904574,15.3934239769,15.3934574956,15.3934910135,15.3935245307,15.393558047,15.3935915626,15.3936250774,15.3936585915,15.3936921047,15.3937256172,15.3937591289,15.3937926398,15.3938261499,15.3938596593,15.3938931678, 15.3939266756,15.3939601827,15.3939936889,15.3940271944,15.3940606991,15.394094203,15.3941277061,15.3941612084,15.39419471,15.3942282108,15.3942617108,15.3942952101,15.3943287085,15.3943622062,15.3943957031,15.3944291993, 15.3944626946,15.3944961892,15.394529683,15.394563176,15.3945966682,15.3946301597,15.3946636504,15.3946971403,15.3947306294,15.3947641178,15.3947976054,15.3948310922,15.3948645782,15.3948980634,15.3949315479,15.3949650316, 15.3949985145,15.3950319966,15.395065478,15.3950989586,15.3951324384,15.3951659174,15.3951993957,15.3952328731,15.3952663498,15.3952998258,15.3953333009,15.3953667753,15.3954002489,15.3954337217,15.3954671937,15.395500665, 15.3955341355,15.3955676052,15.3956010741,15.3956345423,15.3956680096,15.3957014762,15.3957349421,15.3957684071,15.3958018714,15.3958353349,15.3958687976,15.3959022596,15.3959357207,15.3959691811,15.3960026407,15.3960360996, 15.3960695576,15.3961030149,15.3961364714,15.3961699272,15.3962033821,15.3962368363,15.3962702897,15.3963037424,15.3963371942,15.3963706453,15.3964040956,15.3964375452,15.3964709939,15.3965044419,15.3965378891,15.3965713355, 15.3966047812,15.3966382261,15.3966716702,15.3967051135,15.396738556,15.3967719978,15.3968054388,15.3968388791,15.3968723185,15.3969057572,15.3969391951,15.3969726322,15.3970060686,15.3970395042,15.397072939,15.397106373, 15.3971398062,15.3971732387,15.3972066704,15.3972401013,15.3972735315,15.3973069609,15.3973403895,15.3973738173,15.3974072444,15.3974406707,15.3974740962,15.3975075209,15.3975409449,15.397574368,15.3976077905,15.3976412121, 15.3976746329,15.397708053,15.3977414723,15.3977748909,15.3978083087,15.3978417256,15.3978751419,15.3979085573,15.397941972,15.3979753859,15.398008799,15.3980422113,15.3980756229,15.3981090337,15.3981424437,15.398175853, 15.3982092615,15.3982426692,15.3982760761,15.3983094823,15.3983428876,15.3983762923,15.3984096961,15.3984430992,15.3984765014,15.398509903,15.3985433037,15.3985767037,15.3986101029,15.3986435013,15.398676899,15.3987102958, 15.3987436919,15.3987770873,15.3988104818,15.3988438756,15.3988772686,15.3989106609,15.3989440523,15.398977443,15.399010833,15.3990442221,15.3990776105,15.3991109981,15.3991443849,15.399177771,15.3992111563,15.3992445408, 15.3992779245,15.3993113075,15.3993446897,15.3993780711,15.3994114517,15.3994448316,15.3994782107,15.3995115891,15.3995449666,15.3995783434,15.3996117194,15.3996450947,15.3996784692,15.3997118429,15.3997452158,15.3997785879, 15.3998119593,15.3998453299,15.3998786998,15.3999120689,15.3999454371,15.3999788047,15.4000121714,15.4000455374,15.4000789026,15.4001122671,15.4001456307,15.4001789936,15.4002123558,15.4002457171,15.4002790777,15.4003124375, 15.4003457965,15.4003791548,15.4004125123,15.400445869,15.400479225,15.4005125802,15.4005459346,15.4005792882,15.4006126411,15.4006459932,15.4006793445,15.4007126951,15.4007460448,15.4007793939,15.4008127421,15.4008460896, 15.4008794363,15.4009127822,15.4009461274,15.4009794718,15.4010128154,15.4010461582,15.4010795003,15.4011128416,15.4011461822,15.4011795219,15.4012128609,15.4012461991,15.4012795366,15.4013128733,15.4013462092,15.4013795443, 15.4014128787,15.4014462123,15.4014795452,15.4015128772,15.4015462085,15.401579539,15.4016128688,15.4016461978,15.401679526,15.4017128534,15.4017461801,15.401779506,15.4018128311,15.4018461555,15.4018794791,15.4019128019, 15.401946124,15.4019794453,15.4020127658,15.4020460855,15.4020794045,15.4021127227,15.4021460401,15.4021793568,15.4022126727,15.4022459878,15.4022793022,15.4023126158,15.4023459286,15.4023792407,15.402412552,15.4024458625, 15.4024791722,15.4025124812,15.4025457894,15.4025790968,15.4026124035,15.4026457094,15.4026790145,15.4027123189,15.4027456225,15.4027789253,15.4028122274,15.4028455287,15.4028788292,15.4029121289,15.4029454279,15.4029787261, 15.4030120236,15.4030453203,15.4030786162,15.4031119113,15.4031452057,15.4031784993,15.4032117921,15.4032450842,15.4032783755,15.403311666,15.4033449558,15.4033782448,15.403411533,15.4034448204,15.4034781071,15.403511393, 15.4035446782,15.4035779626,15.4036112462,15.4036445291,15.4036778111,15.4037110925,15.403744373,15.4037776528,15.4038109318,15.40384421,15.4038774875,15.4039107642,15.4039440402,15.4039773153,15.4040105897,15.4040438634, 15.4040771362,15.4041104083,15.4041436797,15.4041769502,15.4042102201,15.4042434891,15.4042767574,15.4043100249,15.4043432916,15.4043765576,15.4044098228,15.4044430872,15.4044763508,15.4045096137,15.4045428759,15.4045761372, 15.4046093978,15.4046426577,15.4046759167,15.404709175,15.4047424326,15.4047756893,15.4048089453,15.4048422006,15.404875455,15.4049087087,15.4049419616,15.4049752138,15.4050084652,15.4050417158,15.4050749657,15.4051082148, 15.4051414631,15.4051747107,15.4052079575,15.4052412035,15.4052744488,15.4053076933,15.405340937,15.40537418,15.4054074222,15.4054406637,15.4054739043,15.4055071442,15.4055403834,15.4055736218,15.4056068594,15.4056400962, 15.4056733323,15.4057065676,15.4057398021,15.4057730359,15.4058062689,15.4058395012,15.4058727327,15.4059059634,15.4059391933,15.4059724225,15.406005651,15.4060388786,15.4060721055,15.4061053316,15.406138557,15.4061717816, 15.4062050054,15.4062382285,15.4062714508,15.4063046723,15.4063378931,15.4063711131,15.4064043323,15.4064375508,15.4064707685,15.4065039855,15.4065372017,15.4065704171,15.4066036317,15.4066368456,15.4066700587,15.4067032711, 15.4067364827,15.4067696935,15.4068029036,15.4068361129,15.4068693214,15.4069025292,15.4069357362,15.4069689424,15.4070021479,15.4070353526,15.4070685566,15.4071017598,15.4071349622,15.4071681639,15.4072013647,15.4072345649, 15.4072677642,15.4073009628,15.4073341607,15.4073673578,15.4074005541,15.4074337496,15.4074669444,15.4075001384,15.4075333317,15.4075665242,15.4075997159,15.4076329069,15.4076660971,15.4076992865,15.4077324752,15.4077656631, 15.4077988502,15.4078320366,15.4078652222,15.4078984071,15.4079315912,15.4079647745,15.4079979571,15.4080311389,15.4080643199,15.4080975002,15.4081306797,15.4081638585,15.4081970364,15.4082302137,15.4082633901,15.4082965658, 15.4083297408,15.4083629149,15.4083960884,15.408429261,15.4084624329,15.408495604,15.4085287744,15.408561944,15.4085951128,15.4086282809,15.4086614482,15.4086946147,15.4087277805,15.4087609455,15.4087941098,15.4088272733, 15.408860436,15.408893598,15.4089267592,15.4089599197,15.4089930793,15.4090262383,15.4090593964,15.4090925538,15.4091257105,15.4091588663,15.4091920215,15.4092251758,15.4092583294,15.4092914822,15.4093246343,15.4093577856, 15.4093909361,15.4094240859,15.4094572349,15.4094903832,15.4095235307,15.4095566774,15.4095898234,15.4096229686,15.4096561131,15.4096892567,15.4097223997,15.4097555418,15.4097886832,15.4098218239,15.4098549638,15.4098881029, 15.4099212412,15.4099543788,15.4099875157,15.4100206518,15.4100537871,15.4100869216,15.4101200554,15.4101531885,15.4101863207,15.4102194522,15.410252583,15.410285713,15.4103188422,15.4103519707,15.4103850984,15.4104182253, 15.4104513515,15.4104844769,15.4105176016,15.4105507255,15.4105838486,15.410616971,15.4106500926,15.4106832135,15.4107163336,15.4107494529,15.4107825715,15.4108156893,15.4108488064,15.4108819227,15.4109150382,15.410948153, 15.410981267,15.4110143803,15.4110474928,15.4110806045,15.4111137155,15.4111468257,15.4111799352,15.4112130439,15.4112461518,15.411279259,15.4113123654,15.4113454711,15.411378576,15.4114116801,15.4114447835,15.4114778861, 15.411510988,15.4115440891,15.4115771895,15.411610289,15.4116433879,15.4116764859,15.4117095832,15.4117426798,15.4117757756,15.4118088706,15.4118419649,15.4118750584,15.4119081511,15.4119412431,15.4119743344,15.4120074248, 15.4120405146,15.4120736035,15.4121066917,15.4121397791,15.4121728658,15.4122059517,15.4122390369,15.4122721213,15.412305205,15.4123382878,15.41237137,15.4124044513,15.4124375319,15.4124706118,15.4125036909,15.4125367692, 15.4125698468,15.4126029236,15.4126359997,15.412669075,15.4127021495,15.4127352233,15.4127682963,15.4128013686,15.4128344401,15.4128675109,15.4129005809,15.4129336501,15.4129667186,15.4129997863,15.4130328533,15.4130659195, 15.4130989849,15.4131320496,15.4131651135,15.4131981767,15.4132312391,15.4132643008,15.4132973617,15.4133304218,15.4133634812,15.4133965398,15.4134295977,15.4134626548,15.4134957112,15.4135287668,15.4135618216,15.4135948757, 15.413627929,15.4136609816,15.4136940334,15.4137270845,15.4137601348,15.4137931843,15.4138262331,15.4138592811,15.4138923284,15.4139253749,15.4139584206,15.4139914656,15.4140245099,15.4140575534,15.4140905961,15.4141236381, 15.4141566793,15.4141897197,15.4142227594,15.4142557984,15.4142888366,15.414321874,15.4143549107,15.4143879466,15.4144209817,15.4144540162,15.4144870498,15.4145200827,15.4145531148,15.4145861462,15.4146191768,15.4146522067, 15.4146852358,15.4147182642,15.4147512918,15.4147843186,15.4148173447,15.41485037,15.4148833946,15.4149164184,15.4149494415,15.4149824638,15.4150154853,15.4150485061,15.4150815262,15.4151145454,15.415147564,15.4151805817, 15.4152135988,15.415246615,15.4152796305,15.4153126453,15.4153456593,15.4153786725,15.415411685,15.4154446967,15.4154777077,15.4155107179,15.4155437274,15.4155767361,15.415609744,15.4156427512,15.4156757577,15.4157087634, 15.4157417683,15.4157747725,15.4158077759,15.4158407786,15.4158737805,15.4159067816,15.415939782,15.4159727817,15.4160057806,15.4160387787,15.4160717761,15.4161047727,15.4161377686,15.4161707637,15.4162037581,15.4162367517, 15.4162697445,15.4163027366,15.416335728,15.4163687186,15.4164017084,15.4164346975,15.4164676858,15.4165006734,15.4165336602,15.4165666463,15.4165996316,15.4166326161,15.4166655999,15.416698583,15.4167315653,15.4167645468, 15.4167975276,15.4168305076,15.4168634869,15.4168964654,15.4169294432,15.4169624202,15.4169953965,15.417028372,15.4170613468,15.4170943208,15.417127294,15.4171602665,15.4171932382,15.4172262092,15.4172591795,15.417292149, 15.4173251177,15.4173580857,15.4173910529,15.4174240193,15.4174569851,15.41748995,15.4175229142,15.4175558777,15.4175888404,15.4176218023,15.4176547635,15.417687724,15.4177206837,15.4177536426,15.4177866008,15.4178195582, 15.4178525149,15.4178854708,15.417918426,15.4179513804,15.4179843341,15.418017287,15.4180502391,15.4180831906,15.4181161412,15.4181490911,15.4181820403,15.4182149887,15.4182479363,15.4182808832,15.4183138293,15.4183467747, 15.4183797194,15.4184126632,15.4184456064,15.4184785488,15.4185114904,15.4185444313,15.4185773714,15.4186103108,15.4186432494,15.4186761872,15.4187091244,15.4187420607,15.4187749963,15.4188079312,15.4188408653,15.4188737987, 15.4189067313,15.4189396631,15.4189725942,15.4190055246,15.4190384542,15.419071383,15.4191043111,15.4191372384,15.419170165,15.4192030909,15.419236016,15.4192689403,15.4193018639,15.4193347867,15.4193677088,15.4194006301, 15.4194335507,15.4194664705,15.4194993896,15.4195323079,15.4195652255,15.4195981423,15.4196310584,15.4196639737,15.4196968883,15.4197298021,15.4197627152,15.4197956275,15.4198285391,15.4198614499,15.41989436,15.4199272693, 15.4199601778,15.4199930857,15.4200259927,15.420058899,15.4200918046,15.4201247094,15.4201576135,15.4201905168,15.4202234193,15.4202563212,15.4202892222,15.4203221225,15.4203550221,15.4203879209,15.420420819,15.4204537163, 15.4204866128,15.4205195086,15.4205524037,15.420585298,15.4206181916,15.4206510844,15.4206839764,15.4207168677,15.4207497583,15.4207826481,15.4208155372,15.4208484255,15.420881313,15.4209141998,15.4209470859,15.4209799712, 15.4210128558,15.4210457396,15.4210786227,15.421111505,15.4211443865,15.4211772673,15.4212101474,15.4212430267,15.4212759053,15.4213087831,15.4213416602,15.4213745365,15.4214074121,15.4214402869,15.421473161,15.4215060343, 15.4215389068,15.4215717787,15.4216046497,15.4216375201,15.4216703897,15.4217032585,15.4217361266,15.4217689939,15.4218018605,15.4218347263,15.4218675914,15.4219004557,15.4219333193,15.4219661821,15.4219990442,15.4220319056, 15.4220647662,15.422097626,15.4221304851,15.4221633435,15.4221962011,15.4222290579,15.422261914,15.4222947694,15.422327624,15.4223604778,15.4223933309,15.4224261833,15.4224590349,15.4224918858,15.4225247359,15.4225575853, 15.4225904339,15.4226232818,15.4226561289,15.4226889753,15.4227218209,15.4227546658,15.4227875099,15.4228203533,15.4228531959,15.4228860378,15.422918879,15.4229517194,15.422984559,15.4230173979,15.4230502361,15.4230830735, 15.4231159101,15.4231487461,15.4231815812,15.4232144156,15.4232472493,15.4232800822,15.4233129144,15.4233457458,15.4233785765,15.4234114065,15.4234442356,15.4234770641,15.4235098918,15.4235427187,15.4235755449,15.4236083704, 15.4236411951,15.423674019,15.4237068422,15.4237396647,15.4237724864,15.4238053074,15.4238381276,15.4238709471,15.4239037658,15.4239365838,15.4239694011,15.4240022176,15.4240350333,15.4240678483,15.4241006626,15.4241334761, 15.4241662888,15.4241991008,15.4242319121,15.4242647226,15.4242975324,15.4243303414,15.4243631497,15.4243959572,15.424428764,15.4244615701,15.4244943754,15.4245271799,15.4245599837,15.4245927868,15.4246255891,15.4246583907, 15.4246911915,15.4247239916,15.4247567909,15.4247895895,15.4248223874,15.4248551844,15.4248879808,15.4249207764,15.4249535713,15.4249863654,15.4250191587,15.4250519514,15.4250847432,15.4251175344,15.4251503248,15.4251831144, 15.4252159033,15.4252486915,15.4252814789,15.4253142655,15.4253470514,15.4253798366,15.425412621,15.4254454047,15.4254781876,15.4255109698,15.4255437513,15.425576532,15.4256093119,15.4256420912,15.4256748696,15.4257076473, 15.4257404243,15.4257732005,15.425805976,15.4258387508,15.4258715248,15.425904298,15.4259370705,15.4259698423,15.4260026133,15.4260353836,15.4260681531,15.4261009219,15.42613369,15.4261664573,15.4261992238,15.4262319896, 15.4262647547,15.426297519,15.4263302826,15.4263630454,15.4263958075,15.4264285689,15.4264613295,15.4264940893,15.4265268485,15.4265596068,15.4265923645,15.4266251213,15.4266578775,15.4266906329,15.4267233875,15.4267561414, 15.4267888946,15.426821647,15.4268543987,15.4268871496,15.4269198998,15.4269526493,15.426985398,15.4270181459,15.4270508932,15.4270836396,15.4271163854,15.4271491303,15.4271818746,15.4272146181,15.4272473608,15.4272801029, 15.4273128441,15.4273455847,15.4273783245,15.4274110635,15.4274438018,15.4274765394,15.4275092762,15.4275420122,15.4275747476,15.4276074822,15.427640216,15.4276729491,15.4277056815,15.4277384131,15.4277711439,15.4278038741, 15.4278366035,15.4278693321,15.42790206,15.4279347872,15.4279675136,15.4280002393,15.4280329642,15.4280656884,15.4280984118,15.4281311345,15.4281638565,15.4281965777,15.4282292982,15.4282620179,15.4282947369,15.4283274552, 15.4283601727,15.4283928895,15.4284256055,15.4284583208,15.4284910353,15.4285237491,15.4285564622,15.4285891745,15.4286218861,15.4286545969,15.428687307,15.4287200164,15.428752725,15.4287854329,15.42881814,15.4288508464, 15.428883552,15.4289162569,15.4289489611,15.4289816645,15.4290143672,15.4290470691,15.4290797703,15.4291124708,15.4291451705,15.4291778695,15.4292105677,15.4292432652,15.4292759619,15.4293086579,15.4293413532,15.4293740477, 15.4294067415,15.4294394346,15.4294721269,15.4295048184,15.4295375092,15.4295701993,15.4296028887,15.4296355773,15.4296682651,15.4297009523,15.4297336386,15.4297663243,15.4297990092,15.4298316933,15.4298643767,15.4298970594, 15.4299297414,15.4299624225,15.429995103,15.4300277827,15.4300604617,15.4300931399,15.4301258174,15.4301584942,15.4301911702,15.4302238455,15.43025652,15.4302891938,15.4303218668,15.4303545392,15.4303872107,15.4304198816, 15.4304525517,15.430485221,15.4305178896,15.4305505575,15.4305832246,15.430615891,15.4306485567,15.4306812216,15.4307138858,15.4307465492,15.4307792119,15.4308118739,15.4308445351,15.4308771956,15.4309098553,15.4309425143, 15.4309751726,15.4310078301,15.4310404869,15.4310731429,15.4311057982,15.4311384528,15.4311711066,15.4312037597,15.4312364121,15.4312690637,15.4313017146,15.4313343647,15.4313670141,15.4313996627,15.4314323106,15.4314649578, 15.4314976043,15.43153025,15.4315628949,15.4315955391,15.4316281826,15.4316608254,15.4316934674,15.4317261086,15.4317587492,15.431791389,15.431824028,15.4318566663,15.4318893039,15.4319219407,15.4319545768,15.4319872122, 15.4320198468,15.4320524807,15.4320851138,15.4321177462,15.4321503779,15.4321830088,15.432215639,15.4322482685,15.4322808972,15.4323135252,15.4323461524,15.4323787789,15.4324114047,15.4324440297,15.432476654,15.4325092776, 15.4325419004,15.4325745225,15.4326071438,15.4326397644,15.4326723843,15.4327050034,15.4327376218,15.4327702394,15.4328028564,15.4328354725,15.432868088,15.4329007027,15.4329333166,15.4329659299,15.4329985424,15.4330311541, 15.4330637651,15.4330963754,15.4331289849,15.4331615937,15.4331942018,15.4332268091,15.4332594157,15.4332920216,15.4333246267,15.4333572311,15.4333898347,15.4334224377,15.4334550398,15.4334876413,15.433520242,15.4335528419, 15.4335854412,15.4336180396,15.4336506374,15.4336832344,15.4337158307,15.4337484262,15.433781021,15.4338136151,15.4338462084,15.433878801,15.4339113929,15.433943984,15.4339765744,15.4340091641,15.434041753,15.4340743412, 15.4341069286,15.4341395153,15.4341721013,15.4342046865,15.434237271,15.4342698548,15.4343024378,15.4343350201,15.4343676017,15.4344001825,15.4344327626,15.4344653419,15.4344979205,15.4345304984,15.4345630756,15.434595652, 15.4346282276,15.4346608026,15.4346933768,15.4347259502,15.434758523,15.434791095,15.4348236662,15.4348562367,15.4348888065,15.4349213756,15.4349539439,15.4349865115,15.4350190783,15.4350516444,15.4350842098,15.4351167745, 15.4351493384,15.4351819015,15.435214464,15.4352470257,15.4352795866,15.4353121469,15.4353447064,15.4353772651,15.4354098232,15.4354423805,15.435474937,15.4355074928,15.4355400479,15.4355726023,15.4356051559,15.4356377088, 15.4356702609,15.4357028124,15.435735363,15.435767913,15.4358004622,15.4358330107,15.4358655584,15.4358981054,15.4359306517,15.4359631972,15.4359957421,15.4360282861,15.4360608295,15.4360933721,15.4361259139,15.4361584551, 15.4361909955,15.4362235352,15.4362560741,15.4362886123,15.4363211498,15.4363536865,15.4363862225,15.4364187578,15.4364512923,15.4364838261,15.4365163592,15.4365488915,15.4365814231,15.4366139539,15.4366464841,15.4366790135, 15.4367115421,15.4367440701,15.4367765973,15.4368091237,15.4368416495,15.4368741745,15.4369066987,15.4369392223,15.436971745,15.4370042671,15.4370367884,15.437069309,15.4371018289,15.437134348,15.4371668664,15.4371993841, 15.437231901,15.4372644172,15.4372969327,15.4373294474,15.4373619614,15.4373944747,15.4374269873,15.4374594991,15.4374920101,15.4375245205,15.4375570301,15.4375895389,15.4376220471,15.4376545545,15.4376870612,15.4377195671, 15.4377520723,15.4377845768,15.4378170805,15.4378495836,15.4378820858,15.4379145874,15.4379470882,15.4379795883,15.4380120877,15.4380445863,15.4380770842,15.4381095813,15.4381420777,15.4381745734,15.4382070684,15.4382395626, 15.4382720561,15.4383045489,15.4383370409,15.4383695322,15.4384020228,15.4384345126,15.4384670017,15.4384994901,15.4385319778,15.4385644647,15.4385969509,15.4386294363,15.438661921,15.438694405,15.4387268883,15.4387593708, 15.4387918526,15.4388243336,15.438856814,15.4388892936,15.4389217724,15.4389542506,15.438986728,15.4390192046,15.4390516806,15.4390841558,15.4391166303,15.439149104,15.4391815771,15.4392140493,15.4392465209,15.4392789917, 15.4393114618,15.4393439312,15.4393763998,15.4394088677,15.4394413349,15.4394738013,15.439506267,15.439538732,15.4395711963,15.4396036598,15.4396361226,15.4396685846,15.439701046,15.4397335066,15.4397659664,15.4397984256, 15.439830884,15.4398633417,15.4398957986,15.4399282548,15.4399607103,15.4399931651,15.4400256191,15.4400580724,15.440090525,15.4401229768,15.4401554279,15.4401878783,15.4402203279,15.4402527768,15.440285225,15.4403176725, 15.4403501192,15.4403825652,15.4404150105,15.440447455,15.4404798988,15.4405123419,15.4405447842,15.4405772259,15.4406096667,15.4406421069,15.4406745463,15.440706985,15.440739423,15.4407718603,15.4408042968,15.4408367326, 15.4408691676,15.4409016019,15.4409340355,15.4409664684,15.4409989005,15.4410313319,15.4410637626,15.4410961926,15.4411286218,15.4411610503,15.4411934781,15.4412259051,15.4412583314,15.441290757,15.4413231818,15.441355606, 15.4413880293,15.441420452,15.4414528739,15.4414852952,15.4415177156,15.4415501354,15.4415825544,15.4416149727,15.4416473903,15.4416798071,15.4417122232,15.4417446386,15.4417770532,15.4418094671,15.4418418803,15.4418742928, 15.4419067045,15.4419391156,15.4419715258,15.4420039354,15.4420363442,15.4420687523,15.4421011597,15.4421335663,15.4421659722,15.4421983774,15.4422307819,15.4422631856,15.4422955886,15.4423279909,15.4423603924,15.4423927932, 15.4424251933,15.4424575927,15.4424899913,15.4425223892,15.4425547864,15.4425871829,15.4426195786,15.4426519736,15.4426843679,15.4427167614,15.4427491542,15.4427815463,15.4428139377,15.4428463283,15.4428787182,15.4429111074, 15.4429434958,15.4429758836,15.4430082706,15.4430406568,15.4430730424,15.4431054272,15.4431378113,15.4431701947,15.4432025773,15.4432349592,15.4432673404,15.4432997208,15.4433321006,15.4433644796,15.4433968579,15.4434292354, 15.4434616122,15.4434939883,15.4435263637,15.4435587383,15.4435911123,15.4436234854,15.4436558579,15.4436882296,15.4437206007,15.4437529709,15.4437853405,15.4438177093,15.4438500774,15.4438824448,15.4439148115,15.4439471774, 15.4439795426,15.4440119071,15.4440442708,15.4440766338,15.4441089961,15.4441413577,15.4441737186,15.4442060787,15.4442384381,15.4442707967,15.4443031547,15.4443355119,15.4443678684,15.4444002242,15.4444325792,15.4444649335, 15.4444972871,15.44452964,15.4445619921,15.4445943435,15.4446266942,15.4446590442,15.4446913934,15.4447237419,15.4447560897,15.4447884368,15.4448207831,15.4448531287,15.4448854736,15.4449178177,15.4449501612,15.4449825039, 15.4450148459,15.4450471871,15.4450795277,15.4451118675,15.4451442066,15.4451765449,15.4452088825,15.4452412195,15.4452735556,15.4453058911,15.4453382258,15.4453705598,15.4454028931,15.4454352257,15.4454675575,15.4454998886, 15.445532219,15.4455645487,15.4455968776,15.4456292058,15.4456615333,15.4456938601,15.4457261861,15.4457585115,15.445790836,15.4458231599,15.4458554831,15.4458878055,15.4459201272,15.4459524481,15.4459847684,15.4460170879, 15.4460494067,15.4460817248,15.4461140421,15.4461463588,15.4461786747,15.4462109899,15.4462433043,15.446275618,15.4463079311,15.4463402433,15.4463725549,15.4464048657,15.4464371758,15.4464694852,15.4465017939,15.4465341018, 15.4465664091,15.4465987156,15.4466310213,15.4466633264,15.4466956307,15.4467279343,15.4467602372,15.4467925393,15.4468248408,15.4468571415,15.4468894415,15.4469217407,15.4469540393,15.4469863371,15.4470186342,15.4470509306, 15.4470832262,15.4471155211,15.4471478153,15.4471801088,15.4472124016,15.4472446936,15.4472769849,15.4473092755,15.4473415654,15.4473738545,15.4474061429,15.4474384306,15.4474707176,15.4475030039,15.4475352894,15.4475675742, 15.4475998583,15.4476321416,15.4476644243,15.4476967062,15.4477289874,15.4477612679,15.4477935476,15.4478258266,15.447858105,15.4478903825,15.4479226594,15.4479549355,15.447987211,15.4480194857,15.4480517596,15.4480840329, 15.4481163054,15.4481485772,15.4481808483,15.4482131187,15.4482453883,15.4482776572,15.4483099254,15.4483421929,15.4483744597,15.4484067257,15.448438991,15.4484712556,15.4485035195,15.4485357826,15.448568045,15.4486003067, 15.4486325677,15.448664828,15.4486970875,15.4487293464,15.4487616045,15.4487938618,15.4488261185,15.4488583744,15.4488906296,15.4489228841,15.4489551379,15.4489873909,15.4490196433,15.4490518949,15.4490841458,15.4491163959, 15.4491486454,15.4491808941,15.4492131421,15.4492453894,15.4492776359,15.4493098818,15.4493421269,15.4493743713,15.449406615,15.4494388579,15.4494711002,15.4495033417,15.4495355825,15.4495678226,15.4496000619,15.4496323006, 15.4496645385,15.4496967757,15.4497290121,15.4497612479,15.4497934829,15.4498257172,15.4498579508,15.4498901837,15.4499224159,15.4499546473,15.449986878,15.450019108,15.4500513373,15.4500835658,15.4501157937,15.4501480208, 15.4501802472,15.4502124728,15.4502446978,15.450276922,15.4503091455,15.4503413683,15.4503735904,15.4504058118,15.4504380324,15.4504702523,15.4505024715,15.45053469,15.4505669077,15.4505991248,15.4506313411,15.4506635567, 15.4506957716,15.4507279857,15.4507601992,15.4507924119,15.4508246239,15.4508568352,15.4508890457,15.4509212556,15.4509534647,15.4509856731,15.4510178808,15.4510500878,15.451082294,15.4511144996,15.4511467044,15.4511789085, 15.4512111118,15.4512433145,15.4512755164,15.4513077176,15.4513399181,15.4513721179,15.451404317,15.4514365153,15.4514687129,15.4515009099,15.451533106,15.4515653015,15.4515974963,15.4516296903,15.4516618836,15.4516940762, 15.4517262681,15.4517584592,15.4517906497,15.4518228394,15.4518550284,15.4518872167,15.4519194043,15.4519515911,15.4519837772,15.4520159626,15.4520481473,15.4520803313,15.4521125146,15.4521446971,15.4521768789,15.45220906, 15.4522412404,15.4522734201,15.4523055991,15.4523377773,15.4523699548,15.4524021316,15.4524343077,15.452466483,15.4524986577,15.4525308316,15.4525630048,15.4525951773,15.4526273491,15.4526595202,15.4526916905,15.4527238601, 15.452756029,15.4527881972,15.4528203647,15.4528525314,15.4528846975,15.4529168628,15.4529490274,15.4529811913,15.4530133545,15.4530455169,15.4530776787,15.4531098397,15.453142,15.4531741596,15.4532063184,15.4532384766, 15.453270634,15.4533027907,15.4533349467,15.453367102,15.4533992566,15.4534314104,15.4534635636,15.453495716,15.4535278677,15.4535600187,15.4535921689,15.4536243185,15.4536564673,15.4536886154,15.4537207628,15.4537529095, 15.4537850555,15.4538172007,15.4538493453,15.4538814891,15.4539136322,15.4539457746,15.4539779163,15.4540100572,15.4540421975,15.454074337,15.4541064758,15.4541386139,15.4541707513,15.4542028879,15.4542350239,15.4542671591, 15.4542992936,15.4543314274,15.4543635605,15.4543956929,15.4544278245,15.4544599555,15.4544920857,15.4545242152,15.454556344,15.454588472,15.4546205994,15.454652726,15.454684852,15.4547169772,15.4547491017,15.4547812254, 15.4548133485,15.4548454709,15.4548775925,15.4549097134,15.4549418336,15.4549739531,15.4550060719,15.4550381899,15.4550703073,15.4551024239,15.4551345398,15.455166655,15.4551987695,15.4552308833,15.4552629963,15.4552951087, 15.4553272203,15.4553593312,15.4553914414,15.4554235509,15.4554556597,15.4554877677,15.455519875,15.4555519817,15.4555840876,15.4556161928,15.4556482973,15.455680401,15.4557125041,15.4557446064,15.455776708,15.4558088089, 15.4558409091,15.4558730086,15.4559051074,15.4559372054,15.4559693028,15.4560013994,15.4560334953,15.4560655905,15.456097685,15.4561297787,15.4561618718,15.4561939641,15.4562260557,15.4562581467,15.4562902369,15.4563223263, 15.4563544151,15.4563865032,15.4564185905,15.4564506771,15.4564827631,15.4565148483,15.4565469327,15.4565790165,15.4566110996,15.4566431819,15.4566752636,15.4567073445,15.4567394247,15.4567715042,15.456803583,15.456835661, 15.4568677384,15.456899815,15.4569318909,15.4569639662,15.4569960407,15.4570281145,15.4570601875,15.4570922599,15.4571243315,15.4571564025,15.4571884727,15.4572205422,15.457252611,15.4572846791,15.4573167465,15.4573488131, 15.4573808791,15.4574129443,15.4574450088,15.4574770726,15.4575091357,15.4575411981,15.4575732598,15.4576053207,15.457637381,15.4576694405,15.4577014993,15.4577335575,15.4577656149,15.4577976715,15.4578297275,15.4578617828, 15.4578938373,15.4579258911,15.4579579443,15.4579899967,15.4580220484,15.4580540994,15.4580861496,15.4581181992,15.4581502481,15.4581822962,15.4582143436,15.4582463903,15.4582784363,15.4583104816,15.4583425262,15.4583745701, 15.4584066132,15.4584386557,15.4584706974,15.4585027384,15.4585347787,15.4585668183,15.4585988572,15.4586308954,15.4586629329,15.4586949696,15.4587270057,15.458759041,15.4587910756,15.4588231095,15.4588551427,15.4588871752, 15.458919207,15.458951238,15.4589832684,15.459015298,15.4590473269,15.4590793552,15.4591113827,15.4591434095,15.4591754356,15.4592074609,15.4592394856,15.4592715095,15.4593035328,15.4593355553,15.4593675771,15.4593995982, 15.4594316186,15.4594636383,15.4594956573,15.4595276756,15.4595596931,15.45959171,15.4596237261,15.4596557415,15.4596877562,15.4597197702,15.4597517835,15.4597837961,15.459815808,15.4598478192,15.4598798296,15.4599118393, 15.4599438484,15.4599758567,15.4600078643,15.4600398712,15.4600718774,15.4601038829,15.4601358876,15.4601678917,15.4601998951,15.4602318977,15.4602638996,15.4602959009,15.4603279014,15.4603599012,15.4603919003,15.4604238986, 15.4604558963,15.4604878933,15.4605198895,15.4605518851,15.4605838799,15.460615874,15.4606478674,15.4606798601,15.4607118521,15.4607438434,15.460775834,15.4608078239,15.460839813,15.4608718015,15.4609037892,15.4609357762, 15.4609677626,15.4609997482,15.4610317331,15.4610637173,15.4610957008,15.4611276835,15.4611596656,15.461191647,15.4612236276,15.4612556076,15.4612875868,15.4613195653,15.4613515431,15.4613835202,15.4614154966,15.4614474723, 15.4614794473,15.4615114216,15.4615433951,15.461575368,15.4616073401,15.4616393115,15.4616712823,15.4617032523,15.4617352216,15.4617671902,15.4617991581,15.4618311253,15.4618630918,15.4618950575,15.4619270226,15.4619589869, 15.4619909506,15.4620229135,15.4620548757,15.4620868373,15.4621187981,15.4621507582,15.4621827176,15.4622146763,15.4622466342,15.4622785915,15.4623105481,15.4623425039,15.4623744591,15.4624064135,15.4624383673,15.4624703203, 15.4625022726,15.4625342242,15.4625661751,15.4625981253,15.4626300748,15.4626620236,15.4626939716,15.462725919,15.4627578657,15.4627898116,15.4628217569,15.4628537014,15.4628856452,15.4629175883,15.4629495307,15.4629814725, 15.4630134134,15.4630453537,15.4630772933,15.4631092322,15.4631411704,15.4631731078,15.4632050446,15.4632369806,15.463268916,15.4633008506,15.4633327845,15.4633647178,15.4633966503,15.4634285821,15.4634605132,15.4634924436, 15.4635243733,15.4635563023,15.4635882305,15.4636201581,15.463652085,15.4636840111,15.4637159366,15.4637478613,15.4637797853,15.4638117087,15.4638436313,15.4638755532,15.4639074744,15.4639393949,15.4639713147,15.4640032338, 15.4640351522,15.4640670699,15.4640989868,15.4641309031,15.4641628187,15.4641947335,15.4642266477,15.4642585611,15.4642904739,15.4643223859,15.4643542972,15.4643862078,15.4644181177,15.4644500269,15.4644819354,15.4645138432, 15.4645457503,15.4645776567,15.4646095624,15.4646414674,15.4646733716,15.4647052752,15.4647371781,15.4647690802,15.4648009817,15.4648328824,15.4648647824,15.4648966818,15.4649285804,15.4649604783,15.4649923755,15.465024272, 15.4650561678,15.4650880629,15.4651199573,15.465151851,15.465183744,15.4652156363,15.4652475278,15.4652794187,15.4653113089,15.4653431983,15.4653750871,15.4654069751,15.4654388625,15.4654707491,15.4655026351,15.4655345203, 15.4655664048,15.4655982886,15.4656301717,15.4656620542,15.4656939359,15.4657258169,15.4657576972,15.4657895768,15.4658214556,15.4658533338,15.4658852113,15.4659170881,15.4659489642,15.4659808395,15.4660127142,15.4660445881, 15.4660764614,15.4661083339,15.4661402058,15.4661720769,15.4662039474,15.4662358171,15.4662676861,15.4662995545,15.4663314221,15.466363289,15.4663951552,15.4664270207,15.4664588855,15.4664907496,15.466522613,15.4665544757, 15.4665863377,15.466618199,15.4666500596,15.4666819195,15.4667137786,15.4667456371,15.4667774949,15.466809352,15.4668412083,15.466873064,15.4669049189,15.4669367732,15.4669686267,15.4670004796,15.4670323317,15.4670641832, 15.4670960339,15.4671278839,15.4671597333,15.4671915819,15.4672234298,15.467255277,15.4672871236,15.4673189694,15.4673508145,15.4673826589,15.4674145026,15.4674463456,15.4674781879,15.4675100295,15.4675418704,15.4675737106, 15.4676055501,15.4676373889,15.467669227,15.4677010643,15.467732901,15.467764737,15.4677965723,15.4678284068,15.4678602407,15.4678920739,15.4679239063,15.4679557381,15.4679875692,15.4680193995,15.4680512292,15.4680830581, 15.4681148864,15.4681467139,15.4681785408,15.4682103669,15.4682421924,15.4682740171,15.4683058411,15.4683376645,15.4683694871,15.468401309,15.4684331303,15.4684649508,15.4684967706,15.4685285898,15.4685604082,15.4685922259, 15.4686240429,15.4686558592,15.4686876749,15.4687194898,15.468751304,15.4687831175,15.4688149303,15.4688467424,15.4688785538,15.4689103645,15.4689421745,15.4689739838,15.4690057924,15.4690376003,15.4690694075,15.469101214, 15.4691330198,15.4691648249,15.4691966293,15.469228433,15.469260236,15.4692920383,15.4693238399,15.4693556408,15.469387441,15.4694192405,15.4694510392,15.4694828373,15.4695146347,15.4695464314,15.4695782274,15.4696100227, 15.4696418172,15.4696736111,15.4697054043,15.4697371968,15.4697689886,15.4698007796,15.46983257,15.4698643597,15.4698961487,15.4699279369,15.4699597245,15.4699915114,15.4700232976,15.4700550831,15.4700868678,15.4701186519, 15.4701504353,15.4701822179,15.4702139999,15.4702457812,15.4702775618,15.4703093416,15.4703411208,15.4703728993,15.4704046771,15.4704364541,15.4704682305,15.4705000062,15.4705317812,15.4705635554,15.470595329,15.4706271019, 15.4706588741,15.4706906455,15.4707224163,15.4707541864,15.4707859558,15.4708177244,15.4708494924,15.4708812597,15.4709130263,15.4709447922,15.4709765573,15.4710083218,15.4710400856,15.4710718487,15.4711036111,15.4711353727, 15.4711671337,15.471198894,15.4712306536,15.4712624125,15.4712941707,15.4713259282,15.4713576849,15.471389441,15.4714211964,15.4714529511,15.4714847051,15.4715164584,15.471548211,15.4715799629,15.4716117141,15.4716434646, 15.4716752144,15.4717069635,15.4717387119,15.4717704596,15.4718022066,15.4718339529,15.4718656985,15.4718974434,15.4719291876,15.4719609312,15.471992674,15.4720244161,15.4720561575,15.4720878982,15.4721196382,15.4721513776, 15.4721831162,15.4722148541,15.4722465913,15.4722783279,15.4723100637,15.4723417988,15.4723735333,15.472405267,15.4724370001,15.4724687324,15.472500464,15.472532195,15.4725639252,15.4725956548,15.4726273836,15.4726591118, 15.4726908392,15.472722566,15.4727542921,15.4727860174,15.4728177421,15.4728494661,15.4728811893,15.4729129119,15.4729446338,15.472976355,15.4730080754,15.4730397952,15.4730715143,15.4731032327,15.4731349504,15.4731666674, 15.4731983837,15.4732300993,15.4732618142,15.4732935284,15.4733252419,15.4733569547,15.4733886668,15.4734203782,15.473452089,15.473483799,15.4735155083,15.4735472169,15.4735789249,15.4736106321,15.4736423386,15.4736740445, 15.4737057496,15.4737374541,15.4737691578,15.4738008609,15.4738325632,15.4738642649,15.4738959659,15.4739276661,15.4739593657,15.4739910646,15.4740227627,15.4740544602,15.474086157,15.4741178531,15.4741495485,15.4741812432, 15.4742129372,15.4742446305,15.4742763231,15.474308015,15.4743397062,15.4743713968,15.4744030866,15.4744347757,15.4744664641,15.4744981519,15.4745298389,15.4745615252,15.4745932109,15.4746248958,15.4746565801,15.4746882637, 15.4747199465,15.4747516287,15.4747833102,15.4748149909,15.474846671,15.4748783504,15.4749100291,15.4749417071,15.4749733844,15.475005061,15.4750367369,15.4750684121,15.4751000866,15.4751317605,15.4751634336,15.475195106, 15.4752267777,15.4752584488,15.4752901191,15.4753217888,15.4753534577,15.475385126,15.4754167936,15.4754484604,15.4754801266,15.4755117921,15.4755434569,15.4755751209,15.4756067843,15.475638447,15.475670109,15.4757017704, 15.475733431,15.4757650909,15.4757967501,15.4758284086,15.4758600665,15.4758917236,15.4759233801,15.4759550358,15.4759866909,15.4760183452,15.4760499989,15.4760816519,15.4761133042,15.4761449557,15.4761766066,15.4762082568, 15.4762399063,15.4762715551,15.4763032032,15.4763348507,15.4763664974,15.4763981434,15.4764297888,15.4764614334,15.4764930773,15.4765247206,15.4765563632,15.476588005,15.4766196462,15.4766512867,15.4766829265,15.4767145655, 15.4767462039,15.4767778416,15.4768094787,15.476841115,15.4768727506,15.4769043855,15.4769360197,15.4769676533,15.4769992861,15.4770309183,15.4770625497,15.4770941805,15.4771258106,15.47715744,15.4771890686,15.4772206966, 15.4772523239,15.4772839505,15.4773155765,15.4773472017,15.4773788262,15.47741045,15.4774420732,15.4774736956,15.4775053174,15.4775369384,15.4775685588,15.4776001785,15.4776317975,15.4776634157,15.4776950333,15.4777266502, 15.4777582664,15.477789882,15.4778214968,15.4778531109,15.4778847244,15.4779163371,15.4779479491,15.4779795605,15.4780111712,15.4780427812,15.4780743904,15.478105999,15.4781376069,15.4781692141,15.4782008206,15.4782324265, 15.4782640316,15.478295636,15.4783272398,15.4783588428,15.4783904452,15.4784220468,15.4784536478,15.4784852481,15.4785168477,15.4785484466,15.4785800448,15.4786116423,15.4786432391,15.4786748352,15.4787064307,15.4787380254, 15.4787696195,15.4788012128,15.4788328055,15.4788643975,15.4788959888,15.4789275794,15.4789591693,15.4789907585,15.479022347,15.4790539348,15.479085522,15.4791171084,15.4791486942,15.4791802792,15.4792118636,15.4792434473, 15.4792750303,15.4793066125,15.4793381941,15.4793697751,15.4794013553,15.4794329348,15.4794645137,15.4794960918,15.4795276693,15.479559246,15.4795908221,15.4796223975,15.4796539722,15.4796855462,15.4797171195,15.4797486921, 15.479780264,15.4798118353,15.4798434058,15.4798749757,15.4799065448,15.4799381133,15.4799696811,15.4800012482,15.4800328146,15.4800643803,15.4800959453,15.4801275096,15.4801590733,15.4801906362,15.4802221985,15.4802537601, 15.4802853209,15.4803168811,15.4803484406,15.4803799994,15.4804115575,15.480443115,15.4804746717,15.4805062277,15.4805377831,15.4805693378,15.4806008917,15.480632445,15.4806639976,15.4806955495,15.4807271007,15.4807586513, 15.4807902011,15.4808217502,15.4808532987,15.4808848465,15.4809163935,15.4809479399,15.4809794856,15.4810110306,15.4810425749,15.4810741186,15.4811056615,15.4811372037,15.4811687453,15.4812002862,15.4812318263,15.4812633658, 15.4812949046,15.4813264427,15.4813579802,15.4813895169,15.4814210529,15.4814525883,15.4814841229,15.4815156569,15.4815471902,15.4815787228,15.4816102547,15.4816417859,15.4816733164,15.4817048463,15.4817363754,15.4817679039, 15.4817994317,15.4818309587,15.4818624851,15.4818940108,15.4819255359,15.4819570602,15.4819885838,15.4820201068,15.482051629,15.4820831506,15.4821146715,15.4821461917,15.4821777112,15.48220923,15.4822407481,15.4822722656, 15.4823037823,15.4823352984,15.4823668138,15.4823983284,15.4824298424,15.4824613558,15.4824928684,15.4825243803,15.4825558915,15.4825874021,15.482618912,15.4826504212,15.4826819296,15.4827134374,15.4827449446,15.482776451, 15.4828079567,15.4828394618,15.4828709661,15.4829024698,15.4829339728,15.4829654751,15.4829969767,15.4830284776,15.4830599779,15.4830914774,15.4831229763,15.4831544745,15.4831859719,15.4832174687,15.4832489648,15.4832804603, 15.483311955,15.483343449,15.4833749424,15.4834064351,15.4834379271,15.4834694184,15.483500909,15.4835323989,15.4835638881,15.4835953767,15.4836268645,15.4836583517,15.4836898382,15.483721324,15.4837528091,15.4837842935, 15.4838157773,15.4838472603,15.4838787427,15.4839102244,15.4839417053,15.4839731856,15.4840046653,15.4840361442,15.4840676224,15.4840991,15.4841305769,15.484162053,15.4841935285,15.4842250033,15.4842564775,15.4842879509, 15.4843194236,15.4843508957,15.4843823671,15.4844138378,15.4844453078,15.4844767771,15.4845082457,15.4845397137,15.4845711809,15.4846026475,15.4846341134,15.4846655786,15.4846970431,15.4847285069,15.48475997,15.4847914325, 15.4848228943,15.4848543553,15.4848858157,15.4849172754,15.4849487345,15.4849801928,15.4850116505,15.4850431074,15.4850745637,15.4851060193,15.4851374742,15.4851689284,15.485200382,15.4852318348,15.485263287,15.4852947384, 15.4853261892,15.4853576393,15.4853890888,15.4854205375,15.4854519856,15.4854834329,15.4855148796,15.4855463256,15.4855777709,15.4856092155,15.4856406595,15.4856721027,15.4857035453,15.4857349872,15.4857664284,15.4857978689, 15.4858293087,15.4858607478,15.4858921863,15.4859236241,15.4859550612,15.4859864976,15.4860179333,15.4860493683,15.4860808027,15.4861122363,15.4861436693,15.4861751016,15.4862065332,15.4862379641,15.4862693943,15.4863008239, 15.4863322528,15.486363681,15.4863951085,15.4864265353,15.4864579614,15.4864893868,15.4865208116,15.4865522357,15.4865836591,15.4866150818,15.4866465038,15.4866779251,15.4867093458,15.4867407658,15.486772185,15.4868036036, 15.4868350216,15.4868664388,15.4868978553,15.4869292712,15.4869606864,15.4869921009,15.4870235147,15.4870549278,15.4870863403,15.487117752,15.4871491631,15.4871805735,15.4872119832,15.4872433922,15.4872748006,15.4873062082, 15.4873376152,15.4873690215,15.4874004271,15.487431832,15.4874632363,15.4874946398,15.4875260427,15.4875574449,15.4875888464,15.4876202472,15.4876516473,15.4876830468,15.4877144456,15.4877458437,15.4877772411,15.4878086378, 15.4878400338,15.4878714292,15.4879028238,15.4879342178,15.4879656111,15.4879970038,15.4880283957,15.488059787,15.4880911775,15.4881225674,15.4881539566,15.4881853452,15.488216733,15.4882481202,15.4882795066,15.4883108924, 15.4883422775,15.488373662,15.4884050457,15.4884364288,15.4884678111,15.4884991928,15.4885305739,15.4885619542,15.4885933338,15.4886247128,15.4886560911,15.4886874687,15.4887188456,15.4887502218,15.4887815974,15.4888129723, 15.4888443465,15.48887572,15.4889070928,15.4889384649,15.4889698364,15.4890012072,15.4890325773,15.4890639467,15.4890953154,15.4891266835,15.4891580508,15.4891894175,15.4892207835,15.4892521488,15.4892835135,15.4893148774, 15.4893462407,15.4893776033,15.4894089652,15.4894403265,15.489471687,15.4895030469,15.4895344061,15.4895657646,15.4895971224,15.4896284795,15.489659836,15.4896911918,15.4897225469,15.4897539013,15.489785255,15.4898166081, 15.4898479604,15.4898793121,15.4899106631,15.4899420135,15.4899733631,15.4900047121,15.4900360604,15.490067408,15.4900987549,15.4901301011,15.4901614467,15.4901927916,15.4902241358,15.4902554793,15.4902868221,15.4903181643, 15.4903495057,15.4903808465,15.4904121866,15.4904435261,15.4904748648,15.4905062029,15.4905375403,15.490568877,15.490600213,15.4906315484,15.490662883,15.490694217,15.4907255503,15.4907568829,15.4907882149,15.4908195462, 15.4908508767,15.4908822066,15.4909135359,15.4909448644,15.4909761923,15.4910075195,15.491038846,15.4910701718,15.4911014969,15.4911328214,15.4911641452,15.4911954683,15.4912267907,15.4912581124,15.4912894335,15.4913207539, 15.4913520736,15.4913833926,15.4914147109,15.4914460286,15.4914773456,15.4915086619,15.4915399775,15.4915712924,15.4916026067,15.4916339203,15.4916652332,15.4916965454,15.4917278569,15.4917591678,15.491790478,15.4918217875, 15.4918530963,15.4918844045,15.4919157119,15.4919470187,15.4919783248,15.4920096303,15.492040935,15.4920722391,15.4921035425,15.4921348452,15.4921661472,15.4921974486,15.4922287493,15.4922600492,15.4922913486,15.4923226472, 15.4923539452,15.4923852424,15.492416539,15.492447835,15.4924791302,15.4925104248,15.4925417187,15.4925730119,15.4926043044,15.4926355962,15.4926668874,15.4926981779,15.4927294677,15.4927607568,15.4927920453,15.4928233331, 15.4928546202,15.4928859066,15.4929171923,15.4929484774,15.4929797618,15.4930110455,15.4930423285,15.4930736109,15.4931048925,15.4931361735,15.4931674538,15.4931987335,15.4932300124,15.4932612907,15.4932925683,15.4933238452, 15.4933551215,15.4933863971,15.493417672,15.4934489462,15.4934802197,15.4935114926,15.4935427647,15.4935740362,15.4936053071,15.4936365772,15.4936678467,15.4936991155,15.4937303836,15.493761651,15.4937929178,15.4938241838, 15.4938554492,15.493886714,15.493917978,15.4939492414,15.4939805041,15.4940117661,15.4940430274,15.4940742881,15.4941055481,15.4941368074,15.494168066,15.4941993239,15.4942305812,15.4942618378,15.4942930937,15.494324349, 15.4943556035,15.4943868574,15.4944181106,15.4944493632,15.494480615,15.4945118662,15.4945431167,15.4945743665,15.4946056157,15.4946368641,15.4946681119,15.4946993591,15.4947306055,15.4947618513,15.4947930963,15.4948243408, 15.4948555845,15.4948868275,15.4949180699,15.4949493116,15.4949805527,15.495011793,15.4950430327,15.4950742717,15.49510551,15.4951367477,15.4951679846,15.4951992209,15.4952304565,15.4952616915,15.4952929257,15.4953241593, 15.4953553922,15.4953866245,15.495417856,15.4954490869,15.4954803171,15.4955115467,15.4955427755,15.4955740037,15.4956052312,15.495636458,15.4956676842,15.4956989096,15.4957301344,15.4957613586,15.495792582,15.4958238048, 15.4958550269,15.4958862483,15.4959174691,15.4959486891,15.4959799085,15.4960111272,15.4960423453,15.4960735626,15.4961047793,15.4961359954,15.4961672107,15.4961984254,15.4962296394,15.4962608527,15.4962920653,15.4963232773, 15.4963544886,15.4963856992,15.4964169091,15.4964481184,15.496479327,15.4965105349,15.4965417421,15.4965729487,15.4966041546,15.4966353598,15.4966665643,15.4966977682,15.4967289714,15.4967601739,15.4967913757,15.4968225769, 15.4968537774,15.4968849772,15.4969161763,15.4969473748,15.4969785726,15.4970097697,15.4970409662,15.4970721619,15.497103357,15.4971345514,15.4971657452,15.4971969382,15.4972281306,15.4972593224,15.4972905134,15.4973217038, 15.4973528935,15.4973840825,15.4974152708,15.4974464585,15.4974776455,15.4975088318,15.4975400175,15.4975712025,15.4976023868,15.4976335704,15.4976647534,15.4976959357,15.4977271173,15.4977582982,15.4977894785,15.497820658, 15.497851837,15.4978830152,15.4979141928,15.4979453696,15.4979765459,15.4980077214,15.4980388963,15.4980700705,15.498101244,15.4981324168,15.498163589,15.4981947605,15.4982259313,15.4982571015,15.498288271,15.4983194398, 15.4983506079,15.4983817754,15.4984129422,15.4984441083,15.4984752737,15.4985064385,15.4985376026,15.498568766,15.4985999288,15.4986310908,15.4986622522,15.498693413,15.498724573,15.4987557324,15.4987868911,15.4988180492, 15.4988492065,15.4988803632,15.4989115192,15.4989426746,15.4989738293,15.4990049833,15.4990361366,15.4990672892,15.4990984412,15.4991295925,15.4991607432,15.4991918931,15.4992230424,15.4992541911,15.499285339,15.4993164863, 15.4993476329,15.4993787788,15.4994099241,15.4994410686,15.4994722126,15.4995033558,15.4995344984,15.4995656403,15.4995967815,15.499627922,15.4996590619,15.4996902011,15.4997213397,15.4997524775,15.4997836147,15.4998147512, 15.4998458871,15.4998770223,15.4999081568,15.4999392906,15.4999704238,15.5000015562,15.5000326881,15.5000638192,15.5000949497,15.5001260795,15.5001572086,15.5001883371,15.5002194648,15.500250592,15.5002817184,15.5003128442, 15.5003439693,15.5003750937,15.5004062175,15.5004373405,15.500468463,15.5004995847,15.5005307058,15.5005618262,15.5005929459,15.500624065,15.5006551833,15.5006863011,15.5007174181,15.5007485345,15.5007796502,15.5008107652, 15.5008418796,15.5008729932,15.5009041063,15.5009352186,15.5009663303,15.5009974413,15.5010285516,15.5010596613,15.5010907703,15.5011218786,15.5011529862,15.5011840932,15.5012151995,15.5012463052,15.5012774101,15.5013085144, 15.5013396181,15.501370721,15.5014018233,15.5014329249,15.5014640259,15.5014951261,15.5015262257,15.5015573247,15.5015884229,15.5016195205,15.5016506174,15.5016817137,15.5017128093,15.5017439042,15.5017749984,15.501806092, 15.5018371849,15.5018682771,15.5018993687,15.5019304596,15.5019615498,15.5019926394,15.5020237282,15.5020548164,15.502085904,15.5021169909,15.5021480771,15.5021791626,15.5022102474,15.5022413316,15.5022724152,15.502303498, 15.5023345802,15.5023656617,15.5023967426,15.5024278227,15.5024589022,15.5024899811,15.5025210592,15.5025521367,15.5025832136,15.5026142897,15.5026453652,15.50267644,15.5027075142,15.5027385876,15.5027696605,15.5028007326, 15.5028318041,15.5028628749,15.502893945,15.5029250145,15.5029560833,15.5029871514,15.5030182188,15.5030492856,15.5030803518,15.5031114172,15.503142482,15.5031735461,15.5032046095,15.5032356723,15.5032667344,15.5032977959, 15.5033288566,15.5033599167,15.5033909762,15.5034220349,15.503453093,15.5034841504,15.5035152072,15.5035462633,15.5035773187,15.5036083735,15.5036394275,15.503670481,15.5037015337,15.5037325858,15.5037636372,15.5037946879, 15.503825738,15.5038567874,15.5038878361,15.5039188842,15.5039499316,15.5039809783,15.5040120244,15.5040430698,15.5040741145,15.5041051586,15.504136202,15.5041672447,15.5041982867,15.5042293281,15.5042603689,15.5042914089, 15.5043224483,15.504353487,15.5043845251,15.5044155624,15.5044465991,15.5044776352,15.5045086706,15.5045397053,15.5045707393,15.5046017727,15.5046328054,15.5046638374,15.5046948688,15.5047258995,15.5047569296,15.5047879589, 15.5048189876,15.5048500157,15.504881043,15.5049120697,15.5049430958,15.5049741211,15.5050051458,15.5050361699,15.5050671932,15.5050982159,15.505129238,15.5051602593,15.50519128,15.5052223,15.5052533194,15.5052843381, 15.5053153561,15.5053463735,15.5053773902,15.5054084062,15.5054394216,15.5054704363,15.5055014503,15.5055324637,15.5055634764,15.5055944884,15.5056254997,15.5056565104,15.5056875205,15.5057185298,15.5057495385,15.5057805466, 15.5058115539,15.5058425606,15.5058735666,15.505904572,15.5059355767,15.5059665807,15.5059975841,15.5060285868,15.5060595888,15.5060905902,15.5061215909,15.5061525909,15.5061835903,15.506214589,15.506245587,15.5062765844, 15.5063075811,15.5063385771,15.5063695725,15.5064005672,15.5064315613,15.5064625546,15.5064935473,15.5065245394,15.5065555308,15.5065865215,15.5066175115,15.5066485009,15.5066794896,15.5067104776,15.506741465,15.5067724517, 15.5068034378,15.5068344232,15.5068654079,15.506896392,15.5069273753,15.5069583581,15.5069893401,15.5070203215,15.5070513022,15.5070822823,15.5071132617,15.5071442404,15.5071752185,15.5072061959,15.5072371726,15.5072681487, 15.5072991241,15.5073300989,15.5073610729,15.5073920464,15.5074230191,15.5074539912,15.5074849626,15.5075159333,15.5075469034,15.5075778729,15.5076088416,15.5076398097,15.5076707771,15.5077017439,15.50773271,15.5077636754, 15.5077946402,15.5078256043,15.5078565677,15.5078875305,15.5079184926,15.5079494541,15.5079804149,15.508011375,15.5080423344,15.5080732932,15.5081042513,15.5081352088,15.5081661656,15.5081971217,15.5082280772,15.508259032, 15.5082899861,15.5083209396,15.5083518924,15.5083828446,15.5084137961,15.5084447469,15.508475697,15.5085066465,15.5085375953,15.5085685435,15.508599491,15.5086304378,15.508661384,15.5086923295,15.5087232744,15.5087542185, 15.5087851621,15.5088161049,15.5088470471,15.5088779886,15.5089089295,15.5089398697,15.5089708092,15.5090017481,15.5090326863,15.5090636239,15.5090945607,15.5091254969,15.5091564325,15.5091873674,15.5092183016,15.5092492352, 15.5092801681,15.5093111003,15.5093420319,15.5093729628,15.5094038931,15.5094348226,15.5094657516,15.5094966798,15.5095276074,15.5095585344,15.5095894606,15.5096203862,15.5096513112,15.5096822355,15.5097131591,15.509744082, 15.5097750043,15.509805926,15.5098368469,15.5098677672,15.5098986869,15.5099296059,15.5099605242,15.5099914418,15.5100223588,15.5100532751,15.5100841908,15.5101151058,15.5101460202,15.5101769338,15.5102078469,15.5102387592, 15.5102696709,15.5103005819,15.5103314923,15.510362402,15.510393311,15.5104242194,15.5104551271,15.5104860342,15.5105169406,15.5105478463,15.5105787514,15.5106096558,15.5106405596,15.5106714626,15.5107023651,15.5107332668, 15.5107641679,15.5107950684,15.5108259681,15.5108568672,15.5108877657,15.5109186635,15.5109495606,15.5109804571,15.5110113529,15.511042248,15.5110731425,15.5111040363,15.5111349295,15.511165822,15.5111967138,15.511227605, 15.5112584955,15.5112893854,15.5113202745,15.5113511631,15.5113820509,15.5114129381,15.5114438247,15.5114747106,15.5115055958,15.5115364804,15.5115673643,15.5115982475,15.5116291301,15.511660012,15.5116908932,15.5117217738, 15.5117526538,15.511783533,15.5118144117,15.5118452896,15.5118761669,15.5119070435,15.5119379195,15.5119687948,15.5119996694,15.5120305434,15.5120614168,15.5120922894,15.5121231614,15.5121540328,15.5121849034,15.5122157735, 15.5122466428,15.5122775115,15.5123083796,15.512339247,15.5123701137,15.5124009797,15.5124318451,15.5124627099,15.5124935739,15.5125244374,15.5125553001,15.5125861622,15.5126170237,15.5126478844,15.5126787445,15.512709604, 15.5127404628,15.5127713209,15.5128021784,15.5128330352,15.5128638914,15.5128947469,15.5129256017,15.5129564559,15.5129873094,15.5130181623,15.5130490145,15.513079866,15.5131107169,15.5131415671,15.5131724167,15.5132032656, 15.5132341138,15.5132649614,15.5132958083,15.5133266546,15.5133575002,15.5133883451,15.5134191894,15.513450033,15.513480876,15.5135117183,15.5135425599,15.5135734009,15.5136042412,15.5136350809,15.5136659199,15.5136967583, 15.513727596,15.513758433,15.5137892694,15.5138201051,15.5138509401,15.5138817745,15.5139126082,15.5139434413,15.5139742737,15.5140051055,15.5140359366,15.514066767,15.5140975968,15.5141284259,15.5141592544,15.5141900822, 15.5142209094,15.5142517358,15.5142825617,15.5143133868,15.5143442114,15.5143750352,15.5144058584,15.5144366809,15.5144675028,15.514498324,15.5145291446,15.5145599645,15.5145907837,15.5146216023,15.5146524203,15.5146832375, 15.5147140541,15.5147448701,15.5147756854,15.5148065,15.514837314,15.5148681273,15.51489894,15.514929752,15.5149605633,15.514991374,15.515022184,15.5150529934,15.5150838021,15.5151146102,15.5151454176,15.5151762243, 15.5152070304,15.5152378358,15.5152686406,15.5152994447,15.5153302482,15.515361051,15.5153918531,15.5154226546,15.5154534554,15.5154842556,15.5155150551,15.5155458539,15.5155766521,15.5156074496,15.5156382465,15.5156690427, 15.5156998383,15.5157306332,15.5157614274,15.515792221,15.515823014,15.5158538062,15.5158845978,15.5159153888,15.5159461791,15.5159769688,15.5160077577,15.5160385461,15.5160693338,15.5161001208,15.5161309071,15.5161616928, 15.5161924779,15.5162232623,15.516254046,15.5162848291,15.5163156115,15.5163463933,15.5163771744,15.5164079548,15.5164387346,15.5164695137,15.5165002922,15.51653107,15.5165618472,15.5165926237,15.5166233996,15.5166541748, 15.5166849493,15.5167157232,15.5167464964,15.516777269,15.5168080409,15.5168388122,15.5168695828,15.5169003527,15.516931122,15.5169618906,15.5169926586,15.5170234259,15.5170541926,15.5170849586,15.517115724,15.5171464886, 15.5171772527,15.5172080161,15.5172387788,15.5172695409,15.5173003023,15.5173310631,15.5173618232,15.5173925826,15.5174233414,15.5174540995,15.517484857,15.5175156138,15.51754637,15.5175771255,15.5176078804,15.5176386346, 15.5176693881,15.517700141,15.5177308933,15.5177616448,15.5177923958,15.517823146,15.5178538957,15.5178846446,15.5179153929,15.5179461406,15.5179768876,15.5180076339,15.5180383796,15.5180691246,15.518099869,15.5181306127, 15.5181613558,15.5181920982,15.5182228399,15.518253581,15.5182843215,15.5183150612,15.5183458004,15.5183765388,15.5184072767,15.5184380138,15.5184687504,15.5184994862,15.5185302214,15.518560956,15.5185916899,15.5186224231, 15.5186531557,15.5186838876,15.5187146189,15.5187453495,15.5187760795,15.5188068088,15.5188375374,15.5188682654,15.5188989928,15.5189297195,15.5189604455,15.5189911709,15.5190218956,15.5190526197,15.5190833431,15.5191140659, 15.519144788,15.5191755095,15.5192062303,15.5192369504,15.5192676699,15.5192983887,15.5193291069,15.5193598245,15.5193905413,15.5194212576,15.5194519731,15.5194826881,15.5195134023,15.5195441159,15.5195748289,15.5196055412, 15.5196362528,15.5196669638,15.5196976742,15.5197283839,15.5197590929,15.5197898013,15.519820509,15.5198512161,15.5198819225,15.5199126283,15.5199433334,15.5199740378,15.5200047416,15.5200354448,15.5200661473,15.5200968491, 15.5201275503,15.5201582509,15.5201889507,15.52021965,15.5202503486,15.5202810465,15.5203117438,15.5203424404,15.5203731363,15.5204038317,15.5204345263,15.5204652203,15.5204959137,15.5205266064,15.5205572984,15.5205879898, 15.5206186806,15.5206493706,15.5206800601,15.5207107489,15.520741437,15.5207721245,15.5208028113,15.5208334975,15.520864183,15.5208948679,15.5209255521,15.5209562356,15.5209869185,15.5210176008,15.5210482824,15.5210789634, 15.5211096437,15.5211403233,15.5211710023,15.5212016806,15.5212323583,15.5212630354,15.5212937117,15.5213243875,15.5213550626,15.521385737,15.5214164108,15.5214470839,15.5214777564,15.5215084282,15.5215390993,15.5215697699, 15.5216004397,15.5216311089,15.5216617775,15.5216924454,15.5217231127,15.5217537793,15.5217844452,15.5218151105,15.5218457752,15.5218764392,15.5219071025,15.5219377652,15.5219684272,15.5219990886,15.5220297494,15.5220604095, 15.5220910689,15.5221217277,15.5221523858,15.5221830433,15.5222137001,15.5222443563,15.5222750118,15.5223056667,15.5223363209,15.5223669745,15.5223976274,15.5224282797,15.5224589313,15.5224895823,15.5225202326,15.5225508822, 15.5225815313,15.5226121796,15.5226428273,15.5226734744,15.5227041208,15.5227347666,15.5227654117,15.5227960561,15.5228266999,15.5228573431,15.5228879856,15.5229186274,15.5229492686,15.5229799092,15.5230105491,15.5230411883, 15.5230718269,15.5231024649,15.5231331022,15.5231637388,15.5231943748,15.5232250102,15.5232556449,15.5232862789,15.5233169123,15.5233475451,15.5233781772,15.5234088086,15.5234394394,15.5234700695,15.523500699,15.5235313279, 15.5235619561,15.5235925836,15.5236232105,15.5236538367,15.5236844623,15.5237150873,15.5237457116,15.5237763352,15.5238069582,15.5238375805,15.5238682022,15.5238988233,15.5239294437,15.5239600634,15.5239906825,15.5240213009, 15.5240519187,15.5240825359,15.5241131524,15.5241437682,15.5241743834,15.5242049979,15.5242356118,15.5242662251,15.5242968377,15.5243274496,15.5243580609,15.5243886715,15.5244192815,15.5244498909,15.5244804996,15.5245111076, 15.524541715,15.5245723218,15.5246029279,15.5246335333,15.5246641381,15.5246947423,15.5247253458,15.5247559486,15.5247865509,15.5248171524,15.5248477533,15.5248783536,15.5249089532,15.5249395521,15.5249701504,15.5250007481, 15.5250313451,15.5250619415,15.5250925372,15.5251231323,15.5251537267,15.5251843205,15.5252149136,15.525245506,15.5252760979,15.525306689,15.5253372796,15.5253678694,15.5253984587,15.5254290472,15.5254596352,15.5254902225, 15.5255208091,15.5255513951,15.5255819804,15.5256125651,15.5256431491,15.5256737325,15.5257043153,15.5257348974,15.5257654788,15.5257960596,15.5258266398,15.5258572193,15.5258877981,15.5259183763,15.5259489539,15.5259795308, 15.5260101071,15.5260406827,15.5260712576,15.526101832,15.5261324056,15.5261629787,15.526193551,15.5262241228,15.5262546938,15.5262852643,15.526315834,15.5263464032,15.5263769717,15.5264075395,15.5264381067,15.5264686732, 15.5264992391,15.5265298044,15.526560369,15.5265909329,15.5266214962,15.5266520589,15.5266826209,15.5267131823,15.526743743,15.5267743031,15.5268048625,15.5268354213,15.5268659794,15.5268965369,15.5269270937,15.5269576499, 15.5269882054,15.5270187603,15.5270493146,15.5270798682,15.5271104211,15.5271409734,15.5271715251,15.5272020761,15.5272326264,15.5272631762,15.5272937252,15.5273242737,15.5273548214,15.5273853686,15.527415915,15.5274464609, 15.5274770061,15.5275075506,15.5275380945,15.5275686377,15.5275991803,15.5276297223,15.5276602636,15.5276908043,15.5277213443,15.5277518837,15.5277824224,15.5278129605,15.5278434979,15.5278740347,15.5279045708,15.5279351063, 15.5279656411,15.5279961753,15.5280267089,15.5280572418,15.528087774,15.5281183057,15.5281488366,15.5281793669,15.5282098966,15.5282404257,15.528270954,15.5283014818,15.5283320089,15.5283625353,15.5283930611,15.5284235863, 15.5284541108,15.5284846346,15.5285151578,15.5285456804,15.5285762023,15.5286067236,15.5286372442,15.5286677642,15.5286982836,15.5287288023,15.5287593203,15.5287898377,15.5288203545,15.5288508706,15.5288813861,15.5289119009, 15.5289424151,15.5289729286,15.5290034415,15.5290339537,15.5290644653,15.5290949763,15.5291254866,15.5291559962,15.5291865053,15.5292170136,15.5292475213,15.5292780284,15.5293085349,15.5293390406,15.5293695458,15.5294000503, 15.5294305541,15.5294610574,15.5294915599,15.5295220618,15.5295525631,15.5295830637,15.5296135637,15.5296440631,15.5296745618,15.5297050598,15.5297355572,15.529766054,15.5297965501,15.5298270456,15.5298575404,15.5298880346, 15.5299185281,15.529949021,15.5299795133,15.5300100049,15.5300404958,15.5300709861,15.5301014758,15.5301319648,15.5301624532,15.530192941,15.5302234281,15.5302539145,15.5302844003,15.5303148855,15.53034537,15.5303758539, 15.5304063371,15.5304368197,15.5304673016,15.5304977829,15.5305282636,15.5305587436,15.530589223,15.5306197017,15.5306501798,15.5306806572,15.530711134,15.5307416101,15.5307720856,15.5308025605,15.5308330347,15.5308635083, 15.5308939812,15.5309244535,15.5309549251,15.5309853961,15.5310158665,15.5310463362,15.5310768052,15.5311072737,15.5311377414,15.5311682086,15.5311986751,15.5312291409,15.5312596061,15.5312900707,15.5313205346,15.5313509979, 15.5313814605,15.5314119225,15.5314423839,15.5314728446,15.5315033046,15.531533764,15.5315642228,15.5315946809,15.5316251384,15.5316555953,15.5316860515,15.531716507,15.5317469619,15.5317774162,15.5318078698,15.5318383228, 15.5318687752,15.5318992269,15.5319296779,15.5319601284,15.5319905781,15.5320210273,15.5320514757,15.5320819236,15.5321123708,15.5321428174,15.5321732633,15.5322037085,15.5322341532,15.5322645972,15.5322950405,15.5323254832, 15.5323559253,15.5323863667,15.5324168075,15.5324472476,15.5324776871,15.532508126,15.5325385642,15.5325690017,15.5325994387,15.532629875,15.5326603106,15.5326907456,15.53272118,15.5327516137,15.5327820467,15.5328124792, 15.532842911,15.5328733421,15.5329037726,15.5329342025,15.5329646317,15.5329950603,15.5330254882,15.5330559155,15.5330863422,15.5331167682,15.5331471936,15.5331776183,15.5332080424,15.5332384658,15.5332688886,15.5332993108, 15.5333297323,15.5333601532,15.5333905734,15.533420993,15.533451412,15.5334818303,15.533512248,15.533542665,15.5335730814,15.5336034971,15.5336339122,15.5336643267,15.5336947405,15.5337251537,15.5337555663,15.5337859782, 15.5338163894,15.5338468001,15.53387721,15.5339076194,15.5339380281,15.5339684361,15.5339988435,15.5340292503,15.5340596565,15.5340900619,15.5341204668,15.534150871,15.5341812746,15.5342116775,15.5342420798,15.5342724814, 15.5343028825,15.5343332828,15.5343636825,15.5343940816,15.5344244801,15.5344548779,15.5344852751,15.5345156716,15.5345460675,15.5345764627,15.5346068573,15.5346372513,15.5346676446,15.5346980373,15.5347284293,15.5347588207, 15.5347892115,15.5348196016,15.5348499911,15.5348803799,15.5349107681,15.5349411557,15.5349715426,15.5350019289,15.5350323145,15.5350626995,15.5350930839,15.5351234676,15.5351538507,15.5351842331,15.5352146149,15.5352449961, 15.5352753766,15.5353057565,15.5353361357,15.5353665143,15.5353968923,15.5354272696,15.5354576463,15.5354880224,15.5355183978,15.5355487725,15.5355791467,15.5356095201,15.535639893,15.5356702652,15.5357006368,15.5357310077, 15.535761378,15.5357917476,15.5358221166,15.535852485,15.5358828528,15.5359132198,15.5359435863,15.5359739521,15.5360043173,15.5360346818,15.5360650457,15.536095409,15.5361257716,15.5361561336,15.5361864949,15.5362168556, 15.5362472157,15.5362775751,15.5363079339,15.536338292,15.5363686496,15.5363990064,15.5364293627,15.5364597182,15.5364900732,15.5365204275,15.5365507812,15.5365811342,15.5366114866,15.5366418384,15.5366721895,15.53670254, 15.5367328898,15.536763239,15.5367935876,15.5368239355,15.5368542828,15.5368846295,15.5369149755,15.5369453209,15.5369756656,15.5370060097,15.5370363532,15.537066696,15.5370970382,15.5371273797,15.5371577206,15.5371880609, 15.5372184005,15.5372487395,15.5372790779,15.5373094156,15.5373397527,15.5373700891,15.5374004249,15.5374307601,15.5374610946,15.5374914285,15.5375217618,15.5375520944,15.5375824264,15.5376127577,15.5376430884,15.5376734185, 15.5377037479,15.5377340767,15.5377644048,15.5377947324,15.5378250592,15.5378553855,15.5378857111,15.537916036,15.5379463604,15.5379766841,15.5380070071,15.5380373295,15.5380676513,15.5380979725,15.538128293,15.5381586128, 15.5381889321,15.5382192506,15.5382495686,15.5382798859,15.5383102026,15.5383405186,15.538370834,15.5384011488,15.538431463,15.5384617764,15.5384920893,15.5385224015,15.5385527131,15.5385830241,15.5386133344,15.538643644, 15.5386739531,15.5387042615,15.5387345692,15.5387648764,15.5387951829,15.5388254887,15.5388557939,15.5388860985,15.5389164025,15.5389467058,15.5389770084,15.5390073105,15.5390376119,15.5390679126,15.5390982128,15.5391285123, 15.5391588111,15.5391891093,15.5392194069,15.5392497038,15.5392800002,15.5393102958,15.5393405909,15.5393708853,15.539401179,15.5394314722,15.5394617646,15.5394920565,15.5395223477,15.5395526383,15.5395829283,15.5396132176, 15.5396435062,15.5396737943,15.5397040817,15.5397343684,15.5397646546,15.5397949401,15.5398252249,15.5398555092,15.5398857928,15.5399160757,15.539946358,15.5399766397,15.5400069208,15.5400372012,15.5400674809,15.5400977601, 15.5401280386,15.5401583165,15.5401885937,15.5402188703,15.5402491462,15.5402794216,15.5403096963,15.5403399703,15.5403702437,15.5404005165,15.5404307887,15.5404610602,15.5404913311,15.5405216013,15.5405518709,15.5405821399, 15.5406124082,15.540642676,15.540672943,15.5407032095,15.5407334753,15.5407637404,15.540794005,15.5408242689,15.5408545321,15.5408847947,15.5409150567,15.5409453181,15.5409755788,15.5410058389,15.5410360983,15.5410663572, 15.5410966153,15.5411268729,15.5411571298,15.5411873861,15.5412176417,15.5412478967,15.5412781511,15.5413084049,15.541338658,15.5413689104,15.5413991623,15.5414294135,15.5414596641,15.541489914,15.5415201633,15.541550412, 15.54158066,15.5416109074,15.5416411542,15.5416714003,15.5417016458,15.5417318906,15.5417621349,15.5417923785,15.5418226214,15.5418528638,15.5418831054,15.5419133465,15.5419435869,15.5419738267,15.5420040659,15.5420343044, 15.5420645423,15.5420947795,15.5421250162,15.5421552521,15.5421854875,15.5422157222,15.5422459563,15.5422761898,15.5423064226,15.5423366548,15.5423668863,15.5423971172,15.5424273475,15.5424575772,15.5424878062,15.5425180346, 15.5425482623,15.5425784895,15.5426087159,15.5426389418,15.542669167,15.5426993916,15.5427296155,15.5427598389,15.5427900616,15.5428202836,15.542850505,15.5428807258,15.542910946,15.5429411655,15.5429713844,15.5430016026, 15.5430318203,15.5430620372,15.5430922536,15.5431224693,15.5431526844,15.5431828989,15.5432131127,15.5432433259,15.5432735384,15.5433037504,15.5433339617,15.5433641723,15.5433943824,15.5434245918,15.5434548005,15.5434850087, 15.5435152162,15.543545423,15.5435756293,15.5436058349,15.5436360398,15.5436662442,15.5436964479,15.5437266509,15.5437568534,15.5437870552,15.5438172564,15.5438474569,15.5438776568,15.5439078561,15.5439380547,15.5439682528, 15.5439984501,15.5440286469,15.544058843,15.5440890385,15.5441192333,15.5441494276,15.5441796212,15.5442098141,15.5442400064,15.5442701981,15.5443003892,15.5443305796,15.5443607694,15.5443909586,15.5444211471,15.544451335, 15.5444815223,15.544511709,15.544541895,15.5445720803,15.5446022651,15.5446324492,15.5446626327,15.5446928155,15.5447229978,15.5447531793,15.5447833603,15.5448135406,15.5448437203,15.5448738994,15.5449040778,15.5449342556, 15.5449644328,15.5449946093,15.5450247852,15.5450549605,15.5450851352,15.5451153092,15.5451454826,15.5451756553,15.5452058274,15.5452359989,15.5452661698,15.54529634,15.5453265096,15.5453566786,15.5453868469,15.5454170146, 15.5454471817,15.5454773481,15.5455075139,15.5455376791,15.5455678437,15.5455980076,15.5456281709,15.5456583335,15.5456884956,15.545718657,15.5457488177,15.5457789779,15.5458091374,15.5458392962,15.5458694545,15.5458996121, 15.5459297691,15.5459599254,15.5459900812,15.5460202363,15.5460503907,15.5460805446,15.5461106978,15.5461408503,15.5461710023,15.5462011536,15.5462313043,15.5462614543,15.5462916037,15.5463217525,15.5463519007,15.5463820482, 15.5464121951,15.5464423414,15.546472487,15.546502632,15.5465327764,15.5465629202,15.5465930633,15.5466232058,15.5466533477,15.5466834889,15.5467136295,15.5467437695,15.5467739088,15.5468040475,15.5468341856,15.5468643231, 15.5468944599,15.5469245961,15.5469547317,15.5469848666,15.5470150009,15.5470451346,15.5470752676,15.5471054,15.5471355318,15.547165663,15.5471957935,15.5472259234,15.5472560527,15.5472861813,15.5473163094,15.5473464367, 15.5473765635,15.5474066896,15.5474368151,15.54746694,15.5474970642,15.5475271878,15.5475573108,15.5475874332,15.5476175549,15.547647676,15.5476777965,15.5477079163,15.5477380355,15.5477681541,15.547798272,15.5478283894, 15.5478585061,15.5478886221,15.5479187376,15.5479488524,15.5479789665,15.5480090801,15.548039193,15.5480693053,15.548099417,15.548129528,15.5481596384,15.5481897482,15.5482198574,15.5482499659,15.5482800738,15.548310181, 15.5483402877,15.5483703937,15.5484004991,15.5484306038,15.5484607079,15.5484908114,15.5485209143,15.5485510166,15.5485811182,15.5486112191,15.5486413195,15.5486714192,15.5487015183,15.5487316168,15.5487617147,15.5487918119, 15.5488219085,15.5488520044,15.5488820998,15.5489121945,15.5489422885,15.548972382,15.5490024748,15.549032567,15.5490626586,15.5490927495,15.5491228398,15.5491529295,15.5491830186,15.549213107,15.5492431948,15.549273282, 15.5493033685,15.5493334544,15.5493635397,15.5493936244,15.5494237084,15.5494537918,15.5494838746,15.5495139568,15.5495440383,15.5495741192,15.5496041995,15.5496342791,15.5496643581,15.5496944365,15.5497245143,15.5497545914, 15.5497846679,15.5498147438,15.5498448191,15.5498748937,15.5499049677,15.5499350411,15.5499651138,15.549995186,15.5500252575,15.5500553283,15.5500853986,15.5501154682,15.5501455372,15.5501756055,15.5502056733,15.5502357404, 15.5502658069,15.5502958727,15.550325938,15.5503560026,15.5503860665,15.5504161299,15.5504461926,15.5504762547,15.5505063162,15.550536377,15.5505664372,15.5505964968,15.5506265558,15.5506566141,15.5506866718,15.5507167289, 15.5507467854,15.5507768412,15.5508068964,15.550836951,15.550867005,15.5508970583,15.550927111,15.5509571631,15.5509872145,15.5510172653,15.5510473155,15.5510773651,15.5511074141,15.5511374624,15.5511675101,15.5511975572, 15.5512276036,15.5512576494,15.5512876946,15.5513177392,15.5513477831,15.5513778264,15.5514078691,15.5514379112,15.5514679526,15.5514979934,15.5515280336,15.5515580732,15.5515881121,15.5516181504,15.5516481881,15.5516782252, 15.5517082616,15.5517382974,15.5517683326,15.5517983672,15.5518284011,15.5518584344,15.5518884671,15.5519184992,15.5519485306,15.5519785614,15.5520085916,15.5520386211,15.5520686501,15.5520986784,15.5521287061,15.5521587331, 15.5521887596,15.5522187854,15.5522488105,15.5522788351,15.552308859,15.5523388823,15.552368905,15.5523989271,15.5524289485,15.5524589693,15.5524889895,15.5525190091,15.552549028,15.5525790463,15.552609064,15.5526390811, 15.5526690975,15.5526991133,15.5527291285,15.5527591431,15.552789157,15.5528191703,15.552849183,15.5528791951,15.5529092065,15.5529392174,15.5529692275,15.5529992371,15.5530292461,15.5530592544,15.5530892621,15.5531192692, 15.5531492756,15.5531792814,15.5532092866,15.5532392912,15.5532692952,15.5532992985,15.5533293012,15.5533593033,15.5533893047,15.5534193056,15.5534493058,15.5534793053,15.5535093043,15.5535393026,15.5535693004,15.5535992975, 15.5536292939,15.5536592898,15.553689285,15.5537192796,15.5537492735,15.5537792669,15.5538092596,15.5538392517,15.5538692432,15.5538992341,15.5539292243,15.5539592139,15.5539892029,15.5540191912,15.554049179,15.5540791661, 15.5541091526,15.5541391384,15.5541691237,15.5541991083,15.5542290923,15.5542590757,15.5542890584,15.5543190406,15.5543490221,15.5543790029,15.5544089832,15.5544389628,15.5544689419,15.5544989202,15.554528898,15.5545588752, 15.5545888517,15.5546188276,15.5546488029,15.5546787775,15.5547087515,15.5547387249,15.5547686977,15.5547986699,15.5548286414,15.5548586123,15.5548885826,15.5549185523,15.5549485214,15.5549784898,15.5550084576,15.5550384248, 15.5550683913,15.5550983573,15.5551283226,15.5551582873,15.5551882513,15.5552182148,15.5552481776,15.5552781398,15.5553081014,15.5553380624,15.5553680227,15.5553979824,15.5554279415,15.5554579,15.5554878578,15.555517815, 15.5555477716,15.5555777276,15.555607683,15.5556376377,15.5556675918,15.5556975453,15.5557274982,15.5557574505,15.5557874021,15.5558173531,15.5558473035,15.5558772532,15.5559072024,15.5559371509,15.5559670988,15.5559970461, 15.5560269927,15.5560569388,15.5560868842,15.556116829,15.5561467731,15.5561767167,15.5562066596,15.5562366019,15.5562665436,15.5562964846,15.5563264251,15.5563563649,15.5563863041,15.5564162427,15.5564461806,15.556476118, 15.5565060547,15.5565359908,15.5565659262,15.5565958611,15.5566257953,15.5566557289,15.5566856619,15.5567155943,15.556745526,15.5567754571,15.5568053876,15.5568353175,15.5568652468,15.5568951754,15.5569251034,15.5569550308, 15.5569849576,15.5570148837,15.5570448093,15.5570747342,15.5571046585,15.5571345822,15.5571645052,15.5571944276,15.5572243495,15.5572542706,15.5572841912,15.5573141112,15.5573440305,15.5573739492,15.5574038673,15.5574337848, 15.5574637016,15.5574936178,15.5575235334,15.5575534484,15.5575833628,15.5576132765,15.5576431896,15.5576731022,15.557703014,15.5577329253,15.5577628359,15.557792746,15.5578226554,15.5578525642,15.5578824723,15.5579123799, 15.5579422868,15.5579721931,15.5580020988,15.5580320038,15.5580619083,15.5580918121,15.5581217153,15.5581516179,15.5581815199,15.5582114212,15.5582413219,15.558271222,15.5583011215,15.5583310204,15.5583609186,15.5583908163, 15.5584207133,15.5584506097,15.5584805054,15.5585104006,15.5585402951,15.558570189,15.5586000823,15.558629975,15.558659867,15.5586897585,15.5587196493,15.5587495395,15.558779429,15.558809318,15.5588392063,15.558869094, 15.5588989811,15.5589288676,15.5589587535,15.5589886387,15.5590185233,15.5590484073,15.5590782907,15.5591081735,15.5591380556,15.5591679372,15.5591978181,15.5592276984,15.559257578,15.5592874571,15.5593173355,15.5593472133, 15.5593770905,15.5594069671,15.5594368431,15.5594667184,15.5594965931,15.5595264672,15.5595563407,15.5595862136,15.5596160858,15.5596459574,15.5596758284,15.5597056988,15.5597355686,15.5597654378,15.5597953063,15.5598251742, 15.5598550415,15.5598849082,15.5599147743,15.5599446397,15.5599745045,15.5600043687,15.5600342323,15.5600640953,15.5600939576,15.5601238194,15.5601536805,15.560183541,15.5602134009,15.5602432601,15.5602731188,15.5603029768, 15.5603328342,15.560362691,15.5603925472,15.5604224027,15.5604522577,15.560482112,15.5605119657,15.5605418188,15.5605716712,15.5606015231,15.5606313743,15.5606612249,15.5606910749,15.5607209243,15.5607507731,15.5607806212, 15.5608104687,15.5608403156,15.5608701619,15.5609000076,15.5609298527,15.5609596971,15.5609895409,15.5610193841,15.5610492267,15.5610790687,15.56110891,15.5611387508,15.5611685909,15.5611984304,15.5612282693,15.5612581075, 15.5612879452,15.5613177822,15.5613476186,15.5613774544,15.5614072896,15.5614371241,15.5614669581,15.5614967914,15.5615266241,15.5615564562,15.5615862877,15.5616161186,15.5616459488,15.5616757784,15.5617056075,15.5617354358, 15.5617652636,15.5617950908,15.5618249173,15.5618547433,15.5618845686,15.5619143933,15.5619442173,15.5619740408,15.5620038637,15.5620336859,15.5620635075,15.5620933285,15.5621231489,15.5621529686,15.5621827878,15.5622126063, 15.5622424242,15.5622722415,15.5623020582,15.5623318743,15.5623616897,15.5623915045,15.5624213188,15.5624511324,15.5624809453,15.5625107577,15.5625405695,15.5625703806,15.5626001911,15.562630001,15.5626598103,15.562689619, 15.562719427,15.5627492345,15.5627790413,15.5628088475,15.5628386531,15.5628684581,15.5628982625,15.5629280662,15.5629578693,15.5629876718,15.5630174737,15.563047275,15.5630770757,15.5631068758,15.5631366752,15.563166474, 15.5631962722,15.5632260698,15.5632558668,15.5632856631,15.5633154589,15.563345254,15.5633750485,15.5634048424,15.5634346357,15.5634644284,15.5634942204,15.5635240119,15.5635538027,15.5635835929,15.5636133825,15.5636431715, 15.5636729598,15.5637027476,15.5637325347,15.5637623212,15.5637921071,15.5638218924,15.5638516771,15.5638814611,15.5639112446,15.5639410274,15.5639708096,15.5640005912,15.5640303722,15.5640601526,15.5640899323,15.5641197115, 15.56414949,15.5641792679,15.5642090452,15.5642388219,15.5642685979,15.5642983734,15.5643281482,15.5643579224,15.5643876961,15.564417469,15.5644472414,15.5644770132,15.5645067843,15.5645365549,15.5645663248,15.5645960941, 15.5646258628,15.5646556309,15.5646853983,15.5647151652,15.5647449314,15.564774697,15.5648044621,15.5648342264,15.5648639902,15.5648937534,15.5649235159,15.5649532779,15.5649830392,15.5650127999,15.56504256,15.5650723195, 15.5651020784,15.5651318366,15.5651615943,15.5651913513,15.5652211077,15.5652508635,15.5652806187,15.5653103733,15.5653401272,15.5653698806,15.5653996333,15.5654293854,15.5654591369,15.5654888878,15.5655186381,15.5655483877, 15.5655781368,15.5656078852,15.565637633,15.5656673803,15.5656971268,15.5657268728,15.5657566182,15.565786363,15.5658161071,15.5658458506,15.5658755935,15.5659053359,15.5659350775,15.5659648186,15.5659945591,15.5660242989, 15.5660540382,15.5660837768,15.5661135148,15.5661432522,15.566172989,15.5662027252,15.5662324607,15.5662621957,15.56629193,15.5663216637,15.5663513968,15.5663811293,15.5664108612,15.5664405925,15.5664703231,15.5665000532, 15.5665297826,15.5665595114,15.5665892397,15.5666189672,15.5666486942,15.5666784206,15.5667081464,15.5667378715,15.566767596,15.56679732,15.5668270433,15.566856766,15.566886488,15.5669162095,15.5669459304,15.5669756506, 15.5670053702,15.5670350893,15.5670648077,15.5670945255,15.5671242427,15.5671539592,15.5671836752,15.5672133905,15.5672431053,15.5672728194,15.5673025329,15.5673322458,15.5673619581,15.5673916698,15.5674213808,15.5674510913, 15.5674808011,15.5675105104,15.567540219,15.567569927,15.5675996344,15.5676293412,15.5676590473,15.5676887529,15.5677184579,15.5677481622,15.5677778659,15.567807569,15.5678372715,15.5678669734,15.5678966747,15.5679263754, 15.5679560754,15.5679857749,15.5680154737,15.5680451719,15.5680748695,15.5681045665,15.5681342629,15.5681639587,15.5681936539,15.5682233484,15.5682530423,15.5682827357,15.5683124284,15.5683421205,15.568371812,15.5684015029, 15.5684311932,15.5684608828,15.5684905719,15.5685202603,15.5685499482,15.5685796354,15.568609322,15.568639008,15.5686686934,15.5686983782,15.5687280623,15.5687577459,15.5687874288,15.5688171112,15.5688467929,15.568876474, 15.5689061545,15.5689358344,15.5689655137,15.5689951923,15.5690248704,15.5690545479,15.5690842247,15.5691139009,15.5691435765,15.5691732516,15.569202926,15.5692325997,15.5692622729,15.5692919455,15.5693216174,15.5693512888, 15.5693809595,15.5694106296,15.5694402992,15.5694699681,15.5694996364,15.5695293041,15.5695589711,15.5695886376,15.5696183034,15.5696479687,15.5696776333,15.5697072974,15.5697369608,15.5697666236,15.5697962858,15.5698259474, 15.5698556083,15.5698852687,15.5699149285,15.5699445876,15.5699742461,15.5700039041,15.5700335614,15.5700632181,15.5700928742,15.5701225297,15.5701521846,15.5701818388,15.5702114925,15.5702411455,15.570270798,15.5703004498, 15.570330101,15.5703597516,15.5703894016,15.570419051,15.5704486998,15.570478348,15.5705079956,15.5705376425,15.5705672889,15.5705969346,15.5706265797,15.5706562243,15.5706858682,15.5707155115,15.5707451542,15.5707747962, 15.5708044377,15.5708340786,15.5708637188,15.5708933585,15.5709229975,15.570952636,15.5709822738,15.571011911,15.5710415476,15.5710711836,15.571100819,15.5711304538,15.5711600879,15.5711897215,15.5712193544,15.5712489868, 15.5712786185,15.5713082496,15.5713378802,15.5713675101,15.5713971394,15.5714267681,15.5714563961,15.5714860236,15.5715156505,15.5715452767,15.5715749024,15.5716045274,15.5716341519,15.5716637757,15.5716933989,15.5717230215, 15.5717526435,15.5717822649,15.5718118857,15.5718415059,15.5718711254,15.5719007444,15.5719303627,15.5719599805,15.5719895976,15.5720192141,15.57204883,15.5720784454,15.5721080601,15.5721376742,15.5721672876,15.5721969005, 15.5722265128,15.5722561245,15.5722857355,15.572315346,15.5723449558,15.572374565,15.5724041737,15.5724337817,15.5724633891,15.5724929959,15.5725226021,15.5725522077,15.5725818126,15.572611417,15.5726410208,15.5726706239, 15.5727002265,15.5727298284,15.5727594298,15.5727890305,15.5728186306,15.5728482301,15.572877829,15.5729074273,15.572937025,15.5729666221,15.5729962186,15.5730258144,15.5730554097,15.5730850044,15.5731145984,15.5731441919, 15.5731737847,15.5732033769,15.5732329685,15.5732625595,15.57329215,15.5733217398,15.5733513289,15.5733809175,15.5734105055,15.5734400929,15.5734696796,15.5734992658,15.5735288514,15.5735584363,15.5735880206,15.5736176044, 15.5736471875,15.57367677,15.5737063519,15.5737359332,15.5737655139,15.573795094,15.5738246735,15.5738542524,15.5738838307,15.5739134083,15.5739429854,15.5739725618,15.5740021377,15.5740317129,15.5740612876,15.5740908616, 15.574120435,15.5741500078,15.57417958,15.5742091516,15.5742387226,15.574268293,15.5742978628,15.574327432,15.5743570006,15.5743865685,15.5744161359,15.5744457026,15.5744752688,15.5745048343,15.5745343993,15.5745639636, 15.5745935273,15.5746230905,15.574652653,15.5746822149,15.5747117762,15.5747413369,15.574770897,15.5748004565,15.5748300153,15.5748595736,15.5748891313,15.5749186883,15.5749482448,15.5749778007,15.5750073559,15.5750369105, 15.5750664646,15.575096018,15.5751255708,15.5751551231,15.5751846747,15.5752142257,15.5752437761,15.5752733259,15.5753028751,15.5753324237,15.5753619716,15.575391519,15.5754210658,15.575450612,15.5754801575,15.5755097025, 15.5755392468,15.5755687906,15.5755983337,15.5756278763,15.5756574182,15.5756869595,15.5757165002,15.5757460404,15.5757755799,15.5758051188,15.5758346571,15.5758641948,15.5758937319,15.5759232684,15.5759528043,15.5759823395, 15.5760118742,15.5760414083,15.5760709417,15.5761004746,15.5761300069,15.5761595385,15.5761890696,15.5762186,15.5762481298,15.5762776591,15.5763071877,15.5763367157,15.5763662432,15.57639577,15.5764252962,15.5764548218, 15.5764843468,15.5765138712,15.576543395,15.5765729182,15.5766024408,15.5766319628,15.5766614841,15.5766910049,15.5767205251,15.5767500446,15.5767795636,15.576809082,15.5768385997,15.5768681169,15.5768976334,15.5769271494, 15.5769566647,15.5769861794,15.5770156936,15.5770452071,15.57707472,15.5771042323,15.5771337441,15.5771632552,15.5771927657,15.5772222756,15.5772517849,15.5772812936,15.5773108017,15.5773403092,15.5773698161,15.5773993224, 15.577428828,15.5774583331,15.5774878376,15.5775173415,15.5775468447,15.5775763474,15.5776058495,15.5776353509,15.5776648518,15.577694352,15.5777238517,15.5777533507,15.5777828492,15.577812347,15.5778418442,15.5778713409, 15.5779008369,15.5779303323,15.5779598271,15.5779893214,15.578018815,15.578048308,15.5780778004,15.5781072922,15.5781367834,15.578166274,15.578195764,15.5782252534,15.5782547422,15.5782842304,15.578313718,15.578343205, 15.5783726914,15.5784021771,15.5784316623,15.5784611469,15.5784906309,15.5785201142,15.578549597,15.5785790792,15.5786085607,15.5786380417,15.5786675221,15.5786970018,15.578726481,15.5787559595,15.5787854375,15.5788149148, 15.5788443916,15.5788738677,15.5789033432,15.5789328182,15.5789622925,15.5789917662,15.5790212394,15.5790507119,15.5790801838,15.5791096552,15.5791391259,15.579168596,15.5791980655,15.5792275344,15.5792570028,15.5792864705, 15.5793159376,15.5793454041,15.57937487,15.5794043353,15.5794338,15.5794632641,15.5794927276,15.5795221905,15.5795516528,15.5795811145,15.5796105756,15.5796400361,15.579669496,15.5796989553,15.579728414,15.579757872, 15.5797873295,15.5798167864,15.5798462427,15.5798756984,15.5799051535,15.5799346079,15.5799640618,15.5799935151,15.5800229678,15.5800524198,15.5800818713,15.5801113222,15.5801407724,15.5801702221,15.5801996712,15.5802291196, 15.5802585675,15.5802880148,15.5803174614,15.5803469075,15.5803763529,15.5804057978,15.5804352421,15.5804646857,15.5804941288,15.5805235712,15.5805530131,15.5805824543,15.580611895,15.580641335,15.5806707745,15.5807002133, 15.5807296516,15.5807590892,15.5807885263,15.5808179627,15.5808473986,15.5808768338,15.5809062685,15.5809357025,15.580965136,15.5809945688,15.5810240011,15.5810534327,15.5810828638,15.5811122942,15.581141724,15.5811711533, 15.5812005819,15.58123001,15.5812594374,15.5812888642,15.5813182905,15.5813477161,15.5813771412,15.5814065656,15.5814359895,15.5814654127,15.5814948353,15.5815242574,15.5815536788,15.5815830997,15.5816125199,15.5816419395, 15.5816713586,15.581700777,15.5817301949,15.5817596121,15.5817890287,15.5818184448,15.5818478602,15.5818772751,15.5819066893,15.581936103,15.581965516,15.5819949284,15.5820243403,15.5820537515,15.5820831622,15.5821125722, 15.5821419817,15.5821713905,15.5822007988,15.5822302064,15.5822596134,15.5822890199,15.5823184257,15.582347831,15.5823772356,15.5824066397,15.5824360431,15.582465446,15.5824948482,15.5825242499,15.582553651,15.5825830514, 15.5826124513,15.5826418505,15.5826712492,15.5827006472,15.5827300447,15.5827594416,15.5827888378,15.5828182335,15.5828476286,15.582877023,15.5829064169,15.5829358101,15.5829652028,15.5829945949,15.5830239864,15.5830533772, 15.5830827675,15.5831121572,15.5831415463,15.5831709347,15.5832003226,15.5832297099,15.5832590966,15.5832884827,15.5833178681,15.583347253,15.5833766373,15.583406021,15.5834354041,15.5834647866,15.5834941685,15.5835235498, 15.5835529305,15.5835823106,15.5836116901,15.583641069,15.5836704473,15.583699825,15.5837292021,15.5837585786,15.5837879545,15.5838173298,15.5838467045,15.5838760786,15.5839054522,15.5839348251,15.5839641974,15.5839935691, 15.5840229403,15.5840523108,15.5840816807,15.58411105,15.5841404188,15.5841697869,15.5841991545,15.5842285214,15.5842578877,15.5842872535,15.5843166186,15.5843459832,15.5843753471,15.5844047105,15.5844340733,15.5844634354, 15.584492797,15.5845221579,15.5845515183,15.5845808781,15.5846102372,15.5846395958,15.5846689538,15.5846983112,15.584727668,15.5847570241,15.5847863797,15.5848157347,15.5848450891,15.5848744429,15.5849037961,15.5849331487, 15.5849625007,15.5849918521,15.5850212029,15.5850505532,15.5850799028,15.5851092518,15.5851386002,15.585167948,15.5851972953,15.5852266419,15.5852559879,15.5852853334,15.5853146782,15.5853440224,15.5853733661,15.5854027091, 15.5854320516,15.5854613934,15.5854907347,15.5855200754,15.5855494154,15.5855787549,15.5856080938,15.5856374321,15.5856667697,15.5856961068,15.5857254433,15.5857547792,15.5857841145,15.5858134492,15.5858427833,15.5858721168, 15.5859014497,15.585930782,15.5859601137,15.5859894448,15.5860187754,15.5860481053,15.5860774346,15.5861067633,15.5861360915,15.586165419,15.586194746,15.5862240723,15.5862533981,15.5862827232,15.5863120478,15.5863413717, 15.5863706951,15.5864000179,15.5864293401,15.5864586616,15.5864879826,15.586517303,15.5865466228,15.586575942,15.5866052606,15.5866345786,15.586663896,15.5866932128,15.586722529,15.5867518447,15.5867811597,15.5868104741, 15.586839788,15.5868691012,15.5868984138,15.5869277259,15.5869570373,15.5869863482,15.5870156585,15.5870449681,15.5870742772,15.5871035857,15.5871328936,15.5871622008,15.5871915075,15.5872208136,15.5872501191,15.587279424, 15.5873087283,15.587338032,15.5873673352,15.5873966377,15.5874259396,15.5874552409,15.5874845417,15.5875138418,15.5875431414,15.5875724403,15.5876017387,15.5876310364,15.5876603336,15.5876896302,15.5877189262,15.5877482215, 15.5877775163,15.5878068105,15.5878361041,15.5878653971,15.5878946895,15.5879239813,15.5879532726,15.5879825632,15.5880118532,15.5880411426,15.5880704315,15.5880997197,15.5881290074,15.5881582944,15.5881875809,15.5882168668, 15.588246152,15.5882754367,15.5883047208,15.5883340043,15.5883632872,15.5883925695,15.5884218512,15.5884511323,15.5884804128,15.5885096928,15.5885389721,15.5885682508,15.588597529,15.5886268065,15.5886560835,15.5886853598, 15.5887146356,15.5887439108,15.5887731853,15.5888024593,15.5888317327,15.5888610055,15.5888902777,15.5889195493,15.5889488203,15.5889780907,15.5890073606,15.5890366298,15.5890658984,15.5890951665,15.5891244339,15.5891537008, 15.589182967,15.5892122327,15.5892414978,15.5892707623,15.5893000262,15.5893292894,15.5893585521,15.5893878143,15.5894170758,15.5894463367,15.589475597,15.5895048567,15.5895341159,15.5895633744,15.5895926324,15.5896218897, 15.5896511465,15.5896804027,15.5897096583,15.5897389133,15.5897681676,15.5897974214,15.5898266747,15.5898559273,15.5898851793,15.5899144307,15.5899436816,15.5899729318,15.5900021814,15.5900314305,15.590060679,15.5900899268, 15.5901191741,15.5901484208,15.5901776669,15.5902069124,15.5902361573,15.5902654016,15.5902946453,15.5903238884,15.590353131,15.5903823729,15.5904116143,15.590440855,15.5904700952,15.5904993348,15.5905285737,15.5905578121, 15.5905870499,15.5906162871,15.5906455237,15.5906747597,15.5907039952,15.59073323,15.5907624642,15.5907916979,15.5908209309,15.5908501634,15.5908793953,15.5909086265,15.5909378572,15.5909670873,15.5909963168,15.5910255457, 15.591054774,15.5910840018,15.5911132289,15.5911424554,15.5911716814,15.5912009067,15.5912301315,15.5912593557,15.5912885792,15.5913178022,15.5913470246,15.5913762464,15.5914054676,15.5914346883,15.5914639083,15.5914931277, 15.5915223466,15.5915515648,15.5915807825,15.5916099996,15.591639216,15.5916684319,15.5916976472,15.5917268619,15.591756076,15.5917852895,15.5918145025,15.5918437148,15.5918729266,15.5919021377,15.5919313483,15.5919605582, 15.5919897676,15.5920189764,15.5920481846,15.5920773922,15.5921065992,15.5921358056,15.5921650115,15.5921942167,15.5922234214,15.5922526254,15.5922818289,15.5923110318,15.592340234,15.5923694357,15.5923986368,15.5924278373, 15.5924570373,15.5924862366,15.5925154353,15.5925446335,15.592573831,15.592603028,15.5926322244,15.5926614202,15.5926906154,15.59271981,15.592749004,15.5927781974,15.5928073902,15.5928365825,15.5928657741,15.5928949652, 15.5929241556,15.5929533455,15.5929825348,15.5930117235,15.5930409116,15.5930700991,15.593099286,15.5931284724,15.5931576581,15.5931868433,15.5932160278,15.5932452118,15.5932743952,15.593303578,15.5933327602,15.5933619418, 15.5933911228,15.5934203032,15.5934494831,15.5934786623,15.593507841,15.593537019,15.5935661965,15.5935953734,15.5936245497,15.5936537254,15.5936829005,15.5937120751,15.593741249,15.5937704224,15.5937995951,15.5938287673, 15.5938579389,15.5938871098,15.5939162802,15.5939454501,15.5939746193,15.5940037879,15.5940329559,15.5940621234,15.5940912903,15.5941204565,15.5941496222,15.5941787873,15.5942079518,15.5942371157,15.594266279,15.5942954418, 15.5943246039,15.5943537655,15.5943829264,15.5944120868,15.5944412466,15.5944704058,15.5944995644,15.5945287224,15.5945578799,15.5945870367,15.594616193,15.5946453486,15.5946745037,15.5947036582,15.5947328121,15.5947619654, 15.5947911181,15.5948202702,15.5948494218,15.5948785727,15.5949077231,15.5949368728,15.594966022,15.5949951706,15.5950243186,15.595053466,15.5950826129,15.5951117591,15.5951409047,15.5951700498,15.5951991943,15.5952283382, 15.5952574814,15.5952866242,15.5953157663,15.5953449078,15.5953740487,15.5954031891,15.5954323288,15.595461468,15.5954906066,15.5955197446,15.595548882,15.5955780188,15.5956071551,15.5956362907,15.5956654258,15.5956945602, 15.5957236941,15.5957528274,15.5957819601,15.5958110922,15.5958402237,15.5958693547,15.595898485,15.5959276148,15.5959567439,15.5959858725,15.5960150005,15.5960441279,15.5960732547,15.596102381,15.5961315066,15.5961606317, 15.5961897561,15.59621888,15.5962480033,15.596277126,15.5963062481,15.5963353697,15.5963644906,15.596393611,15.5964227307,15.5964518499,15.5964809685,15.5965100865,15.5965392039,15.5965683207,15.596597437,15.5966265526, 15.5966556677,15.5966847822,15.596713896,15.5967430093,15.5967721221,15.5968012342,15.5968303457,15.5968594567,15.596888567,15.5969176768,15.596946786,15.5969758946,15.5970050026,15.59703411,15.5970632169,15.5970923231, 15.5971214288,15.5971505339,15.5971796384,15.5972087423,15.5972378456,15.5972669483,15.5972960504,15.597325152,15.597354253,15.5973833534,15.5974124531,15.5974415524,15.597470651,15.597499749,15.5975288465,15.5975579433, 15.5975870396,15.5976161353,15.5976452304,15.5976743249,15.5977034188,15.5977325121,15.5977616049,15.5977906971,15.5978197886,15.5978488796,15.59787797,15.5979070599,15.5979361491,15.5979652377,15.5979943258,15.5980234133, 15.5980525002,15.5980815865,15.5981106722,15.5981397573,15.5981688418,15.5981979258,15.5982270092,15.598256092,15.5982851741,15.5983142558,15.5983433368,15.5983724172,15.5984014971,15.5984305763,15.598459655,15.5984887331, 15.5985178106,15.5985468875,15.5985759639,15.5986050396,15.5986341148,15.5986631894,15.5986922633,15.5987213368,15.5987504096,15.5987794818,15.5988085535,15.5988376245,15.598866695,15.5988957649,15.5989248342,15.5989539029, 15.598982971,15.5990120386,15.5990411055,15.5990701719,15.5990992377,15.5991283029,15.5991573675,15.5991864316,15.599215495,15.5992445579,15.5992736202,15.5993026818,15.599331743,15.5993608035,15.5993898634,15.5994189228, 15.5994479815,15.5994770397,15.5995060973,15.5995351543,15.5995642107,15.5995932666,15.5996223218,15.5996513765,15.5996804306,15.5997094841,15.599738537,15.5997675893,15.5997966411,15.5998256922,15.5998547428,15.5998837928, 15.5999128422,15.599941891,15.5999709392,15.5999999869,15.600029034,15.6000580804,15.6000871263,15.6001161716,15.6001452164,15.6001742605,15.6002033041,15.600232347,15.6002613894,15.6002904312,15.6003194724,15.6003485131, 15.6003775531,15.6004065926,15.6004356314,15.6004646697,15.6004937075,15.6005227446,15.6005517811,15.6005808171,15.6006098524,15.6006388872,15.6006679214,15.6006969551,15.6007259881,15.6007550205,15.6007840524,15.6008130837, 15.6008421144,15.6008711445,15.600900174,15.600929203,15.6009582313,15.6009872591,15.6010162863,15.6010453129,15.6010743389,15.6011033644,15.6011323892,15.6011614135,15.6011904372,15.6012194603,15.6012484828,15.6012775048, 15.6013065261,15.6013355469,15.6013645671,15.6013935867,15.6014226057,15.6014516241,15.601480642,15.6015096593,15.6015386759,15.601567692,15.6015967076,15.6016257225,15.6016547368,15.6016837506,15.6017127638,15.6017417764, 15.6017707884,15.6017997998,15.6018288107,15.601857821,15.6018868306,15.6019158397,15.6019448483,15.6019738562,15.6020028635,15.6020318703,15.6020608765,15.6020898821,15.6021188871,15.6021478915,15.6021768954,15.6022058987, 15.6022349013,15.6022639034,15.602292905,15.6023219059,15.6023509062,15.602379906,15.6024089052,15.6024379038,15.6024669018,15.6024958993,15.6025248961,15.6025538924,15.6025828881,15.6026118832,15.6026408777,15.6026698717, 15.602698865,15.6027278578,15.60275685,15.6027858416,15.6028148326,15.6028438231,15.6028728129,15.6029018022,15.6029307909,15.602959779,15.6029887666,15.6030177535,15.6030467399,15.6030757257,15.6031047109,15.6031336955, 15.6031626795,15.603191663,15.6032206459,15.6032496282,15.6032786099,15.603307591,15.6033365715,15.6033655515,15.6033945309,15.6034235097,15.6034524879,15.6034814655,15.6035104426,15.6035394191,15.603568395,15.6035973703, 15.603626345,15.6036553191,15.6036842927,15.6037132657,15.6037422381,15.6037712099,15.6038001811,15.6038291518,15.6038581218,15.6038870913,15.6039160602,15.6039450286,15.6039739963,15.6040029635,15.6040319301,15.6040608961, 15.6040898615,15.6041188263,15.6041477906,15.6041767542,15.6042057173,15.6042346798,15.6042636418,15.6042926031,15.6043215639,15.6043505241,15.6043794837,15.6044084427,15.6044374011,15.604466359,15.6044953163,15.604524273, 15.6045532291,15.6045821846,15.6046111396,15.6046400939,15.6046690477,15.6046980009,15.6047269536,15.6047559056,15.6047848571,15.604813808,15.6048427583,15.604871708,15.6049006571,15.6049296057,15.6049585537,15.6049875011, 15.6050164479,15.6050453942,15.6050743398,15.6051032849,15.6051322294,15.6051611733,15.6051901166,15.6052190594,15.6052480016,15.6052769432,15.6053058842,15.6053348246,15.6053637645,15.6053927037,15.6054216424,15.6054505805, 15.6054795181,15.605508455,15.6055373914,15.6055663272,15.6055952624,15.605624197,15.6056531311,15.6056820645,15.6057109974,15.6057399297,15.6057688614,15.6057977926,15.6058267232,15.6058556531,15.6058845826,15.6059135114, 15.6059424396,15.6059713673,15.6060002944,15.6060292209,15.6060581468,15.6060870722,15.6061159969,15.6061449211,15.6061738447,15.6062027677,15.6062316902,15.6062606121,15.6062895333,15.6063184541,15.6063473742,15.6063762937, 15.6064052127,15.6064341311,15.6064630489,15.6064919661,15.6065208828,15.6065497988,15.6065787143,15.6066076292,15.6066365436,15.6066654573,15.6066943705,15.6067232831,15.6067521951,15.6067811065,15.6068100174,15.6068389277, 15.6068678374,15.6068967465,15.606925655,15.606954563,15.6069834704,15.6070123772,15.6070412834,15.607070189,15.6070990941,15.6071279986,15.6071569025,15.6071858058,15.6072147086,15.6072436107,15.6072725123,15.6073014133, 15.6073303137,15.6073592136,15.6073881129,15.6074170116,15.6074459097,15.6074748072,15.6075037042,15.6075326006,15.6075614964,15.6075903916,15.6076192862,15.6076481803,15.6076770738,15.6077059667,15.607734859,15.6077637507, 15.6077926419,15.6078215325,15.6078504225,15.607879312,15.6079082008,15.6079370891,15.6079659768,15.6079948639,15.6080237505,15.6080526364,15.6080815218,15.6081104066,15.6081392908,15.6081681745,15.6081970576,15.6082259401, 15.608254822,15.6082837033,15.6083125841,15.6083414643,15.6083703439,15.6083992229,15.6084281013,15.6084569792,15.6084858565,15.6085147332,15.6085436093,15.6085724849,15.6086013599,15.6086302343,15.6086591081,15.6086879814, 15.608716854,15.6087457261,15.6087745976,15.6088034686,15.6088323389,15.6088612087,15.6088900779,15.6089189465,15.6089478146,15.608976682,15.6090055489,15.6090344152,15.609063281,15.6090921461,15.6091210107,15.6091498747, 15.6091787381,15.609207601,15.6092364633,15.609265325,15.6092941861,15.6093230466,15.6093519066,15.609380766,15.6094096248,15.609438483,15.6094673406,15.6094961977,15.6095250542,15.6095539101,15.6095827655,15.6096116202, 15.6096404744,15.609669328,15.6096981811,15.6097270335,15.6097558854,15.6097847367,15.6098135875,15.6098424376,15.6098712872,15.6099001362,15.6099289846,15.6099578324,15.6099866797,15.6100155264,15.6100443725,15.610073218, 15.610102063,15.6101309074,15.6101597512,15.6101885944,15.6102174371,15.6102462791,15.6102751206,15.6103039616,15.6103328019,15.6103616417,15.6103904809,15.6104193195,15.6104481575,15.610476995,15.6105058319,15.6105346682, 15.6105635039,15.6105923391,15.6106211737,15.6106500077,15.6106788411,15.610707674,15.6107365062,15.6107653379,15.6107941691,15.6108229996,15.6108518296,15.610880659,15.6109094878,15.610938316,15.6109671437,15.6109959708, 15.6110247973,15.6110536232,15.6110824486,15.6111112734,15.6111400976,15.6111689212,15.6111977443,15.6112265668,15.6112553887,15.61128421,15.6113130308,15.611341851,15.6113706706,15.6113994896,15.6114283081,15.6114571259, 15.6114859432,15.61151476,15.6115435761,15.6115723917,15.6116012067,15.6116300211,15.611658835,15.6116876482,15.6117164609,15.6117452731,15.6117740846,15.6118028956,15.611831706,15.6118605158,15.6118893251,15.6119181337, 15.6119469418,15.6119757493,15.6120045563,15.6120333627,15.6120621685,15.6120909737,15.6121197783,15.6121485824,15.6121773859,15.6122061888,15.6122349911,15.6122637929,15.6122925941,15.6123213947,15.6123501948,15.6123789942, 15.6124077931,15.6124365915,15.6124653892,15.6124941864,15.612522983,15.612551779,15.6125805744,15.6126093693,15.6126381636,15.6126669573,15.6126957505,15.612724543,15.612753335,15.6127821265,15.6128109173,15.6128397076, 15.6128684973,15.6128972864,15.612926075,15.6129548629,15.6129836503,15.6130124372,15.6130412234,15.6130700091,15.6130987942,15.6131275787,15.6131563627,15.6131851461,15.6132139289,15.6132427111,15.6132714928,15.6133002739, 15.6133290544,15.6133578343,15.6133866137,15.6134153925,15.6134441707,15.6134729483,15.6135017254,15.6135305019,15.6135592778,15.6135880531,15.6136168279,15.6136456021,15.6136743757,15.6137031488,15.6137319212,15.6137606931, 15.6137894645,15.6138182352,15.6138470054,15.613875775,15.613904544,15.6139333125,15.6139620804,15.6139908477,15.6140196144,15.6140483806,15.6140771462,15.6141059112,15.6141346757,15.6141634395,15.6141922028,15.6142209655, 15.6142497277,15.6142784893,15.6143072503,15.6143360107,15.6143647706,15.6143935298,15.6144222885,15.6144510467,15.6144798042,15.6145085612,15.6145373177,15.6145660735,15.6145948288,15.6146235835,15.6146523376,15.6146810911, 15.6147098441,15.6147385965,15.6147673484,15.6147960996,15.6148248503,15.6148536004,15.6148823499,15.6149110989,15.6149398473,15.6149685951,15.6149973424,15.6150260891,15.6150548352,15.6150835807,15.6151123256,15.61514107, 15.6151698138,15.6151985571,15.6152272997,15.6152560418,15.6152847834,15.6153135243,15.6153422647,15.6153710045,15.6153997437,15.6154284824,15.6154572205,15.615485958,15.6155146949,15.6155434313,15.6155721671,15.6156009023, 15.615629637,15.615658371,15.6156871046,15.6157158375,15.6157445699,15.6157733016,15.6158020329,15.6158307635,15.6158594936,15.6158882231,15.615916952,15.6159456804,15.6159744082,15.6160031354,15.616031862,15.6160605881, 15.6160893136,15.6161180385,15.6161467629,15.6161754866,15.6162042099,15.6162329325,15.6162616546,15.6162903761,15.616319097,15.6163478173,15.6163765371,15.6164052563,15.616433975,15.616462693,15.6164914105,15.6165201274, 15.6165488438,15.6165775596,15.6166062748,15.6166349894,15.6166637035,15.616692417,15.6167211299,15.6167498422,15.616778554,15.6168072652,15.6168359758,15.6168646859,15.6168933954,15.6169221043,15.6169508127,15.6169795204, 15.6170082277,15.6170369343,15.6170656404,15.6170943458,15.6171230508,15.6171517551,15.6171804589,15.6172091621,15.6172378647,15.6172665668,15.6172952683,15.6173239692,15.6173526696,15.6173813694,15.6174100686,15.6174387672, 15.6174674653,15.6174961628,15.6175248597,15.6175535561,15.6175822519,15.6176109471,15.6176396417,15.6176683358,15.6176970293,15.6177257222,15.6177544146,15.6177831064,15.6178117976,15.6178404883,15.6178691783,15.6178978679, 15.6179265568,15.6179552452,15.617983933,15.6180126202,15.6180413069,15.6180699929,15.6180986785,15.6181273634,15.6181560478,15.6181847316,15.6182134148,15.6182420975,15.6182707796,15.6182994611,15.6183281421,15.6183568224, 15.6183855023,15.6184141815,15.6184428602,15.6184715383,15.6185002158,15.6185288928,15.6185575692,15.618586245,15.6186149203,15.6186435949,15.618672269,15.6187009426,15.6187296156,15.618758288,15.6187869598,15.6188156311, 15.6188443018,15.6188729719,15.6189016414,15.6189303104,15.6189589788,15.6189876467,15.619016314,15.6190449807,15.6190736468,15.6191023124,15.6191309774,15.6191596418,15.6191883057,15.619216969,15.6192456317,15.6192742938, 15.6193029554,15.6193316164,15.6193602769,15.6193889367,15.619417596,15.6194462548,15.6194749129,15.6195035705,15.6195322276,15.619560884,15.6195895399,15.6196181952,15.61964685,15.6196755042,15.6197041578,15.6197328108, 15.6197614633,15.6197901152,15.6198187665,15.6198474173,15.6198760675,15.6199047171,15.6199333662,15.6199620147,15.6199906626,15.62001931,15.6200479567,15.620076603,15.6201052486,15.6201338937,15.6201625382,15.6201911821, 15.6202198255,15.6202484683,15.6202771105,15.6203057522,15.6203343933,15.6203630338,15.6203916738,15.6204203132,15.620448952,15.6204775903,15.620506228,15.6205348651,15.6205635016,15.6205921376,15.620620773,15.6206494079, 15.6206780421,15.6207066758,15.620735309,15.6207639416,15.6207925736,15.620821205,15.6208498359,15.6208784662,15.6209070959,15.620935725,15.6209643536,15.6209929817,15.6210216091,15.621050236,15.6210788623,15.6211074881, 15.6211361133,15.6211647379,15.6211933619,15.6212219854,15.6212506083,15.6212792307,15.6213078525,15.6213364737,15.6213650943,15.6213937144,15.6214223339,15.6214509528,15.6214795712,15.621508189,15.6215368062,15.6215654229, 15.621594039,15.6216226546,15.6216512695,15.6216798839,15.6217084977,15.621737111,15.6217657237,15.6217943358,15.6218229474,15.6218515584,15.6218801688,15.6219087787,15.621937388,15.6219659967,15.6219946048,15.6220232124, 15.6220518195,15.6220804259,15.6221090318,15.6221376371,15.6221662419,15.6221948461,15.6222234497,15.6222520527,15.6222806552,15.6223092571,15.6223378585,15.6223664593,15.6223950595,15.6224236591,15.6224522582,15.6224808567, 15.6225094547,15.6225380521,15.6225666489,15.6225952451,15.6226238408,15.6226524359,15.6226810305,15.6227096245,15.6227382179,15.6227668107,15.622795403,15.6228239947,15.6228525859,15.6228811764,15.6229097665,15.6229383559, 15.6229669448,15.6229955331,15.6230241209,15.623052708,15.6230812947,15.6231098807,15.6231384662,15.6231670511,15.6231956355,15.6232242192,15.6232528025,15.6232813851,15.6233099672,15.6233385487,15.6233671297,15.62339571, 15.6234242899,15.6234528691,15.6234814478,15.6235100259,15.6235386035,15.6235671805,15.6235957569,15.6236243328,15.6236529081,15.6236814828,15.6237100569,15.6237386305,15.6237672036,15.623795776,15.6238243479,15.6238529192, 15.62388149,15.6239100602,15.6239386298,15.6239671989,15.6239957674,15.6240243353,15.6240529027,15.6240814695,15.6241100358,15.6241386014,15.6241671665,15.6241957311,15.6242242951,15.6242528585,15.6242814213,15.6243099836, 15.6243385453,15.6243671065,15.624395667,15.6244242271,15.6244527865,15.6244813454,15.6245099037,15.6245384615,15.6245670187,15.6245955753,15.6246241314,15.6246526869,15.6246812418,15.6247097962,15.62473835,15.6247669032, 15.6247954559,15.624824008,15.6248525595,15.6248811105,15.6249096609,15.6249382107,15.62496676,15.6249953087,15.6250238569,15.6250524045,15.6250809515,15.6251094979,15.6251380438,15.6251665892,15.6251951339,15.6252236781, 15.6252522217,15.6252807648,15.6253093073,15.6253378493,15.6253663906,15.6253949314,15.6254234717,15.6254520114,15.6254805505,15.625509089,15.625537627,15.6255661644,15.6255947013,15.6256232376,15.6256517733,15.6256803085, 15.6257088431,15.6257373771,15.6257659106,15.6257944435,15.6258229758,15.6258515076,15.6258800388,15.6259085695,15.6259370995,15.6259656291,15.625994158,15.6260226864,15.6260512142,15.6260797415,15.6261082682,15.6261367943, 15.6261653199,15.6261938449,15.6262223694,15.6262508932,15.6262794166,15.6263079393,15.6263364615,15.6263649831,15.6263935042,15.6264220247,15.6264505446,15.626479064,15.6265075828,15.626536101,15.6265646187,15.6265931358, 15.6266216524,15.6266501683,15.6266786838,15.6267071986,15.6267357129,15.6267642267,15.6267927398,15.6268212524,15.6268497645,15.6268782759,15.6269067869,15.6269352972,15.626963807,15.6269923162,15.6270208249,15.627049333, 15.6270778405,15.6271063475,15.6271348539,15.6271633597,15.627191865,15.6272203697,15.6272488739,15.6272773775,15.6273058805,15.627334383,15.6273628849,15.6273913862,15.627419887,15.6274483872,15.6274768869,15.6275053859, 15.6275338845,15.6275623824,15.6275908798,15.6276193767,15.6276478729,15.6276763687,15.6277048638,15.6277333584,15.6277618524,15.6277903459,15.6278188388,15.6278473311,15.6278758229,15.6279043141,15.6279328047,15.6279612948, 15.6279897843,15.6280182733,15.6280467617,15.6280752495,15.6281037368,15.6281322235,15.6281607096,15.6281891952,15.6282176802,15.6282461647,15.6282746486,15.6283031319,15.6283316147,15.6283600969,15.6283885785,15.6284170596, 15.6284455401,15.6284740201,15.6285024995,15.6285309783,15.6285594566,15.6285879343,15.6286164115,15.628644888,15.6286733641,15.6287018395,15.6287303144,15.6287587888,15.6287872625,15.6288157358,15.6288442084,15.6288726805, 15.628901152,15.628929623,15.6289580934,15.6289865632,15.6290150325,15.6290435012,15.6290719694,15.629100437,15.629128904,15.6291573705,15.6291858364,15.6292143018,15.6292427665,15.6292712308,15.6292996944,15.6293281575, 15.6293566201,15.6293850821,15.6294135435,15.6294420043,15.6294704646,15.6294989244,15.6295273835,15.6295558421,15.6295843002,15.6296127577,15.6296412146,15.629669671,15.6296981268,15.629726582,15.6297550367,15.6297834908, 15.6298119444,15.6298403974,15.6298688498,15.6298973017,15.629925753,15.6299542038,15.629982654,15.6300111036,15.6300395527,15.6300680012,15.6300964491,15.6301248965,15.6301533433,15.6301817896,15.6302102353,15.6302386804, 15.630267125,15.630295569,15.6303240125,15.6303524554,15.6303808978,15.6304093395,15.6304377808,15.6304662214,15.6304946615,15.630523101,15.63055154,15.6305799784,15.6306084163,15.6306368536,15.6306652903,15.6306937265, 15.6307221621,15.6307505972,15.6307790316,15.6308074656,15.630835899,15.6308643318,15.630892764,15.6309211957,15.6309496268,15.6309780574,15.6310064874,15.6310349169,15.6310633457,15.6310917741,15.6311202018,15.6311486291, 15.6311770557,15.6312054818,15.6312339073,15.6312623323,15.6312907567,15.6313191805,15.6313476038,15.6313760266,15.6314044487,15.6314328703,15.6314612914,15.6314897119,15.6315181318,15.6315465512,15.63157497,15.6316033882, 15.6316318059,15.631660223,15.6316886396,15.6317170556,15.6317454711,15.631773886,15.6318023003,15.6318307141,15.6318591273,15.6318875399,15.631915952,15.6319443636,15.6319727745,15.6320011849,15.6320295948,15.6320580041, 15.6320864128,15.632114821,15.6321432286,15.6321716357,15.6322000422,15.6322284481,15.6322568535,15.6322852583,15.6323136626,15.6323420663,15.6323704694,15.632398872,15.632427274,15.6324556755,15.6324840764,15.6325124768, 15.6325408765,15.6325692758,15.6325976744,15.6326260726,15.6326544701,15.6326828671,15.6327112635,15.6327396594,15.6327680547,15.6327964495,15.6328248437,15.6328532373,15.6328816304,15.6329100229,15.6329384149,15.6329668063, 15.6329951971,15.6330235874,15.6330519772,15.6330803663,15.6331087549,15.633137143,15.6331655305,15.6331939174,15.6332223038,15.6332506896,15.6332790749,15.6333074596,15.6333358437,15.6333642273,15.6333926103,15.6334209928, 15.6334493747,15.6334777561,15.6335061369,15.6335345171,15.6335628968,15.6335912759,15.6336196544,15.6336480324,15.6336764099,15.6337047868,15.6337331631,15.6337615389,15.6337899141,15.6338182887,15.6338466628,15.6338750364, 15.6339034093,15.6339317818,15.6339601536,15.6339885249,15.6340168957,15.6340452659,15.6340736355,15.6341020046,15.6341303731,15.6341587411,15.6341871085,15.6342154753,15.6342438416,15.6342722073,15.6343005725,15.6343289371, 15.6343573011,15.6343856646,15.6344140276,15.63444239,15.6344707518,15.634499113,15.6345274737,15.6345558339,15.6345841935,15.6346125525,15.634640911,15.6346692689,15.6346976263,15.6347259831,15.6347543393,15.634782695, 15.6348110502,15.6348394047,15.6348677588,15.6348961122,15.6349244651,15.6349528175,15.6349811693,15.6350095205,15.6350378712,15.6350662213,15.6350945709,15.6351229199,15.6351512683,15.6351796162,15.6352079635,15.6352363103, 15.6352646565,15.6352930022,15.6353213473,15.6353496919,15.6353780359,15.6354063793,15.6354347222,15.6354630645,15.6354914063,15.6355197475,15.6355480881,15.6355764282,15.6356047677,15.6356331067,15.6356614452,15.635689783, 15.6357181203,15.6357464571,15.6357747933,15.6358031289,15.635831464,15.6358597985,15.6358881325,15.6359164659,15.6359447988,15.6359731311,15.6360014628,15.636029794,15.6360581247,15.6360864547,15.6361147843,15.6361431132, 15.6361714416,15.6361997695,15.6362280968,15.6362564235,15.6362847497,15.6363130753,15.6363414004,15.6363697249,15.6363980489,15.6364263723,15.6364546951,15.6364830174,15.6365113392,15.6365396603,15.636567981,15.636596301, 15.6366246205,15.6366529395,15.6366812579,15.6367095757,15.636737893,15.6367662098,15.6367945259,15.6368228416,15.6368511566,15.6368794711,15.6369077851,15.6369360985,15.6369644113,15.6369927236,15.6370210353,15.6370493465, 15.6370776571,15.6371059672,15.6371342767,15.6371625857,15.6371908941,15.6372192019,15.6372475092,15.6372758159,15.6373041221,15.6373324277,15.6373607328,15.6373890373,15.6374173413,15.6374456447,15.6374739475,15.6375022498, 15.6375305515,15.6375588527,15.6375871533,15.6376154534,15.6376437529,15.6376720519,15.6377003503,15.6377286481,15.6377569454,15.6377852422,15.6378135383,15.637841834,15.637870129,15.6378984236,15.6379267175,15.6379550109, 15.6379833038,15.6380115961,15.6380398878,15.638068179,15.6380964696,15.6381247597,15.6381530492,15.6381813382,15.6382096266,15.6382379145,15.6382662018,15.6382944886,15.6383227747,15.6383510604,15.6383793455,15.63840763, 15.638435914,15.6384641974,15.6384924803,15.6385207626,15.6385490444,15.6385773256,15.6386056062,15.6386338863,15.6386621659,15.6386904448,15.6387187233,15.6387470012,15.6387752785,15.6388035553,15.6388318315,15.6388601071, 15.6388883823,15.6389166568,15.6389449308,15.6389732043,15.6390014771,15.6390297495,15.6390580213,15.6390862925,15.6391145632,15.6391428333,15.6391711029,15.6391993719,15.6392276403,15.6392559083,15.6392841756,15.6393124424, 15.6393407087,15.6393689743,15.6393972395,15.6394255041,15.6394537681,15.6394820316,15.6395102945,15.6395385569,15.6395668187,15.6395950799,15.6396233407,15.6396516008,15.6396798604,15.6397081195,15.639736378,15.6397646359, 15.6397928933,15.6398211501,15.6398494064,15.6398776621,15.6399059173,15.6399341719,15.639962426,15.6399906795,15.6400189325,15.6400471849,15.6400754367,15.640103688,15.6401319388,15.640160189,15.6401884386,15.6402166877, 15.6402449362,15.6402731842,15.6403014316,15.6403296785,15.6403579248,15.6403861706,15.6404144158,15.6404426605,15.6404709046,15.6404991481,15.6405273912,15.6405556336,15.6405838755,15.6406121168,15.6406403576,15.6406685979, 15.6406968376,15.6407250767,15.6407533153,15.6407815533,15.6408097908,15.6408380277,15.6408662641,15.6408944999,15.6409227352,15.6409509699,15.640979204,15.6410074377,15.6410356707,15.6410639032,15.6410921352,15.6411203666, 15.6411485974,15.6411768277,15.6412050574,15.6412332866,15.6412615153,15.6412897434,15.6413179709,15.6413461979,15.6413744243,15.6414026502,15.6414308755,15.6414591003,15.6414873245,15.6415155481,15.6415437713,15.6415719938, 15.6416002158,15.6416284373,15.6416566582,15.6416848786,15.6417130984,15.6417413176,15.6417695363,15.6417977544,15.641825972,15.6418541891,15.6418824056,15.6419106215,15.6419388369,15.6419670517,15.641995266,15.6420234797, 15.6420516929,15.6420799056,15.6421081176,15.6421363292,15.6421645401,15.6421927506,15.6422209604,15.6422491697,15.6422773785,15.6423055867,15.6423337944,15.6423620015,15.6423902081,15.6424184141,15.6424466195,15.6424748244, 15.6425030288,15.6425312326,15.6425594358,15.6425876385,15.6426158407,15.6426440423,15.6426722433,15.6427004438,15.6427286438,15.6427568432,15.642785042,15.6428132403,15.642841438,15.6428696352,15.6428978319,15.6429260279, 15.6429542235,15.6429824185,15.6430106129,15.6430388068,15.6430670001,15.6430951929,15.6431233851,15.6431515768,15.6431797679,15.6432079585,15.6432361485,15.643264338,15.6432925269,15.6433207153,15.6433489031,15.6433770904, 15.6434052771,15.6434334633,15.6434616489,15.643489834,15.6435180185,15.6435462025,15.6435743859,15.6436025687,15.6436307511,15.6436589328,15.643687114,15.6437152947,15.6437434748,15.6437716544,15.6437998334,15.6438280119, 15.6438561898,15.6438843671,15.6439125439,15.6439407202,15.6439688959,15.6439970711,15.6440252457,15.6440534198,15.6440815933,15.6441097662,15.6441379386,15.6441661105,15.6441942818,15.6442224526,15.6442506228,15.6442787924, 15.6443069615,15.6443351301,15.6443632981,15.6443914656,15.6444196325,15.6444477988,15.6444759647,15.6445041299,15.6445322946,15.6445604588,15.6445886224,15.6446167855,15.644644948,15.6446731099,15.6447012713,15.6447294322, 15.6447575925,15.6447857523,15.6448139115,15.6448420702,15.6448702283,15.6448983858,15.6449265428,15.6449546993,15.6449828552,15.6450110106,15.6450391654,15.6450673197,15.6450954734,15.6451236266,15.6451517792,15.6451799313, 15.6452080828,15.6452362337,15.6452643842,15.645292534,15.6453206834,15.6453488321,15.6453769804,15.645405128,15.6454332752,15.6454614217,15.6454895678,15.6455177132,15.6455458582,15.6455740026,15.6456021464,15.6456302897, 15.6456584324,15.6456865746,15.6457147162,15.6457428573,15.6457709979,15.6457991378,15.6458272773,15.6458554162,15.6458835545,15.6459116923,15.6459398296,15.6459679663,15.6459961024,15.646024238,15.6460523731,15.6460805076, 15.6461086415,15.6461367749,15.6461649078,15.6461930401,15.6462211718,15.646249303,15.6462774337,15.6463055638,15.6463336934,15.6463618224,15.6463899509,15.6464180788,15.6464462062,15.646474333,15.6465024593,15.646530585, 15.6465587102,15.6465868348,15.6466149589,15.6466430824,15.6466712054,15.6466993278,15.6467274497,15.646755571,15.6467836918,15.6468118121,15.6468399318,15.6468680509,15.6468961695,15.6469242876,15.6469524051,15.646980522, 15.6470086384,15.6470367543,15.6470648696,15.6470929844,15.6471210986,15.6471492123,15.6471773254,15.647205438,15.64723355,15.6472616615,15.6472897724,15.6473178828,15.6473459926,15.6473741019,15.6474022106,15.6474303188, 15.6474584265,15.6474865336,15.6475146401,15.6475427461,15.6475708516,15.6475989565,15.6476270608,15.6476551646,15.6476832679,15.6477113706,15.6477394728,15.6477675744,15.6477956755,15.647823776,15.647851876,15.6478799754, 15.6479080743,15.6479361726,15.6479642704,15.6479923676,15.6480204643,15.6480485605,15.6480766561,15.6481047511,15.6481328457,15.6481609396,15.648189033,15.6482171259,15.6482452182,15.64827331,15.6483014012,15.6483294919, 15.648357582,15.6483856716,15.6484137606,15.6484418491,15.6484699371,15.6484980245,15.6485261113,15.6485541976,15.6485822834,15.6486103686,15.6486384532,15.6486665373,15.6486946209,15.6487227039,15.6487507864,15.6487788683, 15.6488069497,15.6488350306,15.6488631109,15.6488911906,15.6489192698,15.6489473484,15.6489754265,15.6490035041,15.6490315811,15.6490596576,15.6490877335,15.6491158089,15.6491438837,15.649171958,15.6492000317,15.6492281049, 15.6492561775,15.6492842496,15.6493123212,15.6493403922,15.6493684626,15.6493965325,15.6494246019,15.6494526707,15.649480739,15.6495088067,15.6495368739,15.6495649405,15.6495930066,15.6496210721,15.6496491371,15.6496772016, 15.6497052655,15.6497333288,15.6497613916,15.6497894539,15.6498175156,15.6498455768,15.6498736374,15.6499016975,15.649929757,15.649957816,15.6499858745,15.6500139324,15.6500419897,15.6500700465,15.6500981028,15.6501261585, 15.6501542137,15.6501822683,15.6502103224,15.6502383759,15.6502664289,15.6502944813,15.6503225332,15.6503505846,15.6503786354,15.6504066857,15.6504347354,15.6504627845,15.6504908332,15.6505188812,15.6505469288,15.6505749758, 15.6506030222,15.6506310681,15.6506591135,15.6506871583,15.6507152025,15.6507432463,15.6507712894,15.6507993321,15.6508273741,15.6508554157,15.6508834567,15.6509114971,15.650939537,15.6509675764,15.6509956152,15.6510236535, 15.6510516912,15.6510797284,15.651107765,15.6511358011,15.6511638366,15.6511918716,15.6512199061,15.65124794,15.6512759733,15.6513040062,15.6513320384,15.6513600702,15.6513881014,15.651416132,15.6514441621,15.6514721916, 15.6515002207,15.6515282491,15.651556277,15.6515843044,15.6516123312,15.6516403575,15.6516683833,15.6516964085,15.6517244331,15.6517524572,15.6517804808,15.6518085038,15.6518365263,15.6518645482,15.6518925696,15.6519205904, 15.6519486107,15.6519766305,15.6520046497,15.6520326683,15.6520606865,15.652088704,15.6521167211,15.6521447376,15.6521727535,15.6522007689,15.6522287838,15.6522567981,15.6522848118,15.6523128251,15.6523408377,15.6523688499, 15.6523968615,15.6524248725,15.652452883,15.652480893,15.6525089024,15.6525369113,15.6525649196,15.6525929274,15.6526209346,15.6526489413,15.6526769475,15.6527049531,15.6527329582,15.6527609627,15.6527889667,15.6528169701, 15.652844973,15.6528729754,15.6529009772,15.6529289784,15.6529569791,15.6529849793,15.6530129789,15.653040978,15.6530689766,15.6530969746,15.653124972,15.653152969,15.6531809653,15.6532089612,15.6532369564,15.6532649512, 15.6532929454,15.653320939,15.6533489322,15.6533769247,15.6534049167,15.6534329082,15.6534608992,15.6534888896,15.6535168794,15.6535448687,15.6535728575,15.6536008457,15.6536288334,15.6536568205,15.6536848071,15.6537127932, 15.6537407787,15.6537687637,15.6537967481,15.653824732,15.6538527153,15.6538806981,15.6539086804,15.6539366621,15.6539646432,15.6539926239,15.654020604,15.6540485835,15.6540765625,15.654104541,15.6541325189,15.6541604962, 15.6541884731,15.6542164493,15.6542444251,15.6542724003,15.6543003749,15.6543283491,15.6543563226,15.6543842957,15.6544122681,15.6544402401,15.6544682115,15.6544961824,15.6545241527,15.6545521225,15.6545800917,15.6546080604, 15.6546360285,15.6546639961,15.6546919632,15.6547199297,15.6547478957,15.6547758611,15.654803826,15.6548317904,15.6548597542,15.6548877175,15.6549156802,15.6549436424,15.654971604,15.6549995651,15.6550275257,15.6550554857, 15.6550834452,15.6551114041,15.6551393625,15.6551673204,15.6551952777,15.6552232345,15.6552511907,15.6552791464,15.6553071015,15.6553350561,15.6553630102,15.6553909637,15.6554189167,15.6554468691,15.655474821,15.6555027723, 15.6555307232,15.6555586734,15.6555866232,15.6556145723,15.655642521,15.6556704691,15.6556984166,15.6557263637,15.6557543101,15.6557822561,15.6558102015,15.6558381463,15.6558660906,15.6558940344,15.6559219776,15.6559499203, 15.6559778625,15.6560058041,15.6560337452,15.6560616857,15.6560896257,15.6561175651,15.656145504,15.6561734424,15.6562013802,15.6562293175,15.6562572542,15.6562851904,15.6563131261,15.6563410612,15.6563689958,15.6563969298, 15.6564248633,15.6564527962,15.6564807286,15.6565086605,15.6565365918,15.6565645226,15.6565924529,15.6566203826,15.6566483117,15.6566762404,15.6567041685,15.656732096,15.656760023,15.6567879495,15.6568158754,15.6568438008, 15.6568717256,15.6568996499,15.6569275737,15.6569554969,15.6569834196,15.6570113417,15.6570392633,15.6570671844,15.6570951049,15.6571230249,15.6571509443,15.6571788632,15.6572067816,15.6572346994,15.6572626166,15.6572905334, 15.6573184496,15.6573463652,15.6573742804,15.6574021949,15.657430109,15.6574580225,15.6574859354,15.6575138478,15.6575417597,15.657569671,15.6575975818,15.6576254921,15.6576534018,15.657681311,15.6577092196,15.6577371277, 15.6577650353,15.6577929423,15.6578208488,15.6578487547,15.6578766601,15.6579045649,15.6579324693,15.657960373,15.6579882763,15.658016179,15.6580440811,15.6580719828,15.6580998838,15.6581277844,15.6581556844,15.6581835838, 15.6582114828,15.6582393811,15.658267279,15.6582951763,15.658323073,15.6583509693,15.6583788649,15.6584067601,15.6584346547,15.6584625488,15.6584904423,15.6585183353,15.6585462277,15.6585741196,15.658602011,15.6586299018, 15.6586577921,15.6586856819,15.6587135711,15.6587414598,15.6587693479,15.6587972355,15.6588251226,15.6588530091,15.658880895,15.6589087805,15.6589366654,15.6589645497,15.6589924336,15.6590203169,15.6590481996,15.6590760818, 15.6591039635,15.6591318446,15.6591597252,15.6591876052,15.6592154848,15.6592433637,15.6592712422,15.6592991201,15.6593269974,15.6593548742,15.6593827505,15.6594106263,15.6594385015,15.6594663761,15.6594942502,15.6595221238, 15.6595499969,15.6595778694,15.6596057414,15.6596336128,15.6596614837,15.659689354,15.6597172239,15.6597450931,15.6597729619,15.6598008301,15.6598286977,15.6598565649,15.6598844315,15.6599122975,15.659940163,15.659968028, 15.6599958924,15.6600237563,15.6600516197,15.6600794825,15.6601073448,15.6601352065,15.6601630677,15.6601909284,15.6602187885,15.6602466481,15.6602745072,15.6603023657,15.6603302237,15.6603580811,15.660385938,15.6604137944, 15.6604416502,15.6604695055,15.6604973602,15.6605252145,15.6605530681,15.6605809213,15.6606087739,15.6606366259,15.6606644775,15.6606923284,15.6607201789,15.6607480288,15.6607758782,15.660803727,15.6608315753,15.6608594231, 15.6608872703,15.660915117,15.6609429631,15.6609708087,15.6609986538,15.6610264984,15.6610543424,15.6610821858,15.6611100287,15.6611378711,15.661165713,15.6611935543,15.6612213951,15.6612492353,15.661277075,15.6613049142, 15.6613327528,15.6613605909,15.6613884284,15.6614162655,15.6614441019,15.6614719379,15.6614997733,15.6615276081,15.6615554425,15.6615832763,15.6616111095,15.6616389422,15.6616667744,15.6616946061,15.6617224372,15.6617502677, 15.6617780978,15.6618059273,15.6618337562,15.6618615847,15.6618894125,15.6619172399,15.6619450667,15.661972893,15.6620007187,15.6620285439,15.6620563686,15.6620841927,15.6621120163,15.6621398394,15.6621676619,15.6621954839, 15.6622233053,15.6622511262,15.6622789466,15.6623067664,15.6623345857,15.6623624045,15.6623902227,15.6624180404,15.6624458576,15.6624736742,15.6625014903,15.6625293058,15.6625571208,15.6625849353,15.6626127493,15.6626405627, 15.6626683755,15.6626961878,15.6627239996,15.6627518109,15.6627796216,15.6628074318,15.6628352415,15.6628630506,15.6628908591,15.6629186672,15.6629464747,15.6629742817,15.6630020881,15.663029894,15.6630576993,15.6630855042, 15.6631133085,15.6631411122,15.6631689154,15.6631967181,15.6632245203,15.6632523219,15.6632801229,15.6633079235,15.6633357235,15.6633635229,15.6633913219,15.6634191203,15.6634469181,15.6634747155,15.6635025122,15.6635303085, 15.6635581042,15.6635858994,15.663613694,15.6636414882,15.6636692817,15.6636970748,15.6637248673,15.6637526592,15.6637804507,15.6638082416,15.6638360319,15.6638638218,15.6638916111,15.6639193998,15.663947188,15.6639749757, 15.6640027629,15.6640305495,15.6640583356,15.6640861211,15.6641139061,15.6641416906,15.6641694746,15.664197258,15.6642250408,15.6642528232,15.664280605,15.6643083862,15.664336167,15.6643639472,15.6643917268,15.664419506, 15.6644472845,15.6644750626,15.6645028401,15.6645306171,15.6645583936,15.6645861695,15.6646139449,15.6646417197,15.664669494,15.6646972678,15.664725041,15.6647528138,15.6647805859,15.6648083576,15.6648361287,15.6648638992, 15.6648916693,15.6649194388,15.6649472078,15.6649749762,15.6650027441,15.6650305115,15.6650582783,15.6650860446,15.6651138103,15.6651415756,15.6651693403,15.6651971044,15.665224868,15.6652526311,15.6652803937,15.6653081557, 15.6653359172,15.6653636781,15.6653914386,15.6654191984,15.6654469578,15.6654747166,15.6655024749,15.6655302326,15.6655579898,15.6655857465,15.6656135027,15.6656412583,15.6656690134,15.6656967679,15.6657245219,15.6657522754, 15.6657800283,15.6658077807,15.6658355326,15.665863284,15.6658910348,15.665918785,15.6659465348,15.665974284,15.6660020326,15.6660297808,15.6660575284,15.6660852755,15.666113022,15.666140768,15.6661685135,15.6661962584, 15.6662240028,15.6662517467,15.66627949,15.6663072328,15.6663349751,15.6663627168,15.666390458,15.6664181987,15.6664459388,15.6664736784,15.6665014175,15.666529156,15.666556894,15.6665846315,15.6666123684,15.6666401048, 15.6666678407,15.666695576,15.6667233108,15.6667510451,15.6667787788,15.666806512,15.6668342447,15.6668619768,15.6668897084,15.6669174395,15.66694517,15.6669729001,15.6670006295,15.6670283585,15.6670560869,15.6670838147, 15.6671115421,15.6671392689,15.6671669952,15.6671947209,15.6672224461,15.6672501708,15.6672778949,15.6673056185,15.6673333416,15.6673610641,15.6673887862,15.6674165076,15.6674442286,15.667471949,15.6674996689,15.6675273882, 15.667555107,15.6675828253,15.6676105431,15.6676382603,15.667665977,15.6676936931,15.6677214088,15.6677491238,15.6677768384,15.6678045524,15.6678322659,15.6678599789,15.6678876913,15.6679154032,15.6679431145,15.6679708254, 15.6679985357,15.6680262454,15.6680539547,15.6680816634,15.6681093715,15.6681370792,15.6681647863,15.6681924928,15.6682201989,15.6682479044,15.6682756094,15.6683033138,15.6683310177,15.6683587211,15.668386424,15.6684141263, 15.6684418281,15.6684695293,15.66849723,15.6685249302,15.6685526299,15.668580329,15.6686080276,15.6686357256,15.6686634232,15.6686911202,15.6687188166,15.6687465126,15.668774208,15.6688019028,15.6688295972,15.668857291, 15.6688849843,15.668912677,15.6689403692,15.6689680609,15.6689957521,15.6690234427,15.6690511328,15.6690788223,15.6691065113,15.6691341998,15.6691618878,15.6691895752,15.6692172621,15.6692449485,15.6692726343,15.6693003196, 15.6693280044,15.6693556886,15.6693833723,15.6694110555,15.6694387382,15.6694664203,15.6694941019,15.6695217829,15.6695494635,15.6695771434,15.6696048229,15.6696325018,15.6696601802,15.6696878581,15.6697155354,15.6697432123, 15.6697708885,15.6697985643,15.6698262395,15.6698539142,15.6698815883,15.6699092619,15.669936935,15.6699646076,15.6699922796,15.6700199511,15.6700476221,15.6700752925,15.6701029624,15.6701306318,15.6701583006,15.670185969, 15.6702136367,15.670241304,15.6702689707,15.6702966369,15.6703243026,15.6703519677,15.6703796323,15.6704072964,15.6704349599,15.6704626229,15.6704902854,15.6705179473,15.6705456088,15.6705732696,15.67060093,15.6706285898, 15.6706562491,15.6706839079,15.6707115661,15.6707392238,15.670766881,15.6707945376,15.6708221938,15.6708498493,15.6708775044,15.6709051589,15.6709328129,15.6709604664,15.6709881193,15.6710157717,15.6710434236,15.6710710749, 15.6710987257,15.671126376,15.6711540258,15.671181675,15.6712093237,15.6712369719,15.6712646195,15.6712922666,15.6713199132,15.6713475592,15.6713752047,15.6714028497,15.6714304942,15.6714581381,15.6714857815,15.6715134244, 15.6715410667,15.6715687085,15.6715963498,15.6716239905,15.6716516308,15.6716792705,15.6717069096,15.6717345482,15.6717621863,15.6717898239,15.671817461,15.6718450975,15.6718727335,15.6719003689,15.6719280038,15.6719556382, 15.6719832721,15.6720109054,15.6720385382,15.6720661705,15.6720938023,15.6721214335,15.6721490642,15.6721766943,15.672204324,15.6722319531,15.6722595816,15.6722872097,15.6723148372,15.6723424642,15.6723700906,15.6723977166, 15.672425342,15.6724529668,15.6724805912,15.672508215,15.6725358383,15.672563461,15.6725910833,15.672618705,15.6726463261,15.6726739468,15.6727015669,15.6727291865,15.6727568055,15.672784424,15.672812042,15.6728396595, 15.6728672764,15.6728948928,15.6729225087,15.6729501241,15.6729777389,15.6730053532,15.673032967,15.6730605802,15.6730881929,15.6731158051,15.6731434167,15.6731710279,15.6731986385,15.6732262485,15.6732538581,15.6732814671, 15.6733090756,15.6733366835,15.6733642909,15.6733918978,15.6734195042,15.67344711,15.6734747154,15.6735023201,15.6735299244,15.6735575281,15.6735851313,15.673612734,15.6736403361,15.6736679378,15.6736955388,15.6737231394, 15.6737507394,15.6737783389,15.6738059379,15.6738335364,15.6738611343,15.6738887317,15.6739163285,15.6739439249,15.6739715207,15.673999116,15.6740267107,15.6740543049,15.6740818986,15.6741094918,15.6741370844,15.6741646766, 15.6741922681,15.6742198592,15.6742474497,15.6742750397,15.6743026292,15.6743302182,15.6743578066,15.6743853945,15.6744129818,15.6744405687,15.674468155,15.6744957408,15.674523326,15.6745509107,15.6745784949,15.6746060786, 15.6746336618,15.6746612444,15.6746888265,15.674716408,15.6747439891,15.6747715696,15.6747991496,15.674826729,15.6748543079,15.6748818863,15.6749094642,15.6749370416,15.6749646184,15.6749921947,15.6750197704,15.6750473457, 15.6750749204,15.6751024946,15.6751300682,15.6751576414,15.675185214,15.675212786,15.6752403576,15.6752679286,15.6752954991,15.6753230691,15.6753506385,15.6753782074,15.6754057758,15.6754333437,15.675460911,15.6754884778, 15.6755160441,15.6755436098,15.6755711751,15.6755987398,15.6756263039,15.6756538676,15.6756814307,15.6757089933,15.6757365554,15.6757641169,15.6757916779,15.6758192384,15.6758467984,15.6758743578,15.6759019167,15.6759294751, 15.6759570329,15.6759845903,15.6760121471,15.6760397033,15.6760672591,15.6760948143,15.676122369,15.6761499232,15.6761774768,15.67620503,15.6762325825,15.6762601346,15.6762876861,15.6763152372,15.6763427876,15.6763703376, 15.676397887,15.676425436,15.6764529843,15.6764805322,15.6765080795,15.6765356263,15.6765631726,15.6765907184,15.6766182636,15.6766458083,15.6766733525,15.6767008961,15.6767284392,15.6767559818,15.6767835239,15.6768110655, 15.6768386065,15.676866147,15.6768936869,15.6769212264,15.6769487653,15.6769763037,15.6770038416,15.6770313789,15.6770589157,15.677086452,15.6771139878,15.677141523,15.6771690577,15.6771965919,15.6772241256,15.6772516587, 15.6772791913,15.6773067234,15.677334255,15.677361786,15.6773893165,15.6774168465,15.6774443759,15.6774719049,15.6774994333,15.6775269612,15.6775544885,15.6775820154,15.6776095417,15.6776370674,15.6776645927,15.6776921174, 15.6777196416,15.6777471653,15.6777746885,15.6778022111,15.6778297332,15.6778572548,15.6778847759,15.6779122964,15.6779398164,15.6779673359,15.6779948548,15.6780223733,15.6780498912,15.6780774085,15.6781049254,15.6781324417, 15.6781599575,15.6781874728,15.6782149876,15.6782425018,15.6782700155,15.6782975287,15.6783250414,15.6783525535,15.6783800651,15.6784075762,15.6784350868,15.6784625968,15.6784901063,15.6785176153,15.6785451237,15.6785726317, 15.6786001391,15.678627646,15.6786551524,15.6786826582,15.6787101635,15.6787376683,15.6787651726,15.6787926763,15.6788201795,15.6788476822,15.6788751844,15.678902686,15.6789301872,15.6789576877,15.6789851878,15.6790126874, 15.6790401864,15.6790676849,15.6790951829,15.6791226803,15.6791501772,15.6791776737,15.6792051695,15.6792326649,15.6792601597,15.679287654,15.6793151478,15.6793426411,15.6793701338,15.679397626,15.6794251177,15.6794526089, 15.6794800995,15.6795075896,15.6795350792,15.6795625683,15.6795900568,15.6796175448,15.6796450323,15.6796725193,15.6797000058,15.6797274917,15.6797549771,15.679782462,15.6798099463,15.6798374302,15.6798649135,15.6798923963, 15.6799198785,15.6799473603,15.6799748415,15.6800023222,15.6800298023,15.680057282,15.6800847611,15.6801122397,15.6801397178,15.6801671953,15.6801946723,15.6802221488,15.6802496248,15.6802771003,15.6803045752,15.6803320496, 15.6803595235,15.6803869969,15.6804144697,15.680441942,15.6804694138,15.6804968851,15.6805243559,15.6805518261,15.6805792958,15.680606765,15.6806342336,15.6806617017,15.6806891694,15.6807166364,15.680744103,15.6807715691, 15.6807990346,15.6808264996,15.680853964,15.680881428,15.6809088914,15.6809363543,15.6809638167,15.6809912786,15.6810187399,15.6810462007,15.681073661,15.6811011208,15.68112858,15.6811560387,15.6811834969,15.6812109546, 15.6812384118,15.6812658684,15.6812933245,15.6813207801,15.6813482352,15.6813756897,15.6814031437,15.6814305972,15.6814580502,15.6814855027,15.6815129546,15.681540406,15.6815678569,15.6815953073,15.6816227571,15.6816502064, 15.6816776552,15.6817051035,15.6817325512,15.6817599985,15.6817874452,15.6818148914,15.681842337,15.6818697822,15.6818972268,15.6819246709,15.6819521145,15.6819795575,15.682007,15.6820344421,15.6820618835,15.6820893245, 15.682116765,15.6821442049,15.6821716443,15.6821990831,15.6822265215,15.6822539593,15.6822813967,15.6823088334,15.6823362697,15.6823637055,15.6823911407,15.6824185754,15.6824460096,15.6824734432,15.6825008764,15.682528309, 15.6825557411,15.6825831727,15.6826106037,15.6826380342,15.6826654642,15.6826928937,15.6827203227,15.6827477511,15.6827751791,15.6828026065,15.6828300333,15.6828574597,15.6828848855,15.6829123109,15.6829397357,15.6829671599, 15.6829945837,15.6830220069,15.6830494296,15.6830768518,15.6831042735,15.6831316946,15.6831591152,15.6831865354,15.6832139549,15.683241374,15.6832687925,15.6832962106,15.6833236281,15.683351045,15.6833784615,15.6834058774, 15.6834332928,15.6834607077,15.6834881221,15.683515536,15.6835429493,15.6835703621,15.6835977744,15.6836251861,15.6836525974,15.6836800081,15.6837074183,15.683734828,15.6837622372,15.6837896458,15.6838170539,15.6838444615, 15.6838718686,15.6838992752,15.6839266812,15.6839540867,15.6839814917,15.6840088962,15.6840363002,15.6840637036,15.6840911065,15.6841185089,15.6841459108,15.6841733122,15.684200713,15.6842281133,15.6842555131,15.6842829124, 15.6843103111,15.6843377094,15.6843651071,15.6843925043,15.6844199009,15.6844472971,15.6844746927,15.6845020878,15.6845294824,15.6845568765,15.68458427,15.6846116631,15.6846390556,15.6846664476,15.684693839,15.68472123, 15.6847486204,15.6847760103,15.6848033997,15.6848307886,15.6848581769,15.6848855648,15.6849129521,15.6849403389,15.6849677251,15.6849951109,15.6850224961,15.6850498808,15.685077265,15.6851046487,15.6851320319,15.6851594145, 15.6851867966,15.6852141782,15.6852415593,15.6852689398,15.6852963198,15.6853236994,15.6853510784,15.6853784568,15.6854058348,15.6854332122,15.6854605891,15.6854879655,15.6855153414,15.6855427168,15.6855700916,15.6855974659, 15.6856248397,15.685652213,15.6856795858,15.685706958,15.6857343297,15.6857617009,15.6857890716,15.6858164418,15.6858438114,15.6858711806,15.6858985492,15.6859259172,15.6859532848,15.6859806519,15.6860080184,15.6860353844, 15.6860627499,15.6860901149,15.6861174793,15.6861448433,15.6861722067,15.6861995696,15.6862269319,15.6862542938,15.6862816551,15.686309016,15.6863363763,15.6863637361,15.6863910953,15.6864184541,15.6864458123,15.68647317, 15.6865005272,15.6865278839,15.68655524,15.6865825956,15.6866099508,15.6866373053,15.6866646594,15.686692013,15.686719366,15.6867467185,15.6867740705,15.686801422,15.686828773,15.6868561234,15.6868834734,15.6869108228, 15.6869381717,15.68696552,15.6869928679,15.6870202152,15.6870475621,15.6870749084,15.6871022541,15.6871295994,15.6871569441,15.6871842884,15.6872116321,15.6872389753,15.6872663179,15.6872936601,15.6873210017,15.6873483428, 15.6873756834,15.6874030235,15.6874303631,15.6874577021,15.6874850407,15.6875123787,15.6875397161,15.6875670531,15.6875943896,15.6876217255,15.6876490609,15.6876763958,15.6877037302,15.6877310641,15.6877583974,15.6877857303, 15.6878130626,15.6878403944,15.6878677256,15.6878950564,15.6879223866,15.6879497164,15.6879770456,15.6880043742,15.6880317024,15.6880590301,15.6880863572,15.6881136838,15.6881410099,15.6881683355,15.6881956606,15.6882229851, 15.6882503091,15.6882776326,15.6883049556,15.6883322781,15.6883596001,15.6883869215,15.6884142424,15.6884415628,15.6884688827,15.6884962021,15.688523521,15.6885508393,15.6885781571,15.6886054744,15.6886327912,15.6886601075, 15.6886874232,15.6887147385,15.6887420532,15.6887693674,15.6887966811,15.6888239942,15.6888513069,15.688878619,15.6889059306,15.6889332417,15.6889605523,15.6889878624,15.6890151719,15.6890424809,15.6890697894,15.6890970974, 15.6891244049,15.6891517119,15.6891790183,15.6892063242,15.6892336297,15.6892609346,15.6892882389,15.6893155428,15.6893428461,15.689370149,15.6893974513,15.6894247531,15.6894520543,15.6894793551,15.6895066553,15.6895339551, 15.6895612543,15.689588553,15.6896158512,15.6896431488,15.689670446,15.6896977426,15.6897250387,15.6897523343,15.6897796294,15.6898069239,15.689834218,15.6898615115,15.6898888045,15.689916097,15.689943389,15.6899706805, 15.6899979714,15.6900252619,15.6900525518,15.6900798412,15.6901071301,15.6901344184,15.6901617063,15.6901889936,15.6902162804,15.6902435667,15.6902708525,15.6902981378,15.6903254225,15.6903527068,15.6903799905,15.6904072737, 15.6904345564,15.6904618386,15.6904891202,15.6905164014,15.690543682,15.6905709621,15.6905982417,15.6906255208,15.6906527993,15.6906800774,15.6907073549,15.6907346319,15.6907619084,15.6907891844,15.6908164599,15.6908437349, 15.6908710093,15.6908982832,15.6909255566,15.6909528295,15.6909801019,15.6910073737,15.6910346451,15.6910619159,15.6910891862,15.691116456,15.6911437253,15.6911709941,15.6911982623,15.6912255301,15.6912527973,15.691280064, 15.6913073302,15.6913345959,15.691361861,15.6913891257,15.6914163898,15.6914436534,15.6914709165,15.6914981791,15.6915254412,15.6915527027,15.6915799638,15.6916072243,15.6916344843,15.6916617438,15.6916890028,15.6917162612, 15.6917435192,15.6917707766,15.6917980335,15.6918252899,15.6918525458,15.6918798012,15.691907056,15.6919343104,15.6919615642,15.6919888175,15.6920160703,15.6920433226,15.6920705744,15.6920978256,15.6921250764,15.6921523266, 15.6921795763,15.6922068255,15.6922340742,15.6922613224,15.69228857,15.6923158171,15.6923430638,15.6923703099,15.6923975555,15.6924248005,15.6924520451,15.6924792892,15.6925065327,15.6925337757,15.6925610182,15.6925882602, 15.6926155017,15.6926427427,15.6926699831,15.692697223,15.6927244625,15.6927517014,15.6927789398,15.6928061776,15.692833415,15.6928606518,15.6928878882,15.692915124,15.6929423593,15.6929695941,15.6929968284,15.6930240621, 15.6930512954,15.6930785281,15.6931057604,15.6931329921,15.6931602233,15.6931874539,15.6932146841,15.6932419138,15.6932691429,15.6932963715,15.6933235996,15.6933508272,15.6933780543,15.6934052809,15.6934325069,15.6934597325, 15.6934869575,15.693514182,15.693541406,15.6935686295,15.6935958525,15.6936230749,15.6936502969,15.6936775183,15.6937047392,15.6937319596,15.6937591795,15.6937863989,15.6938136178,15.6938408361,15.6938680539,15.6938952713, 15.6939224881,15.6939497044,15.6939769202,15.6940041354,15.6940313502,15.6940585644,15.6940857782,15.6941129914,15.6941402041,15.6941674163,15.6941946279,15.6942218391,15.6942490498,15.6942762599,15.6943034695,15.6943306786, 15.6943578872,15.6943850953,15.6944123029,15.6944395099,15.6944667165,15.6944939225,15.694521128,15.694548333,15.6945755375,15.6946027415,15.694629945,15.6946571479,15.6946843504,15.6947115523,15.6947387537,15.6947659546, 15.694793155,15.6948203549,15.6948475542,15.6948747531,15.6949019514,15.6949291493,15.6949563466,15.6949835434,15.6950107397,15.6950379354,15.6950651307,15.6950923254,15.6951195197,15.6951467134,15.6951739066,15.6952010993, 15.6952282915,15.6952554832,15.6952826743,15.695309865,15.6953370551,15.6953642447,15.6953914339,15.6954186225,15.6954458105,15.6954729981,15.6955001852,15.6955273717,15.6955545578,15.6955817433,15.6956089283,15.6956361128, 15.6956632968,15.6956904803,15.6957176632,15.6957448457,15.6957720276,15.695799209,15.69582639,15.6958535704,15.6958807503,15.6959079296,15.6959351085,15.6959622869,15.6959894647,15.696016642,15.6960438189,15.6960709952, 15.696098171,15.6961253462,15.696152521,15.6961796953,15.696206869,15.6962340423,15.696261215,15.6962883872,15.6963155589,15.6963427301,15.6963699008,15.6963970709,15.6964242406,15.6964514097,15.6964785784,15.6965057465, 15.6965329141,15.6965600812,15.6965872478,15.6966144138,15.6966415794,15.6966687444,15.696695909,15.696723073,15.6967502365,15.6967773995,15.696804562,15.696831724,15.6968588855,15.6968860464,15.6969132069,15.6969403668, 15.6969675262,15.6969946851,15.6970218435,15.6970490014,15.6970761588,15.6971033157,15.697130472,15.6971576279,15.6971847832,15.697211938,15.6972390924,15.6972662462,15.6972933995,15.6973205522,15.6973477045,15.6973748563, 15.6974020075,15.6974291582,15.6974563085,15.6974834582,15.6975106074,15.6975377561,15.6975649043,15.6975920519,15.6976191991,15.6976463457,15.6976734919,15.6977006375,15.6977277826,15.6977549272,15.6977820713,15.6978092149, 15.697836358,15.6978635005,15.6978906426,15.6979177841,15.6979449251,15.6979720657,15.6979992057,15.6980263452,15.6980534842,15.6980806226,15.6981077606,15.6981348981,15.698162035,15.6981891714,15.6982163074,15.6982434428, 15.6982705777,15.6982977121,15.698324846,15.6983519793,15.6983791122,15.6984062446,15.6984333764,15.6984605077,15.6984876386,15.6985147689,15.6985418987,15.698569028,15.6985961567,15.698623285,15.6986504128,15.69867754, 15.6987046668,15.698731793,15.6987589187,15.6987860439,15.6988131686,15.6988402928,15.6988674165,15.6988945397,15.6989216623,15.6989487845,15.6989759061,15.6990030273,15.6990301479,15.699057268,15.6990843876,15.6991115067, 15.6991386253,15.6991657433,15.6991928609,15.699219978,15.6992470945,15.6992742105,15.6993013261,15.6993284411,15.6993555556,15.6993826696,15.6994097831,15.699436896,15.6994640085,15.6994911205,15.6995182319,15.6995453429, 15.6995724533,15.6995995632,15.6996266726,15.6996537815,15.6996808899,15.6997079978,15.6997351052,15.699762212,15.6997893184,15.6998164242,15.6998435296,15.6998706344,15.6998977387,15.6999248425,15.6999519458,15.6999790486, 15.7000061509,15.7000332527,15.7000603539,15.7000874547,15.7001145549,15.7001416546,15.7001687539,15.7001958526,15.7002229508,15.7002500485,15.7002771457,15.7003042424,15.7003313385,15.7003584342,15.7003855294,15.700412624, 15.7004397181,15.7004668118,15.7004939049,15.7005209975,15.7005480896,15.7005751812,15.7006022723,15.7006293629,15.7006564529,15.7006835425,15.7007106315,15.7007377201,15.7007648081,15.7007918956,15.7008189826,15.7008460691, 15.7008731551,15.7009002406,15.7009273256,15.7009544101,15.700981494,15.7010085775,15.7010356604,15.7010627429,15.7010898248,15.7011169062,15.7011439872,15.7011710676,15.7011981475,15.7012252268,15.7012523057,15.7012793841, 15.701306462,15.7013335393,15.7013606162,15.7013876925,15.7014147683,15.7014418437,15.7014689185,15.7014959928,15.7015230666,15.7015501399,15.7015772126,15.7016042849,15.7016313567,15.7016584279,15.7016854987,15.7017125689, 15.7017396387,15.7017667079,15.7017937766,15.7018208448,15.7018479125,15.7018749797,15.7019020464,15.7019291126,15.7019561783,15.7019832434,15.7020103081,15.7020373722,15.7020644359,15.702091499,15.7021185616,15.7021456238, 15.7021726854,15.7021997465,15.7022268071,15.7022538672,15.7022809267,15.7023079858,15.7023350444,15.7023621024,15.70238916,15.702416217,15.7024432736,15.7024703296,15.7024973851,15.7025244401,15.7025514946,15.7025785486, 15.7026056021,15.7026326551,15.7026597076,15.7026867595,15.702713811,15.702740862,15.7027679124,15.7027949623,15.7028220118,15.7028490607,15.7028761091,15.702903157,15.7029302044,15.7029572513,15.7029842977,15.7030113436, 15.703038389,15.7030654339,15.7030924782,15.7031195221,15.7031465654,15.7031736083,15.7032006506,15.7032276924,15.7032547337,15.7032817746,15.7033088149,15.7033358547,15.703362894,15.7033899328,15.703416971,15.7034440088, 15.7034710461,15.7034980828,15.7035251191,15.7035521548,15.7035791901,15.7036062248,15.703633259,15.7036602928,15.703687326,15.7037143587,15.7037413909,15.7037684226,15.7037954538,15.7038224844,15.7038495146,15.7038765443, 15.7039035734,15.7039306021,15.7039576302,15.7039846579,15.704011685,15.7040387117,15.7040657378,15.7040927634,15.7041197885,15.7041468131,15.7041738372,15.7042008608,15.7042278839,15.7042549065,15.7042819286,15.7043089501, 15.7043359712,15.7043629917,15.7043900118,15.7044170313,15.7044440504,15.7044710689,15.7044980869,15.7045251044,15.7045521215,15.704579138,15.704606154,15.7046331695,15.7046601845,15.7046871989,15.7047142129,15.7047412264, 15.7047682394,15.7047952518,15.7048222638,15.7048492752,15.7048762862,15.7049032966,15.7049303065,15.704957316,15.7049843249,15.7050113333,15.7050383412,15.7050653486,15.7050923555,15.7051193619,15.7051463678,15.7051733732, 15.7052003781,15.7052273824,15.7052543863,15.7052813897,15.7053083925,15.7053353949,15.7053623967,15.705389398,15.7054163989,15.7054433992,15.705470399,15.7054973984,15.7055243972,15.7055513955,15.7055783933,15.7056053906, 15.7056323874,15.7056593836,15.7056863794,15.7057133747,15.7057403695,15.7057673637,15.7057943575,15.7058213508,15.7058483435,15.7058753358,15.7059023275,15.7059293187,15.7059563095,15.7059832997,15.7060102894,15.7060372786, 15.7060642673,15.7060912555,15.7061182432,15.7061452304,15.7061722171,15.7061992033,15.706226189,15.7062531742,15.7062801588,15.706307143,15.7063341267,15.7063611098,15.7063880925,15.7064150746,15.7064420563,15.7064690374, 15.7064960181,15.7065229982,15.7065499778,15.7065769569,15.7066039356,15.7066309137,15.7066578913,15.7066848684,15.706711845,15.7067388211,15.7067657967,15.7067927718,15.7068197463,15.7068467204,15.706873694,15.7069006671, 15.7069276396,15.7069546117,15.7069815832,15.7070085543,15.7070355248,15.7070624949,15.7070894644,15.7071164335,15.707143402,15.70717037,15.7071973375,15.7072243045,15.7072512711,15.7072782371,15.7073052026,15.7073321676, 15.7073591321,15.7073860961,15.7074130596,15.7074400226,15.707466985,15.707493947,15.7075209085,15.7075478695,15.7075748299,15.7076017899,15.7076287493,15.7076557083,15.7076826668,15.7077096247,15.7077365822,15.7077635391, 15.7077904955,15.7078174515,15.7078444069,15.7078713618,15.7078983162,15.7079252702,15.7079522236,15.7079791765,15.7080061289,15.7080330808,15.7080600322,15.7080869831,15.7081139335,15.7081408834,15.7081678328,15.7081947817, 15.70822173,15.7082486779,15.7082756253,15.7083025722,15.7083295185,15.7083564644,15.7083834098,15.7084103546,15.708437299,15.7084642428,15.7084911862,15.708518129,15.7085450714,15.7085720132,15.7085989545,15.7086258954, 15.7086528357,15.7086797755,15.7087067148,15.7087336537,15.708760592,15.7087875298,15.7088144671,15.7088414039,15.7088683402,15.708895276,15.7089222113,15.7089491461,15.7089760804,15.7090030142,15.7090299475,15.7090568803, 15.7090838126,15.7091107443,15.7091376756,15.7091646064,15.7091915367,15.7092184664,15.7092453957,15.7092723245,15.7092992527,15.7093261805,15.7093531077,15.7093800345,15.7094069607,15.7094338865,15.7094608117,15.7094877365, 15.7095146607,15.7095415844,15.7095685077,15.7095954304,15.7096223526,15.7096492744,15.7096761956,15.7097031163,15.7097300365,15.7097569563,15.7097838755,15.7098107942,15.7098377124,15.7098646301,15.7098915473,15.709918464, 15.7099453802,15.7099722959,15.7099992111,15.7100261258,15.71005304,15.7100799537,15.7101068669,15.7101337796,15.7101606918,15.7101876035,15.7102145147,15.7102414253,15.7102683355,15.7102952452,15.7103221544,15.710349063, 15.7103759712,15.7104028789,15.710429786,15.7104566927,15.7104835989,15.7105105045,15.7105374097,15.7105643144,15.7105912185,15.7106181222,15.7106450253,15.710671928,15.7106988301,15.7107257318,15.7107526329,15.7107795336, 15.7108064337,15.7108333333,15.7108602325,15.7108871311,15.7109140293,15.7109409269,15.710967824,15.7109947207,15.7110216168,15.7110485124,15.7110754076,15.7111023022,15.7111291963,15.7111560899,15.7111829831,15.7112098757, 15.7112367678,15.7112636594,15.7112905505,15.7113174411,15.7113443313,15.7113712209,15.71139811,15.7114249986,15.7114518867,15.7114787743,15.7115056614,15.711532548,15.7115594341,15.7115863198,15.7116132049,15.7116400895, 15.7116669736,15.7116938572,15.7117207403,15.7117476229,15.711774505,15.7118013866,15.7118282677,15.7118551483,15.7118820284,15.7119089079,15.711935787,15.7119626656,15.7119895437,15.7120164213,15.7120432984,15.712070175, 15.7120970511,15.7121239267,15.7121508018,15.7121776764,15.7122045504,15.712231424,15.7122582971,15.7122851697,15.7123120418,15.7123389134,15.7123657844,15.712392655,15.7124195251,15.7124463947,15.7124732638,15.7125001324, 15.7125270004,15.712553868,15.7125807351,15.7126076017,15.7126344678,15.7126613333,15.7126881984,15.712715063,15.7127419271,15.7127687907,15.7127956537,15.7128225163,15.7128493784,15.71287624,15.712903101,15.7129299616, 15.7129568217,15.7129836813,15.7130105404,15.7130373989,15.713064257,15.7130911146,15.7131179717,15.7131448282,15.7131716843,15.7131985399,15.713225395,15.7132522495,15.7132791036,15.7133059572,15.7133328103,15.7133596629, 15.7133865149,15.7134133665,15.7134402176,15.7134670682,15.7134939183,15.7135207678,15.7135476169,15.7135744655,15.7136013136,15.7136281612,15.7136550082,15.7136818548,15.7137087009,15.7137355465,15.7137623916,15.7137892362, 15.7138160802,15.7138429238,15.7138697669,15.7138966095,15.7139234516,15.7139502932,15.7139771343,15.7140039748,15.7140308149,15.7140576545,15.7140844936,15.7141113322,15.7141381703,15.7141650079,15.714191845,15.7142186816, 15.7142455177,15.7142723533,15.7142991884,15.714326023,15.7143528571,15.7143796907,15.7144065238,15.7144333564,15.7144601885,15.7144870201,15.7145138512,15.7145406818,15.7145675119,15.7145943415,15.7146211706,15.7146479992, 15.7146748273,15.7147016549,15.714728482,15.7147553086,15.7147821348,15.7148089604,15.7148357855,15.7148626101,15.7148894342,15.7149162579,15.714943081,15.7149699036,15.7149967257,15.7150235473,15.7150503685,15.7150771891, 15.7151040092,15.7151308289,15.715157648,15.7151844666,15.7152112848,15.7152381024,15.7152649195,15.7152917362,15.7153185523,15.715345368,15.7153721831,15.7153989978,15.7154258119,15.7154526256,15.7154794387,15.7155062514, 15.7155330635,15.7155598752,15.7155866863,15.715613497,15.7156403072,15.7156671168,15.715693926,15.7157207347,15.7157475428,15.7157743505,15.7158011577,15.7158279644,15.7158547705,15.7158815762,15.7159083814,15.7159351861, 15.7159619903,15.7159887939,15.7160155971,15.7160423998,15.716069202,15.7160960037,15.7161228049,15.7161496056,15.7161764058,15.7162032055,15.7162300047,15.7162568034,15.7162836016,15.7163103993,15.7163371966,15.7163639933, 15.7163907895,15.7164175852,15.7164443804,15.7164711752,15.7164979694,15.7165247631,15.7165515564,15.7165783491,15.7166051413,15.7166319331,15.7166587243,15.7166855151,15.7167123053,15.7167390951,15.7167658843,15.7167926731, 15.7168194613,15.7168462491,15.7168730364,15.7168998231,15.7169266094,15.7169533952,15.7169801804,15.7170069652,15.7170337495,15.7170605333,15.7170873166,15.7171140993,15.7171408816,15.7171676634,15.7171944447,15.7172212255, 15.7172480058,15.7172747856,15.7173015649,15.7173283438,15.7173551221,15.7173818999,15.7174086772,15.717435454,15.7174622303,15.7174890062,15.7175157815,15.7175425563,15.7175693307,15.7175961045,15.7176228779,15.7176496507, 15.7176764231,15.7177031949,15.7177299663,15.7177567371,15.7177835075,15.7178102774,15.7178370467,15.7178638156,15.717890584,15.7179173519,15.7179441193,15.7179708861,15.7179976525,15.7180244184,15.7180511838,15.7180779487, 15.7181047131,15.718131477,15.7181582404,15.7181850034,15.7182117658,15.7182385277,15.7182652891,15.71829205,15.7183188105,15.7183455704,15.7183723299,15.7183990888,15.7184258472,15.7184526052,15.7184793626,15.7185061196, 15.7185328761,15.718559632,15.7185863875,15.7186131425,15.718639897,15.7186666509,15.7186934044,15.7187201574,15.7187469099,15.7187736619,15.7188004134,15.7188271644,15.7188539149,15.7188806649,15.7189074144,15.7189341635, 15.718960912,15.71898766,15.7190144075,15.7190411546,15.7190679011,15.7190946472,15.7191213927,15.7191481378,15.7191748823,15.7192016264,15.71922837,15.719255113,15.7192818556,15.7193085977,15.7193353393,15.7193620804, 15.7193888209,15.719415561,15.7194423006,15.7194690397,15.7194957784,15.7195225165,15.7195492541,15.7195759912,15.7196027278,15.719629464,15.7196561996,15.7196829347,15.7197096694,15.7197364035,15.7197631372,15.7197898704, 15.719816603,15.7198433352,15.7198700669,15.719896798,15.7199235287,15.7199502589,15.7199769886,15.7200037178,15.7200304465,15.7200571747,15.7200839024,15.7201106296,15.7201373564,15.7201640826,15.7201908083,15.7202175335, 15.7202442583,15.7202709825,15.7202977063,15.7203244295,15.7203511523,15.7203778746,15.7204045963,15.7204313176,15.7204580384,15.7204847587,15.7205114785,15.7205381978,15.7205649166,15.7205916349,15.7206183527,15.72064507, 15.7206717868,15.7206985032,15.720725219,15.7207519343,15.7207786492,15.7208053635,15.7208320774,15.7208587907,15.7208855036,15.720912216,15.7209389278,15.7209656392,15.7209923501,15.7210190605,15.7210457704,15.7210724798, 15.7210991887,15.7211258971,15.721152605,15.7211793125,15.7212060194,15.7212327258,15.7212594318,15.7212861372,15.7213128422,15.7213395466,15.7213662506,15.7213929541,15.721419657,15.7214463595,15.7214730615,15.721499763, 15.721526464,15.7215531645,15.7215798645,15.721606564,15.7216332631,15.7216599616,15.7216866596,15.7217133572,15.7217400542,15.7217667508,15.7217934468,15.7218201424,15.7218468375,15.721873532,15.7219002261,15.7219269197, 15.7219536128,15.7219803054,15.7220069975,15.7220336891,15.7220603802,15.7220870709,15.722113761,15.7221404506,15.7221671398,15.7221938284,15.7222205166,15.7222472043,15.7222738914,15.7223005781,15.7223272643,15.72235395, 15.7223806352,15.7224073199,15.7224340041,15.7224606878,15.722487371,15.7225140537,15.722540736,15.7225674177,15.722594099,15.7226207797,15.72264746,15.7226741397,15.722700819,15.7227274978,15.7227541761,15.7227808539, 15.7228075312,15.722834208,15.7228608843,15.7228875601,15.7229142354,15.7229409103,15.7229675846,15.7229942585,15.7230209318,15.7230476047,15.723074277,15.7231009489,15.7231276203,15.7231542912,15.7231809616,15.7232076315, 15.7232343009,15.7232609698,15.7232876382,15.7233143062,15.7233409736,15.7233676405,15.723394307,15.723420973,15.7234476384,15.7234743034,15.7235009679,15.7235276319,15.7235542954,15.7235809584,15.7236076209,15.7236342829, 15.7236609444,15.7236876054,15.723714266,15.723740926,15.7237675856,15.7237942446,15.7238209032,15.7238475613,15.7238742189,15.723900876,15.7239275326,15.7239541887,15.7239808443,15.7240074994,15.724034154,15.7240608082, 15.7240874618,15.7241141149,15.7241407676,15.7241674198,15.7241940714,15.7242207226,15.7242473733,15.7242740235,15.7243006732,15.7243273224,15.7243539711,15.7243806194,15.7244072671,15.7244339143,15.7244605611,15.7244872074, 15.7245138531,15.7245404984,15.7245671432,15.7245937875,15.7246204313,15.7246470746,15.7246737174,15.7247003597,15.7247270015,15.7247536429,15.7247802837,15.7248069241,15.7248335639,15.7248602033,15.7248868422,15.7249134806, 15.7249401185,15.7249667559,15.7249933928,15.7250200292,15.7250466651,15.7250733006,15.7250999355,15.72512657,15.7251532039,15.7251798374,15.7252064704,15.7252331028,15.7252597348,15.7252863663,15.7253129973,15.7253396279, 15.7253662579,15.7253928874,15.7254195165,15.725446145,15.7254727731,15.7254994007,15.7255260277,15.7255526543,15.7255792804,15.725605906,15.7256325311,15.7256591558,15.7256857799,15.7257124035,15.7257390267,15.7257656493, 15.7257922715,15.7258188932,15.7258455143,15.725872135,15.7258987552,15.7259253749,15.7259519942,15.7259786129,15.7260052311,15.7260318489,15.7260584661,15.7260850829,15.7261116992,15.7261383149,15.7261649302,15.726191545, 15.7262181593,15.7262447731,15.7262713865,15.7262979993,15.7263246117,15.7263512235,15.7263778349,15.7264044457,15.7264310561,15.726457666,15.7264842754,15.7265108843,15.7265374927,15.7265641007,15.7265907081,15.726617315, 15.7266439215,15.7266705274,15.7266971329,15.7267237379,15.7267503424,15.7267769464,15.7268035499,15.7268301529,15.7268567555,15.7268833575,15.726909959,15.7269365601,15.7269631607,15.7269897607,15.7270163603,15.7270429594, 15.727069558,15.7270961561,15.7271227538,15.7271493509,15.7271759475,15.7272025437,15.7272291394,15.7272557345,15.7272823292,15.7273089234,15.7273355171,15.7273621103,15.727388703,15.7274152953,15.727441887,15.7274684783, 15.727495069,15.7275216593,15.7275482491,15.7275748384,15.7276014272,15.7276280155,15.7276546033,15.7276811906,15.7277077775,15.7277343638,15.7277609497,15.7277875351,15.7278141199,15.7278407043,15.7278672882,15.7278938716, 15.7279204546,15.727947037,15.7279736189,15.7280002004,15.7280267814,15.7280533618,15.7280799418,15.7281065213,15.7281331003,15.7281596788,15.7281862568,15.7282128344,15.7282394114,15.728265988,15.728292564,15.7283191396, 15.7283457147,15.7283722893,15.7283988634,15.728425437,15.7284520102,15.7284785828,15.728505155,15.7285317266,15.7285582978,15.7285848685,15.7286114387,15.7286380084,15.7286645776,15.7286911463,15.7287177145,15.7287442823, 15.7287708495,15.7287974163,15.7288239826,15.7288505484,15.7288771137,15.7289036785,15.7289302428,15.7289568066,15.72898337,15.7290099328,15.7290364952,15.7290630571,15.7290896185,15.7291161794,15.7291427398,15.7291692997, 15.7291958591,15.7292224181,15.7292489765,15.7292755345,15.729302092,15.729328649,15.7293552055,15.7293817615,15.729408317,15.729434872,15.7294614266,15.7294879806,15.7295145342,15.7295410873,15.7295676398,15.7295941919, 15.7296207436,15.7296472947,15.7296738453,15.7297003955,15.7297269451,15.7297534943,15.729780043,15.7298065911,15.7298331388,15.7298596861,15.7298862328,15.729912779,15.7299393248,15.72996587,15.7299924148,15.7300189591, 15.7300455029,15.7300720462,15.730098589,15.7301251313,15.7301516732,15.7301782145,15.7302047554,15.7302312958,15.7302578357,15.7302843751,15.730310914,15.7303374524,15.7303639903,15.7303905278,15.7304170647,15.7304436012, 15.7304701372,15.7304966727,15.7305232077,15.7305497422,15.7305762762,15.7306028098,15.7306293428,15.7306558754,15.7306824075,15.7307089391,15.7307354702,15.7307620008,15.7307885309,15.7308150606,15.7308415897,15.7308681184, 15.7308946465,15.7309211742,15.7309477014,15.7309742281,15.7310007544,15.7310272801,15.7310538054,15.7310803301,15.7311068544,15.7311333782,15.7311599015,15.7311864243,15.7312129466,15.7312394684,15.7312659898,15.7312925107, 15.731319031,15.7313455509,15.7313720703,15.7313985892,15.7314251076,15.7314516256,15.731478143,15.73150466,15.7315311765,15.7315576924,15.7315842079,15.731610723,15.7316372375,15.7316637515,15.7316902651,15.7317167781, 15.7317432907,15.7317698028,15.7317963144,15.7318228255,15.7318493361,15.7318758463,15.7319023559,15.7319288651,15.7319553738,15.731981882,15.7320083897,15.7320348969,15.7320614036,15.7320879099,15.7321144156,15.7321409209, 15.7321674257,15.73219393,15.7322204338,15.7322469371,15.7322734399,15.7322999423,15.7323264441,15.7323529455,15.7323794464,15.7324059468,15.7324324467,15.7324589461,15.7324854451,15.7325119435,15.7325384415,15.732564939, 15.732591436,15.7326179325,15.7326444285,15.732670924,15.7326974191,15.7327239136,15.7327504077,15.7327769013,15.7328033944,15.732829887,15.7328563791,15.7328828708,15.7329093619,15.7329358526,15.7329623428,15.7329888325, 15.7330153217,15.7330418104,15.7330682986,15.7330947864,15.7331212737,15.7331477604,15.7331742467,15.7332007325,15.7332272179,15.7332537027,15.733280187,15.7333066709,15.7333331543,15.7333596372,15.7333861196,15.7334126015, 15.7334390829,15.7334655638,15.7334920443,15.7335185243,15.7335450038,15.7335714828,15.7335979613,15.7336244393,15.7336509168,15.7336773939,15.7337038705,15.7337303465,15.7337568221,15.7337832973,15.7338097719,15.733836246, 15.7338627197,15.7338891928,15.7339156655,15.7339421377,15.7339686094,15.7339950807,15.7340215514,15.7340480217,15.7340744914,15.7341009607,15.7341274295,15.7341538978,15.7341803656,15.734206833,15.7342332998,15.7342597662, 15.7342862321,15.7343126975,15.7343391624,15.7343656268,15.7343920908,15.7344185542,15.7344450172,15.7344714797,15.7344979417,15.7345244032,15.7345508642,15.7345773248,15.7346037848,15.7346302444,15.7346567035,15.7346831621, 15.7347096202,15.7347360779,15.734762535,15.7347889917,15.7348154478,15.7348419035,15.7348683587,15.7348948135,15.7349212677,15.7349477215,15.7349741747,15.7350006275,15.7350270798,15.7350535316,15.7350799829,15.7351064338, 15.7351328841,15.735159334,15.7351857834,15.7352122323,15.7352386807,15.7352651287,15.7352915761,15.7353180231,15.7353444695,15.7353709155,15.735397361,15.7354238061,15.7354502506,15.7354766947,15.7355031382,15.7355295813, 15.7355560239,15.735582466,15.7356089077,15.7356353488,15.7356617895,15.7356882296,15.7357146693,15.7357411085,15.7357675473,15.7357939855,15.7358204233,15.7358468605,15.7358732973,15.7358997336,15.7359261694,15.7359526048, 15.7359790396,15.736005474,15.7360319079,15.7360583413,15.7360847742,15.7361112066,15.7361376385,15.73616407,15.736190501,15.7362169315,15.7362433615,15.736269791,15.73629622,15.7363226486,15.7363490766,15.7363755042, 15.7364019313,15.7364283579,15.7364547841,15.7364812097,15.7365076349,15.7365340596,15.7365604838,15.7365869075,15.7366133307,15.7366397534,15.7366661757,15.7366925975,15.7367190188,15.7367454396,15.7367718599,15.7367982797, 15.7368246991,15.736851118,15.7368775364,15.7369039543,15.7369303717,15.7369567886,15.7369832051,15.7370096211,15.7370360365,15.7370624515,15.7370888661,15.7371152801,15.7371416937,15.7371681067,15.7371945193,15.7372209314, 15.737247343,15.7372737542,15.7373001648,15.737326575,15.7373529847,15.7373793939,15.7374058026,15.7374322108,15.7374586186,15.7374850258,15.7375114326,15.7375378389,15.7375642447,15.7375906501,15.7376170549,15.7376434593, 15.7376698632,15.7376962666,15.7377226695,15.7377490719,15.7377754739,15.7378018754,15.7378282763,15.7378546768,15.7378810769,15.7379074764,15.7379338754,15.737960274,15.7379866721,15.7380130697,15.7380394668,15.7380658635, 15.7380922596,15.7381186553,15.7381450505,15.7381714452,15.7381978394,15.7382242332,15.7382506264,15.7382770192,15.7383034115,15.7383298033,15.7383561946,15.7383825855,15.7384089758,15.7384353657,15.7384617551,15.738488144, 15.7385145324,15.7385409204,15.7385673078,15.7385936948,15.7386200813,15.7386464673,15.7386728529,15.7386992379,15.7387256225,15.7387520066,15.7387783902,15.7388047733,15.7388311559,15.7388575381,15.7388839198,15.738910301, 15.7389366817,15.7389630619,15.7389894416,15.7390158209,15.7390421997,15.739068578,15.7390949558,15.7391213331,15.73914771,15.7391740864,15.7392004622,15.7392268376,15.7392532126,15.739279587,15.739305961,15.7393323344, 15.7393587074,15.7393850799,15.739411452,15.7394378235,15.7394641946,15.7394905652,15.7395169353,15.7395433049,15.739569674,15.7395960427,15.7396224109,15.7396487785,15.7396751458,15.7397015125,15.7397278787,15.7397542445, 15.7397806098,15.7398069746,15.7398333389,15.7398597027,15.7398860661,15.739912429,15.7399387913,15.7399651533,15.7399915147,15.7400178756,15.7400442361,15.7400705961,15.7400969556,15.7401233146,15.7401496731,15.7401760312, 15.7402023888,15.7402287459,15.7402551025,15.7402814586,15.7403078143,15.7403341694,15.7403605241,15.7403868783,15.740413232,15.7404395853,15.740465938,15.7404922903,15.7405186421,15.7405449934,15.7405713443,15.7405976946, 15.7406240445,15.7406503939,15.7406767428,15.7407030912,15.7407294392,15.7407557866,15.7407821336,15.7408084801,15.7408348261,15.7408611717,15.7408875167,15.7409138613,15.7409402054,15.740966549,15.7409928922,15.7410192348, 15.741045577,15.7410719187,15.7410982599,15.7411246006,15.7411509409,15.7411772807,15.74120362,15.7412299588,15.7412562971,15.7412826349,15.7413089723,15.7413353092,15.7413616456,15.7413879815,15.741414317,15.7414406519, 15.7414669864,15.7414933204,15.7415196539,15.741545987,15.7415723195,15.7415986516,15.7416249832,15.7416513143,15.7416776449,15.7417039751,15.7417303048,15.741756634,15.7417829627,15.7418092909,15.7418356187,15.7418619459, 15.7418882727,15.741914599,15.7419409249,15.7419672502,15.7419935751,15.7420198995,15.7420462234,15.7420725468,15.7420988698,15.7421251922,15.7421515142,15.7421778357,15.7422041568,15.7422304773,15.7422567974,15.742283117, 15.7423094361,15.7423357547,15.7423620729,15.7423883905,15.7424147077,15.7424410244,15.7424673406,15.7424936564,15.7425199717,15.7425462864,15.7425726008,15.7425989146,15.7426252279,15.7426515408,15.7426778532,15.7427041651, 15.7427304765,15.7427567875,15.7427830979,15.7428094079,15.7428357174,15.7428620265,15.742888335,15.7429146431,15.7429409507,15.7429672578,15.7429935644,15.7430198706,15.7430461762,15.7430724814,15.7430987861,15.7431250904, 15.7431513941,15.7431776974,15.7432040002,15.7432303025,15.7432566043,15.7432829057,15.7433092066,15.7433355069,15.7433618069,15.7433881063,15.7434144053,15.7434407037,15.7434670017,15.7434932993,15.7435195963,15.7435458929, 15.7435721889,15.7435984845,15.7436247797,15.7436510743,15.7436773685,15.7437036622,15.7437299554,15.7437562481,15.7437825403,15.7438088321,15.7438351234,15.7438614142,15.7438877045,15.7439139944,15.7439402838,15.7439665726, 15.7439928611,15.744019149,15.7440454365,15.7440717234,15.7440980099,15.7441242959,15.7441505815,15.7441768665,15.7442031511,15.7442294352,15.7442557189,15.744282002,15.7443082847,15.7443345669,15.7443608486,15.7443871298, 15.7444134106,15.7444396908,15.7444659706,15.7444922499,15.7445185288,15.7445448071,15.744571085,15.7445973624,15.7446236393,15.7446499158,15.7446761918,15.7447024672,15.7447287422,15.7447550168,15.7447812908,15.7448075644, 15.7448338375,15.7448601101,15.7448863823,15.7449126539,15.7449389251,15.7449651958,15.744991466,15.7450177358,15.745044005,15.7450702738,15.7450965421,15.74512281,15.7451490773,15.7451753442,15.7452016106,15.7452278765, 15.745254142,15.7452804069,15.7453066714,15.7453329354,15.7453591989,15.745385462,15.7454117246,15.7454379867,15.7454642483,15.7454905094,15.7455167701,15.7455430303,15.74556929,15.7455955492,15.7456218079,15.7456480662, 15.745674324,15.7457005813,15.7457268382,15.7457530945,15.7457793504,15.7458056058,15.7458318607,15.7458581152,15.7458843691,15.7459106226,15.7459368756,15.7459631282,15.7459893802,15.7460156318,15.7460418829,15.7460681336, 15.7460943837,15.7461206334,15.7461468826,15.7461731313,15.7461993795,15.7462256273,15.7462518746,15.7462781214,15.7463043677,15.7463306136,15.7463568589,15.7463831038,15.7464093482,15.7464355922,15.7464618356,15.7464880786, 15.7465143211,15.7465405632,15.7465668047,15.7465930458,15.7466192864,15.7466455265,15.7466717662,15.7466980053,15.746724244,15.7467504822,15.74677672,15.7468029572,15.746829194,15.7468554303,15.7468816661,15.7469079015, 15.7469341364,15.7469603708,15.7469866047,15.7470128381,15.7470390711,15.7470653036,15.7470915356,15.7471177671,15.7471439982,15.7471702288,15.7471964589,15.7472226885,15.7472489176,15.7472751463,15.7473013745,15.7473276022, 15.7473538295,15.7473800562,15.7474062825,15.7474325083,15.7474587337,15.7474849585,15.7475111829,15.7475374068,15.7475636303,15.7475898532,15.7476160757,15.7476422977,15.7476685192,15.7476947402,15.7477209608,15.7477471809, 15.7477734005,15.7477996197,15.7478258383,15.7478520565,15.7478782742,15.7479044915,15.7479307082,15.7479569245,15.7479831403,15.7480093556,15.7480355705,15.7480617849,15.7480879988,15.7481142122,15.7481404251,15.7481666376, 15.7481928496,15.7482190611,15.7482452721,15.7482714827,15.7482976928,15.7483239024,15.7483501116,15.7483763202,15.7484025284,15.7484287361,15.7484549433,15.7484811501,15.7485073564,15.7485335622,15.7485597675,15.7485859724, 15.7486121767,15.7486383806,15.7486645841,15.748690787,15.7487169895,15.7487431915,15.748769393,15.748795594,15.7488217946,15.7488479947,15.7488741943,15.7489003935,15.7489265921,15.7489527903,15.748978988,15.7490051853, 15.749031382,15.7490575783,15.7490837741,15.7491099695,15.7491361643,15.7491623587,15.7491885526,15.7492147461,15.749240939,15.7492671315,15.7492933235,15.749319515,15.7493457061,15.7493718967,15.7493980868,15.7494242764, 15.7494504656,15.7494766542,15.7495028425,15.7495290302,15.7495552174,15.7495814042,15.7496075905,15.7496337763,15.7496599617,15.7496861466,15.749712331,15.7497385149,15.7497646983,15.7497908813,15.7498170638,15.7498432458, 15.7498694274,15.7498956085,15.7499217891,15.7499479692,15.7499741488,15.750000328,15.7500265067,15.7500526849,15.7500788627,15.75010504,15.7501312168,15.7501573931,15.7501835689,15.7502097443,15.7502359192,15.7502620936, 15.7502882676,15.7503144411,15.7503406141,15.7503667866,15.7503929586,15.7504191302,15.7504453013,15.7504714719,15.7504976421,15.7505238118,15.750549981,15.7505761497,15.750602318,15.7506284857,15.750654653,15.7506808199, 15.7507069862,15.7507331521,15.7507593175,15.7507854824,15.7508116469,15.7508378109,15.7508639744,15.7508901374,15.7509163,15.7509424621,15.7509686237,15.7509947848,15.7510209455,15.7510471057,15.7510732654,15.7510994246, 15.7511255834,15.7511517417,15.7511778995,15.7512040568,15.7512302137,15.7512563701,15.751282526,15.7513086814,15.7513348364,15.7513609909,15.7513871449,15.7514132985,15.7514394515,15.7514656041,15.7514917563,15.7515179079, 15.7515440591,15.7515702098,15.75159636,15.7516225098,15.7516486591,15.7516748079,15.7517009562,15.7517271041,15.7517532514,15.7517793984,15.7518055448,15.7518316908,15.7518578362,15.7518839813,15.7519101258,15.7519362699, 15.7519624135,15.7519885566,15.7520146992,15.7520408414,15.7520669831,15.7520931243,15.7521192651,15.7521454054,15.7521715452,15.7521976845,15.7522238234,15.7522499617,15.7522760996,15.7523022371,15.752328374,15.7523545105, 15.7523806466,15.7524067821,15.7524329172,15.7524590518,15.7524851859,15.7525113195,15.7525374527,15.7525635854,15.7525897176,15.7526158494,15.7526419807,15.7526681115,15.7526942418,15.7527203717,15.7527465011,15.75277263, 15.7527987584,15.7528248864,15.7528510139,15.7528771409,15.7529032675,15.7529293936,15.7529555192,15.7529816443,15.7530077689,15.7530338931,15.7530600168,15.7530861401,15.7531122628,15.7531383851,15.753164507,15.7531906283, 15.7532167492,15.7532428696,15.7532689895,15.753295109,15.7533212279,15.7533473465,15.7533734645,15.7533995821,15.7534256991,15.7534518158,15.7534779319,15.7535040476,15.7535301628,15.7535562775,15.7535823918,15.7536085055, 15.7536346189,15.7536607317,15.7536868441,15.7537129559,15.7537390674,15.7537651783,15.7537912888,15.7538173988,15.7538435083,15.7538696174,15.753895726,15.7539218341,15.7539479417,15.7539740489,15.7540001556,15.7540262618, 15.7540523675,15.7540784728,15.7541045776,15.7541306819,15.7541567858,15.7541828892,15.7542089921,15.7542350945,15.7542611965,15.754287298,15.754313399,15.7543394996,15.7543655997,15.7543916993,15.7544177984,15.7544438971, 15.7544699953,15.754496093,15.7545221902,15.754548287,15.7545743833,15.7546004792,15.7546265745,15.7546526694,15.7546787638,15.7547048578,15.7547309512,15.7547570442,15.7547831368,15.7548092288,15.7548353204,15.7548614115, 15.7548875022,15.7549135923,15.754939682,15.7549657713,15.75499186,15.7550179483,15.7550440361,15.7550701234,15.7550962103,15.7551222967,15.7551483826,15.7551744681,15.7552005531,15.7552266376,15.7552527216,15.7552788052, 15.7553048883,15.7553309709,15.755357053,15.7553831347,15.7554092159,15.7554352967,15.7554613769,15.7554874567,15.755513536,15.7555396149,15.7555656933,15.7555917712,15.7556178486,15.7556439256,15.7556700021,15.7556960781, 15.7557221536,15.7557482287,15.7557743033,15.7558003775,15.7558264511,15.7558525243,15.7558785971,15.7559046693,15.7559307411,15.7559568124,15.7559828832,15.7560089536,15.7560350235,15.7560610929,15.7560871619,15.7561132304, 15.7561392984,15.7561653659,15.756191433,15.7562174996,15.7562435657,15.7562696314,15.7562956966,15.7563217613,15.7563478255,15.7563738893,15.7563999526,15.7564260154,15.7564520778,15.7564781397,15.7565042011,15.756530262, 15.7565563225,15.7565823825,15.7566084421,15.7566345011,15.7566605597,15.7566866179,15.7567126755,15.7567387327,15.7567647894,15.7567908456,15.7568169014,15.7568429567,15.7568690115,15.7568950659,15.7569211198,15.7569471732, 15.7569732262,15.7569992786,15.7570253307,15.7570513822,15.7570774333,15.7571034839,15.757129534,15.7571555836,15.7571816328,15.7572076815,15.7572337298,15.7572597775,15.7572858249,15.7573118717,15.7573379181,15.7573639639, 15.7573900094,15.7574160543,15.7574420988,15.7574681428,15.7574941864,15.7575202294,15.757546272,15.7575723142,15.7575983558,15.757624397,15.7576504377,15.757676478,15.7577025178,15.7577285571,15.7577545959,15.7577806343, 15.7578066722,15.7578327096,15.7578587466,15.7578847831,15.7579108191,15.7579368547,15.7579628897,15.7579889244,15.7580149585,15.7580409922,15.7580670254,15.7580930581,15.7581190904,15.7581451222,15.7581711535,15.7581971843, 15.7582232147,15.7582492446,15.7582752741,15.7583013031,15.7583273316,15.7583533596,15.7583793872,15.7584054143,15.7584314409,15.7584574671,15.7584834927,15.758509518,15.7585355427,15.758561567,15.7585875908,15.7586136142, 15.758639637,15.7586656594,15.7586916814,15.7587177028,15.7587437238,15.7587697443,15.7587957644,15.758821784,15.7588478031,15.7588738218,15.7588998399,15.7589258576,15.7589518749,15.7589778917,15.759003908,15.7590299238, 15.7590559392,15.7590819541,15.7591079685,15.7591339824,15.7591599959,15.7591860089,15.7592120215,15.7592380336,15.7592640452,15.7592900563,15.759316067,15.7593420772,15.7593680869,15.7593940962,15.759420105,15.7594461133, 15.7594721212,15.7594981286,15.7595241355,15.759550142,15.759576148,15.7596021535,15.7596281585,15.7596541631,15.7596801672,15.7597061709,15.759732174,15.7597581767,15.759784179,15.7598101807,15.759836182,15.7598621829, 15.7598881832,15.7599141831,15.7599401825,15.7599661815,15.75999218,15.760018178,15.7600441755,15.7600701726,15.7600961692,15.7601221654,15.7601481611,15.7601741563,15.760200151,15.7602261453,15.7602521391,15.7602781324, 15.7603041253,15.7603301177,15.7603561096,15.7603821011,15.7604080921,15.7604340826,15.7604600726,15.7604860622,15.7605120514,15.76053804,15.7605640282,15.7605900159,15.7606160032,15.7606419899,15.7606679762,15.7606939621, 15.7607199475,15.7607459324,15.7607719168,15.7607979008,15.7608238843,15.7608498673,15.7608758499,15.760901832,15.7609278136,15.7609537948,15.7609797755,15.7610057557,15.7610317355,15.7610577148,15.7610836936,15.7611096719, 15.7611356498,15.7611616272,15.7611876042,15.7612135807,15.7612395567,15.7612655323,15.7612915073,15.761317482,15.7613434561,15.7613694298,15.761395403,15.7614213757,15.761447348,15.7614733198,15.7614992912,15.761525262, 15.7615512324,15.7615772024,15.7616031719,15.7616291409,15.7616551094,15.7616810775,15.7617070451,15.7617330122,15.7617589789,15.7617849451,15.7618109108,15.7618368761,15.7618628409,15.7618888052,15.7619147691,15.7619407325, 15.7619666954,15.7619926578,15.7620186198,15.7620445814,15.7620705424,15.762096503,15.7621224631,15.7621484228,15.762174382,15.7622003407,15.762226299,15.7622522568,15.7622782141,15.7623041709,15.7623301273,15.7623560833, 15.7623820387,15.7624079937,15.7624339482,15.7624599023,15.7624858559,15.762511809,15.7625377616,15.7625637138,15.7625896655,15.7626156168,15.7626415676,15.7626675179,15.7626934678,15.7627194171,15.7627453661,15.7627713145, 15.7627972625,15.76282321,15.7628491571,15.7628751037,15.7629010498,15.7629269954,15.7629529406,15.7629788853,15.7630048296,15.7630307734,15.7630567167,15.7630826595,15.7631086019,15.7631345439,15.7631604853,15.7631864263, 15.7632123668,15.7632383069,15.7632642465,15.7632901856,15.7633161242,15.7633420624,15.7633680001,15.7633939374,15.7634198742,15.7634458105,15.7634717464,15.7634976818,15.7635236167,15.7635495511,15.7635754851,15.7636014187, 15.7636273517,15.7636532843,15.7636792164,15.7637051481,15.7637310793,15.76375701,15.7637829403,15.7638088701,15.7638347994,15.7638607283,15.7638866567,15.7639125846,15.7639385121,15.7639644391,15.7639903656,15.7640162917, 15.7640422173,15.7640681424,15.7640940671,15.7641199913,15.7641459151,15.7641718383,15.7641977611,15.7642236835,15.7642496054,15.7642755268,15.7643014477,15.7643273682,15.7643532882,15.7643792078,15.7644051269,15.7644310455, 15.7644569636,15.7644828813,15.7645087985,15.7645347153,15.7645606316,15.7645865474,15.7646124628,15.7646383776,15.7646642921,15.764690206,15.7647161195,15.7647420326,15.7647679451,15.7647938572,15.7648197689,15.76484568, 15.7648715907,15.764897501,15.7649234107,15.7649493201,15.7649752289,15.7650011373,15.7650270452,15.7650529526,15.7650788596,15.7651047661,15.7651306722,15.7651565778,15.7651824829,15.7652083875,15.7652342917,15.7652601955, 15.7652860987,15.7653120015,15.7653379038,15.7653638057,15.7653897071,15.765415608,15.7654415085,15.7654674085,15.7654933081,15.7655192071,15.7655451058,15.7655710039,15.7655969016,15.7656227988,15.7656486955,15.7656745918, 15.7657004877,15.765726383,15.7657522779,15.7657781723,15.7658040663,15.7658299598,15.7658558528,15.7658817454,15.7659076375,15.7659335291,15.7659594203,15.765985311,15.7660112013,15.766037091,15.7660629803,15.7660888692, 15.7661147576,15.7661406455,15.766166533,15.76619242,15.7662183065,15.7662441925,15.7662700781,15.7662959633,15.766321848,15.7663477322,15.7663736159,15.7663994992,15.766425382,15.7664512643,15.7664771462,15.7665030276, 15.7665289086,15.7665547891,15.7665806691,15.7666065487,15.7666324278,15.7666583064,15.7666841846,15.7667100623,15.7667359395,15.7667618163,15.7667876926,15.7668135685,15.7668394439,15.7668653188,15.7668911932,15.7669170672, 15.7669429408,15.7669688138,15.7669946864,15.7670205586,15.7670464302,15.7670723014,15.7670981722,15.7671240425,15.7671499123,15.7671757816,15.7672016505,15.767227519,15.7672533869,15.7672792544,15.7673051214,15.767330988, 15.7673568541,15.7673827198,15.7674085849,15.7674344497,15.7674603139,15.7674861777,15.767512041,15.7675379039,15.7675637663,15.7675896282,15.7676154897,15.7676413507,15.7676672112,15.7676930713,15.7677189309,15.7677447901, 15.7677706488,15.767796507,15.7678223648,15.7678482221,15.7678740789,15.7678999353,15.7679257912,15.7679516466,15.7679775016,15.7680033561,15.7680292102,15.7680550638,15.7680809169,15.7681067696,15.7681326218,15.7681584735, 15.7681843248,15.7682101756,15.7682360259,15.7682618758,15.7682877252,15.7683135742,15.7683394227,15.7683652707,15.7683911183,15.7684169654,15.7684428121,15.7684686582,15.768494504,15.7685203492,15.768546194,15.7685720383, 15.7685978822,15.7686237256,15.7686495685,15.768675411,15.768701253,15.7687270946,15.7687529357,15.7687787763,15.7688046165,15.7688304562,15.7688562954,15.7688821342,15.7689079725,15.7689338103,15.7689596477,15.7689854846, 15.7690113211,15.7690371571,15.7690629926,15.7690888277,15.7691146623,15.7691404965,15.7691663301,15.7691921634,15.7692179961,15.7692438284,15.7692696603,15.7692954916,15.7693213225,15.769347153,15.769372983,15.7693988125, 15.7694246416,15.7694504701,15.7694762983,15.769502126,15.7695279532,15.7695537799,15.7695796062,15.769605432,15.7696312574,15.7696570823,15.7696829067,15.7697087307,15.7697345542,15.7697603773,15.7697861998,15.769812022, 15.7698378436,15.7698636648,15.7698894856,15.7699153058,15.7699411257,15.769966945,15.7699927639,15.7700185823,15.7700444003,15.7700702178,15.7700960348,15.7701218514,15.7701476675,15.7701734832,15.7701992984,15.7702251131, 15.7702509274,15.7702767412,15.7703025546,15.7703283674,15.7703541799,15.7703799918,15.7704058033,15.7704316144,15.7704574249,15.770483235,15.7705090447,15.7705348539,15.7705606626,15.7705864709,15.7706122787,15.770638086, 15.7706638929,15.7706896993,15.7707155053,15.7707413108,15.7707671158,15.7707929204,15.7708187245,15.7708445282,15.7708703314,15.7708961341,15.7709219364,15.7709477382,15.7709735395,15.7709993404,15.7710251408,15.7710509408, 15.7710767403,15.7711025393,15.7711283379,15.771154136,15.7711799336,15.7712057308,15.7712315276,15.7712573238,15.7712831196,15.771308915,15.7713347099,15.7713605043,15.7713862983,15.7714120918,15.7714378848,15.7714636774, 15.7714894695,15.7715152612,15.7715410524,15.7715668431,15.7715926334,15.7716184232,15.7716442125,15.7716700014,15.7716957899,15.7717215778,15.7717473653,15.7717731524,15.771798939,15.7718247251,15.7718505108,15.771876296, 15.7719020807,15.771927865,15.7719536488,15.7719794322,15.7720052151,15.7720309975,15.7720567795,15.772082561,15.7721083421,15.7721341226,15.7721599028,15.7721856825,15.7722114617,15.7722372404,15.7722630187,15.7722887966, 15.7723145739,15.7723403508,15.7723661273,15.7723919033,15.7724176788,15.7724434539,15.7724692285,15.7724950026,15.7725207763,15.7725465495,15.7725723223,15.7725980946,15.7726238665,15.7726496378,15.7726754088,15.7727011792, 15.7727269492,15.7727527188,15.7727784879,15.7728042565,15.7728300247,15.7728557924,15.7728815596,15.7729073264,15.7729330927,15.7729588586,15.772984624,15.7730103889,15.7730361534,15.7730619174,15.773087681,15.7731134441, 15.7731392067,15.7731649689,15.7731907306,15.7732164919,15.7732422527,15.773268013,15.7732937729,15.7733195323,15.7733452913,15.7733710498,15.7733968078,15.7734225654,15.7734483225,15.7734740792,15.7734998354,15.7735255911, 15.7735513464,15.7735771013,15.7736028556,15.7736286095,15.773654363,15.7736801159,15.7737058685,15.7737316205,15.7737573721,15.7737831233,15.773808874,15.7738346242,15.773860374,15.7738861233,15.7739118721,15.7739376205, 15.7739633684,15.7739891159,15.7740148629,15.7740406095,15.7740663556,15.7740921012,15.7741178464,15.7741435911,15.7741693353,15.7741950791,15.7742208224,15.7742465653,15.7742723077,15.7742980497,15.7743237912,15.7743495322, 15.7743752728,15.7744010129,15.7744267526,15.7744524918,15.7744782305,15.7745039688,15.7745297066,15.774555444,15.7745811809,15.7746069173,15.7746326533,15.7746583889,15.7746841239,15.7747098585,15.7747355927,15.7747613264, 15.7747870596,15.7748127924,15.7748385247,15.7748642565,15.7748899879,15.7749157189,15.7749414494,15.7749671794,15.7749929089,15.775018638,15.7750443667,15.7750700949,15.7750958226,15.7751215499,15.7751472767,15.775173003, 15.7751987289,15.7752244543,15.7752501793,15.7752759038,15.7753016279,15.7753273515,15.7753530746,15.7753787973,15.7754045195,15.7754302413,15.7754559626,15.7754816834,15.7755074038,15.7755331237,15.7755588432,15.7755845622, 15.7756102808,15.7756359989,15.7756617165,15.7756874337,15.7757131504,15.7757388666,15.7757645824,15.7757902978,15.7758160127,15.7758417271,15.7758674411,15.7758931546,15.7759188676,15.7759445802,15.7759702924,15.775996004, 15.7760217153,15.776047426,15.7760731363,15.7760988462,15.7761245555,15.7761502645,15.7761759729,15.776201681,15.7762273885,15.7762530956,15.7762788022,15.7763045084,15.7763302141,15.7763559194,15.7763816242,15.7764073286, 15.7764330324,15.7764587359,15.7764844388,15.7765101414,15.7765358434,15.776561545,15.7765872462,15.7766129468,15.7766386471,15.7766643468,15.7766900462,15.776715745,15.7767414434,15.7767671413,15.7767928388,15.7768185358, 15.7768442324,15.7768699285,15.7768956242,15.7769213193,15.7769470141,15.7769727084,15.7769984022,15.7770240955,15.7770497884,15.7770754809,15.7771011729,15.7771268644,15.7771525555,15.7771782461,15.7772039362,15.7772296259, 15.7772553152,15.777281004,15.7773066923,15.7773323802,15.7773580676,15.7773837545,15.777409441,15.7774351271,15.7774608127,15.7774864978,15.7775121825,15.7775378667,15.7775635504,15.7775892337,15.7776149166,15.777640599, 15.7776662809,15.7776919623,15.7777176434,15.7777433239,15.777769004,15.7777946837,15.7778203628,15.7778460416,15.7778717198,15.7778973976,15.777923075,15.7779487519,15.7779744283,15.7780001043,15.7780257799,15.7780514549, 15.7780771295,15.7781028037,15.7781284774,15.7781541506,15.7781798234,15.7782054957,15.7782311676,15.778256839,15.77828251,15.7783081805,15.7783338505,15.7783595201,15.7783851893,15.7784108579,15.7784365262,15.7784621939, 15.7784878612,15.7785135281,15.7785391945,15.7785648604,15.7785905259,15.7786161909,15.7786418555,15.7786675196,15.7786931832,15.7787188464,15.7787445092,15.7787701714,15.7787958333,15.7788214946,15.7788471556,15.778872816, 15.778898476,15.7789241356,15.7789497946,15.7789754533,15.7790011114,15.7790267692,15.7790524264,15.7790780832,15.7791037396,15.7791293955,15.7791550509,15.7791807059,15.7792063604,15.7792320145,15.7792576681,15.7792833213, 15.779308974,15.7793346262,15.779360278,15.7793859293,15.7794115802,15.7794372306,15.7794628806,15.7794885301,15.7795141791,15.7795398277,15.7795654759,15.7795911236,15.7796167708,15.7796424176,15.7796680639,15.7796937097, 15.7797193551,15.7797450001,15.7797706446,15.7797962886,15.7798219322,15.7798475753,15.779873218,15.7798988602,15.779924502,15.7799501433,15.7799757841,15.7800014245,15.7800270644,15.7800527039,15.7800783429,15.7801039815, 15.7801296196,15.7801552573,15.7801808945,15.7802065312,15.7802321675,15.7802578034,15.7802834387,15.7803090737,15.7803347081,15.7803603421,15.7803859757,15.7804116088,15.7804372414,15.7804628736,15.7804885054,15.7805141366, 15.7805397675,15.7805653978,15.7805910278,15.7806166572,15.7806422862,15.7806679148,15.7806935429,15.7807191705,15.7807447977,15.7807704244,15.7807960507,15.7808216765,15.7808473019,15.7808729268,15.7808985512,15.7809241752, 15.7809497987,15.7809754218,15.7810010445,15.7810266666,15.7810522884,15.7810779096,15.7811035304,15.7811291508,15.7811547707,15.7811803901,15.7812060091,15.7812316277,15.7812572457,15.7812828634,15.7813084805,15.7813340973, 15.7813597135,15.7813853293,15.7814109447,15.7814365596,15.781462174,15.781487788,15.7815134015,15.7815390146,15.7815646272,15.7815902394,15.7816158511,15.7816414624,15.7816670732,15.7816926835,15.7817182934,15.7817439029, 15.7817695119,15.7817951204,15.7818207285,15.7818463361,15.7818719433,15.78189755,15.7819231562,15.781948762,15.7819743674,15.7819999723,15.7820255767,15.7820511807,15.7820767842,15.7821023873,15.7821279899,15.7821535921, 15.7821791938,15.7822047951,15.7822303959,15.7822559963,15.7822815961,15.7823071956,15.7823327946,15.7823583931,15.7823839912,15.7824095888,15.782435186,15.7824607827,15.782486379,15.7825119748,15.7825375701,15.782563165, 15.7825887595,15.7826143535,15.782639947,15.7826655401,15.7826911327,15.7827167249,15.7827423166,15.7827679079,15.7827934987,15.7828190891,15.782844679,15.7828702685,15.7828958575,15.782921446,15.7829470341,15.7829726217, 15.7829982089,15.7830237957,15.7830493819,15.7830749678,15.7831005531,15.783126138,15.7831517225,15.7831773065,15.7832028901,15.7832284732,15.7832540558,15.783279638,15.7833052197,15.783330801,15.7833563819,15.7833819622, 15.7834075422,15.7834331216,15.7834587007,15.7834842792,15.7835098573,15.783535435,15.7835610122,15.783586589,15.7836121653,15.7836377411,15.7836633165,15.7836888914,15.7837144659,15.7837400399,15.7837656135,15.7837911866, 15.7838167593,15.7838423315,15.7838679033,15.7838934746,15.7839190455,15.7839446159,15.7839701858,15.7839957553,15.7840213244,15.784046893,15.7840724611,15.7840980288,15.784123596,15.7841491628,15.7841747291,15.784200295, 15.7842258604,15.7842514254,15.7842769899,15.784302554,15.7843281176,15.7843536807,15.7843792434,15.7844048057,15.7844303675,15.7844559288,15.7844814897,15.7845070502,15.7845326101,15.7845581697,15.7845837288,15.7846092874, 15.7846348456,15.7846604033,15.7846859605,15.7847115174,15.7847370737,15.7847626296,15.7847881851,15.7848137401,15.7848392947,15.7848648488,15.7848904024,15.7849159556,15.7849415083,15.7849670606,15.7849926125,15.7850181638, 15.7850437148,15.7850692653,15.7850948153,15.7851203649,15.785145914,15.7851714627,15.7851970109,15.7852225586,15.7852481059,15.7852736528,15.7852991992,15.7853247452,15.7853502907,15.7853758357,15.7854013803,15.7854269245, 15.7854524682,15.7854780114,15.7855035542,15.7855290965,15.7855546384,15.7855801798,15.7856057208,15.7856312614,15.7856568014,15.7856823411,15.7857078802,15.7857334189,15.7857589572,15.785784495,15.7858100324,15.7858355693, 15.7858611058,15.7858866418,15.7859121773,15.7859377124,15.7859632471,15.7859887813,15.786014315,15.7860398483,15.7860653812,15.7860909136,15.7861164455,15.786141977,15.786167508,15.7861930386,15.7862185687,15.7862440984, 15.7862696276,15.7862951564,15.7863206848,15.7863462126,15.78637174,15.786397267,15.7864227935,15.7864483196,15.7864738452,15.7864993704,15.7865248951,15.7865504194,15.7865759432,15.7866014665,15.7866269894,15.7866525119, 15.7866780339,15.7867035554,15.7867290765,15.7867545972,15.7867801174,15.7868056371,15.7868311564,15.7868566753,15.7868821937,15.7869077116,15.7869332291,15.7869587461,15.7869842627,15.7870097789,15.7870352945,15.7870608098, 15.7870863246,15.7871118389,15.7871373528,15.7871628662,15.7871883792,15.7872138917,15.7872394038,15.7872649154,15.7872904266,15.7873159373,15.7873414476,15.7873669574,15.7873924667,15.7874179757,15.7874434841,15.7874689921, 15.7874944997,15.7875200068,15.7875455135,15.7875710197,15.7875965254,15.7876220308,15.7876475356,15.78767304,15.787698544,15.7877240475,15.7877495505,15.7877750531,15.7878005553,15.787826057,15.7878515582,15.787877059, 15.7879025594,15.7879280593,15.7879535587,15.7879790577,15.7880045563,15.7880300544,15.788055552,15.7880810492,15.788106546,15.7881320423,15.7881575381,15.7881830335,15.7882085284,15.7882340229,15.788259517,15.7882850106, 15.7883105037,15.7883359964,15.7883614886,15.7883869804,15.7884124718,15.7884379626,15.7884634531,15.7884889431,15.7885144326,15.7885399217,15.7885654103,15.7885908985,15.7886163863,15.7886418735,15.7886673604,15.7886928468, 15.7887183327,15.7887438182,15.7887693032,15.7887947878,15.7888202719,15.7888457556,15.7888712388,15.7888967216,15.788922204,15.7889476858,15.7889731673,15.7889986483,15.7890241288,15.7890496089,15.7890750885,15.7891005677, 15.7891260464,15.7891515247,15.7891770025,15.7892024799,15.7892279569,15.7892534333,15.7892789094,15.789304385,15.7893298601,15.7893553348,15.789380809,15.7894062828,15.7894317561,15.789457229,15.7894827014,15.7895081734, 15.789533645,15.7895591161,15.7895845867,15.7896100569,15.7896355266,15.7896609959,15.7896864647,15.7897119331,15.7897374011,15.7897628686,15.7897883356,15.7898138022,15.7898392683,15.789864734,15.7898901993,15.789915664, 15.7899411284,15.7899665923,15.7899920557,15.7900175187,15.7900429813,15.7900684434,15.790093905,15.7901193662,15.7901448269,15.7901702872,15.7901957471,15.7902212065,15.7902466654,15.7902721239,15.790297582,15.7903230396, 15.7903484968,15.7903739535,15.7903994097,15.7904248655,15.7904503209,15.7904757758,15.7905012302,15.7905266842,15.7905521378,15.7905775909,15.7906030436,15.7906284958,15.7906539476,15.7906793989,15.7907048497,15.7907303002, 15.7907557501,15.7907811996,15.7908066487,15.7908320973,15.7908575455,15.7908829932,15.7909084405,15.7909338873,15.7909593337,15.7909847796,15.7910102251,15.7910356701,15.7910611147,15.7910865588,15.7911120025,15.7911374458, 15.7911628886,15.7911883309,15.7912137728,15.7912392142,15.7912646552,15.7912900958,15.7913155359,15.7913409755,15.7913664147,15.7913918534,15.7914172917,15.7914427296,15.791468167,15.791493604,15.7915190405,15.7915444765, 15.7915699121,15.7915953473,15.791620782,15.7916462163,15.7916716501,15.7916970834,15.7917225164,15.7917479488,15.7917733809,15.7917988124,15.7918242436,15.7918496742,15.7918751045,15.7919005342,15.7919259636,15.7919513925, 15.7919768209,15.7920022489,15.7920276764,15.7920531035,15.7920785302,15.7921039564,15.7921293821,15.7921548074,15.7921802323,15.7922056567,15.7922310806,15.7922565041,15.7922819272,15.7923073498,15.792332772,15.7923581937, 15.7923836149,15.7924090358,15.7924344561,15.792459876,15.7924852955,15.7925107146,15.7925361331,15.7925615513,15.7925869689,15.7926123862,15.792637803,15.7926632193,15.7926886352,15.7927140507,15.7927394656,15.7927648802, 15.7927902943,15.792815708,15.7928411212,15.7928665339,15.7928919462,15.7929173581,15.7929427695,15.7929681805,15.792993591,15.7930190011,15.7930444107,15.7930698199,15.7930952286,15.7931206369,15.7931460447,15.7931714521, 15.7931968591,15.7932222656,15.7932476716,15.7932730772,15.7932984824,15.7933238871,15.7933492913,15.7933746951,15.7934000985,15.7934255014,15.7934509039,15.7934763059,15.7935017075,15.7935271086,15.7935525093,15.7935779095, 15.7936033093,15.7936287086,15.7936541075,15.7936795059,15.7937049039,15.7937303015,15.7937556986,15.7937810952,15.7938064915,15.7938318872,15.7938572825,15.7938826774,15.7939080718,15.7939334658,15.7939588593,15.7939842524, 15.794009645,15.7940350372,15.7940604289,15.7940858202,15.7941112111,15.7941366015,15.7941619914,15.7941873809,15.79421277,15.7942381586,15.7942635468,15.7942889345,15.7943143217,15.7943397086,15.7943650949,15.7943904809, 15.7944158664,15.7944412514,15.794466636,15.7944920201,15.7945174038,15.7945427871,15.7945681699,15.7945935522,15.7946189341,15.7946443156,15.7946696966,15.7946950772,15.7947204573,15.794745837,15.7947712162,15.794796595, 15.7948219733,15.7948473512,15.7948727287,15.7948981057,15.7949234822,15.7949488583,15.794974234,15.7949996092,15.795024984,15.7950503583,15.7950757322,15.7951011056,15.7951264786,15.7951518511,15.7951772232,15.7952025948, 15.795227966,15.7952533368,15.7952787071,15.7953040769,15.7953294464,15.7953548153,15.7953801838,15.7954055519,15.7954309195,15.7954562867,15.7954816535,15.7955070197,15.7955323856,15.795557751,15.7955831159,15.7956084804, 15.7956338445,15.7956592081,15.7956845713,15.795709934,15.7957352963,15.7957606581,15.7957860195,15.7958113804,15.7958367409,15.795862101,15.7958874606,15.7959128197,15.7959381784,15.7959635367,15.7959888945,15.7960142519, 15.7960396088,15.7960649653,15.7960903213,15.7961156769,15.7961410321,15.7961663868,15.796191741,15.7962170948,15.7962424482,15.7962678011,15.7962931536,15.7963185056,15.7963438572,15.7963692083,15.796394559,15.7964199093, 15.7964452591,15.7964706084,15.7964959573,15.7965213058,15.7965466538,15.7965720014,15.7965973485,15.7966226952,15.7966480414,15.7966733872,15.7966987325,15.7967240774,15.7967494219,15.7967747659,15.7968001095,15.7968254526, 15.7968507953,15.7968761375,15.7969014793,15.7969268206,15.7969521615,15.796977502,15.797002842,15.7970281815,15.7970535206,15.7970788593,15.7971041975,15.7971295353,15.7971548726,15.7971802095,15.797205546,15.797230882, 15.7972562175,15.7972815526,15.7973068873,15.7973322215,15.7973575553,15.7973828886,15.7974082215,15.7974335539,15.7974588859,15.7974842175,15.7975095486,15.7975348792,15.7975602094,15.7975855392,15.7976108685,15.7976361974, 15.7976615259,15.7976868538,15.7977121814,15.7977375085,15.7977628352,15.7977881614,15.7978134871,15.7978388125,15.7978641373,15.7978894618,15.7979147858,15.7979401093,15.7979654324,15.7979907551,15.7980160773,15.798041399, 15.7980667204,15.7980920412,15.7981173617,15.7981426817,15.7981680012,15.7981933203,15.798218639,15.7982439572,15.7982692749,15.7982945923,15.7983199092,15.7983452256,15.7983705416,15.7983958571,15.7984211722,15.7984464869, 15.7984718011,15.7984971149,15.7985224282,15.7985477411,15.7985730535,15.7985983655,15.7986236771,15.7986489882,15.7986742988,15.798699609,15.7987249188,15.7987502281,15.798775537,15.7988008455,15.7988261535,15.798851461, 15.7988767681,15.7989020748,15.798927381,15.7989526868,15.7989779921,15.799003297,15.7990286015,15.7990539055,15.799079209,15.7991045121,15.7991298148,15.799155117,15.7991804188,15.7992057202,15.7992310211,15.7992563215, 15.7992816215,15.7993069211,15.7993322202,15.7993575189,15.7993828171,15.7994081149,15.7994334123,15.7994587092,15.7994840056,15.7995093016,15.7995345972,15.7995598923,15.799585187,15.7996104813,15.7996357751,15.7996610684, 15.7996863613,15.7997116538,15.7997369458,15.7997622374,15.7997875285,15.7998128192,15.7998381095,15.7998633993,15.7998886887,15.7999139776,15.7999392661,15.7999645541,15.7999898417,15.8000151288,15.8000404155,15.8000657018, 15.8000909876,15.800116273,15.8001415579,15.8001668424,15.8001921265,15.8002174101,15.8002426932,15.8002679759,15.8002932582,15.8003185401,15.8003438214,15.8003691024,15.8003943829,15.8004196629,15.8004449426,15.8004702217, 15.8004955005,15.8005207788,15.8005460566,15.800571334,15.800596611,15.8006218875,15.8006471635,15.8006724392,15.8006977144,15.8007229891,15.8007482634,15.8007735373,15.8007988107,15.8008240837,15.8008493562,15.8008746283, 15.8008998999,15.8009251711,15.8009504419,15.8009757122,15.8010009821,15.8010262515,15.8010515205,15.801076789,15.8011020571,15.8011273248,15.801152592,15.8011778588,15.8012031251,15.801228391,15.8012536565,15.8012789215, 15.801304186,15.8013294502,15.8013547139,15.8013799771,15.8014052399,15.8014305022,15.8014557641,15.8014810256,15.8015062866,15.8015315472,15.8015568074,15.8015820671,15.8016073263,15.8016325851,15.8016578435,15.8016831014, 15.8017083589,15.801733616,15.8017588726,15.8017841287,15.8018093844,15.8018346397,15.8018598946,15.8018851489,15.8019104029,15.8019356564,15.8019609095,15.8019861621,15.8020114143,15.802036666,15.8020619173,15.8020871682, 15.8021124186,15.8021376686,15.8021629181,15.8021881672,15.8022134158,15.802238664,15.8022639118,15.8022891591,15.802314406,15.8023396524,15.8023648984,15.802390144,15.8024153891,15.8024406338,15.802465878,15.8024911218, 15.8025163651,15.802541608,15.8025668505,15.8025920925,15.8026173341,15.8026425752,15.8026678159,15.8026930562,15.802718296,15.8027435354,15.8027687743,15.8027940128,15.8028192508,15.8028444884,15.8028697256,15.8028949623, 15.8029201986,15.8029454344,15.8029706698,15.8029959048,15.8030211393,15.8030463734,15.803071607,15.8030968402,15.8031220729,15.8031473052,15.8031725371,15.8031977685,15.8032229995,15.8032482301,15.8032734602,15.8032986898, 15.803323919,15.8033491478,15.8033743762,15.8033996041,15.8034248315,15.8034500585,15.8034752851,15.8035005112,15.8035257369,15.8035509622,15.803576187,15.8036014113,15.8036266353,15.8036518587,15.8036770818,15.8037023044, 15.8037275266,15.8037527483,15.8037779696,15.8038031904,15.8038284108,15.8038536307,15.8038788503,15.8039040693,15.803929288,15.8039545062,15.8039797239,15.8040049412,15.8040301581,15.8040553745,15.8040805905,15.8041058061, 15.8041310212,15.8041562359,15.8041814501,15.8042066639,15.8042318772,15.8042570901,15.8042823026,15.8043075146,15.8043327262,15.8043579373,15.804383148,15.8044083583,15.8044335681,15.8044587775,15.8044839864,15.8045091949, 15.804534403,15.8045596106,15.8045848178,15.8046100245,15.8046352308,15.8046604367,15.8046856421,15.8047108471,15.8047360516,15.8047612557,15.8047864594,15.8048116626,15.8048368654,15.8048620677,15.8048872696,15.804912471, 15.8049376721,15.8049628726,15.8049880728,15.8050132725,15.8050384717,15.8050636705,15.8050888689,15.8051140668,15.8051392643,15.8051644614,15.805189658,15.8052148542,15.8052400499,15.8052652452,15.80529044,15.8053156344, 15.8053408284,15.8053660219,15.805391215,15.8054164077,15.8054415999,15.8054667917,15.805491983,15.8055171739,15.8055423644,15.8055675544,15.8055927439,15.8056179331,15.8056431218,15.80566831,15.8056934978,15.8057186852, 15.8057438722,15.8057690586,15.8057942447,15.8058194303,15.8058446155,15.8058698002,15.8058949845,15.8059201684,15.8059453518,15.8059705348,15.8059957173,15.8060208994,15.8060460811,15.8060712623,15.8060964431,15.8061216234, 15.8061468033,15.8061719828,15.8061971618,15.8062223404,15.8062475185,15.8062726962,15.8062978735,15.8063230503,15.8063482267,15.8063734027,15.8063985782,15.8064237532,15.8064489279,15.8064741021,15.8064992758,15.8065244491, 15.806549622,15.8065747944,15.8065999664,15.806625138,15.8066503091,15.8066754798,15.80670065,15.8067258198,15.8067509891,15.8067761581,15.8068013265,15.8068264946,15.8068516622,15.8068768294,15.8069019961,15.8069271624, 15.8069523282,15.8069774936,15.8070026586,15.8070278231,15.8070529872,15.8070781509,15.8071033141,15.8071284768,15.8071536392,15.8071788011,15.8072039625,15.8072291235,15.8072542841,15.8072794443,15.807304604,15.8073297632, 15.8073549221,15.8073800804,15.8074052384,15.8074303959,15.807455553,15.8074807096,15.8075058658,15.8075310215,15.8075561769,15.8075813317,15.8076064862,15.8076316402,15.8076567937,15.8076819469,15.8077070995,15.8077322518, 15.8077574036,15.807782555,15.8078077059,15.8078328564,15.8078580064,15.807883156,15.8079083052,15.807933454,15.8079586023,15.8079837501,15.8080088975,15.8080340445,15.8080591911,15.8080843372,15.8081094828,15.8081346281, 15.8081597729,15.8081849172,15.8082100611,15.8082352046,15.8082603477,15.8082854903,15.8083106324,15.8083357741,15.8083609154,15.8083860563,15.8084111967,15.8084363367,15.8084614762,15.8084866153,15.808511754,15.8085368922, 15.80856203,15.8085871673,15.8086123042,15.8086374407,15.8086625767,15.8086877123,15.8087128475,15.8087379822,15.8087631165,15.8087882503,15.8088133837,15.8088385167,15.8088636492,15.8088887813,15.8089139129,15.8089390441, 15.8089641749,15.8089893053,15.8090144352,15.8090395646,15.8090646936,15.8090898222,15.8091149504,15.8091400781,15.8091652054,15.8091903322,15.8092154586,15.8092405846,15.8092657101,15.8092908352,15.8093159598,15.809341084, 15.8093662078,15.8093913312,15.8094164541,15.8094415765,15.8094666985,15.8094918201,15.8095169413,15.809542062,15.8095671823,15.8095923021,15.8096174215,15.8096425405,15.809667659,15.8096927771,15.8097178947,15.8097430119, 15.8097681287,15.809793245,15.809818361,15.8098434764,15.8098685914,15.809893706,15.8099188202,15.8099439339,15.8099690472,15.80999416,15.8100192724,15.8100443844,15.8100694959,15.810094607,15.8101197177,15.8101448279, 15.8101699377,15.810195047,15.8102201559,15.8102452644,15.8102703724,15.81029548,15.8103205872,15.8103456939,15.8103708002,15.810395906,15.8104210114,15.8104461164,15.810471221,15.8104963251,15.8105214287,15.810546532, 15.8105716347,15.8105967371,15.810621839,15.8106469405,15.8106720415,15.8106971421,15.8107222423,15.810747342,15.8107724413,15.8107975402,15.8108226386,15.8108477366,15.8108728342,15.8108979313,15.810923028,15.8109481242, 15.81097322,15.8109983154,15.8110234103,15.8110485048,15.8110735989,15.8110986925,15.8111237857,15.8111488784,15.8111739707,15.8111990626,15.811224154,15.811249245,15.8112743356,15.8112994257,15.8113245154,15.8113496047, 15.8113746935,15.8113997819,15.8114248698,15.8114499574,15.8114750444,15.8115001311,15.8115252173,15.811550303,15.8115753884,15.8116004733,15.8116255577,15.8116506418,15.8116757253,15.8117008085,15.8117258912,15.8117509735, 15.8117760553,15.8118011367,15.8118262177,15.8118512982,15.8118763783,15.811901458,15.8119265372,15.811951616,15.8119766944,15.8120017723,15.8120268498,15.8120519268,15.8120770034,15.8121020796,15.8121271553,15.8121522306, 15.8121773055,15.8122023799,15.8122274539,15.8122525275,15.8122776006,15.8123026733,15.8123277456,15.8123528174,15.8123778888,15.8124029597,15.8124280302,15.8124531003,15.8124781699,15.8125032391,15.8125283079,15.8125533762, 15.8125784441,15.8126035116,15.8126285786,15.8126536452,15.8126787114,15.8127037771,15.8127288424,15.8127539072,15.8127789716,15.8128040356,15.8128290991,15.8128541623,15.8128792249,15.8129042872,15.812929349,15.8129544103, 15.8129794713,15.8130045317,15.8130295918,15.8130546514,15.8130797106,15.8131047694,15.8131298277,15.8131548856,15.813179943,15.813205,15.8132300566,15.8132551127,15.8132801685,15.8133052237,15.8133302786,15.813355333, 15.8133803869,15.8134054405,15.8134304936,15.8134555462,15.8134805984,15.8135056502,15.8135307016,15.8135557525,15.813580803,15.813605853,15.8136309027,15.8136559518,15.8136810006,15.8137060489,15.8137310968,15.8137561442, 15.8137811912,15.8138062378,15.8138312839,15.8138563296,15.8138813749,15.8139064197,15.8139314641,15.8139565081,15.8139815516,15.8140065947,15.8140316374,15.8140566796,15.8140817214,15.8141067627,15.8141318037,15.8141568441, 15.8141818842,15.8142069238,15.814231963,15.8142570017,15.81428204,15.8143070779,15.8143321154,15.8143571524,15.814382189,15.8144072251,15.8144322608,15.8144572961,15.8144823309,15.8145073653,15.8145323993,15.8145574328, 15.8145824659,15.8146074986,15.8146325308,15.8146575626,15.814682594,15.8147076249,15.8147326554,15.8147576854,15.8147827151,15.8148077443,15.814832773,15.8148578013,15.8148828292,15.8149078567,15.8149328837,15.8149579103, 15.8149829364,15.8150079621,15.8150329874,15.8150580123,15.8150830367,15.8151080607,15.8151330842,15.8151581073,15.81518313,15.8152081523,15.8152331741,15.8152581954,15.8152832164,15.8153082369,15.815333257,15.8153582766, 15.8153832958,15.8154083146,15.8154333329,15.8154583508,15.8154833683,15.8155083853,15.8155334019,15.8155584181,15.8155834339,15.8156084492,15.815633464,15.8156584785,15.8156834925,15.815708506,15.8157335192,15.8157585319, 15.8157835441,15.815808556,15.8158335674,15.8158585783,15.8158835889,15.815908599,15.8159336086,15.8159586179,15.8159836267,15.816008635,15.8160336429,15.8160586504,15.8160836575,15.8161086641,15.8161336703,15.8161586761, 15.8161836814,15.8162086863,15.8162336908,15.8162586948,15.8162836984,15.8163087016,15.8163337043,15.8163587066,15.8163837085,15.8164087099,15.8164337109,15.8164587115,15.8164837116,15.8165087113,15.8165337106,15.8165587094, 15.8165837078,15.8166087058,15.8166337033,15.8166587004,15.816683697,15.8167086933,15.8167336891,15.8167586844,15.8167836794,15.8168086739,15.8168336679,15.8168586616,15.8168836548,15.8169086475,15.8169336399,15.8169586318, 15.8169836233,15.8170086143,15.8170336049,15.8170585951,15.8170835848,15.8171085741,15.817133563,15.8171585514,15.8171835394,15.817208527,15.8172335141,15.8172585008,15.8172834871,15.817308473,15.8173334584,15.8173584434, 15.8173834279,15.817408412,15.8174333957,15.8174583789,15.8174833617,15.8175083441,15.8175333261,15.8175583076,15.8175832887,15.8176082693,15.8176332495,15.8176582293,15.8176832087,15.8177081876,15.8177331661,15.8177581442, 15.8177831218,15.817808099,15.8178330757,15.8178580521,15.8178830279,15.8179080034,15.8179329784,15.817957953,15.8179829272,15.8180079009,15.8180328742,15.8180578471,15.8180828195,15.8181077915,15.8181327631,15.8181577342, 15.8181827049,15.8182076752,15.8182326451,15.8182576145,15.8182825835,15.818307552,15.8183325201,15.8183574878,15.818382455,15.8184074219,15.8184323882,15.8184573542,15.8184823197,15.8185072848,15.8185322495,15.8185572137, 15.8185821775,15.8186071408,15.8186321038,15.8186570663,15.8186820283,15.81870699,15.8187319512,15.8187569119,15.8187818723,15.8188068322,15.8188317917,15.8188567507,15.8188817093,15.8189066675,15.8189316252,15.8189565825, 15.8189815394,15.8190064959,15.8190314519,15.8190564075,15.8190813626,15.8191063174,15.8191312717,15.8191562255,15.819181179,15.819206132,15.8192310845,15.8192560367,15.8192809884,15.8193059396,15.8193308905,15.8193558409, 15.8193807909,15.8194057404,15.8194306895,15.8194556382,15.8194805865,15.8195055343,15.8195304817,15.8195554286,15.8195803752,15.8196053213,15.8196302669,15.8196552121,15.8196801569,15.8197051013,15.8197300453,15.8197549888, 15.8197799318,15.8198048745,15.8198298167,15.8198547585,15.8198796998,15.8199046407,15.8199295812,15.8199545213,15.8199794609,15.8200044001,15.8200293389,15.8200542772,15.8200792151,15.8201041526,15.8201290896,15.8201540262, 15.8201789624,15.8202038982,15.8202288335,15.8202537684,15.8202787028,15.8203036368,15.8203285704,15.8203535036,15.8203784363,15.8204033686,15.8204283005,15.8204532319,15.8204781629,15.8205030935,15.8205280237,15.8205529534, 15.8205778827,15.8206028115,15.8206277399,15.8206526679,15.8206775955,15.8207025226,15.8207274493,15.8207523756,15.8207773014,15.8208022268,15.8208271518,15.8208520763,15.8208770005,15.8209019241,15.8209268474,15.8209517702, 15.8209766926,15.8210016146,15.8210265361,15.8210514572,15.8210763779,15.8211012981,15.8211262179,15.8211511373,15.8211760563,15.8212009748,15.8212258929,15.8212508105,15.8212757278,15.8213006446,15.8213255609,15.8213504769, 15.8213753924,15.8214003074,15.8214252221,15.8214501363,15.8214750501,15.8214999635,15.8215248764,15.8215497889,15.8215747009,15.8215996126,15.8216245238,15.8216494346,15.8216743449,15.8216992548,15.8217241643,15.8217490733, 15.821773982,15.8217988902,15.8218237979,15.8218487053,15.8218736122,15.8218985186,15.8219234247,15.8219483303,15.8219732355,15.8219981402,15.8220230446,15.8220479485,15.8220728519,15.822097755,15.8221226576,15.8221475597, 15.8221724615,15.8221973628,15.8222222637,15.8222471641,15.8222720642,15.8222969638,15.8223218629,15.8223467617,15.82237166,15.8223965578,15.8224214553,15.8224463523,15.8224712489,15.8224961451,15.8225210408,15.8225459361, 15.822570831,15.8225957254,15.8226206194,15.822645513,15.8226704061,15.8226952989,15.8227201911,15.822745083,15.8227699744,15.8227948654,15.822819756,15.8228446462,15.8228695359,15.8228944252,15.822919314,15.8229442025, 15.8229690905,15.822993978,15.8230188652,15.8230437519,15.8230686382,15.823093524,15.8231184094,15.8231432944,15.823168179,15.8231930631,15.8232179468,15.8232428301,15.8232677129,15.8232925954,15.8233174774,15.8233423589, 15.82336724,15.8233921207,15.823417001,15.8234418809,15.8234667603,15.8234916393,15.8235165178,15.8235413959,15.8235662736,15.8235911509,15.8236160278,15.8236409042,15.8236657801,15.8236906557,15.8237155308,15.8237404055, 15.8237652798,15.8237901536,15.823815027,15.8238399,15.8238647726,15.8238896447,15.8239145164,15.8239393877,15.8239642585,15.8239891289,15.8240139989,15.8240388684,15.8240637375,15.8240886062,15.8241134745,15.8241383423, 15.8241632097,15.8241880767,15.8242129433,15.8242378094,15.8242626751,15.8242875403,15.8243124052,15.8243372696,15.8243621336,15.8243869971,15.8244118602,15.8244367229,15.8244615852,15.824486447,15.8245113084,15.8245361694, 15.82456103,15.8245858901,15.8246107498,15.8246356091,15.8246604679,15.8246853263,15.8247101843,15.8247350418,15.824759899,15.8247847556,15.8248096119,15.8248344678,15.8248593232,15.8248841781,15.8249090327,15.8249338868, 15.8249587405,15.8249835938,15.8250084466,15.8250332991,15.825058151,15.8250830026,15.8251078537,15.8251327044,15.8251575547,15.8251824045,15.825207254,15.825232103,15.8252569515,15.8252817996,15.8253066474,15.8253314946, 15.8253563415,15.8253811879,15.8254060339,15.8254308795,15.8254557246,15.8254805693,15.8255054136,15.8255302574,15.8255551009,15.8255799439,15.8256047864,15.8256296286,15.8256544703,15.8256793116,15.8257041524,15.8257289929, 15.8257538329,15.8257786725,15.8258035116,15.8258283503,15.8258531886,15.8258780265,15.8259028639,15.8259277009,15.8259525375,15.8259773737,15.8260022094,15.8260270447,15.8260518796,15.826076714,15.826101548,15.8261263816, 15.8261512148,15.8261760475,15.8262008798,15.8262257117,15.8262505432,15.8262753742,15.8263002048,15.826325035,15.8263498647,15.826374694,15.8263995229,15.8264243514,15.8264491794,15.826474007,15.8264988342,15.826523661, 15.8265484873,15.8265733132,15.8265981387,15.8266229637,15.8266477883,15.8266726125,15.8266974363,15.8267222596,15.8267470825,15.826771905,15.8267967271,15.8268215487,15.8268463699,15.8268711907,15.826896011,15.8269208309, 15.8269456504,15.8269704695,15.8269952881,15.8270201063,15.8270449241,15.8270697415,15.8270945584,15.8271193749,15.827144191,15.8271690066,15.8271938219,15.8272186367,15.827243451,15.827268265,15.8272930785,15.8273178916, 15.8273427042,15.8273675165,15.8273923283,15.8274171397,15.8274419506,15.8274667611,15.8274915712,15.8275163809,15.8275411902,15.827565999,15.8275908074,15.8276156154,15.8276404229,15.82766523,15.8276900367,15.827714843, 15.8277396488,15.8277644542,15.8277892592,15.8278140638,15.8278388679,15.8278636716,15.8278884749,15.8279132777,15.8279380801,15.8279628821,15.8279876837,15.8280124849,15.8280372856,15.8280620859,15.8280868857,15.8281116852, 15.8281364842,15.8281612828,15.8281860809,15.8282108787,15.828235676,15.8282604729,15.8282852693,15.8283100654,15.828334861,15.8283596561,15.8283844509,15.8284092452,15.8284340391,15.8284588326,15.8284836256,15.8285084183, 15.8285332105,15.8285580022,15.8285827936,15.8286075845,15.828632375,15.828657165,15.8286819547,15.8287067439,15.8287315327,15.828756321,15.828781109,15.8288058965,15.8288306836,15.8288554702,15.8288802565,15.8289050423, 15.8289298277,15.8289546126,15.8289793971,15.8290041812,15.8290289649,15.8290537482,15.829078531,15.8291033134,15.8291280954,15.8291528769,15.829177658,15.8292024387,15.829227219,15.8292519989,15.8292767783,15.8293015573, 15.8293263358,15.829351114,15.8293758917,15.829400669,15.8294254459,15.8294502223,15.8294749983,15.8294997739,15.8295245491,15.8295493238,15.8295740981,15.829598872,15.8296236455,15.8296484185,15.8296731911,15.8296979633, 15.8297227351,15.8297475064,15.8297722773,15.8297970478,15.8298218179,15.8298465875,15.8298713567,15.8298961255,15.8299208939,15.8299456618,15.8299704293,15.8299951964,15.8300199631,15.8300447293,15.8300694951,15.8300942605, 15.8301190254,15.83014379,15.8301685541,15.8301933178,15.830218081,15.8302428439,15.8302676063,15.8302923683,15.8303171298,15.8303418909,15.8303666517,15.8303914119,15.8304161718,15.8304409312,15.8304656902,15.8304904488, 15.830515207,15.8305399647,15.830564722,15.8305894789,15.8306142354,15.8306389914,15.830663747,15.8306885022,15.830713257,15.8307380113,15.8307627652,15.8307875187,15.8308122717,15.8308370244,15.8308617766,15.8308865284, 15.8309112797,15.8309360307,15.8309607812,15.8309855313,15.8310102809,15.8310350302,15.831059779,15.8310845274,15.8311092754,15.8311340229,15.83115877,15.8311835167,15.831208263,15.8312330088,15.8312577542,15.8312824992, 15.8313072438,15.8313319879,15.8313567317,15.831381475,15.8314062178,15.8314309603,15.8314557023,15.8314804439,15.8315051851,15.8315299258,15.8315546662,15.8315794061,15.8316041455,15.8316288846,15.8316536232,15.8316783614, 15.8317030992,15.8317278366,15.8317525735,15.83177731,15.8318020461,15.8318267818,15.831851517,15.8318762518,15.8319009862,15.8319257202,15.8319504537,15.8319751868,15.8319999195,15.8320246518,15.8320493836,15.832074115, 15.832098846,15.8321235766,15.8321483068,15.8321730365,15.8321977658,15.8322224947,15.8322472231,15.8322719511,15.8322966787,15.8323214059,15.8323461327,15.832370859,15.8323955849,15.8324203104,15.8324450355,15.8324697601, 15.8324944843,15.8325192081,15.8325439315,15.8325686544,15.832593377,15.8326180991,15.8326428207,15.832667542,15.8326922628,15.8327169832,15.8327417032,15.8327664227,15.8327911419,15.8328158606,15.8328405789,15.8328652967, 15.8328900142,15.8329147312,15.8329394478,15.8329641639,15.8329888797,15.833013595,15.8330383099,15.8330630244,15.8330877384,15.833112452,15.8331371653,15.833161878,15.8331865904,15.8332113023,15.8332360138,15.8332607249, 15.8332854356,15.8333101458,15.8333348556,15.833359565,15.833384274,15.8334089826,15.8334336907,15.8334583984,15.8334831057,15.8335078125,15.8335325189,15.833557225,15.8335819305,15.8336066357,15.8336313404,15.8336560448, 15.8336807487,15.8337054521,15.8337301552,15.8337548578,15.83377956,15.8338042618,15.8338289631,15.8338536641,15.8338783646,15.8339030647,15.8339277643,15.8339524636,15.8339771624,15.8340018608,15.8340265588,15.8340512563, 15.8340759534,15.8341006501,15.8341253464,15.8341500423,15.8341747377,15.8341994327,15.8342241273,15.8342488215,15.8342735152,15.8342982086,15.8343229015,15.8343475939,15.834372286,15.8343969776,15.8344216688,15.8344463596, 15.83447105,15.8344957399,15.8345204294,15.8345451185,15.8345698072,15.8345944955,15.8346191833,15.8346438707,15.8346685577,15.8346932443,15.8347179304,15.8347426161,15.8347673014,15.8347919863,15.8348166707,15.8348413548, 15.8348660384,15.8348907215,15.8349154043,15.8349400866,15.8349647686,15.8349894501,15.8350141311,15.8350388118,15.835063492,15.8350881718,15.8351128512,15.8351375302,15.8351622087,15.8351868868,15.8352115645,15.8352362418, 15.8352609186,15.8352855951,15.8353102711,15.8353349466,15.8353596218,15.8353842965,15.8354089709,15.8354336448,15.8354583182,15.8354829913,15.8355076639,15.8355323361,15.8355570079,15.8355816793,15.8356063502,15.8356310207, 15.8356556908,15.8356803605,15.8357050298,15.8357296986,15.835754367,15.835779035,15.8358037026,15.8358283697,15.8358530364,15.8358777027,15.8359023686,15.8359270341,15.8359516991,15.8359763637,15.8360010279,15.8360256917, 15.8360503551,15.836075018,15.8360996805,15.8361243426,15.8361490042,15.8361736655,15.8361983263,15.8362229867,15.8362476467,15.8362723062,15.8362969654,15.8363216241,15.8363462824,15.8363709403,15.8363955977,15.8364202547, 15.8364449113,15.8364695675,15.8364942233,15.8365188786,15.8365435336,15.8365681881,15.8365928421,15.8366174958,15.836642149,15.8366668018,15.8366914542,15.8367161062,15.8367407578,15.8367654089,15.8367900596,15.8368147099, 15.8368393597,15.8368640092,15.8368886582,15.8369133068,15.836937955,15.8369626028,15.8369872501,15.837011897,15.8370365435,15.8370611896,15.8370858352,15.8371104805,15.8371351253,15.8371597697,15.8371844137,15.8372090572, 15.8372337003,15.837258343,15.8372829853,15.8373076272,15.8373322686,15.8373569097,15.8373815503,15.8374061905,15.8374308302,15.8374554696,15.8374801085,15.837504747,15.8375293851,15.8375540227,15.83757866,15.8376032968, 15.8376279332,15.8376525691,15.8376772047,15.8377018398,15.8377264745,15.8377511088,15.8377757427,15.8378003762,15.8378250092,15.8378496418,15.837874274,15.8378989058,15.8379235371,15.837948168,15.8379727986,15.8379974286, 15.8380220583,15.8380466876,15.8380713164,15.8380959448,15.8381205728,15.8381452003,15.8381698275,15.8381944542,15.8382190805,15.8382437064,15.8382683318,15.8382929569,15.8383175815,15.8383422057,15.8383668295,15.8383914529, 15.8384160758,15.8384406983,15.8384653204,15.8384899421,15.8385145634,15.8385391842,15.8385638046,15.8385884246,15.8386130442,15.8386376634,15.8386622821,15.8386869004,15.8387115183,15.8387361358,15.8387607529,15.8387853695, 15.8388099857,15.8388346015,15.8388592169,15.8388838318,15.8389084464,15.8389330605,15.8389576742,15.8389822875,15.8390069003,15.8390315128,15.8390561248,15.8390807364,15.8391053476,15.8391299583,15.8391545687,15.8391791786, 15.8392037881,15.8392283972,15.8392530058,15.8392776141,15.8393022219,15.8393268293,15.8393514363,15.8393760428,15.839400649,15.8394252547,15.83944986,15.8394744649,15.8394990694,15.8395236734,15.839548277,15.8395728802, 15.839597483,15.8396220854,15.8396466873,15.8396712889,15.83969589,15.8397204907,15.8397450909,15.8397696908,15.8397942902,15.8398188892,15.8398434878,15.839868086,15.8398926837,15.8399172811,15.839941878,15.8399664745, 15.8399910705,15.8400156662,15.8400402614,15.8400648562,15.8400894506,15.8401140446,15.8401386382,15.8401632313,15.840187824,15.8402124163,15.8402370082,15.8402615997,15.8402861907,15.8403107814,15.8403353716,15.8403599613, 15.8403845507,15.8404091397,15.8404337282,15.8404583163,15.840482904,15.8405074913,15.8405320781,15.8405566645,15.8405812506,15.8406058362,15.8406304213,15.8406550061,15.8406795904,15.8407041743,15.8407287578,15.8407533409, 15.8407779236,15.8408025058,15.8408270877,15.8408516691,15.8408762501,15.8409008306,15.8409254108,15.8409499905,15.8409745698,15.8409991487,15.8410237272,15.8410483052,15.8410728829,15.8410974601,15.8411220369,15.8411466133, 15.8411711892,15.8411957648,15.8412203399,15.8412449146,15.8412694889,15.8412940628,15.8413186362,15.8413432093,15.8413677819,15.8413923541,15.8414169259,15.8414414972,15.8414660682,15.8414906387,15.8415152088,15.8415397785, 15.8415643477,15.8415889166,15.841613485,15.841638053,15.8416626206,15.8416871878,15.8417117545,15.8417363209,15.8417608868,15.8417854523,15.8418100174,15.841834582,15.8418591463,15.8418837101,15.8419082735,15.8419328365, 15.8419573991,15.8419819613,15.842006523,15.8420310843,15.8420556452,15.8420802057,15.8421047658,15.8421293254,15.8421538846,15.8421784434,15.8422030018,15.8422275598,15.8422521174,15.8422766745,15.8423012312,15.8423257875, 15.8423503434,15.8423748989,15.8423994539,15.8424240086,15.8424485628,15.8424731166,15.8424976699,15.8425222229,15.8425467754,15.8425713276,15.8425958793,15.8426204306,15.8426449814,15.8426695319,15.8426940819,15.8427186315, 15.8427431807,15.8427677295,15.8427922779,15.8428168258,15.8428413733,15.8428659205,15.8428904672,15.8429150134,15.8429395593,15.8429641047,15.8429886497,15.8430131944,15.8430377385,15.8430622823,15.8430868257,15.8431113686, 15.8431359111,15.8431604532,15.8431849949,15.8432095362,15.843234077,15.8432586174,15.8432831574,15.843307697,15.8433322362,15.843356775,15.8433813133,15.8434058512,15.8434303888,15.8434549258,15.8434794625,15.8435039988, 15.8435285346,15.84355307,15.843577605,15.8436021396,15.8436266738,15.8436512075,15.8436757409,15.8437002738,15.8437248063,15.8437493384,15.84377387,15.8437984013,15.8438229321,15.8438474625,15.8438719925,15.8438965221, 15.8439210513,15.84394558,15.8439701084,15.8439946363,15.8440191638,15.8440436909,15.8440682175,15.8440927438,15.8441172696,15.844141795,15.84416632,15.8441908446,15.8442153687,15.8442398925,15.8442644158,15.8442889387, 15.8443134612,15.8443379833,15.8443625049,15.8443870262,15.844411547,15.8444360674,15.8444605874,15.844485107,15.8445096261,15.8445341449,15.8445586632,15.8445831811,15.8446076986,15.8446322157,15.8446567323,15.8446812486, 15.8447057644,15.8447302798,15.8447547948,15.8447793094,15.8448038235,15.8448283373,15.8448528506,15.8448773635,15.844901876,15.8449263881,15.8449508998,15.844975411,15.8449999218,15.8450244322,15.8450489422,15.8450734518, 15.845097961,15.8451224697,15.845146978,15.845171486,15.8451959935,15.8452205005,15.8452450072,15.8452695134,15.8452940193,15.8453185247,15.8453430297,15.8453675343,15.8453920384,15.8454165422,15.8454410455,15.8454655484, 15.8454900509,15.845514553,15.8455390547,15.845563556,15.8455880568,15.8456125572,15.8456370572,15.8456615568,15.845686056,15.8457105547,15.8457350531,15.845759551,15.8457840485,15.8458085456,15.8458330423,15.8458575385, 15.8458820344,15.8459065298,15.8459310248,15.8459555194,15.8459800136,15.8460045074,15.8460290007,15.8460534937,15.8460779862,15.8461024783,15.84612697,15.8461514612,15.8461759521,15.8462004425,15.8462249325,15.8462494222, 15.8462739113,15.8462984001,15.8463228885,15.8463473764,15.846371864,15.8463963511,15.8464208378,15.8464453241,15.8464698099,15.8464942954,15.8465187804,15.846543265,15.8465677492,15.846592233,15.8466167164,15.8466411994, 15.8466656819,15.846690164,15.8467146457,15.846739127,15.8467636079,15.8467880884,15.8468125684,15.8468370481,15.8468615273,15.8468860061,15.8469104845,15.8469349625,15.84695944,15.8469839172,15.8470083939,15.8470328702, 15.8470573461,15.8470818216,15.8471062966,15.8471307713,15.8471552455,15.8471797193,15.8472041928,15.8472286657,15.8472531383,15.8472776105,15.8473020822,15.8473265536,15.8473510245,15.847375495,15.8473999651,15.8474244347, 15.847448904,15.8474733728,15.8474978412,15.8475223093,15.8475467769,15.847571244,15.8475957108,15.8476201771,15.8476446431,15.8476691086,15.8476935737,15.8477180384,15.8477425027,15.8477669665,15.84779143,15.847815893, 15.8478403556,15.8478648178,15.8478892796,15.847913741,15.8479382019,15.8479626625,15.8479871226,15.8480115823,15.8480360416,15.8480605005,15.848084959,15.848109417,15.8481338747,15.8481583319,15.8481827887,15.8482072451, 15.8482317011,15.8482561567,15.8482806118,15.8483050666,15.8483295209,15.8483539748,15.8483784283,15.8484028814,15.848427334,15.8484517863,15.8484762381,15.8485006895,15.8485251405,15.8485495911,15.8485740413,15.8485984911, 15.8486229404,15.8486473894,15.8486718379,15.848696286,15.8487207337,15.848745181,15.8487696278,15.8487940743,15.8488185203,15.8488429659,15.8488674111,15.8488918559,15.8489163003,15.8489407443,15.8489651878,15.848989631, 15.8490140737,15.849038516,15.8490629579,15.8490873994,15.8491118404,15.8491362811,15.8491607213,15.8491851612,15.8492096006,15.8492340396,15.8492584781,15.8492829163,15.8493073541,15.8493317914,15.8493562283,15.8493806648, 15.8494051009,15.8494295366,15.8494539719,15.8494784068,15.8495028412,15.8495272752,15.8495517088,15.849576142,15.8496005748,15.8496250072,15.8496494392,15.8496738707,15.8496983019,15.8497227326,15.8497471629,15.8497715928, 15.8497960222,15.8498204513,15.84984488,15.8498693082,15.849893736,15.8499181634,15.8499425904,15.849967017,15.8499914432,15.8500158689,15.8500402943,15.8500647192,15.8500891437,15.8501135678,15.8501379915,15.8501624148, 15.8501868376,15.8502112601,15.8502356821,15.8502601037,15.850284525,15.8503089458,15.8503333661,15.8503577861,15.8503822057,15.8504066248,15.8504310435,15.8504554618,15.8504798797,15.8505042972,15.8505287143,15.850553131, 15.8505775472,15.850601963,15.8506263785,15.8506507935,15.8506752081,15.8506996222,15.850724036,15.8507484494,15.8507728623,15.8507972748,15.850821687,15.8508460987,15.85087051,15.8508949208,15.8509193313,15.8509437413, 15.850968151,15.8509925602,15.851016969,15.8510413774,15.8510657854,15.851090193,15.8511146001,15.8511390069,15.8511634132,15.8511878191,15.8512122247,15.8512366297,15.8512610344,15.8512854387,15.8513098426,15.851334246, 15.851358649,15.8513830517,15.8514074539,15.8514318557,15.851456257,15.851480658,15.8515050586,15.8515294587,15.8515538584,15.8515782577,15.8516026567,15.8516270551,15.8516514532,15.8516758509,15.8517002481,15.851724645, 15.8517490414,15.8517734374,15.851797833,15.8518222282,15.851846623,15.8518710174,15.8518954113,15.8519198049,15.851944198,15.8519685907,15.851992983,15.8520173749,15.8520417664,15.8520661575,15.8520905481,15.8521149384, 15.8521393282,15.8521637176,15.8521881066,15.8522124952,15.8522368834,15.8522612712,15.8522856585,15.8523100455,15.852334432,15.8523588181,15.8523832038,15.8524075891,15.852431974,15.8524563585,15.8524807425,15.8525051262, 15.8525295094,15.8525538922,15.8525782746,15.8526026566,15.8526270382,15.8526514194,15.8526758002,15.8527001805,15.8527245604,15.85274894,15.8527733191,15.8527976978,15.8528220761,15.852846454,15.8528708314,15.8528952085, 15.8529195851,15.8529439614,15.8529683372,15.8529927126,15.8530170876,15.8530414622,15.8530658363,15.8530902101,15.8531145834,15.8531389564,15.8531633289,15.853187701,15.8532120727,15.853236444,15.8532608149,15.8532851853, 15.8533095554,15.853333925,15.8533582943,15.8533826631,15.8534070315,15.8534313995,15.8534557671,15.8534801343,15.853504501,15.8535288674,15.8535532333,15.8535775988,15.853601964,15.8536263287,15.8536506929,15.8536750568, 15.8536994203,15.8537237834,15.853748146,15.8537725082,15.8537968701,15.8538212315,15.8538455925,15.8538699531,15.8538943132,15.853918673,15.8539430324,15.8539673913,15.8539917498,15.854016108,15.8540404657,15.854064823, 15.8540891799,15.8541135363,15.8541378924,15.8541622481,15.8541866033,15.8542109581,15.8542353126,15.8542596666,15.8542840202,15.8543083734,15.8543327261,15.8543570785,15.8543814305,15.854405782,15.8544301331,15.8544544839, 15.8544788342,15.8545031841,15.8545275336,15.8545518826,15.8545762313,15.8546005796,15.8546249274,15.8546492748,15.8546736219,15.8546979685,15.8547223147,15.8547466605,15.8547710058,15.8547953508,15.8548196954,15.8548440395, 15.8548683833,15.8548927266,15.8549170695,15.854941412,15.8549657541,15.8549900958,15.8550144371,15.8550387779,15.8550631184,15.8550874584,15.855111798,15.8551361373,15.8551604761,15.8551848145,15.8552091525,15.85523349, 15.8552578272,15.8552821639,15.8553065003,15.8553308362,15.8553551718,15.8553795069,15.8554038416,15.8554281759,15.8554525097,15.8554768432,15.8555011763,15.8555255089,15.8555498412,15.855574173,15.8555985044,15.8556228354, 15.855647166,15.8556714962,15.855695826,15.8557201554,15.8557444843,15.8557688129,15.855793141,15.8558174687,15.855841796,15.855866123,15.8558904495,15.8559147755,15.8559391012,15.8559634265,15.8559877513,15.8560120758, 15.8560363998,15.8560607234,15.8560850467,15.8561093695,15.8561336919,15.8561580138,15.8561823354,15.8562066566,15.8562309773,15.8562552977,15.8562796176,15.8563039371,15.8563282563,15.856352575,15.8563768933,15.8564012111, 15.8564255286,15.8564498457,15.8564741623,15.8564984786,15.8565227944,15.8565471099,15.8565714249,15.8565957395,15.8566200537,15.8566443675,15.8566686808,15.8566929938,15.8567173064,15.8567416185,15.8567659303,15.8567902416, 15.8568145525,15.856838863,15.8568631731,15.8568874828,15.8569117921,15.856936101,15.8569604094,15.8569847175,15.8570090251,15.8570333323,15.8570576392,15.8570819456,15.8571062516,15.8571305572,15.8571548624,15.8571791671, 15.8572034715,15.8572277755,15.857252079,15.8572763822,15.8573006849,15.8573249872,15.8573492891,15.8573735906,15.8573978917,15.8574221924,15.8574464927,15.8574707925,15.857495092,15.857519391,15.8575436897,15.8575679879, 15.8575922857,15.8576165831,15.8576408801,15.8576651767,15.8576894729,15.8577137686,15.857738064,15.857762359,15.8577866535,15.8578109476,15.8578352414,15.8578595347,15.8578838276,15.8579081201,15.8579324122,15.8579567039, 15.8579809951,15.858005286,15.8580295764,15.8580538665,15.8580781561,15.8581024453,15.8581267342,15.8581510226,15.8581753106,15.8581995982,15.8582238853,15.8582481721,15.8582724585,15.8582967444,15.85832103,15.8583453151, 15.8583695999,15.8583938842,15.8584181681,15.8584424516,15.8584667347,15.8584910174,15.8585152996,15.8585395815,15.858563863,15.858588144,15.8586124247,15.8586367049,15.8586609847,15.8586852641,15.8587095431,15.8587338217, 15.8587580999,15.8587823777,15.8588066551,15.8588309321,15.8588552086,15.8588794848,15.8589037605,15.8589280358,15.8589523108,15.8589765853,15.8590008594,15.8590251331,15.8590494064,15.8590736792,15.8590979517,15.8591222238, 15.8591464954,15.8591707667,15.8591950375,15.8592193079,15.859243578,15.8592678476,15.8592921168,15.8593163856,15.859340654,15.8593649219,15.8593891895,15.8594134567,15.8594377234,15.8594619898,15.8594862557,15.8595105213, 15.8595347864,15.8595590511,15.8595833154,15.8596075793,15.8596318428,15.8596561059,15.8596803686,15.8597046308,15.8597288927,15.8597531541,15.8597774152,15.8598016758,15.859825936,15.8598501959,15.8598744553,15.8598987143, 15.8599229729,15.859947231,15.8599714888,15.8599957462,15.8600200032,15.8600442597,15.8600685159,15.8600927716,15.8601170269,15.8601412819,15.8601655364,15.8601897905,15.8602140442,15.8602382975,15.8602625504,15.8602868028, 15.8603110549,15.8603353066,15.8603595578,15.8603838087,15.8604080591,15.8604323092,15.8604565588,15.860480808,15.8605050568,15.8605293052,15.8605535532,15.8605778008,15.860602048,15.8606262947,15.8606505411,15.8606747871, 15.8606990326,15.8607232778,15.8607475225,15.8607717668,15.8607960107,15.8608202542,15.8608444974,15.86086874,15.8608929823,15.8609172242,15.8609414657,15.8609657068,15.8609899474,15.8610141877,15.8610384275,15.861062667, 15.861086906,15.8611111446,15.8611353828,15.8611596206,15.861183858,15.861208095,15.8612323316,15.8612565678,15.8612808036,15.861305039,15.8613292739,15.8613535085,15.8613777426,15.8614019764,15.8614262097,15.8614504426, 15.8614746751,15.8614989072,15.8615231389,15.8615473702,15.8615716011,15.8615958316,15.8616200617,15.8616442914,15.8616685206,15.8616927495,15.8617169779,15.861741206,15.8617654336,15.8617896608,15.8618138876,15.8618381141, 15.8618623401,15.8618865657,15.8619107909,15.8619350156,15.86195924,15.861983464,15.8620076876,15.8620319107,15.8620561335,15.8620803558,15.8621045778,15.8621287993,15.8621530204,15.8621772411,15.8622014614,15.8622256814, 15.8622499009,15.8622741199,15.8622983386,15.8623225569,15.8623467748,15.8623709923,15.8623952093,15.862419426,15.8624436422,15.8624678581,15.8624920735,15.8625162885,15.8625405031,15.8625647174,15.8625889312,15.8626131446, 15.8626373576,15.8626615701,15.8626857823,15.8627099941,15.8627342055,15.8627584164,15.862782627,15.8628068372,15.8628310469,15.8628552562,15.8628794652,15.8629036737,15.8629278818,15.8629520895,15.8629762968,15.8630005037, 15.8630247102,15.8630489163,15.863073122,15.8630973273,15.8631215322,15.8631457366,15.8631699407,15.8631941443,15.8632183476,15.8632425504,15.8632667529,15.8632909549,15.8633151565,15.8633393577,15.8633635585,15.8633877589, 15.8634119589,15.8634361585,15.8634603577,15.8634845565,15.8635087549,15.8635329528,15.8635571504,15.8635813476,15.8636055443,15.8636297407,15.8636539366,15.8636781321,15.8637023273,15.863726522,15.8637507163,15.8637749102, 15.8637991037,15.8638232968,15.8638474895,15.8638716818,15.8638958737,15.8639200652,15.8639442562,15.8639684469,15.8639926372,15.864016827,15.8640410165,15.8640652055,15.8640893942,15.8641135824,15.8641377702,15.8641619576, 15.8641861447,15.8642103313,15.8642345175,15.8642587033,15.8642828887,15.8643070737,15.8643312582,15.8643554424,15.8643796262,15.8644038096,15.8644279925,15.8644521751,15.8644763572,15.864500539,15.8645247203,15.8645489012, 15.8645730818,15.8645972619,15.8646214416,15.8646456209,15.8646697998,15.8646939783,15.8647181564,15.8647423341,15.8647665114,15.8647906883,15.8648148648,15.8648390409,15.8648632165,15.8648873918,15.8649115666,15.8649357411, 15.8649599151,15.8649840888,15.865008262,15.8650324349,15.8650566073,15.8650807793,15.8651049509,15.8651291221,15.8651532929,15.8651774633,15.8652016333,15.8652258029,15.8652499721,15.8652741409,15.8652983093,15.8653224772, 15.8653466448,15.865370812,15.8653949787,15.8654191451,15.865443311,15.8654674766,15.8654916417,15.8655158065,15.8655399708,15.8655641347,15.8655882982,15.8656124613,15.8656366241,15.8656607864,15.8656849483,15.8657091098, 15.8657332709,15.8657574315,15.8657815918,15.8658057517,15.8658299112,15.8658540702,15.8658782289,15.8659023872,15.865926545,15.8659507025,15.8659748595,15.8659990162,15.8660231724,15.8660473282,15.8660714837,15.8660956387, 15.8661197933,15.8661439475,15.8661681013,15.8661922547,15.8662164077,15.8662405603,15.8662647125,15.8662888643,15.8663130157,15.8663371667,15.8663613173,15.8663854674,15.8664096172,15.8664337666,15.8664579155,15.8664820641, 15.8665062122,15.86653036,15.8665545073,15.8665786543,15.8666028008,15.8666269469,15.8666510926,15.866675238,15.8666993829,15.8667235274,15.8667476715,15.8667718152,15.8667959585,15.8668201014,15.8668442439,15.866868386, 15.8668925277,15.866916669,15.8669408098,15.8669649503,15.8669890904,15.86701323,15.8670373693,15.8670615082,15.8670856466,15.8671097847,15.8671339223,15.8671580596,15.8671821964,15.8672063328,15.8672304689,15.8672546045, 15.8672787397,15.8673028745,15.8673270089,15.867351143,15.8673752766,15.8673994098,15.8674235426,15.867447675,15.867471807,15.8674959386,15.8675200697,15.8675442005,15.8675683309,15.8675924609,15.8676165904,15.8676407196, 15.8676648484,15.8676889767,15.8677131047,15.8677372323,15.8677613594,15.8677854862,15.8678096125,15.8678337384,15.867857864,15.8678819891,15.8679061138,15.8679302382,15.8679543621,15.8679784856,15.8680026087,15.8680267314, 15.8680508537,15.8680749757,15.8680990972,15.8681232183,15.868147339,15.8681714592,15.8681955791,15.8682196986,15.8682438177,15.8682679364,15.8682920547,15.8683161725,15.86834029,15.8683644071,15.8683885237,15.86841264, 15.8684367559,15.8684608713,15.8684849864,15.868509101,15.8685332153,15.8685573291,15.8685814425,15.8686055556,15.8686296682,15.8686537804,15.8686778923,15.8687020037,15.8687261147,15.8687502253,15.8687743356,15.8687984454, 15.8688225548,15.8688466638,15.8688707724,15.8688948806,15.8689189884,15.8689430958,15.8689672028,15.8689913094,15.8690154156,15.8690395213,15.8690636267,15.8690877317,15.8691118363,15.8691359404,15.8691600442,15.8691841476, 15.8692082506,15.8692323531,15.8692564553,15.869280557,15.8693046584,15.8693287593,15.8693528599,15.86937696,15.8694010598,15.8694251591,15.8694492581,15.8694733566,15.8694974547,15.8695215525,15.8695456498,15.8695697467, 15.8695938432,15.8696179394,15.8696420351,15.8696661304,15.8696902253,15.8697143198,15.8697384139,15.8697625076,15.8697866009,15.8698106938,15.8698347863,15.8698588784,15.8698829701,15.8699070614,15.8699311523,15.8699552428, 15.8699793329,15.8700034226,15.8700275119,15.8700516007,15.8700756892,15.8700997773,15.870123865,15.8701479522,15.8701720391,15.8701961256,15.8702202116,15.8702442973,15.8702683826,15.8702924674,15.8703165519,15.8703406359, 15.8703647196,15.8703888028,15.8704128857,15.8704369681,15.8704610502,15.8704851318,15.8705092131,15.8705332939,15.8705573743,15.8705814544,15.870605534,15.8706296132,15.8706536921,15.8706777705,15.8707018485,15.8707259261, 15.8707500033,15.8707740802,15.8707981566,15.8708222326,15.8708463082,15.8708703834,15.8708944582,15.8709185326,15.8709426066,15.8709666803,15.8709907535,15.8710148263,15.8710388987,15.8710629707,15.8710870423,15.8711111134, 15.8711351842,15.8711592546,15.8711833246,15.8712073942,15.8712314634,15.8712555322,15.8712796006,15.8713036686,15.8713277361,15.8713518033,15.8713758701,15.8713999365,15.8714240024,15.871448068,15.8714721332,15.871496198, 15.8715202623,15.8715443263,15.8715683899,15.871592453,15.8716165158,15.8716405782,15.8716646401,15.8716887017,15.8717127628,15.8717368236,15.8717608839,15.8717849439,15.8718090035,15.8718330626,15.8718571214,15.8718811797, 15.8719052377,15.8719292952,15.8719533524,15.8719774091,15.8720014654,15.8720255214,15.8720495769,15.8720736321,15.8720976868,15.8721217411,15.8721457951,15.8721698486,15.8721939018,15.8722179545,15.8722420068,15.8722660588, 15.8722901103,15.8723141614,15.8723382121,15.8723622625,15.8723863124,15.8724103619,15.8724344111,15.8724584598,15.8724825081,15.872506556,15.8725306036,15.8725546507,15.8725786974,15.8726027437,15.8726267896,15.8726508352, 15.8726748803,15.872698925,15.8727229693,15.8727470132,15.8727710567,15.8727950998,15.8728191426,15.8728431849,15.8728672268,15.8728912683,15.8729153094,15.8729393501,15.8729633904,15.8729874303,15.8730114698,15.873035509, 15.8730595477,15.873083586,15.8731076239,15.8731316614,15.8731556985,15.8731797352,15.8732037715,15.8732278074,15.8732518429,15.873275878,15.8732999127,15.873323947,15.8733479809,15.8733720144,15.8733960475,15.8734200802, 15.8734441125,15.8734681444,15.8734921759,15.873516207,15.8735402377,15.873564268,15.8735882979,15.8736123274,15.8736363565,15.8736603852,15.8736844135,15.8737084414,15.8737324689,15.873756496,15.8737805227,15.873804549, 15.8738285749,15.8738526004,15.8738766255,15.8739006502,15.8739246745,15.8739486984,15.8739727219,15.873996745,15.8740207677,15.87404479,15.8740688119,15.8740928333,15.8741168544,15.8741408751,15.8741648954,15.8741889153, 15.8742129348,15.8742369539,15.8742609726,15.8742849909,15.8743090088,15.8743330263,15.8743570434,15.8743810601,15.8744050764,15.8744290923,15.8744531078,15.8744771229,15.8745011376,15.8745251519,15.8745491658,15.8745731793, 15.8745971924,15.8746212051,15.8746452174,15.8746692293,15.8746932408,15.8747172519,15.8747412626,15.8747652729,15.8747892828,15.8748132923,15.8748373014,15.8748613101,15.8748853184,15.8749093263,15.8749333338,15.8749573409, 15.8749813477,15.875005354,15.8750293599,15.8750533654,15.8750773705,15.8751013752,15.8751253795,15.8751493834,15.8751733869,15.87519739,15.8752213928,15.8752453951,15.875269397,15.8752933985,15.8753173996,15.8753414003, 15.8753654006,15.8753894006,15.8754134001,15.8754373992,15.8754613979,15.8754853962,15.8755093942,15.8755333917,15.8755573888,15.8755813855,15.8756053819,15.8756293778,15.8756533733,15.8756773684,15.8757013632,15.8757253575, 15.8757493514,15.875773345,15.8757973381,15.8758213308,15.8758453232,15.8758693151,15.8758933066,15.8759172978,15.8759412885,15.8759652788,15.8759892688,15.8760132583,15.8760372475,15.8760612362,15.8760852245,15.8761092125, 15.8761332,15.8761571872,15.8761811739,15.8762051603,15.8762291462,15.8762531318,15.876277117,15.8763011017,15.8763250861,15.87634907,15.8763730536,15.8763970367,15.8764210195,15.8764450019,15.8764689838,15.8764929654, 15.8765169466,15.8765409273,15.8765649077,15.8765888877,15.8766128672,15.8766368464,15.8766608252,15.8766848036,15.8767087816,15.8767327591,15.8767567363,15.8767807131,15.8768046895,15.8768286655,15.8768526411,15.8768766162, 15.876900591,15.8769245654,15.8769485394,15.876972513,15.8769964862,15.877020459,15.8770444314,15.8770684034,15.877092375,15.8771163462,15.877140317,15.8771642875,15.8771882575,15.8772122271,15.8772361963,15.8772601651, 15.8772841335,15.8773081015,15.8773320692,15.8773560364,15.8773800032,15.8774039696,15.8774279357,15.8774519013,15.8774758665,15.8774998314,15.8775237958,15.8775477598,15.8775717235,15.8775956867,15.8776196496,15.877643612, 15.8776675741,15.8776915357,15.877715497,15.8777394578,15.8777634183,15.8777873783,15.877811338,15.8778352973,15.8778592561,15.8778832146,15.8779071727,15.8779311303,15.8779550876,15.8779790445,15.878003001,15.878026957, 15.8780509127,15.878074868,15.8780988229,15.8781227774,15.8781467315,15.8781706852,15.8781946385,15.8782185914,15.8782425439,15.878266496,15.8782904477,15.878314399,15.8783383499,15.8783623004,15.8783862505,15.8784102002, 15.8784341496,15.8784580985,15.878482047,15.8785059951,15.8785299429,15.8785538902,15.8785778371,15.8786017837,15.8786257298,15.8786496755,15.8786736209,15.8786975658,15.8787215104,15.8787454545,15.8787693983,15.8787933417, 15.8788172846,15.8788412272,15.8788651693,15.8788891111,15.8789130525,15.8789369935,15.878960934,15.8789848742,15.879008814,15.8790327534,15.8790566924,15.879080631,15.8791045691,15.8791285069,15.8791524443,15.8791763813, 15.8792003179,15.8792242542,15.87924819,15.8792721254,15.8792960604,15.879319995,15.8793439292,15.8793678631,15.8793917965,15.8794157295,15.8794396621,15.8794635944,15.8794875262,15.8795114577,15.8795353887,15.8795593194, 15.8795832496,15.8796071795,15.8796311089,15.879655038,15.8796789666,15.8797028949,15.8797268228,15.8797507503,15.8797746773,15.879798604,15.8798225303,15.8798464562,15.8798703817,15.8798943068,15.8799182315,15.8799421558, 15.8799660797,15.8799900032,15.8800139263,15.880037849,15.8800617713,15.8800856932,15.8801096147,15.8801335359,15.8801574566,15.8801813769,15.8802052969,15.8802292164,15.8802531356,15.8802770543,15.8803009726,15.8803248906, 15.8803488082,15.8803727253,15.8803966421,15.8804205584,15.8804444744,15.88046839,15.8804923052,15.8805162199,15.8805401343,15.8805640483,15.8805879619,15.8806118751,15.8806357879,15.8806597003,15.8806836123,15.8807075239, 15.8807314351,15.880755346,15.8807792564,15.8808031664,15.880827076,15.8808509853,15.8808748941,15.8808988025,15.8809227106,15.8809466182,15.8809705255,15.8809944323,15.8810183388,15.8810422449,15.8810661505,15.8810900558, 15.8811139607,15.8811378652,15.8811617692,15.8811856729,15.8812095762,15.8812334791,15.8812573816,15.8812812837,15.8813051854,15.8813290867,15.8813529876,15.8813768882,15.8814007883,15.881424688,15.8814485873,15.8814724863, 15.8814963848,15.881520283,15.8815441807,15.8815680781,15.881591975,15.8816158716,15.8816397677,15.8816636635,15.8816875589,15.8817114538,15.8817353484,15.8817592426,15.8817831364,15.8818070298,15.8818309228,15.8818548154, 15.8818787076,15.8819025994,15.8819264908,15.8819503818,15.8819742725,15.8819981627,15.8820220525,15.882045942,15.882069831,15.8820937197,15.8821176079,15.8821414958,15.8821653832,15.8821892703,15.8822131569,15.8822370432, 15.8822609291,15.8822848146,15.8823086997,15.8823325844,15.8823564687,15.8823803526,15.8824042361,15.8824281192,15.8824520019,15.8824758842,15.8824997661,15.8825236477,15.8825475288,15.8825714095,15.8825952899,15.8826191698, 15.8826430494,15.8826669285,15.8826908073,15.8827146856,15.8827385636,15.8827624412,15.8827863184,15.8828101952,15.8828340715,15.8828579475,15.8828818231,15.8829056983,15.8829295732,15.8829534476,15.8829773216,15.8830011952, 15.8830250684,15.8830489413,15.8830728137,15.8830966858,15.8831205574,15.8831444287,15.8831682995,15.88319217,15.8832160401,15.8832399097,15.883263779,15.8832876479,15.8833115164,15.8833353845,15.8833592522,15.8833831195, 15.8834069864,15.8834308529,15.883454719,15.8834785847,15.8835024501,15.883526315,15.8835501796,15.8835740437,15.8835979075,15.8836217708,15.8836456338,15.8836694963,15.8836933585,15.8837172203,15.8837410817,15.8837649427, 15.8837888033,15.8838126635,15.8838365233,15.8838603827,15.8838842417,15.8839081003,15.8839319585,15.8839558164,15.8839796738,15.8840035309,15.8840273875,15.8840512438,15.8840750996,15.8840989551,15.8841228102,15.8841466648, 15.8841705191,15.884194373,15.8842182265,15.8842420796,15.8842659323,15.8842897846,15.8843136365,15.884337488,15.8843613392,15.8843851899,15.8844090402,15.8844328902,15.8844567397,15.8844805889,15.8845044376,15.884528286, 15.884552134,15.8845759816,15.8845998288,15.8846236755,15.8846475219,15.8846713679,15.8846952135,15.8847190588,15.8847429036,15.884766748,15.884790592,15.8848144357,15.8848382789,15.8848621218,15.8848859642,15.8849098063, 15.8849336479,15.8849574892,15.8849813301,15.8850051706,15.8850290107,15.8850528504,15.8850766897,15.8851005286,15.8851243671,15.8851482052,15.885172043,15.8851958803,15.8852197172,15.8852435538,15.8852673899,15.8852912257, 15.885315061,15.885338896,15.8853627306,15.8853865648,15.8854103986,15.885434232,15.885458065,15.8854818976,15.8855057298,15.8855295616,15.885553393,15.8855772241,15.8856010547,15.885624885,15.8856487148,15.8856725443, 15.8856963733,15.885720202,15.8857440303,15.8857678582,15.8857916857,15.8858155128,15.8858393395,15.8858631658,15.8858869917,15.8859108172,15.8859346424,15.8859584671,15.8859822914,15.8860061154,15.8860299389,15.8860537621, 15.8860775849,15.8861014072,15.8861252292,15.8861490508,15.886172872,15.8861966928,15.8862205132,15.8862443332,15.8862681529,15.8862919721,15.8863157909,15.8863396094,15.8863634274,15.8863872451,15.8864110624,15.8864348792, 15.8864586957,15.8864825118,15.8865063275,15.8865301428,15.8865539577,15.8865777722,15.8866015863,15.8866254,15.8866492134,15.8866730263,15.8866968389,15.886720651,15.8867444628,15.8867682741,15.8867920851,15.8868158957, 15.8868397059,15.8868635157,15.8868873251,15.8869111341,15.8869349427,15.8869587509,15.8869825588,15.8870063662,15.8870301732,15.8870539799,15.8870777862,15.887101592,15.8871253975,15.8871492026,15.8871730073,15.8871968116, 15.8872206155,15.887244419,15.8872682221,15.8872920248,15.8873158272,15.8873396291,15.8873634306,15.8873872318,15.8874110326,15.8874348329,15.8874586329,15.8874824325,15.8875062317,15.8875300305,15.8875538289,15.8875776269, 15.8876014245,15.8876252217,15.8876490186,15.887672815,15.8876966111,15.8877204067,15.887744202,15.8877679969,15.8877917913,15.8878155854,15.8878393791,15.8878631724,15.8878869653,15.8879107579,15.88793455,15.8879583417, 15.8879821331,15.888005924,15.8880297146,15.8880535047,15.8880772945,15.8881010839,15.8881248729,15.8881486615,15.8881724497,15.8881962375,15.8882200249,15.8882438119,15.8882675986,15.8882913848,15.8883151706,15.8883389561, 15.8883627412,15.8883865258,15.8884103101,15.888434094,15.8884578775,15.8884816606,15.8885054433,15.8885292257,15.8885530076,15.8885767891,15.8886005703,15.888624351,15.8886481314,15.8886719113,15.8886956909,15.8887194701, 15.8887432489,15.8887670273,15.8887908053,15.8888145829,15.8888383602,15.888862137,15.8888859134,15.8889096895,15.8889334651,15.8889572404,15.8889810153,15.8890047898,15.8890285638,15.8890523375,15.8890761109,15.8890998838, 15.8891236563,15.8891474284,15.8891712002,15.8891949715,15.8892187425,15.889242513,15.8892662832,15.889290053,15.8893138224,15.8893375914,15.88936136,15.8893851282,15.889408896,15.8894326635,15.8894564305,15.8894801972, 15.8895039634,15.8895277293,15.8895514948,15.8895752598,15.8895990245,15.8896227888,15.8896465527,15.8896703163,15.8896940794,15.8897178421,15.8897416045,15.8897653664,15.889789128,15.8898128891,15.8898366499,15.8898604103, 15.8898841703,15.8899079299,15.8899316891,15.8899554479,15.8899792064,15.8900029644,15.8900267221,15.8900504793,15.8900742362,15.8900979927,15.8901217487,15.8901455044,15.8901692597,15.8901930146,15.8902167692,15.8902405233, 15.890264277,15.8902880304,15.8903117833,15.8903355359,15.8903592881,15.8903830398,15.8904067912,15.8904305422,15.8904542928,15.890478043,15.8905017929,15.8905255423,15.8905492914,15.89057304,15.8905967883,15.8906205361, 15.8906442836,15.8906680307,15.8906917774,15.8907155237,15.8907392696,15.8907630152,15.8907867603,15.890810505,15.8908342494,15.8908579934,15.8908817369,15.8909054801,15.8909292229,15.8909529653,15.8909767073,15.8910004489, 15.8910241901,15.891047931,15.8910716714,15.8910954115,15.8911191512,15.8911428904,15.8911666293,15.8911903678,15.8912141059,15.8912378436,15.8912615809,15.8912853179,15.8913090544,15.8913327906,15.8913565263,15.8913802617, 15.8914039967,15.8914277313,15.8914514654,15.8914751993,15.8914989327,15.8915226657,15.8915463983,15.8915701306,15.8915938624,15.8916175939,15.891641325,15.8916650557,15.8916887859,15.8917125159,15.8917362454,15.8917599745, 15.8917837032,15.8918074316,15.8918311595,15.8918548871,15.8918786142,15.891902341,15.8919260674,15.8919497934,15.891973519,15.8919972442,15.8920209691,15.8920446935,15.8920684176,15.8920921412,15.8921158645,15.8921395874, 15.8921633099,15.892187032,15.8922107537,15.892234475,15.8922581959,15.8922819165,15.8923056366,15.8923293564,15.8923530757,15.8923767947,15.8924005133,15.8924242315,15.8924479493,15.8924716667,15.8924953838,15.8925191004, 15.8925428166,15.8925665325,15.892590248,15.8926139631,15.8926376777,15.892661392,15.892685106,15.8927088195,15.8927325326,15.8927562454,15.8927799577,15.8928036697,15.8928273812,15.8928510924,15.8928748032,15.8928985136, 15.8929222236,15.8929459333,15.8929696425,15.8929933513,15.8930170598,15.8930407679,15.8930644755,15.8930881828,15.8931118897,15.8931355962,15.8931593023,15.8931830081,15.8932067134,15.8932304184,15.8932541229,15.8932778271, 15.8933015309,15.8933252343,15.8933489373,15.8933726399,15.8933963421,15.8934200439,15.8934437454,15.8934674464,15.8934911471,15.8935148474,15.8935385472,15.8935622467,15.8935859459,15.8936096446,15.8936333429,15.8936570408, 15.8936807384,15.8937044356,15.8937281323,15.8937518287,15.8937755247,15.8937992203,15.8938229155,15.8938466103,15.8938703048,15.8938939988,15.8939176925,15.8939413858,15.8939650786,15.8939887711,15.8940124632,15.8940361549, 15.8940598463,15.8940835372,15.8941072278,15.8941309179,15.8941546077,15.8941782971,15.8942019861,15.8942256747,15.8942493629,15.8942730507,15.8942967381,15.8943204252,15.8943441118,15.8943677981,15.894391484,15.8944151695, 15.8944388546,15.8944625393,15.8944862236,15.8945099075,15.8945335911,15.8945572742,15.894580957,15.8946046394,15.8946283214,15.894652003,15.8946756842,15.894699365,15.8947230455,15.8947467255,15.8947704052,15.8947940844, 15.8948177633,15.8948414418,15.8948651199,15.8948887976,15.8949124749,15.8949361519,15.8949598284,15.8949835046,15.8950071804,15.8950308558,15.8950545307,15.8950782054,15.8951018796,15.8951255534,15.8951492268,15.8951728999, 15.8951965726,15.8952202448,15.8952439167,15.8952675882,15.8952912593,15.8953149301,15.8953386004,15.8953622703,15.8953859399,15.8954096091,15.8954332778,15.8954569462,15.8954806142,15.8955042819,15.8955279491,15.8955516159, 15.8955752824,15.8955989484,15.8956226141,15.8956462794,15.8956699443,15.8956936088,15.8957172729,15.8957409367,15.8957646,15.895788263,15.8958119255,15.8958355877,15.8958592495,15.8958829109,15.8959065719,15.8959302326, 15.8959538928,15.8959775527,15.8960012121,15.8960248712,15.8960485299,15.8960721882,15.8960958461,15.8961195036,15.8961431608,15.8961668175,15.8961904739,15.8962141299,15.8962377854,15.8962614406,15.8962850955,15.8963087499, 15.8963324039,15.8963560576,15.8963797108,15.8964033637,15.8964270162,15.8964506683,15.89647432,15.8964979713,15.8965216222,15.8965452728,15.8965689229,15.8965925727,15.8966162221,15.8966398711,15.8966635197,15.8966871679, 15.8967108157,15.8967344632,15.8967581102,15.8967817569,15.8968054032,15.8968290491,15.8968526946,15.8968763397,15.8968999844,15.8969236288,15.8969472727,15.8969709163,15.8969945595,15.8970182023,15.8970418447,15.8970654867, 15.8970891283,15.8971127696,15.8971364104,15.8971600509,15.897183691,15.8972073307,15.89723097,15.8972546089,15.8972782474,15.8973018856,15.8973255233,15.8973491607,15.8973727977,15.8973964343,15.8974200705,15.8974437063, 15.8974673417,15.8974909768,15.8975146114,15.8975382457,15.8975618796,15.8975855131,15.8976091462,15.8976327789,15.8976564113,15.8976800432,15.8977036748,15.8977273059,15.8977509367,15.8977745671,15.8977981971,15.8978218268, 15.897845456,15.8978690849,15.8978927133,15.8979163414,15.8979399691,15.8979635964,15.8979872233,15.8980108498,15.898034476,15.8980581017,15.8980817271,15.8981053521,15.8981289767,15.8981526009,15.8981762247,15.8981998482, 15.8982234712,15.8982470939,15.8982707162,15.898294338,15.8983179595,15.8983415807,15.8983652014,15.8983888217,15.8984124417,15.8984360613,15.8984596804,15.8984832992,15.8985069176,15.8985305357,15.8985541533,15.8985777705, 15.8986013874,15.8986250039,15.89864862,15.8986722357,15.898695851,15.8987194659,15.8987430805,15.8987666946,15.8987903084,15.8988139218,15.8988375348,15.8988611474,15.8988847596,15.8989083714,15.8989319829,15.8989555939, 15.8989792046,15.8990028149,15.8990264248,15.8990500343,15.8990736435,15.8990972522,15.8991208606,15.8991444685,15.8991680761,15.8991916833,15.8992152901,15.8992388966,15.8992625026,15.8992861083,15.8993097135,15.8993333184, 15.8993569229,15.899380527,15.8994041308,15.8994277341,15.899451337,15.8994749396,15.8994985418,15.8995221436,15.899545745,15.899569346,15.8995929467,15.8996165469,15.8996401468,15.8996637462,15.8996873453,15.899710944, 15.8997345424,15.8997581403,15.8997817378,15.899805335,15.8998289318,15.8998525282,15.8998761242,15.8998997198,15.899923315,15.8999469099,15.8999705043,15.8999940984,15.9000176921,15.9000412854,15.9000648783,15.9000884708, 15.900112063,15.9001356547,15.9001592461,15.9001828371,15.9002064277,15.9002300179,15.9002536077,15.9002771972,15.9003007862,15.9003243749,15.9003479632,15.9003715511,15.9003951386,15.9004187258,15.9004423125,15.9004658989, 15.9004894848,15.9005130704,15.9005366556,15.9005602404,15.9005838249,15.9006074089,15.9006309926,15.9006545759,15.9006781587,15.9007017412,15.9007253234,15.9007489051,15.9007724864,15.9007960674,15.900819648,15.9008432282, 15.900866808,15.9008903874,15.9009139664,15.9009375451,15.9009611233,15.9009847012,15.9010082787,15.9010318558,15.9010554326,15.9010790089,15.9011025848,15.9011261604,15.9011497356,15.9011733104,15.9011968848,15.9012204588, 15.9012440325,15.9012676057,15.9012911786,15.9013147511,15.9013383232,15.9013618949,15.9013854662,15.9014090372,15.9014326077,15.9014561779,15.9014797477,15.9015033171,15.9015268861,15.9015504548,15.901574023,15.9015975909, 15.9016211583,15.9016447254,15.9016682922,15.9016918585,15.9017154244,15.90173899,15.9017625551,15.9017861199,15.9018096843,15.9018332483,15.901856812,15.9018803752,15.9019039381,15.9019275006,15.9019510626,15.9019746243, 15.9019981857,15.9020217466,15.9020453072,15.9020688673,15.9020924271,15.9021159865,15.9021395455,15.9021631041,15.9021866624,15.9022102202,15.9022337777,15.9022573348,15.9022808915,15.9023044478,15.9023280038,15.9023515593, 15.9023751145,15.9023986693,15.9024222237,15.9024457777,15.9024693313,15.9024928845,15.9025164374,15.9025399899,15.902563542,15.9025870937,15.902610645,15.9026341959,15.9026577465,15.9026812967,15.9027048464,15.9027283958, 15.9027519449,15.9027754935,15.9027990417,15.9028225896,15.9028461371,15.9028696842,15.9028932309,15.9029167772,15.9029403231,15.9029638687,15.9029874139,15.9030109586,15.903034503,15.9030580471,15.9030815907,15.9031051339, 15.9031286768,15.9031522193,15.9031757614,15.9031993031,15.9032228444,15.9032463854,15.9032699259,15.9032934661,15.9033170059,15.9033405453,15.9033640843,15.903387623,15.9034111612,15.9034346991,15.9034582366,15.9034817737, 15.9035053104,15.9035288468,15.9035523827,15.9035759183,15.9035994535,15.9036229883,15.9036465227,15.9036700567,15.9036935904,15.9037171236,15.9037406565,15.903764189,15.9037877211,15.9038112529,15.9038347842,15.9038583152, 15.9038818457,15.9039053759,15.9039289057,15.9039524352,15.9039759642,15.9039994929,15.9040230211,15.904046549,15.9040700765,15.9040936037,15.9041171304,15.9041406568,15.9041641827,15.9041877083,15.9042112335,15.9042347584, 15.9042582828,15.9042818069,15.9043053305,15.9043288538,15.9043523767,15.9043758992,15.9043994214,15.9044229431,15.9044464645,15.9044699855,15.9044935061,15.9045170263,15.9045405462,15.9045640656,15.9045875847,15.9046111034, 15.9046346217,15.9046581396,15.9046816571,15.9047051743,15.904728691,15.9047522074,15.9047757234,15.9047992391,15.9048227543,15.9048462691,15.9048697836,15.9048932977,15.9049168114,15.9049403247,15.9049638377,15.9049873502, 15.9050108624,15.9050343742,15.9050578856,15.9050813966,15.9051049072,15.9051284175,15.9051519274,15.9051754369,15.905198946,15.9052224547,15.905245963,15.905269471,15.9052929786,15.9053164857,15.9053399926,15.905363499, 15.905387005,15.9054105107,15.905434016,15.9054575208,15.9054810254,15.9055045295,15.9055280332,15.9055515366,15.9055750396,15.9055985422,15.9056220444,15.9056455462,15.9056690476,15.9056925487,15.9057160494,15.9057395497, 15.9057630496,15.9057865491,15.9058100483,15.9058335471,15.9058570454,15.9058805434,15.9059040411,15.9059275383,15.9059510351,15.9059745316,15.9059980277,15.9060215234,15.9060450187,15.9060685137,15.9060920082,15.9061155024, 15.9061389962,15.9061624896,15.9061859826,15.9062094753,15.9062329675,15.9062564594,15.9062799509,15.906303442,15.9063269328,15.9063504231,15.9063739131,15.9063974027,15.9064208919,15.9064443807,15.9064678691,15.9064913572, 15.9065148448,15.9065383321,15.906561819,15.9065853056,15.9066087917,15.9066322775,15.9066557629,15.9066792478,15.9067027325,15.9067262167,15.9067497005,15.906773184,15.9067966671,15.9068201498,15.9068436321,15.9068671141, 15.9068905956,15.9069140768,15.9069375576,15.906961038,15.906984518,15.9070079977,15.9070314769,15.9070549558,15.9070784343,15.9071019124,15.9071253901,15.9071488675,15.9071723445,15.9071958211,15.9072192973,15.9072427731, 15.9072662485,15.9072897236,15.9073131983,15.9073366726,15.9073601465,15.90738362,15.9074070932,15.9074305659,15.9074540383,15.9074775103,15.9075009819,15.9075244532,15.907547924,15.9075713945,15.9075948646,15.9076183343, 15.9076418037,15.9076652726,15.9076887412,15.9077122094,15.9077356772,15.9077591446,15.9077826116,15.9078060783,15.9078295446,15.9078530105,15.907876476,15.9078999411,15.9079234059,15.9079468702,15.9079703342,15.9079937978, 15.9080172611,15.9080407239,15.9080641864,15.9080876484,15.9081111101,15.9081345715,15.9081580324,15.908181493,15.9082049531,15.9082284129,15.9082518723,15.9082753314,15.90829879,15.9083222483,15.9083457062,15.9083691637, 15.9083926208,15.9084160775,15.9084395339,15.9084629898,15.9084864454,15.9085099007,15.9085333555,15.9085568099,15.908580264,15.9086037177,15.908627171,15.9086506239,15.9086740765,15.9086975286,15.9087209804,15.9087444318, 15.9087678828,15.9087913335,15.9088147837,15.9088382336,15.9088616831,15.9088851322,15.908908581,15.9089320293,15.9089554773,15.9089789249,15.9090023721,15.9090258189,15.9090492654,15.9090727114,15.9090961571,15.9091196024, 15.9091430473,15.9091664919,15.909189936,15.9092133798,15.9092368232,15.9092602662,15.9092837089,15.9093071511,15.909330593,15.9093540345,15.9093774756,15.9094009163,15.9094243567,15.9094477967,15.9094712363,15.9094946755, 15.9095181143,15.9095415527,15.9095649908,15.9095884285,15.9096118658,15.9096353027,15.9096587393,15.9096821754,15.9097056112,15.9097290466,15.9097524816,15.9097759163,15.9097993505,15.9098227844,15.9098462179,15.909869651, 15.9098930838,15.9099165161,15.9099399481,15.9099633797,15.9099868109,15.9100102417,15.9100336722,15.9100571023,15.910080532,15.9101039613,15.9101273902,15.9101508188,15.9101742469,15.9101976747,15.9102211021,15.9102445292, 15.9102679558,15.9102913821,15.910314808,15.9103382335,15.9103616586,15.9103850834,15.9104085077,15.9104319317,15.9104553553,15.9104787785,15.9105022014,15.9105256238,15.9105490459,15.9105724676,15.910595889,15.9106193099, 15.9106427305,15.9106661507,15.9106895705,15.9107129899,15.9107364089,15.9107598276,15.9107832459,15.9108066638,15.9108300813,15.9108534984,15.9108769152,15.9109003316,15.9109237476,15.9109471632,15.9109705785,15.9109939933, 15.9110174078,15.9110408219,15.9110642356,15.911087649,15.9111110619,15.9111344745,15.9111578867,15.9111812985,15.91120471,15.911228121,15.9112515317,15.911274942,15.9112983519,15.9113217615,15.9113451707,15.9113685794, 15.9113919878,15.9114153959,15.9114388035,15.9114622108,15.9114856177,15.9115090242,15.9115324303,15.911555836,15.9115792414,15.9116026464,15.911626051,15.9116494552,15.9116728591,15.9116962625,15.9117196656,15.9117430683, 15.9117664707,15.9117898726,15.9118132742,15.9118366754,15.9118600762,15.9118834766,15.9119068767,15.9119302763,15.9119536756,15.9119770745,15.9120004731,15.9120238712,15.912047269,15.9120706664,15.9120940634,15.91211746, 15.9121408563,15.9121642522,15.9121876477,15.9122110428,15.9122344375,15.9122578319,15.9122812259,15.9123046195,15.9123280127,15.9123514055,15.912374798,15.9123981901,15.9124215818,15.9124449731,15.912468364,15.9124917546, 15.9125151448,15.9125385346,15.912561924,15.9125853131,15.9126087018,15.91263209,15.912655478,15.9126788655,15.9127022526,15.9127256394,15.9127490258,15.9127724118,15.9127957975,15.9128191827,15.9128425676,15.9128659521, 15.9128893362,15.91291272,15.9129361033,15.9129594863,15.9129828689,15.9130062512,15.913029633,15.9130530145,15.9130763956,15.9130997763,15.9131231566,15.9131465365,15.9131699161,15.9131932953,15.9132166741,15.9132400526, 15.9132634306,15.9132868083,15.9133101856,15.9133335625,15.9133569391,15.9133803152,15.913403691,15.9134270664,15.9134504415,15.9134738161,15.9134971904,15.9135205643,15.9135439378,15.9135673109,15.9135906837,15.9136140561, 15.913637428,15.9136607997,15.9136841709,15.9137075418,15.9137309123,15.9137542824,15.9137776521,15.9138010214,15.9138243904,15.913847759,15.9138711272,15.913894495,15.9139178625,15.9139412296,15.9139645963,15.9139879626, 15.9140113285,15.9140346941,15.9140580593,15.9140814241,15.9141047885,15.9141281526,15.9141515162,15.9141748795,15.9141982425,15.914221605,15.9142449671,15.9142683289,15.9142916903,15.9143150514,15.914338412,15.9143617723, 15.9143851322,15.9144084917,15.9144318508,15.9144552096,15.9144785679,15.9145019259,15.9145252835,15.9145486408,15.9145719976,15.9145953541,15.9146187102,15.914642066,15.9146654213,15.9146887763,15.9147121309,15.9147354851, 15.9147588389,15.9147821924,15.9148055455,15.9148288982,15.9148522505,15.9148756025,15.914898954,15.9149223052,15.914945656,15.9149690065,15.9149923565,15.9150157062,15.9150390555,15.9150624044,15.915085753,15.9151091012, 15.915132449,15.9151557964,15.9151791434,15.9152024901,15.9152258363,15.9152491822,15.9152725278,15.9152958729,15.9153192177,15.9153425621,15.9153659061,15.9153892497,15.915412593,15.9154359359,15.9154592784,15.9154826205, 15.9155059622,15.9155293036,15.9155526446,15.9155759852,15.9155993254,15.9156226653,15.9156460048,15.9156693439,15.9156926826,15.915716021,15.9157393589,15.9157626965,15.9157860337,15.9158093706,15.915832707,15.9158560431, 15.9158793788,15.9159027142,15.9159260491,15.9159493837,15.9159727179,15.9159960517,15.9160193851,15.9160427182,15.9160660509,15.9160893832,15.9161127151,15.9161360467,15.9161593779,15.9161827087,15.9162060391,15.9162293691, 15.9162526988,15.9162760281,15.916299357,15.9163226856,15.9163460137,15.9163693415,15.9163926689,15.9164159959,15.9164393226,15.9164626489,15.9164859748,15.9165093003,15.9165326254,15.9165559502,15.9165792746,15.9166025986, 15.9166259222,15.9166492455,15.9166725683,15.9166958909,15.916719213,15.9167425347,15.9167658561,15.9167891771,15.9168124977,15.916835818,15.9168591378,15.9168824573,15.9169057764,15.9169290951,15.9169524135,15.9169757315, 15.9169990491,15.9170223663,15.9170456832,15.9170689996,15.9170923157,15.9171156314,15.9171389468,15.9171622617,15.9171855763,15.9172088905,15.9172322044,15.9172555178,15.9172788309,15.9173021436,15.917325456,15.9173487679, 15.9173720795,15.9173953907,15.9174187015,15.9174420119,15.917465322,15.9174886317,15.917511941,15.9175352499,15.9175585585,15.9175818667,15.9176051745,15.9176284819,15.917651789,15.9176750957,15.917698402,15.9177217079, 15.9177450134,15.9177683186,15.9177916234,15.9178149278,15.9178382319,15.9178615355,15.9178848388,15.9179081417,15.9179314443,15.9179547464,15.9179780482,15.9180013496,15.9180246507,15.9180479513,15.9180712516,15.9180945515, 15.918117851,15.9181411502,15.918164449,15.9181877474,15.9182110454,15.918234343,15.9182576403,15.9182809372,15.9183042337,15.9183275298,15.9183508256,15.918374121,15.918397416,15.9184207106,15.9184440049,15.9184672988, 15.9184905923,15.9185138854,15.9185371782,15.9185604706,15.9185837626,15.9186070542,15.9186303454,15.9186536363,15.9186769268,15.9187002169,15.9187235067,15.9187467961,15.9187700851,15.9187933737,15.9188166619,15.9188399498, 15.9188632373,15.9188865244,15.9189098111,15.9189330975,15.9189563835,15.9189796691,15.9190029543,15.9190262392,15.9190495237,15.9190728078,15.9190960915,15.9191193749,15.9191426579,15.9191659405,15.9191892227,15.9192125045, 15.919235786,15.9192590671,15.9192823479,15.9193056282,15.9193289082,15.9193521878,15.919375467,15.9193987459,15.9194220243,15.9194453024,15.9194685802,15.9194918575,15.9195151345,15.9195384111,15.9195616873,15.9195849631, 15.9196082386,15.9196315137,15.9196547884,15.9196780628,15.9197013367,15.9197246103,15.9197478835,15.9197711564,15.9197944288,15.9198177009,15.9198409726,15.919864244,15.9198875149,15.9199107855,15.9199340557,15.9199573256, 15.919980595,15.9200038641,15.9200271328,15.9200504012,15.9200736691,15.9200969367,15.9201202039,15.9201434708,15.9201667372,15.9201900033,15.920213269,15.9202365344,15.9202597993,15.9202830639,15.9203063281,15.920329592, 15.9203528554,15.9203761185,15.9203993812,15.9204226435,15.9204459055,15.9204691671,15.9204924283,15.9205156891,15.9205389496,15.9205622097,15.9205854694,15.9206087287,15.9206319877,15.9206552463,15.9206785045,15.9207017623, 15.9207250198,15.9207482768,15.9207715335,15.9207947899,15.9208180458,15.9208413014,15.9208645566,15.9208878115,15.9209110659,15.92093432,15.9209575737,15.9209808271,15.92100408,15.9210273326,15.9210505848,15.9210738366, 15.9210970881,15.9211203392,15.9211435899,15.9211668402,15.9211900902,15.9212133398,15.921236589,15.9212598378,15.9212830863,15.9213063344,15.9213295821,15.9213528295,15.9213760764,15.921399323,15.9214225692,15.9214458151, 15.9214690605,15.9214923056,15.9215155503,15.9215387947,15.9215620387,15.9215852822,15.9216085255,15.9216317683,15.9216550108,15.9216782529,15.9217014946,15.921724736,15.9217479769,15.9217712175,15.9217944577,15.9218176976, 15.9218409371,15.9218641762,15.9218874149,15.9219106533,15.9219338912,15.9219571288,15.9219803661,15.9220036029,15.9220268394,15.9220500755,15.9220733112,15.9220965466,15.9221197816,15.9221430162,15.9221662504,15.9221894843, 15.9222127178,15.9222359509,15.9222591836,15.922282416,15.922305648,15.9223288796,15.9223521109,15.9223753417,15.9223985722,15.9224218023,15.9224450321,15.9224682615,15.9224914905,15.9225147191,15.9225379473,15.9225611752, 15.9225844027,15.9226076298,15.9226308566,15.922654083,15.922677309,15.9227005346,15.9227237599,15.9227469848,15.9227702093,15.9227934334,15.9228166572,15.9228398806,15.9228631036,15.9228863262,15.9229095485,15.9229327704, 15.9229559919,15.9229792131,15.9230024338,15.9230256542,15.9230488743,15.9230720939,15.9230953132,15.9231185321,15.9231417506,15.9231649688,15.9231881866,15.923211404,15.923234621,15.9232578377,15.923281054,15.9233042699, 15.9233274854,15.9233507006,15.9233739154,15.9233971298,15.9234203439,15.9234435575,15.9234667708,15.9234899838,15.9235131963,15.9235364085,15.9235596203,15.9235828317,15.9236060428,15.9236292535,15.9236524638,15.9236756737, 15.9236988833,15.9237220925,15.9237453013,15.9237685098,15.9237917178,15.9238149255,15.9238381329,15.9238613398,15.9238845464,15.9239077526,15.9239309584,15.9239541639,15.923977369,15.9240005737,15.924023778,15.924046982, 15.9240701856,15.9240933888,15.9241165917,15.9241397941,15.9241629962,15.924186198,15.9242093993,15.9242326003,15.9242558009,15.9242790011,15.924302201,15.9243254005,15.9243485996,15.9243717983,15.9243949967,15.9244181947, 15.9244413923,15.9244645896,15.9244877865,15.924510983,15.9245341791,15.9245573749,15.9245805703,15.9246037653,15.9246269599,15.9246501542,15.9246733481,15.9246965416,15.9247197347,15.9247429275,15.9247661199,15.9247893119, 15.9248125036,15.9248356949,15.9248588858,15.9248820763,15.9249052665,15.9249284563,15.9249516457,15.9249748348,15.9249980234,15.9250212117,15.9250443997,15.9250675872,15.9250907744,15.9251139612,15.9251371477,15.9251603337, 15.9251835194,15.9252067048,15.9252298897,15.9252530743,15.9252762585,15.9252994423,15.9253226258,15.9253458089,15.9253689916,15.9253921739,15.9254153559,15.9254385375,15.9254617187,15.9254848996,15.92550808,15.9255312601, 15.9255544399,15.9255776192,15.9256007982,15.9256239768,15.9256471551,15.925670333,15.9256935105,15.9257166876,15.9257398643,15.9257630407,15.9257862167,15.9258093924,15.9258325676,15.9258557425,15.925878917,15.9259020912, 15.925925265,15.9259484384,15.9259716114,15.9259947841,15.9260179564,15.9260411283,15.9260642998,15.926087471,15.9261106418,15.9261338122,15.9261569823,15.9261801519,15.9262033213,15.9262264902,15.9262496588,15.926272827, 15.9262959948,15.9263191622,15.9263423293,15.926365496,15.9263886623,15.9264118283,15.9264349939,15.9264581591,15.926481324,15.9265044884,15.9265276525,15.9265508163,15.9265739796,15.9265971426,15.9266203052,15.9266434675, 15.9266666293,15.9266897908,15.926712952,15.9267361127,15.9267592731,15.9267824331,15.9268055928,15.926828752,15.9268519109,15.9268750695,15.9268982276,15.9269213854,15.9269445428,15.9269676998,15.9269908565,15.9270140128, 15.9270371687,15.9270603243,15.9270834795,15.9271066343,15.9271297887,15.9271529428,15.9271760965,15.9271992498,15.9272224027,15.9272455553,15.9272687075,15.9272918593,15.9273150108,15.9273381619,15.9273613126,15.927384463, 15.9274076129,15.9274307626,15.9274539118,15.9274770607,15.9275002091,15.9275233573,15.927546505,15.9275696524,15.9275927994,15.927615946,15.9276390923,15.9276622382,15.9276853837,15.9277085289,15.9277316736,15.927754818, 15.9277779621,15.9278011057,15.927824249,15.927847392,15.9278705345,15.9278936767,15.9279168185,15.9279399599,15.927963101,15.9279862417,15.928009382,15.928032522,15.9280556616,15.9280788008,15.9281019396,15.9281250781, 15.9281482162,15.9281713539,15.9281944912,15.9282176282,15.9282407648,15.9282639011,15.928287037,15.9283101725,15.9283333076,15.9283564423,15.9283795767,15.9284027107,15.9284258444,15.9284489777,15.9284721106,15.9284952431, 15.9285183753,15.928541507,15.9285646385,15.9285877695,15.9286109002,15.9286340305,15.9286571604,15.92868029,15.9287034192,15.928726548,15.9287496765,15.9287728046,15.9287959323,15.9288190596,15.9288421866,15.9288653132, 15.9288884394,15.9289115653,15.9289346907,15.9289578159,15.9289809406,15.929004065,15.929027189,15.9290503126,15.9290734359,15.9290965588,15.9291196813,15.9291428034,15.9291659252,15.9291890466,15.9292121677,15.9292352883, 15.9292584086,15.9292815286,15.9293046481,15.9293277673,15.9293508861,15.9293740046,15.9293971226,15.9294202403,15.9294433577,15.9294664746,15.9294895912,15.9295127075,15.9295358233,15.9295589388,15.9295820539,15.9296051687, 15.929628283,15.929651397,15.9296745107,15.9296976239,15.9297207368,15.9297438493,15.9297669615,15.9297900733,15.9298131847,15.9298362957,15.9298594064,15.9298825167,15.9299056266,15.9299287362,15.9299518453,15.9299749542, 15.9299980626,15.9300211707,15.9300442784,15.9300673857,15.9300904927,15.9301135993,15.9301367055,15.9301598114,15.9301829169,15.930206022,15.9302291267,15.9302522311,15.9302753351,15.9302984387,15.930321542,15.9303446449, 15.9303677474,15.9303908496,15.9304139514,15.9304370528,15.9304601538,15.9304832545,15.9305063548,15.9305294548,15.9305525543,15.9305756535,15.9305987524,15.9306218508,15.9306449489,15.9306680466,15.930691144,15.930714241, 15.9307373376,15.9307604338,15.9307835297,15.9308066252,15.9308297203,15.9308528151,15.9308759095,15.9308990035,15.9309220971,15.9309451904,15.9309682833,15.9309913759,15.931014468,15.9310375598,15.9310606513,15.9310837423, 15.931106833,15.9311299234,15.9311530133,15.9311761029,15.9311991921,15.931222281,15.9312453694,15.9312684575,15.9312915453,15.9313146326,15.9313377196,15.9313608063,15.9313838925,15.9314069784,15.931430064,15.9314531491, 15.9314762339,15.9314993183,15.9315224023,15.931545486,15.9315685693,15.9315916523,15.9316147348,15.931637817,15.9316608989,15.9316839803,15.9317070614,15.9317301421,15.9317532225,15.9317763025,15.9317993821,15.9318224613, 15.9318455402,15.9318686187,15.9318916968,15.9319147746,15.931937852,15.931960929,15.9319840057,15.932007082,15.9320301579,15.9320532334,15.9320763086,15.9320993834,15.9321224579,15.932145532,15.9321686057,15.932191679, 15.932214752,15.9322378246,15.9322608968,15.9322839687,15.9323070402,15.9323301113,15.932353182,15.9323762524,15.9323993224,15.9324223921,15.9324454614,15.9324685303,15.9324915988,15.932514667,15.9325377348,15.9325608022, 15.9325838693,15.932606936,15.9326300023,15.9326530683,15.9326761339,15.9326991991,15.9327222639,15.9327453284,15.9327683925,15.9327914563,15.9328145197,15.9328375827,15.9328606453,15.9328837076,15.9329067695,15.932929831, 15.9329528922,15.932975953,15.9329990134,15.9330220735,15.9330451332,15.9330681925,15.9330912515,15.93311431,15.9331373683,15.9331604261,15.9331834836,15.9332065407,15.9332295974,15.9332526538,15.9332757098,15.9332987655, 15.9333218207,15.9333448756,15.9333679302,15.9333909843,15.9334140381,15.9334370916,15.9334601446,15.9334831973,15.9335062496,15.9335293016,15.9335523532,15.9335754044,15.9335984552,15.9336215057,15.9336445558,15.9336676056, 15.933690655,15.933713704,15.9337367526,15.9337598009,15.9337828488,15.9338058963,15.9338289435,15.9338519903,15.9338750367,15.9338980828,15.9339211285,15.9339441738,15.9339672187,15.9339902633,15.9340133076,15.9340363514, 15.9340593949,15.934082438,15.9341054808,15.9341285232,15.9341515652,15.9341746068,15.9341976481,15.934220689,15.9342437295,15.9342667697,15.9342898095,15.934312849,15.934335888,15.9343589267,15.9343819651,15.934405003, 15.9344280406,15.9344510779,15.9344741147,15.9344971512,15.9345201873,15.9345432231,15.9345662585,15.9345892935,15.9346123282,15.9346353625,15.9346583964,15.9346814299,15.9347044631,15.9347274959,15.9347505284,15.9347735605, 15.9347965922,15.9348196235,15.9348426545,15.9348656851,15.9348887154,15.9349117452,15.9349347747,15.9349578039,15.9349808327,15.9350038611,15.9350268891,15.9350499168,15.9350729441,15.935095971,15.9351189976,15.9351420238, 15.9351650496,15.9351880751,15.9352111002,15.9352341249,15.9352571493,15.9352801733,15.9353031969,15.9353262201,15.935349243,15.9353722656,15.9353952877,15.9354183095,15.9354413309,15.935464352,15.9354873727,15.935510393, 15.935533413,15.9355564325,15.9355794518,15.9356024706,15.9356254891,15.9356485072,15.935671525,15.9356945423,15.9357175594,15.935740576,15.9357635923,15.9357866082,15.9358096238,15.9358326389,15.9358556537,15.9358786682, 15.9359016823,15.935924696,15.9359477093,15.9359707223,15.9359937349,15.9360167472,15.936039759,15.9360627705,15.9360857817,15.9361087925,15.9361318029,15.9361548129,15.9361778226,15.9362008319,15.9362238408,15.9362468494, 15.9362698576,15.9362928654,15.9363158729,15.93633888,15.9363618868,15.9363848931,15.9364078991,15.9364309048,15.93645391,15.9364769149,15.9364999195,15.9365229237,15.9365459275,15.9365689309,15.936591934,15.9366149367, 15.936637939,15.936660941,15.9366839426,15.9367069438,15.9367299447,15.9367529452,15.9367759453,15.9367989451,15.9368219445,15.9368449435,15.9368679422,15.9368909405,15.9369139384,15.936936936,15.9369599332,15.93698293, 15.9370059265,15.9370289226,15.9370519184,15.9370749137,15.9370979087,15.9371209034,15.9371438976,15.9371668915,15.9371898851,15.9372128783,15.9372358711,15.9372588635,15.9372818556,15.9373048473,15.9373278386,15.9373508296, 15.9373738202,15.9373968104,15.9374198003,15.9374427898,15.937465779,15.9374887677,15.9375117561,15.9375347442,15.9375577319,15.9375807192,15.9376037061,15.9376266927,15.9376496789,15.9376726647,15.9376956502,15.9377186353, 15.9377416201,15.9377646045,15.9377875885,15.9378105721,15.9378335554,15.9378565383,15.9378795209,15.937902503,15.9379254849,15.9379484663,15.9379714474,15.9379944281,15.9380174085,15.9380403885,15.9380633681,15.9380863473, 15.9381093262,15.9381323047,15.9381552829,15.9381782607,15.9382012381,15.9382242152,15.9382471919,15.9382701682,15.9382931442,15.9383161197,15.938339095,15.9383620698,15.9383850443,15.9384080185,15.9384309922,15.9384539656, 15.9384769387,15.9384999113,15.9385228836,15.9385458556,15.9385688271,15.9385917983,15.9386147692,15.9386377397,15.9386607098,15.9386836795,15.9387066489,15.9387296179,15.9387525865,15.9387755548,15.9387985227,15.9388214903, 15.9388444575,15.9388674243,15.9388903907,15.9389133568,15.9389363225,15.9389592879,15.9389822529,15.9390052175,15.9390281818,15.9390511457,15.9390741092,15.9390970723,15.9391200351,15.9391429976,15.9391659596,15.9391889213, 15.9392118827,15.9392348436,15.9392578042,15.9392807645,15.9393037243,15.9393266839,15.939349643,15.9393726018,15.9393955602,15.9394185182,15.9394414759,15.9394644332,15.9394873902,15.9395103468,15.939533303,15.9395562588, 15.9395792143,15.9396021694,15.9396251242,15.9396480786,15.9396710326,15.9396939863,15.9397169396,15.9397398925,15.9397628451,15.9397857973,15.9398087491,15.9398317006,15.9398546517,15.9398776024,15.9399005528,15.9399235028, 15.9399464525,15.9399694017,15.9399923507,15.9400152992,15.9400382474,15.9400611952,15.9400841427,15.9401070898,15.9401300365,15.9401529828,15.9401759288,15.9401988745,15.9402218197,15.9402447646,15.9402677092,15.9402906533, 15.9403135971,15.9403365406,15.9403594837,15.9403824264,15.9404053687,15.9404283107,15.9404512523,15.9404741936,15.9404971345,15.940520075,15.9405430151,15.9405659549,15.9405888944,15.9406118334,15.9406347721,15.9406577105, 15.9406806484,15.940703586,15.9407265233,15.9407494601,15.9407723967,15.9407953328,15.9408182686,15.940841204,15.940864139,15.9408870737,15.9409100081,15.940932942,15.9409558756,15.9409788088,15.9410017417,15.9410246742, 15.9410476063,15.9410705381,15.9410934695,15.9411164006,15.9411393312,15.9411622616,15.9411851915,15.9412081211,15.9412310503,15.9412539792,15.9412769076,15.9412998358,15.9413227635,15.9413456909,15.941368618,15.9413915446, 15.9414144709,15.9414373969,15.9414603225,15.9414832477,15.9415061725,15.941529097,15.9415520211,15.9415749449,15.9415978683,15.9416207913,15.941643714,15.9416666363,15.9416895582,15.9417124798,15.941735401,15.9417583218, 15.9417812423,15.9418041624,15.9418270821,15.9418500015,15.9418729205,15.9418958392,15.9419187575,15.9419416754,15.941964593,15.9419875102,15.942010427,15.9420333435,15.9420562596,15.9420791753,15.9421020907,15.9421250057, 15.9421479204,15.9421708347,15.9421937486,15.9422166622,15.9422395754,15.9422624882,15.9422854007,15.9423083128,15.9423312245,15.9423541359,15.9423770469,15.9423999575,15.9424228678,15.9424457778,15.9424686873,15.9424915965, 15.9425145053,15.9425374138,15.9425603219,15.9425832296,15.942606137,15.942629044,15.9426519507,15.942674857,15.9426977629,15.9427206684,15.9427435736,15.9427664785,15.9427893829,15.942812287,15.9428351908,15.9428580941, 15.9428809972,15.9429038998,15.9429268021,15.942949704,15.9429726056,15.9429955068,15.9430184076,15.9430413081,15.9430642082,15.9430871079,15.9431100073,15.9431329063,15.9431558049,15.9431787032,15.9432016011,15.9432244987, 15.9432473959,15.9432702927,15.9432931892,15.9433160853,15.943338981,15.9433618764,15.9433847714,15.9434076661,15.9434305604,15.9434534543,15.9434763479,15.9434992411,15.9435221339,15.9435450264,15.9435679185,15.9435908102, 15.9436137016,15.9436365926,15.9436594833,15.9436823736,15.9437052635,15.9437281531,15.9437510423,15.9437739311,15.9437968196,15.9438197077,15.9438425955,15.9438654829,15.9438883699,15.9439112565,15.9439341428,15.9439570288, 15.9439799143,15.9440027996,15.9440256844,15.9440485689,15.944071453,15.9440943368,15.9441172202,15.9441401032,15.9441629859,15.9441858682,15.9442087501,15.9442316317,15.9442545129,15.9442773938,15.9443002742,15.9443231544, 15.9443460341,15.9443689135,15.9443917926,15.9444146713,15.9444375496,15.9444604275,15.9444833051,15.9445061823,15.9445290592,15.9445519357,15.9445748118,15.9445976876,15.944620563,15.9446434381,15.9446663128,15.9446891871, 15.944712061,15.9447349346,15.9447578079,15.9447806808,15.9448035533,15.9448264254,15.9448492972,15.9448721686,15.9448950397,15.9449179104,15.9449407807,15.9449636507,15.9449865203,15.9450093895,15.9450322584,15.9450551269, 15.9450779951,15.9451008629,15.9451237303,15.9451465974,15.9451694641,15.9451923305,15.9452151965,15.9452380621,15.9452609273,15.9452837922,15.9453066568,15.9453295209,15.9453523848,15.9453752482,15.9453981113,15.945420974, 15.9454438364,15.9454666984,15.94548956,15.9455124213,15.9455352822,15.9455581428,15.9455810029,15.9456038628,15.9456267222,15.9456495813,15.9456724401,15.9456952984,15.9457181565,15.9457410141,15.9457638714,15.9457867283, 15.9458095849,15.9458324411,15.9458552969,15.9458781524,15.9459010075,15.9459238623,15.9459467167,15.9459695707,15.9459924244,15.9460152777,15.9460381307,15.9460609832,15.9460838355,15.9461066873,15.9461295388,15.9461523899, 15.9461752407,15.9461980911,15.9462209412,15.9462437909,15.9462666402,15.9462894892,15.9463123378,15.946335186,15.9463580339,15.9463808814,15.9464037286,15.9464265754,15.9464494218,15.9464722679,15.9464951136,15.9465179589, 15.9465408039,15.9465636485,15.9465864928,15.9466093367,15.9466321802,15.9466550234,15.9466778662,15.9467007087,15.9467235507,15.9467463925,15.9467692338,15.9467920749,15.9468149155,15.9468377558,15.9468605957,15.9468834353, 15.9469062745,15.9469291133,15.9469519518,15.9469747899,15.9469976276,15.947020465,15.9470433021,15.9470661387,15.947088975,15.947111811,15.9471346466,15.9471574818,15.9471803166,15.9472031511,15.9472259853,15.947248819, 15.9472716525,15.9472944855,15.9473173182,15.9473401505,15.9473629825,15.9473858141,15.9474086454,15.9474314762,15.9474543068,15.9474771369,15.9474999667,15.9475227962,15.9475456252,15.947568454,15.9475912823,15.9476141103, 15.947636938,15.9476597652,15.9476825921,15.9477054187,15.9477282449,15.9477510707,15.9477738962,15.9477967213,15.947819546,15.9478423704,15.9478651944,15.9478880181,15.9479108414,15.9479336643,15.9479564869,15.9479793091, 15.948002131,15.9480249525,15.9480477736,15.9480705944,15.9480934148,15.9481162348,15.9481390545,15.9481618739,15.9481846928,15.9482075114,15.9482303297,15.9482531476,15.9482759651,15.9482987823,15.9483215991,15.9483444155, 15.9483672316,15.9483900473,15.9484128627,15.9484356777,15.9484584923,15.9484813066,15.9485041205,15.9485269341,15.9485497472,15.9485725601,15.9485953726,15.9486181847,15.9486409964,15.9486638078,15.9486866188,15.9487094295, 15.9487322398,15.9487550498,15.9487778594,15.9488006686,15.9488234775,15.948846286,15.9488690941,15.9488919019,15.9489147093,15.9489375164,15.9489603231,15.9489831294,15.9490059354,15.949028741,15.9490515463,15.9490743512, 15.9490971557,15.9491199599,15.9491427637,15.9491655672,15.9491883703,15.949211173,15.9492339754,15.9492567774,15.9492795791,15.9493023804,15.9493251813,15.9493479819,15.9493707821,15.949393582,15.9494163815,15.9494391806, 15.9494619794,15.9494847778,15.9495075758,15.9495303735,15.9495531709,15.9495759678,15.9495987644,15.9496215607,15.9496443566,15.9496671521,15.9496899473,15.9497127421,15.9497355366,15.9497583306,15.9497811244,15.9498039177, 15.9498267108,15.9498495034,15.9498722957,15.9498950876,15.9499178792,15.9499406704,15.9499634613,15.9499862518,15.9500090419,15.9500318317,15.9500546211,15.9500774101,15.9501001988,15.9501229871,15.9501457751,15.9501685627, 15.95019135,15.9502141369,15.9502369234,15.9502597096,15.9502824954,15.9503052808,15.9503280659,15.9503508507,15.950373635,15.950396419,15.9504192027,15.950441986,15.9504647689,15.9504875515,15.9505103337,15.9505331156, 15.950555897,15.9505786782,15.950601459,15.9506242394,15.9506470194,15.9506697991,15.9506925785,15.9507153574,15.950738136,15.9507609143,15.9507836922,15.9508064697,15.9508292469,15.9508520237,15.9508748002,15.9508975763, 15.950920352,15.9509431274,15.9509659024,15.9509886771,15.9510114514,15.9510342253,15.9510569989,15.9510797721,15.951102545,15.9511253175,15.9511480896,15.9511708614,15.9511936329,15.9512164039,15.9512391746,15.951261945, 15.951284715,15.9513074846,15.9513302539,15.9513530228,15.9513757913,15.9513985595,15.9514213273,15.9514440948,15.9514668619,15.9514896287,15.9515123951,15.9515351611,15.9515579268,15.9515806921,15.9516034571,15.9516262217, 15.9516489859,15.9516717498,15.9516945133,15.9517172765,15.9517400393,15.9517628017,15.9517855638,15.9518083255,15.9518310869,15.9518538479,15.9518766085,15.9518993688,15.9519221288,15.9519448883,15.9519676475,15.9519904064, 15.9520131649,15.952035923,15.9520586808,15.9520814382,15.9521041953,15.952126952,15.9521497083,15.9521724643,15.9521952199,15.9522179752,15.9522407301,15.9522634846,15.9522862388,15.9523089926,15.9523317461,15.9523544992, 15.952377252,15.9524000044,15.9524227564,15.9524455081,15.9524682594,15.9524910103,15.9525137609,15.9525365112,15.9525592611,15.9525820106,15.9526047597,15.9526275085,15.952650257,15.9526730051,15.9526957528,15.9527185002, 15.9527412472,15.9527639938,15.9527867401,15.9528094861,15.9528322316,15.9528549769,15.9528777217,15.9529004662,15.9529232104,15.9529459541,15.9529686976,15.9529914406,15.9530141833,15.9530369257,15.9530596677,15.9530824093, 15.9531051506,15.9531278915,15.9531506321,15.9531733723,15.9531961121,15.9532188516,15.9532415907,15.9532643295,15.9532870679,15.9533098059,15.9533325436,15.9533552809,15.9533780179,15.9534007545,15.9534234908,15.9534462267, 15.9534689622,15.9534916974,15.9535144322,15.9535371667,15.9535599008,15.9535826346,15.9536053679,15.953628101,15.9536508336,15.953673566,15.9536962979,15.9537190295,15.9537417608,15.9537644916,15.9537872222,15.9538099523, 15.9538326821,15.9538554116,15.9538781407,15.9539008694,15.9539235978,15.9539463258,15.9539690535,15.9539917808,15.9540145077,15.9540372343,15.9540599605,15.9540826864,15.9541054119,15.9541281371,15.9541508619,15.9541735863, 15.9541963104,15.9542190341,15.9542417575,15.9542644805,15.9542872031,15.9543099254,15.9543326474,15.9543553689,15.9543780901,15.954400811,15.9544235315,15.9544462516,15.9544689714,15.9544916909,15.9545144099,15.9545371286, 15.954559847,15.954582565,15.9546052826,15.9546279999,15.9546507168,15.9546734334,15.9546961496,15.9547188655,15.954741581,15.9547642961,15.9547870109,15.9548097253,15.9548324394,15.9548551531,15.9548778664,15.9549005794, 15.954923292,15.9549460043,15.9549687162,15.9549914278,15.955014139,15.9550368498,15.9550595603,15.9550822704,15.9551049802,15.9551276896,15.9551503987,15.9551731074,15.9551958157,15.9552185237,15.9552412313,15.9552639386, 15.9552866455,15.9553093521,15.9553320583,15.9553547641,15.9553774696,15.9554001747,15.9554228795,15.9554455839,15.955468288,15.9554909917,15.955513695,15.955536398,15.9555591006,15.9555818029,15.9556045048,15.9556272063, 15.9556499075,15.9556726084,15.9556953088,15.955718009,15.9557407087,15.9557634081,15.9557861072,15.9558088059,15.9558315042,15.9558542022,15.9558768998,15.9558995971,15.955922294,15.9559449906,15.9559676868,15.9559903826, 15.9560130781,15.9560357732,15.956058468,15.9560811624,15.9561038564,15.9561265501,15.9561492435,15.9561719365,15.9561946291,15.9562173214,15.9562400133,15.9562627048,15.956285396,15.9563080869,15.9563307774,15.9563534675, 15.9563761572,15.9563988467,15.9564215357,15.9564442244,15.9564669128,15.9564896008,15.9565122884,15.9565349757,15.9565576626,15.9565803491,15.9566030353,15.9566257212,15.9566484067,15.9566710918,15.9566937766,15.956716461, 15.9567391451,15.9567618288,15.9567845121,15.9568071951,15.9568298777,15.95685256,15.9568752419,15.9568979235,15.9569206047,15.9569432856,15.9569659661,15.9569886462,15.957011326,15.9570340054,15.9570566845,15.9570793632, 15.9571020416,15.9571247196,15.9571473972,15.9571700745,15.9571927514,15.957215428,15.9572381042,15.9572607801,15.9572834556,15.9573061307,15.9573288055,15.95735148,15.957374154,15.9573968278,15.9574195011,15.9574421742, 15.9574648468,15.9574875191,15.957510191,15.9575328626,15.9575555339,15.9575782047,15.9576008753,15.9576235454,15.9576462152,15.9576688847,15.9576915538,15.9577142225,15.9577368909,15.9577595589,15.9577822266,15.9578048939, 15.9578275608,15.9578502274,15.9578728937,15.9578955596,15.9579182251,15.9579408903,15.9579635551,15.9579862196,15.9580088837,15.9580315474,15.9580542108,15.9580768738,15.9580995365,15.9581221988,15.9581448608,15.9581675224, 15.9581901837,15.9582128446,15.9582355051,15.9582581653,15.9582808252,15.9583034846,15.9583261438,15.9583488025,15.9583714609,15.958394119,15.9584167767,15.958439434,15.958462091,15.9584847477,15.9585074039,15.9585300599, 15.9585527154,15.9585753706,15.9585980255,15.95862068,15.9586433341,15.9586659879,15.9586886413,15.9587112944,15.9587339471,15.9587565995,15.9587792515,15.9588019032,15.9588245545,15.9588472054,15.958869856,15.9588925062, 15.9589151561,15.9589378056,15.9589604548,15.9589831036,15.959005752,15.9590284001,15.9590510479,15.9590736953,15.9590963423,15.959118989,15.9591416353,15.9591642812,15.9591869268,15.9592095721,15.959232217,15.9592548615, 15.9592775057,15.9593001496,15.959322793,15.9593454361,15.9593680789,15.9593907213,15.9594133634,15.9594360051,15.9594586464,15.9594812874,15.959503928,15.9595265683,15.9595492082,15.9595718478,15.959594487,15.9596171259, 15.9596397644,15.9596624025,15.9596850403,15.9597076777,15.9597303148,15.9597529515,15.9597755879,15.9597982239,15.9598208596,15.9598434949,15.9598661298,15.9598887644,15.9599113987,15.9599340325,15.9599566661,15.9599792992, 15.9600019321,15.9600245645,15.9600471966,15.9600698284,15.9600924598,15.9601150908,15.9601377215,15.9601603519,15.9601829818,15.9602056115,15.9602282407,15.9602508696,15.9602734982,15.9602961264,15.9603187542,15.9603413817, 15.9603640089,15.9603866357,15.9604092621,15.9604318882,15.9604545139,15.9604771392,15.9604997643,15.9605223889,15.9605450132,15.9605676372,15.9605902607,15.960612884,15.9606355069,15.9606581294,15.9606807516,15.9607033734, 15.9607259948,15.9607486159,15.9607712367,15.9607938571,15.9608164771,15.9608390968,15.9608617162,15.9608843351,15.9609069538,15.960929572,15.96095219,15.9609748075,15.9609974247,15.9610200416,15.9610426581,15.9610652742, 15.96108789,15.9611105054,15.9611331205,15.9611557352,15.9611783496,15.9612009636,15.9612235773,15.9612461906,15.9612688035,15.9612914161,15.9613140284,15.9613366403,15.9613592518,15.961381863,15.9614044738,15.9614270843, 15.9614496944,15.9614723042,15.9614949136,15.9615175226,15.9615401313,15.9615627397,15.9615853477,15.9616079553,15.9616305626,15.9616531695,15.9616757761,15.9616983823,15.9617209882,15.9617435937,15.9617661988,15.9617888036, 15.9618114081,15.9618340122,15.9618566159,15.9618792193,15.9619018223,15.961924425,15.9619470273,15.9619696293,15.9619922309,15.9620148322,15.9620374331,15.9620600337,15.9620826339,15.9621052337,15.9621278332,15.9621504323, 15.9621730311,15.9621956295,15.9622182276,15.9622408253,15.9622634227,15.9622860197,15.9623086164,15.9623312127,15.9623538086,15.9623764042,15.9623989995,15.9624215944,15.9624441889,15.9624667831,15.9624893769,15.9625119704, 15.9625345635,15.9625571563,15.9625797487,15.9626023408,15.9626249325,15.9626475238,15.9626701148,15.9626927055,15.9627152957,15.9627378857,15.9627604753,15.9627830645,15.9628056534,15.9628282419,15.9628508301,15.9628734179, 15.9628960053,15.9629185924,15.9629411792,15.9629637656,15.9629863516,15.9630089373,15.9630315227,15.9630541077,15.9630766923,15.9630992766,15.9631218605,15.9631444441,15.9631670273,15.9631896102,15.9632121927,15.9632347748, 15.9632573566,15.9632799381,15.9633025192,15.9633250999,15.9633476803,15.9633702604,15.96339284,15.9634154194,15.9634379983,15.963460577,15.9634831552,15.9635057332,15.9635283107,15.9635508879,15.9635734648,15.9635960413, 15.9636186174,15.9636411932,15.9636637687,15.9636863438,15.9637089185,15.9637314929,15.9637540669,15.9637766406,15.9637992139,15.9638217869,15.9638443595,15.9638669318,15.9638895037,15.9639120753,15.9639346465,15.9639572173, 15.9639797878,15.964002358,15.9640249278,15.9640474972,15.9640700663,15.964092635,15.9641152034,15.9641377714,15.9641603391,15.9641829064,15.9642054734,15.96422804,15.9642506063,15.9642731722,15.9642957377,15.9643183029, 15.9643408678,15.9643634323,15.9643859964,15.9644085602,15.9644311237,15.9644536868,15.9644762495,15.9644988119,15.9645213739,15.9645439356,15.9645664969,15.9645890579,15.9646116185,15.9646341787,15.9646567387,15.9646792982, 15.9647018574,15.9647244163,15.9647469748,15.9647695329,15.9647920907,15.9648146482,15.9648372052,15.964859762,15.9648823184,15.9649048744,15.9649274301,15.9649499854,15.9649725404,15.964995095,15.9650176493,15.9650402032, 15.9650627567,15.96508531,15.9651078628,15.9651304153,15.9651529675,15.9651755193,15.9651980707,15.9652206218,15.9652431726,15.9652657229,15.965288273,15.9653108227,15.965333372,15.965355921,15.9653784696,15.9654010179, 15.9654235658,15.9654461134,15.9654686606,15.9654912075,15.965513754,15.9655363001,15.9655588459,15.9655813914,15.9656039365,15.9656264813,15.9656490257,15.9656715697,15.9656941134,15.9657166567,15.9657391997,15.9657617424, 15.9657842847,15.9658068266,15.9658293682,15.9658519094,15.9658744503,15.9658969908,15.965919531,15.9659420708,15.9659646103,15.9659871494,15.9660096882,15.9660322266,15.9660547646,15.9660773023,15.9660998397,15.9661223767, 15.9661449133,15.9661674496,15.9661899856,15.9662125212,15.9662350564,15.9662575913,15.9662801259,15.9663026601,15.9663251939,15.9663477274,15.9663702605,15.9663927933,15.9664153257,15.9664378578,15.9664603895,15.9664829209, 15.9665054519,15.9665279826,15.9665505129,15.9665730429,15.9665955725,15.9666181017,15.9666406306,15.9666631592,15.9666856874,15.9667082153,15.9667307428,15.9667532699,15.9667757967,15.9667983232,15.9668208493,15.966843375, 15.9668659004,15.9668884254,15.9669109501,15.9669334745,15.9669559984,15.9669785221,15.9670010454,15.9670235683,15.9670460909,15.9670686131,15.967091135,15.9671136565,15.9671361777,15.9671586985,15.967181219,15.9672037391, 15.9672262588,15.9672487783,15.9672712973,15.967293816,15.9673163344,15.9673388524,15.9673613701,15.9673838874,15.9674064043,15.9674289209,15.9674514372,15.9674739531,15.9674964686,15.9675189838,15.9675414987,15.9675640132, 15.9675865273,15.9676090411,15.9676315545,15.9676540676,15.9676765804,15.9676990927,15.9677216048,15.9677441165,15.9677666278,15.9677891388,15.9678116494,15.9678341597,15.9678566696,15.9678791792,15.9679016884,15.9679241973, 15.9679467058,15.967969214,15.9679917218,15.9680142293,15.9680367364,15.9680592432,15.9680817496,15.9681042556,15.9681267614,15.9681492667,15.9681717717,15.9681942764,15.9682167807,15.9682392847,15.9682617883,15.9682842915, 15.9683067944,15.968329297,15.9683517992,15.968374301,15.9683968025,15.9684193037,15.9684418045,15.9684643049,15.968486805,15.9685093048,15.9685318042,15.9685543032,15.9685768019,15.9685993003,15.9686217983,15.9686442959, 15.9686667932,15.9686892901,15.9687117867,15.968734283,15.9687567789,15.9687792744,15.9688017696,15.9688242644,15.9688467589,15.968869253,15.9688917468,15.9689142402,15.9689367333,15.9689592261,15.9689817184,15.9690042105, 15.9690267022,15.9690491935,15.9690716845,15.9690941751,15.9691166654,15.9691391553,15.9691616449,15.9691841341,15.969206623,15.9692291115,15.9692515997,15.9692740875,15.969296575,15.9693190621,15.9693415489,15.9693640353, 15.9693865213,15.9694090071,15.9694314924,15.9694539775,15.9694764621,15.9694989464,15.9695214304,15.969543914,15.9695663973,15.9695888802,15.9696113628,15.969633845,15.9696563269,15.9696788084,15.9697012895,15.9697237704, 15.9697462508,15.9697687309,15.9697912107,15.9698136901,15.9698361692,15.9698586479,15.9698811262,15.9699036043,15.9699260819,15.9699485592,15.9699710362,15.9699935128,15.9700159891,15.970038465,15.9700609405,15.9700834158, 15.9701058906,15.9701283651,15.9701508393,15.9701733131,15.9701957866,15.9702182597,15.9702407324,15.9702632048,15.9702856769,15.9703081486,15.97033062,15.970353091,15.9703755616,15.9703980319,15.9704205019,15.9704429715, 15.9704654408,15.9704879097,15.9705103783,15.9705328465,15.9705553143,15.9705777818,15.970600249,15.9706227158,15.9706451823,15.9706676484,15.9706901141,15.9707125796,15.9707350446,15.9707575093,15.9707799737,15.9708024377, 15.9708249014,15.9708473647,15.9708698276,15.9708922903,15.9709147525,15.9709372144,15.970959676,15.9709821372,15.9710045981,15.9710270586,15.9710495188,15.9710719786,15.971094438,15.9711168972,15.9711393559,15.9711618143, 15.9711842724,15.9712067301,15.9712291875,15.9712516445,15.9712741012,15.9712965575,15.9713190135,15.9713414691,15.9713639244,15.9713863793,15.9714088339,15.9714312881,15.971453742,15.9714761955,15.9714986487,15.9715211015, 15.971543554,15.9715660061,15.9715884579,15.9716109093,15.9716333604,15.9716558111,15.9716782615,15.9717007115,15.9717231612,15.9717456105,15.9717680595,15.9717905081,15.9718129564,15.9718354043,15.9718578519,15.9718802992, 15.971902746,15.9719251926,15.9719476388,15.9719700846,15.9719925301,15.9720149752,15.97203742,15.9720598645,15.9720823086,15.9721047523,15.9721271957,15.9721496387,15.9721720814,15.9721945238,15.9722169658,15.9722394074, 15.9722618487,15.9722842897,15.9723067303,15.9723291705,15.9723516104,15.97237405,15.9723964892,15.9724189281,15.9724413666,15.9724638047,15.9724862425,15.97250868,15.9725311171,15.9725535539,15.9725759903,15.9725984263, 15.9726208621,15.9726432974,15.9726657324,15.9726881671,15.9727106014,15.9727330354,15.972755469,15.9727779023,15.9728003352,15.9728227678,15.9728452,15.9728676319,15.9728900634,15.9729124946,15.9729349254,15.9729573559, 15.9729797861,15.9730022159,15.9730246453,15.9730470744,15.9730695031,15.9730919315,15.9731143596,15.9731367872,15.9731592146,15.9731816416,15.9732040682,15.9732264945,15.9732489205,15.9732713461,15.9732937713,15.9733161962, 15.9733386208,15.973361045,15.9733834689,15.9734058924,15.9734283155,15.9734507384,15.9734731608,15.9734955829,15.9735180047,15.9735404261,15.9735628472,15.9735852679,15.9736076883,15.9736301083,15.973652528,15.9736749473, 15.9736973663,15.9737197849,15.9737422032,15.9737646212,15.9737870387,15.973809456,15.9738318729,15.9738542894,15.9738767056,15.9738991215,15.973921537,15.9739439521,15.9739663669,15.9739887814,15.9740111955,15.9740336092, 15.9740560226,15.9740784357,15.9741008484,15.9741232608,15.9741456728,15.9741680844,15.9741904958,15.9742129067,15.9742353174,15.9742577276,15.9742801376,15.9743025471,15.9743249564,15.9743473652,15.9743697738,15.974392182, 15.9744145898,15.9744369973,15.9744594044,15.9744818112,15.9745042177,15.9745266238,15.9745490295,15.9745714349,15.97459384,15.9746162447,15.974638649,15.9746610531,15.9746834567,15.97470586,15.974728263,15.9747506656, 15.9747730679,15.9747954698,15.9748178714,15.9748402726,15.9748626735,15.974885074,15.9749074742,15.974929874,15.9749522735,15.9749746727,15.9749970715,15.9750194699,15.975041868,15.9750642658,15.9750866632,15.9751090602, 15.9751314569,15.9751538533,15.9751762493,15.975198645,15.9752210403,15.9752434352,15.9752658299,15.9752882241,15.9753106181,15.9753330116,15.9753554049,15.9753777977,15.9754001903,15.9754225825,15.9754449743,15.9754673658, 15.9754897569,15.9755121477,15.9755345382,15.9755569283,15.975579318,15.9756017075,15.9756240965,15.9756464852,15.9756688736,15.9756912616,15.9757136493,15.9757360366,15.9757584236,15.9757808102,15.9758031965,15.9758255824, 15.975847968,15.9758703532,15.9758927381,15.9759151227,15.9759375069,15.9759598907,15.9759822742,15.9760046574,15.9760270402,15.9760494226,15.9760718048,15.9760941865,15.9761165679,15.976138949,15.9761613297,15.9761837101, 15.9762060901,15.9762284698,15.9762508492,15.9762732282,15.9762956068,15.9763179851,15.976340363,15.9763627406,15.9763851179,15.9764074948,15.9764298714,15.9764522476,15.9764746234,15.9764969989,15.9765193741,15.9765417489, 15.9765641234,15.9765864975,15.9766088713,15.9766312448,15.9766536179,15.9766759906,15.976698363,15.976720735,15.9767431067,15.9767654781,15.9767878491,15.9768102198,15.9768325901,15.97685496,15.9768773297,15.9768996989, 15.9769220679,15.9769444364,15.9769668047,15.9769891725,15.9770115401,15.9770339073,15.9770562741,15.9770786406,15.9771010068,15.9771233726,15.977145738,15.9771681031,15.9771904679,15.9772128323,15.9772351964,15.9772575601, 15.9772799235,15.9773022865,15.9773246492,15.9773470116,15.9773693735,15.9773917352,15.9774140965,15.9774364574,15.977458818,15.9774811783,15.9775035382,15.9775258978,15.977548257,15.9775706159,15.9775929744,15.9776153326, 15.9776376904,15.9776600479,15.977682405,15.9777047618,15.9777271183,15.9777494744,15.9777718301,15.9777941855,15.9778165406,15.9778388953,15.9778612497,15.9778836037,15.9779059574,15.9779283107,15.9779506637,15.9779730163, 15.9779953686,15.9780177206,15.9780400722,15.9780624234,15.9780847743,15.9781071249,15.9781294751,15.9781518249,15.9781741745,15.9781965236,15.9782188725,15.978241221,15.9782635691,15.9782859169,15.9783082643,15.9783306114, 15.9783529582,15.9783753046,15.9783976506,15.9784199963,15.9784423417,15.9784646867,15.9784870314,15.9785093757,15.9785317197,15.9785540633,15.9785764066,15.9785987496,15.9786210922,15.9786434344,15.9786657763,15.9786881179, 15.9787104591,15.9787328,15.9787551405,15.9787774807,15.9787998205,15.97882216,15.9788444991,15.9788668379,15.9788891764,15.9789115145,15.9789338522,15.9789561896,15.9789785267,15.9790008634,15.9790231998,15.9790455358, 15.9790678715,15.9790902068,15.9791125418,15.9791348764,15.9791572107,15.9791795447,15.9792018783,15.9792242116,15.9792465445,15.979268877,15.9792912093,15.9793135411,15.9793358727,15.9793582039,15.9793805347,15.9794028652, 15.9794251953,15.9794475251,15.9794698546,15.9794921837,15.9795145125,15.9795368409,15.979559169,15.9795814967,15.9796038241,15.9796261511,15.9796484778,15.9796708042,15.9796931302,15.9797154558,15.9797377811,15.9797601061, 15.9797824307,15.979804755,15.9798270789,15.9798494025,15.9798717257,15.9798940486,15.9799163712,15.9799386934,15.9799610152,15.9799833367,15.9800056579,15.9800279787,15.9800502992,15.9800726193,15.9800949391,15.9801172585, 15.9801395776,15.9801618964,15.9801842148,15.9802065328,15.9802288506,15.9802511679,15.9802734849,15.9802958016,15.980318118,15.9803404339,15.9803627496,15.9803850649,15.9804073798,15.9804296944,15.9804520087,15.9804743226, 15.9804966362,15.9805189494,15.9805412623,15.9805635748,15.980585887,15.9806081989,15.9806305104,15.9806528215,15.9806751323,15.9806974428,15.9807197529,15.9807420627,15.9807643721,15.9807866812,15.9808089899,15.9808312983, 15.9808536064,15.9808759141,15.9808982214,15.9809205285,15.9809428351,15.9809651415,15.9809874474,15.9810097531,15.9810320584,15.9810543633,15.9810766679,15.9810989722,15.9811212761,15.9811435796,15.9811658829,15.9811881857, 15.9812104883,15.9812327905,15.9812550923,15.9812773938,15.981299695,15.9813219958,15.9813442962,15.9813665963,15.9813888961,15.9814111955,15.9814334946,15.9814557934,15.9814780918,15.9815003898,15.9815226875,15.9815449849, 15.9815672819,15.9815895786,15.9816118749,15.9816341709,15.9816564665,15.9816787618,15.9817010568,15.9817233514,15.9817456456,15.9817679396,15.9817902331,15.9818125263,15.9818348192,15.9818571118,15.981879404,15.9819016958, 15.9819239873,15.9819462785,15.9819685693,15.9819908598,15.9820131499,15.9820354397,15.9820577291,15.9820800182,15.982102307,15.9821245954,15.9821468834,15.9821691711,15.9821914585,15.9822137455,15.9822360322,15.9822583186, 15.9822806046,15.9823028902,15.9823251755,15.9823474605,15.9823697451,15.9823920294,15.9824143133,15.9824365969,15.9824588801,15.982481163,15.9825034456,15.9825257278,15.9825480097,15.9825702912,15.9825925723,15.9826148532, 15.9826371337,15.9826594138,15.9826816936,15.9827039731,15.9827262522,15.982748531,15.9827708094,15.9827930875,15.9828153652,15.9828376426,15.9828599196,15.9828821963,15.9829044727,15.9829267487,15.9829490244,15.9829712997, 15.9829935747,15.9830158493,15.9830381236,15.9830603976,15.9830826712,15.9831049445,15.9831272174,15.98314949,15.9831717622,15.9831940341,15.9832163056,15.9832385768,15.9832608477,15.9832831182,15.9833053884,15.9833276582, 15.9833499277,15.9833721968,15.9833944656,15.9834167341,15.9834390022,15.9834612699,15.9834835374,15.9835058044,15.9835280712,15.9835503376,15.9835726036,15.9835948693,15.9836171347,15.9836393997,15.9836616643,15.9836839287, 15.9837061927,15.9837284563,15.9837507196,15.9837729826,15.9837952452,15.9838175074,15.9838397693,15.9838620309,15.9838842922,15.9839065531,15.9839288136,15.9839510738,15.9839733337,15.9839955932,15.9840178524,15.9840401112, 15.9840623697,15.9840846278,15.9841068856,15.9841291431,15.9841514002,15.984173657,15.9841959134,15.9842181695,15.9842404252,15.9842626806,15.9842849357,15.9843071904,15.9843294448,15.9843516988,15.9843739525,15.9843962058, 15.9844184588,15.9844407115,15.9844629638,15.9844852157,15.9845074673,15.9845297186,15.9845519696,15.9845742202,15.9845964704,15.9846187203,15.9846409699,15.9846632191,15.984685468,15.9847077165,15.9847299647,15.9847522125, 15.98477446,15.9847967072,15.984818954,15.9848412005,15.9848634466,15.9848856924,15.9849079379,15.984930183,15.9849524277,15.9849746721,15.9849969162,15.98501916,15.9850414033,15.9850636464,15.9850858891,15.9851081315, 15.9851303735,15.9851526151,15.9851748565,15.9851970975,15.9852193381,15.9852415784,15.9852638184,15.985286058,15.9853082973,15.9853305362,15.9853527748,15.985375013,15.9853972509,15.9854194885,15.9854417257,15.9854639626, 15.9854861991,15.9855084353,15.9855306711,15.9855529066,15.9855751418,15.9855973766,15.9856196111,15.9856418452,15.985664079,15.9856863125,15.9857085456,15.9857307783,15.9857530108,15.9857752428,15.9857974746,15.985819706, 15.985841937,15.9858641677,15.9858863981,15.9859086281,15.9859308578,15.9859530871,15.9859753161,15.9859975448,15.9860197731,15.986042001,15.9860642287,15.9860864559,15.9861086829,15.9861309095,15.9861531357,15.9861753616, 15.9861975872,15.9862198124,15.9862420373,15.9862642619,15.9862864861,15.9863087099,15.9863309334,15.9863531566,15.9863753794,15.9863976019,15.9864198241,15.9864420459,15.9864642673,15.9864864885,15.9865087092,15.9865309297, 15.9865531498,15.9865753695,15.9865975889,15.986619808,15.9866420267,15.9866642451,15.9866864631,15.9867086808,15.9867308982,15.9867531152,15.9867753319,15.9867975482,15.9868197642,15.9868419798,15.9868641951,15.9868864101, 15.9869086247,15.986930839,15.9869530529,15.9869752665,15.9869974797,15.9870196927,15.9870419052,15.9870641174,15.9870863293,15.9871085409,15.9871307521,15.9871529629,15.9871751734,15.9871973836,15.9872195934,15.9872418029, 15.9872640121,15.9872862209,15.9873084293,15.9873306375,15.9873528452,15.9873750527,15.9873972598,15.9874194665,15.9874416729,15.987463879,15.9874860847,15.9875082901,15.9875304952,15.9875526999,15.9875749042,15.9875971082, 15.9876193119,15.9876415153,15.9876637183,15.9876859209,15.9877081232,15.9877303252,15.9877525268,15.9877747281,15.987796929,15.9878191296,15.9878413299,15.9878635298,15.9878857294,15.9879079286,15.9879301275,15.9879523261, 15.9879745243,15.9879967222,15.9880189197,15.9880411169,15.9880633137,15.9880855102,15.9881077064,15.9881299022,15.9881520977,15.9881742928,15.9881964876,15.9882186821,15.9882408762,15.98826307,15.9882852634,15.9883074565, 15.9883296492,15.9883518416,15.9883740337,15.9883962254,15.9884184168,15.9884406078,15.9884627985,15.9884849889,15.9885071789,15.9885293686,15.9885515579,15.9885737469,15.9885959356,15.9886181239,15.9886403119,15.9886624995, 15.9886846868,15.9887068737,15.9887290603,15.9887512466,15.9887734325,15.9887956181,15.9888178033,15.9888399882,15.9888621728,15.988884357,15.9889065409,15.9889287244,15.9889509076,15.9889730905,15.988995273,15.9890174551, 15.989039637,15.9890618184,15.9890839996,15.9891061804,15.9891283609,15.989150541,15.9891727208,15.9891949002,15.9892170793,15.9892392581,15.9892614365,15.9892836146,15.9893057923,15.9893279697,15.9893501468,15.9893723235, 15.9893944998,15.9894166759,15.9894388516,15.9894610269,15.9894832019,15.9895053766,15.9895275509,15.9895497249,15.9895718986,15.9895940719,15.9896162448,15.9896384175,15.9896605897,15.9896827617,15.9897049333,15.9897271045, 15.9897492755,15.989771446,15.9897936163,15.9898157862,15.9898379557,15.989860125,15.9898822938,15.9899044624,15.9899266306,15.9899487984,15.9899709659,15.9899931331,15.9900152999,15.9900374664,15.9900596326,15.9900817984, 15.9901039639,15.990126129,15.9901482938,15.9901704582,15.9901926223,15.9902147861,15.9902369495,15.9902591126,15.9902812754,15.9903034378,15.9903255998,15.9903477616,15.9903699229,15.990392084,15.9904142447,15.9904364051, 15.9904585651,15.9904807248,15.9905028841,15.9905250431,15.9905472018,15.9905693601,15.9905915181,15.9906136757,15.990635833,15.99065799,15.9906801466,15.9907023029,15.9907244588,15.9907466144,15.9907687697,15.9907909246, 15.9908130792,15.9908352334,15.9908573873,15.9908795408,15.9909016941,15.9909238469,15.9909459995,15.9909681517,15.9909903035,15.991012455,15.9910346062,15.9910567571,15.9910789076,15.9911010577,15.9911232075,15.991145357, 15.9911675061,15.9911896549,15.9912118034,15.9912339515,15.9912560993,15.9912782467,15.9913003938,15.9913225406,15.991344687,15.9913668331,15.9913889788,15.9914111242,15.9914332693,15.991455414,15.9914775583,15.9914997024, 15.9915218461,15.9915439894,15.9915661324,15.9915882751,15.9916104175,15.9916325595,15.9916547011,15.9916768424,15.9916989834,15.9917211241,15.9917432643,15.9917654043,15.9917875439,15.9918096832,15.9918318221,15.9918539607, 15.991876099,15.9918982369,15.9919203745,15.9919425117,15.9919646486,15.9919867852,15.9920089214,15.9920310573,15.9920531929,15.9920753281,15.9920974629,15.9921195974,15.9921417316,15.9921638655,15.992185999,15.9922081321, 15.992230265,15.9922523975,15.9922745296,15.9922966614,15.9923187929,15.992340924,15.9923630548,15.9923851852,15.9924073153,15.9924294451,15.9924515745,15.9924737036,15.9924958324,15.9925179608,15.9925400889,15.9925622166, 15.992584344,15.9926064711,15.9926285978,15.9926507242,15.9926728502,15.9926949759,15.9927171012,15.9927392263,15.9927613509,15.9927834753,15.9928055993,15.9928277229,15.9928498463,15.9928719693,15.9928940919,15.9929162142, 15.9929383362,15.9929604578,15.9929825791,15.9930047,15.9930268206,15.9930489409,15.9930710608,15.9930931804,15.9931152997,15.9931374186,15.9931595372,15.9931816554,15.9932037733,15.9932258909,15.9932480081,15.9932701249, 15.9932922415,15.9933143577,15.9933364736,15.9933585891,15.9933807043,15.9934028191,15.9934249336,15.9934470478,15.9934691616,15.9934912751,15.9935133882,15.993535501,15.9935576135,15.9935797257,15.9936018374,15.9936239489, 15.99364606,15.9936681708,15.9936902812,15.9937123913,15.9937345011,15.9937566105,15.9937787196,15.9938008283,15.9938229367,15.9938450448,15.9938671525,15.9938892599,15.993911367,15.9939334737,15.9939555801,15.9939776861, 15.9939997918,15.9940218971,15.9940440022,15.9940661068,15.9940882112,15.9941103152,15.9941324189,15.9941545222,15.9941766252,15.9941987278,15.9942208301,15.9942429321,15.9942650337,15.994287135,15.994309236,15.9943313366, 15.9943534369,15.9943755368,15.9943976364,15.9944197357,15.9944418346,15.9944639332,15.9944860314,15.9945081293,15.9945302269,15.9945523241,15.994574421,15.9945965176,15.9946186138,15.9946407097,15.9946628052,15.9946849004, 15.9947069953,15.9947290898,15.994751184,15.9947732778,15.9947953713,15.9948174645,15.9948395573,15.9948616498,15.994883742,15.9949058338,15.9949279253,15.9949500164,15.9949721072,15.9949941977,15.9950162878,15.9950383776, 15.995060467,15.9950825561,15.9951046449,15.9951267334,15.9951488214,15.9951709092,15.9951929966,15.9952150837,15.9952371704,15.9952592569,15.9952813429,15.9953034287,15.995325514,15.9953475991,15.9953696838,15.9953917682, 15.9954138522,15.9954359359,15.9954580193,15.9954801023,15.995502185,15.9955242673,15.9955463494,15.995568431,15.9955905124,15.9956125934,15.995634674,15.9956567543,15.9956788343,15.995700914,15.9957229933,15.9957450722, 15.9957671509,15.9957892292,15.9958113071,15.9958333847,15.995855462,15.995877539,15.9958996156,15.9959216918,15.9959437678,15.9959658434,15.9959879186,15.9960099935,15.9960320681,15.9960541423,15.9960762162,15.9960982898, 15.996120363,15.9961424359,15.9961645085,15.9961865807,15.9962086526,15.9962307241,15.9962527953,15.9962748662,15.9962969367,15.9963190069,15.9963410767,15.9963631462,15.9963852154,15.9964072842,15.9964293527,15.9964514209, 15.9964734887,15.9964955562,15.9965176234,15.9965396902,15.9965617567,15.9965838228,15.9966058886,15.9966279541,15.9966500192,15.996672084,15.9966941484,15.9967162125,15.9967382763,15.9967603397,15.9967824028,15.9968044656, 15.996826528,15.9968485901,15.9968706519,15.9968927133,15.9969147743,15.9969368351,15.9969588955,15.9969809555,15.9970030153,15.9970250747,15.9970471337,15.9970691924,15.9970912508,15.9971133088,15.9971353665,15.9971574239, 15.9971794809,15.9972015376,15.997223594,15.99724565,15.9972677057,15.997289761,15.997311816,15.9973338707,15.997355925,15.997377979,15.9974000327,15.997422086,15.997444139,15.9974661916,15.9974882439,15.9975102959, 15.9975323475,15.9975543988,15.9975764498,15.9975985004,15.9976205507,15.9976426006,15.9976646502,15.9976866995,15.9977087485,15.9977307971,15.9977528453,15.9977748933,15.9977969408,15.9978189881,15.997841035,15.9978630816, 15.9978851278,15.9979071737,15.9979292193,15.9979512645,15.9979733094,15.997995354,15.9980173982,15.9980394421,15.9980614856,15.9980835288,15.9981055717,15.9981276143,15.9981496565,15.9981716983,15.9981937398,15.998215781, 15.9982378219,15.9982598624,15.9982819026,15.9983039424,15.9983259819,15.9983480211,15.9983700599,15.9983920984,15.9984141366,15.9984361744,15.9984582119,15.998480249,15.9985022859,15.9985243223,15.9985463585,15.9985683943, 15.9985904297,15.9986124649,15.9986344997,15.9986565341,15.9986785682,15.998700602,15.9987226355,15.9987446686,15.9987667014,15.9987887338,15.9988107659,15.9988327977,15.9988548291,15.9988768602,15.9988988909,15.9989209214, 15.9989429514,15.9989649812,15.9989870106,15.9990090397,15.9990310684,15.9990530968,15.9990751249,15.9990971526,15.99911918,15.9991412071,15.9991632338,15.9991852602,15.9992072862,15.9992293119,15.9992513373,15.9992733623, 15.999295387,15.9993174114,15.9993394354,15.9993614591,15.9993834825,15.9994055055,15.9994275282,15.9994495505,15.9994715725,15.9994935942,15.9995156155,15.9995376366,15.9995596572,15.9995816776,15.9996036975,15.9996257172, 15.9996477365,15.9996697555,15.9996917742,15.9997137925,15.9997358105,15.9997578281,15.9997798454,15.9998018624,15.999823879,15.9998458953,15.9998679113,15.9998899269,15.9999119422,15.9999339572,15.9999559718,15.9999779861 ]; brotli-3.4.0/src/enc/vectorization.rs000075500000000000000000000031551046102023000157340ustar 00000000000000#![allow(unknown_lints)] #![allow(unused_macros)] use enc::{v8, s8}; use enc::util::FastLog2; pub type Mem256f = v8; pub type Mem256i = s8; pub type v256 = v8; pub type v256i = s8; pub fn sum8(x: v256) -> f32 { x.extract(0) + x.extract(1) + x.extract(2) + x.extract(3) + x.extract(4) + x.extract(5) + x.extract(6) + x.extract(7) } pub fn sum8i(x: v256i) -> i32 { x.extract(0).wrapping_add(x.extract(1)).wrapping_add( x.extract(2)).wrapping_add( x.extract(3)).wrapping_add( x.extract(4)).wrapping_add( x.extract(5)).wrapping_add( x.extract(6)).wrapping_add(x.extract(7)) } pub fn log2i(x: v256i) -> v256 { v256::new(FastLog2(x.extract(0) as u64), FastLog2(x.extract(1) as u64), FastLog2(x.extract(2) as u64), FastLog2(x.extract(3) as u64), FastLog2(x.extract(4) as u64), FastLog2(x.extract(5) as u64), FastLog2(x.extract(6) as u64), FastLog2(x.extract(7) as u64)) } pub fn cast_i32_to_f32(x: v256i) -> v256 { v256::new(x.extract(0) as f32, x.extract(1) as f32, x.extract(2) as f32, x.extract(3) as f32, x.extract(4) as f32, x.extract(5) as f32, x.extract(6) as f32, x.extract(7) as f32) } pub fn cast_f32_to_i32(x: v256) -> v256i { v256i::new(x.extract(0) as i32, x.extract(1) as i32, x.extract(2) as i32, x.extract(3) as i32, x.extract(4) as i32, x.extract(5) as i32, x.extract(6) as i32, x.extract(7) as i32) } brotli-3.4.0/src/enc/weights.rs000064400000000000000000000123561046102023000145060ustar 00000000000000use core; pub type Prob = u16; pub const BLEND_FIXED_POINT_PRECISION : i8 = 15; #[allow(dead_code)] pub const LOG2_SCALE : i32 = 15; #[derive(Debug,Copy, Clone)] pub struct Weights { model_weights: [i32;2], mixing_param: u8, normalized_weight: Prob, } impl Default for Weights { fn default() -> Self { Self::new() } } impl Weights { pub fn new() -> Self { Weights { model_weights:[1;2], mixing_param: 1, normalized_weight: 1 << (BLEND_FIXED_POINT_PRECISION - 1), } } #[allow(unused)] #[inline(always)] pub fn update(&mut self, model_probs: [Prob; 2], weighted_prob: Prob) { debug_assert!(self.mixing_param != 0); normalize_weights(&mut self.model_weights); let w0new = compute_new_weight(model_probs, weighted_prob, self.model_weights, false, self.mixing_param - 1); let w1new = compute_new_weight(model_probs, weighted_prob, self.model_weights, true, self.mixing_param - 1); self.model_weights = [w0new, w1new]; self.normalized_weight = compute_normalized_weight(self.model_weights); } #[allow(dead_code)] #[inline(always)] pub fn norm_weight(&self) -> Prob { self.normalized_weight } } #[allow(dead_code)] #[inline(always)] fn compute_normalized_weight(model_weights: [i32;2]) -> Prob { let total = i64::from(model_weights[0]) + i64::from(model_weights[1]); let leading_zeros = total.leading_zeros(); let shift = core::cmp::max(56 - (leading_zeros as i8), 0); let total_8bit = total >> shift; /*::probability::numeric::fast_divide_16bit_by_8bit( ((model_weights[0] >> shift) as u16)<< 8, ::probability::numeric::lookup_divisor8(total_8bit as u8)) << (BLEND_FIXED_POINT_PRECISION - 8) */ ((((model_weights[0] >> shift) as u16)<< 8) / total_8bit as u16/*fixme??*/) << (BLEND_FIXED_POINT_PRECISION - 8) } #[allow(dead_code)] #[cold] fn fix_weights(weights: &mut [i32;2]) { let ilog = 32 - core::cmp::min(weights[0].leading_zeros(), weights[1].leading_zeros()); let max_log = 24; if ilog >= max_log { weights[0] >>= ilog - max_log; weights[1] >>= ilog - max_log; } } #[allow(dead_code)] #[inline(always)] fn normalize_weights(weights: &mut [i32;2]) { if ((weights[0]|weights[1])&0x7f000000) != 0 { fix_weights(weights); } } #[allow(dead_code)] #[cfg(features="floating_point_context_mixing")] fn compute_new_weight(probs: [Prob; 2], weighted_prob: Prob, weights: [i32;2], index_equal_1: bool, _speed: u8) -> i32{ // speed ranges from 1 to 14 inclusive let index = index_equal_1 as usize; let n1i = probs[index] as f64 / ((1i64 << LOG2_SCALE) as f64); //let n0i = 1.0f64 - n1i; let ni = 1.0f64; let s1 = weighted_prob as f64 / ((1i64 << LOG2_SCALE) as f64); let s0 = 1.0f64 - s1; let s = 1.0f64; //let p0 = s0; let p1 = s1; let wi = weights[index] as f64 / ((1i64 << LOG2_SCALE) as f64); let mut wi_new = wi + (1.0 - p1) * (s * n1i - s1 * ni) / (s0 * s1); let eps = 0.00001f64; if !(wi_new > eps) { wi_new = eps; } (wi_new * ((1i64 << LOG2_SCALE) as f64)) as i32 } #[allow(dead_code)] #[cfg(not(features="floating_point_context_mixing"))] #[inline(always)] fn compute_new_weight(probs: [Prob; 2], weighted_prob: Prob, weights: [i32;2], index_equal_1: bool, _speed: u8) -> i32{ // speed ranges from 1 to 14 inclusive let index = index_equal_1 as usize; let full_model_sum_p1 = i64::from(weighted_prob); let full_model_total = 1i64 << LOG2_SCALE; let full_model_sum_p0 = full_model_total.wrapping_sub(i64::from(weighted_prob)); let n1i = i64::from(probs[index]); let ni = 1i64 << LOG2_SCALE; let error = full_model_total.wrapping_sub(full_model_sum_p1); let wi = i64::from(weights[index]); let efficacy = full_model_total.wrapping_mul(n1i) - full_model_sum_p1.wrapping_mul(ni); //let geometric_probabilities = full_model_sum_p1 * full_model_sum_p0; let log_geometric_probabilities = 64 - (full_model_sum_p1.wrapping_mul(full_model_sum_p0)).leading_zeros(); //let scaled_geometric_probabilities = geometric_probabilities * S; //let new_weight_adj = (error * efficacy) >> log_geometric_probabilities;// / geometric_probabilities; //let new_weight_adj = (error * efficacy)/(full_model_sum_p1 * full_model_sum_p0); let new_weight_adj = (error.wrapping_mul(efficacy)) >> log_geometric_probabilities; // assert!(wi + new_weight_adj < (1i64 << 31)); //print!("{} -> {} due to {:?} vs {}\n", wi as f64 / (weights[0] + weights[1]) as f64, (wi + new_weight_adj) as f64 /(weights[0] as i64 + new_weight_adj as i64 + weights[1] as i64) as f64, probs[index], weighted_prob); core::cmp::max(1,wi.wrapping_add(new_weight_adj) as i32) } brotli-3.4.0/src/enc/worker_pool.rs000075500000000000000000000271561046102023000154050ustar 00000000000000#![cfg(feature="std")] use core::mem; use std; use std::sync:: { Arc, Mutex, Condvar, }; use alloc::{SliceWrapper, Allocator}; use enc::BrotliAlloc; use enc::BrotliEncoderParams; use enc::backward_references::UnionHasher; use enc::threading::{ CompressMulti, SendAlloc, InternalSendAlloc, BatchSpawnableLite, Joinable, Owned, CompressionThreadResult, InternalOwned, BrotliEncoderThreadError, }; use enc::fixed_queue::{MAX_THREADS, FixedQueue}; // in-place thread create use std::sync::RwLock; struct JobReply { result:T, work_id: u64, } struct JobRequest { func: fn(ExtraInput, usize, usize, &U, Alloc) -> ReturnValue, extra_input: ExtraInput, index: usize, thread_size: usize, data: Arc>, alloc: Alloc, work_id: u64, } struct WorkQueue { jobs: FixedQueue>, results: FixedQueue>, shutdown: bool, immediate_shutdown: bool, num_in_progress: usize, cur_work_id: u64, } impl Default for WorkQueue { fn default() -> Self { WorkQueue { jobs: FixedQueue::default(), results: FixedQueue::default(), num_in_progress: 0, immediate_shutdown: false, shutdown:false, cur_work_id: 0, } } } pub struct GuardedQueue(Arc<(Mutex>, Condvar)>); pub struct WorkerPool { queue: GuardedQueue, join: [Option>;MAX_THREADS], } impl Drop for WorkerPool { fn drop(&mut self) { { let &(ref lock, ref cvar) = &*self.queue.0; let mut local_queue = lock.lock().unwrap(); local_queue.immediate_shutdown = true; cvar.notify_all(); } for thread_handle in self.join.iter_mut() { if let Some(th) = mem::replace(thread_handle, None) { th.join().unwrap(); } } } } impl WorkerPool { fn do_work(queue:Arc<(Mutex>, Condvar)>) { loop { let ret; { // need to drop possible job before the final lock is taken, // so refcount of possible_job Arc is 0 by the time the job is delivered // to the caller. We basically need a barrier (the lock) to happen // after the destructor that decrefs possible_job let possible_job; { let &(ref lock, ref cvar) = &*queue; let mut local_queue = lock.lock().unwrap(); if local_queue.immediate_shutdown { break; } possible_job = if let Some(res) = local_queue.jobs.pop() { cvar.notify_all(); local_queue.num_in_progress += 1; res } else { if local_queue.shutdown{ break; } else { let _ = cvar.wait(local_queue); // unlock immediately, unfortunately continue; } }; } ret = if let Ok(job_data) = possible_job.data.read() { JobReply{ result: (possible_job.func)(possible_job.extra_input, possible_job.index, possible_job.thread_size, &*job_data, possible_job.alloc), work_id:possible_job.work_id, } } else{ break; // poisoned lock }; } { let &(ref lock, ref cvar) = &*queue; let mut local_queue = lock.lock().unwrap(); local_queue.num_in_progress -= 1; local_queue.results.push(ret).unwrap(); cvar.notify_all(); } } } fn _push_job(&mut self, job:JobRequest) { let &(ref lock, ref cvar) = &*self.queue.0; let mut local_queue = lock.lock().unwrap(); loop { if local_queue.jobs.size() + local_queue.num_in_progress + local_queue.results.size() < MAX_THREADS { local_queue.jobs.push(job).unwrap(); cvar.notify_all(); break; } local_queue = cvar.wait(local_queue).unwrap(); } } fn _try_push_job(&mut self, job:JobRequest)->Result<(),JobRequest> { let &(ref lock, ref cvar) = &*self.queue.0; let mut local_queue = lock.lock().unwrap(); if local_queue.jobs.size() + local_queue.num_in_progress + local_queue.results.size() < MAX_THREADS { local_queue.jobs.push(job).unwrap(); cvar.notify_all(); Ok(()) } else { Err(job) } } fn start(queue:Arc<(Mutex>, Condvar)>) -> std::thread::JoinHandle<()> { std::thread::spawn(move || Self::do_work(queue)) } pub fn new(num_threads: usize) -> Self { let queue = Arc::new((Mutex::new(WorkQueue::default()), Condvar::new())); WorkerPool{ queue: GuardedQueue(queue.clone()), join:[ Some(Self::start(queue.clone())), if 1 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 2 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 3 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 4 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 5 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 6 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 7 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 8 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 9 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 10 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 11 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 12 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 13 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 14 < num_threads { Some(Self::start(queue.clone())) } else {None}, if 15 < num_threads { Some(Self::start(queue.clone())) } else {None}, ], } } } pub fn new_work_pool+Send+'static+Sync>( num_threads:usize, ) -> WorkerPool, UnionHasher, Alloc, (SliceW, BrotliEncoderParams)> where >::AllocatedMemory:Send+'static, >::AllocatedMemory: Send+Sync, >::AllocatedMemory: Send+Sync { WorkerPool::new(num_threads) } pub struct WorkerJoinable { queue: GuardedQueue, work_id: u64, } impl Joinable for WorkerJoinable { fn join(self) -> Result { let &(ref lock, ref cvar) = &*self.queue.0; let mut local_queue = lock.lock().unwrap(); loop { match local_queue.results.remove(|data:&Option>|if let Some(ref item) = *data { item.work_id == self.work_id} else {false}) { Some(matched) => return Ok(matched.result), None => local_queue = cvar.wait(local_queue).unwrap(), }; } } } impl BatchSpawnableLite for WorkerPool where >::AllocatedMemory:Send+'static, >::AllocatedMemory: Send+Sync, >::AllocatedMemory: Send+Sync { type FinalJoinHandle = Arc>; type JoinHandle = WorkerJoinable; fn make_spawner( &mut self, input: &mut Owned, ) -> Self::FinalJoinHandle { std::sync::Arc::>::new(RwLock::new(mem::replace(input, Owned(InternalOwned::Borrowed)).unwrap())) } fn spawn( &mut self, locked_input: &mut Self::FinalJoinHandle, work:&mut SendAlloc, index: usize, num_threads: usize, f: fn(ExtraInput, usize, usize, &U, Alloc) -> ReturnValue, ) { assert!(num_threads <= MAX_THREADS); let &(ref lock, ref cvar) = &*self.queue.0; let mut local_queue = lock.lock().unwrap(); loop { if local_queue.jobs.size() + local_queue.num_in_progress + local_queue.results.size() <= MAX_THREADS { let work_id = local_queue.cur_work_id; local_queue.cur_work_id += 1; let (local_alloc, local_extra) = work.replace_with_default(); local_queue.jobs.push(JobRequest{ func:f, extra_input:local_extra, index: index, thread_size: num_threads, data: locked_input.clone(), alloc: local_alloc, work_id:work_id, }).unwrap(); *work = SendAlloc(InternalSendAlloc::Join(WorkerJoinable{queue:GuardedQueue(self.queue.0.clone()), work_id:work_id})); cvar.notify_all(); break; } else{ local_queue = cvar.wait(local_queue).unwrap(); // hope room frees up } } } } pub fn compress_worker_pool+Send+'static+Sync> ( params:&BrotliEncoderParams, owned_input: &mut Owned, output: &mut [u8], alloc_per_thread:&mut [SendAlloc, UnionHasher, Alloc, , UnionHasher, Alloc, (SliceW, BrotliEncoderParams)> as BatchSpawnableLite, UnionHasher, Alloc, (SliceW, BrotliEncoderParams)>>::JoinHandle>], work_pool: &mut WorkerPool, UnionHasher, Alloc, (SliceW, BrotliEncoderParams)>, ) -> Result where >::AllocatedMemory: Send, >::AllocatedMemory: Send+Sync, >::AllocatedMemory: Send+Sync { CompressMulti(params, owned_input, output, alloc_per_thread, work_pool) } // out of place thread create brotli-3.4.0/src/enc/writer.rs000075500000000000000000000237231046102023000143530ustar 00000000000000#![cfg_attr(not(feature="std"), allow(unused_imports))] use core; use super::encode::{BrotliEncoderCreateInstance, BrotliEncoderDestroyInstance, BrotliEncoderParameter, BrotliEncoderSetParameter, BrotliEncoderOperation, BrotliEncoderStateStruct, BrotliEncoderCompressStream, BrotliEncoderIsFinished, BrotliEncoderHasMoreOutput}; use super::backward_references::BrotliEncoderParams; use brotli_decompressor::CustomWrite; use super::interface; #[cfg(feature="std")] pub use brotli_decompressor::{IntoIoWriter, IoWriterWrapper}; use super::combined_alloc::BrotliAlloc; pub use alloc::{AllocatedStackMemory, Allocator, SliceWrapper, SliceWrapperMut, StackAllocator}; #[cfg(feature="std")] pub use alloc_stdlib::StandardAlloc; #[cfg(feature="std")] use std::io; #[cfg(feature="std")] use std::io::{Write, Error, ErrorKind}; #[cfg(feature="std")] pub struct CompressorWriterCustomAlloc, Alloc: BrotliAlloc> ( CompressorWriterCustomIo, BufferType, Alloc>); #[cfg(feature="std")] impl, Alloc: BrotliAlloc> CompressorWriterCustomAlloc { pub fn new(w: W, buffer : BufferType, alloc: Alloc, q: u32, lgwin: u32) -> Self { CompressorWriterCustomAlloc::( CompressorWriterCustomIo::, BufferType, Alloc>::new( IntoIoWriter::(w), buffer, alloc, Error::new(ErrorKind::InvalidData, "Invalid Data"), q, lgwin)) } pub fn get_ref(&self) -> &W { &self.0.get_ref().0 } pub fn get_mut(&mut self) -> &mut W { &mut self.0.get_mut().0 } pub fn into_inner(self) -> W { self.0.into_inner().0 } } #[cfg(feature="std")] impl, Alloc: BrotliAlloc> Write for CompressorWriterCustomAlloc { fn write(&mut self, buf: &[u8]) -> Result { self.0.write(buf) } fn flush(&mut self) -> Result<(), Error> { self.0.flush() } } #[cfg(feature="std")] pub struct CompressorWriter(CompressorWriterCustomAlloc>::AllocatedMemory, StandardAlloc>); #[cfg(feature="std")] impl CompressorWriter { pub fn new(w: W, buffer_size: usize, q: u32, lgwin: u32) -> Self { let mut alloc = StandardAlloc::default(); let buffer = >::alloc_cell(&mut alloc, if buffer_size == 0 { 4096} else {buffer_size}); CompressorWriter::(CompressorWriterCustomAlloc::new(w, buffer, alloc, q, lgwin)) } pub fn with_params(w: W, buffer_size: usize, params: &BrotliEncoderParams) -> Self { let mut writer = Self::new(w, buffer_size, params.quality as u32, params.lgwin as u32); (writer.0).0.state.params = params.clone(); writer } pub fn get_ref(&self) -> &W { self.0.get_ref() } pub fn get_mut(&mut self) -> &mut W { self.0.get_mut() } pub fn into_inner(self) -> W { self.0.into_inner() } } #[cfg(feature="std")] impl Write for CompressorWriter { fn write(&mut self, buf: &[u8]) -> Result { self.0.write(buf) } fn flush(&mut self) -> Result<(), Error> { self.0.flush() } } pub struct CompressorWriterCustomIo, BufferType: SliceWrapperMut, Alloc: BrotliAlloc> { output_buffer: BufferType, total_out: Option, output: Option, error_if_invalid_data: Option, state: BrotliEncoderStateStruct, } pub fn write_all>(writer: &mut W, mut buf : &[u8]) -> Result<(), ErrType> { while buf.len() != 0 { match writer.write(buf) { Ok(bytes_written) => buf = &buf[bytes_written..], Err(e) => return Err(e), } } Ok(()) } impl, BufferType : SliceWrapperMut, Alloc: BrotliAlloc> CompressorWriterCustomIo { pub fn new(w: W, buffer : BufferType, alloc : Alloc, invalid_data_error_type : ErrType, q: u32, lgwin: u32) -> Self { let mut ret = CompressorWriterCustomIo{ output_buffer : buffer, total_out : Some(0), output: Some(w), state : BrotliEncoderCreateInstance(alloc), error_if_invalid_data : Some(invalid_data_error_type), }; BrotliEncoderSetParameter(&mut ret.state, BrotliEncoderParameter::BROTLI_PARAM_QUALITY, q as (u32)); BrotliEncoderSetParameter(&mut ret.state, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, lgwin as (u32)); ret } fn flush_or_close(&mut self, op:BrotliEncoderOperation) -> Result<(), ErrType>{ let mut nop_callback = |_data:&mut interface::PredictionModeContextMap, _cmds: &mut [interface::StaticCommand], _mb: interface::InputPair, _mfv: &mut Alloc|(); loop { let mut avail_in : usize = 0; let mut input_offset : usize = 0; let mut avail_out : usize = self.output_buffer.slice_mut().len(); let mut output_offset : usize = 0; let ret = BrotliEncoderCompressStream( &mut self.state, op, &mut avail_in, &[], &mut input_offset, &mut avail_out, self.output_buffer.slice_mut(), &mut output_offset, &mut self.total_out, &mut nop_callback); if output_offset > 0 { match write_all(self.output.as_mut().unwrap(), &self.output_buffer.slice_mut()[..output_offset]) { Ok(_) => {}, Err(e) => return Err(e), } } if ret <= 0 { return Err(self.error_if_invalid_data.take().unwrap()); } if let BrotliEncoderOperation::BROTLI_OPERATION_FLUSH = op { if BrotliEncoderHasMoreOutput(&mut self.state) != 0 { continue; } return Ok(()); } if BrotliEncoderIsFinished(&mut self.state) != 0 { return Ok(()); } } } pub fn get_ref(&self) -> &W { self.output.as_ref().unwrap() } pub fn get_mut(&mut self) -> &mut W { self.output.as_mut().unwrap() } pub fn into_inner(mut self) -> W { match self.flush_or_close(BrotliEncoderOperation::BROTLI_OPERATION_FINISH) { Ok(_) => {}, Err(_) => {}, } core::mem::replace(&mut self.output, None).unwrap() } } impl, BufferType : SliceWrapperMut, Alloc: BrotliAlloc> Drop for CompressorWriterCustomIo { fn drop(&mut self) { if self.output.is_some() { match self.flush_or_close(BrotliEncoderOperation::BROTLI_OPERATION_FINISH) { Ok(_) => {}, Err(_) => {}, } } BrotliEncoderDestroyInstance(&mut self.state); } } impl, BufferType : SliceWrapperMut, Alloc: BrotliAlloc> CustomWrite for CompressorWriterCustomIo { fn write(&mut self, buf: & [u8]) -> Result { let mut nop_callback = |_data:&mut interface::PredictionModeContextMap, _cmds: &mut [interface::StaticCommand], _mb: interface::InputPair, _mfv: &mut Alloc|(); let mut avail_in = buf.len(); let mut input_offset : usize = 0; while avail_in != 0 { let mut output_offset = 0; let mut avail_out = self.output_buffer.slice_mut().len(); let ret = BrotliEncoderCompressStream( &mut self.state, BrotliEncoderOperation::BROTLI_OPERATION_PROCESS, &mut avail_in, &buf[..], &mut input_offset, &mut avail_out, self.output_buffer.slice_mut(), &mut output_offset, &mut self.total_out, &mut nop_callback); if output_offset > 0 { match write_all(self.output.as_mut().unwrap(), &self.output_buffer.slice_mut()[..output_offset]) { Ok(_) => {}, Err(e) => return Err(e), } } if ret <= 0 { return Err(self.error_if_invalid_data.take().unwrap()); } } Ok(buf.len()) } fn flush(&mut self) -> Result<(), ErrType > { match self.flush_or_close(BrotliEncoderOperation::BROTLI_OPERATION_FLUSH) { Ok(_) => {}, Err(e) => return Err(e), } self.output.as_mut().unwrap().flush() } } brotli-3.4.0/src/ffi/alloc_util.rs000064400000000000000000000030621046102023000151540ustar 00000000000000use alloc::{Allocator,SliceWrapper,SliceWrapperMut}; use ::enc::BrotliAlloc; use brotli_decompressor::ffi::alloc_util::SubclassableAllocator; pub struct BrotliSubclassableAllocator(SubclassableAllocator); impl BrotliSubclassableAllocator { pub fn new(s:SubclassableAllocator) -> BrotliSubclassableAllocator { BrotliSubclassableAllocator(s) } } #[derive(Default)] pub struct SendableMemoryBlock(>::AllocatedMemory); impl SliceWrapperMut for SendableMemoryBlock { fn slice_mut(&mut self) -> &mut [T] { self.0.slice_mut() } } impl SliceWrapper for SendableMemoryBlock { fn slice(&self) -> &[T] { self.0.slice() } } impl Allocator for BrotliSubclassableAllocator { type AllocatedMemory = SendableMemoryBlock; fn alloc_cell(&mut self, s:usize) -> Self::AllocatedMemory { SendableMemoryBlock(self.0.alloc_cell(s)) } fn free_cell(&mut self, data:Self::AllocatedMemory) { self.0.free_cell(data.0) } } impl BrotliAlloc for BrotliSubclassableAllocator { } #[cfg(not(feature="safe"))] unsafe impl Send for BrotliSubclassableAllocator{} #[cfg(not(feature="safe"))] unsafe impl Send for SendableMemoryBlock{} #[cfg(not(feature="std"))] #[cfg(feature="no-stdlib-ffi-binding")] #[panic_handler] extern fn panic_impl(_: &::core::panic::PanicInfo) -> ! { loop {} } #[cfg(not(feature="std"))] #[cfg(feature="no-stdlib-ffi-binding")] #[lang = "eh_personality"] extern "C" fn eh_personality() { } brotli-3.4.0/src/ffi/broccoli.rs000064400000000000000000000074131046102023000146250ustar 00000000000000use core; pub use brotli_decompressor::ffi::interface::{ c_void }; use brotli_decompressor::ffi::{ slice_from_raw_parts_or_nil, slice_from_raw_parts_or_nil_mut, }; use concat::BroCatli; pub use concat::BroCatliResult; pub type BroccoliResult = BroCatliResult; // a tool to concatenate brotli files together #[repr(C)] pub struct BroccoliState { more_data: *mut c_void, current_data: [u8;120], } impl Clone for BroccoliState { fn clone(&self) -> BroccoliState { let mut cd = [0u8; 120]; cd.clone_from_slice(&self.current_data[..]); BroccoliState{ more_data:self.more_data, current_data:cd, } } } impl Copy for BroccoliState{} impl Default for BroccoliState { fn default() -> BroccoliState { BroCatli::new().into() } } impl From for BroccoliState { fn from(data: BroCatli) -> BroccoliState { let mut buffer = [0u8; 120]; data.serialize_to_buffer(&mut buffer[..]).unwrap(); BroccoliState{ more_data: core::ptr::null_mut(), current_data:buffer, } } } impl Into for BroccoliState { fn into(self) -> BroCatli { BroCatli::deserialize_from_buffer(&self.current_data[..]).unwrap() } } #[no_mangle] pub extern fn BroccoliCreateInstance() -> BroccoliState { BroCatli::new().into() } #[no_mangle] pub extern fn BroccoliCreateInstanceWithWindowSize(window_size: u8) -> BroccoliState { BroCatli::new_with_window_size(window_size).into() } #[no_mangle] pub extern fn BroccoliDestroyInstance(_state: BroccoliState) { } #[no_mangle] pub unsafe extern fn BroccoliNewBrotliFile(state: *mut BroccoliState) { let mut bro_catli: BroCatli = (*state).into(); bro_catli.new_brotli_file(); *state = BroccoliState::from(bro_catli); } #[no_mangle] pub unsafe extern fn BroccoliConcatStream( state: *mut BroccoliState, available_in: *mut usize, input_buf_ptr: *mut*const u8, available_out: *mut usize, output_buf_ptr: *mut*mut u8) -> BroccoliResult { let input_buf = slice_from_raw_parts_or_nil(*input_buf_ptr, *available_in); let output_buf = slice_from_raw_parts_or_nil_mut(*output_buf_ptr, *available_out); let mut input_offset = 0usize; let mut output_offset = 0usize; let mut bro_catli: BroCatli = (*state).into(); let ret = bro_catli.stream(input_buf, &mut input_offset, output_buf, &mut output_offset); *input_buf_ptr = (*input_buf_ptr).offset(input_offset as isize); *output_buf_ptr = (*output_buf_ptr).offset(output_offset as isize); *available_in -= input_offset; *available_out -= output_offset; *state = BroccoliState::from(bro_catli); ret } #[no_mangle] pub unsafe extern fn BroccoliConcatStreaming( state: *mut BroccoliState, available_in: *mut usize, mut input_buf: *const u8, available_out: *mut usize, mut output_buf: *mut u8) -> BroccoliResult { BroccoliConcatStream( state, available_in, &mut input_buf, available_out, &mut output_buf) } #[no_mangle] pub unsafe extern fn BroccoliConcatFinish( state: *mut BroccoliState, available_out: *mut usize, output_buf_ptr: *mut*mut u8) -> BroCatliResult { let output_buf = slice_from_raw_parts_or_nil_mut(*output_buf_ptr, *available_out); let mut output_offset = 0usize; let mut bro_catli: BroCatli = (*state).into(); let ret = bro_catli.finish(output_buf, &mut output_offset); *output_buf_ptr = (*output_buf_ptr).offset(output_offset as isize); *available_out -= output_offset; *state = BroccoliState::from(bro_catli); ret } // exactly the same as BrotliConcatFinish but without the indirect #[no_mangle] pub unsafe extern fn BroccoliConcatFinished( state: *mut BroccoliState, available_out: *mut usize, mut output_buf: *mut u8) -> BroCatliResult { BroccoliConcatFinish( state, available_out, &mut output_buf) } brotli-3.4.0/src/ffi/compressor.rs000075500000000000000000000307551046102023000152350ustar 00000000000000#![cfg(not(feature="safe"))] #[cfg(feature="std")] use std::{panic,thread, io}; #[cfg(feature="std")] use std::io::Write; use core; use brotli_decompressor::ffi::alloc_util; use brotli_decompressor::ffi::alloc_util::SubclassableAllocator; use brotli_decompressor::ffi::interface::{ brotli_alloc_func, brotli_free_func, CAllocator, c_void, }; use brotli_decompressor::ffi::{ slice_from_raw_parts_or_nil, slice_from_raw_parts_or_nil_mut, }; use ::enc::encode::BrotliEncoderStateStruct; use super::alloc_util::BrotliSubclassableAllocator; #[repr(C)] pub enum BrotliEncoderOperation { BROTLI_OPERATION_PROCESS = 0, BROTLI_OPERATION_FLUSH = 1, BROTLI_OPERATION_FINISH = 2, BROTLI_OPERATION_EMIT_METADATA = 3, } #[repr(C)] pub enum BrotliEncoderMode { BROTLI_MODE_GENERIC = 0, BROTLI_MODE_TEXT = 1, BROTLI_MODE_FONT = 2, BROTLI_MODE_FORCE_LSB_PRIOR = 3, BROTLI_MODE_FORCE_MSB_PRIOR = 4, BROTLI_MODE_FORCE_UTF8_PRIOR = 5, BROTLI_MODE_FORCE_SIGNED_PRIOR = 6, } #[repr(C)] pub struct BrotliEncoderState { pub custom_allocator: CAllocator, pub compressor: BrotliEncoderStateStruct, } #[cfg(not(feature="std"))] fn brotli_new_compressor_without_custom_alloc(_to_box: BrotliEncoderState) -> *mut BrotliEncoderState{ panic!("Must supply allocators if calling divans when compiled without features=std"); } #[cfg(feature="std")] fn brotli_new_compressor_without_custom_alloc(to_box: BrotliEncoderState) -> *mut BrotliEncoderState{ alloc_util::Box::::into_raw( alloc_util::Box::::new(to_box)) } #[cfg(feature="std")] unsafe fn free_compressor_no_custom_alloc(state_ptr: *mut BrotliEncoderState) { let _state = alloc_util::Box::from_raw(state_ptr); } #[cfg(not(feature="std"))] unsafe fn free_compressor_no_custom_alloc(_state_ptr: *mut BrotliEncoderState) { unreachable!(); } #[no_mangle] pub unsafe extern fn BrotliEncoderCreateInstance( alloc_func: brotli_alloc_func, free_func: brotli_free_func, opaque: *mut c_void, ) -> *mut BrotliEncoderState { match catch_panic_cstate(|| { let allocators = CAllocator { alloc_func:alloc_func, free_func:free_func, opaque:opaque, }; let to_box = BrotliEncoderState { custom_allocator: allocators.clone(), compressor: ::enc::encode::BrotliEncoderCreateInstance( BrotliSubclassableAllocator::new( SubclassableAllocator::new(allocators.clone())), ), }; if let Some(alloc) = alloc_func { if free_func.is_none() { panic!("either both alloc and free must exist or neither"); } let ptr = alloc(allocators.opaque, core::mem::size_of::()); let brotli_decoder_state_ptr = core::mem::transmute::<*mut c_void, *mut BrotliEncoderState>(ptr); core::ptr::write(brotli_decoder_state_ptr, to_box); brotli_decoder_state_ptr } else { brotli_new_compressor_without_custom_alloc(to_box) } }) { Ok(ret) => ret, Err(err) => { error_print(err); core::ptr::null_mut() } } } #[no_mangle] pub unsafe extern fn BrotliEncoderSetParameter( state_ptr: *mut BrotliEncoderState, param: ::enc::encode::BrotliEncoderParameter, value: u32, ) -> i32 { ::enc::encode::BrotliEncoderSetParameter(&mut (*state_ptr).compressor, param, value) } #[no_mangle] pub unsafe extern fn BrotliEncoderDestroyInstance(state_ptr: *mut BrotliEncoderState) { if state_ptr.is_null() { return; } ::enc::encode::BrotliEncoderDestroyInstance(&mut (*state_ptr).compressor); if let Some(_) = (*state_ptr).custom_allocator.alloc_func { if let Some(free_fn) = (*state_ptr).custom_allocator.free_func { let _to_free = core::ptr::read(state_ptr); let ptr = core::mem::transmute::<*mut BrotliEncoderState, *mut c_void>(state_ptr); free_fn((*state_ptr).custom_allocator.opaque, ptr); } } else { free_compressor_no_custom_alloc(state_ptr); } } #[no_mangle] pub unsafe extern fn BrotliEncoderIsFinished( state_ptr: *mut BrotliEncoderState, ) -> i32 { ::enc::encode::BrotliEncoderIsFinished(&mut (*state_ptr).compressor) } #[no_mangle] pub unsafe extern fn BrotliEncoderHasMoreOutput( state_ptr: *mut BrotliEncoderState, ) -> i32 { ::enc::encode::BrotliEncoderHasMoreOutput(&mut (*state_ptr).compressor) } #[no_mangle] pub unsafe extern fn BrotliEncoderSetCustomDictionary( state_ptr: *mut BrotliEncoderState, size: usize, dict: *const u8, ) { if let Err(panic_err) = catch_panic(|| { let dict_slice = slice_from_raw_parts_or_nil(dict, size); ::enc::encode::BrotliEncoderSetCustomDictionary(&mut (*state_ptr).compressor, size, dict_slice); 0 }) { error_print(panic_err); } } #[no_mangle] pub unsafe extern fn BrotliEncoderTakeOutput( state_ptr: *mut BrotliEncoderState, size: *mut usize, ) -> *const u8 { ::enc::encode::BrotliEncoderTakeOutput(&mut (*state_ptr).compressor, &mut *size).as_ptr() } #[no_mangle] pub extern fn BrotliEncoderVersion() -> u32 { ::enc::encode::BrotliEncoderVersion() } #[no_mangle] pub extern fn BrotliEncoderMaxCompressedSize(input_size: usize) -> usize { ::enc::encode::BrotliEncoderMaxCompressedSize(input_size) } #[no_mangle] pub unsafe extern fn BrotliEncoderCompress( quality: i32, lgwin: i32, mode: BrotliEncoderMode, input_size: usize, input_buffer: *const u8, encoded_size: *mut usize, encoded_buffer: *mut u8) -> i32 { match catch_panic(|| { let input_buf = slice_from_raw_parts_or_nil(input_buffer, input_size); let encoded_buf = slice_from_raw_parts_or_nil_mut(encoded_buffer, *encoded_size); let allocators = CAllocator { alloc_func:None, free_func:None, opaque:core::ptr::null_mut(), }; let translated_mode = match mode { BrotliEncoderMode::BROTLI_MODE_GENERIC => ::enc::backward_references::BrotliEncoderMode::BROTLI_MODE_GENERIC, BrotliEncoderMode::BROTLI_MODE_TEXT => ::enc::backward_references::BrotliEncoderMode::BROTLI_MODE_TEXT, BrotliEncoderMode::BROTLI_MODE_FONT => ::enc::backward_references::BrotliEncoderMode::BROTLI_MODE_FONT, BrotliEncoderMode::BROTLI_MODE_FORCE_LSB_PRIOR => ::enc::backward_references::BrotliEncoderMode::BROTLI_FORCE_LSB_PRIOR, BrotliEncoderMode::BROTLI_MODE_FORCE_MSB_PRIOR => ::enc::backward_references::BrotliEncoderMode::BROTLI_FORCE_MSB_PRIOR, BrotliEncoderMode::BROTLI_MODE_FORCE_UTF8_PRIOR => ::enc::backward_references::BrotliEncoderMode::BROTLI_FORCE_UTF8_PRIOR, BrotliEncoderMode::BROTLI_MODE_FORCE_SIGNED_PRIOR => ::enc::backward_references::BrotliEncoderMode::BROTLI_FORCE_SIGNED_PRIOR, }; let mut m8 = BrotliSubclassableAllocator::new( SubclassableAllocator::new(allocators.clone())); let empty_m8 = BrotliSubclassableAllocator::new( SubclassableAllocator::new(allocators.clone())); ::enc::encode::BrotliEncoderCompress( empty_m8, &mut m8, quality, lgwin, translated_mode, input_size, input_buf, &mut *encoded_size, encoded_buf, &mut |_a,_b,_c,_d|(), ) }) { Ok(ret) => ret, Err(panic_err) => { error_print(panic_err); 0 }, } } #[no_mangle] pub unsafe extern fn BrotliEncoderCompressStreaming( state_ptr: *mut BrotliEncoderState, op: BrotliEncoderOperation, available_in: *mut usize, mut input_buf: *const u8, available_out: *mut usize, mut output_buf: *mut u8, ) -> i32 { BrotliEncoderCompressStream(state_ptr, op, available_in, &mut input_buf, available_out, &mut output_buf, core::ptr::null_mut()) } #[no_mangle] pub unsafe extern fn BrotliEncoderCompressStream( state_ptr: *mut BrotliEncoderState, op: BrotliEncoderOperation, available_in: *mut usize, input_buf_ptr: *mut*const u8, available_out: *mut usize, output_buf_ptr: *mut*mut u8, total_out: *mut usize) -> i32 { match catch_panic(|| { let mut input_offset = 0usize; let mut output_offset = 0usize; let result; let translated_op = match op { BrotliEncoderOperation::BROTLI_OPERATION_PROCESS => ::enc::encode::BrotliEncoderOperation::BROTLI_OPERATION_PROCESS, BrotliEncoderOperation::BROTLI_OPERATION_FLUSH => ::enc::encode::BrotliEncoderOperation::BROTLI_OPERATION_FLUSH, BrotliEncoderOperation::BROTLI_OPERATION_FINISH => ::enc::encode::BrotliEncoderOperation::BROTLI_OPERATION_FINISH, BrotliEncoderOperation::BROTLI_OPERATION_EMIT_METADATA => ::enc::encode::BrotliEncoderOperation::BROTLI_OPERATION_EMIT_METADATA, }; { let (input_buf, input_any):(&[u8],bool) = if *available_in != 0 { (slice_from_raw_parts_or_nil(*input_buf_ptr, *available_in), true) } else { (&[], false) }; let (output_buf, output_any):(&mut[u8],bool) = if *available_out != 0 { (slice_from_raw_parts_or_nil_mut(*output_buf_ptr, *available_out), true) } else { (&mut [], false) }; let mut to = Some(0usize); result = ::enc::encode::BrotliEncoderCompressStream( &mut (*state_ptr).compressor, translated_op, &mut *available_in, input_buf, &mut input_offset, &mut *available_out, output_buf, &mut output_offset, &mut to, &mut |_a,_b,_c,_d|(), ); if !total_out.is_null() { *total_out = to.unwrap_or(0); } if input_any { *input_buf_ptr = (*input_buf_ptr).offset(input_offset as isize); } if output_any { *output_buf_ptr = (*output_buf_ptr).offset(output_offset as isize); } } result }) { Ok(ret) => ret, Err(panic_err) => { error_print(panic_err); 0 }, } } #[no_mangle] pub unsafe extern fn BrotliEncoderMallocU8(state_ptr: *mut BrotliEncoderState, size: usize) -> *mut u8 { if let Some(alloc_fn) = (*state_ptr).custom_allocator.alloc_func { return core::mem::transmute::<*mut c_void, *mut u8>(alloc_fn((*state_ptr).custom_allocator.opaque, size)); } else { return alloc_util::alloc_stdlib(size); } } #[no_mangle] pub unsafe extern fn BrotliEncoderFreeU8(state_ptr: *mut BrotliEncoderState, data: *mut u8, size: usize) { if let Some(free_fn) = (*state_ptr).custom_allocator.free_func { free_fn((*state_ptr).custom_allocator.opaque, core::mem::transmute::<*mut u8, *mut c_void>(data)); } else { alloc_util::free_stdlib(data, size); } } #[no_mangle] pub unsafe extern fn BrotliEncoderMallocUsize(state_ptr: *mut BrotliEncoderState, size: usize) -> *mut usize { if let Some(alloc_fn) = (*state_ptr).custom_allocator.alloc_func { return core::mem::transmute::<*mut c_void, *mut usize>(alloc_fn((*state_ptr).custom_allocator.opaque, size * core::mem::size_of::())); } else { return alloc_util::alloc_stdlib(size); } } #[no_mangle] pub unsafe extern fn BrotliEncoderFreeUsize(state_ptr: *mut BrotliEncoderState, data: *mut usize, size: usize) { if let Some(free_fn) = (*state_ptr).custom_allocator.free_func { free_fn((*state_ptr).custom_allocator.opaque, core::mem::transmute::<*mut usize, *mut c_void>(data)); } else { alloc_util::free_stdlib(data, size); } } #[cfg(all(feature="std", not(feature="pass-through-ffi-panics")))] pub fn catch_panici32+panic::UnwindSafe>(f: F) -> thread::Result { panic::catch_unwind(f) } #[cfg(all(feature="std", not(feature="pass-through-ffi-panics")))] fn catch_panic_cstate*mut BrotliEncoderState+panic::UnwindSafe>(f: F) -> thread::Result<*mut BrotliEncoderState> { panic::catch_unwind(f) } #[cfg(all(feature="std", not(feature="pass-through-ffi-panics")))] fn error_print(err: Err) { let _ign = writeln!(&mut io::stderr(), "Internal Error {:?}", err); } // can't catch panics in a reliable way without std:: configure with panic=abort. These shouldn't happen #[cfg(any(not(feature="std"), feature="pass-through-ffi-panics"))] pub fn catch_panici32>(f: F) -> Result { Ok(f()) } #[cfg(any(not(feature="std"), feature="pass-through-ffi-panics"))] fn catch_panic_cstate*mut BrotliEncoderState>(f: F) -> Result<*mut BrotliEncoderState, ()> { Ok(f()) } #[cfg(any(not(feature="std"), feature="pass-through-ffi-panics"))] fn error_print(_err: Err) { } brotli-3.4.0/src/ffi/decompressor.rs000064400000000000000000000113631046102023000155350ustar 00000000000000pub use brotli_decompressor::ffi; pub use brotli_decompressor::{BrotliDecoderReturnInfo, HuffmanCode}; pub use brotli_decompressor::ffi::interface::{ brotli_alloc_func, brotli_free_func, c_void, }; pub unsafe extern fn CBrotliDecoderCreateInstance( alloc_func: brotli_alloc_func, free_func: brotli_free_func, opaque: *mut c_void, ) -> *mut ffi::BrotliDecoderState { ffi::BrotliDecoderCreateInstance(alloc_func, free_func, opaque) } pub unsafe extern fn CBrotliDecoderSetParameter(state_ptr: *mut ffi::BrotliDecoderState, selector: ffi::interface::BrotliDecoderParameter, value: u32) { ffi::BrotliDecoderSetParameter(state_ptr, selector, value) } #[cfg(feature="std")] // this requires a default allocator pub unsafe extern fn CBrotliDecoderDecompress( encoded_size: usize, encoded_buffer: *const u8, decoded_size: *mut usize, decoded_buffer: *mut u8) -> ffi::interface::BrotliDecoderResult { ffi::BrotliDecoderDecompress(encoded_size, encoded_buffer, decoded_size, decoded_buffer) } pub unsafe extern fn CBrotliDecoderDecompressStream( state_ptr: *mut ffi::BrotliDecoderState, available_in: *mut usize, input_buf_ptr: *mut*const u8, available_out: *mut usize, output_buf_ptr: *mut*mut u8, total_out: *mut usize, ) -> ffi::interface::BrotliDecoderResult { ffi::BrotliDecoderDecompressStream( state_ptr, available_in, input_buf_ptr, available_out, output_buf_ptr, total_out) } pub unsafe extern fn CBrotliDecoderDecompressStreaming( state_ptr: *mut ffi::BrotliDecoderState, available_in: *mut usize, input_buf_ptr: *const u8, available_out: *mut usize, output_buf_ptr: *mut u8, ) -> ffi::interface::BrotliDecoderResult { ffi::BrotliDecoderDecompressStreaming( state_ptr, available_in, input_buf_ptr, available_out, output_buf_ptr) } pub unsafe extern fn CBrotliDecoderDecompressWithReturnInfo( available_in: usize, input_buf_ptr: *const u8, available_out_and_scratch: usize, output_buf_and_scratch: *mut u8, ) -> BrotliDecoderReturnInfo { ffi::BrotliDecoderDecompressWithReturnInfo( available_in, input_buf_ptr, available_out_and_scratch, output_buf_and_scratch) } pub unsafe extern fn CBrotliDecoderDecompressPrealloc( available_in: usize, input_buf_ptr: *const u8, available_out: usize, output_buf_ptr: *mut u8, available_u8: usize, u8_ptr: *mut u8, available_u32: usize, u32_ptr: *mut u32, available_hc: usize, hc_ptr: *mut HuffmanCode, ) -> BrotliDecoderReturnInfo { ffi::BrotliDecoderDecompressPrealloc( available_in, input_buf_ptr, available_out, output_buf_ptr, available_u8, u8_ptr, available_u32, u32_ptr, available_hc, hc_ptr) } pub unsafe extern fn CBrotliDecoderMallocU8(state_ptr: *mut ffi::BrotliDecoderState, size: usize) -> *mut u8 { ffi::BrotliDecoderMallocU8(state_ptr, size) } pub unsafe extern fn CBrotliDecoderFreeU8(state_ptr: *mut ffi::BrotliDecoderState, data: *mut u8, size: usize) { ffi::BrotliDecoderFreeU8(state_ptr, data, size) } pub unsafe extern fn CBrotliDecoderMallocUsize(state_ptr: *mut ffi::BrotliDecoderState, size: usize) -> *mut usize { ffi::BrotliDecoderMallocUsize(state_ptr, size) } pub unsafe extern fn CBrotliDecoderFreeUsize(state_ptr: *mut ffi::BrotliDecoderState, data: *mut usize, size: usize) { ffi::BrotliDecoderFreeUsize(state_ptr, data, size) } pub unsafe extern fn CBrotliDecoderDestroyInstance(state_ptr: *mut ffi::BrotliDecoderState) { ffi::BrotliDecoderDestroyInstance(state_ptr) } pub extern fn CBrotliDecoderVersion() -> u32 { ffi::BrotliDecoderVersion() } #[no_mangle] pub extern fn CBrotliDecoderErrorString(c: ffi::BrotliDecoderErrorCode) -> *const u8 { ffi::BrotliDecoderErrorString(c) } #[no_mangle] pub unsafe extern fn CBrotliDecoderHasMoreOutput(state_ptr: *const ffi::BrotliDecoderState) -> i32 { ffi::BrotliDecoderHasMoreOutput(state_ptr) } #[no_mangle] pub unsafe extern fn CBrotliDecoderTakeOutput(state_ptr: *mut ffi::BrotliDecoderState, size: *mut usize) -> *const u8 { ffi::BrotliDecoderTakeOutput(state_ptr, size) } #[no_mangle] pub unsafe extern fn CBrotliDecoderIsUsed(state_ptr: *const ffi::BrotliDecoderState) -> i32 { ffi::BrotliDecoderIsUsed(state_ptr) } #[no_mangle] pub unsafe extern fn CBrotliDecoderIsFinished(state_ptr: *const ffi::BrotliDecoderState) -> i32 { ffi::BrotliDecoderIsFinished(state_ptr) } #[no_mangle] pub unsafe extern fn CBrotliDecoderGetErrorCode(state_ptr: *const ffi::BrotliDecoderState) -> ffi::BrotliDecoderErrorCode { ffi::BrotliDecoderGetErrorCode(state_ptr) } #[no_mangle] pub unsafe extern fn CBrotliDecoderGetErrorString(state_ptr: *const ffi::BrotliDecoderState) -> *const u8 { ffi::BrotliDecoderGetErrorString(state_ptr) } brotli-3.4.0/src/ffi/mod.rs000064400000000000000000000001471046102023000136050ustar 00000000000000pub mod alloc_util; pub mod decompressor; pub mod compressor; pub mod broccoli; pub mod multicompress; brotli-3.4.0/src/ffi/multicompress/mod.rs000075500000000000000000000340741046102023000165240ustar 00000000000000#![cfg(not(feature="safe"))] #[cfg(feature="std")] use std::{panic,thread, io}; #[cfg(feature="std")] use std::io::Write; mod test; use core; #[allow(unused_imports)] use brotli_decompressor; use super::compressor; use ::enc::encode::{BrotliEncoderCreateInstance, BrotliEncoderOperation, BrotliEncoderSetParameter, BrotliEncoderCompressStream, BrotliEncoderIsFinished, BrotliEncoderDestroyInstance, }; use brotli_decompressor::ffi::alloc_util::SubclassableAllocator; use brotli_decompressor::ffi::interface::{ brotli_alloc_func, brotli_free_func, CAllocator, c_void, }; use brotli_decompressor::ffi::{ slice_from_raw_parts_or_nil, slice_from_raw_parts_or_nil_mut, }; use super::alloc_util::BrotliSubclassableAllocator; use ::enc; use ::enc::backward_references::{BrotliEncoderParams, UnionHasher}; use ::enc::encode::{BrotliEncoderParameter, set_parameter}; use ::enc::threading::{SendAlloc,Owned}; use alloc::SliceWrapper; pub const MAX_THREADS: usize = 16; struct SliceRef<'a> (&'a [u8]); impl<'a> SliceWrapper for SliceRef<'a> { fn slice(&self) -> &[u8] { self.0 } } macro_rules! make_send_alloc { ($alloc_func: expr, $free_func: expr, $opaque: expr) => ( SendAlloc::new(BrotliSubclassableAllocator::new( SubclassableAllocator::new( CAllocator{ alloc_func:$alloc_func, free_func:$free_func, opaque:$opaque, })), UnionHasher::Uninit) ) } #[no_mangle] pub extern fn BrotliEncoderMaxCompressedSizeMulti(input_size: usize, num_threads: usize) -> usize { ::enc::encode::BrotliEncoderMaxCompressedSizeMulti(input_size, num_threads) } fn help_brotli_encoder_compress_single( param_keys: &[BrotliEncoderParameter], param_values: &[u32], input: &[u8], output: &mut[u8], encoded_size: &mut usize, m8: BrotliSubclassableAllocator, ) -> i32 { let mut encoder = BrotliEncoderCreateInstance(m8); for (p, v) in param_keys.iter().zip(param_values.iter()) { BrotliEncoderSetParameter(&mut encoder, *p, *v); } let mut result; let mut available_in = input.len(); let mut next_in_offset = 0usize; let mut available_out = output.len(); let mut next_out_offset = 0usize; let mut total_out = Some(0usize); result = BrotliEncoderCompressStream(&mut encoder, BrotliEncoderOperation::BROTLI_OPERATION_FINISH, &mut available_in, input, &mut next_in_offset, &mut available_out, output, &mut next_out_offset, &mut total_out, &mut |_a,_b,_c,_d|()); if BrotliEncoderIsFinished(&encoder) == 0 { result = 0i32; } *encoded_size = total_out.unwrap(); BrotliEncoderDestroyInstance(&mut encoder); result } #[no_mangle] pub unsafe extern fn BrotliEncoderCompressMulti( num_params: usize, param_keys: *const BrotliEncoderParameter, param_values: *const u32, input_size: usize, input: *const u8, encoded_size: *mut usize, encoded: *mut u8, desired_num_threads: usize, alloc_func: brotli_alloc_func, free_func: brotli_free_func, alloc_opaque_per_thread: *mut*mut c_void, ) -> i32 { if desired_num_threads == 0 { return 0; } let num_threads = core::cmp::min(desired_num_threads, MAX_THREADS); match compressor::catch_panic(|| { let param_keys_slice = slice_from_raw_parts_or_nil(param_keys, num_params); let param_values_slice = slice_from_raw_parts_or_nil(param_values, num_params); let input_slice = slice_from_raw_parts_or_nil(input, input_size); let output_slice = slice_from_raw_parts_or_nil_mut(encoded, *encoded_size); if num_threads == 1 { let allocators = CAllocator { alloc_func:alloc_func, free_func:free_func, opaque:if alloc_opaque_per_thread.is_null() {core::ptr::null_mut()} else {*alloc_opaque_per_thread}, }; let m8 = BrotliSubclassableAllocator::new( SubclassableAllocator::new(allocators.clone())); return help_brotli_encoder_compress_single( param_keys_slice, param_values_slice, input_slice, output_slice, &mut *encoded_size, m8, ) } let null_opaques = [core::ptr::null_mut::();MAX_THREADS]; let alloc_opaque = if alloc_opaque_per_thread.is_null() { &null_opaques[..] } else { slice_from_raw_parts_or_nil(alloc_opaque_per_thread, desired_num_threads) }; let mut params = BrotliEncoderParams::default(); for (k,v) in param_keys_slice.iter().zip(param_values_slice.iter()) { if set_parameter(&mut params, *k, *v) == 0 { return 0; } } let mut alloc_array:[_;MAX_THREADS] = [ make_send_alloc!(alloc_func, free_func, alloc_opaque[0]), make_send_alloc!(alloc_func, free_func, alloc_opaque[1%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[2%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[3%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[4%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[5%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[6%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[7%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[8%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[9%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[10%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[11%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[12%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[13%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[14%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[15%desired_num_threads]), ]; let owned_input = &mut Owned::new(SliceRef(input_slice)); let res = enc::compress_multi_no_threadpool( ¶ms, owned_input, output_slice, &mut alloc_array[..num_threads], ); match res { Ok(size) => { *encoded_size = size; return 1; }, Err(_err) => { return 0; } } }) { Ok(ret) => return ret, Err(panic_err) => { error_print(panic_err); return 0; }, } } #[repr(C)] pub struct BrotliEncoderWorkPool { custom_allocator: CAllocator, work_pool: enc::WorkerPool, UnionHasher, BrotliSubclassableAllocator, (SliceRef<'static>, BrotliEncoderParams)>, } #[cfg(not(feature="std"))] fn brotli_new_work_pool_without_custom_alloc(_to_box: BrotliEncoderWorkPool) -> *mut BrotliEncoderWorkPool{ panic!("Must supply allocators if calling divans when compiled without features=std"); } #[cfg(feature="std")] fn brotli_new_work_pool_without_custom_alloc(to_box: BrotliEncoderWorkPool) -> *mut BrotliEncoderWorkPool{ brotli_decompressor::ffi::alloc_util::Box::::into_raw( brotli_decompressor::ffi::alloc_util::Box::::new(to_box)) } #[no_mangle] pub unsafe extern fn BrotliEncoderCreateWorkPool( num_threads: usize, alloc_func: brotli_alloc_func, free_func: brotli_free_func, opaque: *mut c_void, ) -> *mut BrotliEncoderWorkPool { match catch_panic_wstate(|| { let allocators = CAllocator { alloc_func:alloc_func, free_func:free_func, opaque:opaque, }; let to_box = BrotliEncoderWorkPool { custom_allocator: allocators.clone(), work_pool: enc::new_work_pool(core::cmp::min(num_threads, MAX_THREADS)), }; if let Some(alloc) = alloc_func { if free_func.is_none() { panic!("either both alloc and free must exist or neither"); } let ptr = alloc(allocators.opaque, core::mem::size_of::()); let brotli_work_pool_ptr = core::mem::transmute::<*mut c_void, *mut BrotliEncoderWorkPool>(ptr); core::ptr::write(brotli_work_pool_ptr, to_box); brotli_work_pool_ptr } else { brotli_new_work_pool_without_custom_alloc(to_box) } }) { Ok(ret) => ret, Err(err) => { error_print(err); core::ptr::null_mut() } } } #[cfg(feature="std")] unsafe fn free_work_pool_no_custom_alloc(_work_pool: *mut BrotliEncoderWorkPool) { let _state = brotli_decompressor::ffi::alloc_util::Box::from_raw(_work_pool); } #[cfg(not(feature="std"))] unsafe fn free_work_pool_no_custom_alloc(_work_pool: *mut BrotliEncoderWorkPool) { unreachable!(); } struct UnsafeUnwindBox(*mut BrotliEncoderWorkPool); #[cfg(all(feature="std", not(feature="pass-through-ffi-panics")))] impl panic::RefUnwindSafe for UnsafeUnwindBox{} #[no_mangle] pub unsafe extern fn BrotliEncoderDestroyWorkPool(work_pool_ptr: *mut BrotliEncoderWorkPool) { let wpp = UnsafeUnwindBox(work_pool_ptr); if let Err(panic_err) = compressor::catch_panic(|| { if let Some(_) = (*wpp.0).custom_allocator.alloc_func { if let Some(free_fn) = (*wpp.0).custom_allocator.free_func { let _to_free = core::ptr::read(wpp.0); let ptr = core::mem::transmute::<*mut BrotliEncoderWorkPool, *mut c_void>(wpp.0); free_fn((*wpp.0).custom_allocator.opaque, ptr); } } else { free_work_pool_no_custom_alloc(wpp.0); } 0 }) { error_print(panic_err); } } #[no_mangle] pub unsafe extern fn BrotliEncoderCompressWorkPool( work_pool: *mut BrotliEncoderWorkPool, num_params: usize, param_keys: *const BrotliEncoderParameter, param_values: *const u32, input_size: usize, input: *const u8, encoded_size: *mut usize, encoded: *mut u8, desired_num_threads: usize, alloc_func: brotli_alloc_func, free_func: brotli_free_func, alloc_opaque_per_thread: *mut*mut c_void, ) -> i32 { if desired_num_threads == 0 { return 0; } if work_pool.is_null() { match compressor::catch_panic(|| BrotliEncoderCompressMulti( num_params, param_keys, param_values, input_size, input, encoded_size, encoded, desired_num_threads, alloc_func, free_func, alloc_opaque_per_thread)) { Ok(ret) => return ret, // no panic Err(panic_err) => { error_print(panic_err); // print panic return 0; // fail } } } let work_pool_wrapper = UnsafeUnwindBox(work_pool); match compressor::catch_panic(|| { let null_opaques = [core::ptr::null_mut::();MAX_THREADS]; let alloc_opaque = if alloc_opaque_per_thread.is_null() { &null_opaques[..] } else { slice_from_raw_parts_or_nil(alloc_opaque_per_thread, desired_num_threads) }; let param_keys_slice = slice_from_raw_parts_or_nil(param_keys, num_params); let param_values_slice = slice_from_raw_parts_or_nil(param_values, num_params); let mut params = BrotliEncoderParams::default(); for (k,v) in param_keys_slice.iter().zip(param_values_slice.iter()) { if set_parameter(&mut params, *k, *v) == 0 { return 0; } } let num_threads = core::cmp::min(desired_num_threads, MAX_THREADS); let mut alloc_array:[_;MAX_THREADS] = [ make_send_alloc!(alloc_func, free_func, alloc_opaque[0]), make_send_alloc!(alloc_func, free_func, alloc_opaque[1%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[2%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[3%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[4%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[5%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[6%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[7%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[8%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[9%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[10%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[11%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[12%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[13%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[14%desired_num_threads]), make_send_alloc!(alloc_func, free_func, alloc_opaque[15%desired_num_threads]), ]; let res = enc::compress_worker_pool( ¶ms, &mut Owned::new(SliceRef(slice_from_raw_parts_or_nil(input, input_size))), slice_from_raw_parts_or_nil_mut(encoded, *encoded_size), &mut alloc_array[..num_threads], &mut (*work_pool_wrapper.0).work_pool, ); match res { Ok(size) => { *encoded_size = size; return 1; }, Err(_err) => { return 0; }, } }) { Ok(ret) => ret, // no panic Err(panic_err) => { error_print(panic_err); // print panic 0 // fail }, } } #[cfg(all(feature="std", not(feature="pass-through-ffi-panics")))] fn catch_panic_wstate*mut BrotliEncoderWorkPool+panic::UnwindSafe>(f: F) -> thread::Result<*mut BrotliEncoderWorkPool> { panic::catch_unwind(f) } #[cfg(all(feature="std", not(feature="pass-through-ffi-panics")))] fn error_print(err: Err) { let _ign = writeln!(&mut io::stderr(), "Internal Error {:?}", err); } #[cfg(any(not(feature="std"), feature="pass-through-ffi-panics"))] fn catch_panic_wstate*mut BrotliEncoderWorkPool>(f: F) -> Result<*mut BrotliEncoderWorkPool, ()> { Ok(f()) } #[cfg(any(not(feature="std"), feature="pass-through-ffi-panics"))] fn error_print(_err: Err) { } brotli-3.4.0/src/ffi/multicompress/test.rs000075500000000000000000000223041046102023000167150ustar 00000000000000#![cfg(test)] #![cfg(feature="std")] use super::*; use ::enc::encode::BrotliEncoderParameter; use core; #[test] fn test_compress_workpool() { let input = [102, 114, 111, 109, 32, 99, 116, 121, 112, 101, 115, 32, 105, 109, 112, 111, 114, 116, 32, 42, 10, 10, 99, 108, 97, 115, 115, 32, 69, 110, 117, 109, 84, 121, 112, 101, 40, 116, 121, 112, 101, 40, 99, 95, 117, 105, 110, 116, 41, 41, 58, 10, 32, 32, 32, 32, 100, 101, 102, 32, 95, 95, 110, 101, 119, 95, 95, 40, 109, 101, 116, 97, 99, 108, 115, 41, 58, 10, 32, 32, 32, 32, 32, 32, 32, 32, 112, 97, 115, 115, 10]; let params = [BrotliEncoderParameter::BROTLI_PARAM_QUALITY, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT, BrotliEncoderParameter::BROTLI_PARAM_CATABLE, BrotliEncoderParameter::BROTLI_PARAM_MAGIC_NUMBER, BrotliEncoderParameter::BROTLI_PARAM_Q9_5]; let values = [11u32,16u32,91u32,0u32,0u32,0u32]; let mut encoded_size = BrotliEncoderMaxCompressedSizeMulti(input.len(), 4); let mut encoded_backing = [0u8;145]; let encoded = &mut encoded_backing[..encoded_size]; let ret = unsafe { let wp = BrotliEncoderCreateWorkPool(8, None, None, core::ptr::null_mut()); let inner_ret = BrotliEncoderCompressWorkPool( wp, params.len(), params[..].as_ptr(), values[..].as_ptr(), input.len(), input[..].as_ptr(), &mut encoded_size, encoded.as_mut_ptr(), 4, None, None, core::ptr::null_mut()); BrotliEncoderDestroyWorkPool(wp); inner_ret }; assert_eq!(ret, 1); let mut rt_size = 256; let mut rt_buffer = [0u8;256]; let ret2 = unsafe { super::super::decompressor::CBrotliDecoderDecompress(encoded_size, encoded.as_ptr(), &mut rt_size, rt_buffer.as_mut_ptr()) }; match ret2 { super::super::decompressor::ffi::interface::BrotliDecoderResult::BROTLI_DECODER_RESULT_SUCCESS => { }, _ => panic!("{}", ret2 as i32), } assert_eq!(rt_size, input.len()); assert_eq!(&rt_buffer[..rt_size], &input[..]); } #[test] fn test_compress_empty_workpool() { let input = []; let params = [BrotliEncoderParameter::BROTLI_PARAM_QUALITY, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT, BrotliEncoderParameter::BROTLI_PARAM_CATABLE, BrotliEncoderParameter::BROTLI_PARAM_MAGIC_NUMBER, BrotliEncoderParameter::BROTLI_PARAM_Q9_5]; let values = [3u32,16u32,91u32,0u32,0u32,0u32]; let mut encoded_size = BrotliEncoderMaxCompressedSizeMulti(input.len(), 4); let mut encoded_backing = [0u8;145]; let encoded = &mut encoded_backing[..encoded_size]; let ret = unsafe { let wp = BrotliEncoderCreateWorkPool(8, None, None, core::ptr::null_mut()); let inner_ret = BrotliEncoderCompressWorkPool( wp, params.len(), params[..].as_ptr(), values[..].as_ptr(), input.len(), input[..].as_ptr(), &mut encoded_size, encoded.as_mut_ptr(), 4, None, None, core::ptr::null_mut()); BrotliEncoderDestroyWorkPool(wp); inner_ret }; assert_eq!(ret, 1); let mut rt_size = 256; let mut rt_buffer = [0u8;256]; assert!(encoded_size != 0); let ret2 = unsafe { super::super::decompressor::CBrotliDecoderDecompress(encoded_size, encoded.as_ptr(), &mut rt_size, rt_buffer.as_mut_ptr()) }; match ret2 { super::super::decompressor::ffi::interface::BrotliDecoderResult::BROTLI_DECODER_RESULT_SUCCESS => { }, _ => panic!("{}", ret2 as i32), } assert_eq!(rt_size, input.len()); assert_eq!(&rt_buffer[..rt_size], &input[..]); } #[test] fn test_compress_empty_multi_raw() { let input = []; let params = [BrotliEncoderParameter::BROTLI_PARAM_QUALITY, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT, BrotliEncoderParameter::BROTLI_PARAM_CATABLE, BrotliEncoderParameter::BROTLI_PARAM_MAGIC_NUMBER, BrotliEncoderParameter::BROTLI_PARAM_Q9_5]; let values = [3u32,16u32,0u32,0u32,0u32,0u32]; let mut encoded_size = BrotliEncoderMaxCompressedSizeMulti(input.len(), 4); let mut encoded_backing = [0u8;145]; let encoded = &mut encoded_backing[..encoded_size]; let ret = unsafe { BrotliEncoderCompressMulti( params.len(), params[..].as_ptr(), values[..].as_ptr(), input.len(), input[..].as_ptr(), &mut encoded_size, encoded.as_mut_ptr(), 4, None, None, core::ptr::null_mut()) }; assert_eq!(ret, 1); let mut rt_size = 256; let mut rt_buffer = [0u8;256]; assert!(encoded_size != 0); let ret2 = unsafe { super::super::decompressor::CBrotliDecoderDecompress(encoded_size, encoded.as_ptr(), &mut rt_size, rt_buffer.as_mut_ptr()) }; match ret2 { super::super::decompressor::ffi::interface::BrotliDecoderResult::BROTLI_DECODER_RESULT_SUCCESS => { }, _ => panic!("{}", ret2 as i32), } assert_eq!(rt_size, input.len()); assert_eq!(&rt_buffer[..rt_size], &input[..]); } #[test] fn test_compress_null_multi_raw() { let params = [BrotliEncoderParameter::BROTLI_PARAM_QUALITY, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT, BrotliEncoderParameter::BROTLI_PARAM_CATABLE, BrotliEncoderParameter::BROTLI_PARAM_MAGIC_NUMBER, BrotliEncoderParameter::BROTLI_PARAM_Q9_5]; let values = [3u32,16u32,0u32,0u32,0u32,0u32]; let mut encoded_size = BrotliEncoderMaxCompressedSizeMulti(0, 4); let mut encoded_backing = [0u8;145]; let encoded = &mut encoded_backing[..encoded_size]; let ret = unsafe { BrotliEncoderCompressMulti( params.len(), params[..].as_ptr(), values[..].as_ptr(), 0, core::ptr::null(), &mut encoded_size, encoded.as_mut_ptr(), 4, None, None, core::ptr::null_mut()) }; assert_eq!(ret, 1); let mut rt_size = 256; let mut rt_buffer = [0u8;256]; assert!(encoded_size != 0); let ret2 = unsafe { super::super::decompressor::CBrotliDecoderDecompress(encoded_size, encoded.as_ptr(), &mut rt_size, rt_buffer.as_mut_ptr()) }; match ret2 { super::super::decompressor::ffi::interface::BrotliDecoderResult::BROTLI_DECODER_RESULT_SUCCESS => { }, _ => panic!("{}", ret2 as i32), } assert_eq!(rt_size, 0); } #[test] fn test_compress_empty_multi_raw_one_thread() { let input = []; let params = [BrotliEncoderParameter::BROTLI_PARAM_QUALITY, BrotliEncoderParameter::BROTLI_PARAM_Q9_5, BrotliEncoderParameter::BROTLI_PARAM_CATABLE, BrotliEncoderParameter::BROTLI_PARAM_APPENDABLE, BrotliEncoderParameter::BROTLI_PARAM_MAGIC_NUMBER, ]; let values = [10u32,1u32,1u32,1u32,1u32]; let mut encoded_size = BrotliEncoderMaxCompressedSizeMulti(input.len(), 1); let mut encoded_backing = [0u8;25]; let encoded = &mut encoded_backing[..encoded_size]; assert_eq!(params.len(), 5); assert_eq!(encoded_size, 25); let ret = unsafe { BrotliEncoderCompressMulti( params.len(), params[..].as_ptr(), values[..].as_ptr(), input.len(), input[..].as_ptr(), &mut encoded_size, encoded.as_mut_ptr(), 1, None, None, core::ptr::null_mut()) }; assert_eq!(ret, 1); let mut rt_size = 256; let mut rt_buffer = [0u8;256]; assert!(encoded_size != 0); let ret2 = unsafe { super::super::decompressor::CBrotliDecoderDecompress(encoded_size, encoded.as_ptr(), &mut rt_size, rt_buffer.as_mut_ptr()) }; match ret2 { super::super::decompressor::ffi::interface::BrotliDecoderResult::BROTLI_DECODER_RESULT_SUCCESS => { }, _ => panic!("{}", ret2 as i32), } assert_eq!(rt_size, input.len()); assert_eq!(&rt_buffer[..rt_size], &input[..]); } #[test] fn test_compress_empty_multi_catable() { let input = []; let params = [BrotliEncoderParameter::BROTLI_PARAM_QUALITY, BrotliEncoderParameter::BROTLI_PARAM_LGWIN, BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT, BrotliEncoderParameter::BROTLI_PARAM_CATABLE, BrotliEncoderParameter::BROTLI_PARAM_MAGIC_NUMBER, BrotliEncoderParameter::BROTLI_PARAM_Q9_5]; let values = [3u32,16u32,0u32,1u32,1u32,0u32]; let mut encoded_size = BrotliEncoderMaxCompressedSizeMulti(input.len(), 4); let mut encoded_backing = [0u8;145]; let encoded = &mut encoded_backing[..encoded_size]; let ret = unsafe { BrotliEncoderCompressMulti( params.len(), params[..].as_ptr(), values[..].as_ptr(), input.len(), input[..].as_ptr(), &mut encoded_size, encoded.as_mut_ptr(), 4, None, None, core::ptr::null_mut()) }; assert_eq!(ret, 1); let mut rt_size = 256; let mut rt_buffer = [0u8;256]; assert!(encoded_size != 0); let ret2 = unsafe { super::super::decompressor::CBrotliDecoderDecompress(encoded_size, encoded.as_ptr(), &mut rt_size, rt_buffer.as_mut_ptr()) }; match ret2 { super::super::decompressor::ffi::interface::BrotliDecoderResult::BROTLI_DECODER_RESULT_SUCCESS => { }, _ => panic!("{:?}", ret2 as i32), } assert_eq!(rt_size, input.len()); assert_eq!(&rt_buffer[..rt_size], &input[..]); } brotli-3.4.0/src/lib.rs000075500000000000000000000063731046102023000130420ustar 00000000000000#![no_std] #![allow(non_snake_case)] #![allow(unused_parens)] #![allow(non_camel_case_types)] #![allow(non_snake_case)] #![allow(non_upper_case_globals)] #![cfg_attr(feature="benchmark", feature(test))] #![cfg_attr(feature="no-stdlib-ffi-binding",cfg_attr(not(feature="std"), feature(lang_items)))] #[macro_use] // <-- for debugging, remove xprintln from bit_reader and replace with println #[cfg(feature="std")] extern crate std; #[cfg(feature="simd")] extern crate packed_simd_2; #[cfg(feature="std")] extern crate alloc_stdlib; #[allow(unused_imports)] #[macro_use] extern crate alloc_no_stdlib as alloc; extern crate brotli_decompressor; pub use alloc::{AllocatedStackMemory, Allocator, SliceWrapper, SliceWrapperMut, StackAllocator}; pub const VERSION: u8 = 1; #[cfg(feature="std")] pub use alloc_stdlib::HeapAlloc; pub mod enc; pub use self::enc::combined_alloc::CombiningAllocator; pub mod concat; pub use brotli_decompressor::transform; pub use brotli_decompressor::dictionary; pub use brotli_decompressor::reader; pub use brotli_decompressor::writer; pub use brotli_decompressor::BrotliState; pub use brotli_decompressor::reader::{DecompressorCustomIo}; pub use brotli_decompressor::HuffmanCode; // so we can make custom allocator for decompression pub use brotli_decompressor::transform::TransformDictionaryWord; #[cfg(feature="std")] pub use brotli_decompressor::reader::{Decompressor}; pub use brotli_decompressor::writer::{DecompressorWriterCustomIo}; #[cfg(feature="std")] pub use brotli_decompressor::writer::{DecompressorWriter}; pub use brotli_decompressor::io_wrappers::{CustomRead, CustomWrite}; #[cfg(feature="std")] pub use brotli_decompressor::io_wrappers::{IntoIoReader, IoReaderWrapper, IoWriterWrapper}; pub use enc::interface; pub use enc::input_pair::InputReference; pub use enc::input_pair::InputReferenceMut; pub use enc::input_pair::InputPair; pub use enc::interface::SliceOffset; pub use enc::interface::thaw; pub use enc::interface::thaw_pair; #[cfg(feature="ffi-api")] pub mod ffi; // interface // pub fn BrotliDecompressStream(mut available_in: &mut usize, // input_offset: &mut usize, // input: &[u8], // mut available_out: &mut usize, // mut output_offset: &mut usize, // mut output: &mut [u8], // mut total_out: &mut usize, // mut s: &mut BrotliState); pub use brotli_decompressor::{BrotliDecompressStream, BrotliResult}; #[cfg(feature="std")] pub use enc::{BrotliCompress, BrotliCompressCustomAlloc}; pub use enc::{BrotliCompressCustomIo, BrotliCompressCustomIoCustomDict}; #[cfg(feature="std")] pub use enc::reader::{CompressorReader}; pub use enc::reader::{CompressorReaderCustomIo}; #[cfg(feature="std")] pub use enc::writer::{CompressorWriter}; pub use enc::writer::{CompressorWriterCustomIo}; #[cfg(feature="std")] pub use brotli_decompressor::BrotliDecompress; #[cfg(feature="std")] pub use brotli_decompressor::BrotliDecompressCustomAlloc; pub use brotli_decompressor::BrotliDecompressCustomIo; pub use brotli_decompressor::BrotliDecompressCustomIoCustomDict; #[cfg(feature="std")] pub use brotli_decompressor::copy_from_to; brotli-3.4.0/testdata/.gitattributes000064400000000000000000000000111046102023000156170ustar 00000000000000* binary brotli-3.4.0/testdata/10x10y000064400000000000000000000000241046102023000136150ustar 00000000000000XXXXXXXXXXYYYYYYYYYYbrotli-3.4.0/testdata/64x000064400000000000000000000001001046102023000132670ustar 00000000000000XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbrotli-3.4.0/testdata/64x.compressed000064400000000000000000000000121046102023000154340ustar 00000000000000?$♀brotli-3.4.0/testdata/aaabaaaa000064400000000000000000002000011046102023000143400ustar 00000000000000aaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrotli-3.4.0/testdata/alice29.txt000064400000000000000000004510311046102023000147310ustar 00000000000000 ALICE'S ADVENTURES IN WONDERLAND Lewis Carroll THE MILLENNIUM FULCRUM EDITION 2.9 CHAPTER I Down the Rabbit-Hole Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, `and what is the use of a book,' thought Alice `without pictures or conversation?' So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid), whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly a White Rabbit with pink eyes ran close by her. There was nothing so VERY remarkable in that; nor did Alice think it so VERY much out of the way to hear the Rabbit say to itself, `Oh dear! Oh dear! I shall be late!' (when she thought it over afterwards, it occurred to her that she ought to have wondered at this, but at the time it all seemed quite natural); but when the Rabbit actually TOOK A WATCH OUT OF ITS WAISTCOAT- POCKET, and looked at it, and then hurried on, Alice started to her feet, for it flashed across her mind that she had never before seen a rabbit with either a waistcoat-pocket, or a watch to take out of it, and burning with curiosity, she ran across the field after it, and fortunately was just in time to see it pop down a large rabbit-hole under the hedge. In another moment down went Alice after it, never once considering how in the world she was to get out again. The rabbit-hole went straight on like a tunnel for some way, and then dipped suddenly down, so suddenly that Alice had not a moment to think about stopping herself before she found herself falling down a very deep well. Either the well was very deep, or she fell very slowly, for she had plenty of time as she went down to look about her and to wonder what was going to happen next. First, she tried to look down and make out what she was coming to, but it was too dark to see anything; then she looked at the sides of the well, and noticed that they were filled with cupboards and book-shelves; here and there she saw maps and pictures hung upon pegs. She took down a jar from one of the shelves as she passed; it was labelled `ORANGE MARMALADE', but to her great disappointment it was empty: she did not like to drop the jar for fear of killing somebody, so managed to put it into one of the cupboards as she fell past it. `Well!' thought Alice to herself, `after such a fall as this, I shall think nothing of tumbling down stairs! How brave they'll all think me at home! Why, I wouldn't say anything about it, even if I fell off the top of the house!' (Which was very likely true.) Down, down, down. Would the fall NEVER come to an end! `I wonder how many miles I've fallen by this time?' she said aloud. `I must be getting somewhere near the centre of the earth. Let me see: that would be four thousand miles down, I think--' (for, you see, Alice had learnt several things of this sort in her lessons in the schoolroom, and though this was not a VERY good opportunity for showing off her knowledge, as there was no one to listen to her, still it was good practice to say it over) `--yes, that's about the right distance--but then I wonder what Latitude or Longitude I've got to?' (Alice had no idea what Latitude was, or Longitude either, but thought they were nice grand words to say.) Presently she began again. `I wonder if I shall fall right THROUGH the earth! How funny it'll seem to come out among the people that walk with their heads downward! The Antipathies, I think--' (she was rather glad there WAS no one listening, this time, as it didn't sound at all the right word) `--but I shall have to ask them what the name of the country is, you know. Please, Ma'am, is this New Zealand or Australia?' (and she tried to curtsey as she spoke--fancy CURTSEYING as you're falling through the air! Do you think you could manage it?) `And what an ignorant little girl she'll think me for asking! No, it'll never do to ask: perhaps I shall see it written up somewhere.' Down, down, down. There was nothing else to do, so Alice soon began talking again. `Dinah'll miss me very much to-night, I should think!' (Dinah was the cat.) `I hope they'll remember her saucer of milk at tea-time. Dinah my dear! I wish you were down here with me! There are no mice in the air, I'm afraid, but you might catch a bat, and that's very like a mouse, you know. But do cats eat bats, I wonder?' And here Alice began to get rather sleepy, and went on saying to herself, in a dreamy sort of way, `Do cats eat bats? Do cats eat bats?' and sometimes, `Do bats eat cats?' for, you see, as she couldn't answer either question, it didn't much matter which way she put it. She felt that she was dozing off, and had just begun to dream that she was walking hand in hand with Dinah, and saying to her very earnestly, `Now, Dinah, tell me the truth: did you ever eat a bat?' when suddenly, thump! thump! down she came upon a heap of sticks and dry leaves, and the fall was over. Alice was not a bit hurt, and she jumped up on to her feet in a moment: she looked up, but it was all dark overhead; before her was another long passage, and the White Rabbit was still in sight, hurrying down it. There was not a moment to be lost: away went Alice like the wind, and was just in time to hear it say, as it turned a corner, `Oh my ears and whiskers, how late it's getting!' She was close behind it when she turned the corner, but the Rabbit was no longer to be seen: she found herself in a long, low hall, which was lit up by a row of lamps hanging from the roof. There were doors all round the hall, but they were all locked; and when Alice had been all the way down one side and up the other, trying every door, she walked sadly down the middle, wondering how she was ever to get out again. Suddenly she came upon a little three-legged table, all made of solid glass; there was nothing on it except a tiny golden key, and Alice's first thought was that it might belong to one of the doors of the hall; but, alas! either the locks were too large, or the key was too small, but at any rate it would not open any of them. However, on the second time round, she came upon a low curtain she had not noticed before, and behind it was a little door about fifteen inches high: she tried the little golden key in the lock, and to her great delight it fitted! Alice opened the door and found that it led into a small passage, not much larger than a rat-hole: she knelt down and looked along the passage into the loveliest garden you ever saw. How she longed to get out of that dark hall, and wander about among those beds of bright flowers and those cool fountains, but she could not even get her head though the doorway; `and even if my head would go through,' thought poor Alice, `it would be of very little use without my shoulders. Oh, how I wish I could shut up like a telescope! I think I could, if I only know how to begin.' For, you see, so many out-of-the-way things had happened lately, that Alice had begun to think that very few things indeed were really impossible. There seemed to be no use in waiting by the little door, so she went back to the table, half hoping she might find another key on it, or at any rate a book of rules for shutting people up like telescopes: this time she found a little bottle on it, (`which certainly was not here before,' said Alice,) and round the neck of the bottle was a paper label, with the words `DRINK ME' beautifully printed on it in large letters. It was all very well to say `Drink me,' but the wise little Alice was not going to do THAT in a hurry. `No, I'll look first,' she said, `and see whether it's marked "poison" or not'; for she had read several nice little histories about children who had got burnt, and eaten up by wild beasts and other unpleasant things, all because they WOULD not remember the simple rules their friends had taught them: such as, that a red-hot poker will burn you if you hold it too long; and that if you cut your finger VERY deeply with a knife, it usually bleeds; and she had never forgotten that, if you drink much from a bottle marked `poison,' it is almost certain to disagree with you, sooner or later. However, this bottle was NOT marked `poison,' so Alice ventured to taste it, and finding it very nice, (it had, in fact, a sort of mixed flavour of cherry-tart, custard, pine-apple, roast turkey, toffee, and hot buttered toast,) she very soon finished it off. * * * * * * * * * * * * * * * * * * * * `What a curious feeling!' said Alice; `I must be shutting up like a telescope.' And so it was indeed: she was now only ten inches high, and her face brightened up at the thought that she was now the right size for going though the little door into that lovely garden. First, however, she waited for a few minutes to see if she was going to shrink any further: she felt a little nervous about this; `for it might end, you know,' said Alice to herself, `in my going out altogether, like a candle. I wonder what I should be like then?' And she tried to fancy what the flame of a candle is like after the candle is blown out, for she could not remember ever having seen such a thing. After a while, finding that nothing more happened, she decided on going into the garden at once; but, alas for poor Alice! when she got to the door, she found he had forgotten the little golden key, and when she went back to the table for it, she found she could not possibly reach it: she could see it quite plainly through the glass, and she tried her best to climb up one of the legs of the table, but it was too slippery; and when she had tired herself out with trying, the poor little thing sat down and cried. `Come, there's no use in crying like that!' said Alice to herself, rather sharply; `I advise you to leave off this minute!' She generally gave herself very good advice, (though she very seldom followed it), and sometimes she scolded herself so severely as to bring tears into her eyes; and once she remembered trying to box her own ears for having cheated herself in a game of croquet she was playing against herself, for this curious child was very fond of pretending to be two people. `But it's no use now,' thought poor Alice, `to pretend to be two people! Why, there's hardly enough of me left to make ONE respectable person!' Soon her eye fell on a little glass box that was lying under the table: she opened it, and found in it a very small cake, on which the words `EAT ME' were beautifully marked in currants. `Well, I'll eat it,' said Alice, `and if it makes me grow larger, I can reach the key; and if it makes me grow smaller, I can creep under the door; so either way I'll get into the garden, and I don't care which happens!' She ate a little bit, and said anxiously to herself, `Which way? Which way?', holding her hand on the top of her head to feel which way it was growing, and she was quite surprised to find that she remained the same size: to be sure, this generally happens when one eats cake, but Alice had got so much into the way of expecting nothing but out-of-the-way things to happen, that it seemed quite dull and stupid for life to go on in the common way. So she set to work, and very soon finished off the cake. * * * * * * * * * * * * * * * * * * * * CHAPTER II The Pool of Tears `Curiouser and curiouser!' cried Alice (she was so much surprised, that for the moment she quite forgot how to speak good English); `now I'm opening out like the largest telescope that ever was! Good-bye, feet!' (for when she looked down at her feet, they seemed to be almost out of sight, they were getting so far off). `Oh, my poor little feet, I wonder who will put on your shoes and stockings for you now, dears? I'm sure _I_ shan't be able! I shall be a great deal too far off to trouble myself about you: you must manage the best way you can; --but I must be kind to them,' thought Alice, `or perhaps they won't walk the way I want to go! Let me see: I'll give them a new pair of boots every Christmas.' And she went on planning to herself how she would manage it. `They must go by the carrier,' she thought; `and how funny it'll seem, sending presents to one's own feet! And how odd the directions will look! ALICE'S RIGHT FOOT, ESQ. HEARTHRUG, NEAR THE FENDER, (WITH ALICE'S LOVE). Oh dear, what nonsense I'm talking!' Just then her head struck against the roof of the hall: in fact she was now more than nine feet high, and she at once took up the little golden key and hurried off to the garden door. Poor Alice! It was as much as she could do, lying down on one side, to look through into the garden with one eye; but to get through was more hopeless than ever: she sat down and began to cry again. `You ought to be ashamed of yourself,' said Alice, `a great girl like you,' (she might well say this), `to go on crying in this way! Stop this moment, I tell you!' But she went on all the same, shedding gallons of tears, until there was a large pool all round her, about four inches deep and reaching half down the hall. After a time she heard a little pattering of feet in the distance, and she hastily dried her eyes to see what was coming. It was the White Rabbit returning, splendidly dressed, with a pair of white kid gloves in one hand and a large fan in the other: he came trotting along in a great hurry, muttering to himself as he came, `Oh! the Duchess, the Duchess! Oh! won't she be savage if I've kept her waiting!' Alice felt so desperate that she was ready to ask help of any one; so, when the Rabbit came near her, she began, in a low, timid voice, `If you please, sir--' The Rabbit started violently, dropped the white kid gloves and the fan, and skurried away into the darkness as hard as he could go. Alice took up the fan and gloves, and, as the hall was very hot, she kept fanning herself all the time she went on talking: `Dear, dear! How queer everything is to-day! And yesterday things went on just as usual. I wonder if I've been changed in the night? Let me think: was I the same when I got up this morning? I almost think I can remember feeling a little different. But if I'm not the same, the next question is, Who in the world am I? Ah, THAT'S the great puzzle!' And she began thinking over all the children she knew that were of the same age as herself, to see if she could have been changed for any of them. `I'm sure I'm not Ada,' she said, `for her hair goes in such long ringlets, and mine doesn't go in ringlets at all; and I'm sure I can't be Mabel, for I know all sorts of things, and she, oh! she knows such a very little! Besides, SHE'S she, and I'm I, and--oh dear, how puzzling it all is! I'll try if I know all the things I used to know. Let me see: four times five is twelve, and four times six is thirteen, and four times seven is--oh dear! I shall never get to twenty at that rate! However, the Multiplication Table doesn't signify: let's try Geography. London is the capital of Paris, and Paris is the capital of Rome, and Rome--no, THAT'S all wrong, I'm certain! I must have been changed for Mabel! I'll try and say "How doth the little--"' and she crossed her hands on her lap as if she were saying lessons, and began to repeat it, but her voice sounded hoarse and strange, and the words did not come the same as they used to do:-- `How doth the little crocodile Improve his shining tail, And pour the waters of the Nile On every golden scale! `How cheerfully he seems to grin, How neatly spread his claws, And welcome little fishes in With gently smiling jaws!' `I'm sure those are not the right words,' said poor Alice, and her eyes filled with tears again as she went on, `I must be Mabel after all, and I shall have to go and live in that poky little house, and have next to no toys to play with, and oh! ever so many lessons to learn! No, I've made up my mind about it; if I'm Mabel, I'll stay down here! It'll be no use their putting their heads down and saying "Come up again, dear!" I shall only look up and say "Who am I then? Tell me that first, and then, if I like being that person, I'll come up: if not, I'll stay down here till I'm somebody else"--but, oh dear!' cried Alice, with a sudden burst of tears, `I do wish they WOULD put their heads down! I am so VERY tired of being all alone here!' As she said this she looked down at her hands, and was surprised to see that she had put on one of the Rabbit's little white kid gloves while she was talking. `How CAN I have done that?' she thought. `I must be growing small again.' She got up and went to the table to measure herself by it, and found that, as nearly as she could guess, she was now about two feet high, and was going on shrinking rapidly: she soon found out that the cause of this was the fan she was holding, and she dropped it hastily, just in time to avoid shrinking away altogether. `That WAS a narrow escape!' said Alice, a good deal frightened at the sudden change, but very glad to find herself still in existence; `and now for the garden!' and she ran with all speed back to the little door: but, alas! the little door was shut again, and the little golden key was lying on the glass table as before, `and things are worse than ever,' thought the poor child, `for I never was so small as this before, never! And I declare it's too bad, that it is!' As she said these words her foot slipped, and in another moment, splash! she was up to her chin in salt water. He first idea was that she had somehow fallen into the sea, `and in that case I can go back by railway,' she said to herself. (Alice had been to the seaside once in her life, and had come to the general conclusion, that wherever you go to on the English coast you find a number of bathing machines in the sea, some children digging in the sand with wooden spades, then a row of lodging houses, and behind them a railway station.) However, she soon made out that she was in the pool of tears which she had wept when she was nine feet high. `I wish I hadn't cried so much!' said Alice, as she swam about, trying to find her way out. `I shall be punished for it now, I suppose, by being drowned in my own tears! That WILL be a queer thing, to be sure! However, everything is queer to-day.' Just then she heard something splashing about in the pool a little way off, and she swam nearer to make out what it was: at first she thought it must be a walrus or hippopotamus, but then she remembered how small she was now, and she soon made out that it was only a mouse that had slipped in like herself. `Would it be of any use, now,' thought Alice, `to speak to this mouse? Everything is so out-of-the-way down here, that I should think very likely it can talk: at any rate, there's no harm in trying.' So she began: `O Mouse, do you know the way out of this pool? I am very tired of swimming about here, O Mouse!' (Alice thought this must be the right way of speaking to a mouse: she had never done such a thing before, but she remembered having seen in her brother's Latin Grammar, `A mouse--of a mouse--to a mouse--a mouse--O mouse!' The Mouse looked at her rather inquisitively, and seemed to her to wink with one of its little eyes, but it said nothing. `Perhaps it doesn't understand English,' thought Alice; `I daresay it's a French mouse, come over with William the Conqueror.' (For, with all her knowledge of history, Alice had no very clear notion how long ago anything had happened.) So she began again: `Ou est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. `Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. `I quite forgot you didn't like cats.' `Not like cats!' cried the Mouse, in a shrill, passionate voice. `Would YOU like cats if you were me?' `Well, perhaps not,' said Alice in a soothing tone: `don't be angry about it. And yet I wish I could show you our cat Dinah: I think you'd take a fancy to cats if you could only see her. She is such a dear quiet thing,' Alice went on, half to herself, as she swam lazily about in the pool, `and she sits purring so nicely by the fire, licking her paws and washing her face--and she is such a nice soft thing to nurse--and she's such a capital one for catching mice--oh, I beg your pardon!' cried Alice again, for this time the Mouse was bristling all over, and she felt certain it must be really offended. `We won't talk about her any more if you'd rather not.' `We indeed!' cried the Mouse, who was trembling down to the end of his tail. `As if I would talk on such a subject! Our family always HATED cats: nasty, low, vulgar things! Don't let me hear the name again!' `I won't indeed!' said Alice, in a great hurry to change the subject of conversation. `Are you--are you fond--of--of dogs?' The Mouse did not answer, so Alice went on eagerly: `There is such a nice little dog near our house I should like to show you! A little bright-eyed terrier, you know, with oh, such long curly brown hair! And it'll fetch things when you throw them, and it'll sit up and beg for its dinner, and all sorts of things--I can't remember half of them--and it belongs to a farmer, you know, and he says it's so useful, it's worth a hundred pounds! He says it kills all the rats and--oh dear!' cried Alice in a sorrowful tone, `I'm afraid I've offended it again!' For the Mouse was swimming away from her as hard as it could go, and making quite a commotion in the pool as it went. So she called softly after it, `Mouse dear! Do come back again, and we won't talk about cats or dogs either, if you don't like them!' When the Mouse heard this, it turned round and swam slowly back to her: its face was quite pale (with passion, Alice thought), and it said in a low trembling voice, `Let us get to the shore, and then I'll tell you my history, and you'll understand why it is I hate cats and dogs.' It was high time to go, for the pool was getting quite crowded with the birds and animals that had fallen into it: there were a Duck and a Dodo, a Lory and an Eaglet, and several other curious creatures. Alice led the way, and the whole party swam to the shore. CHAPTER III A Caucus-Race and a Long Tale They were indeed a queer-looking party that assembled on the bank--the birds with draggled feathers, the animals with their fur clinging close to them, and all dripping wet, cross, and uncomfortable. The first question of course was, how to get dry again: they had a consultation about this, and after a few minutes it seemed quite natural to Alice to find herself talking familiarly with them, as if she had known them all her life. Indeed, she had quite a long argument with the Lory, who at last turned sulky, and would only say, `I am older than you, and must know better'; and this Alice would not allow without knowing how old it was, and, as the Lory positively refused to tell its age, there was no more to be said. At last the Mouse, who seemed to be a person of authority among them, called out, `Sit down, all of you, and listen to me! I'LL soon make you dry enough!' They all sat down at once, in a large ring, with the Mouse in the middle. Alice kept her eyes anxiously fixed on it, for she felt sure she would catch a bad cold if she did not get dry very soon. `Ahem!' said the Mouse with an important air, `are you all ready? This is the driest thing I know. Silence all round, if you please! "William the Conqueror, whose cause was favoured by the pope, was soon submitted to by the English, who wanted leaders, and had been of late much accustomed to usurpation and conquest. Edwin and Morcar, the earls of Mercia and Northumbria--"' `Ugh!' said the Lory, with a shiver. `I beg your pardon!' said the Mouse, frowning, but very politely: `Did you speak?' `Not I!' said the Lory hastily. `I thought you did,' said the Mouse. `--I proceed. "Edwin and Morcar, the earls of Mercia and Northumbria, declared for him: and even Stigand, the patriotic archbishop of Canterbury, found it advisable--"' `Found WHAT?' said the Duck. `Found IT,' the Mouse replied rather crossly: `of course you know what "it" means.' `I know what "it" means well enough, when I find a thing,' said the Duck: `it's generally a frog or a worm. The question is, what did the archbishop find?' The Mouse did not notice this question, but hurriedly went on, `"--found it advisable to go with Edgar Atheling to meet William and offer him the crown. William's conduct at first was moderate. But the insolence of his Normans--" How are you getting on now, my dear?' it continued, turning to Alice as it spoke. `As wet as ever,' said Alice in a melancholy tone: `it doesn't seem to dry me at all.' `In that case,' said the Dodo solemnly, rising to its feet, `I move that the meeting adjourn, for the immediate adoption of more energetic remedies--' `Speak English!' said the Eaglet. `I don't know the meaning of half those long words, and, what's more, I don't believe you do either!' And the Eaglet bent down its head to hide a smile: some of the other birds tittered audibly. `What I was going to say,' said the Dodo in an offended tone, `was, that the best thing to get us dry would be a Caucus-race.' `What IS a Caucus-race?' said Alice; not that she wanted much to know, but the Dodo had paused as if it thought that SOMEBODY ought to speak, and no one else seemed inclined to say anything. `Why,' said the Dodo, `the best way to explain it is to do it.' (And, as you might like to try the thing yourself, some winter day, I will tell you how the Dodo managed it.) First it marked out a race-course, in a sort of circle, (`the exact shape doesn't matter,' it said,) and then all the party were placed along the course, here and there. There was no `One, two, three, and away,' but they began running when they liked, and left off when they liked, so that it was not easy to know when the race was over. However, when they had been running half an hour or so, and were quite dry again, the Dodo suddenly called out `The race is over!' and they all crowded round it, panting, and asking, `But who has won?' This question the Dodo could not answer without a great deal of thought, and it sat for a long time with one finger pressed upon its forehead (the position in which you usually see Shakespeare, in the pictures of him), while the rest waited in silence. At last the Dodo said, `EVERYBODY has won, and all must have prizes.' `But who is to give the prizes?' quite a chorus of voices asked. `Why, SHE, of course,' said the Dodo, pointing to Alice with one finger; and the whole party at once crowded round her, calling out in a confused way, `Prizes! Prizes!' Alice had no idea what to do, and in despair she put her hand in her pocket, and pulled out a box of comfits, (luckily the salt water had not got into it), and handed them round as prizes. There was exactly one a-piece all round. `But she must have a prize herself, you know,' said the Mouse. `Of course,' the Dodo replied very gravely. `What else have you got in your pocket?' he went on, turning to Alice. `Only a thimble,' said Alice sadly. `Hand it over here,' said the Dodo. Then they all crowded round her once more, while the Dodo solemnly presented the thimble, saying `We beg your acceptance of this elegant thimble'; and, when it had finished this short speech, they all cheered. Alice thought the whole thing very absurd, but they all looked so grave that she did not dare to laugh; and, as she could not think of anything to say, she simply bowed, and took the thimble, looking as solemn as she could. The next thing was to eat the comfits: this caused some noise and confusion, as the large birds complained that they could not taste theirs, and the small ones choked and had to be patted on the back. However, it was over at last, and they sat down again in a ring, and begged the Mouse to tell them something more. `You promised to tell me your history, you know,' said Alice, `and why it is you hate--C and D,' she added in a whisper, half afraid that it would be offended again. `Mine is a long and a sad tale!' said the Mouse, turning to Alice, and sighing. `It IS a long tail, certainly,' said Alice, looking down with wonder at the Mouse's tail; `but why do you call it sad?' And she kept on puzzling about it while the Mouse was speaking, so that her idea of the tale was something like this:-- `Fury said to a mouse, That he met in the house, "Let us both go to law: I will prosecute YOU. --Come, I'll take no denial; We must have a trial: For really this morning I've nothing to do." Said the mouse to the cur, "Such a trial, dear Sir, With no jury or judge, would be wasting our breath." "I'll be judge, I'll be jury," Said cunning old Fury: "I'll try the whole cause, and condemn you to death."' `You are not attending!' said the Mouse to Alice severely. `What are you thinking of?' `I beg your pardon,' said Alice very humbly: `you had got to the fifth bend, I think?' `I had NOT!' cried the Mouse, sharply and very angrily. `A knot!' said Alice, always ready to make herself useful, and looking anxiously about her. `Oh, do let me help to undo it!' `I shall do nothing of the sort,' said the Mouse, getting up and walking away. `You insult me by talking such nonsense!' `I didn't mean it!' pleaded poor Alice. `But you're so easily offended, you know!' The Mouse only growled in reply. `Please come back and finish your story!' Alice called after it; and the others all joined in chorus, `Yes, please do!' but the Mouse only shook its head impatiently, and walked a little quicker. `What a pity it wouldn't stay!' sighed the Lory, as soon as it was quite out of sight; and an old Crab took the opportunity of saying to her daughter `Ah, my dear! Let this be a lesson to you never to lose YOUR temper!' `Hold your tongue, Ma!' said the young Crab, a little snappishly. `You're enough to try the patience of an oyster!' `I wish I had our Dinah here, I know I do!' said Alice aloud, addressing nobody in particular. `She'd soon fetch it back!' `And who is Dinah, if I might venture to ask the question?' said the Lory. Alice replied eagerly, for she was always ready to talk about her pet: `Dinah's our cat. And she's such a capital one for catching mice you can't think! And oh, I wish you could see her after the birds! Why, she'll eat a little bird as soon as look at it!' This speech caused a remarkable sensation among the party. Some of the birds hurried off at once: one the old Magpie began wrapping itself up very carefully, remarking, `I really must be getting home; the night-air doesn't suit my throat!' and a Canary called out in a trembling voice to its children, `Come away, my dears! It's high time you were all in bed!' On various pretexts they all moved off, and Alice was soon left alone. `I wish I hadn't mentioned Dinah!' she said to herself in a melancholy tone. `Nobody seems to like her, down here, and I'm sure she's the best cat in the world! Oh, my dear Dinah! I wonder if I shall ever see you any more!' And here poor Alice began to cry again, for she felt very lonely and low-spirited. In a little while, however, she again heard a little pattering of footsteps in the distance, and she looked up eagerly, half hoping that the Mouse had changed his mind, and was coming back to finish his story. CHAPTER IV The Rabbit Sends in a Little Bill It was the White Rabbit, trotting slowly back again, and looking anxiously about as it went, as if it had lost something; and she heard it muttering to itself `The Duchess! The Duchess! Oh my dear paws! Oh my fur and whiskers! She'll get me executed, as sure as ferrets are ferrets! Where CAN I have dropped them, I wonder?' Alice guessed in a moment that it was looking for the fan and the pair of white kid gloves, and she very good-naturedly began hunting about for them, but they were nowhere to be seen--everything seemed to have changed since her swim in the pool, and the great hall, with the glass table and the little door, had vanished completely. Very soon the Rabbit noticed Alice, as she went hunting about, and called out to her in an angry tone, `Why, Mary Ann, what ARE you doing out here? Run home this moment, and fetch me a pair of gloves and a fan! Quick, now!' And Alice was so much frightened that she ran off at once in the direction it pointed to, without trying to explain the mistake it had made. `He took me for his housemaid,' she said to herself as she ran. `How surprised he'll be when he finds out who I am! But I'd better take him his fan and gloves--that is, if I can find them.' As she said this, she came upon a neat little house, on the door of which was a bright brass plate with the name `W. RABBIT' engraved upon it. She went in without knocking, and hurried upstairs, in great fear lest she should meet the real Mary Ann, and be turned out of the house before she had found the fan and gloves. `How queer it seems,' Alice said to herself, `to be going messages for a rabbit! I suppose Dinah'll be sending me on messages next!' And she began fancying the sort of thing that would happen: `"Miss Alice! Come here directly, and get ready for your walk!" "Coming in a minute, nurse! But I've got to see that the mouse doesn't get out." Only I don't think,' Alice went on, `that they'd let Dinah stop in the house if it began ordering people about like that!' By this time she had found her way into a tidy little room with a table in the window, and on it (as she had hoped) a fan and two or three pairs of tiny white kid gloves: she took up the fan and a pair of the gloves, and was just going to leave the room, when her eye fell upon a little bottle that stood near the looking- glass. There was no label this time with the words `DRINK ME,' but nevertheless she uncorked it and put it to her lips. `I know SOMETHING interesting is sure to happen,' she said to herself, `whenever I eat or drink anything; so I'll just see what this bottle does. I do hope it'll make me grow large again, for really I'm quite tired of being such a tiny little thing!' It did so indeed, and much sooner than she had expected: before she had drunk half the bottle, she found her head pressing against the ceiling, and had to stoop to save her neck from being broken. She hastily put down the bottle, saying to herself `That's quite enough--I hope I shan't grow any more--As it is, I can't get out at the door--I do wish I hadn't drunk quite so much!' Alas! it was too late to wish that! She went on growing, and growing, and very soon had to kneel down on the floor: in another minute there was not even room for this, and she tried the effect of lying down with one elbow against the door, and the other arm curled round her head. Still she went on growing, and, as a last resource, she put one arm out of the window, and one foot up the chimney, and said to herself `Now I can do no more, whatever happens. What WILL become of me?' Luckily for Alice, the little magic bottle had now had its full effect, and she grew no larger: still it was very uncomfortable, and, as there seemed to be no sort of chance of her ever getting out of the room again, no wonder she felt unhappy. `It was much pleasanter at home,' thought poor Alice, `when one wasn't always growing larger and smaller, and being ordered about by mice and rabbits. I almost wish I hadn't gone down that rabbit-hole--and yet--and yet--it's rather curious, you know, this sort of life! I do wonder what CAN have happened to me! When I used to read fairy-tales, I fancied that kind of thing never happened, and now here I am in the middle of one! There ought to be a book written about me, that there ought! And when I grow up, I'll write one--but I'm grown up now,' she added in a sorrowful tone; `at least there's no room to grow up any more HERE.' `But then,' thought Alice, `shall I NEVER get any older than I am now? That'll be a comfort, one way--never to be an old woman- -but then--always to have lessons to learn! Oh, I shouldn't like THAT!' `Oh, you foolish Alice!' she answered herself. `How can you learn lessons in here? Why, there's hardly room for YOU, and no room at all for any lesson-books!' And so she went on, taking first one side and then the other, and making quite a conversation of it altogether; but after a few minutes she heard a voice outside, and stopped to listen. `Mary Ann! Mary Ann!' said the voice. `Fetch me my gloves this moment!' Then came a little pattering of feet on the stairs. Alice knew it was the Rabbit coming to look for her, and she trembled till she shook the house, quite forgetting that she was now about a thousand times as large as the Rabbit, and had no reason to be afraid of it. Presently the Rabbit came up to the door, and tried to open it; but, as the door opened inwards, and Alice's elbow was pressed hard against it, that attempt proved a failure. Alice heard it say to itself `Then I'll go round and get in at the window.' `THAT you won't' thought Alice, and, after waiting till she fancied she heard the Rabbit just under the window, she suddenly spread out her hand, and made a snatch in the air. She did not get hold of anything, but she heard a little shriek and a fall, and a crash of broken glass, from which she concluded that it was just possible it had fallen into a cucumber-frame, or something of the sort. Next came an angry voice--the Rabbit's--`Pat! Pat! Where are you?' And then a voice she had never heard before, `Sure then I'm here! Digging for apples, yer honour!' `Digging for apples, indeed!' said the Rabbit angrily. `Here! Come and help me out of THIS!' (Sounds of more broken glass.) `Now tell me, Pat, what's that in the window?' `Sure, it's an arm, yer honour!' (He pronounced it `arrum.') `An arm, you goose! Who ever saw one that size? Why, it fills the whole window!' `Sure, it does, yer honour: but it's an arm for all that.' `Well, it's got no business there, at any rate: go and take it away!' There was a long silence after this, and Alice could only hear whispers now and then; such as, `Sure, I don't like it, yer honour, at all, at all!' `Do as I tell you, you coward!' and at last she spread out her hand again, and made another snatch in the air. This time there were TWO little shrieks, and more sounds of broken glass. `What a number of cucumber-frames there must be!' thought Alice. `I wonder what they'll do next! As for pulling me out of the window, I only wish they COULD! I'm sure I don't want to stay in here any longer!' She waited for some time without hearing anything more: at last came a rumbling of little cartwheels, and the sound of a good many voice all talking together: she made out the words: `Where's the other ladder?--Why, I hadn't to bring but one; Bill's got the other--Bill! fetch it here, lad!--Here, put 'em up at this corner--No, tie 'em together first--they don't reach half high enough yet--Oh! they'll do well enough; don't be particular- -Here, Bill! catch hold of this rope--Will the roof bear?--Mind that loose slate--Oh, it's coming down! Heads below!' (a loud crash)--`Now, who did that?--It was Bill, I fancy--Who's to go down the chimney?--Nay, I shan't! YOU do it!--That I won't, then!--Bill's to go down--Here, Bill! the master says you're to go down the chimney!' `Oh! So Bill's got to come down the chimney, has he?' said Alice to herself. `Shy, they seem to put everything upon Bill! I wouldn't be in Bill's place for a good deal: this fireplace is narrow, to be sure; but I THINK I can kick a little!' She drew her foot as far down the chimney as she could, and waited till she heard a little animal (she couldn't guess of what sort it was) scratching and scrambling about in the chimney close above her: then, saying to herself `This is Bill,' she gave one sharp kick, and waited to see what would happen next. The first thing she heard was a general chorus of `There goes Bill!' then the Rabbit's voice along--`Catch him, you by the hedge!' then silence, and then another confusion of voices--`Hold up his head--Brandy now--Don't choke him--How was it, old fellow? What happened to you? Tell us all about it!' Last came a little feeble, squeaking voice, (`That's Bill,' thought Alice,) `Well, I hardly know--No more, thank ye; I'm better now--but I'm a deal too flustered to tell you--all I know is, something comes at me like a Jack-in-the-box, and up I goes like a sky-rocket!' `So you did, old fellow!' said the others. `We must burn the house down!' said the Rabbit's voice; and Alice called out as loud as she could, `If you do. I'll set Dinah at you!' There was a dead silence instantly, and Alice thought to herself, `I wonder what they WILL do next! If they had any sense, they'd take the roof off.' After a minute or two, they began moving about again, and Alice heard the Rabbit say, `A barrowful will do, to begin with.' `A barrowful of WHAT?' thought Alice; but she had not long to doubt, for the next moment a shower of little pebbles came rattling in at the window, and some of them hit her in the face. `I'll put a stop to this,' she said to herself, and shouted out, `You'd better not do that again!' which produced another dead silence. Alice noticed with some surprise that the pebbles were all turning into little cakes as they lay on the floor, and a bright idea came into her head. `If I eat one of these cakes,' she thought, `it's sure to make SOME change in my size; and as it can't possibly make me larger, it must make me smaller, I suppose.' So she swallowed one of the cakes, and was delighted to find that she began shrinking directly. As soon as she was small enough to get through the door, she ran out of the house, and found quite a crowd of little animals and birds waiting outside. The poor little Lizard, Bill, was in the middle, being held up by two guinea-pigs, who were giving it something out of a bottle. They all made a rush at Alice the moment she appeared; but she ran off as hard as she could, and soon found herself safe in a thick wood. `The first thing I've got to do,' said Alice to herself, as she wandered about in the wood, `is to grow to my right size again; and the second thing is to find my way into that lovely garden. I think that will be the best plan.' It sounded an excellent plan, no doubt, and very neatly and simply arranged; the only difficulty was, that she had not the smallest idea how to set about it; and while she was peering about anxiously among the trees, a little sharp bark just over her head made her look up in a great hurry. An enormous puppy was looking down at her with large round eyes, and feebly stretching out one paw, trying to touch her. `Poor little thing!' said Alice, in a coaxing tone, and she tried hard to whistle to it; but she was terribly frightened all the time at the thought that it might be hungry, in which case it would be very likely to eat her up in spite of all her coaxing. Hardly knowing what she did, she picked up a little bit of stick, and held it out to the puppy; whereupon the puppy jumped into the air off all its feet at once, with a yelp of delight, and rushed at the stick, and made believe to worry it; then Alice dodged behind a great thistle, to keep herself from being run over; and the moment she appeared on the other side, the puppy made another rush at the stick, and tumbled head over heels in its hurry to get hold of it; then Alice, thinking it was very like having a game of play with a cart-horse, and expecting every moment to be trampled under its feet, ran round the thistle again; then the puppy began a series of short charges at the stick, running a very little way forwards each time and a long way back, and barking hoarsely all the while, till at last it sat down a good way off, panting, with its tongue hanging out of its mouth, and its great eyes half shut. This seemed to Alice a good opportunity for making her escape; so she set off at once, and ran till she was quite tired and out of breath, and till the puppy's bark sounded quite faint in the distance. `And yet what a dear little puppy it was!' said Alice, as she leant against a buttercup to rest herself, and fanned herself with one of the leaves: `I should have liked teaching it tricks very much, if--if I'd only been the right size to do it! Oh dear! I'd nearly forgotten that I've got to grow up again! Let me see--how IS it to be managed? I suppose I ought to eat or drink something or other; but the great question is, what?' The great question certainly was, what? Alice looked all round her at the flowers and the blades of grass, but she did not see anything that looked like the right thing to eat or drink under the circumstances. There was a large mushroom growing near her, about the same height as herself; and when she had looked under it, and on both sides of it, and behind it, it occurred to her that she might as well look and see what was on the top of it. She stretched herself up on tiptoe, and peeped over the edge of the mushroom, and her eyes immediately met those of a large caterpillar, that was sitting on the top with its arms folded, quietly smoking a long hookah, and taking not the smallest notice of her or of anything else. CHAPTER V Advice from a Caterpillar The Caterpillar and Alice looked at each other for some time in silence: at last the Caterpillar took the hookah out of its mouth, and addressed her in a languid, sleepy voice. `Who are YOU?' said the Caterpillar. This was not an encouraging opening for a conversation. Alice replied, rather shyly, `I--I hardly know, sir, just at present-- at least I know who I WAS when I got up this morning, but I think I must have been changed several times since then.' `What do you mean by that?' said the Caterpillar sternly. `Explain yourself!' `I can't explain MYSELF, I'm afraid, sir' said Alice, `because I'm not myself, you see.' `I don't see,' said the Caterpillar. `I'm afraid I can't put it more clearly,' Alice replied very politely, `for I can't understand it myself to begin with; and being so many different sizes in a day is very confusing.' `It isn't,' said the Caterpillar. `Well, perhaps you haven't found it so yet,' said Alice; `but when you have to turn into a chrysalis--you will some day, you know--and then after that into a butterfly, I should think you'll feel it a little queer, won't you?' `Not a bit,' said the Caterpillar. `Well, perhaps your feelings may be different,' said Alice; `all I know is, it would feel very queer to ME.' `You!' said the Caterpillar contemptuously. `Who are YOU?' Which brought them back again to the beginning of the conversation. Alice felt a little irritated at the Caterpillar's making such VERY short remarks, and she drew herself up and said, very gravely, `I think, you ought to tell me who YOU are, first.' `Why?' said the Caterpillar. Here was another puzzling question; and as Alice could not think of any good reason, and as the Caterpillar seemed to be in a VERY unpleasant state of mind, she turned away. `Come back!' the Caterpillar called after her. `I've something important to say!' This sounded promising, certainly: Alice turned and came back again. `Keep your temper,' said the Caterpillar. `Is that all?' said Alice, swallowing down her anger as well as she could. `No,' said the Caterpillar. Alice thought she might as well wait, as she had nothing else to do, and perhaps after all it might tell her something worth hearing. For some minutes it puffed away without speaking, but at last it unfolded its arms, took the hookah out of its mouth again, and said, `So you think you're changed, do you?' `I'm afraid I am, sir,' said Alice; `I can't remember things as I used--and I don't keep the same size for ten minutes together!' `Can't remember WHAT things?' said the Caterpillar. `Well, I've tried to say "HOW DOTH THE LITTLE BUSY BEE," but it all came different!' Alice replied in a very melancholy voice. `Repeat, "YOU ARE OLD, FATHER WILLIAM,"' said the Caterpillar. Alice folded her hands, and began:-- `You are old, Father William,' the young man said, `And your hair has become very white; And yet you incessantly stand on your head-- Do you think, at your age, it is right?' `In my youth,' Father William replied to his son, `I feared it might injure the brain; But, now that I'm perfectly sure I have none, Why, I do it again and again.' `You are old,' said the youth, `as I mentioned before, And have grown most uncommonly fat; Yet you turned a back-somersault in at the door-- Pray, what is the reason of that?' `In my youth,' said the sage, as he shook his grey locks, `I kept all my limbs very supple By the use of this ointment--one shilling the box-- Allow me to sell you a couple?' `You are old,' said the youth, `and your jaws are too weak For anything tougher than suet; Yet you finished the goose, with the bones and the beak-- Pray how did you manage to do it?' `In my youth,' said his father, `I took to the law, And argued each case with my wife; And the muscular strength, which it gave to my jaw, Has lasted the rest of my life.' `You are old,' said the youth, `one would hardly suppose That your eye was as steady as ever; Yet you balanced an eel on the end of your nose-- What made you so awfully clever?' `I have answered three questions, and that is enough,' Said his father; `don't give yourself airs! Do you think I can listen all day to such stuff? Be off, or I'll kick you down stairs!' `That is not said right,' said the Caterpillar. `Not QUITE right, I'm afraid,' said Alice, timidly; `some of the words have got altered.' `It is wrong from beginning to end,' said the Caterpillar decidedly, and there was silence for some minutes. The Caterpillar was the first to speak. `What size do you want to be?' it asked. `Oh, I'm not particular as to size,' Alice hastily replied; `only one doesn't like changing so often, you know.' `I DON'T know,' said the Caterpillar. Alice said nothing: she had never been so much contradicted in her life before, and she felt that she was losing her temper. `Are you content now?' said the Caterpillar. `Well, I should like to be a LITTLE larger, sir, if you wouldn't mind,' said Alice: `three inches is such a wretched height to be.' `It is a very good height indeed!' said the Caterpillar angrily, rearing itself upright as it spoke (it was exactly three inches high). `But I'm not used to it!' pleaded poor Alice in a piteous tone. And she thought of herself, `I wish the creatures wouldn't be so easily offended!' `You'll get used to it in time,' said the Caterpillar; and it put the hookah into its mouth and began smoking again. This time Alice waited patiently until it chose to speak again. In a minute or two the Caterpillar took the hookah out of its mouth and yawned once or twice, and shook itself. Then it got down off the mushroom, and crawled away in the grass, merely remarking as it went, `One side will make you grow taller, and the other side will make you grow shorter.' `One side of WHAT? The other side of WHAT?' thought Alice to herself. `Of the mushroom,' said the Caterpillar, just as if she had asked it aloud; and in another moment it was out of sight. Alice remained looking thoughtfully at the mushroom for a minute, trying to make out which were the two sides of it; and as it was perfectly round, she found this a very difficult question. However, at last she stretched her arms round it as far as they would go, and broke off a bit of the edge with each hand. `And now which is which?' she said to herself, and nibbled a little of the right-hand bit to try the effect: the next moment she felt a violent blow underneath her chin: it had struck her foot! She was a good deal frightened by this very sudden change, but she felt that there was no time to be lost, as she was shrinking rapidly; so she set to work at once to eat some of the other bit. Her chin was pressed so closely against her foot, that there was hardly room to open her mouth; but she did it at last, and managed to swallow a morsel of the lefthand bit. * * * * * * * * * * * * * * * * * * * * `Come, my head's free at last!' said Alice in a tone of delight, which changed into alarm in another moment, when she found that her shoulders were nowhere to be found: all she could see, when she looked down, was an immense length of neck, which seemed to rise like a stalk out of a sea of green leaves that lay far below her. `What CAN all that green stuff be?' said Alice. `And where HAVE my shoulders got to? And oh, my poor hands, how is it I can't see you?' She was moving them about as she spoke, but no result seemed to follow, except a little shaking among the distant green leaves. As there seemed to be no chance of getting her hands up to her head, she tried to get her head down to them, and was delighted to find that her neck would bend about easily in any direction, like a serpent. She had just succeeded in curving it down into a graceful zigzag, and was going to dive in among the leaves, which she found to be nothing but the tops of the trees under which she had been wandering, when a sharp hiss made her draw back in a hurry: a large pigeon had flown into her face, and was beating her violently with its wings. `Serpent!' screamed the Pigeon. `I'm NOT a serpent!' said Alice indignantly. `Let me alone!' `Serpent, I say again!' repeated the Pigeon, but in a more subdued tone, and added with a kind of sob, `I've tried every way, and nothing seems to suit them!' `I haven't the least idea what you're talking about,' said Alice. `I've tried the roots of trees, and I've tried banks, and I've tried hedges,' the Pigeon went on, without attending to her; `but those serpents! There's no pleasing them!' Alice was more and more puzzled, but she thought there was no use in saying anything more till the Pigeon had finished. `As if it wasn't trouble enough hatching the eggs,' said the Pigeon; `but I must be on the look-out for serpents night and day! Why, I haven't had a wink of sleep these three weeks!' `I'm very sorry you've been annoyed,' said Alice, who was beginning to see its meaning. `And just as I'd taken the highest tree in the wood,' continued the Pigeon, raising its voice to a shriek, `and just as I was thinking I should be free of them at last, they must needs come wriggling down from the sky! Ugh, Serpent!' `But I'm NOT a serpent, I tell you!' said Alice. `I'm a--I'm a--' `Well! WHAT are you?' said the Pigeon. `I can see you're trying to invent something!' `I--I'm a little girl,' said Alice, rather doubtfully, as she remembered the number of changes she had gone through that day. `A likely story indeed!' said the Pigeon in a tone of the deepest contempt. `I've seen a good many little girls in my time, but never ONE with such a neck as that! No, no! You're a serpent; and there's no use denying it. I suppose you'll be telling me next that you never tasted an egg!' `I HAVE tasted eggs, certainly,' said Alice, who was a very truthful child; `but little girls eat eggs quite as much as serpents do, you know.' `I don't believe it,' said the Pigeon; `but if they do, why then they're a kind of serpent, that's all I can say.' This was such a new idea to Alice, that she was quite silent for a minute or two, which gave the Pigeon the opportunity of adding, `You're looking for eggs, I know THAT well enough; and what does it matter to me whether you're a little girl or a serpent?' `It matters a good deal to ME,' said Alice hastily; `but I'm not looking for eggs, as it happens; and if I was, I shouldn't want YOURS: I don't like them raw.' `Well, be off, then!' said the Pigeon in a sulky tone, as it settled down again into its nest. Alice crouched down among the trees as well as she could, for her neck kept getting entangled among the branches, and every now and then she had to stop and untwist it. After a while she remembered that she still held the pieces of mushroom in her hands, and she set to work very carefully, nibbling first at one and then at the other, and growing sometimes taller and sometimes shorter, until she had succeeded in bringing herself down to her usual height. It was so long since she had been anything near the right size, that it felt quite strange at first; but she got used to it in a few minutes, and began talking to herself, as usual. `Come, there's half my plan done now! How puzzling all these changes are! I'm never sure what I'm going to be, from one minute to another! However, I've got back to my right size: the next thing is, to get into that beautiful garden--how IS that to be done, I wonder?' As she said this, she came suddenly upon an open place, with a little house in it about four feet high. `Whoever lives there,' thought Alice, `it'll never do to come upon them THIS size: why, I should frighten them out of their wits!' So she began nibbling at the righthand bit again, and did not venture to go near the house till she had brought herself down to nine inches high. CHAPTER VI Pig and Pepper For a minute or two she stood looking at the house, and wondering what to do next, when suddenly a footman in livery came running out of the wood--(she considered him to be a footman because he was in livery: otherwise, judging by his face only, she would have called him a fish)--and rapped loudly at the door with his knuckles. It was opened by another footman in livery, with a round face, and large eyes like a frog; and both footmen, Alice noticed, had powdered hair that curled all over their heads. She felt very curious to know what it was all about, and crept a little way out of the wood to listen. The Fish-Footman began by producing from under his arm a great letter, nearly as large as himself, and this he handed over to the other, saying, in a solemn tone, `For the Duchess. An invitation from the Queen to play croquet.' The Frog-Footman repeated, in the same solemn tone, only changing the order of the words a little, `From the Queen. An invitation for the Duchess to play croquet.' Then they both bowed low, and their curls got entangled together. Alice laughed so much at this, that she had to run back into the wood for fear of their hearing her; and when she next peeped out the Fish-Footman was gone, and the other was sitting on the ground near the door, staring stupidly up into the sky. Alice went timidly up to the door, and knocked. `There's no sort of use in knocking,' said the Footman, `and that for two reasons. First, because I'm on the same side of the door as you are; secondly, because they're making such a noise inside, no one could possibly hear you.' And certainly there was a most extraordinary noise going on within--a constant howling and sneezing, and every now and then a great crash, as if a dish or kettle had been broken to pieces. `Please, then,' said Alice, `how am I to get in?' `There might be some sense in your knocking,' the Footman went on without attending to her, `if we had the door between us. For instance, if you were INSIDE, you might knock, and I could let you out, you know.' He was looking up into the sky all the time he was speaking, and this Alice thought decidedly uncivil. `But perhaps he can't help it,' she said to herself; `his eyes are so VERY nearly at the top of his head. But at any rate he might answer questions.--How am I to get in?' she repeated, aloud. `I shall sit here,' the Footman remarked, `till tomorrow--' At this moment the door of the house opened, and a large plate came skimming out, straight at the Footman's head: it just grazed his nose, and broke to pieces against one of the trees behind him. `--or next day, maybe,' the Footman continued in the same tone, exactly as if nothing had happened. `How am I to get in?' asked Alice again, in a louder tone. `ARE you to get in at all?' said the Footman. `That's the first question, you know.' It was, no doubt: only Alice did not like to be told so. `It's really dreadful,' she muttered to herself, `the way all the creatures argue. It's enough to drive one crazy!' The Footman seemed to think this a good opportunity for repeating his remark, with variations. `I shall sit here,' he said, `on and off, for days and days.' `But what am I to do?' said Alice. `Anything you like,' said the Footman, and began whistling. `Oh, there's no use in talking to him,' said Alice desperately: `he's perfectly idiotic!' And she opened the door and went in. The door led right into a large kitchen, which was full of smoke from one end to the other: the Duchess was sitting on a three-legged stool in the middle, nursing a baby; the cook was leaning over the fire, stirring a large cauldron which seemed to be full of soup. `There's certainly too much pepper in that soup!' Alice said to herself, as well as she could for sneezing. There was certainly too much of it in the air. Even the Duchess sneezed occasionally; and as for the baby, it was sneezing and howling alternately without a moment's pause. The only things in the kitchen that did not sneeze, were the cook, and a large cat which was sitting on the hearth and grinning from ear to ear. `Please would you tell me,' said Alice, a little timidly, for she was not quite sure whether it was good manners for her to speak first, `why your cat grins like that?' `It's a Cheshire cat,' said the Duchess, `and that's why. Pig!' She said the last word with such sudden violence that Alice quite jumped; but she saw in another moment that it was addressed to the baby, and not to her, so she took courage, and went on again:-- `I didn't know that Cheshire cats always grinned; in fact, I didn't know that cats COULD grin.' `They all can,' said the Duchess; `and most of 'em do.' `I don't know of any that do,' Alice said very politely, feeling quite pleased to have got into a conversation. `You don't know much,' said the Duchess; `and that's a fact.' Alice did not at all like the tone of this remark, and thought it would be as well to introduce some other subject of conversation. While she was trying to fix on one, the cook took the cauldron of soup off the fire, and at once set to work throwing everything within her reach at the Duchess and the baby --the fire-irons came first; then followed a shower of saucepans, plates, and dishes. The Duchess took no notice of them even when they hit her; and the baby was howling so much already, that it was quite impossible to say whether the blows hurt it or not. `Oh, PLEASE mind what you're doing!' cried Alice, jumping up and down in an agony of terror. `Oh, there goes his PRECIOUS nose'; as an unusually large saucepan flew close by it, and very nearly carried it off. `If everybody minded their own business,' the Duchess said in a hoarse growl, `the world would go round a deal faster than it does.' `Which would NOT be an advantage,' said Alice, who felt very glad to get an opportunity of showing off a little of her knowledge. `Just think of what work it would make with the day and night! You see the earth takes twenty-four hours to turn round on its axis--' `Talking of axes,' said the Duchess, `chop off her head!' Alice glanced rather anxiously at the cook, to see if she meant to take the hint; but the cook was busily stirring the soup, and seemed not to be listening, so she went on again: `Twenty-four hours, I THINK; or is it twelve? I--' `Oh, don't bother ME,' said the Duchess; `I never could abide figures!' And with that she began nursing her child again, singing a sort of lullaby to it as she did so, and giving it a violent shake at the end of every line: `Speak roughly to your little boy, And beat him when he sneezes: He only does it to annoy, Because he knows it teases.' CHORUS. (In which the cook and the baby joined):-- `Wow! wow! wow!' While the Duchess sang the second verse of the song, she kept tossing the baby violently up and down, and the poor little thing howled so, that Alice could hardly hear the words:-- `I speak severely to my boy, I beat him when he sneezes; For he can thoroughly enjoy The pepper when he pleases!' CHORUS. `Wow! wow! wow!' `Here! you may nurse it a bit, if you like!' the Duchess said to Alice, flinging the baby at her as she spoke. `I must go and get ready to play croquet with the Queen,' and she hurried out of the room. The cook threw a frying-pan after her as she went out, but it just missed her. Alice caught the baby with some difficulty, as it was a queer- shaped little creature, and held out its arms and legs in all directions, `just like a star-fish,' thought Alice. The poor little thing was snorting like a steam-engine when she caught it, and kept doubling itself up and straightening itself out again, so that altogether, for the first minute or two, it was as much as she could do to hold it. As soon as she had made out the proper way of nursing it, (which was to twist it up into a sort of knot, and then keep tight hold of its right ear and left foot, so as to prevent its undoing itself,) she carried it out into the open air. `IF I don't take this child away with me,' thought Alice, `they're sure to kill it in a day or two: wouldn't it be murder to leave it behind?' She said the last words out loud, and the little thing grunted in reply (it had left off sneezing by this time). `Don't grunt,' said Alice; `that's not at all a proper way of expressing yourself.' The baby grunted again, and Alice looked very anxiously into its face to see what was the matter with it. There could be no doubt that it had a VERY turn-up nose, much more like a snout than a real nose; also its eyes were getting extremely small for a baby: altogether Alice did not like the look of the thing at all. `But perhaps it was only sobbing,' she thought, and looked into its eyes again, to see if there were any tears. No, there were no tears. `If you're going to turn into a pig, my dear,' said Alice, seriously, `I'll have nothing more to do with you. Mind now!' The poor little thing sobbed again (or grunted, it was impossible to say which), and they went on for some while in silence. Alice was just beginning to think to herself, `Now, what am I to do with this creature when I get it home?' when it grunted again, so violently, that she looked down into its face in some alarm. This time there could be NO mistake about it: it was neither more nor less than a pig, and she felt that it would be quite absurd for her to carry it further. So she set the little creature down, and felt quite relieved to see it trot away quietly into the wood. `If it had grown up,' she said to herself, `it would have made a dreadfully ugly child: but it makes rather a handsome pig, I think.' And she began thinking over other children she knew, who might do very well as pigs, and was just saying to herself, `if one only knew the right way to change them--' when she was a little startled by seeing the Cheshire Cat sitting on a bough of a tree a few yards off. The Cat only grinned when it saw Alice. It looked good- natured, she thought: still it had VERY long claws and a great many teeth, so she felt that it ought to be treated with respect. `Cheshire Puss,' she began, rather timidly, as she did not at all know whether it would like the name: however, it only grinned a little wider. `Come, it's pleased so far,' thought Alice, and she went on. `Would you tell me, please, which way I ought to go from here?' `That depends a good deal on where you want to get to,' said the Cat. `I don't much care where--' said Alice. `Then it doesn't matter which way you go,' said the Cat. `--so long as I get SOMEWHERE,' Alice added as an explanation. `Oh, you're sure to do that,' said the Cat, `if you only walk long enough.' Alice felt that this could not be denied, so she tried another question. `What sort of people live about here?' `In THAT direction,' the Cat said, waving its right paw round, `lives a Hatter: and in THAT direction,' waving the other paw, `lives a March Hare. Visit either you like: they're both mad.' `But I don't want to go among mad people,' Alice remarked. `Oh, you can't help that,' said the Cat: `we're all mad here. I'm mad. You're mad.' `How do you know I'm mad?' said Alice. `You must be,' said the Cat, `or you wouldn't have come here.' Alice didn't think that proved it at all; however, she went on `And how do you know that you're mad?' `To begin with,' said the Cat, `a dog's not mad. You grant that?' `I suppose so,' said Alice. `Well, then,' the Cat went on, `you see, a dog growls when it's angry, and wags its tail when it's pleased. Now I growl when I'm pleased, and wag my tail when I'm angry. Therefore I'm mad.' `I call it purring, not growling,' said Alice. `Call it what you like,' said the Cat. `Do you play croquet with the Queen to-day?' `I should like it very much,' said Alice, `but I haven't been invited yet.' `You'll see me there,' said the Cat, and vanished. Alice was not much surprised at this, she was getting so used to queer things happening. While she was looking at the place where it had been, it suddenly appeared again. `By-the-bye, what became of the baby?' said the Cat. `I'd nearly forgotten to ask.' `It turned into a pig,' Alice quietly said, just as if it had come back in a natural way. `I thought it would,' said the Cat, and vanished again. Alice waited a little, half expecting to see it again, but it did not appear, and after a minute or two she walked on in the direction in which the March Hare was said to live. `I've seen hatters before,' she said to herself; `the March Hare will be much the most interesting, and perhaps as this is May it won't be raving mad--at least not so mad as it was in March.' As she said this, she looked up, and there was the Cat again, sitting on a branch of a tree. `Did you say pig, or fig?' said the Cat. `I said pig,' replied Alice; `and I wish you wouldn't keep appearing and vanishing so suddenly: you make one quite giddy.' `All right,' said the Cat; and this time it vanished quite slowly, beginning with the end of the tail, and ending with the grin, which remained some time after the rest of it had gone. `Well! I've often seen a cat without a grin,' thought Alice; `but a grin without a cat! It's the most curious thing I ever say in my life!' She had not gone much farther before she came in sight of the house of the March Hare: she thought it must be the right house, because the chimneys were shaped like ears and the roof was thatched with fur. It was so large a house, that she did not like to go nearer till she had nibbled some more of the lefthand bit of mushroom, and raised herself to about two feet high: even then she walked up towards it rather timidly, saying to herself `Suppose it should be raving mad after all! I almost wish I'd gone to see the Hatter instead!' CHAPTER VII A Mad Tea-Party There was a table set out under a tree in front of the house, and the March Hare and the Hatter were having tea at it: a Dormouse was sitting between them, fast asleep, and the other two were using it as a cushion, resting their elbows on it, and the talking over its head. `Very uncomfortable for the Dormouse,' thought Alice; `only, as it's asleep, I suppose it doesn't mind.' The table was a large one, but the three were all crowded together at one corner of it: `No room! No room!' they cried out when they saw Alice coming. `There's PLENTY of room!' said Alice indignantly, and she sat down in a large arm-chair at one end of the table. `Have some wine,' the March Hare said in an encouraging tone. Alice looked all round the table, but there was nothing on it but tea. `I don't see any wine,' she remarked. `There isn't any,' said the March Hare. `Then it wasn't very civil of you to offer it,' said Alice angrily. `It wasn't very civil of you to sit down without being invited,' said the March Hare. `I didn't know it was YOUR table,' said Alice; `it's laid for a great many more than three.' `Your hair wants cutting,' said the Hatter. He had been looking at Alice for some time with great curiosity, and this was his first speech. `You should learn not to make personal remarks,' Alice said with some severity; `it's very rude.' The Hatter opened his eyes very wide on hearing this; but all he SAID was, `Why is a raven like a writing-desk?' `Come, we shall have some fun now!' thought Alice. `I'm glad they've begun asking riddles.--I believe I can guess that,' she added aloud. `Do you mean that you think you can find out the answer to it?' said the March Hare. `Exactly so,' said Alice. `Then you should say what you mean,' the March Hare went on. `I do,' Alice hastily replied; `at least--at least I mean what I say--that's the same thing, you know.' `Not the same thing a bit!' said the Hatter. `You might just as well say that "I see what I eat" is the same thing as "I eat what I see"!' `You might just as well say,' added the March Hare, `that "I like what I get" is the same thing as "I get what I like"!' `You might just as well say,' added the Dormouse, who seemed to be talking in his sleep, `that "I breathe when I sleep" is the same thing as "I sleep when I breathe"!' `It IS the same thing with you,' said the Hatter, and here the conversation dropped, and the party sat silent for a minute, while Alice thought over all she could remember about ravens and writing-desks, which wasn't much. The Hatter was the first to break the silence. `What day of the month is it?' he said, turning to Alice: he had taken his watch out of his pocket, and was looking at it uneasily, shaking it every now and then, and holding it to his ear. Alice considered a little, and then said `The fourth.' `Two days wrong!' sighed the Hatter. `I told you butter wouldn't suit the works!' he added looking angrily at the March Hare. `It was the BEST butter,' the March Hare meekly replied. `Yes, but some crumbs must have got in as well,' the Hatter grumbled: `you shouldn't have put it in with the bread-knife.' The March Hare took the watch and looked at it gloomily: then he dipped it into his cup of tea, and looked at it again: but he could think of nothing better to say than his first remark, `It was the BEST butter, you know.' Alice had been looking over his shoulder with some curiosity. `What a funny watch!' she remarked. `It tells the day of the month, and doesn't tell what o'clock it is!' `Why should it?' muttered the Hatter. `Does YOUR watch tell you what year it is?' `Of course not,' Alice replied very readily: `but that's because it stays the same year for such a long time together.' `Which is just the case with MINE,' said the Hatter. Alice felt dreadfully puzzled. The Hatter's remark seemed to have no sort of meaning in it, and yet it was certainly English. `I don't quite understand you,' she said, as politely as she could. `The Dormouse is asleep again,' said the Hatter, and he poured a little hot tea upon its nose. The Dormouse shook its head impatiently, and said, without opening its eyes, `Of course, of course; just what I was going to remark myself.' `Have you guessed the riddle yet?' the Hatter said, turning to Alice again. `No, I give it up,' Alice replied: `what's the answer?' `I haven't the slightest idea,' said the Hatter. `Nor I,' said the March Hare. Alice sighed wearily. `I think you might do something better with the time,' she said, `than waste it in asking riddles that have no answers.' `If you knew Time as well as I do,' said the Hatter, `you wouldn't talk about wasting IT. It's HIM.' `I don't know what you mean,' said Alice. `Of course you don't!' the Hatter said, tossing his head contemptuously. `I dare say you never even spoke to Time!' `Perhaps not,' Alice cautiously replied: `but I know I have to beat time when I learn music.' `Ah! that accounts for it,' said the Hatter. `He won't stand beating. Now, if you only kept on good terms with him, he'd do almost anything you liked with the clock. For instance, suppose it were nine o'clock in the morning, just time to begin lessons: you'd only have to whisper a hint to Time, and round goes the clock in a twinkling! Half-past one, time for dinner!' (`I only wish it was,' the March Hare said to itself in a whisper.) `That would be grand, certainly,' said Alice thoughtfully: `but then--I shouldn't be hungry for it, you know.' `Not at first, perhaps,' said the Hatter: `but you could keep it to half-past one as long as you liked.' `Is that the way YOU manage?' Alice asked. The Hatter shook his head mournfully. `Not I!' he replied. `We quarrelled last March--just before HE went mad, you know--' (pointing with his tea spoon at the March Hare,) `--it was at the great concert given by the Queen of Hearts, and I had to sing "Twinkle, twinkle, little bat! How I wonder what you're at!" You know the song, perhaps?' `I've heard something like it,' said Alice. `It goes on, you know,' the Hatter continued, `in this way:-- "Up above the world you fly, Like a tea-tray in the sky. Twinkle, twinkle--"' Here the Dormouse shook itself, and began singing in its sleep `Twinkle, twinkle, twinkle, twinkle--' and went on so long that they had to pinch it to make it stop. `Well, I'd hardly finished the first verse,' said the Hatter, `when the Queen jumped up and bawled out, "He's murdering the time! Off with his head!"' `How dreadfully savage!' exclaimed Alice. `And ever since that,' the Hatter went on in a mournful tone, `he won't do a thing I ask! It's always six o'clock now.' A bright idea came into Alice's head. `Is that the reason so many tea-things are put out here?' she asked. `Yes, that's it,' said the Hatter with a sigh: `it's always tea-time, and we've no time to wash the things between whiles.' `Then you keep moving round, I suppose?' said Alice. `Exactly so,' said the Hatter: `as the things get used up.' `But what happens when you come to the beginning again?' Alice ventured to ask. `Suppose we change the subject,' the March Hare interrupted, yawning. `I'm getting tired of this. I vote the young lady tells us a story.' `I'm afraid I don't know one,' said Alice, rather alarmed at the proposal. `Then the Dormouse shall!' they both cried. `Wake up, Dormouse!' And they pinched it on both sides at once. The Dormouse slowly opened his eyes. `I wasn't asleep,' he said in a hoarse, feeble voice: `I heard every word you fellows were saying.' `Tell us a story!' said the March Hare. `Yes, please do!' pleaded Alice. `And be quick about it,' added the Hatter, `or you'll be asleep again before it's done.' `Once upon a time there were three little sisters,' the Dormouse began in a great hurry; `and their names were Elsie, Lacie, and Tillie; and they lived at the bottom of a well--' `What did they live on?' said Alice, who always took a great interest in questions of eating and drinking. `They lived on treacle,' said the Dormouse, after thinking a minute or two. `They couldn't have done that, you know,' Alice gently remarked; `they'd have been ill.' `So they were,' said the Dormouse; `VERY ill.' Alice tried to fancy to herself what such an extraordinary ways of living would be like, but it puzzled her too much, so she went on: `But why did they live at the bottom of a well?' `Take some more tea,' the March Hare said to Alice, very earnestly. `I've had nothing yet,' Alice replied in an offended tone, `so I can't take more.' `You mean you can't take LESS,' said the Hatter: `it's very easy to take MORE than nothing.' `Nobody asked YOUR opinion,' said Alice. `Who's making personal remarks now?' the Hatter asked triumphantly. Alice did not quite know what to say to this: so she helped herself to some tea and bread-and-butter, and then turned to the Dormouse, and repeated her question. `Why did they live at the bottom of a well?' The Dormouse again took a minute or two to think about it, and then said, `It was a treacle-well.' `There's no such thing!' Alice was beginning very angrily, but the Hatter and the March Hare went `Sh! sh!' and the Dormouse sulkily remarked, `If you can't be civil, you'd better finish the story for yourself.' `No, please go on!' Alice said very humbly; `I won't interrupt again. I dare say there may be ONE.' `One, indeed!' said the Dormouse indignantly. However, he consented to go on. `And so these three little sisters--they were learning to draw, you know--' `What did they draw?' said Alice, quite forgetting her promise. `Treacle,' said the Dormouse, without considering at all this time. `I want a clean cup,' interrupted the Hatter: `let's all move one place on.' He moved on as he spoke, and the Dormouse followed him: the March Hare moved into the Dormouse's place, and Alice rather unwillingly took the place of the March Hare. The Hatter was the only one who got any advantage from the change: and Alice was a good deal worse off than before, as the March Hare had just upset the milk-jug into his plate. Alice did not wish to offend the Dormouse again, so she began very cautiously: `But I don't understand. Where did they draw the treacle from?' `You can draw water out of a water-well,' said the Hatter; `so I should think you could draw treacle out of a treacle-well--eh, stupid?' `But they were IN the well,' Alice said to the Dormouse, not choosing to notice this last remark. `Of course they were', said the Dormouse; `--well in.' This answer so confused poor Alice, that she let the Dormouse go on for some time without interrupting it. `They were learning to draw,' the Dormouse went on, yawning and rubbing its eyes, for it was getting very sleepy; `and they drew all manner of things--everything that begins with an M--' `Why with an M?' said Alice. `Why not?' said the March Hare. Alice was silent. The Dormouse had closed its eyes by this time, and was going off into a doze; but, on being pinched by the Hatter, it woke up again with a little shriek, and went on: `--that begins with an M, such as mouse-traps, and the moon, and memory, and muchness-- you know you say things are "much of a muchness"--did you ever see such a thing as a drawing of a muchness?' `Really, now you ask me,' said Alice, very much confused, `I don't think--' `Then you shouldn't talk,' said the Hatter. This piece of rudeness was more than Alice could bear: she got up in great disgust, and walked off; the Dormouse fell asleep instantly, and neither of the others took the least notice of her going, though she looked back once or twice, half hoping that they would call after her: the last time she saw them, they were trying to put the Dormouse into the teapot. `At any rate I'll never go THERE again!' said Alice as she picked her way through the wood. `It's the stupidest tea-party I ever was at in all my life!' Just as she said this, she noticed that one of the trees had a door leading right into it. `That's very curious!' she thought. `But everything's curious today. I think I may as well go in at once.' And in she went. Once more she found herself in the long hall, and close to the little glass table. `Now, I'll manage better this time,' she said to herself, and began by taking the little golden key, and unlocking the door that led into the garden. Then she went to work nibbling at the mushroom (she had kept a piece of it in her pocked) till she was about a foot high: then she walked down the little passage: and THEN--she found herself at last in the beautiful garden, among the bright flower-beds and the cool fountains. CHAPTER VIII The Queen's Croquet-Ground A large rose-tree stood near the entrance of the garden: the roses growing on it were white, but there were three gardeners at it, busily painting them red. Alice thought this a very curious thing, and she went nearer to watch them, and just as she came up to them she heard one of them say, `Look out now, Five! Don't go splashing paint over me like that!' `I couldn't help it,' said Five, in a sulky tone; `Seven jogged my elbow.' On which Seven looked up and said, `That's right, Five! Always lay the blame on others!' `YOU'D better not talk!' said Five. `I heard the Queen say only yesterday you deserved to be beheaded!' `What for?' said the one who had spoken first. `That's none of YOUR business, Two!' said Seven. `Yes, it IS his business!' said Five, `and I'll tell him--it was for bringing the cook tulip-roots instead of onions.' Seven flung down his brush, and had just begun `Well, of all the unjust things--' when his eye chanced to fall upon Alice, as she stood watching them, and he checked himself suddenly: the others looked round also, and all of them bowed low. `Would you tell me,' said Alice, a little timidly, `why you are painting those roses?' Five and Seven said nothing, but looked at Two. Two began in a low voice, `Why the fact is, you see, Miss, this here ought to have been a RED rose-tree, and we put a white one in by mistake; and if the Queen was to find it out, we should all have our heads cut off, you know. So you see, Miss, we're doing our best, afore she comes, to--' At this moment Five, who had been anxiously looking across the garden, called out `The Queen! The Queen!' and the three gardeners instantly threw themselves flat upon their faces. There was a sound of many footsteps, and Alice looked round, eager to see the Queen. First came ten soldiers carrying clubs; these were all shaped like the three gardeners, oblong and flat, with their hands and feet at the corners: next the ten courtiers; these were ornamented all over with diamonds, and walked two and two, as the soldiers did. After these came the royal children; there were ten of them, and the little dears came jumping merrily along hand in hand, in couples: they were all ornamented with hearts. Next came the guests, mostly Kings and Queens, and among them Alice recognised the White Rabbit: it was talking in a hurried nervous manner, smiling at everything that was said, and went by without noticing her. Then followed the Knave of Hearts, carrying the King's crown on a crimson velvet cushion; and, last of all this grand procession, came THE KING AND QUEEN OF HEARTS. Alice was rather doubtful whether she ought not to lie down on her face like the three gardeners, but she could not remember every having heard of such a rule at processions; `and besides, what would be the use of a procession,' thought she, `if people had all to lie down upon their faces, so that they couldn't see it?' So she stood still where she was, and waited. When the procession came opposite to Alice, they all stopped and looked at her, and the Queen said severely `Who is this?' She said it to the Knave of Hearts, who only bowed and smiled in reply. `Idiot!' said the Queen, tossing her head impatiently; and, turning to Alice, she went on, `What's your name, child?' `My name is Alice, so please your Majesty,' said Alice very politely; but she added, to herself, `Why, they're only a pack of cards, after all. I needn't be afraid of them!' `And who are THESE?' said the Queen, pointing to the three gardeners who were lying round the rosetree; for, you see, as they were lying on their faces, and the pattern on their backs was the same as the rest of the pack, she could not tell whether they were gardeners, or soldiers, or courtiers, or three of her own children. `How should I know?' said Alice, surprised at her own courage. `It's no business of MINE.' The Queen turned crimson with fury, and, after glaring at her for a moment like a wild beast, screamed `Off with her head! Off--' `Nonsense!' said Alice, very loudly and decidedly, and the Queen was silent. The King laid his hand upon her arm, and timidly said `Consider, my dear: she is only a child!' The Queen turned angrily away from him, and said to the Knave `Turn them over!' The Knave did so, very carefully, with one foot. `Get up!' said the Queen, in a shrill, loud voice, and the three gardeners instantly jumped up, and began bowing to the King, the Queen, the royal children, and everybody else. `Leave off that!' screamed the Queen. `You make me giddy.' And then, turning to the rose-tree, she went on, `What HAVE you been doing here?' `May it please your Majesty,' said Two, in a very humble tone, going down on one knee as he spoke, `we were trying--' `I see!' said the Queen, who had meanwhile been examining the roses. `Off with their heads!' and the procession moved on, three of the soldiers remaining behind to execute the unfortunate gardeners, who ran to Alice for protection. `You shan't be beheaded!' said Alice, and she put them into a large flower-pot that stood near. The three soldiers wandered about for a minute or two, looking for them, and then quietly marched off after the others. `Are their heads off?' shouted the Queen. `Their heads are gone, if it please your Majesty!' the soldiers shouted in reply. `That's right!' shouted the Queen. `Can you play croquet?' The soldiers were silent, and looked at Alice, as the question was evidently meant for her. `Yes!' shouted Alice. `Come on, then!' roared the Queen, and Alice joined the procession, wondering very much what would happen next. `It's--it's a very fine day!' said a timid voice at her side. She was walking by the White Rabbit, who was peeping anxiously into her face. `Very,' said Alice: `--where's the Duchess?' `Hush! Hush!' said the Rabbit in a low, hurried tone. He looked anxiously over his shoulder as he spoke, and then raised himself upon tiptoe, put his mouth close to her ear, and whispered `She's under sentence of execution.' `What for?' said Alice. `Did you say "What a pity!"?' the Rabbit asked. `No, I didn't,' said Alice: `I don't think it's at all a pity. I said "What for?"' `She boxed the Queen's ears--' the Rabbit began. Alice gave a little scream of laughter. `Oh, hush!' the Rabbit whispered in a frightened tone. `The Queen will hear you! You see, she came rather late, and the Queen said--' `Get to your places!' shouted the Queen in a voice of thunder, and people began running about in all directions, tumbling up against each other; however, they got settled down in a minute or two, and the game began. Alice thought she had never seen such a curious croquet-ground in her life; it was all ridges and furrows; the balls were live hedgehogs, the mallets live flamingoes, and the soldiers had to double themselves up and to stand on their hands and feet, to make the arches. The chief difficulty Alice found at first was in managing her flamingo: she succeeded in getting its body tucked away, comfortably enough, under her arm, with its legs hanging down, but generally, just as she had got its neck nicely straightened out, and was going to give the hedgehog a blow with its head, it WOULD twist itself round and look up in her face, with such a puzzled expression that she could not help bursting out laughing: and when she had got its head down, and was going to begin again, it was very provoking to find that the hedgehog had unrolled itself, and was in the act of crawling away: besides all this, there was generally a ridge or furrow in the way wherever she wanted to send the hedgehog to, and, as the doubled-up soldiers were always getting up and walking off to other parts of the ground, Alice soon came to the conclusion that it was a very difficult game indeed. The players all played at once without waiting for turns, quarrelling all the while, and fighting for the hedgehogs; and in a very short time the Queen was in a furious passion, and went stamping about, and shouting `Off with his head!' or `Off with her head!' about once in a minute. Alice began to feel very uneasy: to be sure, she had not as yet had any dispute with the Queen, but she knew that it might happen any minute, `and then,' thought she, `what would become of me? They're dreadfully fond of beheading people here; the great wonder is, that there's any one left alive!' She was looking about for some way of escape, and wondering whether she could get away without being seen, when she noticed a curious appearance in the air: it puzzled her very much at first, but, after watching it a minute or two, she made it out to be a grin, and she said to herself `It's the Cheshire Cat: now I shall have somebody to talk to.' `How are you getting on?' said the Cat, as soon as there was mouth enough for it to speak with. Alice waited till the eyes appeared, and then nodded. `It's no use speaking to it,' she thought, `till its ears have come, or at least one of them.' In another minute the whole head appeared, and then Alice put down her flamingo, and began an account of the game, feeling very glad she had someone to listen to her. The Cat seemed to think that there was enough of it now in sight, and no more of it appeared. `I don't think they play at all fairly,' Alice began, in rather a complaining tone, `and they all quarrel so dreadfully one can't hear oneself speak--and they don't seem to have any rules in particular; at least, if there are, nobody attends to them--and you've no idea how confusing it is all the things being alive; for instance, there's the arch I've got to go through next walking about at the other end of the ground--and I should have croqueted the Queen's hedgehog just now, only it ran away when it saw mine coming!' `How do you like the Queen?' said the Cat in a low voice. `Not at all,' said Alice: `she's so extremely--' Just then she noticed that the Queen was close behind her, listening: so she went on, `--likely to win, that it's hardly worth while finishing the game.' The Queen smiled and passed on. `Who ARE you talking to?' said the King, going up to Alice, and looking at the Cat's head with great curiosity. `It's a friend of mine--a Cheshire Cat,' said Alice: `allow me to introduce it.' `I don't like the look of it at all,' said the King: `however, it may kiss my hand if it likes.' `I'd rather not,' the Cat remarked. `Don't be impertinent,' said the King, `and don't look at me like that!' He got behind Alice as he spoke. `A cat may look at a king,' said Alice. `I've read that in some book, but I don't remember where.' `Well, it must be removed,' said the King very decidedly, and he called the Queen, who was passing at the moment, `My dear! I wish you would have this cat removed!' The Queen had only one way of settling all difficulties, great or small. `Off with his head!' she said, without even looking round. `I'll fetch the executioner myself,' said the King eagerly, and he hurried off. Alice thought she might as well go back, and see how the game was going on, as she heard the Queen's voice in the distance, screaming with passion. She had already heard her sentence three of the players to be executed for having missed their turns, and she did not like the look of things at all, as the game was in such confusion that she never knew whether it was her turn or not. So she went in search of her hedgehog. The hedgehog was engaged in a fight with another hedgehog, which seemed to Alice an excellent opportunity for croqueting one of them with the other: the only difficulty was, that her flamingo was gone across to the other side of the garden, where Alice could see it trying in a helpless sort of way to fly up into a tree. By the time she had caught the flamingo and brought it back, the fight was over, and both the hedgehogs were out of sight: `but it doesn't matter much,' thought Alice, `as all the arches are gone from this side of the ground.' So she tucked it away under her arm, that it might not escape again, and went back for a little more conversation with her friend. When she got back to the Cheshire Cat, she was surprised to find quite a large crowd collected round it: there was a dispute going on between the executioner, the King, and the Queen, who were all talking at once, while all the rest were quite silent, and looked very uncomfortable. The moment Alice appeared, she was appealed to by all three to settle the question, and they repeated their arguments to her, though, as they all spoke at once, she found it very hard indeed to make out exactly what they said. The executioner's argument was, that you couldn't cut off a head unless there was a body to cut it off from: that he had never had to do such a thing before, and he wasn't going to begin at HIS time of life. The King's argument was, that anything that had a head could be beheaded, and that you weren't to talk nonsense. The Queen's argument was, that if something wasn't done about it in less than no time she'd have everybody executed, all round. (It was this last remark that had made the whole party look so grave and anxious.) Alice could think of nothing else to say but `It belongs to the Duchess: you'd better ask HER about it.' `She's in prison,' the Queen said to the executioner: `fetch her here.' And the executioner went off like an arrow. The Cat's head began fading away the moment he was gone, and, by the time he had come back with the Dutchess, it had entirely disappeared; so the King and the executioner ran wildly up and down looking for it, while the rest of the party went back to the game. CHAPTER IX The Mock Turtle's Story `You can't think how glad I am to see you again, you dear old thing!' said the Duchess, as she tucked her arm affectionately into Alice's, and they walked off together. Alice was very glad to find her in such a pleasant temper, and thought to herself that perhaps it was only the pepper that had made her so savage when they met in the kitchen. `When I'M a Duchess,' she said to herself, (not in a very hopeful tone though), `I won't have any pepper in my kitchen AT ALL. Soup does very well without--Maybe it's always pepper that makes people hot-tempered,' she went on, very much pleased at having found out a new kind of rule, `and vinegar that makes them sour--and camomile that makes them bitter--and--and barley-sugar and such things that make children sweet-tempered. I only wish people knew that: then they wouldn't be so stingy about it, you know--' She had quite forgotten the Duchess by this time, and was a little startled when she heard her voice close to her ear. `You're thinking about something, my dear, and that makes you forget to talk. I can't tell you just now what the moral of that is, but I shall remember it in a bit.' `Perhaps it hasn't one,' Alice ventured to remark. `Tut, tut, child!' said the Duchess. `Everything's got a moral, if only you can find it.' And she squeezed herself up closer to Alice's side as she spoke. Alice did not much like keeping so close to her: first, because the Duchess was VERY ugly; and secondly, because she was exactly the right height to rest her chin upon Alice's shoulder, and it was an uncomfortably sharp chin. However, she did not like to be rude, so she bore it as well as she could. `The game's going on rather better now,' she said, by way of keeping up the conversation a little. `'Tis so,' said the Duchess: `and the moral of that is--"Oh, 'tis love, 'tis love, that makes the world go round!"' `Somebody said,' Alice whispered, `that it's done by everybody minding their own business!' `Ah, well! It means much the same thing,' said the Duchess, digging her sharp little chin into Alice's shoulder as she added, `and the moral of THAT is--"Take care of the sense, and the sounds will take care of themselves."' `How fond she is of finding morals in things!' Alice thought to herself. `I dare say you're wondering why I don't put my arm round your waist,' the Duchess said after a pause: `the reason is, that I'm doubtful about the temper of your flamingo. Shall I try the experiment?' `HE might bite,' Alice cautiously replied, not feeling at all anxious to have the experiment tried. `Very true,' said the Duchess: `flamingoes and mustard both bite. And the moral of that is--"Birds of a feather flock together."' `Only mustard isn't a bird,' Alice remarked. `Right, as usual,' said the Duchess: `what a clear way you have of putting things!' `It's a mineral, I THINK,' said Alice. `Of course it is,' said the Duchess, who seemed ready to agree to everything that Alice said; `there's a large mustard-mine near here. And the moral of that is--"The more there is of mine, the less there is of yours."' `Oh, I know!' exclaimed Alice, who had not attended to this last remark, `it's a vegetable. It doesn't look like one, but it is.' `I quite agree with you,' said the Duchess; `and the moral of that is--"Be what you would seem to be"--or if you'd like it put more simply--"Never imagine yourself not to be otherwise than what it might appear to others that what you were or might have been was not otherwise than what you had been would have appeared to them to be otherwise."' `I think I should understand that better,' Alice said very politely, `if I had it written down: but I can't quite follow it as you say it.' `That's nothing to what I could say if I chose,' the Duchess replied, in a pleased tone. `Pray don't trouble yourself to say it any longer than that,' said Alice. `Oh, don't talk about trouble!' said the Duchess. `I make you a present of everything I've said as yet.' `A cheap sort of present!' thought Alice. `I'm glad they don't give birthday presents like that!' But she did not venture to say it out loud. `Thinking again?' the Duchess asked, with another dig of her sharp little chin. `I've a right to think,' said Alice sharply, for she was beginning to feel a little worried. `Just about as much right,' said the Duchess, `as pigs have to fly; and the m--' But here, to Alice's great surprise, the Duchess's voice died away, even in the middle of her favourite word `moral,' and the arm that was linked into hers began to tremble. Alice looked up, and there stood the Queen in front of them, with her arms folded, frowning like a thunderstorm. `A fine day, your Majesty!' the Duchess began in a low, weak voice. `Now, I give you fair warning,' shouted the Queen, stamping on the ground as she spoke; `either you or your head must be off, and that in about half no time! Take your choice!' The Duchess took her choice, and was gone in a moment. `Let's go on with the game,' the Queen said to Alice; and Alice was too much frightened to say a word, but slowly followed her back to the croquet-ground. The other guests had taken advantage of the Queen's absence, and were resting in the shade: however, the moment they saw her, they hurried back to the game, the Queen merely remarking that a moment's delay would cost them their lives. All the time they were playing the Queen never left off quarrelling with the other players, and shouting `Off with his head!' or `Off with her head!' Those whom she sentenced were taken into custody by the soldiers, who of course had to leave off being arches to do this, so that by the end of half an hour or so there were no arches left, and all the players, except the King, the Queen, and Alice, were in custody and under sentence of execution. Then the Queen left off, quite out of breath, and said to Alice, `Have you seen the Mock Turtle yet?' `No,' said Alice. `I don't even know what a Mock Turtle is.' `It's the thing Mock Turtle Soup is made from,' said the Queen. `I never saw one, or heard of one,' said Alice. `Come on, then,' said the Queen, `and he shall tell you his history,' As they walked off together, Alice heard the King say in a low voice, to the company generally, `You are all pardoned.' `Come, THAT'S a good thing!' she said to herself, for she had felt quite unhappy at the number of executions the Queen had ordered. They very soon came upon a Gryphon, lying fast asleep in the sun. (IF you don't know what a Gryphon is, look at the picture.) `Up, lazy thing!' said the Queen, `and take this young lady to see the Mock Turtle, and to hear his history. I must go back and see after some executions I have ordered'; and she walked off, leaving Alice alone with the Gryphon. Alice did not quite like the look of the creature, but on the whole she thought it would be quite as safe to stay with it as to go after that savage Queen: so she waited. The Gryphon sat up and rubbed its eyes: then it watched the Queen till she was out of sight: then it chuckled. `What fun!' said the Gryphon, half to itself, half to Alice. `What IS the fun?' said Alice. `Why, SHE,' said the Gryphon. `It's all her fancy, that: they never executes nobody, you know. Come on!' `Everybody says "come on!" here,' thought Alice, as she went slowly after it: `I never was so ordered about in all my life, never!' They had not gone far before they saw the Mock Turtle in the distance, sitting sad and lonely on a little ledge of rock, and, as they came nearer, Alice could hear him sighing as if his heart would break. She pitied him deeply. `What is his sorrow?' she asked the Gryphon, and the Gryphon answered, very nearly in the same words as before, `It's all his fancy, that: he hasn't got no sorrow, you know. Come on!' So they went up to the Mock Turtle, who looked at them with large eyes full of tears, but said nothing. `This here young lady,' said the Gryphon, `she wants for to know your history, she do.' `I'll tell it her,' said the Mock Turtle in a deep, hollow tone: `sit down, both of you, and don't speak a word till I've finished.' So they sat down, and nobody spoke for some minutes. Alice thought to herself, `I don't see how he can EVEN finish, if he doesn't begin.' But she waited patiently. `Once,' said the Mock Turtle at last, with a deep sigh, `I was a real Turtle.' These words were followed by a very long silence, broken only by an occasional exclamation of `Hjckrrh!' from the Gryphon, and the constant heavy sobbing of the Mock Turtle. Alice was very nearly getting up and saying, `Thank you, sir, for your interesting story,' but she could not help thinking there MUST be more to come, so she sat still and said nothing. `When we were little,' the Mock Turtle went on at last, more calmly, though still sobbing a little now and then, `we went to school in the sea. The master was an old Turtle--we used to call him Tortoise--' `Why did you call him Tortoise, if he wasn't one?' Alice asked. `We called him Tortoise because he taught us,' said the Mock Turtle angrily: `really you are very dull!' `You ought to be ashamed of yourself for asking such a simple question,' added the Gryphon; and then they both sat silent and looked at poor Alice, who felt ready to sink into the earth. At last the Gryphon said to the Mock Turtle, `Drive on, old fellow! Don't be all day about it!' and he went on in these words: `Yes, we went to school in the sea, though you mayn't believe it--' `I never said I didn't!' interrupted Alice. `You did,' said the Mock Turtle. `Hold your tongue!' added the Gryphon, before Alice could speak again. The Mock Turtle went on. `We had the best of educations--in fact, we went to school every day--' `I'VE been to a day-school, too,' said Alice; `you needn't be so proud as all that.' `With extras?' asked the Mock Turtle a little anxiously. `Yes,' said Alice, `we learned French and music.' `And washing?' said the Mock Turtle. `Certainly not!' said Alice indignantly. `Ah! then yours wasn't a really good school,' said the Mock Turtle in a tone of great relief. `Now at OURS they had at the end of the bill, "French, music, AND WASHING--extra."' `You couldn't have wanted it much,' said Alice; `living at the bottom of the sea.' `I couldn't afford to learn it.' said the Mock Turtle with a sigh. `I only took the regular course.' `What was that?' inquired Alice. `Reeling and Writhing, of course, to begin with,' the Mock Turtle replied; `and then the different branches of Arithmetic-- Ambition, Distraction, Uglification, and Derision.' `I never heard of "Uglification,"' Alice ventured to say. `What is it?' The Gryphon lifted up both its paws in surprise. `What! Never heard of uglifying!' it exclaimed. `You know what to beautify is, I suppose?' `Yes,' said Alice doubtfully: `it means--to--make--anything-- prettier.' `Well, then,' the Gryphon went on, `if you don't know what to uglify is, you ARE a simpleton.' Alice did not feel encouraged to ask any more questions about it, so she turned to the Mock Turtle, and said `What else had you to learn?' `Well, there was Mystery,' the Mock Turtle replied, counting off the subjects on his flappers, `--Mystery, ancient and modern, with Seaography: then Drawling--the Drawling-master was an old conger-eel, that used to come once a week: HE taught us Drawling, Stretching, and Fainting in Coils.' `What was THAT like?' said Alice. `Well, I can't show it you myself,' the Mock Turtle said: `I'm too stiff. And the Gryphon never learnt it.' `Hadn't time,' said the Gryphon: `I went to the Classics master, though. He was an old crab, HE was.' `I never went to him,' the Mock Turtle said with a sigh: `he taught Laughing and Grief, they used to say.' `So he did, so he did,' said the Gryphon, sighing in his turn; and both creatures hid their faces in their paws. `And how many hours a day did you do lessons?' said Alice, in a hurry to change the subject. `Ten hours the first day,' said the Mock Turtle: `nine the next, and so on.' `What a curious plan!' exclaimed Alice. `That's the reason they're called lessons,' the Gryphon remarked: `because they lessen from day to day.' This was quite a new idea to Alice, and she thought it over a little before she made her next remark. `Then the eleventh day must have been a holiday?' `Of course it was,' said the Mock Turtle. `And how did you manage on the twelfth?' Alice went on eagerly. `That's enough about lessons,' the Gryphon interrupted in a very decided tone: `tell her something about the games now.' CHAPTER X The Lobster Quadrille The Mock Turtle sighed deeply, and drew the back of one flapper across his eyes. He looked at Alice, and tried to speak, but for a minute or two sobs choked his voice. `Same as if he had a bone in his throat,' said the Gryphon: and it set to work shaking him and punching him in the back. At last the Mock Turtle recovered his voice, and, with tears running down his cheeks, he went on again:-- `You may not have lived much under the sea--' (`I haven't,' said Alice)--`and perhaps you were never even introduced to a lobster--' (Alice began to say `I once tasted--' but checked herself hastily, and said `No, never') `--so you can have no idea what a delightful thing a Lobster Quadrille is!' `No, indeed,' said Alice. `What sort of a dance is it?' `Why,' said the Gryphon, `you first form into a line along the sea-shore--' `Two lines!' cried the Mock Turtle. `Seals, turtles, salmon, and so on; then, when you've cleared all the jelly-fish out of the way--' `THAT generally takes some time,' interrupted the Gryphon. `--you advance twice--' `Each with a lobster as a partner!' cried the Gryphon. `Of course,' the Mock Turtle said: `advance twice, set to partners--' `--change lobsters, and retire in same order,' continued the Gryphon. `Then, you know,' the Mock Turtle went on, `you throw the--' `The lobsters!' shouted the Gryphon, with a bound into the air. `--as far out to sea as you can--' `Swim after them!' screamed the Gryphon. `Turn a somersault in the sea!' cried the Mock Turtle, capering wildly about. `Back to land again, and that's all the first figure,' said the Mock Turtle, suddenly dropping his voice; and the two creatures, who had been jumping about like mad things all this time, sat down again very sadly and quietly, and looked at Alice. `It must be a very pretty dance,' said Alice timidly. `Would you like to see a little of it?' said the Mock Turtle. `Very much indeed,' said Alice. `Come, let's try the first figure!' said the Mock Turtle to the Gryphon. `We can do without lobsters, you know. Which shall sing?' `Oh, YOU sing,' said the Gryphon. `I've forgotten the words.' So they began solemnly dancing round and round Alice, every now and then treading on her toes when they passed too close, and waving their forepaws to mark the time, while the Mock Turtle sang this, very slowly and sadly:-- `"Will you walk a little faster?" said a whiting to a snail. "There's a porpoise close behind us, and he's treading on my tail. See how eagerly the lobsters and the turtles all advance! They are waiting on the shingle--will you come and join the dance? Will you, won't you, will you, won't you, will you join the dance? Will you, won't you, will you, won't you, won't you join the dance? "You can really have no notion how delightful it will be When they take us up and throw us, with the lobsters, out to sea!" But the snail replied "Too far, too far!" and gave a look askance-- Said he thanked the whiting kindly, but he would not join the dance. Would not, could not, would not, could not, would not join the dance. Would not, could not, would not, could not, could not join the dance. `"What matters it how far we go?" his scaly friend replied. "There is another shore, you know, upon the other side. The further off from England the nearer is to France-- Then turn not pale, beloved snail, but come and join the dance. Will you, won't you, will you, won't you, will you join the dance? Will you, won't you, will you, won't you, won't you join the dance?"' `Thank you, it's a very interesting dance to watch,' said Alice, feeling very glad that it was over at last: `and I do so like that curious song about the whiting!' `Oh, as to the whiting,' said the Mock Turtle, `they--you've seen them, of course?' `Yes,' said Alice, `I've often seen them at dinn--' she checked herself hastily. `I don't know where Dinn may be,' said the Mock Turtle, `but if you've seen them so often, of course you know what they're like.' `I believe so,' Alice replied thoughtfully. `They have their tails in their mouths--and they're all over crumbs.' `You're wrong about the crumbs,' said the Mock Turtle: `crumbs would all wash off in the sea. But they HAVE their tails in their mouths; and the reason is--' here the Mock Turtle yawned and shut his eyes.--`Tell her about the reason and all that,' he said to the Gryphon. `The reason is,' said the Gryphon, `that they WOULD go with the lobsters to the dance. So they got thrown out to sea. So they had to fall a long way. So they got their tails fast in their mouths. So they couldn't get them out again. That's all.' `Thank you,' said Alice, `it's very interesting. I never knew so much about a whiting before.' `I can tell you more than that, if you like,' said the Gryphon. `Do you know why it's called a whiting?' `I never thought about it,' said Alice. `Why?' `IT DOES THE BOOTS AND SHOES.' the Gryphon replied very solemnly. Alice was thoroughly puzzled. `Does the boots and shoes!' she repeated in a wondering tone. `Why, what are YOUR shoes done with?' said the Gryphon. `I mean, what makes them so shiny?' Alice looked down at them, and considered a little before she gave her answer. `They're done with blacking, I believe.' `Boots and shoes under the sea,' the Gryphon went on in a deep voice, `are done with a whiting. Now you know.' `And what are they made of?' Alice asked in a tone of great curiosity. `Soles and eels, of course,' the Gryphon replied rather impatiently: `any shrimp could have told you that.' `If I'd been the whiting,' said Alice, whose thoughts were still running on the song, `I'd have said to the porpoise, "Keep back, please: we don't want YOU with us!"' `They were obliged to have him with them,' the Mock Turtle said: `no wise fish would go anywhere without a porpoise.' `Wouldn't it really?' said Alice in a tone of great surprise. `Of course not,' said the Mock Turtle: `why, if a fish came to ME, and told me he was going a journey, I should say "With what porpoise?"' `Don't you mean "purpose"?' said Alice. `I mean what I say,' the Mock Turtle replied in an offended tone. And the Gryphon added `Come, let's hear some of YOUR adventures.' `I could tell you my adventures--beginning from this morning,' said Alice a little timidly: `but it's no use going back to yesterday, because I was a different person then.' `Explain all that,' said the Mock Turtle. `No, no! The adventures first,' said the Gryphon in an impatient tone: `explanations take such a dreadful time.' So Alice began telling them her adventures from the time when she first saw the White Rabbit. She was a little nervous about it just at first, the two creatures got so close to her, one on each side, and opened their eyes and mouths so VERY wide, but she gained courage as she went on. Her listeners were perfectly quiet till she got to the part about her repeating `YOU ARE OLD, FATHER WILLIAM,' to the Caterpillar, and the words all coming different, and then the Mock Turtle drew a long breath, and said `That's very curious.' `It's all about as curious as it can be,' said the Gryphon. `It all came different!' the Mock Turtle repeated thoughtfully. `I should like to hear her try and repeat something now. Tell her to begin.' He looked at the Gryphon as if he thought it had some kind of authority over Alice. `Stand up and repeat "'TIS THE VOICE OF THE SLUGGARD,"' said the Gryphon. `How the creatures order one about, and make one repeat lessons!' thought Alice; `I might as well be at school at once.' However, she got up, and began to repeat it, but her head was so full of the Lobster Quadrille, that she hardly knew what she was saying, and the words came very queer indeed:-- `'Tis the voice of the Lobster; I heard him declare, "You have baked me too brown, I must sugar my hair." As a duck with its eyelids, so he with his nose Trims his belt and his buttons, and turns out his toes.' [later editions continued as follows When the sands are all dry, he is gay as a lark, And will talk in contemptuous tones of the Shark, But, when the tide rises and sharks are around, His voice has a timid and tremulous sound.] `That's different from what I used to say when I was a child,' said the Gryphon. `Well, I never heard it before,' said the Mock Turtle; `but it sounds uncommon nonsense.' Alice said nothing; she had sat down with her face in her hands, wondering if anything would EVER happen in a natural way again. `I should like to have it explained,' said the Mock Turtle. `She can't explain it,' said the Gryphon hastily. `Go on with the next verse.' `But about his toes?' the Mock Turtle persisted. `How COULD he turn them out with his nose, you know?' `It's the first position in dancing.' Alice said; but was dreadfully puzzled by the whole thing, and longed to change the subject. `Go on with the next verse,' the Gryphon repeated impatiently: `it begins "I passed by his garden."' Alice did not dare to disobey, though she felt sure it would all come wrong, and she went on in a trembling voice:-- `I passed by his garden, and marked, with one eye, How the Owl and the Panther were sharing a pie--' [later editions continued as follows The Panther took pie-crust, and gravy, and meat, While the Owl had the dish as its share of the treat. When the pie was all finished, the Owl, as a boon, Was kindly permitted to pocket the spoon: While the Panther received knife and fork with a growl, And concluded the banquet--] `What IS the use of repeating all that stuff,' the Mock Turtle interrupted, `if you don't explain it as you go on? It's by far the most confusing thing I ever heard!' `Yes, I think you'd better leave off,' said the Gryphon: and Alice was only too glad to do so. `Shall we try another figure of the Lobster Quadrille?' the Gryphon went on. `Or would you like the Mock Turtle to sing you a song?' `Oh, a song, please, if the Mock Turtle would be so kind,' Alice replied, so eagerly that the Gryphon said, in a rather offended tone, `Hm! No accounting for tastes! Sing her "Turtle Soup," will you, old fellow?' The Mock Turtle sighed deeply, and began, in a voice sometimes choked with sobs, to sing this:-- `Beautiful Soup, so rich and green, Waiting in a hot tureen! Who for such dainties would not stoop? Soup of the evening, beautiful Soup! Soup of the evening, beautiful Soup! Beau--ootiful Soo--oop! Beau--ootiful Soo--oop! Soo--oop of the e--e--evening, Beautiful, beautiful Soup! `Beautiful Soup! Who cares for fish, Game, or any other dish? Who would not give all else for two p ennyworth only of beautiful Soup? Pennyworth only of beautiful Soup? Beau--ootiful Soo--oop! Beau--ootiful Soo--oop! Soo--oop of the e--e--evening, Beautiful, beauti--FUL SOUP!' `Chorus again!' cried the Gryphon, and the Mock Turtle had just begun to repeat it, when a cry of `The trial's beginning!' was heard in the distance. `Come on!' cried the Gryphon, and, taking Alice by the hand, it hurried off, without waiting for the end of the song. `What trial is it?' Alice panted as she ran; but the Gryphon only answered `Come on!' and ran the faster, while more and more faintly came, carried on the breeze that followed them, the melancholy words:-- `Soo--oop of the e--e--evening, Beautiful, beautiful Soup!' CHAPTER XI Who Stole the Tarts? The King and Queen of Hearts were seated on their throne when they arrived, with a great crowd assembled about them--all sorts of little birds and beasts, as well as the whole pack of cards: the Knave was standing before them, in chains, with a soldier on each side to guard him; and near the King was the White Rabbit, with a trumpet in one hand, and a scroll of parchment in the other. In the very middle of the court was a table, with a large dish of tarts upon it: they looked so good, that it made Alice quite hungry to look at them--`I wish they'd get the trial done,' she thought, `and hand round the refreshments!' But there seemed to be no chance of this, so she began looking at everything about her, to pass away the time. Alice had never been in a court of justice before, but she had read about them in books, and she was quite pleased to find that she knew the name of nearly everything there. `That's the judge,' she said to herself, `because of his great wig.' The judge, by the way, was the King; and as he wore his crown over the wig, (look at the frontispiece if you want to see how he did it,) he did not look at all comfortable, and it was certainly not becoming. `And that's the jury-box,' thought Alice, `and those twelve creatures,' (she was obliged to say `creatures,' you see, because some of them were animals, and some were birds,) `I suppose they are the jurors.' She said this last word two or three times over to herself, being rather proud of it: for she thought, and rightly too, that very few little girls of her age knew the meaning of it at all. However, `jury-men' would have done just as well. The twelve jurors were all writing very busily on slates. `What are they doing?' Alice whispered to the Gryphon. `They can't have anything to put down yet, before the trial's begun.' `They're putting down their names,' the Gryphon whispered in reply, `for fear they should forget them before the end of the trial.' `Stupid things!' Alice began in a loud, indignant voice, but she stopped hastily, for the White Rabbit cried out, `Silence in the court!' and the King put on his spectacles and looked anxiously round, to make out who was talking. Alice could see, as well as if she were looking over their shoulders, that all the jurors were writing down `stupid things!' on their slates, and she could even make out that one of them didn't know how to spell `stupid,' and that he had to ask his neighbour to tell him. `A nice muddle their slates'll be in before the trial's over!' thought Alice. One of the jurors had a pencil that squeaked. This of course, Alice could not stand, and she went round the court and got behind him, and very soon found an opportunity of taking it away. She did it so quickly that the poor little juror (it was Bill, the Lizard) could not make out at all what had become of it; so, after hunting all about for it, he was obliged to write with one finger for the rest of the day; and this was of very little use, as it left no mark on the slate. `Herald, read the accusation!' said the King. On this the White Rabbit blew three blasts on the trumpet, and then unrolled the parchment scroll, and read as follows:-- `The Queen of Hearts, she made some tarts, All on a summer day: The Knave of Hearts, he stole those tarts, And took them quite away!' `Consider your verdict,' the King said to the jury. `Not yet, not yet!' the Rabbit hastily interrupted. `There's a great deal to come before that!' `Call the first witness,' said the King; and the White Rabbit blew three blasts on the trumpet, and called out, `First witness!' The first witness was the Hatter. He came in with a teacup in one hand and a piece of bread-and-butter in the other. `I beg pardon, your Majesty,' he began, `for bringing these in: but I hadn't quite finished my tea when I was sent for.' `You ought to have finished,' said the King. `When did you begin?' The Hatter looked at the March Hare, who had followed him into the court, arm-in-arm with the Dormouse. `Fourteenth of March, I think it was,' he said. `Fifteenth,' said the March Hare. `Sixteenth,' added the Dormouse. `Write that down,' the King said to the jury, and the jury eagerly wrote down all three dates on their slates, and then added them up, and reduced the answer to shillings and pence. `Take off your hat,' the King said to the Hatter. `It isn't mine,' said the Hatter. `Stolen!' the King exclaimed, turning to the jury, who instantly made a memorandum of the fact. `I keep them to sell,' the Hatter added as an explanation; `I've none of my own. I'm a hatter.' Here the Queen put on her spectacles, and began staring at the Hatter, who turned pale and fidgeted. `Give your evidence,' said the King; `and don't be nervous, or I'll have you executed on the spot.' This did not seem to encourage the witness at all: he kept shifting from one foot to the other, looking uneasily at the Queen, and in his confusion he bit a large piece out of his teacup instead of the bread-and-butter. Just at this moment Alice felt a very curious sensation, which puzzled her a good deal until she made out what it was: she was beginning to grow larger again, and she thought at first she would get up and leave the court; but on second thoughts she decided to remain where she was as long as there was room for her. `I wish you wouldn't squeeze so.' said the Dormouse, who was sitting next to her. `I can hardly breathe.' `I can't help it,' said Alice very meekly: `I'm growing.' `You've no right to grow here,' said the Dormouse. `Don't talk nonsense,' said Alice more boldly: `you know you're growing too.' `Yes, but I grow at a reasonable pace,' said the Dormouse: `not in that ridiculous fashion.' And he got up very sulkily and crossed over to the other side of the court. All this time the Queen had never left off staring at the Hatter, and, just as the Dormouse crossed the court, she said to one of the officers of the court, `Bring me the list of the singers in the last concert!' on which the wretched Hatter trembled so, that he shook both his shoes off. `Give your evidence,' the King repeated angrily, `or I'll have you executed, whether you're nervous or not.' `I'm a poor man, your Majesty,' the Hatter began, in a trembling voice, `--and I hadn't begun my tea--not above a week or so--and what with the bread-and-butter getting so thin--and the twinkling of the tea--' `The twinkling of the what?' said the King. `It began with the tea,' the Hatter replied. `Of course twinkling begins with a T!' said the King sharply. `Do you take me for a dunce? Go on!' `I'm a poor man,' the Hatter went on, `and most things twinkled after that--only the March Hare said--' `I didn't!' the March Hare interrupted in a great hurry. `You did!' said the Hatter. `I deny it!' said the March Hare. `He denies it,' said the King: `leave out that part.' `Well, at any rate, the Dormouse said--' the Hatter went on, looking anxiously round to see if he would deny it too: but the Dormouse denied nothing, being fast asleep. `After that,' continued the Hatter, `I cut some more bread- and-butter--' `But what did the Dormouse say?' one of the jury asked. `That I can't remember,' said the Hatter. `You MUST remember,' remarked the King, `or I'll have you executed.' The miserable Hatter dropped his teacup and bread-and-butter, and went down on one knee. `I'm a poor man, your Majesty,' he began. `You're a very poor speaker,' said the King. Here one of the guinea-pigs cheered, and was immediately suppressed by the officers of the court. (As that is rather a hard word, I will just explain to you how it was done. They had a large canvas bag, which tied up at the mouth with strings: into this they slipped the guinea-pig, head first, and then sat upon it.) `I'm glad I've seen that done,' thought Alice. `I've so often read in the newspapers, at the end of trials, "There was some attempts at applause, which was immediately suppressed by the officers of the court," and I never understood what it meant till now.' `If that's all you know about it, you may stand down,' continued the King. `I can't go no lower,' said the Hatter: `I'm on the floor, as it is.' `Then you may SIT down,' the King replied. Here the other guinea-pig cheered, and was suppressed. `Come, that finished the guinea-pigs!' thought Alice. `Now we shall get on better.' `I'd rather finish my tea,' said the Hatter, with an anxious look at the Queen, who was reading the list of singers. `You may go,' said the King, and the Hatter hurriedly left the court, without even waiting to put his shoes on. `--and just take his head off outside,' the Queen added to one of the officers: but the Hatter was out of sight before the officer could get to the door. `Call the next witness!' said the King. The next witness was the Duchess's cook. She carried the pepper-box in her hand, and Alice guessed who it was, even before she got into the court, by the way the people near the door began sneezing all at once. `Give your evidence,' said the King. `Shan't,' said the cook. The King looked anxiously at the White Rabbit, who said in a low voice, `Your Majesty must cross-examine THIS witness.' `Well, if I must, I must,' the King said, with a melancholy air, and, after folding his arms and frowning at the cook till his eyes were nearly out of sight, he said in a deep voice, `What are tarts made of?' `Pepper, mostly,' said the cook. `Treacle,' said a sleepy voice behind her. `Collar that Dormouse,' the Queen shrieked out. `Behead that Dormouse! Turn that Dormouse out of court! Suppress him! Pinch him! Off with his whiskers!' For some minutes the whole court was in confusion, getting the Dormouse turned out, and, by the time they had settled down again, the cook had disappeared. `Never mind!' said the King, with an air of great relief. `Call the next witness.' And he added in an undertone to the Queen, `Really, my dear, YOU must cross-examine the next witness. It quite makes my forehead ache!' Alice watched the White Rabbit as he fumbled over the list, feeling very curious to see what the next witness would be like, `--for they haven't got much evidence YET,' she said to herself. Imagine her surprise, when the White Rabbit read out, at the top of his shrill little voice, the name `Alice!' CHAPTER XII Alice's Evidence `Here!' cried Alice, quite forgetting in the flurry of the moment how large she had grown in the last few minutes, and she jumped up in such a hurry that she tipped over the jury-box with the edge of her skirt, upsetting all the jurymen on to the heads of the crowd below, and there they lay sprawling about, reminding her very much of a globe of goldfish she had accidentally upset the week before. `Oh, I BEG your pardon!' she exclaimed in a tone of great dismay, and began picking them up again as quickly as she could, for the accident of the goldfish kept running in her head, and she had a vague sort of idea that they must be collected at once and put back into the jury-box, or they would die. `The trial cannot proceed,' said the King in a very grave voice, `until all the jurymen are back in their proper places-- ALL,' he repeated with great emphasis, looking hard at Alice as he said do. Alice looked at the jury-box, and saw that, in her haste, she had put the Lizard in head downwards, and the poor little thing was waving its tail about in a melancholy way, being quite unable to move. She soon got it out again, and put it right; `not that it signifies much,' she said to herself; `I should think it would be QUITE as much use in the trial one way up as the other.' As soon as the jury had a little recovered from the shock of being upset, and their slates and pencils had been found and handed back to them, they set to work very diligently to write out a history of the accident, all except the Lizard, who seemed too much overcome to do anything but sit with its mouth open, gazing up into the roof of the court. `What do you know about this business?' the King said to Alice. `Nothing,' said Alice. `Nothing WHATEVER?' persisted the King. `Nothing whatever,' said Alice. `That's very important,' the King said, turning to the jury. They were just beginning to write this down on their slates, when the White Rabbit interrupted: `UNimportant, your Majesty means, of course,' he said in a very respectful tone, but frowning and making faces at him as he spoke. `UNimportant, of course, I meant,' the King hastily said, and went on to himself in an undertone, `important--unimportant-- unimportant--important--' as if he were trying which word sounded best. Some of the jury wrote it down `important,' and some `unimportant.' Alice could see this, as she was near enough to look over their slates; `but it doesn't matter a bit,' she thought to herself. At this moment the King, who had been for some time busily writing in his note-book, cackled out `Silence!' and read out from his book, `Rule Forty-two. ALL PERSONS MORE THAN A MILE HIGH TO LEAVE THE COURT.' Everybody looked at Alice. `I'M not a mile high,' said Alice. `You are,' said the King. `Nearly two miles high,' added the Queen. `Well, I shan't go, at any rate,' said Alice: `besides, that's not a regular rule: you invented it just now.' `It's the oldest rule in the book,' said the King. `Then it ought to be Number One,' said Alice. The King turned pale, and shut his note-book hastily. `Consider your verdict,' he said to the jury, in a low, trembling voice. `There's more evidence to come yet, please your Majesty,' said the White Rabbit, jumping up in a great hurry; `this paper has just been picked up.' `What's in it?' said the Queen. `I haven't opened it yet,' said the White Rabbit, `but it seems to be a letter, written by the prisoner to--to somebody.' `It must have been that,' said the King, `unless it was written to nobody, which isn't usual, you know.' `Who is it directed to?' said one of the jurymen. `It isn't directed at all,' said the White Rabbit; `in fact, there's nothing written on the OUTSIDE.' He unfolded the paper as he spoke, and added `It isn't a letter, after all: it's a set of verses.' `Are they in the prisoner's handwriting?' asked another of they jurymen. `No, they're not,' said the White Rabbit, `and that's the queerest thing about it.' (The jury all looked puzzled.) `He must have imitated somebody else's hand,' said the King. (The jury all brightened up again.) `Please your Majesty,' said the Knave, `I didn't write it, and they can't prove I did: there's no name signed at the end.' `If you didn't sign it,' said the King, `that only makes the matter worse. You MUST have meant some mischief, or else you'd have signed your name like an honest man.' There was a general clapping of hands at this: it was the first really clever thing the King had said that day. `That PROVES his guilt,' said the Queen. `It proves nothing of the sort!' said Alice. `Why, you don't even know what they're about!' `Read them,' said the King. The White Rabbit put on his spectacles. `Where shall I begin, please your Majesty?' he asked. `Begin at the beginning,' the King said gravely, `and go on till you come to the end: then stop.' These were the verses the White Rabbit read:-- `They told me you had been to her, And mentioned me to him: She gave me a good character, But said I could not swim. He sent them word I had not gone (We know it to be true): If she should push the matter on, What would become of you? I gave her one, they gave him two, You gave us three or more; They all returned from him to you, Though they were mine before. If I or she should chance to be Involved in this affair, He trusts to you to set them free, Exactly as we were. My notion was that you had been (Before she had this fit) An obstacle that came between Him, and ourselves, and it. Don't let him know she liked them best, For this must ever be A secret, kept from all the rest, Between yourself and me.' `That's the most important piece of evidence we've heard yet,' said the King, rubbing his hands; `so now let the jury--' `If any one of them can explain it,' said Alice, (she had grown so large in the last few minutes that she wasn't a bit afraid of interrupting him,) `I'll give him sixpence. _I_ don't believe there's an atom of meaning in it.' The jury all wrote down on their slates, `SHE doesn't believe there's an atom of meaning in it,' but none of them attempted to explain the paper. `If there's no meaning in it,' said the King, `that saves a world of trouble, you know, as we needn't try to find any. And yet I don't know,' he went on, spreading out the verses on his knee, and looking at them with one eye; `I seem to see some meaning in them, after all. "--SAID I COULD NOT SWIM--" you can't swim, can you?' he added, turning to the Knave. The Knave shook his head sadly. `Do I look like it?' he said. (Which he certainly did NOT, being made entirely of cardboard.) `All right, so far,' said the King, and he went on muttering over the verses to himself: `"WE KNOW IT TO BE TRUE--" that's the jury, of course-- "I GAVE HER ONE, THEY GAVE HIM TWO--" why, that must be what he did with the tarts, you know--' `But, it goes on "THEY ALL RETURNED FROM HIM TO YOU,"' said Alice. `Why, there they are!' said the King triumphantly, pointing to the tarts on the table. `Nothing can be clearer than THAT. Then again--"BEFORE SHE HAD THIS FIT--" you never had fits, my dear, I think?' he said to the Queen. `Never!' said the Queen furiously, throwing an inkstand at the Lizard as she spoke. (The unfortunate little Bill had left off writing on his slate with one finger, as he found it made no mark; but he now hastily began again, using the ink, that was trickling down his face, as long as it lasted.) `Then the words don't FIT you,' said the King, looking round the court with a smile. There was a dead silence. `It's a pun!' the King added in an offended tone, and everybody laughed, `Let the jury consider their verdict,' the King said, for about the twentieth time that day. `No, no!' said the Queen. `Sentence first--verdict afterwards.' `Stuff and nonsense!' said Alice loudly. `The idea of having the sentence first!' `Hold your tongue!' said the Queen, turning purple. `I won't!' said Alice. `Off with her head!' the Queen shouted at the top of her voice. Nobody moved. `Who cares for you?' said Alice, (she had grown to her full size by this time.) `You're nothing but a pack of cards!' At this the whole pack rose up into the air, and came flying down upon her: she gave a little scream, half of fright and half of anger, and tried to beat them off, and found herself lying on the bank, with her head in the lap of her sister, who was gently brushing away some dead leaves that had fluttered down from the trees upon her face. `Wake up, Alice dear!' said her sister; `Why, what a long sleep you've had!' `Oh, I've had such a curious dream!' said Alice, and she told her sister, as well as she could remember them, all these strange Adventures of hers that you have just been reading about; and when she had finished, her sister kissed her, and said, `It WAS a curious dream, dear, certainly: but now run in to your tea; it's getting late.' So Alice got up and ran off, thinking while she ran, as well she might, what a wonderful dream it had been. But her sister sat still just as she left her, leaning her head on her hand, watching the setting sun, and thinking of little Alice and all her wonderful Adventures, till she too began dreaming after a fashion, and this was her dream:-- First, she dreamed of little Alice herself, and once again the tiny hands were clasped upon her knee, and the bright eager eyes were looking up into hers--she could hear the very tones of her voice, and see that queer little toss of her head to keep back the wandering hair that WOULD always get into her eyes--and still as she listened, or seemed to listen, the whole place around her became alive the strange creatures of her little sister's dream. The long grass rustled at her feet as the White Rabbit hurried by--the frightened Mouse splashed his way through the neighbouring pool--she could hear the rattle of the teacups as the March Hare and his friends shared their never-ending meal, and the shrill voice of the Queen ordering off her unfortunate guests to execution--once more the pig-baby was sneezing on the Duchess's knee, while plates and dishes crashed around it--once more the shriek of the Gryphon, the squeaking of the Lizard's slate-pencil, and the choking of the suppressed guinea-pigs, filled the air, mixed up with the distant sobs of the miserable Mock Turtle. So she sat on, with closed eyes, and half believed herself in Wonderland, though she knew she had but to open them again, and all would change to dull reality--the grass would be only rustling in the wind, and the pool rippling to the waving of the reeds--the rattling teacups would change to tinkling sheep- bells, and the Queen's shrill cries to the voice of the shepherd boy--and the sneeze of the baby, the shriek of the Gryphon, and all thy other queer noises, would change (she knew) to the confused clamour of the busy farm-yard--while the lowing of the cattle in the distance would take the place of the Mock Turtle's heavy sobs. Lastly, she pictured to herself how this same little sister of hers would, in the after-time, be herself a grown woman; and how she would keep, through all her riper years, the simple and loving heart of her childhood: and how she would gather about her other little children, and make THEIR eyes bright and eager with many a strange tale, perhaps even with the dream of Wonderland of long ago: and how she would feel with all their simple sorrows, and find a pleasure in all their simple joys, remembering her own child-life, and the happy summer days. THE END brotli-3.4.0/testdata/alice29.txt.compressed000064400000000000000000001416601046102023000171000ustar 00000000000000[RE;@}.ҊE\IKox4]MOl!+l\ECKgiE_|ݹɽ#IBƁQ鐺LJE`;l h/@wL1F@q(}fQVF;EFpdqȑX7Jdh 2>W"HA|#n9l[=ʇh^ i~_o#(aHQA9"t,}Sp0Q6a2Q|=,C@UE* oQcHS:MG쿮FZ&Il}Y}i;z5Ù^koq @#H HQ [č~2LRU`QGUUn(ݴәCu. !lr@$zd΃vS->B im};; {4phl"&= AbO\/gj 1+cUz>Ͻ :! ѴVa5h`PxNT)Ѓܙn'>?OϪ;, 1`ppg`̨ "HPߋ #8p&=[QF0rhɌK`}HC;+x D<`T$EH^Bgq^d1^BszmWw8-JH,_.{wsqҷgXْԨu^:K )w4('LXC8pOA q$%B,T)gBm!nCW x6 F}gQq =? %$EIJ'b p4יI.j|!@el) ?&\f60dA_SX2xOi>~ўP6KUwiy W[(b,73(L)+3.hMd-6##Q N=&F&lbZ =&>TkH 0h,gPBu"/Rk9iY.>>'JEm nL_ <%BHB\ƪj9SKcM>[Kh_"0[Y?Q{8ߛDID5^ \ ~'"NIzu@:ֻk $+}OElW IHbxt*mtKnԷC!| Qz.M7{ONs JFECU8X|H,-:,aC{-mjz.iY;Z%3owXE S#;ZXq3DF)"F_~d|RcKU2_$Q;_&^$hm 7+(a!0_vh# >Lkޘ\7;d4/?c.C:Cj$L]K+kʨPwŒEL9y˙|kOVjO3U8@vZ`~̾# @ , D(i"h`cR)k԰[]-ʍQP(G델t+ZvXp4nۑB%ݢBfFΏmMU 4~> Eӌ4vseN7Y叛)9e+3Q 炪oHaa.I5SpcUW-QJF-Lc5<8Jz) *L+:R֫7/A LDGktn(-31^Qx)7\C}h뿉[=&r! 8]^uaR3YH, ?T{F|Qj j-+2V'ܙ CH!OP8,&I?FP*A+ƇnNDk9fm(+sI,EMyr׌W8EKwBh]1FxjOEo23@ eGwyQ(uRkFMM=u;&\?pq]^L ta]zvA)%+'yx[GjkZdj9GQۧLf(T&>2l+\Ec |8 !']&%0W&!;1{I'G7Xs@tɜbʎAFtB8D]0eһ{vO7Le:̌i7L+eO,RiEJpdoid|ƞ;/8Nv!)ž)#K QX:ӲA#=ലbDУ(}~p4YOEI'? )k`!'Fˇ@cbQVjIvQ}ȟ%&R@kҘTKznUنXE1s0/ތ`Pn Aa@NɤE$VmXW.eC:xp*/*kGGN,S"9Vm70J'FMǷ1 \Fgߋ֙\g)d=t)<yВΩ=/8¶! zWjg\Yz< ͵;D}圌<%fӤp&Ґ۪D&%ԜĄ.*PxL, e*R{[OQtԇtD0aXyj UGdIRԩPLLKw i tN;FlpjnPԌM@Q.!I"bEdo~ @9H})ʫ'uMƬޮ([ҕc7vVg.%0@xd(537\oG7FjϼݟYOa]b%yŖz@ d^7;{ Rk,UUg0hw Մ&$9c\j10 n. &Ac^U7BߎdiFj:JxY'0!J6Bi6jOkj/9떎HQ%TCF+-ofž9庲3@O9vFYXI@:o9A<ۦjmbRT4$MƛvN}}] d<\%Dv`0 f&5»u|p+EӍvƶPMzbvG(M}$RUJ.mW 8X ]=#EC9\&%=dQR ;d[}}zW&Da6Z'ݭP_Zm>[!GCrK$EjsH1^0s쯉R ZC-%3[H2Z*?et%F$"Zr+N^m8ъϣTE6S6X3PDꞪUk7ԟbUclBY.-qY"\7{ZiD"dm_1oVԉ4Q2H{0E)ȌS>g;`s0>peIc=zǭ*}FEc 5:oӍ ]Y8+0Ðl@OeSIMƊ>G!`꺄҂O3SAx D1PA\.~r>&*')J :<-[NE<;D rSo§gP$}} kn3vTUfx&m4^\!ܿz !}1a;cĀgla*V٨ O ~tI#x٭i-`~ 2kLe=$*V|2` !+V] YK-ClRV^ qjn,*TP\:0+Y+ÖGxQ< TSc@놌®L]^pZΚFᏔ&:twxK,KsH< gkLNm{~zf:E޲,]]׆" Mx!R~Nͭ.>>lV&KUkzn 7ZC0i5 fIrt=[qdV>Lvkㅅڑ]8^- c@atNt+Ue /m_{LE=CDMw'Q+)xf΃ڮXQ!2 K#g} *"nhʎ9ډѕ>T/1 ^<6B(zV{8G{9ytxȔ&*-7L.y%$u^5ƻ;W7%3̄iL)1iQO#%k|rVP XRϊ~kS]J(?Z@0vS"vz -ǿ΋byYϙIC(`kf&kn"&'L' 7t~eDmoK;AɘVltч8iXc2^f '%:ՄX/=02}7CO. Z]ˉ3u)wnđA?|ݗu{kCH}IE tk[vMPFTS-N_?yЙ&)]Ġw t637_a&&JcL0[ h ߪ6H~Ҽ,@.g#ĩFqKJa; N|z|T}6SNu0Ų얳()' D:Ut?@2FGX&TQŽ!\vd;5z';̦""HEA֖Pm8 @7a;JUݐJrجoul#E͌/҄ (ud&2/s;V;MmtI|}%fiL2ݳ^~|eOجϡq6+|Z!pbT+,?QYK!GxК^7 L Xwq g^bEYւf; ڀ};玾ơ0INUJ;A|>kWS[0^B@fw5C6que>Ĭ5Ev$ڧYm3u RbZeBc|1v`EϹ.>ΌJs,@B2Î"[fGi,܁u_3)& ~yRA hM?ou=1ؙZJ(/U.20JpGl UV7W=v FR]Y@pÆuʻ&3W=A!6>p?(?͸\~`3Ѷrr% kN:/)%'|ElYz$n>.;I?6|:C͒ǟ&=Fj0w#X-34*V9I=rb3徳wg;@w~Z {Ќv& ?+Ҝb^Q%_q+}bT꽙1XbWioφ. +ܗV)brDʋ%G:/9z⫚UfrfQ8F'K^^`|,E6bLq5s%<̛VH{)[g1~|=aAAIR.{ٸws$]X=lQJTH{Lrrm2eV:$*σQ"oIl=HH8MꆌMc-,+HA~ 2%$#+- O4,SedHt%D3[gγV胱dG3 & ?R0RB`I H4z<Ùӂ[|\qpvha$rN@w8 ҵ򕼂768(2ˣ{5 +y_X)9\yekT.|2=e݀:3Xςq}68a->4R-8W?QvicjGHI օl= ?ë~>n"p'ZRp~,n!?!ްf4لe|!CU"5&k-aU0j#sύ?B6NEDG:?75r,=ruO(G5\a 랁mWQs!9O$ϓFInh֔]d\""~+kƙj{Ŷۜե4^/n!]deHoj%wEN1<[YfIe)D7N,mkÌ^yp[G-w4TpqHUz:نT/lM=ԡn(6wP4+E$iR˓y@j. V3S= i|32Er%lyHɌRFd|;-G8F`2+U2(~+9f(sExm?T-Vs0tU|4ւ'l ip.Pg,D+.. Dk+$U!cO냂Hq`7Hg}S[~4s.R$3LDlgց$4YSq{)T*ՏCVrCcX$Yw)<ؙ#v4#Q,;P m&ggI']^g~8mh׺%e{67xG&Ef9 !ޭT;v /'H @;2K=7zD`(2{lՀjccE, yRjOff ژfD_?Vo!;NL]A%Ef{k m(i$> &S%{wzs} #19u1&hV;  yWD\AɃ9ΦOLnt[T&hW}_BfҨ Jq͇#z G`Xn49YÄ@5#f6WAz (oPj1yh3{emArwXp+Oav Ywm&zv AKDHeH4))C)nQJcTWdhzFnEFR9A=DCW*PEqH}NE4[2M9e4%{ř Tͩ=aHW$r;y*7?Xu[S97yM-r99ˋ0k2U ':SFD|"y+)4څӝ{:p*ػ5Dhر, M[9jMCYH<"jdrW^HpܐYyLt#sc0G&lB9]׮z^g-\+v/.Z3/EA i }[0t$&(iYC[l 5R?~)`]8mvIt"KW7ep882.g|9kDn1A,&qqՑdP0f[>cYLGY5~ʭ^/0T_(ն-1HNuldrgŒ(#58'oǬ6DXȢ{U]敺̃mC'BwZY~,BHF  *b3t8@'c[Ӊge;?Xm%ɤKgBjv&ճF.2,׆H>JIΧ>LIln q(iWK$p6cT]2@z{\ \oJ MqZ-K=y\,hdC#JQU\[SvxAM wgi 6:0UU1WCdWfv':*rC x)f:(]A_.R{^ Ɵ_w)2=xxeksAit~W`GNn' I]ޗV`{x&7O F4$?aytgEvLhDDIZ,9E"$84;8Bߟ.Py>tw"]HjƁ&IrGJ~7zЍ^[ttYaAՉE!q w:!ESbyi_֮_Z0$̑s$μc+o8,ai yIskk~1h`1a=_4p=8w^ɺhh*_hG\Y܏{&G܈Ѕ{uBw!W˞4.!#tYB QS6/$i#$je |/Ez Y~B:yzpep+$oƊbH-8Īf NK@H|oTk&"+7+jVg4\v^Eq>?В## A3Qh]{4sm;+FkhNjIvb^N!}e5N{Ƣ"P(?߰dV9>nX/}?k47nVtZnzõ;m(޳+?N +vN"P{,0ePr2 G3\߶Rbo)f1+V*~w شyP4>A5}N yd8OiQbC7noO{ŭӲ~h0aH7Ҹ+5RZu'9IS-oh]rf\HkcVOQפ U?I*:E5,1T`!`xO,%URHMVt9&${1_JBQ:oSA\-T[ЕmCV7n[ C˃ %6OJ0[9"R ; }`ur>xtkjS`X KqUFL%I=a\:9RQ|4 BhsOxQD6A6lņҟbúzl?V[(jNI;6U܆u'Brga>/e ˲V Uz"eZ҂.. 2a,pZϊZl)EJI 32zIR;"ҾjOmp yjM69Ta*L[_̕pRk/8j:|"w f$e֧V4d)0 ~PmPz 7Q03;P6mH n867z =š\ypg.װW.rtsFks]iцnm$OV.KSnZUaMiVdpӎAO"CṮ½!6kxj{Fl3p[}޾ oFz^(W6xhe
ej<+nP:Y@R&8cؒZq*X _/PF:@տ.`CĴ[Ŧ̼ o#Eqd̓lk;n@XYi,Hb8-㋆G|_3צKc]`v lW1͞Ս.y›@nbxT] V䌽RM,]ZbqPGDzɀu d0>6qoY?< Է2m$~>T[]O0p|h )ֈͼ"d{wx<Nq5Hk{ǿXCY{fۦh]DP%*ٰL8aIC=ʺlRRS(F'&0yn m`\ҝ$V5q:H?GE%k-hom_0fңӏ1S,aq5tTbk&,CeGӄ-suJc't |jZrj[:@KnٱG`aMҫY8m/a0+\u+ , 0ZMn; DaڛXpWFۗn r5x3egżxwO;"gas8.+{*(0D|}r az cY"5lۍϭbʝ<ܙBsV wdowkYlkQr=U6{~Hg7*Mf#KT7jC׈ݓ||pҸ,Fad?u߯MWOs,Y#dXھs9Zpe >7_~i5_1dڟTY}̍EUVPC- ϲE>Yf:l\$x>֦hܪ0;_NF4#OD:Pe dCP Ws,-PnJ@B5ߪB]L?nθ0#]*t̑(Dq. rRͬ;2`amw4ھll*#`ynoȰBF[>{ dSPƷ\<.^;HS(Y -#K4Tj 3EFv;]FWv 0r)6c ޜ} TsPq599WYJW:X*HLg;jzRtH t7r4ʯ؁mp-p熰Ȧ2RHJ$鮒{Ier3cu.=6^"WI>/ⱈOFXeɗBgqz"&JfSMP,%z9%QeO=Jj 1'Qm%O$amtF oA5NϘ&6Q9=3m$f&k=B/ວ˾2hw!ɅGq2 q A!DJ~P;v?&ߴT6Kd/e|C3\UU(r1^Xɣd: *^"XUIRlp0$SS1T#\ۻog2FJt-"0q{rp𵄰} 5O{P㏿vP2\mŖ 3 v.iۛS~B(%)i-8EFjxk1eg1^[wocwS7#..ndX16 ;mlHqY?cWutĽBH*i-wON+ Q`iƻ}iQ]xs/PF{кb9ЂzS~vxߚZn!eZ*ןi=WOpqcc%me:]L}&idؑs$=2 |,Qtc%!{ɐ.#t+vb״"׹pLUerh,.wĠkx=^ \ S>eĩ3=| +Ŷch [1@?.~ gv;)^řÄ2۫|f2Z'#GetX:G"~36YgV褏SfPo9șlJ (f^2.S )\B0+c:f? +eV7]]}yt"hIJӺd|  rFH=[<:`McvZ(|v2}!Ӯ5}ۂLZ&k5KM;Tg<ӌ,ls ƫžW5Ëd3- #˺É=%}4yILcKQ|uQJp$oPJ|Qʗ2_-fڗϐSUU%< UN4KeZM^,iJ@4O@܂]2Ag`XDkQ{HY: .q\%IPġi! oH mCHɉqX8]F l4Yv)'\J!'ߝ ^zzG>l 8l9Y}-gE?]lܓoZ\۞z]G#VD #K쀽|J8r%Ӭ ,#m4(Â;RF|8kG'H m*KyK}Ý>唘FXP)ok1JA3L*Ɛ A!QwSU.<{+ip6H\vjY}106~dƙ;qu,#TdM2'~vPpKf5bS#ZT=)sk+C:5h㛴m21ۆ|oee}(_"[]j("I`!>]"g1Zܶ鷛G3FHn@龗鳗} \J/;=gMTt̪qRy9̈́ UF"sG `n#d6f[eGtkQf&M/sQsVN*:ٞ~hO[B6oZ7݌ %c'm4jmq;@o^P?쩥3#j>4u݅}*wu:PER?k%WG]gZY3BZzˁm>R~l'V˿TApwE=/(w=fZ(3jhANj޺5!z| icG`ݻ""CIgsԱeඅ,V".L+|]d;!+@kjzҔږ$M ՜#O[yOp􉉴(B޽>_?$;?&e\/ $#m`5anEJl8pbƬ8fӟؿ$1HBg|Y_G:4/(vnj f3UE}c0SJ#m`6rmn"VϬjJ?!㙜 gCϟjwӌ?#C̶WPt `<$M>qGUkw%|y@"OM3Q,eTmL$~6oNMN([[p#E(Gz:wx`: AέEwaPNdz>$S~_x ĉG屁#)um߶/w72DĎvxA}b n Y[:=׎"4\UJߖ;587{(^,H(ov`Nɔ{O?L͢a{i_94 ~JGclPx\n; ;oC; nE8A$,f * owd13ib,e|a k\\Lq,M?ܺ}dΩ e+`lrb|X<R%rԁh=h5Ѡxpߞa!/yID,1~6A]Ƿ1Z7ĊF#P:Q4n2/"rI]~΋lk!wo=YƇ|"HCfEm .k{ˀ# $$mu_P%Bxh۳>UxdV#XjǑ51[r4pgLra0u =^|={ױ95oc KUYR#ZE.g}P S|G:$u=íj2k)T\ $ugm!Swsk'%Sϳ$^|!KgMeʽ8RiۊR-n eZ9O?(%$ciP̒D_qxoүUqo| ԣaV47ɻC: 9a|:[!Q( (:#f_:;xu|]Z2XЈqv【Z2߰ c. |\W iv0c(0_+]<=` Z,EyaM\-4ܥYR*@ۗ_G]_QhUL{I;:I˴@owe5WLҝYް8WR z*N6T[oY#UnGTFnPӁʌ,D=ķKi; >RWLحBtT޹ܵk&FctQ ɼw(ue>XT0@S`w\>%Yɕ8k-{sAi15 V%)טC~hRyXy{$<5ʛ%7RY( ªx|gV8e$b+M)˚3xwF*X`!rs,5k>ϏZXW~%ѻ~>!\̾ F+xRrOFJʐ0 $%$D%?&0P>aqQwkj(A2-q;s^qXDvd0^ ݆# qO_3X5F3÷̰|<|[آÚprgptA+@W׍+yc)&5cmsޥp 0<_ULs)鸻'+3nK!%JP =T2qMh ,ۈP2b= =pP p*W3RI۳f`dsUɐbxn'3W?8g9 ;`eiR(;uEt%6 F9z+׀%ǪO=O*o0|6,ØY=yl%)6vZHmI78Q1qzE#d#bN\>?=.FލlߐݞMNTU/8ZP /LGU [lR;| As~.Qj%}  Sa~X[4{" B[)ĝZؚ 3_TҬmf?ݴdԝ@ p*R0GvFh}xld9NOQ#N| :!1.{Ϗa)Pb7j ]e33í8f.ߑCb}YMEk嬲,ȷB#wtLR6 L]5xpMlX_ؘilQ`Xꊦ@VER|+]%]X{ccs֏uGh266h&J0V*"-M6Q:YM2:M3m̳ﯣ?pxH1( 85 ͗~|{6/%!|HR%`_H)z ,z3[/shgъpO]'JbZo[1{ffɾt>sjpYQ,J'E+@7`=l㒐]peyOӲ!qX$ 1Z#ZW0.}Iמ9cIb- w@X9Hv_+z[R99+d$9J]];Xjl3Pj#XVWUχ;eɑ̣Oo#KUavMh6*-}hå,qɀ)>#'Ts?h٥Q0KAbaIw=gz&k2.jKzHm={1]%U*$3< =*= rߢzRw?~gd3M0{I8$* ?zM1m#c$gGu&ZީHWk%Owm }{]FC߶sҠsl٤Hτ0%c<: ɓSa;;od>(V<FA'< O?=7}Ӎ#&pC`̓\??~?y=BCR;IUx@SJr-,*Ga\iq{G [inuD?+glQ&|@.*ha&WaᲄE- Z@'~w_L+8e3N4 *ƭQ] b7+FpR*,U`)&pgQ.BuM߽0X6z) )],wj{Z{Do8bҡ!/D "s(xE!ȥ*_]-H^lau?lJxuR=|1+GpCZs¬{ϭcMҒ!;+&1EyY&BR[W]LD+ V*2q$%~j_5_N@kݞ/^MdsάjBV3x5`^W*LDB(,mTi-64)0lz._n'}VdcaW#B&QxNpD.yAuσb m7/_EEv.xbdC [35L!mNu|Z2T`?q}f`I9GI4ɔk$42YlBEE V^-/_Cv%0x7i.IZnuy6#0t wJP}٠V֣$b,Bu-;iXRXmz(om 0Fw~elkN֭)7C2ϽƤWP Ǟ챧LI\CV곏}-*A8DC gGO?|c5[WLh7z-BtZ@&$^at#n\}"fN9|eM0Ml 4UEd=v:[8Эgval:Jfy> M!OljJqL.'F_KOcκ㷍T)J6U~W\Fc3j]Mnqf7)6K=PQY&Sgaf/F=XgFaF+5ME+Q_"\T][‰#{] bcjr0}y`?JML!>Sk>PSh -A_2醡~yB?3TfWJ$ywڇ#3J_VmJ YN^O*<ݮ (-Bz ȅҽIiâK gp#)WNxlZdM3}~(\+7w$"6&5Y5+^7ֿp g&vA¤ mtXw=^^?rIRp"& S+Owo2yhbgQHOB8a[=[iLPh_u!$z9ʏŒFZmNj13&4.P)h3sx儬Ԙ^L dZq~GjGuȥ{8,̔U,Q@GWn&-82kpӘ(@pRln bxXwE1:9ϤrJG0" XZ;_C t{gX)ظyGhƥOlfτOkOy|Y-ff|="t3O!As#Lt>MCܮ?Rx{*CEL$q^b3ǧH4~{tsc gOq=F0s»I^,0T]ǘa,-i'[*˼4tJˠV5 \myt@q后XkM #i-/؜S5qhpe;bSDر`Wgo sAtUP1ܜ *<ϢqiqzR޽td@mc֜"o9`ջ@ 2VOK s]B`HI壮{qf@ 9\xPS#[I ŃKs{|9}Z%~m`uAy)ep-^3"ʱ6C I7JiȤ}Nj5g٣: 2P%xLZ[y|aȓ4P)-^BM\Dmٝ8 %`?nVю~V\#n+9zd/5 WKJceO7,髎/80I xVtn96Su>z<6sey`91UD,MxñK?݌:[%3/knC^zgS;{k^F <.G!\,N70w=},OŒҕ~`oYNTn |_`3 DӌiKEe2ACX(̄ni¸anA})I Bh7 iFewp#$og]DM5n!SFbt, iDkJ>Esd 7X *.VOgg=\_d6%2ΦRS CP&\&C ȩE;(Ie.{0~@jRȏU5GI#2IB6Y>J;~ IS O][u^[UXJ78 \պ'7$;H@ivWoAT;zIx,& חǯdPMgw)RG- 1{s+ ؗ/ZM~x_~Fh=~ofjԕ$[-\BAMuQe]:DQOK8̺fQC BH?GH$2?ϳy_,íP>X9Dh['ѣCs'=I~QueZeTv^xp0S\LZR7Sbõ1I?'ƥ=E\*zX(n hsܘIҲw F˶M%G3[P>S5d}noJFިMע4D?Z) (I;A"˶:_R 0Mx/*]4 OF>%eamYsRPRI,Y6d}CƊi+n;x=N}0$C[ӥ<9dEk(/Wk(if1@KK8䓽5| DLm3Ahft&gCMIRyL{o[+>sQspW`DWO5"x2Pԃ[{0P% v.,556HiI6j"?L6;vT^{Ănp@|Uq ;Y@3y Xq53U) ]vcjQT>cF|aBˢlmhڤ _tWnrU/#JQRXyRZWw|~}xWWT"@5@n6s?; MiQ WPdfZvGElrڻxmEuJD7j]yhɄ'J+?4u Cqz;' /$`uK5#XpGrsaQ veori.vj]/-ZWjԼ0B_uiO 7{s_iY RIax̑*Ga4ad\y'~WOzTS'Ⱦ ?^w0~|%Nѕ|\j{wܩ2l`XZ5ThgS􅒲D,Ҽ;IC̞#&3[ȅ/S|//!STEDfRwHEeO3ix;G0bɎS~̭-?3 {.o q[aY[ mnXH(V<Sõvb ҥe*^j})5Cg1:uzɩ=+P"H׫4` ot\aSߕĝ\qiY!K Yi(M-nNy<7 nǰrCm z`,RXe%[r\O[u_,"O+ʴxt sm,$.A_E>K &+xa"EYLFZ]NԮbk*\G52#J#:Cfw(Kx%[PN bGJBǭ!|Y..ˉ8l~%5ʨ$`quU,pqT>ov7M]t\%U/eȉK'݅9,j= fr୺L :T!tLM{]%^;؏ RIQ:νfR2co1fk 6UַfS}dHR~Zo!^_fCLCڳOm=쬤u$aĉ9M !߻A鄩j^lSf +ltPfonG)<}{6#yW;u'~3wm%Y.Yp%?3ؠBX='{C&nH`s#?"lgJ)]i$!`# M&iPQX)$3CqWo<0{5Mmfͺ QdU0*ߖp\1]j=D/vߠZ{gt+Llv A^?+قZ8Qdm":J&2A #L { ߌ5|)*HGJ(s5&UxFkIR5ZРk#Ajt + |N?ڹ(b>lQ fS#a0S*TZ3K*KUSP}^d#k:jU0u~[2>9[̻[w[ܒ#ժlYZTi)wij#)ZQb= ݌$\RM N;qW (Nt;Om)F1=WkR4!y c9) WX%5eA0\Z;'o]3VQ<+( gEq#8P3F'G9 gIQ'$F(mH_`.)/xޚJ(G,LD`^ĿyFgԢ! :fg9/8ˍI(5AzN1 ݫeڊMr>j=R{Y 3[/Q"|* !@DM|sr-e =:$(=!8v bP +(&Mk0^KxGFLqٔk P*XycztC߀ZNv1.ٕ3^:m "⢒mz*$xD"Uyf>\ͥKVG!*8F~DZ࣐ [1pTI@w nj zs|bo~މgwFD@ecpzv\ KP'9t4eethN3-x$5hȂySUcOPԂPxw o+Q-I2 2ڟ6IL8ZkbF*4Rw8W,t j}hqX#dl :p\17v91i;1PA>~Y,AlG*ZgJ{/->pA ÂT,k.NUq̻}}5` \#)00%rkR&8ofʚӘldz9&%gj)Vu"ٕ/'[{ :nOd S[CUeڐwI"~AH[Aģ/BOPgNf& '[{=f^v;9rêPIc'8zm ΊN屫@m. iFM렋|-XOfJÝ,%k|5MMpKn^n 3Ĺ3"ǨdwzlMDZ-5'$!$ ZpDo&8r_n HALGk :DPg'a(m^! 8'wla K03Зj\I0VyZAkKd_2t b ]JOwT1a,ZN@x" uѾytmw8PAy_t4q@&ZBk6+U%gg4}_:pft>Mse}_ŕIUwz onF%<*"U(C;%ꕵr6:/jwqέT{eϵ+!Q"&~a }: ԨCa(ת%6piXCTǺ jv/ozÍ[{yeо6sE^YTu ˍQ}/ѵ|d;դ}jA":kB$IN3#NL*[`_oOg-;[rVM(Zu(a2,w LJ+ [ŬzYNr0PjYC}1RM' vp}q]=HDjEa:S'Wi 3>KF@zwHU d+!X;ַ_4>6\'L ׹i١䔞{INXȧdE5๛O o 7uhܧ הnGP]:Lvqvʯ;WVI{au. l F8k"ff|VRj eos*'Tlt[ U)vvuSiT!0N b.d4|Hj6C&.w4tr 9a| 쯃IMS/G7([/ޛ =.RF4ՁfUNP),?@5qt{7e&LjuNdPg+^كtfW y&(r{GbhA 80#[{F.Y9ؠvĦϺ=л;SoRJӎuqD)&00؀ɂ!Oa'!ݼ[;{ݻYiL cE=ȟL4W7d}1ҿV.jvU̸LIxY-R:?K2j)fBz%3&[Lf "wɠiT&PVZ`=GpO#` ,ϊm  <(Һ>ufM21v LkG>螃5_:Pva 1n&c+U|'Պ1v<VwZY}laC;wt FﺙY6o,MOgJ'Z2[}75_މ8۲ta$NhW5Yh?Ͼ7*Ag5A4'qSpv]HEL0HR`jNo^+烪?EABCؓIؙ2 *q*$X/uv xwY eԞW3 )dz0*F=It]mtc(G4t!hZ\Z{%_ȏ,D6cJD!$T o'd~;ҢvrE'&]Mh qocFVm4rCчABGJPco0vz[c1G9OuyjѢ0+*`6܆~hR026kĭp2਩'ζXIu7 6 YD_=JˆiM+N^6 kCuG۽ue5Eh-N_c=wHV1#T'##0Pwf ;.]#WmAc^ F)73_gȸs[:~eWePR"Mo" + HF]; OÈEke̵,0.~hķ1pd& 3-t!]X54.HOr';(cyj¨%ZPiÍ?U3*g܎ИT2d&ȅFpDqRZj8IyR5X(r-+5Y-#YE22+KYce|ڑ)ހtFؓ|yԳ5z495lօ`'l4 Aâ" /nVUPF Mul΋,'J8x[\VΔ۸;bêƳK55^i# tkӫq<>[r*Q_Z<qg -9ayi͑br: .x8D_(.8A4.)lxq1$2W@c$)O~nMWiLfBF`Y?;fezb')r<ǫ?9v&GiLOS3l1oFQhݦBۘM0^bȊ Мpj* [,yJ> S$q1Eb#k8`Io,rL'MP:6,0$ox1`Obrcq3 P U5{:8AuY dM^=kcyAG9n8^5N$tW\CQ1ɩiAn1kpC,Z8՚zz2W,V|SX{@n>b^]yv{lDYӁLqs/N. f#P BYVvr?^Ir , }3鮽$_Z95mq{l-4VN:ȱ5/R&HH4Zc& ʡ -R`wkm iG-'r Dߕ$?XO\G^pXݯMD`m3} ?ln#TFb|P@p6RH7Pg7}8LM4\l󷠄,x`P[<qy벫nls%n߁/^nDVm{>1 K3]Jq##W00GXkzBXSk@ ן =f"# dl*W5p-z@aeۛZC)WDOݿogȗ F*5.3퇌R2<v Sa))1-u5{2N!\Kr?s;-qWUc+4z%mƧȱď^:4ayM'[VuwuZ^Ȉi x ͟,_^6JN0brw`ӂ\Fz@OGB>¯0RU|P%"=,o& BR3(=k7Dsf9ś?뒍?meS= 5oB#{1sm#E @ tYFjҠ?<\iIv[*n=Mxd}&A.[A mP*rKΚkzv E,h1WDkĸNGVu^wleZϲ\죛kZ>pwE{ZLC7/o ^?`o>tXՄ?ٕy̯߳+@?_{>BMʦ »W% U07)Z%s8`y ^dЗ 8[g|75?K@o"> EMkWv_) }6NX\ϕncsbX6GJtƉi_<}_6E#ƒ!lc Dш]'ngt%%%c@2rsI͉s$X߾1%@*'}Y HpW"$AjXqY}{gtZ*+֕m0މ &ìK!U\Zd:@'[v0^GNB37W(g)s'^g/[KG$ARZT:տ$p‰bHW6~7rH_k>@_[9[`%He%B}mi3d&>nScPlÎEbϰu!CH^;*ӄj;}ф#N;80v 7'PyNIg< +< tEwӽùBvdPI(^Z,>A~Rj?o $B4e!hO ,gZ;*OmXHTg 6L c  sĚ|C-&M k,ٚHKb GPa{rŗ##mXeNgL=Vˤs"?*{ BxpT/K :m띠rTN' }鐝J"'XIW~ļƋnߢs1#& vݯ@yz`Enh+vkfZkR VOF)G^&g4nQhTB{s `E 3p:&Ɨĕ=uW\qg5!=5犬7|#e8:o^Wlr>TvJN@^HeP "u&~O]dX{ ̉hq6 E@vieV6+{6O6TFX-XEߪz𣣟*w־ O=4tΰ\q0WkR;w#*E1*tY5(;$7UBrMfeycd{[!1cKՓVUU:J<R~mp}PYBʐ:8SVI8J26:yGiu@vh21u$!W\%ʞ"?hE`ـvvN+v|s,.tܠ OL+-nX8<=pV耋I4 .wrHZ$U}T!0$*[dXl"m=1Yue] 'hp0-Eךhs?NH^b 6CJ$foOicC DǮ7&"|XJUf㻕և_οޞ~>V]9$)Ȍ2y ujXd/׶ C}s0T+͋*I͹b}Qu}FS/`a9 0"ac 2dYjN#nӒn*s"'eAIѥU[6Vc"7GEL<$+ѡ8WZ4Ls"m)Z"5Y֖2A.|6{oӸTzo0RIwhLgJ[ۮֱ/xshfb^7a梡ODp#3f"bCN˽WDoaڨMk˳8*LSp#;ީJ0̨W̰eueU?115~h+LS/ix<§gk 7 a<󀙔bB>9 ҭiY,Tdv&pp./eH݀.؆VRa 2 Fe˥}Ypxz02Hy-b&/'y $dʘ40"z8.:I|B3Q$ k3+Dϝ(SZ$Ff  S[m\"[4ԙ5a ~XTڝE,',uTDzh33]{_`h!BH#!+:xȚޯ;$(h&xjt^?o&2~2c||(Va#=NUǣ~%yiJ(a8꡾ŗU${T /k%n0.oN͏zΝvf4}H=tڻF)U=S“1"we0v= }&uBڷ8ۨV;%b; *ͯh$9owy1z]1RZ3:ѾxJl"k`8kz"J$`'W_dblC8Xw%3TRp^ T EŃ[B|ڂ~ͅҲr6m ]NS gTmk1% 洔k9Y$iҲR! _>w( =# QQZpTCAռj{I:~H;D&D|q9sI*{v,_6P`s5븚^ }/# } YHKb͊916JBÝ':QfojvTvJǾNfDJi'vTv У8ªbмh/ ?s@tYSMOkJOgMNY$Oɩ]}ew}Yح]UrXCaTP mfVk3 c>0dZ^F|5/o{!H'k3CY~>nF/0zJXIFc[}|U][i_$ ?vqG4\]QWY22 X𑕖}ͻaYRa!`-TtvlAp.Gа6x^"wxkT^֜bN:`OM[(c/2AE:r!̓ʧBDzAѻͦK|'gLou?~e*pVAC^a 94o8wi:b[e$N61t! o&s }hfn`&|lPVN W2z_.*`BA ̆8K~:̓sﲼ 6~F<,]Zh݋yI>ũ@zW$҆^yFƶ >WJc.n=)7V3g;5'P:-o`s6t="-d!Y cVr3>`xD cu=E I#>#K여j/gfeWnȚ29cݽ;O/9z6t_7;m0BU[xƐXlutM(Q[8\ &#08@b0n-=Ŵ]Lb~h.ХP7IvRNL/?'T=InI:__`ÀtT3~FL1 %ѱrE&v_O]T'܎'rFk!;XsU ٨!'( ?/ hPH+=[Հ8@}QO>`*eiBM`UR3KdSqT@n&AFHKW+Qd2|Փ(|:sGOi2΀ZE$/k4碊K\(`c!nN|GaL:[u1Z'ꅀ윢π#.x9VHtȄ[DGGyLJEOx! cH%\;?_㕗sou-w10pdsnABNCubFqJnyc`Ӝ(=4}̨¬.ď)TqR!ai5}l8h[͆z:5YntG$R 1:>qHH˯57Vrwhl<! -5|>}Mx_ON aީ S5ӲNy3v{)Y) KI)gpMuoޚYQA-Cߔ %O0]F aH/@N&;Y׹7Pر%,&j*M3ő8qE0$}Կh&DQǡo%%j0Kqnۂ(}! 䀎r6lKMiK[@5#w\G2*>00:WY+҃XBң3ryb.˰0V{e6T.[.΃y6O<[5aX$k>AVϜve]CnL50b茮T6’BN'f*vWV+xy!imchHyIv Ci% V٠} zc>:?{[,)ď@(OEvT{!1tbYP$kDn;Rփ|EAQ+@)渳91i^A?-}V&zdLo\)v _ipI[tAmVҡetW.I+scCw{\/3\^}:-|,w ^ᗫ۬Wk~E!'J=-3>†r6>:%E);xνIJU's S$3V:w™Sr6C?o /V1S;>0x,~OԌ%Ԥ6iIC-')"\5X_v GkڙDE}{}&5چ{jZe׆ SSp] 0r,`n%tAٕJ4F?>yBM 9_"yr`rn쬃%`E{&,^$|$J_IǃܫKpۨW{HKA2>n Oi"!#B4jSOj`4y!5׬}l Me׼ĺY7x4Wt=}>wޚ=Ek^T<"T:~ǃЗ_,((V+w2Hd\z25Q!>}Ȏl{N7 7'4wPڵA$Su4lx}(m)͊`E|t18 w\Xz,ZBK#ĆqGlB'C_>}Y>H+ΌAJ<|Mw] i#Vֻ c_7}Ufo}!{@j}Y_7tV8] PβәɆG-6W?ohUJ r2 TE*e$fsŠD$Ͽhv] lgfp3  K-l#YBs vc3e`=P#3CG ~y|Wh)ϿUbRQ/Ʌmۑb[?eם8e[pT35;Wŀ',ɰsVtB9,Qc&lAvM<+^Vj8geqzCCL[1.ǣm7׭p-˚{i(ߏus"s`ze\ 2NU;ha7/JZ{:Y;mm% f]"?9 )Vᡜ`wcl Y\2nɕV(ŀ]a3z3&y3+|tn%Bbf(;[_@fw0v5sᬳ: -Dx~d]``Ud'0y=f7ZkNh[o<nUP% 8e!>Mב 4ɆhL}X IlPޛR Rzƴ״-=J}?/5-UlPb-N*{L=2> \"Ѣԁam YNni~[n}paFQM8L} l#6h "|P}݃cge:sB|)m{~X%"%=^jw'8Uޙ1"oQT܃-Gg77Շ9;JE%ڶP0MâW1C4X=sJX",g )GOȈsGgOXOɭnCc6roJȼ3H|L5Ϭ+ߙ/O[u1b]p`vv7맺{YC&(`84 &šfSR s|2{oqyF+U'R9ȥ2rI֣mDw2 1šMe4r(PH(^,LG .FŇ{'ihލ wwh;@ vB^MgыLY)v9Onh_*iSOyPӶ?/$L٭^z<z6 ^ԅes!84W@u8*v06P֢H53ŠCRx5Nj# ˸p#[c+-aA112d#s;Lzbd|h%ZZ?b;f:#@7ٳHᩝU.fUY@>y!txƜqHeMA8*+O %~uH_]l,_= ?FxX ܕCd~vj<7jFUڊ욉z"fʰQ~Ȯbx݅uޏL#b{tie"4=sců*d@"eU{[ؐ(̾g_f$X%]`q]<6kI M*+ykw?1Eל oHGhjP %(. yUwMۣ_~]VWSg ҁ閡2Xi%mKTH")wF>v x,v?ԃ]9 #3 hM+ٌJ('brotli-3.4.0/testdata/asyoulik.txt000064400000000000000000003643731046102023000153550ustar 00000000000000 AS YOU LIKE IT DRAMATIS PERSONAE DUKE SENIOR living in banishment. DUKE FREDERICK his brother, an usurper of his dominions. AMIENS | | lords attending on the banished duke. JAQUES | LE BEAU a courtier attending upon Frederick. CHARLES wrestler to Frederick. OLIVER | | JAQUES (JAQUES DE BOYS:) | sons of Sir Rowland de Boys. | ORLANDO | ADAM | | servants to Oliver. DENNIS | TOUCHSTONE a clown. SIR OLIVER MARTEXT a vicar. CORIN | | shepherds. SILVIUS | WILLIAM a country fellow in love with Audrey. A person representing HYMEN. (HYMEN:) ROSALIND daughter to the banished duke. CELIA daughter to Frederick. PHEBE a shepherdess. AUDREY a country wench. Lords, pages, and attendants, &c. (Forester:) (A Lord:) (First Lord:) (Second Lord:) (First Page:) (Second Page:) SCENE Oliver's house; Duke Frederick's court; and the Forest of Arden. AS YOU LIKE IT ACT I SCENE I Orchard of Oliver's house. [Enter ORLANDO and ADAM] ORLANDO As I remember, Adam, it was upon this fashion bequeathed me by will but poor a thousand crowns, and, as thou sayest, charged my brother, on his blessing, to breed me well: and there begins my sadness. My brother Jaques he keeps at school, and report speaks goldenly of his profit: for my part, he keeps me rustically at home, or, to speak more properly, stays me here at home unkept; for call you that keeping for a gentleman of my birth, that differs not from the stalling of an ox? His horses are bred better; for, besides that they are fair with their feeding, they are taught their manage, and to that end riders dearly hired: but I, his brother, gain nothing under him but growth; for the which his animals on his dunghills are as much bound to him as I. Besides this nothing that he so plentifully gives me, the something that nature gave me his countenance seems to take from me: he lets me feed with his hinds, bars me the place of a brother, and, as much as in him lies, mines my gentility with my education. This is it, Adam, that grieves me; and the spirit of my father, which I think is within me, begins to mutiny against this servitude: I will no longer endure it, though yet I know no wise remedy how to avoid it. ADAM Yonder comes my master, your brother. ORLANDO Go apart, Adam, and thou shalt hear how he will shake me up. [Enter OLIVER] OLIVER Now, sir! what make you here? ORLANDO Nothing: I am not taught to make any thing. OLIVER What mar you then, sir? ORLANDO Marry, sir, I am helping you to mar that which God made, a poor unworthy brother of yours, with idleness. OLIVER Marry, sir, be better employed, and be naught awhile. ORLANDO Shall I keep your hogs and eat husks with them? What prodigal portion have I spent, that I should come to such penury? OLIVER Know you where your are, sir? ORLANDO O, sir, very well; here in your orchard. OLIVER Know you before whom, sir? ORLANDO Ay, better than him I am before knows me. I know you are my eldest brother; and, in the gentle condition of blood, you should so know me. The courtesy of nations allows you my better, in that you are the first-born; but the same tradition takes not away my blood, were there twenty brothers betwixt us: I have as much of my father in me as you; albeit, I confess, your coming before me is nearer to his reverence. OLIVER What, boy! ORLANDO Come, come, elder brother, you are too young in this. OLIVER Wilt thou lay hands on me, villain? ORLANDO I am no villain; I am the youngest son of Sir Rowland de Boys; he was my father, and he is thrice a villain that says such a father begot villains. Wert thou not my brother, I would not take this hand from thy throat till this other had pulled out thy tongue for saying so: thou hast railed on thyself. ADAM Sweet masters, be patient: for your father's remembrance, be at accord. OLIVER Let me go, I say. ORLANDO I will not, till I please: you shall hear me. My father charged you in his will to give me good education: you have trained me like a peasant, obscuring and hiding from me all gentleman-like qualities. The spirit of my father grows strong in me, and I will no longer endure it: therefore allow me such exercises as may become a gentleman, or give me the poor allottery my father left me by testament; with that I will go buy my fortunes. OLIVER And what wilt thou do? beg, when that is spent? Well, sir, get you in: I will not long be troubled with you; you shall have some part of your will: I pray you, leave me. ORLANDO I will no further offend you than becomes me for my good. OLIVER Get you with him, you old dog. ADAM Is 'old dog' my reward? Most true, I have lost my teeth in your service. God be with my old master! he would not have spoke such a word. [Exeunt ORLANDO and ADAM] OLIVER Is it even so? begin you to grow upon me? I will physic your rankness, and yet give no thousand crowns neither. Holla, Dennis! [Enter DENNIS] DENNIS Calls your worship? OLIVER Was not Charles, the duke's wrestler, here to speak with me? DENNIS So please you, he is here at the door and importunes access to you. OLIVER Call him in. [Exit DENNIS] 'Twill be a good way; and to-morrow the wrestling is. [Enter CHARLES] CHARLES Good morrow to your worship. OLIVER Good Monsieur Charles, what's the new news at the new court? CHARLES There's no news at the court, sir, but the old news: that is, the old duke is banished by his younger brother the new duke; and three or four loving lords have put themselves into voluntary exile with him, whose lands and revenues enrich the new duke; therefore he gives them good leave to wander. OLIVER Can you tell if Rosalind, the duke's daughter, be banished with her father? CHARLES O, no; for the duke's daughter, her cousin, so loves her, being ever from their cradles bred together, that she would have followed her exile, or have died to stay behind her. She is at the court, and no less beloved of her uncle than his own daughter; and never two ladies loved as they do. OLIVER Where will the old duke live? CHARLES They say he is already in the forest of Arden, and a many merry men with him; and there they live like the old Robin Hood of England: they say many young gentlemen flock to him every day, and fleet the time carelessly, as they did in the golden world. OLIVER What, you wrestle to-morrow before the new duke? CHARLES Marry, do I, sir; and I came to acquaint you with a matter. I am given, sir, secretly to understand that your younger brother Orlando hath a disposition to come in disguised against me to try a fall. To-morrow, sir, I wrestle for my credit; and he that escapes me without some broken limb shall acquit him well. Your brother is but young and tender; and, for your love, I would be loath to foil him, as I must, for my own honour, if he come in: therefore, out of my love to you, I came hither to acquaint you withal, that either you might stay him from his intendment or brook such disgrace well as he shall run into, in that it is a thing of his own search and altogether against my will. OLIVER Charles, I thank thee for thy love to me, which thou shalt find I will most kindly requite. I had myself notice of my brother's purpose herein and have by underhand means laboured to dissuade him from it, but he is resolute. I'll tell thee, Charles: it is the stubbornest young fellow of France, full of ambition, an envious emulator of every man's good parts, a secret and villanous contriver against me his natural brother: therefore use thy discretion; I had as lief thou didst break his neck as his finger. And thou wert best look to't; for if thou dost him any slight disgrace or if he do not mightily grace himself on thee, he will practise against thee by poison, entrap thee by some treacherous device and never leave thee till he hath ta'en thy life by some indirect means or other; for, I assure thee, and almost with tears I speak it, there is not one so young and so villanous this day living. I speak but brotherly of him; but should I anatomize him to thee as he is, I must blush and weep and thou must look pale and wonder. CHARLES I am heartily glad I came hither to you. If he come to-morrow, I'll give him his payment: if ever he go alone again, I'll never wrestle for prize more: and so God keep your worship! OLIVER Farewell, good Charles. [Exit CHARLES] Now will I stir this gamester: I hope I shall see an end of him; for my soul, yet I know not why, hates nothing more than he. Yet he's gentle, never schooled and yet learned, full of noble device, of all sorts enchantingly beloved, and indeed so much in the heart of the world, and especially of my own people, who best know him, that I am altogether misprised: but it shall not be so long; this wrestler shall clear all: nothing remains but that I kindle the boy thither; which now I'll go about. [Exit] AS YOU LIKE IT ACT I SCENE II Lawn before the Duke's palace. [Enter CELIA and ROSALIND] CELIA I pray thee, Rosalind, sweet my coz, be merry. ROSALIND Dear Celia, I show more mirth than I am mistress of; and would you yet I were merrier? Unless you could teach me to forget a banished father, you must not learn me how to remember any extraordinary pleasure. CELIA Herein I see thou lovest me not with the full weight that I love thee. If my uncle, thy banished father, had banished thy uncle, the duke my father, so thou hadst been still with me, I could have taught my love to take thy father for mine: so wouldst thou, if the truth of thy love to me were so righteously tempered as mine is to thee. ROSALIND Well, I will forget the condition of my estate, to rejoice in yours. CELIA You know my father hath no child but I, nor none is like to have: and, truly, when he dies, thou shalt be his heir, for what he hath taken away from thy father perforce, I will render thee again in affection; by mine honour, I will; and when I break that oath, let me turn monster: therefore, my sweet Rose, my dear Rose, be merry. ROSALIND From henceforth I will, coz, and devise sports. Let me see; what think you of falling in love? CELIA Marry, I prithee, do, to make sport withal: but love no man in good earnest; nor no further in sport neither than with safety of a pure blush thou mayst in honour come off again. ROSALIND What shall be our sport, then? CELIA Let us sit and mock the good housewife Fortune from her wheel, that her gifts may henceforth be bestowed equally. ROSALIND I would we could do so, for her benefits are mightily misplaced, and the bountiful blind woman doth most mistake in her gifts to women. CELIA 'Tis true; for those that she makes fair she scarce makes honest, and those that she makes honest she makes very ill-favouredly. ROSALIND Nay, now thou goest from Fortune's office to Nature's: Fortune reigns in gifts of the world, not in the lineaments of Nature. [Enter TOUCHSTONE] CELIA No? when Nature hath made a fair creature, may she not by Fortune fall into the fire? Though Nature hath given us wit to flout at Fortune, hath not Fortune sent in this fool to cut off the argument? ROSALIND Indeed, there is Fortune too hard for Nature, when Fortune makes Nature's natural the cutter-off of Nature's wit. CELIA Peradventure this is not Fortune's work neither, but Nature's; who perceiveth our natural wits too dull to reason of such goddesses and hath sent this natural for our whetstone; for always the dulness of the fool is the whetstone of the wits. How now, wit! whither wander you? TOUCHSTONE Mistress, you must come away to your father. CELIA Were you made the messenger? TOUCHSTONE No, by mine honour, but I was bid to come for you. ROSALIND Where learned you that oath, fool? TOUCHSTONE Of a certain knight that swore by his honour they were good pancakes and swore by his honour the mustard was naught: now I'll stand to it, the pancakes were naught and the mustard was good, and yet was not the knight forsworn. CELIA How prove you that, in the great heap of your knowledge? ROSALIND Ay, marry, now unmuzzle your wisdom. TOUCHSTONE Stand you both forth now: stroke your chins, and swear by your beards that I am a knave. CELIA By our beards, if we had them, thou art. TOUCHSTONE By my knavery, if I had it, then I were; but if you swear by that that is not, you are not forsworn: no more was this knight swearing by his honour, for he never had any; or if he had, he had sworn it away before ever he saw those pancakes or that mustard. CELIA Prithee, who is't that thou meanest? TOUCHSTONE One that old Frederick, your father, loves. CELIA My father's love is enough to honour him: enough! speak no more of him; you'll be whipped for taxation one of these days. TOUCHSTONE The more pity, that fools may not speak wisely what wise men do foolishly. CELIA By my troth, thou sayest true; for since the little wit that fools have was silenced, the little foolery that wise men have makes a great show. Here comes Monsieur Le Beau. ROSALIND With his mouth full of news. CELIA Which he will put on us, as pigeons feed their young. ROSALIND Then shall we be news-crammed. CELIA All the better; we shall be the more marketable. [Enter LE BEAU] Bon jour, Monsieur Le Beau: what's the news? LE BEAU Fair princess, you have lost much good sport. CELIA Sport! of what colour? LE BEAU What colour, madam! how shall I answer you? ROSALIND As wit and fortune will. TOUCHSTONE Or as the Destinies decree. CELIA Well said: that was laid on with a trowel. TOUCHSTONE Nay, if I keep not my rank,-- ROSALIND Thou losest thy old smell. LE BEAU You amaze me, ladies: I would have told you of good wrestling, which you have lost the sight of. ROSALIND You tell us the manner of the wrestling. LE BEAU I will tell you the beginning; and, if it please your ladyships, you may see the end; for the best is yet to do; and here, where you are, they are coming to perform it. CELIA Well, the beginning, that is dead and buried. LE BEAU There comes an old man and his three sons,-- CELIA I could match this beginning with an old tale. LE BEAU Three proper young men, of excellent growth and presence. ROSALIND With bills on their necks, 'Be it known unto all men by these presents.' LE BEAU The eldest of the three wrestled with Charles, the duke's wrestler; which Charles in a moment threw him and broke three of his ribs, that there is little hope of life in him: so he served the second, and so the third. Yonder they lie; the poor old man, their father, making such pitiful dole over them that all the beholders take his part with weeping. ROSALIND Alas! TOUCHSTONE But what is the sport, monsieur, that the ladies have lost? LE BEAU Why, this that I speak of. TOUCHSTONE Thus men may grow wiser every day: it is the first time that ever I heard breaking of ribs was sport for ladies. CELIA Or I, I promise thee. ROSALIND But is there any else longs to see this broken music in his sides? is there yet another dotes upon rib-breaking? Shall we see this wrestling, cousin? LE BEAU You must, if you stay here; for here is the place appointed for the wrestling, and they are ready to perform it. CELIA Yonder, sure, they are coming: let us now stay and see it. [Flourish. Enter DUKE FREDERICK, Lords, ORLANDO, CHARLES, and Attendants] DUKE FREDERICK Come on: since the youth will not be entreated, his own peril on his forwardness. ROSALIND Is yonder the man? LE BEAU Even he, madam. CELIA Alas, he is too young! yet he looks successfully. DUKE FREDERICK How now, daughter and cousin! are you crept hither to see the wrestling? ROSALIND Ay, my liege, so please you give us leave. DUKE FREDERICK You will take little delight in it, I can tell you; there is such odds in the man. In pity of the challenger's youth I would fain dissuade him, but he will not be entreated. Speak to him, ladies; see if you can move him. CELIA Call him hither, good Monsieur Le Beau. DUKE FREDERICK Do so: I'll not be by. LE BEAU Monsieur the challenger, the princesses call for you. ORLANDO I attend them with all respect and duty. ROSALIND Young man, have you challenged Charles the wrestler? ORLANDO No, fair princess; he is the general challenger: I come but in, as others do, to try with him the strength of my youth. CELIA Young gentleman, your spirits are too bold for your years. You have seen cruel proof of this man's strength: if you saw yourself with your eyes or knew yourself with your judgment, the fear of your adventure would counsel you to a more equal enterprise. We pray you, for your own sake, to embrace your own safety and give over this attempt. ROSALIND Do, young sir; your reputation shall not therefore be misprised: we will make it our suit to the duke that the wrestling might not go forward. ORLANDO I beseech you, punish me not with your hard thoughts; wherein I confess me much guilty, to deny so fair and excellent ladies any thing. But let your fair eyes and gentle wishes go with me to my trial: wherein if I be foiled, there is but one shamed that was never gracious; if killed, but one dead that was willing to be so: I shall do my friends no wrong, for I have none to lament me, the world no injury, for in it I have nothing; only in the world I fill up a place, which may be better supplied when I have made it empty. ROSALIND The little strength that I have, I would it were with you. CELIA And mine, to eke out hers. ROSALIND Fare you well: pray heaven I be deceived in you! CELIA Your heart's desires be with you! CHARLES Come, where is this young gallant that is so desirous to lie with his mother earth? ORLANDO Ready, sir; but his will hath in it a more modest working. DUKE FREDERICK You shall try but one fall. CHARLES No, I warrant your grace, you shall not entreat him to a second, that have so mightily persuaded him from a first. ORLANDO An you mean to mock me after, you should not have mocked me before: but come your ways. ROSALIND Now Hercules be thy speed, young man! CELIA I would I were invisible, to catch the strong fellow by the leg. [They wrestle] ROSALIND O excellent young man! CELIA If I had a thunderbolt in mine eye, I can tell who should down. [Shout. CHARLES is thrown] DUKE FREDERICK No more, no more. ORLANDO Yes, I beseech your grace: I am not yet well breathed. DUKE FREDERICK How dost thou, Charles? LE BEAU He cannot speak, my lord. DUKE FREDERICK Bear him away. What is thy name, young man? ORLANDO Orlando, my liege; the youngest son of Sir Rowland de Boys. DUKE FREDERICK I would thou hadst been son to some man else: The world esteem'd thy father honourable, But I did find him still mine enemy: Thou shouldst have better pleased me with this deed, Hadst thou descended from another house. But fare thee well; thou art a gallant youth: I would thou hadst told me of another father. [Exeunt DUKE FREDERICK, train, and LE BEAU] CELIA Were I my father, coz, would I do this? ORLANDO I am more proud to be Sir Rowland's son, His youngest son; and would not change that calling, To be adopted heir to Frederick. ROSALIND My father loved Sir Rowland as his soul, And all the world was of my father's mind: Had I before known this young man his son, I should have given him tears unto entreaties, Ere he should thus have ventured. CELIA Gentle cousin, Let us go thank him and encourage him: My father's rough and envious disposition Sticks me at heart. Sir, you have well deserved: If you do keep your promises in love But justly, as you have exceeded all promise, Your mistress shall be happy. ROSALIND Gentleman, [Giving him a chain from her neck] Wear this for me, one out of suits with fortune, That could give more, but that her hand lacks means. Shall we go, coz? CELIA Ay. Fare you well, fair gentleman. ORLANDO Can I not say, I thank you? My better parts Are all thrown down, and that which here stands up Is but a quintain, a mere lifeless block. ROSALIND He calls us back: my pride fell with my fortunes; I'll ask him what he would. Did you call, sir? Sir, you have wrestled well and overthrown More than your enemies. CELIA Will you go, coz? ROSALIND Have with you. Fare you well. [Exeunt ROSALIND and CELIA] ORLANDO What passion hangs these weights upon my tongue? I cannot speak to her, yet she urged conference. O poor Orlando, thou art overthrown! Or Charles or something weaker masters thee. [Re-enter LE BEAU] LE BEAU Good sir, I do in friendship counsel you To leave this place. Albeit you have deserved High commendation, true applause and love, Yet such is now the duke's condition That he misconstrues all that you have done. The duke is humorous; what he is indeed, More suits you to conceive than I to speak of. ORLANDO I thank you, sir: and, pray you, tell me this: Which of the two was daughter of the duke That here was at the wrestling? LE BEAU Neither his daughter, if we judge by manners; But yet indeed the lesser is his daughter The other is daughter to the banish'd duke, And here detain'd by her usurping uncle, To keep his daughter company; whose loves Are dearer than the natural bond of sisters. But I can tell you that of late this duke Hath ta'en displeasure 'gainst his gentle niece, Grounded upon no other argument But that the people praise her for her virtues And pity her for her good father's sake; And, on my life, his malice 'gainst the lady Will suddenly break forth. Sir, fare you well: Hereafter, in a better world than this, I shall desire more love and knowledge of you. ORLANDO I rest much bounden to you: fare you well. [Exit LE BEAU] Thus must I from the smoke into the smother; From tyrant duke unto a tyrant brother: But heavenly Rosalind! [Exit] AS YOU LIKE IT ACT I SCENE III A room in the palace. [Enter CELIA and ROSALIND] CELIA Why, cousin! why, Rosalind! Cupid have mercy! not a word? ROSALIND Not one to throw at a dog. CELIA No, thy words are too precious to be cast away upon curs; throw some of them at me; come, lame me with reasons. ROSALIND Then there were two cousins laid up; when the one should be lamed with reasons and the other mad without any. CELIA But is all this for your father? ROSALIND No, some of it is for my child's father. O, how full of briers is this working-day world! CELIA They are but burs, cousin, thrown upon thee in holiday foolery: if we walk not in the trodden paths our very petticoats will catch them. ROSALIND I could shake them off my coat: these burs are in my heart. CELIA Hem them away. ROSALIND I would try, if I could cry 'hem' and have him. CELIA Come, come, wrestle with thy affections. ROSALIND O, they take the part of a better wrestler than myself! CELIA O, a good wish upon you! you will try in time, in despite of a fall. But, turning these jests out of service, let us talk in good earnest: is it possible, on such a sudden, you should fall into so strong a liking with old Sir Rowland's youngest son? ROSALIND The duke my father loved his father dearly. CELIA Doth it therefore ensue that you should love his son dearly? By this kind of chase, I should hate him, for my father hated his father dearly; yet I hate not Orlando. ROSALIND No, faith, hate him not, for my sake. CELIA Why should I not? doth he not deserve well? ROSALIND Let me love him for that, and do you love him because I do. Look, here comes the duke. CELIA With his eyes full of anger. [Enter DUKE FREDERICK, with Lords] DUKE FREDERICK Mistress, dispatch you with your safest haste And get you from our court. ROSALIND Me, uncle? DUKE FREDERICK You, cousin Within these ten days if that thou be'st found So near our public court as twenty miles, Thou diest for it. ROSALIND I do beseech your grace, Let me the knowledge of my fault bear with me: If with myself I hold intelligence Or have acquaintance with mine own desires, If that I do not dream or be not frantic,-- As I do trust I am not--then, dear uncle, Never so much as in a thought unborn Did I offend your highness. DUKE FREDERICK Thus do all traitors: If their purgation did consist in words, They are as innocent as grace itself: Let it suffice thee that I trust thee not. ROSALIND Yet your mistrust cannot make me a traitor: Tell me whereon the likelihood depends. DUKE FREDERICK Thou art thy father's daughter; there's enough. ROSALIND So was I when your highness took his dukedom; So was I when your highness banish'd him: Treason is not inherited, my lord; Or, if we did derive it from our friends, What's that to me? my father was no traitor: Then, good my liege, mistake me not so much To think my poverty is treacherous. CELIA Dear sovereign, hear me speak. DUKE FREDERICK Ay, Celia; we stay'd her for your sake, Else had she with her father ranged along. CELIA I did not then entreat to have her stay; It was your pleasure and your own remorse: I was too young that time to value her; But now I know her: if she be a traitor, Why so am I; we still have slept together, Rose at an instant, learn'd, play'd, eat together, And wheresoever we went, like Juno's swans, Still we went coupled and inseparable. DUKE FREDERICK She is too subtle for thee; and her smoothness, Her very silence and her patience Speak to the people, and they pity her. Thou art a fool: she robs thee of thy name; And thou wilt show more bright and seem more virtuous When she is gone. Then open not thy lips: Firm and irrevocable is my doom Which I have pass'd upon her; she is banish'd. CELIA Pronounce that sentence then on me, my liege: I cannot live out of her company. DUKE FREDERICK You are a fool. You, niece, provide yourself: If you outstay the time, upon mine honour, And in the greatness of my word, you die. [Exeunt DUKE FREDERICK and Lords] CELIA O my poor Rosalind, whither wilt thou go? Wilt thou change fathers? I will give thee mine. I charge thee, be not thou more grieved than I am. ROSALIND I have more cause. CELIA Thou hast not, cousin; Prithee be cheerful: know'st thou not, the duke Hath banish'd me, his daughter? ROSALIND That he hath not. CELIA No, hath not? Rosalind lacks then the love Which teacheth thee that thou and I am one: Shall we be sunder'd? shall we part, sweet girl? No: let my father seek another heir. Therefore devise with me how we may fly, Whither to go and what to bear with us; And do not seek to take your change upon you, To bear your griefs yourself and leave me out; For, by this heaven, now at our sorrows pale, Say what thou canst, I'll go along with thee. ROSALIND Why, whither shall we go? CELIA To seek my uncle in the forest of Arden. ROSALIND Alas, what danger will it be to us, Maids as we are, to travel forth so far! Beauty provoketh thieves sooner than gold. CELIA I'll put myself in poor and mean attire And with a kind of umber smirch my face; The like do you: so shall we pass along And never stir assailants. ROSALIND Were it not better, Because that I am more than common tall, That I did suit me all points like a man? A gallant curtle-axe upon my thigh, A boar-spear in my hand; and--in my heart Lie there what hidden woman's fear there will-- We'll have a swashing and a martial outside, As many other mannish cowards have That do outface it with their semblances. CELIA What shall I call thee when thou art a man? ROSALIND I'll have no worse a name than Jove's own page; And therefore look you call me Ganymede. But what will you be call'd? CELIA Something that hath a reference to my state No longer Celia, but Aliena. ROSALIND But, cousin, what if we assay'd to steal The clownish fool out of your father's court? Would he not be a comfort to our travel? CELIA He'll go along o'er the wide world with me; Leave me alone to woo him. Let's away, And get our jewels and our wealth together, Devise the fittest time and safest way To hide us from pursuit that will be made After my flight. Now go we in content To liberty and not to banishment. [Exeunt] AS YOU LIKE IT ACT II SCENE I The Forest of Arden. [Enter DUKE SENIOR, AMIENS, and two or three Lords, like foresters] DUKE SENIOR Now, my co-mates and brothers in exile, Hath not old custom made this life more sweet Than that of painted pomp? Are not these woods More free from peril than the envious court? Here feel we but the penalty of Adam, The seasons' difference, as the icy fang And churlish chiding of the winter's wind, Which, when it bites and blows upon my body, Even till I shrink with cold, I smile and say 'This is no flattery: these are counsellors That feelingly persuade me what I am.' Sweet are the uses of adversity, Which, like the toad, ugly and venomous, Wears yet a precious jewel in his head; And this our life exempt from public haunt Finds tongues in trees, books in the running brooks, Sermons in stones and good in every thing. I would not change it. AMIENS Happy is your grace, That can translate the stubbornness of fortune Into so quiet and so sweet a style. DUKE SENIOR Come, shall we go and kill us venison? And yet it irks me the poor dappled fools, Being native burghers of this desert city, Should in their own confines with forked heads Have their round haunches gored. First Lord Indeed, my lord, The melancholy Jaques grieves at that, And, in that kind, swears you do more usurp Than doth your brother that hath banish'd you. To-day my Lord of Amiens and myself Did steal behind him as he lay along Under an oak whose antique root peeps out Upon the brook that brawls along this wood: To the which place a poor sequester'd stag, That from the hunter's aim had ta'en a hurt, Did come to languish, and indeed, my lord, The wretched animal heaved forth such groans That their discharge did stretch his leathern coat Almost to bursting, and the big round tears Coursed one another down his innocent nose In piteous chase; and thus the hairy fool Much marked of the melancholy Jaques, Stood on the extremest verge of the swift brook, Augmenting it with tears. DUKE SENIOR But what said Jaques? Did he not moralize this spectacle? First Lord O, yes, into a thousand similes. First, for his weeping into the needless stream; 'Poor deer,' quoth he, 'thou makest a testament As worldlings do, giving thy sum of more To that which had too much:' then, being there alone, Left and abandon'd of his velvet friends, ''Tis right:' quoth he; 'thus misery doth part The flux of company:' anon a careless herd, Full of the pasture, jumps along by him And never stays to greet him; 'Ay' quoth Jaques, 'Sweep on, you fat and greasy citizens; 'Tis just the fashion: wherefore do you look Upon that poor and broken bankrupt there?' Thus most invectively he pierceth through The body of the country, city, court, Yea, and of this our life, swearing that we Are mere usurpers, tyrants and what's worse, To fright the animals and to kill them up In their assign'd and native dwelling-place. DUKE SENIOR And did you leave him in this contemplation? Second Lord We did, my lord, weeping and commenting Upon the sobbing deer. DUKE SENIOR Show me the place: I love to cope him in these sullen fits, For then he's full of matter. First Lord I'll bring you to him straight. [Exeunt] AS YOU LIKE IT ACT II SCENE II A room in the palace. [Enter DUKE FREDERICK, with Lords] DUKE FREDERICK Can it be possible that no man saw them? It cannot be: some villains of my court Are of consent and sufferance in this. First Lord I cannot hear of any that did see her. The ladies, her attendants of her chamber, Saw her abed, and in the morning early They found the bed untreasured of their mistress. Second Lord My lord, the roynish clown, at whom so oft Your grace was wont to laugh, is also missing. Hisperia, the princess' gentlewoman, Confesses that she secretly o'erheard Your daughter and her cousin much commend The parts and graces of the wrestler That did but lately foil the sinewy Charles; And she believes, wherever they are gone, That youth is surely in their company. DUKE FREDERICK Send to his brother; fetch that gallant hither; If he be absent, bring his brother to me; I'll make him find him: do this suddenly, And let not search and inquisition quail To bring again these foolish runaways. [Exeunt] AS YOU LIKE IT ACT II SCENE III Before OLIVER'S house. [Enter ORLANDO and ADAM, meeting] ORLANDO Who's there? ADAM What, my young master? O, my gentle master! O my sweet master! O you memory Of old Sir Rowland! why, what make you here? Why are you virtuous? why do people love you? And wherefore are you gentle, strong and valiant? Why would you be so fond to overcome The bonny priser of the humorous duke? Your praise is come too swiftly home before you. Know you not, master, to some kind of men Their graces serve them but as enemies? No more do yours: your virtues, gentle master, Are sanctified and holy traitors to you. O, what a world is this, when what is comely Envenoms him that bears it! ORLANDO Why, what's the matter? ADAM O unhappy youth! Come not within these doors; within this roof The enemy of all your graces lives: Your brother--no, no brother; yet the son-- Yet not the son, I will not call him son Of him I was about to call his father-- Hath heard your praises, and this night he means To burn the lodging where you use to lie And you within it: if he fail of that, He will have other means to cut you off. I overheard him and his practises. This is no place; this house is but a butchery: Abhor it, fear it, do not enter it. ORLANDO Why, whither, Adam, wouldst thou have me go? ADAM No matter whither, so you come not here. ORLANDO What, wouldst thou have me go and beg my food? Or with a base and boisterous sword enforce A thievish living on the common road? This I must do, or know not what to do: Yet this I will not do, do how I can; I rather will subject me to the malice Of a diverted blood and bloody brother. ADAM But do not so. I have five hundred crowns, The thrifty hire I saved under your father, Which I did store to be my foster-nurse When service should in my old limbs lie lame And unregarded age in corners thrown: Take that, and He that doth the ravens feed, Yea, providently caters for the sparrow, Be comfort to my age! Here is the gold; And all this I give you. Let me be your servant: Though I look old, yet I am strong and lusty; For in my youth I never did apply Hot and rebellious liquors in my blood, Nor did not with unbashful forehead woo The means of weakness and debility; Therefore my age is as a lusty winter, Frosty, but kindly: let me go with you; I'll do the service of a younger man In all your business and necessities. ORLANDO O good old man, how well in thee appears The constant service of the antique world, When service sweat for duty, not for meed! Thou art not for the fashion of these times, Where none will sweat but for promotion, And having that, do choke their service up Even with the having: it is not so with thee. But, poor old man, thou prunest a rotten tree, That cannot so much as a blossom yield In lieu of all thy pains and husbandry But come thy ways; well go along together, And ere we have thy youthful wages spent, We'll light upon some settled low content. ADAM Master, go on, and I will follow thee, To the last gasp, with truth and loyalty. From seventeen years till now almost fourscore Here lived I, but now live here no more. At seventeen years many their fortunes seek; But at fourscore it is too late a week: Yet fortune cannot recompense me better Than to die well and not my master's debtor. [Exeunt] AS YOU LIKE IT ACT II SCENE IV The Forest of Arden. [Enter ROSALIND for Ganymede, CELIA for Aliena, and TOUCHSTONE] ROSALIND O Jupiter, how weary are my spirits! TOUCHSTONE I care not for my spirits, if my legs were not weary. ROSALIND I could find in my heart to disgrace my man's apparel and to cry like a woman; but I must comfort the weaker vessel, as doublet and hose ought to show itself courageous to petticoat: therefore courage, good Aliena! CELIA I pray you, bear with me; I cannot go no further. TOUCHSTONE For my part, I had rather bear with you than bear you; yet I should bear no cross if I did bear you, for I think you have no money in your purse. ROSALIND Well, this is the forest of Arden. TOUCHSTONE Ay, now am I in Arden; the more fool I; when I was at home, I was in a better place: but travellers must be content. ROSALIND Ay, be so, good Touchstone. [Enter CORIN and SILVIUS] Look you, who comes here; a young man and an old in solemn talk. CORIN That is the way to make her scorn you still. SILVIUS O Corin, that thou knew'st how I do love her! CORIN I partly guess; for I have loved ere now. SILVIUS No, Corin, being old, thou canst not guess, Though in thy youth thou wast as true a lover As ever sigh'd upon a midnight pillow: But if thy love were ever like to mine-- As sure I think did never man love so-- How many actions most ridiculous Hast thou been drawn to by thy fantasy? CORIN Into a thousand that I have forgotten. SILVIUS O, thou didst then ne'er love so heartily! If thou remember'st not the slightest folly That ever love did make thee run into, Thou hast not loved: Or if thou hast not sat as I do now, Wearying thy hearer in thy mistress' praise, Thou hast not loved: Or if thou hast not broke from company Abruptly, as my passion now makes me, Thou hast not loved. O Phebe, Phebe, Phebe! [Exit] ROSALIND Alas, poor shepherd! searching of thy wound, I have by hard adventure found mine own. TOUCHSTONE And I mine. I remember, when I was in love I broke my sword upon a stone and bid him take that for coming a-night to Jane Smile; and I remember the kissing of her batlet and the cow's dugs that her pretty chopt hands had milked; and I remember the wooing of a peascod instead of her, from whom I took two cods and, giving her them again, said with weeping tears 'Wear these for my sake.' We that are true lovers run into strange capers; but as all is mortal in nature, so is all nature in love mortal in folly. ROSALIND Thou speakest wiser than thou art ware of. TOUCHSTONE Nay, I shall ne'er be ware of mine own wit till I break my shins against it. ROSALIND Jove, Jove! this shepherd's passion Is much upon my fashion. TOUCHSTONE And mine; but it grows something stale with me. CELIA I pray you, one of you question yond man If he for gold will give us any food: I faint almost to death. TOUCHSTONE Holla, you clown! ROSALIND Peace, fool: he's not thy kinsman. CORIN Who calls? TOUCHSTONE Your betters, sir. CORIN Else are they very wretched. ROSALIND Peace, I say. Good even to you, friend. CORIN And to you, gentle sir, and to you all. ROSALIND I prithee, shepherd, if that love or gold Can in this desert place buy entertainment, Bring us where we may rest ourselves and feed: Here's a young maid with travel much oppress'd And faints for succor. CORIN Fair sir, I pity her And wish, for her sake more than for mine own, My fortunes were more able to relieve her; But I am shepherd to another man And do not shear the fleeces that I graze: My master is of churlish disposition And little recks to find the way to heaven By doing deeds of hospitality: Besides, his cote, his flocks and bounds of feed Are now on sale, and at our sheepcote now, By reason of his absence, there is nothing That you will feed on; but what is, come see. And in my voice most welcome shall you be. ROSALIND What is he that shall buy his flock and pasture? CORIN That young swain that you saw here but erewhile, That little cares for buying any thing. ROSALIND I pray thee, if it stand with honesty, Buy thou the cottage, pasture and the flock, And thou shalt have to pay for it of us. CELIA And we will mend thy wages. I like this place. And willingly could waste my time in it. CORIN Assuredly the thing is to be sold: Go with me: if you like upon report The soil, the profit and this kind of life, I will your very faithful feeder be And buy it with your gold right suddenly. [Exeunt] AS YOU LIKE IT ACT II SCENE V The Forest. [Enter AMIENS, JAQUES, and others] SONG. AMIENS Under the greenwood tree Who loves to lie with me, And turn his merry note Unto the sweet bird's throat, Come hither, come hither, come hither: Here shall he see No enemy But winter and rough weather. JAQUES More, more, I prithee, more. AMIENS It will make you melancholy, Monsieur Jaques. JAQUES I thank it. More, I prithee, more. I can suck melancholy out of a song, as a weasel sucks eggs. More, I prithee, more. AMIENS My voice is ragged: I know I cannot please you. JAQUES I do not desire you to please me; I do desire you to sing. Come, more; another stanzo: call you 'em stanzos? AMIENS What you will, Monsieur Jaques. JAQUES Nay, I care not for their names; they owe me nothing. Will you sing? AMIENS More at your request than to please myself. JAQUES Well then, if ever I thank any man, I'll thank you; but that they call compliment is like the encounter of two dog-apes, and when a man thanks me heartily, methinks I have given him a penny and he renders me the beggarly thanks. Come, sing; and you that will not, hold your tongues. AMIENS Well, I'll end the song. Sirs, cover the while; the duke will drink under this tree. He hath been all this day to look you. JAQUES And I have been all this day to avoid him. He is too disputable for my company: I think of as many matters as he, but I give heaven thanks and make no boast of them. Come, warble, come. SONG. Who doth ambition shun [All together here] And loves to live i' the sun, Seeking the food he eats And pleased with what he gets, Come hither, come hither, come hither: Here shall he see No enemy But winter and rough weather. JAQUES I'll give you a verse to this note that I made yesterday in despite of my invention. AMIENS And I'll sing it. JAQUES Thus it goes:-- If it do come to pass That any man turn ass, Leaving his wealth and ease, A stubborn will to please, Ducdame, ducdame, ducdame: Here shall he see Gross fools as he, An if he will come to me. AMIENS What's that 'ducdame'? JAQUES 'Tis a Greek invocation, to call fools into a circle. I'll go sleep, if I can; if I cannot, I'll rail against all the first-born of Egypt. AMIENS And I'll go seek the duke: his banquet is prepared. [Exeunt severally] AS YOU LIKE IT ACT II SCENE VI The forest. [Enter ORLANDO and ADAM] ADAM Dear master, I can go no further. O, I die for food! Here lie I down, and measure out my grave. Farewell, kind master. ORLANDO Why, how now, Adam! no greater heart in thee? Live a little; comfort a little; cheer thyself a little. If this uncouth forest yield any thing savage, I will either be food for it or bring it for food to thee. Thy conceit is nearer death than thy powers. For my sake be comfortable; hold death awhile at the arm's end: I will here be with thee presently; and if I bring thee not something to eat, I will give thee leave to die: but if thou diest before I come, thou art a mocker of my labour. Well said! thou lookest cheerly, and I'll be with thee quickly. Yet thou liest in the bleak air: come, I will bear thee to some shelter; and thou shalt not die for lack of a dinner, if there live any thing in this desert. Cheerly, good Adam! [Exeunt] AS YOU LIKE IT ACT II SCENE VII The forest. [A table set out. Enter DUKE SENIOR, AMIENS, and Lords like outlaws] DUKE SENIOR I think he be transform'd into a beast; For I can no where find him like a man. First Lord My lord, he is but even now gone hence: Here was he merry, hearing of a song. DUKE SENIOR If he, compact of jars, grow musical, We shall have shortly discord in the spheres. Go, seek him: tell him I would speak with him. [Enter JAQUES] First Lord He saves my labour by his own approach. DUKE SENIOR Why, how now, monsieur! what a life is this, That your poor friends must woo your company? What, you look merrily! JAQUES A fool, a fool! I met a fool i' the forest, A motley fool; a miserable world! As I do live by food, I met a fool Who laid him down and bask'd him in the sun, And rail'd on Lady Fortune in good terms, In good set terms and yet a motley fool. 'Good morrow, fool,' quoth I. 'No, sir,' quoth he, 'Call me not fool till heaven hath sent me fortune:' And then he drew a dial from his poke, And, looking on it with lack-lustre eye, Says very wisely, 'It is ten o'clock: Thus we may see,' quoth he, 'how the world wags: 'Tis but an hour ago since it was nine, And after one hour more 'twill be eleven; And so, from hour to hour, we ripe and ripe, And then, from hour to hour, we rot and rot; And thereby hangs a tale.' When I did hear The motley fool thus moral on the time, My lungs began to crow like chanticleer, That fools should be so deep-contemplative, And I did laugh sans intermission An hour by his dial. O noble fool! A worthy fool! Motley's the only wear. DUKE SENIOR What fool is this? JAQUES O worthy fool! One that hath been a courtier, And says, if ladies be but young and fair, They have the gift to know it: and in his brain, Which is as dry as the remainder biscuit After a voyage, he hath strange places cramm'd With observation, the which he vents In mangled forms. O that I were a fool! I am ambitious for a motley coat. DUKE SENIOR Thou shalt have one. JAQUES It is my only suit; Provided that you weed your better judgments Of all opinion that grows rank in them That I am wise. I must have liberty Withal, as large a charter as the wind, To blow on whom I please; for so fools have; And they that are most galled with my folly, They most must laugh. And why, sir, must they so? The 'why' is plain as way to parish church: He that a fool doth very wisely hit Doth very foolishly, although he smart, Not to seem senseless of the bob: if not, The wise man's folly is anatomized Even by the squandering glances of the fool. Invest me in my motley; give me leave To speak my mind, and I will through and through Cleanse the foul body of the infected world, If they will patiently receive my medicine. DUKE SENIOR Fie on thee! I can tell what thou wouldst do. JAQUES What, for a counter, would I do but good? DUKE SENIOR Most mischievous foul sin, in chiding sin: For thou thyself hast been a libertine, As sensual as the brutish sting itself; And all the embossed sores and headed evils, That thou with licence of free foot hast caught, Wouldst thou disgorge into the general world. JAQUES Why, who cries out on pride, That can therein tax any private party? Doth it not flow as hugely as the sea, Till that the weary very means do ebb? What woman in the city do I name, When that I say the city-woman bears The cost of princes on unworthy shoulders? Who can come in and say that I mean her, When such a one as she such is her neighbour? Or what is he of basest function That says his bravery is not of my cost, Thinking that I mean him, but therein suits His folly to the mettle of my speech? There then; how then? what then? Let me see wherein My tongue hath wrong'd him: if it do him right, Then he hath wrong'd himself; if he be free, Why then my taxing like a wild-goose flies, Unclaim'd of any man. But who comes here? [Enter ORLANDO, with his sword drawn] ORLANDO Forbear, and eat no more. JAQUES Why, I have eat none yet. ORLANDO Nor shalt not, till necessity be served. JAQUES Of what kind should this cock come of? DUKE SENIOR Art thou thus bolden'd, man, by thy distress, Or else a rude despiser of good manners, That in civility thou seem'st so empty? ORLANDO You touch'd my vein at first: the thorny point Of bare distress hath ta'en from me the show Of smooth civility: yet am I inland bred And know some nurture. But forbear, I say: He dies that touches any of this fruit Till I and my affairs are answered. JAQUES An you will not be answered with reason, I must die. DUKE SENIOR What would you have? Your gentleness shall force More than your force move us to gentleness. ORLANDO I almost die for food; and let me have it. DUKE SENIOR Sit down and feed, and welcome to our table. ORLANDO Speak you so gently? Pardon me, I pray you: I thought that all things had been savage here; And therefore put I on the countenance Of stern commandment. But whate'er you are That in this desert inaccessible, Under the shade of melancholy boughs, Lose and neglect the creeping hours of time If ever you have look'd on better days, If ever been where bells have knoll'd to church, If ever sat at any good man's feast, If ever from your eyelids wiped a tear And know what 'tis to pity and be pitied, Let gentleness my strong enforcement be: In the which hope I blush, and hide my sword. DUKE SENIOR True is it that we have seen better days, And have with holy bell been knoll'd to church And sat at good men's feasts and wiped our eyes Of drops that sacred pity hath engender'd: And therefore sit you down in gentleness And take upon command what help we have That to your wanting may be minister'd. ORLANDO Then but forbear your food a little while, Whiles, like a doe, I go to find my fawn And give it food. There is an old poor man, Who after me hath many a weary step Limp'd in pure love: till he be first sufficed, Oppress'd with two weak evils, age and hunger, I will not touch a bit. DUKE SENIOR Go find him out, And we will nothing waste till you return. ORLANDO I thank ye; and be blest for your good comfort! [Exit] DUKE SENIOR Thou seest we are not all alone unhappy: This wide and universal theatre Presents more woeful pageants than the scene Wherein we play in. JAQUES All the world's a stage, And all the men and women merely players: They have their exits and their entrances; And one man in his time plays many parts, His acts being seven ages. At first the infant, Mewling and puking in the nurse's arms. And then the whining school-boy, with his satchel And shining morning face, creeping like snail Unwillingly to school. And then the lover, Sighing like furnace, with a woeful ballad Made to his mistress' eyebrow. Then a soldier, Full of strange oaths and bearded like the pard, Jealous in honour, sudden and quick in quarrel, Seeking the bubble reputation Even in the cannon's mouth. And then the justice, In fair round belly with good capon lined, With eyes severe and beard of formal cut, Full of wise saws and modern instances; And so he plays his part. The sixth age shifts Into the lean and slipper'd pantaloon, With spectacles on nose and pouch on side, His youthful hose, well saved, a world too wide For his shrunk shank; and his big manly voice, Turning again toward childish treble, pipes And whistles in his sound. Last scene of all, That ends this strange eventful history, Is second childishness and mere oblivion, Sans teeth, sans eyes, sans taste, sans everything. [Re-enter ORLANDO, with ADAM] DUKE SENIOR Welcome. Set down your venerable burthen, And let him feed. ORLANDO I thank you most for him. ADAM So had you need: I scarce can speak to thank you for myself. DUKE SENIOR Welcome; fall to: I will not trouble you As yet, to question you about your fortunes. Give us some music; and, good cousin, sing. SONG. AMIENS Blow, blow, thou winter wind. Thou art not so unkind As man's ingratitude; Thy tooth is not so keen, Because thou art not seen, Although thy breath be rude. Heigh-ho! sing, heigh-ho! unto the green holly: Most friendship is feigning, most loving mere folly: Then, heigh-ho, the holly! This life is most jolly. Freeze, freeze, thou bitter sky, That dost not bite so nigh As benefits forgot: Though thou the waters warp, Thy sting is not so sharp As friend remember'd not. Heigh-ho! sing, &c. DUKE SENIOR If that you were the good Sir Rowland's son, As you have whisper'd faithfully you were, And as mine eye doth his effigies witness Most truly limn'd and living in your face, Be truly welcome hither: I am the duke That loved your father: the residue of your fortune, Go to my cave and tell me. Good old man, Thou art right welcome as thy master is. Support him by the arm. Give me your hand, And let me all your fortunes understand. [Exeunt] AS YOU LIKE IT ACT III SCENE I A room in the palace. [Enter DUKE FREDERICK, Lords, and OLIVER] DUKE FREDERICK Not see him since? Sir, sir, that cannot be: But were I not the better part made mercy, I should not seek an absent argument Of my revenge, thou present. But look to it: Find out thy brother, wheresoe'er he is; Seek him with candle; bring him dead or living Within this twelvemonth, or turn thou no more To seek a living in our territory. Thy lands and all things that thou dost call thine Worth seizure do we seize into our hands, Till thou canst quit thee by thy brothers mouth Of what we think against thee. OLIVER O that your highness knew my heart in this! I never loved my brother in my life. DUKE FREDERICK More villain thou. Well, push him out of doors; And let my officers of such a nature Make an extent upon his house and lands: Do this expediently and turn him going. [Exeunt] AS YOU LIKE IT ACT III SCENE II The forest. [Enter ORLANDO, with a paper] ORLANDO Hang there, my verse, in witness of my love: And thou, thrice-crowned queen of night, survey With thy chaste eye, from thy pale sphere above, Thy huntress' name that my full life doth sway. O Rosalind! these trees shall be my books And in their barks my thoughts I'll character; That every eye which in this forest looks Shall see thy virtue witness'd every where. Run, run, Orlando; carve on every tree The fair, the chaste and unexpressive she. [Exit] [Enter CORIN and TOUCHSTONE] CORIN And how like you this shepherd's life, Master Touchstone? TOUCHSTONE Truly, shepherd, in respect of itself, it is a good life, but in respect that it is a shepherd's life, it is naught. In respect that it is solitary, I like it very well; but in respect that it is private, it is a very vile life. Now, in respect it is in the fields, it pleaseth me well; but in respect it is not in the court, it is tedious. As is it a spare life, look you, it fits my humour well; but as there is no more plenty in it, it goes much against my stomach. Hast any philosophy in thee, shepherd? CORIN No more but that I know the more one sickens the worse at ease he is; and that he that wants money, means and content is without three good friends; that the property of rain is to wet and fire to burn; that good pasture makes fat sheep, and that a great cause of the night is lack of the sun; that he that hath learned no wit by nature nor art may complain of good breeding or comes of a very dull kindred. TOUCHSTONE Such a one is a natural philosopher. Wast ever in court, shepherd? CORIN No, truly. TOUCHSTONE Then thou art damned. CORIN Nay, I hope. TOUCHSTONE Truly, thou art damned like an ill-roasted egg, all on one side. CORIN For not being at court? Your reason. TOUCHSTONE Why, if thou never wast at court, thou never sawest good manners; if thou never sawest good manners, then thy manners must be wicked; and wickedness is sin, and sin is damnation. Thou art in a parlous state, shepherd. CORIN Not a whit, Touchstone: those that are good manners at the court are as ridiculous in the country as the behavior of the country is most mockable at the court. You told me you salute not at the court, but you kiss your hands: that courtesy would be uncleanly, if courtiers were shepherds. TOUCHSTONE Instance, briefly; come, instance. CORIN Why, we are still handling our ewes, and their fells, you know, are greasy. TOUCHSTONE Why, do not your courtier's hands sweat? and is not the grease of a mutton as wholesome as the sweat of a man? Shallow, shallow. A better instance, I say; come. CORIN Besides, our hands are hard. TOUCHSTONE Your lips will feel them the sooner. Shallow again. A more sounder instance, come. CORIN And they are often tarred over with the surgery of our sheep: and would you have us kiss tar? The courtier's hands are perfumed with civet. TOUCHSTONE Most shallow man! thou worms-meat, in respect of a good piece of flesh indeed! Learn of the wise, and perpend: civet is of a baser birth than tar, the very uncleanly flux of a cat. Mend the instance, shepherd. CORIN You have too courtly a wit for me: I'll rest. TOUCHSTONE Wilt thou rest damned? God help thee, shallow man! God make incision in thee! thou art raw. CORIN Sir, I am a true labourer: I earn that I eat, get that I wear, owe no man hate, envy no man's happiness, glad of other men's good, content with my harm, and the greatest of my pride is to see my ewes graze and my lambs suck. TOUCHSTONE That is another simple sin in you, to bring the ewes and the rams together and to offer to get your living by the copulation of cattle; to be bawd to a bell-wether, and to betray a she-lamb of a twelvemonth to a crooked-pated, old, cuckoldly ram, out of all reasonable match. If thou beest not damned for this, the devil himself will have no shepherds; I cannot see else how thou shouldst 'scape. CORIN Here comes young Master Ganymede, my new mistress's brother. [Enter ROSALIND, with a paper, reading] ROSALIND From the east to western Ind, No jewel is like Rosalind. Her worth, being mounted on the wind, Through all the world bears Rosalind. All the pictures fairest lined Are but black to Rosalind. Let no fair be kept in mind But the fair of Rosalind. TOUCHSTONE I'll rhyme you so eight years together, dinners and suppers and sleeping-hours excepted: it is the right butter-women's rank to market. ROSALIND Out, fool! TOUCHSTONE For a taste: If a hart do lack a hind, Let him seek out Rosalind. If the cat will after kind, So be sure will Rosalind. Winter garments must be lined, So must slender Rosalind. They that reap must sheaf and bind; Then to cart with Rosalind. Sweetest nut hath sourest rind, Such a nut is Rosalind. He that sweetest rose will find Must find love's prick and Rosalind. This is the very false gallop of verses: why do you infect yourself with them? ROSALIND Peace, you dull fool! I found them on a tree. TOUCHSTONE Truly, the tree yields bad fruit. ROSALIND I'll graff it with you, and then I shall graff it with a medlar: then it will be the earliest fruit i' the country; for you'll be rotten ere you be half ripe, and that's the right virtue of the medlar. TOUCHSTONE You have said; but whether wisely or no, let the forest judge. [Enter CELIA, with a writing] ROSALIND Peace! Here comes my sister, reading: stand aside. CELIA [Reads] Why should this a desert be? For it is unpeopled? No: Tongues I'll hang on every tree, That shall civil sayings show: Some, how brief the life of man Runs his erring pilgrimage, That the stretching of a span Buckles in his sum of age; Some, of violated vows 'Twixt the souls of friend and friend: But upon the fairest boughs, Or at every sentence end, Will I Rosalinda write, Teaching all that read to know The quintessence of every sprite Heaven would in little show. Therefore Heaven Nature charged That one body should be fill'd With all graces wide-enlarged: Nature presently distill'd Helen's cheek, but not her heart, Cleopatra's majesty, Atalanta's better part, Sad Lucretia's modesty. Thus Rosalind of many parts By heavenly synod was devised, Of many faces, eyes and hearts, To have the touches dearest prized. Heaven would that she these gifts should have, And I to live and die her slave. ROSALIND O most gentle pulpiter! what tedious homily of love have you wearied your parishioners withal, and never cried 'Have patience, good people!' CELIA How now! back, friends! Shepherd, go off a little. Go with him, sirrah. TOUCHSTONE Come, shepherd, let us make an honourable retreat; though not with bag and baggage, yet with scrip and scrippage. [Exeunt CORIN and TOUCHSTONE] CELIA Didst thou hear these verses? ROSALIND O, yes, I heard them all, and more too; for some of them had in them more feet than the verses would bear. CELIA That's no matter: the feet might bear the verses. ROSALIND Ay, but the feet were lame and could not bear themselves without the verse and therefore stood lamely in the verse. CELIA But didst thou hear without wondering how thy name should be hanged and carved upon these trees? ROSALIND I was seven of the nine days out of the wonder before you came; for look here what I found on a palm-tree. I was never so be-rhymed since Pythagoras' time, that I was an Irish rat, which I can hardly remember. CELIA Trow you who hath done this? ROSALIND Is it a man? CELIA And a chain, that you once wore, about his neck. Change you colour? ROSALIND I prithee, who? CELIA O Lord, Lord! it is a hard matter for friends to meet; but mountains may be removed with earthquakes and so encounter. ROSALIND Nay, but who is it? CELIA Is it possible? ROSALIND Nay, I prithee now with most petitionary vehemence, tell me who it is. CELIA O wonderful, wonderful, and most wonderful wonderful! and yet again wonderful, and after that, out of all hooping! ROSALIND Good my complexion! dost thou think, though I am caparisoned like a man, I have a doublet and hose in my disposition? One inch of delay more is a South-sea of discovery; I prithee, tell me who is it quickly, and speak apace. I would thou couldst stammer, that thou mightst pour this concealed man out of thy mouth, as wine comes out of a narrow- mouthed bottle, either too much at once, or none at all. I prithee, take the cork out of thy mouth that may drink thy tidings. CELIA So you may put a man in your belly. ROSALIND Is he of God's making? What manner of man? Is his head worth a hat, or his chin worth a beard? CELIA Nay, he hath but a little beard. ROSALIND Why, God will send more, if the man will be thankful: let me stay the growth of his beard, if thou delay me not the knowledge of his chin. CELIA It is young Orlando, that tripped up the wrestler's heels and your heart both in an instant. ROSALIND Nay, but the devil take mocking: speak, sad brow and true maid. CELIA I' faith, coz, 'tis he. ROSALIND Orlando? CELIA Orlando. ROSALIND Alas the day! what shall I do with my doublet and hose? What did he when thou sawest him? What said he? How looked he? Wherein went he? What makes him here? Did he ask for me? Where remains he? How parted he with thee? and when shalt thou see him again? Answer me in one word. CELIA You must borrow me Gargantua's mouth first: 'tis a word too great for any mouth of this age's size. To say ay and no to these particulars is more than to answer in a catechism. ROSALIND But doth he know that I am in this forest and in man's apparel? Looks he as freshly as he did the day he wrestled? CELIA It is as easy to count atomies as to resolve the propositions of a lover; but take a taste of my finding him, and relish it with good observance. I found him under a tree, like a dropped acorn. ROSALIND It may well be called Jove's tree, when it drops forth such fruit. CELIA Give me audience, good madam. ROSALIND Proceed. CELIA There lay he, stretched along, like a wounded knight. ROSALIND Though it be pity to see such a sight, it well becomes the ground. CELIA Cry 'holla' to thy tongue, I prithee; it curvets unseasonably. He was furnished like a hunter. ROSALIND O, ominous! he comes to kill my heart. CELIA I would sing my song without a burden: thou bringest me out of tune. ROSALIND Do you not know I am a woman? when I think, I must speak. Sweet, say on. CELIA You bring me out. Soft! comes he not here? [Enter ORLANDO and JAQUES] ROSALIND 'Tis he: slink by, and note him. JAQUES I thank you for your company; but, good faith, I had as lief have been myself alone. ORLANDO And so had I; but yet, for fashion sake, I thank you too for your society. JAQUES God be wi' you: let's meet as little as we can. ORLANDO I do desire we may be better strangers. JAQUES I pray you, mar no more trees with writing love-songs in their barks. ORLANDO I pray you, mar no more of my verses with reading them ill-favouredly. JAQUES Rosalind is your love's name? ORLANDO Yes, just. JAQUES I do not like her name. ORLANDO There was no thought of pleasing you when she was christened. JAQUES What stature is she of? ORLANDO Just as high as my heart. JAQUES You are full of pretty answers. Have you not been acquainted with goldsmiths' wives, and conned them out of rings? ORLANDO Not so; but I answer you right painted cloth, from whence you have studied your questions. JAQUES You have a nimble wit: I think 'twas made of Atalanta's heels. Will you sit down with me? and we two will rail against our mistress the world and all our misery. ORLANDO I will chide no breather in the world but myself, against whom I know most faults. JAQUES The worst fault you have is to be in love. ORLANDO 'Tis a fault I will not change for your best virtue. I am weary of you. JAQUES By my troth, I was seeking for a fool when I found you. ORLANDO He is drowned in the brook: look but in, and you shall see him. JAQUES There I shall see mine own figure. ORLANDO Which I take to be either a fool or a cipher. JAQUES I'll tarry no longer with you: farewell, good Signior Love. ORLANDO I am glad of your departure: adieu, good Monsieur Melancholy. [Exit JAQUES] ROSALIND [Aside to CELIA] I will speak to him, like a saucy lackey and under that habit play the knave with him. Do you hear, forester? ORLANDO Very well: what would you? ROSALIND I pray you, what is't o'clock? ORLANDO You should ask me what time o' day: there's no clock in the forest. ROSALIND Then there is no true lover in the forest; else sighing every minute and groaning every hour would detect the lazy foot of Time as well as a clock. ORLANDO And why not the swift foot of Time? had not that been as proper? ROSALIND By no means, sir: Time travels in divers paces with divers persons. I'll tell you who Time ambles withal, who Time trots withal, who Time gallops withal and who he stands still withal. ORLANDO I prithee, who doth he trot withal? ROSALIND Marry, he trots hard with a young maid between the contract of her marriage and the day it is solemnized: if the interim be but a se'nnight, Time's pace is so hard that it seems the length of seven year. ORLANDO Who ambles Time withal? ROSALIND With a priest that lacks Latin and a rich man that hath not the gout, for the one sleeps easily because he cannot study, and the other lives merrily because he feels no pain, the one lacking the burden of lean and wasteful learning, the other knowing no burden of heavy tedious penury; these Time ambles withal. ORLANDO Who doth he gallop withal? ROSALIND With a thief to the gallows, for though he go as softly as foot can fall, he thinks himself too soon there. ORLANDO Who stays it still withal? ROSALIND With lawyers in the vacation, for they sleep between term and term and then they perceive not how Time moves. ORLANDO Where dwell you, pretty youth? ROSALIND With this shepherdess, my sister; here in the skirts of the forest, like fringe upon a petticoat. ORLANDO Are you native of this place? ROSALIND As the cony that you see dwell where she is kindled. ORLANDO Your accent is something finer than you could purchase in so removed a dwelling. ROSALIND I have been told so of many: but indeed an old religious uncle of mine taught me to speak, who was in his youth an inland man; one that knew courtship too well, for there he fell in love. I have heard him read many lectures against it, and I thank God I am not a woman, to be touched with so many giddy offences as he hath generally taxed their whole sex withal. ORLANDO Can you remember any of the principal evils that he laid to the charge of women? ROSALIND There were none principal; they were all like one another as half-pence are, every one fault seeming monstrous till his fellow fault came to match it. ORLANDO I prithee, recount some of them. ROSALIND No, I will not cast away my physic but on those that are sick. There is a man haunts the forest, that abuses our young plants with carving 'Rosalind' on their barks; hangs odes upon hawthorns and elegies on brambles, all, forsooth, deifying the name of Rosalind: if I could meet that fancy-monger I would give him some good counsel, for he seems to have the quotidian of love upon him. ORLANDO I am he that is so love-shaked: I pray you tell me your remedy. ROSALIND There is none of my uncle's marks upon you: he taught me how to know a man in love; in which cage of rushes I am sure you are not prisoner. ORLANDO What were his marks? ROSALIND A lean cheek, which you have not, a blue eye and sunken, which you have not, an unquestionable spirit, which you have not, a beard neglected, which you have not; but I pardon you for that, for simply your having in beard is a younger brother's revenue: then your hose should be ungartered, your bonnet unbanded, your sleeve unbuttoned, your shoe untied and every thing about you demonstrating a careless desolation; but you are no such man; you are rather point-device in your accoutrements as loving yourself than seeming the lover of any other. ORLANDO Fair youth, I would I could make thee believe I love. ROSALIND Me believe it! you may as soon make her that you love believe it; which, I warrant, she is apter to do than to confess she does: that is one of the points in the which women still give the lie to their consciences. But, in good sooth, are you he that hangs the verses on the trees, wherein Rosalind is so admired? ORLANDO I swear to thee, youth, by the white hand of Rosalind, I am that he, that unfortunate he. ROSALIND But are you so much in love as your rhymes speak? ORLANDO Neither rhyme nor reason can express how much. ROSALIND Love is merely a madness, and, I tell you, deserves as well a dark house and a whip as madmen do: and the reason why they are not so punished and cured is, that the lunacy is so ordinary that the whippers are in love too. Yet I profess curing it by counsel. ORLANDO Did you ever cure any so? ROSALIND Yes, one, and in this manner. He was to imagine me his love, his mistress; and I set him every day to woo me: at which time would I, being but a moonish youth, grieve, be effeminate, changeable, longing and liking, proud, fantastical, apish, shallow, inconstant, full of tears, full of smiles, for every passion something and for no passion truly any thing, as boys and women are for the most part cattle of this colour; would now like him, now loathe him; then entertain him, then forswear him; now weep for him, then spit at him; that I drave my suitor from his mad humour of love to a living humour of madness; which was, to forswear the full stream of the world, and to live in a nook merely monastic. And thus I cured him; and this way will I take upon me to wash your liver as clean as a sound sheep's heart, that there shall not be one spot of love in't. ORLANDO I would not be cured, youth. ROSALIND I would cure you, if you would but call me Rosalind and come every day to my cote and woo me. ORLANDO Now, by the faith of my love, I will: tell me where it is. ROSALIND Go with me to it and I'll show it you and by the way you shall tell me where in the forest you live. Will you go? ORLANDO With all my heart, good youth. ROSALIND Nay you must call me Rosalind. Come, sister, will you go? [Exeunt] AS YOU LIKE IT ACT III SCENE III The forest. [Enter TOUCHSTONE and AUDREY; JAQUES behind] TOUCHSTONE Come apace, good Audrey: I will fetch up your goats, Audrey. And how, Audrey? am I the man yet? doth my simple feature content you? AUDREY Your features! Lord warrant us! what features! TOUCHSTONE I am here with thee and thy goats, as the most capricious poet, honest Ovid, was among the Goths. JAQUES [Aside] O knowledge ill-inhabited, worse than Jove in a thatched house! TOUCHSTONE When a man's verses cannot be understood, nor a man's good wit seconded with the forward child Understanding, it strikes a man more dead than a great reckoning in a little room. Truly, I would the gods had made thee poetical. AUDREY I do not know what 'poetical' is: is it honest in deed and word? is it a true thing? TOUCHSTONE No, truly; for the truest poetry is the most feigning; and lovers are given to poetry, and what they swear in poetry may be said as lovers they do feign. AUDREY Do you wish then that the gods had made me poetical? TOUCHSTONE I do, truly; for thou swearest to me thou art honest: now, if thou wert a poet, I might have some hope thou didst feign. AUDREY Would you not have me honest? TOUCHSTONE No, truly, unless thou wert hard-favoured; for honesty coupled to beauty is to have honey a sauce to sugar. JAQUES [Aside] A material fool! AUDREY Well, I am not fair; and therefore I pray the gods make me honest. TOUCHSTONE Truly, and to cast away honesty upon a foul slut were to put good meat into an unclean dish. AUDREY I am not a slut, though I thank the gods I am foul. TOUCHSTONE Well, praised be the gods for thy foulness! sluttishness may come hereafter. But be it as it may be, I will marry thee, and to that end I have been with Sir Oliver Martext, the vicar of the next village, who hath promised to meet me in this place of the forest and to couple us. JAQUES [Aside] I would fain see this meeting. AUDREY Well, the gods give us joy! TOUCHSTONE Amen. A man may, if he were of a fearful heart, stagger in this attempt; for here we have no temple but the wood, no assembly but horn-beasts. But what though? Courage! As horns are odious, they are necessary. It is said, 'many a man knows no end of his goods:' right; many a man has good horns, and knows no end of them. Well, that is the dowry of his wife; 'tis none of his own getting. Horns? Even so. Poor men alone? No, no; the noblest deer hath them as huge as the rascal. Is the single man therefore blessed? No: as a walled town is more worthier than a village, so is the forehead of a married man more honourable than the bare brow of a bachelor; and by how much defence is better than no skill, by so much is a horn more precious than to want. Here comes Sir Oliver. [Enter SIR OLIVER MARTEXT] Sir Oliver Martext, you are well met: will you dispatch us here under this tree, or shall we go with you to your chapel? SIR OLIVER MARTEXT Is there none here to give the woman? TOUCHSTONE I will not take her on gift of any man. SIR OLIVER MARTEXT Truly, she must be given, or the marriage is not lawful. JAQUES [Advancing] Proceed, proceed I'll give her. TOUCHSTONE Good even, good Master What-ye-call't: how do you, sir? You are very well met: God 'ild you for your last company: I am very glad to see you: even a toy in hand here, sir: nay, pray be covered. JAQUES Will you be married, motley? TOUCHSTONE As the ox hath his bow, sir, the horse his curb and the falcon her bells, so man hath his desires; and as pigeons bill, so wedlock would be nibbling. JAQUES And will you, being a man of your breeding, be married under a bush like a beggar? Get you to church, and have a good priest that can tell you what marriage is: this fellow will but join you together as they join wainscot; then one of you will prove a shrunk panel and, like green timber, warp, warp. TOUCHSTONE [Aside] I am not in the mind but I were better to be married of him than of another: for he is not like to marry me well; and not being well married, it will be a good excuse for me hereafter to leave my wife. JAQUES Go thou with me, and let me counsel thee. TOUCHSTONE 'Come, sweet Audrey: We must be married, or we must live in bawdry. Farewell, good Master Oliver: not,-- O sweet Oliver, O brave Oliver, Leave me not behind thee: but,-- Wind away, Begone, I say, I will not to wedding with thee. [Exeunt JAQUES, TOUCHSTONE and AUDREY] SIR OLIVER MARTEXT 'Tis no matter: ne'er a fantastical knave of them all shall flout me out of my calling. [Exit] AS YOU LIKE IT ACT III SCENE IV The forest. [Enter ROSALIND and CELIA] ROSALIND Never talk to me; I will weep. CELIA Do, I prithee; but yet have the grace to consider that tears do not become a man. ROSALIND But have I not cause to weep? CELIA As good cause as one would desire; therefore weep. ROSALIND His very hair is of the dissembling colour. CELIA Something browner than Judas's marry, his kisses are Judas's own children. ROSALIND I' faith, his hair is of a good colour. CELIA An excellent colour: your chestnut was ever the only colour. ROSALIND And his kissing is as full of sanctity as the touch of holy bread. CELIA He hath bought a pair of cast lips of Diana: a nun of winter's sisterhood kisses not more religiously; the very ice of chastity is in them. ROSALIND But why did he swear he would come this morning, and comes not? CELIA Nay, certainly, there is no truth in him. ROSALIND Do you think so? CELIA Yes; I think he is not a pick-purse nor a horse-stealer, but for his verity in love, I do think him as concave as a covered goblet or a worm-eaten nut. ROSALIND Not true in love? CELIA Yes, when he is in; but I think he is not in. ROSALIND You have heard him swear downright he was. CELIA 'Was' is not 'is:' besides, the oath of a lover is no stronger than the word of a tapster; they are both the confirmer of false reckonings. He attends here in the forest on the duke your father. ROSALIND I met the duke yesterday and had much question with him: he asked me of what parentage I was; I told him, of as good as he; so he laughed and let me go. But what talk we of fathers, when there is such a man as Orlando? CELIA O, that's a brave man! he writes brave verses, speaks brave words, swears brave oaths and breaks them bravely, quite traverse, athwart the heart of his lover; as a puisny tilter, that spurs his horse but on one side, breaks his staff like a noble goose: but all's brave that youth mounts and folly guides. Who comes here? [Enter CORIN] CORIN Mistress and master, you have oft inquired After the shepherd that complain'd of love, Who you saw sitting by me on the turf, Praising the proud disdainful shepherdess That was his mistress. CELIA Well, and what of him? CORIN If you will see a pageant truly play'd, Between the pale complexion of true love And the red glow of scorn and proud disdain, Go hence a little and I shall conduct you, If you will mark it. ROSALIND O, come, let us remove: The sight of lovers feedeth those in love. Bring us to this sight, and you shall say I'll prove a busy actor in their play. [Exeunt] AS YOU LIKE IT ACT III SCENE V Another part of the forest. [Enter SILVIUS and PHEBE] SILVIUS Sweet Phebe, do not scorn me; do not, Phebe; Say that you love me not, but say not so In bitterness. The common executioner, Whose heart the accustom'd sight of death makes hard, Falls not the axe upon the humbled neck But first begs pardon: will you sterner be Than he that dies and lives by bloody drops? [Enter ROSALIND, CELIA, and CORIN, behind] PHEBE I would not be thy executioner: I fly thee, for I would not injure thee. Thou tell'st me there is murder in mine eye: 'Tis pretty, sure, and very probable, That eyes, that are the frail'st and softest things, Who shut their coward gates on atomies, Should be call'd tyrants, butchers, murderers! Now I do frown on thee with all my heart; And if mine eyes can wound, now let them kill thee: Now counterfeit to swoon; why now fall down; Or if thou canst not, O, for shame, for shame, Lie not, to say mine eyes are murderers! Now show the wound mine eye hath made in thee: Scratch thee but with a pin, and there remains Some scar of it; lean but upon a rush, The cicatrice and capable impressure Thy palm some moment keeps; but now mine eyes, Which I have darted at thee, hurt thee not, Nor, I am sure, there is no force in eyes That can do hurt. SILVIUS O dear Phebe, If ever,--as that ever may be near,-- You meet in some fresh cheek the power of fancy, Then shall you know the wounds invisible That love's keen arrows make. PHEBE But till that time Come not thou near me: and when that time comes, Afflict me with thy mocks, pity me not; As till that time I shall not pity thee. ROSALIND And why, I pray you? Who might be your mother, That you insult, exult, and all at once, Over the wretched? What though you have no beauty,-- As, by my faith, I see no more in you Than without candle may go dark to bed-- Must you be therefore proud and pitiless? Why, what means this? Why do you look on me? I see no more in you than in the ordinary Of nature's sale-work. 'Od's my little life, I think she means to tangle my eyes too! No, faith, proud mistress, hope not after it: 'Tis not your inky brows, your black silk hair, Your bugle eyeballs, nor your cheek of cream, That can entame my spirits to your worship. You foolish shepherd, wherefore do you follow her, Like foggy south puffing with wind and rain? You are a thousand times a properer man Than she a woman: 'tis such fools as you That makes the world full of ill-favour'd children: 'Tis not her glass, but you, that flatters her; And out of you she sees herself more proper Than any of her lineaments can show her. But, mistress, know yourself: down on your knees, And thank heaven, fasting, for a good man's love: For I must tell you friendly in your ear, Sell when you can: you are not for all markets: Cry the man mercy; love him; take his offer: Foul is most foul, being foul to be a scoffer. So take her to thee, shepherd: fare you well. PHEBE Sweet youth, I pray you, chide a year together: I had rather hear you chide than this man woo. ROSALIND He's fallen in love with your foulness and she'll fall in love with my anger. If it be so, as fast as she answers thee with frowning looks, I'll sauce her with bitter words. Why look you so upon me? PHEBE For no ill will I bear you. ROSALIND I pray you, do not fall in love with me, For I am falser than vows made in wine: Besides, I like you not. If you will know my house, 'Tis at the tuft of olives here hard by. Will you go, sister? Shepherd, ply her hard. Come, sister. Shepherdess, look on him better, And be not proud: though all the world could see, None could be so abused in sight as he. Come, to our flock. [Exeunt ROSALIND, CELIA and CORIN] PHEBE Dead Shepherd, now I find thy saw of might, 'Who ever loved that loved not at first sight?' SILVIUS Sweet Phebe,-- PHEBE Ha, what say'st thou, Silvius? SILVIUS Sweet Phebe, pity me. PHEBE Why, I am sorry for thee, gentle Silvius. SILVIUS Wherever sorrow is, relief would be: If you do sorrow at my grief in love, By giving love your sorrow and my grief Were both extermined. PHEBE Thou hast my love: is not that neighbourly? SILVIUS I would have you. PHEBE Why, that were covetousness. Silvius, the time was that I hated thee, And yet it is not that I bear thee love; But since that thou canst talk of love so well, Thy company, which erst was irksome to me, I will endure, and I'll employ thee too: But do not look for further recompense Than thine own gladness that thou art employ'd. SILVIUS So holy and so perfect is my love, And I in such a poverty of grace, That I shall think it a most plenteous crop To glean the broken ears after the man That the main harvest reaps: loose now and then A scatter'd smile, and that I'll live upon. PHEBE Know'st now the youth that spoke to me erewhile? SILVIUS Not very well, but I have met him oft; And he hath bought the cottage and the bounds That the old carlot once was master of. PHEBE Think not I love him, though I ask for him: 'Tis but a peevish boy; yet he talks well; But what care I for words? yet words do well When he that speaks them pleases those that hear. It is a pretty youth: not very pretty: But, sure, he's proud, and yet his pride becomes him: He'll make a proper man: the best thing in him Is his complexion; and faster than his tongue Did make offence his eye did heal it up. He is not very tall; yet for his years he's tall: His leg is but so so; and yet 'tis well: There was a pretty redness in his lip, A little riper and more lusty red Than that mix'd in his cheek; 'twas just the difference Between the constant red and mingled damask. There be some women, Silvius, had they mark'd him In parcels as I did, would have gone near To fall in love with him; but, for my part, I love him not nor hate him not; and yet I have more cause to hate him than to love him: For what had he to do to chide at me? He said mine eyes were black and my hair black: And, now I am remember'd, scorn'd at me: I marvel why I answer'd not again: But that's all one; omittance is no quittance. I'll write to him a very taunting letter, And thou shalt bear it: wilt thou, Silvius? SILVIUS Phebe, with all my heart. PHEBE I'll write it straight; The matter's in my head and in my heart: I will be bitter with him and passing short. Go with me, Silvius. [Exeunt] AS YOU LIKE IT ACT IV SCENE I The forest. [Enter ROSALIND, CELIA, and JAQUES] JAQUES I prithee, pretty youth, let me be better acquainted with thee. ROSALIND They say you are a melancholy fellow. JAQUES I am so; I do love it better than laughing. ROSALIND Those that are in extremity of either are abominable fellows and betray themselves to every modern censure worse than drunkards. JAQUES Why, 'tis good to be sad and say nothing. ROSALIND Why then, 'tis good to be a post. JAQUES I have neither the scholar's melancholy, which is emulation, nor the musician's, which is fantastical, nor the courtier's, which is proud, nor the soldier's, which is ambitious, nor the lawyer's, which is politic, nor the lady's, which is nice, nor the lover's, which is all these: but it is a melancholy of mine own, compounded of many simples, extracted from many objects, and indeed the sundry's contemplation of my travels, in which my often rumination wraps me m a most humorous sadness. ROSALIND A traveller! By my faith, you have great reason to be sad: I fear you have sold your own lands to see other men's; then, to have seen much and to have nothing, is to have rich eyes and poor hands. JAQUES Yes, I have gained my experience. ROSALIND And your experience makes you sad: I had rather have a fool to make me merry than experience to make me sad; and to travel for it too! [Enter ORLANDO] ORLANDO Good day and happiness, dear Rosalind! JAQUES Nay, then, God be wi' you, an you talk in blank verse. [Exit] ROSALIND Farewell, Monsieur Traveller: look you lisp and wear strange suits, disable all the benefits of your own country, be out of love with your nativity and almost chide God for making you that countenance you are, or I will scarce think you have swam in a gondola. Why, how now, Orlando! where have you been all this while? You a lover! An you serve me such another trick, never come in my sight more. ORLANDO My fair Rosalind, I come within an hour of my promise. ROSALIND Break an hour's promise in love! He that will divide a minute into a thousand parts and break but a part of the thousandth part of a minute in the affairs of love, it may be said of him that Cupid hath clapped him o' the shoulder, but I'll warrant him heart-whole. ORLANDO Pardon me, dear Rosalind. ROSALIND Nay, an you be so tardy, come no more in my sight: I had as lief be wooed of a snail. ORLANDO Of a snail? ROSALIND Ay, of a snail; for though he comes slowly, he carries his house on his head; a better jointure, I think, than you make a woman: besides he brings his destiny with him. ORLANDO What's that? ROSALIND Why, horns, which such as you are fain to be beholding to your wives for: but he comes armed in his fortune and prevents the slander of his wife. ORLANDO Virtue is no horn-maker; and my Rosalind is virtuous. ROSALIND And I am your Rosalind. CELIA It pleases him to call you so; but he hath a Rosalind of a better leer than you. ROSALIND Come, woo me, woo me, for now I am in a holiday humour and like enough to consent. What would you say to me now, an I were your very very Rosalind? ORLANDO I would kiss before I spoke. ROSALIND Nay, you were better speak first, and when you were gravelled for lack of matter, you might take occasion to kiss. Very good orators, when they are out, they will spit; and for lovers lacking--God warn us!--matter, the cleanliest shift is to kiss. ORLANDO How if the kiss be denied? ROSALIND Then she puts you to entreaty, and there begins new matter. ORLANDO Who could be out, being before his beloved mistress? ROSALIND Marry, that should you, if I were your mistress, or I should think my honesty ranker than my wit. ORLANDO What, of my suit? ROSALIND Not out of your apparel, and yet out of your suit. Am not I your Rosalind? ORLANDO I take some joy to say you are, because I would be talking of her. ROSALIND Well in her person I say I will not have you. ORLANDO Then in mine own person I die. ROSALIND No, faith, die by attorney. The poor world is almost six thousand years old, and in all this time there was not any man died in his own person, videlicit, in a love-cause. Troilus had his brains dashed out with a Grecian club; yet he did what he could to die before, and he is one of the patterns of love. Leander, he would have lived many a fair year, though Hero had turned nun, if it had not been for a hot midsummer night; for, good youth, he went but forth to wash him in the Hellespont and being taken with the cramp was drowned and the foolish coroners of that age found it was 'Hero of Sestos.' But these are all lies: men have died from time to time and worms have eaten them, but not for love. ORLANDO I would not have my right Rosalind of this mind, for, I protest, her frown might kill me. ROSALIND By this hand, it will not kill a fly. But come, now I will be your Rosalind in a more coming-on disposition, and ask me what you will. I will grant it. ORLANDO Then love me, Rosalind. ROSALIND Yes, faith, will I, Fridays and Saturdays and all. ORLANDO And wilt thou have me? ROSALIND Ay, and twenty such. ORLANDO What sayest thou? ROSALIND Are you not good? ORLANDO I hope so. ROSALIND Why then, can one desire too much of a good thing? Come, sister, you shall be the priest and marry us. Give me your hand, Orlando. What do you say, sister? ORLANDO Pray thee, marry us. CELIA I cannot say the words. ROSALIND You must begin, 'Will you, Orlando--' CELIA Go to. Will you, Orlando, have to wife this Rosalind? ORLANDO I will. ROSALIND Ay, but when? ORLANDO Why now; as fast as she can marry us. ROSALIND Then you must say 'I take thee, Rosalind, for wife.' ORLANDO I take thee, Rosalind, for wife. ROSALIND I might ask you for your commission; but I do take thee, Orlando, for my husband: there's a girl goes before the priest; and certainly a woman's thought runs before her actions. ORLANDO So do all thoughts; they are winged. ROSALIND Now tell me how long you would have her after you have possessed her. ORLANDO For ever and a day. ROSALIND Say 'a day,' without the 'ever.' No, no, Orlando; men are April when they woo, December when they wed: maids are May when they are maids, but the sky changes when they are wives. I will be more jealous of thee than a Barbary cock-pigeon over his hen, more clamorous than a parrot against rain, more new-fangled than an ape, more giddy in my desires than a monkey: I will weep for nothing, like Diana in the fountain, and I will do that when you are disposed to be merry; I will laugh like a hyen, and that when thou art inclined to sleep. ORLANDO But will my Rosalind do so? ROSALIND By my life, she will do as I do. ORLANDO O, but she is wise. ROSALIND Or else she could not have the wit to do this: the wiser, the waywarder: make the doors upon a woman's wit and it will out at the casement; shut that and 'twill out at the key-hole; stop that, 'twill fly with the smoke out at the chimney. ORLANDO A man that had a wife with such a wit, he might say 'Wit, whither wilt?' ROSALIND Nay, you might keep that cheque for it till you met your wife's wit going to your neighbour's bed. ORLANDO And what wit could wit have to excuse that? ROSALIND Marry, to say she came to seek you there. You shall never take her without her answer, unless you take her without her tongue. O, that woman that cannot make her fault her husband's occasion, let her never nurse her child herself, for she will breed it like a fool! ORLANDO For these two hours, Rosalind, I will leave thee. ROSALIND Alas! dear love, I cannot lack thee two hours. ORLANDO I must attend the duke at dinner: by two o'clock I will be with thee again. ROSALIND Ay, go your ways, go your ways; I knew what you would prove: my friends told me as much, and I thought no less: that flattering tongue of yours won me: 'tis but one cast away, and so, come, death! Two o'clock is your hour? ORLANDO Ay, sweet Rosalind. ROSALIND By my troth, and in good earnest, and so God mend me, and by all pretty oaths that are not dangerous, if you break one jot of your promise or come one minute behind your hour, I will think you the most pathetical break-promise and the most hollow lover and the most unworthy of her you call Rosalind that may be chosen out of the gross band of the unfaithful: therefore beware my censure and keep your promise. ORLANDO With no less religion than if thou wert indeed my Rosalind: so adieu. ROSALIND Well, Time is the old justice that examines all such offenders, and let Time try: adieu. [Exit ORLANDO] CELIA You have simply misused our sex in your love-prate: we must have your doublet and hose plucked over your head, and show the world what the bird hath done to her own nest. ROSALIND O coz, coz, coz, my pretty little coz, that thou didst know how many fathom deep I am in love! But it cannot be sounded: my affection hath an unknown bottom, like the bay of Portugal. CELIA Or rather, bottomless, that as fast as you pour affection in, it runs out. ROSALIND No, that same wicked bastard of Venus that was begot of thought, conceived of spleen and born of madness, that blind rascally boy that abuses every one's eyes because his own are out, let him be judge how deep I am in love. I'll tell thee, Aliena, I cannot be out of the sight of Orlando: I'll go find a shadow and sigh till he come. CELIA And I'll sleep. [Exeunt] AS YOU LIKE IT ACT IV SCENE II The forest. [Enter JAQUES, Lords, and Foresters] JAQUES Which is he that killed the deer? A Lord Sir, it was I. JAQUES Let's present him to the duke, like a Roman conqueror; and it would do well to set the deer's horns upon his head, for a branch of victory. Have you no song, forester, for this purpose? Forester Yes, sir. JAQUES Sing it: 'tis no matter how it be in tune, so it make noise enough. SONG. Forester What shall he have that kill'd the deer? His leather skin and horns to wear. Then sing him home; [The rest shall bear this burden] Take thou no scorn to wear the horn; It was a crest ere thou wast born: Thy father's father wore it, And thy father bore it: The horn, the horn, the lusty horn Is not a thing to laugh to scorn. [Exeunt] AS YOU LIKE IT ACT IV SCENE III The forest. [Enter ROSALIND and CELIA] ROSALIND How say you now? Is it not past two o'clock? and here much Orlando! CELIA I warrant you, with pure love and troubled brain, he hath ta'en his bow and arrows and is gone forth to sleep. Look, who comes here. [Enter SILVIUS] SILVIUS My errand is to you, fair youth; My gentle Phebe bid me give you this: I know not the contents; but, as I guess By the stern brow and waspish action Which she did use as she was writing of it, It bears an angry tenor: pardon me: I am but as a guiltless messenger. ROSALIND Patience herself would startle at this letter And play the swaggerer; bear this, bear all: She says I am not fair, that I lack manners; She calls me proud, and that she could not love me, Were man as rare as phoenix. 'Od's my will! Her love is not the hare that I do hunt: Why writes she so to me? Well, shepherd, well, This is a letter of your own device. SILVIUS No, I protest, I know not the contents: Phebe did write it. ROSALIND Come, come, you are a fool And turn'd into the extremity of love. I saw her hand: she has a leathern hand. A freestone-colour'd hand; I verily did think That her old gloves were on, but 'twas her hands: She has a huswife's hand; but that's no matter: I say she never did invent this letter; This is a man's invention and his hand. SILVIUS Sure, it is hers. ROSALIND Why, 'tis a boisterous and a cruel style. A style for-challengers; why, she defies me, Like Turk to Christian: women's gentle brain Could not drop forth such giant-rude invention Such Ethiope words, blacker in their effect Than in their countenance. Will you hear the letter? SILVIUS So please you, for I never heard it yet; Yet heard too much of Phebe's cruelty. ROSALIND She Phebes me: mark how the tyrant writes. [Reads] Art thou god to shepherd turn'd, That a maiden's heart hath burn'd? Can a woman rail thus? SILVIUS Call you this railing? ROSALIND [Reads] Why, thy godhead laid apart, Warr'st thou with a woman's heart? Did you ever hear such railing? Whiles the eye of man did woo me, That could do no vengeance to me. Meaning me a beast. If the scorn of your bright eyne Have power to raise such love in mine, Alack, in me what strange effect Would they work in mild aspect! Whiles you chid me, I did love; How then might your prayers move! He that brings this love to thee Little knows this love in me: And by him seal up thy mind; Whether that thy youth and kind Will the faithful offer take Of me and all that I can make; Or else by him my love deny, And then I'll study how to die. SILVIUS Call you this chiding? CELIA Alas, poor shepherd! ROSALIND Do you pity him? no, he deserves no pity. Wilt thou love such a woman? What, to make thee an instrument and play false strains upon thee! not to be endured! Well, go your way to her, for I see love hath made thee a tame snake, and say this to her: that if she love me, I charge her to love thee; if she will not, I will never have her unless thou entreat for her. If you be a true lover, hence, and not a word; for here comes more company. [Exit SILVIUS] [Enter OLIVER] OLIVER Good morrow, fair ones: pray you, if you know, Where in the purlieus of this forest stands A sheep-cote fenced about with olive trees? CELIA West of this place, down in the neighbour bottom: The rank of osiers by the murmuring stream Left on your right hand brings you to the place. But at this hour the house doth keep itself; There's none within. OLIVER If that an eye may profit by a tongue, Then should I know you by description; Such garments and such years: 'The boy is fair, Of female favour, and bestows himself Like a ripe sister: the woman low And browner than her brother.' Are not you The owner of the house I did inquire for? CELIA It is no boast, being ask'd, to say we are. OLIVER Orlando doth commend him to you both, And to that youth he calls his Rosalind He sends this bloody napkin. Are you he? ROSALIND I am: what must we understand by this? OLIVER Some of my shame; if you will know of me What man I am, and how, and why, and where This handkercher was stain'd. CELIA I pray you, tell it. OLIVER When last the young Orlando parted from you He left a promise to return again Within an hour, and pacing through the forest, Chewing the food of sweet and bitter fancy, Lo, what befell! he threw his eye aside, And mark what object did present itself: Under an oak, whose boughs were moss'd with age And high top bald with dry antiquity, A wretched ragged man, o'ergrown with hair, Lay sleeping on his back: about his neck A green and gilded snake had wreathed itself, Who with her head nimble in threats approach'd The opening of his mouth; but suddenly, Seeing Orlando, it unlink'd itself, And with indented glides did slip away Into a bush: under which bush's shade A lioness, with udders all drawn dry, Lay couching, head on ground, with catlike watch, When that the sleeping man should stir; for 'tis The royal disposition of that beast To prey on nothing that doth seem as dead: This seen, Orlando did approach the man And found it was his brother, his elder brother. CELIA O, I have heard him speak of that same brother; And he did render him the most unnatural That lived amongst men. OLIVER And well he might so do, For well I know he was unnatural. ROSALIND But, to Orlando: did he leave him there, Food to the suck'd and hungry lioness? OLIVER Twice did he turn his back and purposed so; But kindness, nobler ever than revenge, And nature, stronger than his just occasion, Made him give battle to the lioness, Who quickly fell before him: in which hurtling From miserable slumber I awaked. CELIA Are you his brother? ROSALIND Wast you he rescued? CELIA Was't you that did so oft contrive to kill him? OLIVER 'Twas I; but 'tis not I I do not shame To tell you what I was, since my conversion So sweetly tastes, being the thing I am. ROSALIND But, for the bloody napkin? OLIVER By and by. When from the first to last betwixt us two Tears our recountments had most kindly bathed, As how I came into that desert place:-- In brief, he led me to the gentle duke, Who gave me fresh array and entertainment, Committing me unto my brother's love; Who led me instantly unto his cave, There stripp'd himself, and here upon his arm The lioness had torn some flesh away, Which all this while had bled; and now he fainted And cried, in fainting, upon Rosalind. Brief, I recover'd him, bound up his wound; And, after some small space, being strong at heart, He sent me hither, stranger as I am, To tell this story, that you might excuse His broken promise, and to give this napkin Dyed in his blood unto the shepherd youth That he in sport doth call his Rosalind. [ROSALIND swoons] CELIA Why, how now, Ganymede! sweet Ganymede! OLIVER Many will swoon when they do look on blood. CELIA There is more in it. Cousin Ganymede! OLIVER Look, he recovers. ROSALIND I would I were at home. CELIA We'll lead you thither. I pray you, will you take him by the arm? OLIVER Be of good cheer, youth: you a man! you lack a man's heart. ROSALIND I do so, I confess it. Ah, sirrah, a body would think this was well counterfeited! I pray you, tell your brother how well I counterfeited. Heigh-ho! OLIVER This was not counterfeit: there is too great testimony in your complexion that it was a passion of earnest. ROSALIND Counterfeit, I assure you. OLIVER Well then, take a good heart and counterfeit to be a man. ROSALIND So I do: but, i' faith, I should have been a woman by right. CELIA Come, you look paler and paler: pray you, draw homewards. Good sir, go with us. OLIVER That will I, for I must bear answer back How you excuse my brother, Rosalind. ROSALIND I shall devise something: but, I pray you, commend my counterfeiting to him. Will you go? [Exeunt] AS YOU LIKE IT ACT V SCENE I The forest. [Enter TOUCHSTONE and AUDREY] TOUCHSTONE We shall find a time, Audrey; patience, gentle Audrey. AUDREY Faith, the priest was good enough, for all the old gentleman's saying. TOUCHSTONE A most wicked Sir Oliver, Audrey, a most vile Martext. But, Audrey, there is a youth here in the forest lays claim to you. AUDREY Ay, I know who 'tis; he hath no interest in me in the world: here comes the man you mean. TOUCHSTONE It is meat and drink to me to see a clown: by my troth, we that have good wits have much to answer for; we shall be flouting; we cannot hold. [Enter WILLIAM] WILLIAM Good even, Audrey. AUDREY God ye good even, William. WILLIAM And good even to you, sir. TOUCHSTONE Good even, gentle friend. Cover thy head, cover thy head; nay, prithee, be covered. How old are you, friend? WILLIAM Five and twenty, sir. TOUCHSTONE A ripe age. Is thy name William? WILLIAM William, sir. TOUCHSTONE A fair name. Wast born i' the forest here? WILLIAM Ay, sir, I thank God. TOUCHSTONE 'Thank God;' a good answer. Art rich? WILLIAM Faith, sir, so so. TOUCHSTONE 'So so' is good, very good, very excellent good; and yet it is not; it is but so so. Art thou wise? WILLIAM Ay, sir, I have a pretty wit. TOUCHSTONE Why, thou sayest well. I do now remember a saying, 'The fool doth think he is wise, but the wise man knows himself to be a fool.' The heathen philosopher, when he had a desire to eat a grape, would open his lips when he put it into his mouth; meaning thereby that grapes were made to eat and lips to open. You do love this maid? WILLIAM I do, sir. TOUCHSTONE Give me your hand. Art thou learned? WILLIAM No, sir. TOUCHSTONE Then learn this of me: to have, is to have; for it is a figure in rhetoric that drink, being poured out of a cup into a glass, by filling the one doth empty the other; for all your writers do consent that ipse is he: now, you are not ipse, for I am he. WILLIAM Which he, sir? TOUCHSTONE He, sir, that must marry this woman. Therefore, you clown, abandon,--which is in the vulgar leave,--the society,--which in the boorish is company,--of this female,--which in the common is woman; which together is, abandon the society of this female, or, clown, thou perishest; or, to thy better understanding, diest; or, to wit I kill thee, make thee away, translate thy life into death, thy liberty into bondage: I will deal in poison with thee, or in bastinado, or in steel; I will bandy with thee in faction; I will o'errun thee with policy; I will kill thee a hundred and fifty ways: therefore tremble and depart. AUDREY Do, good William. WILLIAM God rest you merry, sir. [Exit] [Enter CORIN] CORIN Our master and mistress seeks you; come, away, away! TOUCHSTONE Trip, Audrey! trip, Audrey! I attend, I attend. [Exeunt] AS YOU LIKE IT ACT V SCENE II The forest. [Enter ORLANDO and OLIVER] ORLANDO Is't possible that on so little acquaintance you should like her? that but seeing you should love her? and loving woo? and, wooing, she should grant? and will you persever to enjoy her? OLIVER Neither call the giddiness of it in question, the poverty of her, the small acquaintance, my sudden wooing, nor her sudden consenting; but say with me, I love Aliena; say with her that she loves me; consent with both that we may enjoy each other: it shall be to your good; for my father's house and all the revenue that was old Sir Rowland's will I estate upon you, and here live and die a shepherd. ORLANDO You have my consent. Let your wedding be to-morrow: thither will I invite the duke and all's contented followers. Go you and prepare Aliena; for look you, here comes my Rosalind. [Enter ROSALIND] ROSALIND God save you, brother. OLIVER And you, fair sister. [Exit] ROSALIND O, my dear Orlando, how it grieves me to see thee wear thy heart in a scarf! ORLANDO It is my arm. ROSALIND I thought thy heart had been wounded with the claws of a lion. ORLANDO Wounded it is, but with the eyes of a lady. ROSALIND Did your brother tell you how I counterfeited to swoon when he showed me your handkerchief? ORLANDO Ay, and greater wonders than that. ROSALIND O, I know where you are: nay, 'tis true: there was never any thing so sudden but the fight of two rams and Caesar's thrasonical brag of 'I came, saw, and overcame:' for your brother and my sister no sooner met but they looked, no sooner looked but they loved, no sooner loved but they sighed, no sooner sighed but they asked one another the reason, no sooner knew the reason but they sought the remedy; and in these degrees have they made a pair of stairs to marriage which they will climb incontinent, or else be incontinent before marriage: they are in the very wrath of love and they will together; clubs cannot part them. ORLANDO They shall be married to-morrow, and I will bid the duke to the nuptial. But, O, how bitter a thing it is to look into happiness through another man's eyes! By so much the more shall I to-morrow be at the height of heart-heaviness, by how much I shall think my brother happy in having what he wishes for. ROSALIND Why then, to-morrow I cannot serve your turn for Rosalind? ORLANDO I can live no longer by thinking. ROSALIND I will weary you then no longer with idle talking. Know of me then, for now I speak to some purpose, that I know you are a gentleman of good conceit: I speak not this that you should bear a good opinion of my knowledge, insomuch I say I know you are; neither do I labour for a greater esteem than may in some little measure draw a belief from you, to do yourself good and not to grace me. Believe then, if you please, that I can do strange things: I have, since I was three year old, conversed with a magician, most profound in his art and yet not damnable. If you do love Rosalind so near the heart as your gesture cries it out, when your brother marries Aliena, shall you marry her: I know into what straits of fortune she is driven; and it is not impossible to me, if it appear not inconvenient to you, to set her before your eyes tomorrow human as she is and without any danger. ORLANDO Speakest thou in sober meanings? ROSALIND By my life, I do; which I tender dearly, though I say I am a magician. Therefore, put you in your best array: bid your friends; for if you will be married to-morrow, you shall, and to Rosalind, if you will. [Enter SILVIUS and PHEBE] Look, here comes a lover of mine and a lover of hers. PHEBE Youth, you have done me much ungentleness, To show the letter that I writ to you. ROSALIND I care not if I have: it is my study To seem despiteful and ungentle to you: You are there followed by a faithful shepherd; Look upon him, love him; he worships you. PHEBE Good shepherd, tell this youth what 'tis to love. SILVIUS It is to be all made of sighs and tears; And so am I for Phebe. PHEBE And I for Ganymede. ORLANDO And I for Rosalind. ROSALIND And I for no woman. SILVIUS It is to be all made of faith and service; And so am I for Phebe. PHEBE And I for Ganymede. ORLANDO And I for Rosalind. ROSALIND And I for no woman. SILVIUS It is to be all made of fantasy, All made of passion and all made of wishes, All adoration, duty, and observance, All humbleness, all patience and impatience, All purity, all trial, all observance; And so am I for Phebe. PHEBE And so am I for Ganymede. ORLANDO And so am I for Rosalind. ROSALIND And so am I for no woman. PHEBE If this be so, why blame you me to love you? SILVIUS If this be so, why blame you me to love you? ORLANDO If this be so, why blame you me to love you? ROSALIND Who do you speak to, 'Why blame you me to love you?' ORLANDO To her that is not here, nor doth not hear. ROSALIND Pray you, no more of this; 'tis like the howling of Irish wolves against the moon. [To SILVIUS] I will help you, if I can: [To PHEBE] I would love you, if I could. To-morrow meet me all together. [To PHEBE] I will marry you, if ever I marry woman, and I'll be married to-morrow: [To ORLANDO] I will satisfy you, if ever I satisfied man, and you shall be married to-morrow: [To SILVIUS] I will content you, if what pleases you contents you, and you shall be married to-morrow. [To ORLANDO] As you love Rosalind, meet: [To SILVIUS] as you love Phebe, meet: and as I love no woman, I'll meet. So fare you well: I have left you commands. SILVIUS I'll not fail, if I live. PHEBE Nor I. ORLANDO Nor I. [Exeunt] AS YOU LIKE IT ACT V SCENE III The forest. [Enter TOUCHSTONE and AUDREY] TOUCHSTONE To-morrow is the joyful day, Audrey; to-morrow will we be married. AUDREY I do desire it with all my heart; and I hope it is no dishonest desire to desire to be a woman of the world. Here comes two of the banished duke's pages. [Enter two Pages] First Page Well met, honest gentleman. TOUCHSTONE By my troth, well met. Come, sit, sit, and a song. Second Page We are for you: sit i' the middle. First Page Shall we clap into't roundly, without hawking or spitting or saying we are hoarse, which are the only prologues to a bad voice? Second Page I'faith, i'faith; and both in a tune, like two gipsies on a horse. SONG. It was a lover and his lass, With a hey, and a ho, and a hey nonino, That o'er the green corn-field did pass In the spring time, the only pretty ring time, When birds do sing, hey ding a ding, ding: Sweet lovers love the spring. Between the acres of the rye, With a hey, and a ho, and a hey nonino These pretty country folks would lie, In spring time, &c. This carol they began that hour, With a hey, and a ho, and a hey nonino, How that a life was but a flower In spring time, &c. And therefore take the present time, With a hey, and a ho, and a hey nonino; For love is crowned with the prime In spring time, &c. TOUCHSTONE Truly, young gentlemen, though there was no great matter in the ditty, yet the note was very untuneable. First Page You are deceived, sir: we kept time, we lost not our time. TOUCHSTONE By my troth, yes; I count it but time lost to hear such a foolish song. God be wi' you; and God mend your voices! Come, Audrey. [Exeunt] AS YOU LIKE IT ACT V SCENE IV The forest. [Enter DUKE SENIOR, AMIENS, JAQUES, ORLANDO, OLIVER, and CELIA] DUKE SENIOR Dost thou believe, Orlando, that the boy Can do all this that he hath promised? ORLANDO I sometimes do believe, and sometimes do not; As those that fear they hope, and know they fear. [Enter ROSALIND, SILVIUS, and PHEBE] ROSALIND Patience once more, whiles our compact is urged: You say, if I bring in your Rosalind, You will bestow her on Orlando here? DUKE SENIOR That would I, had I kingdoms to give with her. ROSALIND And you say, you will have her, when I bring her? ORLANDO That would I, were I of all kingdoms king. ROSALIND You say, you'll marry me, if I be willing? PHEBE That will I, should I die the hour after. ROSALIND But if you do refuse to marry me, You'll give yourself to this most faithful shepherd? PHEBE So is the bargain. ROSALIND You say, that you'll have Phebe, if she will? SILVIUS Though to have her and death were both one thing. ROSALIND I have promised to make all this matter even. Keep you your word, O duke, to give your daughter; You yours, Orlando, to receive his daughter: Keep your word, Phebe, that you'll marry me, Or else refusing me, to wed this shepherd: Keep your word, Silvius, that you'll marry her. If she refuse me: and from hence I go, To make these doubts all even. [Exeunt ROSALIND and CELIA] DUKE SENIOR I do remember in this shepherd boy Some lively touches of my daughter's favour. ORLANDO My lord, the first time that I ever saw him Methought he was a brother to your daughter: But, my good lord, this boy is forest-born, And hath been tutor'd in the rudiments Of many desperate studies by his uncle, Whom he reports to be a great magician, Obscured in the circle of this forest. [Enter TOUCHSTONE and AUDREY] JAQUES There is, sure, another flood toward, and these couples are coming to the ark. Here comes a pair of very strange beasts, which in all tongues are called fools. TOUCHSTONE Salutation and greeting to you all! JAQUES Good my lord, bid him welcome: this is the motley-minded gentleman that I have so often met in the forest: he hath been a courtier, he swears. TOUCHSTONE If any man doubt that, let him put me to my purgation. I have trod a measure; I have flattered a lady; I have been politic with my friend, smooth with mine enemy; I have undone three tailors; I have had four quarrels, and like to have fought one. JAQUES And how was that ta'en up? TOUCHSTONE Faith, we met, and found the quarrel was upon the seventh cause. JAQUES How seventh cause? Good my lord, like this fellow. DUKE SENIOR I like him very well. TOUCHSTONE God 'ild you, sir; I desire you of the like. I press in here, sir, amongst the rest of the country copulatives, to swear and to forswear: according as marriage binds and blood breaks: a poor virgin, sir, an ill-favoured thing, sir, but mine own; a poor humour of mine, sir, to take that that no man else will: rich honesty dwells like a miser, sir, in a poor house; as your pearl in your foul oyster. DUKE SENIOR By my faith, he is very swift and sententious. TOUCHSTONE According to the fool's bolt, sir, and such dulcet diseases. JAQUES But, for the seventh cause; how did you find the quarrel on the seventh cause? TOUCHSTONE Upon a lie seven times removed:--bear your body more seeming, Audrey:--as thus, sir. I did dislike the cut of a certain courtier's beard: he sent me word, if I said his beard was not cut well, he was in the mind it was: this is called the Retort Courteous. If I sent him word again 'it was not well cut,' he would send me word, he cut it to please himself: this is called the Quip Modest. If again 'it was not well cut,' he disabled my judgment: this is called the Reply Churlish. If again 'it was not well cut,' he would answer, I spake not true: this is called the Reproof Valiant. If again 'it was not well cut,' he would say I lied: this is called the Counter-cheque Quarrelsome: and so to the Lie Circumstantial and the Lie Direct. JAQUES And how oft did you say his beard was not well cut? TOUCHSTONE I durst go no further than the Lie Circumstantial, nor he durst not give me the Lie Direct; and so we measured swords and parted. JAQUES Can you nominate in order now the degrees of the lie? TOUCHSTONE O sir, we quarrel in print, by the book; as you have books for good manners: I will name you the degrees. The first, the Retort Courteous; the second, the Quip Modest; the third, the Reply Churlish; the fourth, the Reproof Valiant; the fifth, the Countercheque Quarrelsome; the sixth, the Lie with Circumstance; the seventh, the Lie Direct. All these you may avoid but the Lie Direct; and you may avoid that too, with an If. I knew when seven justices could not take up a quarrel, but when the parties were met themselves, one of them thought but of an If, as, 'If you said so, then I said so;' and they shook hands and swore brothers. Your If is the only peacemaker; much virtue in If. JAQUES Is not this a rare fellow, my lord? he's as good at any thing and yet a fool. DUKE SENIOR He uses his folly like a stalking-horse and under the presentation of that he shoots his wit. [Enter HYMEN, ROSALIND, and CELIA] [Still Music] HYMEN Then is there mirth in heaven, When earthly things made even Atone together. Good duke, receive thy daughter Hymen from heaven brought her, Yea, brought her hither, That thou mightst join her hand with his Whose heart within his bosom is. ROSALIND [To DUKE SENIOR] To you I give myself, for I am yours. [To ORLANDO] To you I give myself, for I am yours. DUKE SENIOR If there be truth in sight, you are my daughter. ORLANDO If there be truth in sight, you are my Rosalind. PHEBE If sight and shape be true, Why then, my love adieu! ROSALIND I'll have no father, if you be not he: I'll have no husband, if you be not he: Nor ne'er wed woman, if you be not she. HYMEN Peace, ho! I bar confusion: 'Tis I must make conclusion Of these most strange events: Here's eight that must take hands To join in Hymen's bands, If truth holds true contents. You and you no cross shall part: You and you are heart in heart You to his love must accord, Or have a woman to your lord: You and you are sure together, As the winter to foul weather. Whiles a wedlock-hymn we sing, Feed yourselves with questioning; That reason wonder may diminish, How thus we met, and these things finish. SONG. Wedding is great Juno's crown: O blessed bond of board and bed! 'Tis Hymen peoples every town; High wedlock then be honoured: Honour, high honour and renown, To Hymen, god of every town! DUKE SENIOR O my dear niece, welcome thou art to me! Even daughter, welcome, in no less degree. PHEBE I will not eat my word, now thou art mine; Thy faith my fancy to thee doth combine. [Enter JAQUES DE BOYS] JAQUES DE BOYS Let me have audience for a word or two: I am the second son of old Sir Rowland, That bring these tidings to this fair assembly. Duke Frederick, hearing how that every day Men of great worth resorted to this forest, Address'd a mighty power; which were on foot, In his own conduct, purposely to take His brother here and put him to the sword: And to the skirts of this wild wood he came; Where meeting with an old religious man, After some question with him, was converted Both from his enterprise and from the world, His crown bequeathing to his banish'd brother, And all their lands restored to them again That were with him exiled. This to be true, I do engage my life. DUKE SENIOR Welcome, young man; Thou offer'st fairly to thy brothers' wedding: To one his lands withheld, and to the other A land itself at large, a potent dukedom. First, in this forest, let us do those ends That here were well begun and well begot: And after, every of this happy number That have endured shrewd days and nights with us Shall share the good of our returned fortune, According to the measure of their states. Meantime, forget this new-fall'n dignity And fall into our rustic revelry. Play, music! And you, brides and bridegrooms all, With measure heap'd in joy, to the measures fall. JAQUES Sir, by your patience. If I heard you rightly, The duke hath put on a religious life And thrown into neglect the pompous court? JAQUES DE BOYS He hath. JAQUES To him will I : out of these convertites There is much matter to be heard and learn'd. [To DUKE SENIOR] You to your former honour I bequeath; Your patience and your virtue well deserves it: [To ORLANDO] You to a love that your true faith doth merit: [To OLIVER] You to your land and love and great allies: [To SILVIUS] You to a long and well-deserved bed: [To TOUCHSTONE] And you to wrangling; for thy loving voyage Is but for two months victuall'd. So, to your pleasures: I am for other than for dancing measures. DUKE SENIOR Stay, Jaques, stay. JAQUES To see no pastime I what you would have I'll stay to know at your abandon'd cave. [Exit] DUKE SENIOR Proceed, proceed: we will begin these rites, As we do trust they'll end, in true delights. [A dance] AS YOU LIKE IT EPILOGUE ROSALIND It is not the fashion to see the lady the epilogue; but it is no more unhandsome than to see the lord the prologue. If it be true that good wine needs no bush, 'tis true that a good play needs no epilogue; yet to good wine they do use good bushes, and good plays prove the better by the help of good epilogues. What a case am I in then, that am neither a good epilogue nor cannot insinuate with you in the behalf of a good play! I am not furnished like a beggar, therefore to beg will not become me: my way is to conjure you; and I'll begin with the women. I charge you, O women, for the love you bear to men, to like as much of this play as please you: and I charge you, O men, for the love you bear to women--as I perceive by your simpering, none of you hates them--that between you and the women the play may please. If I were a woman I would kiss as many of you as had beards that pleased me, complexions that liked me and breaths that I defied not: and, I am sure, as many as have good beards or good faces or sweet breaths will, for my kind offer, when I make curtsy, bid me farewell. [Exeunt] brotli-3.4.0/testdata/asyoulik.txt.compressed000064400000000000000000001311671046102023000175110ustar 00000000000000[Q쫊{m" Û,Q#'MEGSً~X(~ԯ٦z^Vw K?d NOsv9e@y0 9vzHrVYG$Z#44?  3[؄;ߏ]Tf=8@'M|Iig_~u0V^yUmyg7{%{/ /hH!>Jedj P)2{ )ƪqp^O5N{n2e=ZɿJ NwQ6g` Y!id!xيgv@F&F5M3!$oKg7`e[^so:J9BDtbkI~Mx,>9kTKxMψwc}P4ڈRYlߞ#T״fSAm 䛏>LfoTUsnWҩgȭiDWc`>ws@%cF.x{iSvŶv爸E*>oX$8]ʚj\Gz7TwV>{Ǡ:‿kn{ԫ w,IZcw}ԙ3|Y 0x 2@h>ø`by-V~rNԺWʠbTe^`K|Cc?<{p ,5L#W8iRg}:c}o-&GB{%+Juߺ_>-Yܜn=>xR !s{_|W= mryDrǾs꫄g>'N ^+phO3Ņ-wbӉ{, 9HI!;#;jK=0K&>h#d8`3C$nнꚩ)\9ˬ5"?8 hPLh\tp^: 2ȑm!bε{qda¸GM@ȔزE$2܀nxn(~ oΤt tǸhE {,,LMRb< tyϋD8OЎbAc4ʇ_s6tU$'XGHeEB3iXlAMU "t )@[bir|)cz9ABIX%Y{d'yA[?nHA1 @^'vw;@>J\^Tх@S 4Y-.,Yh: C)Jz=z=W3tˋ5j1vُ40W8-DЩ3cZ|m? vTw"Q]qi,l@v e2kJՋ) \"pN̐Mqqv~Jwx?.-`ۍEW yMW7|+ݨv 9a6NsTtn{ ΁džq.Z";u3Q JK͐{NIVf_=]%?5?\ٶs)i!٥e٥5e-߼3;_WRWiXXԮ0}u(9JR0'%"8[(׬~D=8SWLktr2U[Ң:'%'#g"GyNT0UR-/,VWoja9v\omF0 Qb<$? ZEt)$a?F]wdr N) ۨ,w",. ԫ5f8e0VՓfkz%EIq3|"ՅFKh,0ՙY=䫠o7h$@f0_hY0 1=;'Ȇ%3&ܪ r9pwn8Λ:`ր,po.|xKDw1iɭ|4B!Jke6p4HiZ@ret*Af0eqȇ˗Ӫ:E$4 }Hoi5*yMP@PZ7x&M%sd&a% )ܱgs=0)W"Yv$?8Z &gb٩#~N,Ns%Kn/"5Stg =̭eP:EW*[bZ_Y f)HFq"l iM-?$@p=]'>{$8Gx}{p'K*<:*-B-_{ZL4V!)n37?F{{OBzYHl,إdrޣ[oGNp@SM$hM2V~Cyƿs5W]oxDIE:SԪI},QeQq6 c;2u9 JiJN0g/9;\@ҢY蜆 U*>_ٝKgt|N S]:.Xx-S8ZZ]Su4>鈻6n&RFYЛY¿qiU*D&D<8o(>(lX* H{ h(L7jߤIS 4:#bp`#V>_v.3c,IXjU}HW$OC,`^<4Gy%&I}yw\*5 V; 8ш2k+4s/ Q6\9J2i?-aQ0DA~T?m8d?\ a%pVs!e$cg2hmd錣 _nG'T`꣔¨x)]xP"1.gv7?R5'.!FlM4<Ǝ_ˊ:Lwq49X, u6̽2Pk6=#X7; =nm/*f QUn s ~>`b\HlHЩ |'ʛu{ y+ e,UjʬrzriTClJuZQHȯQL OC?X&x5Y3 "ٷ3z} L )E;Gs"߇nMC.ywK 3~՘H7 -m˅8e*ZE0)gvG몞X5H`G:gp駟p?P$vv}Fr:tMȶl^ڣy{Twolt$a!^t&)S:³LbR>QhRfwZO3YpUl@eJ+.YxÌeO{$8b]i1ab\{ۢ;)p},X 3Ӫ?dLₖ`QO<2LF OG WҦ ED#s|] {K3{!~00n+ݽ5M@;WN5 wOi}\HRbG֑o̓Pr iLr-ҿΐ!TaBio$%+J\Y8f>ڙHg]|:Rh|Z$D!dV - \㊏y4j*0S1 AIrL01,%:bZ&Fj_l=6'}9`YuۜA ~A|Y r٤?n–1̓0$I40& yk2{KKn&ÉV9A@1#h9"m-@b9h}!a1EǿRR|diC%(W?E,*qnUr#^FUu(zB@ٛBmJ{=F}r\,!c+\*\EXhcN$}J%flD$VPp\LvK+n3PDͩi'#R*r4\|]z!q :UȲ6X{rZ6y$dӦfLfOe]{$( +ümm# B#'A(y4x(c]ŕz /e;opq:&ƃx!ذ;Yw 2fwAq8;vX+Tk8C_9o$lxΩ E3'lfģX WDaw ?x-G ǩ6—&i-:$9+G'ē6:+ś4珜8.'D0B+ !yyM^Zn;/ 8gB`!Mk"\|/iPa6L㋦0 !qL$裟^91N(`龜NoHPw` "JEW\$ӆam TNؙJf{ǏMJ*ր>~6)t>ڱl 뗱xFcO;n1/6 rd>e 8ijڱ۝tP7EU:e?7m#~<'\\<ݨ^@75*nlЏe'ԕ\$ۖCK$ o4^@Y0GK'>(*;GnHT87Kb2R(b>Iج YptQ?uiN8E΋E (BAcYy>dZgz4E~f`bCJǵWOD7 wŊ_k)_L~c;Щm8Ҏ#+ʺ4iERq-=*|VNE 4;O%$X:6\nq'2pR\AW]EC$ZP{{~ɟݘʷяbd4<;O_̬,I{;M,D\cz_3dojڷՊi 4VpTC^|։ByaZ} AVCCgo'݊ȭ[D. ofmD"r^C|_ յI{|3d *ckv|-^f%DG;gV5ήX¨e  G]Z܆(|4l*!? _qߏR_5Wwe̙D!u/<Ȓōݨ~Zý䓙Vo>.͊+T iX`R?=bbd=Ž]re ԕh(|%r}K?㼬 bxr: a}OG%\'TO3/i/Tݱ G kf[f G#][^Vy_JUW|SD90U#i4xE x2:NGaMf ^Ӡbdn |9[J=2!?ef374:_/h.~6/0[ڃS!8zQkO![$;ətc*ߍ= 90z+4' Q$!Rcu+C.V!zG&8j7AVV % i:=G6BNfϴ;3XaZ/4Xuy$4(ٌ2 W'L'>݆:xgr{]h _mXwPv ?_u-TJW"7t  &Tr$_] eI[eۙY;0[dϭV}Hɘ}LnL0gPU(tf^(;;1sqbx>CK 8Md/[l}3q#Bq 3`i,4~qS3=v}^Mn6ǵxD 2&;[ĠVf"Y'3 y'iV9`w!3Oy` ]$mZ# 7t"xRt2^v pmLyewBF3+'Z+ ж;i]rJl48Amǀ\L>[; 0iI_z^U.1Ƌ=v34-[s 2dXrX!b SQdêm\^W1\)J 1C|5ߤx 9g%ʩN\7I8ޛ@}Q@}jcrm% reM!V67#" Y qCŠ$cZ$A$n糆@tr0|үN2Ӷ ^@]2U+B Z&&g}uY߁a_dJ( vFIE𨪴pn1:9,벳p2=},|uH/N, q1&Q1bt7P\]8s"ݧe.?)gk㳟(Gkx^RY:t) {RȤ ΀/ONSʂ]N~s_6 <[0 Ȫ\{Gb# ĵw4W[׫©D#+fW0 1o lViƾQ`$~y Mj5f!vGxږ(9.s|62jC3iHtTX>%ѽցEyGY>nZՄQG shrq(]2a[TxuTt*DƓBG]{b\ GI4*ςN}5^NxOonlz-翷~D3XT \fw.E {i֧o*CI-+bB>$ҋj|]B*3s)#WzBwby&`&z_r>d |N+rZJ,^g*p, ̔F bU,рƒ01Q¬ql,¤ys˳nEhL# 'ERnSi0]3e~i1wQ| +Kb&Vy`lRkAJGTx'yNˑ^uhYLV>ڝB ǨtH#ܲau>RZD(>_d(δڥꢫ^pTZ QVThyi`",Hož $w4z$雧:YAzǻL=Ѥ4o]H'yȦ%~s+JXFH4g+-,_vՐ+L{NmLU݈M=}5yBˉ<4_w`Zoڭc QFrwk63$鸻3d2yˡ=%wq:Yq@ @8)p頜ڞvP Lp_ؖA߫/>Z iL[*X^b Ty !uu;f:qOQH>n;ӿ-St䤭_Yfɪ-~tu–\f2y>a{f@m܂ObZQF.N|AB)MYZcКQkp.ÀKHF|d\"Qz(UZ4qԱk,8CK0| FmW.:=_UXԳd EC.1A%3'|H(Nk\X̍s¥a % ^S#H_,f0: kgգ8!V+(|Ͳd-GW/PU3$U$[Bч52qߞmx@u7(ZBS |%K9U܎o# Ȥл+ ryD+ ֳeV\U[?¯1i#]{K]y*^W"aBg j]1u晰-AXROxhC`DqHm rtPΉQROyT$MOH q"pτy>'g JB/w3sBd.^!{,kcH}PJGOHU/Z>Tc BIB7[G$<eRY>_eV~_)6܆ ~9.]e+vTA k]r^\ȳvK. ?L"|W~ wd2wdU,00x;VDyYqt [ xޜFbG62dsͪc C,܆OSU3$ Ϧ-'wdEvRjMq 4rGWQcB" {SYҺoފ{7g(/#Kml7ŇakB_Q9C 9,{ &cXf'A˧gAdŘ N0l)g{0;ӱ ΋yۛ7φv-( I2WL`ܿ N~*ĉSu=Hk>j2~P/ƁwoKwE= `O\e_0I˹?;8yt^"|.r^FRpJ)YU1pBMɸb,10 ɠD;"i?`GT3Ȍ .2rSKYtɯ9"W^haO?[;i⤹{sL̶(: )ٹ$ 2R?%L"w{>='fd_߸$ϰ:mO v]j$@N E#_4'%cg]VP}""VtbӋG|WgsV[Q4:I%G~Q_7 >ܩDR^?DQ5FrQi,ZD2G 1t7F {B eIactJcJ.?kq+Fr }HDÅOu'K1a֟ҼƸ/x"%ӋG8 }Z\J֨Vu84KBd\h?܏X|1|h:5O3-Ґw:LUMauGqNi=+OBg % udi~UǀOwU,QY;VUhi]iV&Ta ++AHG^|Ykl@3mz}DD:" =UWT@=l[W\R;-P}>u r~*Jp\kO e+=hDWX'3i1O:k%xC=j<Šྱk0iKFE,R{NC}_]x!|umi+sâv>0iv+uQ9~ŝ:9 XV(L1@\3jaF6ۿ}Դ:!Y=N )v,;UVRFUU ܎"?k_n_ohYכ=/ Q,s)Ӊ>οD/:av7)#]}rG wKZymHp'Ojٹn6ouB\dX K7^E_1̲@8`^ؽWdY96nzYH(h_Ly'rЪd;SKܣN.7M|oQ\@N6 XuP 2dDg`/54d+|Hr >s~=pNE`J=/uYFM$|~d /ac  &^sVRq]Blپ]{9k6﷜6$6;ƽU_ǯ Xq:MVɺfWE7Tę'EuM.(8SF.4JWQ[pPpU"2a%Wh٥,RRosPםߴح+|Z@XuJVnFogJҢĚ/iXW[@m}AvgĂ`Ah+Y?]ע+Ū5ԳJ$dN% \[]" ۬%ٰ\D{2*b?O`?_?[7-Il9[%+>DPI =k\DZ\#S=lg yYĴ,jӵA^Y LJoV?NMQ ܲ*(;Fw68Й |(z-o}  akeQw߁ںW FYN tg,5GO&Sh2gQy H 2fM{yaCkD@kzT9[A%m¢w[qڻ2"V\%C)Q\;FOȀ@5{Uڱۭx8jUDa=^<7{e|ێ6PǗhpDv`)UaP!UkclsMNV+uQpeQ?!1 +2Qy$@LTK4@UTr#ČwXhGxU61lX0G(玸dL4rvO91*f=(mF"OakNݡgU<}6t`ӝQ숳QyJS[:T]O_>C aj1}(6F- .L2ZFoRC E^{{c'&b8͕(5!k'5SY;&t{S#ʒNYnP.wi86uN?z2F9ZbUKE3\PQr];"˸İw@"5V{T?"=ל'vT& LKL};;^?>gxq T[c0lpՊ-F>&%jke2&,Q.ЧJ0@-~%gu _&[IS/5H[㊹'We;ҍ⢺6&~[ǎaZ1`~}>'Dsܶٺx}̣S%) 4MM\B_Ot3D9LARN @鍼ZvaR*,b_uw޼[e6o8A7fF+LFU3:8=jhXߑ yڧ$F9)̉'f2πO`ꞥ{e% &bɒ,}a$Iљ yu"XV->1 P爉 7K< /[ۼiP*uY{rx z%E1K&I*Z2 /[%@l~= >*R$NA< ޮHghѩ`p룪s٩gTLI?aD|JK,G V)(;T)P6_H z~̀J, ,*cuAO՝ lަ 5̳v6"@QCGHR?X[Oٙktb.;)y~O#jG412_}X4~eH%1--WG /G;nWVP%6A!|.t:a;b"䧡/΢꠹*9} 1ܜwjӽ]VSi/;No2RK%nuFk(oX({U/ݑ.;ʴn!)*KOHĢQm =bƾ0\!4 WN+9 s=ƎjX_0$(ֿ K1GIR,KW 0!MxV5]cޚxDjܑCOG0<֓\X`}# >`IUV3z"W1r> (j:BѲ_{}tק~: fӤ<(Q姢]-!,,7^lp plL1"8l(Acpu l7.?1K'Qo 듭xm9U)n&UiuQjdIB`uYJWmO?gI=(F$+~m>@ND'6^2]_a?+k6DiUOK]k6hya2drrْ!sj%)Q "< .ˮnYWN-gh$ j_NCQ?:rR3Fo-8ԫ,` v4SD?OɝM$5r@ScR_gz": &hơ00g׿tt[a/1֗{/wDK{qq&OB&;Or\Mrk` 8al3>qk]Y4rss ![|;w>f1b՞` j?p-DP;x]c dm-,Oo[9Ȳ'pԅr,tWhrKzdx"90 `Y QͫsO vҢb|(O ]P-^慶D_ab >V/yr8XʸBMX$[K~j>3a6?Lvy%)T[S]~b\MAYHblE4ӠgQy(o {<{,^(\~aGrgNs Z)_8wBW5MLg(pc+O9&S &-z˜K8Wٸ >$ENfxJ^?ߋo^ג='.–: ' R}O$js(-5xb7WbS"sRj;9ӆTۏ}STat5Td4,nx5XkeTKqp|e\]LVxL2e7WTÔT0L(fOL!|owdZIBG燳@䟻&PcYpҀR>Hnpn]lߞmjE-rnGЖ",äփhϮ4X/> -^!9Mֆ1ҙǵ=@$_gZY1߻ENs6oXXd^Z* |"a;Tl^/7X\ͫ=5!2l0Kq <`/4^#J$F4 lC@zِ4n IlYkZyhg4"z A5Gn\;\$B~7M"e6GVhhS^h+3ᵪ$qqHO[z1o^'n#4@=GdKs_sw )40ТsV>WhQr틡)+psbᐈn9-g~(+5JgOq.][4uU9=JT 5Pd>vf& 荺ȕl?G"FN4΍?Z P D rwTPb&%tɞ$kfY9aNKx~5Ak`~bWa: >Q sd_m+VAQ&ʛHm=#N t~]VxNO hlm)2Ȼ,MSih"ޥG+ ;UAv<_}D"f]| jH%azvxm\RA6gZ6UӾ!:%so!I;~[cƄ?1"]@ G) Q+VcnibbU `Efl{"j1q=ښ(aXiwu,>);<žuàk&Q 6JZ.)6\I}߄̐)dѥl~،U:nSbRIւ-y״e0cɤK #]{+ON 63Ô^aFi%ef{2 W6#kpL;r5mFW*#I;Yv_0Rg o7w.㳹QWHXbcF`Y{e ZƣAuurHȄ#8SCN gJ0cZ@,"'!RI8f EG$?G47dъhxH.-u[үڡxW.ÒJ_+zWiipTvlL5/7/<2JNtf$؏фpMg qTD]oGJ:st;B.KEf%{(Nud-i{~etdm W!h湚DD{ aT~ .AV*/0 D*Md7n u{>DrO0ZE:c]?u=64DT+4Rj?Rkj4 :dʦ>PBe3{۫j>i(] ') F\vZAWb;K ѺE%cmك@vrmdc `4UQ֔XU<̦C >2Q-qĵOԅG4Z:h1G=WQ4I\fᢛthy>QtWP rGE40&S7B|ePs: 'l](1쓷ԕ@*$tek4 4SV0ÇI۳`"zJK-1ǚYMՑ7ۗ{2\Lq?I =,P:6M_F~^;Os=9 me a6O#eǝzcb( ~%/R.w;n\u?.dڶo; ;'=6 |Nj&R0j>`Q`/cj[ɟUp1ˋq$MH2gk"=r+ ^\L9qU|*@vĂ3 )kf[7?+GC-0ʴP .,M7d"#=U "8%% #s@Ku]zб)̇bcsׂdxz:|lʹ0>4ɾČ 1+rs ].޷w6TN57&:fCu8ODuudau) 0t4OLЍq}ɵv[U:x [Rz*{A,7xm IlZh!|¶($X|)@0k ˜b|FT6Ic|j͘Т]siJ§v?il<9&wv%[Ӑu.%ܣĝ{#,h_kjrIUf' y3j븺 9*ujs)+%PmP뇟e|zME4`K9UyP/Z_0p55 ~}-IAr;"?M4 wctC`S5%:Y;Couԭp %ihr$\EVJ(βn߉%R֒C{nPxMeȔ1[Q|NzacMV,h ,uL.P :ױ#Yޣ}ϩ0ͼ U>95Cj"܍:H8I2Z}!w~` ptVanx߼8ضƳ.kfq.v^e/\IJORxpVZOқ9P } t׍4X\AYlUI0@VUHQ+*0X4UDcIo6WI[PAJ=+ vx=o]w8̔jn0KH{A?R\ȋYz bʻuo&2S/IJQz'<+8Gyr^ECWYEPc.hstiq n]hCybvpAz;n-,y?AljY9H4g0/TVG*h}{=da2^^""%Vc)X2^>6dwig]gP,uySF\f"@i8jp$GlasF[ݕcrwi]CFc=}wvL*frМD7uIjH5T,8b/2KQt5dιv!j/Q5ҚDp[zhݳȢ $矒 κ1>}pw+ #vun>H4c1mN_6})wyYu}X !]jd/6 koQ?D!*vdNȪ/deOrORS%7jK00숟'FYKU֚Cj-ߏ)oZ H9{/EJ'M{4gCISWz+^ٍ?`[b?LmUET!ǛZUq9(`ŅᠺQڃsRҎ7n gCT#NpPA6 OcTgKuG6fS%{ @XbO&k7;Q3Q[wI m(iZrdXҧ;sT{l3bcvZJR;)F(E+ + oۭT1ǑHՌILy&)I@7 =Q76׉\K +ˠ|i9jԮӍ(Čb\{W);1I~*^\ >̠m(֮7,LYוTA*OHvE*(pn2Ƹ>#glXan'RMJP 0\0''ZVawђ}1YE fBiDж!3L8CZiCfz aջƙmzbFRumkK}v731jb )1gҩJ^D|zb7Sն\|P~VP:ˁn6&X#ve[өat|Yq ʲҬd &&Lc\CDž]k`8 Mq;Z$J5xUnљK %n PE6НN_JׅZovnteSK@F澊\A`Ol8ʱdV=,<3`) TךX۫,FI)KXLw dԄI+N5/*yL_chW8o9@D5kgB$+fg d4;Β'oJẼӍLB>Km̓`*qmQ~Zk `/B/s22T n}]FvQoʲv%sȰ} @r:Di (a SDdo};g04ap $z .*B?Xkc2)Q_NPUDNx>Uc#8tgʓ~2pj7 e˿,7Ya ˈpإ ?:~.C0(H(iQNe{F슈C>L;1ߙ K]م164Pf Kݶ7>p&NӐH6pxG#؃yῂ#Cn>r3{wxI ئxTήr5㰨Zc`!Zxf9Alɗl}=[PUDB9S{VV+&N.; ٶc :i€' ?dMv(k>/PAo" d0 jx jUٍhD=En}d:vHRR2?ENậԯ;jd37ri*(Eu'NN33i28ʼA7KYF읋n.-:>uaˢ%|Odi.f_<2w,|zj|ݾ徐 0"j |T^)8 f|zGuxt5GXs]}VI1 I?*W&W55L`CÃn緿9c;cI/FñǗ}]-Bw΍FSPjjIkT#T & GBj%t^/ ulLz@1lO`fX6~NswdTڕ7TDn9'OvK1Æ551 >aٴ!vP܍,VWj0`7gK&K2pEM*u+#ҖR{o7P 9IOE" ӅZz;Bt!5V(7O&W[db4O< 2I龅j:^BX9rU4ncq60ڳ8 j[Exx|YP;#w_ sD;[05?SNR`HH$LWlݜNҽj1"fㄣ>91^5C [3L ]GL"'[cǪosP phbZ1 OGC0>7}8(2J#nRC0ehb/|:>)r۽z۩P?Ka4ѣ6~Ea;*>mX'o9t1Eo,9NYd,7XѼsI\cjȥ$U9 vŧ.4i{:`:Z}7ge,hכ{U fj!Ot(Lyc2 H˄I>ĄOHM/E%1DNl \p;  ϲg ax<}.`׵'iӞp)B 鎦!v)yݱ|س/6!n˳xSy]+vnlXbA$$#clyI5\<-qum лl-<}YbͻAVXGX8x3lDv7,k 933 4reyd/ U(f boO!L^G^C,6: Ο 7r~C?n5t^8@\*~0o].oLt9{в]?Uz\&=p3١b2%z[!b|ŤW{E<^9bG ۓ 4ײmj*!m_;au6T?גgBoVps7H؅Vq` ,"tp&!YHj%.BCaaCw1H]NJ uRn$r +n/plvڴ>aVzr ;8`:TӲI{ NV}&BۆoU%ANyjj,Kڻ=^M%VJ\0\%Bƌ nۃRgVץXҖ QL"]X8V#~~= mB/j0@Ad@f_T1Z;2U_hq~ܸiW a(&mUBbA[G mB7 Z_~<߷Bhͱ,@} Q@d1Jnmמ,')/yЪ8]fFij5kL _*n2`^;;U.Tv$(Q; G3%.MRP@o >>V g` "ʽ*𵬻GuRi0/yZYտ;d1cŪaZaR^a +} p.8 _A&6ܠ̤N_ !$roo ;K]Zy/z`1[s09lG|)bl?'j<~TnvSt&;! ϪYE|]Ŭh"'&V#@_~Dϰ@vKR,gvz&\ڶdQhb%j]'粙%9'C_[0Вm^KLֽ~(?vD;>! ƅ"EGjL.F8>YK!ʘ -p:]͍ NG)1Lס tV,pBqEiA0/۩Sc>VEmEs_'Xԙoǩh *vɭ Yg%һ^Iݙ (ܝ-;|tMeG-sI"{bFI/mp'{)/1ruSZVb &3\%p@edɂ`-كGZY!J e]-hOٵ$u<5,5!~}b03x£$x̖تup/@kQ_N0 4G L3g&\%v#n#SkWׁ!hgH|4딏B6;[B. 0ѳ%l 3"*CToh"YBX&+pZ#/dhAˑ  Mł R)SùT7 /R}6 `FzsH[N53"׸It) +\@|A,aU H~:HO6[Ԡ-rF\BWq:v0 jt1|7 c4/Nɛ͋*F΃~lGts |9M|o[P&7)tZ7I FJ1on/m&j8&5@!> HLÙ?vp Z+Q m?4ceī:S&.jIJשx[S|Śo U\kodW0ˡyO&aQ$kNmJ c*4?I0<샤"VK Ef5-:ZѢ!gSap ӆQQejx>@FyGzܫ_d]hi;&c0w247k  *>qp6Y,8s\{b4StA~OEDicu$:1n)$qo/.X$9m|.@,5jV`i+o *s w0SA8{HCGsCc6z9b} ?qֆ{RB@I`V\Bj 4/rg{gѻ|G4L3*Bt! Q4@29dA|VxG*(>CKj~ K5eG{4DpP>O?[dzfbT2+JFiu+d'K;qDL`%)ˬNZ@}b:HƒBTB"S?"j0׫?o kDppp(EUB%>h9*Z>R$<נp醦I|#NJ%ØMQ<=?R.yE$?hȚf~D>L=Q:7/") > ّ+oM+8ZZzj ۵ߌ} $0Q!+kfaf+Qh-9&\$~L o s${@b:@vxl y:g[ [p=v{,a6 mC7籏->^DLHw\9˷l:95Ԛ 2*+"b^Չ0IM ΀(^f1. 1˯47}M@!Uak(sM6vn}5?5NTZůq2;;pK{p:bO-Lt$`νCV ǺUPƳm X֪iSyJu)y~~yPLAƳ)5/=/(*Ea:/tsgQ]}X"ACRKFm{G^%f:,02^io ^shP?A&[OS*{ 0$ -L1 >3SVs41нpJ4d,9򮘘҉l ^c'LhgMu`%gkWOK]nRrxeQ$Ʊ܅ho!3+!j/r2P~6>wPĶ+>ѭgp=҇fIϞI/a7fp>/?W|Y#b\bVpN~舁PkŷK'1Y#o&=MsN2td(xH)WAd_z>ӓ4Zs kxHp-S.o[稓;- &@&Ɏ`4i2 Wؚug@/QPez11֧/{2(0t4B2ÎCֶe@2ғ2é*#ʞd-^oB p/ VٹsVyb>BKŐrF4ȢxV f{*)\pSRq1Pp6JUҰm#$@+f 갿s[ZWܱ'eA.]}޻hfđL$}Hw *N"u2KnYQPˈt\a.Bj$Pq̵9>P[NbaǏD3ҽl6]WzJFnћ#lW+=HWo`#g*Uae{\$ fJP1xiUWgbe.p*d_6}FLw/:lwgIYE14k]gCA^6xٺDISR/)-QNVZ./X&( Zp'b=;4Wc?Z/iד/X`9ؓ@Ҋ:墂PXW1JS-xӾ,H'̆eZ<nIE90AկpMqD$% Mg@/?%mlKzLlD6 .HuoK #jZ;+3};r+^*zƹC˛LasU;"crAQ bM`#ˠy3FflX8YS"0Zj5(d 5/ӂ;3Z1^/=05^ .)gҫ1l!N7jeS?]+ ۙgm<ټ{w\/K`RK14[ٵjpknfbصiTz-K/6v r.JmUR+ՖgmJHYsV-|;#L{`blv,ǬKk%<bU,`HvCgڥ;ű$( UE(Bs vtV-P SgZqGkXl(ԸCK7*͏'Z7aM5̵nn5b]]D%hB2#Q@u hj@9HQJj"w^lEl9ISsxjwTlv \^+d璘}6t{dJr%~V0TZH=F5 4C4KR "vo[Z x۵;q(h SViܥ7PJ@/4͚>d )0^P{U7>Wz"IԑT:˱9䚏56Ώn]jm_|/F3-ҮuHTo`F&Jc]%̨S#ˬKЊ]l駠b<,A/7 iYDqF3\u-=JW`r< -nl]2>a@PPaX'aĮ)8jXSNIt+TѬ:xP>t A[=>N~ϼ}eY:aY,2^*M-b*ep0aXo _tx!' EID5\*8ԷknUu78wn6 lY4kߌ]T2S85[A p<S?yNQ̿3 Q\abN6BZ56}(A~)!n˙p!+yJ:Dc94y;sp49Yu \qo԰ou4^S ˷'^\(8t }a$-*rKo˅U*wDŽdR%H] Ż &2~V6Yx27#QG X(,߃ha EɃr~n~tТ꫞EQ-ُۥyqJ颥%94&3}z^=odP^}藴@,OTxzQzI?}R&N*lf:k$ zpބ%,{pÜaͭo$.E\އhqOc7j, SwOa5/IWgT&dWϕV-}4[njuuIuV6zUz.p 3 '9CXAaH +C> l9.Q)E{8 t1=G{X/U3FvG.͆%IȢuEpԍoK?!Ă}'/ȫP`rw2cC,b酠} Y̹d? k8g#vͦxhx:!,>J"l2I aX`߲CWN2'\1..?J>LE2.ocA@ZtēlzkW!#J]dG5aWߣ5$t=jOwm-?+,i-w0S$\q+bl\޸Y'֙Z'OGǨ ~q2@?V!#t_ӏU}Y:H75僮 s{`)wpW * bbVw\,nPcub hl?[ߡ17n;oMehT-w D?8WF&L+x(Z:zsbCӞBOi3C;z"`^tĎkfLi|FƁjԱۊ`6hIyjPaAR#8j-*\7oAj #fAteα{pNw-nhBk#JLjɣ@ܲBܳ8b+2a[Q[ϵmUχX4f(AtA O#& ǥ`# )!^GW>LUw}ԓ}lVz9s+iNqg_A@m{k%}Bbx@"ĩ;\xގghTx9[^E {#NY"1Uxv nh,xJu;;[)nZN8  L ̆Uk1T܁.XMeZFcHqΑh *pؖ oOyЋ@í5N)q)!^2:bFQ2#(mVdQC2#BErގJ>_8*3D(04GLf9Qrt:@vL71Sgc, k •<T߷fDv ,>N(cз:Rblg$C%naFsŋƎz7Dh?M1X@ aR&.D Sp$>A΅C`ˤvݢ=4mr"j!3=DKR>ÈWQ Ѝ}H4*1Z>wt'OVb'L13*@zz'bRmꂋ|af r#V5̤8t>Lάp޵ʓ 5cAj~e*nMNR᡺#ndl ]oŗxaJscض{M9RסKPEږe2{AxFXΗțe "q*P]+LFre̺}?r{$!=LQnPb>SkVHbg.drh8rK䐸 ћ='pq)ΝL/vah & Jv&t ϓ͋} .⺐ Qb6U2t:P :w+f^Hr*S7[xTBd| ?a:5iʒ^=ZG〨? Ċ4Rnj5,/5vxHó=gR=p7%p4hN<޾ 2^@ yjF?3.<٪~{`6B Xaԃ[n~lfJ̇z鎆.ɚD&Lke\dL(iUO"(mͮ$T:/UūW aHfrﳊ3S EW ,:PKLhʧ\ g`#6Ys 9P ,坟VG F!dm%S[8ū/ ҝ rF{~P37V@1$wWrXnv 348A \cIXa/*co\|2po)_P?`"BF"P0 \Fq;X$dAzG-u,}Gi|ˇ[+0%Kprbzo漢(O#0 S4Oh5&\'mRUs1( 'MLXk @ʃNi ; ڠ䵿f;2i*.F]:ȻcH ~{T8N/FJpD\ڂ8ofznYm 7M:=:_uQ䪳[rWs*,?F`Y=`TGa86ڹ;]<1nн ;N3cYݤ1˂'[R5>x賑Zd1[Yya@8O"S,{ ڙp `.$BIqƹQ~B s4&yu|+ʊ."Tf2YfK[q'.ӹwuNLX1[^ٞ(U,B{$5&w&XjٰNW/n 'GsKfA嚷8MNfkdh)fn&lɨ{aw\_;jKƬCm3!Vs y=2pVݪ+;w.$fcռ7~p\XXc+ ݻl]>S,_KOƦiz~if/:~INh~w?1SdԿ`s8fq‚,NHcUA*@gozHfcpɠa,9V LMiCMsHhRڶe:(8ʦ"mAMB-jVóة#Cʾ(W?\ ó1̰JIbuwgtˑK U'>ҨA'^XVXO3=@ _νl`2CB5?Xg_V鐴N+tpG&سdvZJflTmT::;Ga1r[8vhn>0?NQC kWʎyգ+J0 Z_:Zw7[7=Iӣ2 /Q|{_]H$|z om?$VbuAu) ,NUݑTA R\wvKSOvԀ&S"ʬL0xO Ti{'5瘀vl!{.`&*X& ҡ&B-s lP~Mʭ{N䋠dZ?2-ϼcQ{n/sd;ra,5dRCwS y~kP]TP%)L 8ec; ]\qƾ:$3Kty"O8!fzxhd;wID4hl4!֫_ţvTWbq*[gke5Hx#Ѝ4{ٓ]KF87dφ Q QNy4dZmoĄ~͂wŠR4* Pu 9n,OOx5~K9y˗3o:dpNz!o$tt)lvP-{mo?"" o'a('3)ep*;AcW}FHJqFtvFOaKKPK%JY΀7ʢn6l4ѕ Օ t̺#JiZ2ӱViBHcs0|^=FXNS6u6 L6q:Zd?ѫ}{ȹ!]Qb|AK1aхL1_iFc{ fAxgR^8%-t6S \pȈ$AA+O*ߤ")0PX:CGpٵz[,?k(6ֺTgxBas(?b:~b>j ȶt^{룟S)MYhr&cȔiϼidx5<*ļZWowmGil7v!0v6E1/rg2:7˜o:?9|yVAyHϧ?_'k[]ݥѐU}Ob˜l:7Z-/N > C:Wu:ܥxuԝ~?fݰ*d)ܠK8p1s|(S %3]X; :6:kn*[ R+zżrcЫiLV-MՓ3âkg:[e©U+ %tq{_1 \iH1Oo;gDuPdqL;Q_uvWXoJt2_?ih; ' 5C;bt՚+h897y 3 2T.xVf)Ynm#^Fvw+LtXSH^O-i$`]t1 mOfuc}hS l?fuӊ{ 1߆m$[ד|]*/pU- >Aݓ%>l9I0fE-[U"T H頙)_聁VƸ't2>zU}DY468 ަ|q#QC8P13j3޺0܇hFH]IN0H%hb0Rv Wuޡ S̢nt6(R*/+DMQh6] l@up?v.3*&I?~A&A|FϽ2N%־RTO^M5my2> 9N sMzang5Qs){U6s,|\Lޤ l#50m {~sIR~˟ ˍln1?5VLUmhR]^ aZPvRJN~$(^1)B?T~9]nubN<ڋqp>'o\bk9r[7>#veh:|q_N0)m8d穖N0qb˩1:x#B YFT"8ù$u}y M\;2`$Q Y[dI*]7:u)F۰tRKhxZ`yJ _0K`XeRLo_UF[chʧ–s qd^6j݈߶Yt`ێ=G@>yxJjA!h)'fZ(f5JWA4* XU5 3/ 89s.mGΦ tKs%'eV._rw(V2^ qoLwyeQW曮!&|B/\N~G-8cx/QGM|A軵\X/agBT5^Yp-E(r>L葔H#6y^@KzYȴɡ\ m u, ] -tؓ@ یvu.3g mA.a[ c䍀T 8)5lk$X?䩚==}IJy<-2._BEƞ8;pbkMCj|J$/Y{I"nJHe+QUe/݊ rQZ `xtԎ>ۼoOe[^^*Em2o_Ӵ|N߈$ޑK=WM2 _^,z|XK?oK7'_F&0Choei C:.3˂k;QDFDL*nɛsz-S?RŖ{o9([rEVF+7A$dBVb^u* ,CUH3S_6it']n3[2:K;b{p~Ri5EyՕrbt_ثVߦHvqX}l5Y@nOR5 be+q6(^h$'[ho+w{J[0 Ҳn |?۲yUIhB"ۍ  b4@nc]ʕeGNimO_T2q2 DJiQ.b \N3Zҥ E>v j H qYXGWiBد+[]?׷.P6OY\C2 M>13ꩇ`3,f?nc$Ì-pnfߟ͎^#pªl2beH6v`=OӒ G A=fq*G AXȂxegV貈DNII5c-H}djG]_=r7 , N%e I $|ϖ2yL~ݎid3Q Al&?j-P4L[^N 2z.ٚ&^d?wDiDeCXec3]*( вi< @7^fSA]iЦI3/ut3*ޔDOq9ZTRAV'{[jq. u /1LnCyğ;K/"ӡ83 _;՘%ϐ1-#B.9)eXrp!~*"lF~0-Yfz0%5Lry[NKe|1m*Hf9┣z3f9V#+pk; `Hr-ˬ7!p8~G.V)7z@>Z\Uc,v% PZ& G3k梉brotli-3.4.0/testdata/backward65536000064400000000000000000002004001046102023000150420ustar 00000000000000XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbrotli-3.4.0/testdata/backward65536.compressed000064400000000000000000000000231046102023000172040ustar 00000000000000[@ {HNsbrotli-3.4.0/testdata/compressed_file000064400000000000000000001416601046102023000160320ustar 00000000000000[RE;@}.ҊE\IKox4]MOl!+l\ECKgiE_|ݹɽ#IBƁQ鐺LJE`;l h/@wL1F@q(}fQVF;EFpdqȑX7Jdh 2>W"HA|#n9l[=ʇh^ i~_o#(aHQA9"t,}Sp0Q6a2Q|=,C@UE* oQcHS:MG쿮FZ&Il}Y}i;z5Ù^koq @#H HQ [č~2LRU`QGUUn(ݴәCu. !lr@$zd΃vS->B im};; {4phl"&= AbO\/gj 1+cUz>Ͻ :! ѴVa5h`PxNT)Ѓܙn'>?OϪ;, 1`ppg`̨ "HPߋ #8p&=[QF0rhɌK`}HC;+x D<`T$EH^Bgq^d1^BszmWw8-JH,_.{wsqҷgXْԨu^:K )w4('LXC8pOA q$%B,T)gBm!nCW x6 F}gQq =? %$EIJ'b p4יI.j|!@el) ?&\f60dA_SX2xOi>~ўP6KUwiy W[(b,73(L)+3.hMd-6##Q N=&F&lbZ =&>TkH 0h,gPBu"/Rk9iY.>>'JEm nL_ <%BHB\ƪj9SKcM>[Kh_"0[Y?Q{8ߛDID5^ \ ~'"NIzu@:ֻk $+}OElW IHbxt*mtKnԷC!| Qz.M7{ONs JFECU8X|H,-:,aC{-mjz.iY;Z%3owXE S#;ZXq3DF)"F_~d|RcKU2_$Q;_&^$hm 7+(a!0_vh# >Lkޘ\7;d4/?c.C:Cj$L]K+kʨPwŒEL9y˙|kOVjO3U8@vZ`~̾# @ , D(i"h`cR)k԰[]-ʍQP(G델t+ZvXp4nۑB%ݢBfFΏmMU 4~> Eӌ4vseN7Y叛)9e+3Q 炪oHaa.I5SpcUW-QJF-Lc5<8Jz) *L+:R֫7/A LDGktn(-31^Qx)7\C}h뿉[=&r! 8]^uaR3YH, ?T{F|Qj j-+2V'ܙ CH!OP8,&I?FP*A+ƇnNDk9fm(+sI,EMyr׌W8EKwBh]1FxjOEo23@ eGwyQ(uRkFMM=u;&\?pq]^L ta]zvA)%+'yx[GjkZdj9GQۧLf(T&>2l+\Ec |8 !']&%0W&!;1{I'G7Xs@tɜbʎAFtB8D]0eһ{vO7Le:̌i7L+eO,RiEJpdoid|ƞ;/8Nv!)ž)#K QX:ӲA#=ലbDУ(}~p4YOEI'? )k`!'Fˇ@cbQVjIvQ}ȟ%&R@kҘTKznUنXE1s0/ތ`Pn Aa@NɤE$VmXW.eC:xp*/*kGGN,S"9Vm70J'FMǷ1 \Fgߋ֙\g)d=t)<yВΩ=/8¶! zWjg\Yz< ͵;D}圌<%fӤp&Ґ۪D&%ԜĄ.*PxL, e*R{[OQtԇtD0aXyj UGdIRԩPLLKw i tN;FlpjnPԌM@Q.!I"bEdo~ @9H})ʫ'uMƬޮ([ҕc7vVg.%0@xd(537\oG7FjϼݟYOa]b%yŖz@ d^7;{ Rk,UUg0hw Մ&$9c\j10 n. &Ac^U7BߎdiFj:JxY'0!J6Bi6jOkj/9떎HQ%TCF+-ofž9庲3@O9vFYXI@:o9A<ۦjmbRT4$MƛvN}}] d<\%Dv`0 f&5»u|p+EӍvƶPMzbvG(M}$RUJ.mW 8X ]=#EC9\&%=dQR ;d[}}zW&Da6Z'ݭP_Zm>[!GCrK$EjsH1^0s쯉R ZC-%3[H2Z*?et%F$"Zr+N^m8ъϣTE6S6X3PDꞪUk7ԟbUclBY.-qY"\7{ZiD"dm_1oVԉ4Q2H{0E)ȌS>g;`s0>peIc=zǭ*}FEc 5:oӍ ]Y8+0Ðl@OeSIMƊ>G!`꺄҂O3SAx D1PA\.~r>&*')J :<-[NE<;D rSo§gP$}} kn3vTUfx&m4^\!ܿz !}1a;cĀgla*V٨ O ~tI#x٭i-`~ 2kLe=$*V|2` !+V] YK-ClRV^ qjn,*TP\:0+Y+ÖGxQ< TSc@놌®L]^pZΚFᏔ&:twxK,KsH< gkLNm{~zf:E޲,]]׆" Mx!R~Nͭ.>>lV&KUkzn 7ZC0i5 fIrt=[qdV>Lvkㅅڑ]8^- c@atNt+Ue /m_{LE=CDMw'Q+)xf΃ڮXQ!2 K#g} *"nhʎ9ډѕ>T/1 ^<6B(zV{8G{9ytxȔ&*-7L.y%$u^5ƻ;W7%3̄iL)1iQO#%k|rVP XRϊ~kS]J(?Z@0vS"vz -ǿ΋byYϙIC(`kf&kn"&'L' 7t~eDmoK;AɘVltч8iXc2^f '%:ՄX/=02}7CO. Z]ˉ3u)wnđA?|ݗu{kCH}IE tk[vMPFTS-N_?yЙ&)]Ġw t637_a&&JcL0[ h ߪ6H~Ҽ,@.g#ĩFqKJa; N|z|T}6SNu0Ų얳()' D:Ut?@2FGX&TQŽ!\vd;5z';̦""HEA֖Pm8 @7a;JUݐJrجoul#E͌/҄ (ud&2/s;V;MmtI|}%fiL2ݳ^~|eOجϡq6+|Z!pbT+,?QYK!GxК^7 L Xwq g^bEYւf; ڀ};玾ơ0INUJ;A|>kWS[0^B@fw5C6que>Ĭ5Ev$ڧYm3u RbZeBc|1v`EϹ.>ΌJs,@B2Î"[fGi,܁u_3)& ~yRA hM?ou=1ؙZJ(/U.20JpGl UV7W=v FR]Y@pÆuʻ&3W=A!6>p?(?͸\~`3Ѷrr% kN:/)%'|ElYz$n>.;I?6|:C͒ǟ&=Fj0w#X-34*V9I=rb3徳wg;@w~Z {Ќv& ?+Ҝb^Q%_q+}bT꽙1XbWioφ. +ܗV)brDʋ%G:/9z⫚UfrfQ8F'K^^`|,E6bLq5s%<̛VH{)[g1~|=aAAIR.{ٸws$]X=lQJTH{Lrrm2eV:$*σQ"oIl=HH8MꆌMc-,+HA~ 2%$#+- O4,SedHt%D3[gγV胱dG3 & ?R0RB`I H4z<Ùӂ[|\qpvha$rN@w8 ҵ򕼂768(2ˣ{5 +y_X)9\yekT.|2=e݀:3Xςq}68a->4R-8W?QvicjGHI օl= ?ë~>n"p'ZRp~,n!?!ްf4لe|!CU"5&k-aU0j#sύ?B6NEDG:?75r,=ruO(G5\a 랁mWQs!9O$ϓFInh֔]d\""~+kƙj{Ŷۜե4^/n!]deHoj%wEN1<[YfIe)D7N,mkÌ^yp[G-w4TpqHUz:نT/lM=ԡn(6wP4+E$iR˓y@j. V3S= i|32Er%lyHɌRFd|;-G8F`2+U2(~+9f(sExm?T-Vs0tU|4ւ'l ip.Pg,D+.. Dk+$U!cO냂Hq`7Hg}S[~4s.R$3LDlgց$4YSq{)T*ՏCVrCcX$Yw)<ؙ#v4#Q,;P m&ggI']^g~8mh׺%e{67xG&Ef9 !ޭT;v /'H @;2K=7zD`(2{lՀjccE, yRjOff ژfD_?Vo!;NL]A%Ef{k m(i$> &S%{wzs} #19u1&hV;  yWD\AɃ9ΦOLnt[T&hW}_BfҨ Jq͇#z G`Xn49YÄ@5#f6WAz (oPj1yh3{emArwXp+Oav Ywm&zv AKDHeH4))C)nQJcTWdhzFnEFR9A=DCW*PEqH}NE4[2M9e4%{ř Tͩ=aHW$r;y*7?Xu[S97yM-r99ˋ0k2U ':SFD|"y+)4څӝ{:p*ػ5Dhر, M[9jMCYH<"jdrW^HpܐYyLt#sc0G&lB9]׮z^g-\+v/.Z3/EA i }[0t$&(iYC[l 5R?~)`]8mvIt"KW7ep882.g|9kDn1A,&qqՑdP0f[>cYLGY5~ʭ^/0T_(ն-1HNuldrgŒ(#58'oǬ6DXȢ{U]敺̃mC'BwZY~,BHF  *b3t8@'c[Ӊge;?Xm%ɤKgBjv&ճF.2,׆H>JIΧ>LIln q(iWK$p6cT]2@z{\ \oJ MqZ-K=y\,hdC#JQU\[SvxAM wgi 6:0UU1WCdWfv':*rC x)f:(]A_.R{^ Ɵ_w)2=xxeksAit~W`GNn' I]ޗV`{x&7O F4$?aytgEvLhDDIZ,9E"$84;8Bߟ.Py>tw"]HjƁ&IrGJ~7zЍ^[ttYaAՉE!q w:!ESbyi_֮_Z0$̑s$μc+o8,ai yIskk~1h`1a=_4p=8w^ɺhh*_hG\Y܏{&G܈Ѕ{uBw!W˞4.!#tYB QS6/$i#$je |/Ez Y~B:yzpep+$oƊbH-8Īf NK@H|oTk&"+7+jVg4\v^Eq>?В## A3Qh]{4sm;+FkhNjIvb^N!}e5N{Ƣ"P(?߰dV9>nX/}?k47nVtZnzõ;m(޳+?N +vN"P{,0ePr2 G3\߶Rbo)f1+V*~w شyP4>A5}N yd8OiQbC7noO{ŭӲ~h0aH7Ҹ+5RZu'9IS-oh]rf\HkcVOQפ U?I*:E5,1T`!`xO,%URHMVt9&${1_JBQ:oSA\-T[ЕmCV7n[ C˃ %6OJ0[9"R ; }`ur>xtkjS`X KqUFL%I=a\:9RQ|4 BhsOxQD6A6lņҟbúzl?V[(jNI;6U܆u'Brga>/e ˲V Uz"eZ҂.. 2a,pZϊZl)EJI 32zIR;"ҾjOmp yjM69Ta*L[_̕pRk/8j:|"w f$e֧V4d)0 ~PmPz 7Q03;P6mH n867z =š\ypg.װW.rtsFks]iцnm$OV.KSnZUaMiVdpӎAO"CṮ½!6kxj{Fl3p[}޾ oFz^(W6xhe
ej<+nP:Y@R&8cؒZq*X _/PF:@տ.`CĴ[Ŧ̼ o#Eqd̓lk;n@XYi,Hb8-㋆G|_3צKc]`v lW1͞Ս.y›@nbxT] V䌽RM,]ZbqPGDzɀu d0>6qoY?< Է2m$~>T[]O0p|h )ֈͼ"d{wx<Nq5Hk{ǿXCY{fۦh]DP%*ٰL8aIC=ʺlRRS(F'&0yn m`\ҝ$V5q:H?GE%k-hom_0fңӏ1S,aq5tTbk&,CeGӄ-suJc't |jZrj[:@KnٱG`aMҫY8m/a0+\u+ , 0ZMn; DaڛXpWFۗn r5x3egżxwO;"gas8.+{*(0D|}r az cY"5lۍϭbʝ<ܙBsV wdowkYlkQr=U6{~Hg7*Mf#KT7jC׈ݓ||pҸ,Fad?u߯MWOs,Y#dXھs9Zpe >7_~i5_1dڟTY}̍EUVPC- ϲE>Yf:l\$x>֦hܪ0;_NF4#OD:Pe dCP Ws,-PnJ@B5ߪB]L?nθ0#]*t̑(Dq. rRͬ;2`amw4ھll*#`ynoȰBF[>{ dSPƷ\<.^;HS(Y -#K4Tj 3EFv;]FWv 0r)6c ޜ} TsPq599WYJW:X*HLg;jzRtH t7r4ʯ؁mp-p熰Ȧ2RHJ$鮒{Ier3cu.=6^"WI>/ⱈOFXeɗBgqz"&JfSMP,%z9%QeO=Jj 1'Qm%O$amtF oA5NϘ&6Q9=3m$f&k=B/ວ˾2hw!ɅGq2 q A!DJ~P;v?&ߴT6Kd/e|C3\UU(r1^Xɣd: *^"XUIRlp0$SS1T#\ۻog2FJt-"0q{rp𵄰} 5O{P㏿vP2\mŖ 3 v.iۛS~B(%)i-8EFjxk1eg1^[wocwS7#..ndX16 ;mlHqY?cWutĽBH*i-wON+ Q`iƻ}iQ]xs/PF{кb9ЂzS~vxߚZn!eZ*ןi=WOpqcc%me:]L}&idؑs$=2 |,Qtc%!{ɐ.#t+vb״"׹pLUerh,.wĠkx=^ \ S>eĩ3=| +Ŷch [1@?.~ gv;)^řÄ2۫|f2Z'#GetX:G"~36YgV褏SfPo9șlJ (f^2.S )\B0+c:f? +eV7]]}yt"hIJӺd|  rFH=[<:`McvZ(|v2}!Ӯ5}ۂLZ&k5KM;Tg<ӌ,ls ƫžW5Ëd3- #˺É=%}4yILcKQ|uQJp$oPJ|Qʗ2_-fڗϐSUU%< UN4KeZM^,iJ@4O@܂]2Ag`XDkQ{HY: .q\%IPġi! oH mCHɉqX8]F l4Yv)'\J!'ߝ ^zzG>l 8l9Y}-gE?]lܓoZ\۞z]G#VD #K쀽|J8r%Ӭ ,#m4(Â;RF|8kG'H m*KyK}Ý>唘FXP)ok1JA3L*Ɛ A!QwSU.<{+ip6H\vjY}106~dƙ;qu,#TdM2'~vPpKf5bS#ZT=)sk+C:5h㛴m21ۆ|oee}(_"[]j("I`!>]"g1Zܶ鷛G3FHn@龗鳗} \J/;=gMTt̪qRy9̈́ UF"sG `n#d6f[eGtkQf&M/sQsVN*:ٞ~hO[B6oZ7݌ %c'm4jmq;@o^P?쩥3#j>4u݅}*wu:PER?k%WG]gZY3BZzˁm>R~l'V˿TApwE=/(w=fZ(3jhANj޺5!z| icG`ݻ""CIgsԱeඅ,V".L+|]d;!+@kjzҔږ$M ՜#O[yOp􉉴(B޽>_?$;?&e\/ $#m`5anEJl8pbƬ8fӟؿ$1HBg|Y_G:4/(vnj f3UE}c0SJ#m`6rmn"VϬjJ?!㙜 gCϟjwӌ?#C̶WPt `<$M>qGUkw%|y@"OM3Q,eTmL$~6oNMN([[p#E(Gz:wx`: AέEwaPNdz>$S~_x ĉG屁#)um߶/w72DĎvxA}b n Y[:=׎"4\UJߖ;587{(^,H(ov`Nɔ{O?L͢a{i_94 ~JGclPx\n; ;oC; nE8A$,f * owd13ib,e|a k\\Lq,M?ܺ}dΩ e+`lrb|X<R%rԁh=h5Ѡxpߞa!/yID,1~6A]Ƿ1Z7ĊF#P:Q4n2/"rI]~΋lk!wo=YƇ|"HCfEm .k{ˀ# $$mu_P%Bxh۳>UxdV#XjǑ51[r4pgLra0u =^|={ױ95oc KUYR#ZE.g}P S|G:$u=íj2k)T\ $ugm!Swsk'%Sϳ$^|!KgMeʽ8RiۊR-n eZ9O?(%$ciP̒D_qxoүUqo| ԣaV47ɻC: 9a|:[!Q( (:#f_:;xu|]Z2XЈqv【Z2߰ c. |\W iv0c(0_+]<=` Z,EyaM\-4ܥYR*@ۗ_G]_QhUL{I;:I˴@owe5WLҝYް8WR z*N6T[oY#UnGTFnPӁʌ,D=ķKi; >RWLحBtT޹ܵk&FctQ ɼw(ue>XT0@S`w\>%Yɕ8k-{sAi15 V%)טC~hRyXy{$<5ʛ%7RY( ªx|gV8e$b+M)˚3xwF*X`!rs,5k>ϏZXW~%ѻ~>!\̾ F+xRrOFJʐ0 $%$D%?&0P>aqQwkj(A2-q;s^qXDvd0^ ݆# qO_3X5F3÷̰|<|[آÚprgptA+@W׍+yc)&5cmsޥp 0<_ULs)鸻'+3nK!%JP =T2qMh ,ۈP2b= =pP p*W3RI۳f`dsUɐbxn'3W?8g9 ;`eiR(;uEt%6 F9z+׀%ǪO=O*o0|6,ØY=yl%)6vZHmI78Q1qzE#d#bN\>?=.FލlߐݞMNTU/8ZP /LGU [lR;| As~.Qj%}  Sa~X[4{" B[)ĝZؚ 3_TҬmf?ݴdԝ@ p*R0GvFh}xld9NOQ#N| :!1.{Ϗa)Pb7j ]e33í8f.ߑCb}YMEk嬲,ȷB#wtLR6 L]5xpMlX_ؘilQ`Xꊦ@VER|+]%]X{ccs֏uGh266h&J0V*"-M6Q:YM2:M3m̳ﯣ?pxH1( 85 ͗~|{6/%!|HR%`_H)z ,z3[/shgъpO]'JbZo[1{ffɾt>sjpYQ,J'E+@7`=l㒐]peyOӲ!qX$ 1Z#ZW0.}Iמ9cIb- w@X9Hv_+z[R99+d$9J]];Xjl3Pj#XVWUχ;eɑ̣Oo#KUavMh6*-}hå,qɀ)>#'Ts?h٥Q0KAbaIw=gz&k2.jKzHm={1]%U*$3< =*= rߢzRw?~gd3M0{I8$* ?zM1m#c$gGu&ZީHWk%Owm }{]FC߶sҠsl٤Hτ0%c<: ɓSa;;od>(V<FA'< O?=7}Ӎ#&pC`̓\??~?y=BCR;IUx@SJr-,*Ga\iq{G [inuD?+glQ&|@.*ha&WaᲄE- Z@'~w_L+8e3N4 *ƭQ] b7+FpR*,U`)&pgQ.BuM߽0X6z) )],wj{Z{Do8bҡ!/D "s(xE!ȥ*_]-H^lau?lJxuR=|1+GpCZs¬{ϭcMҒ!;+&1EyY&BR[W]LD+ V*2q$%~j_5_N@kݞ/^MdsάjBV3x5`^W*LDB(,mTi-64)0lz._n'}VdcaW#B&QxNpD.yAuσb m7/_EEv.xbdC [35L!mNu|Z2T`?q}f`I9GI4ɔk$42YlBEE V^-/_Cv%0x7i.IZnuy6#0t wJP}٠V֣$b,Bu-;iXRXmz(om 0Fw~elkN֭)7C2ϽƤWP Ǟ챧LI\CV곏}-*A8DC gGO?|c5[WLh7z-BtZ@&$^at#n\}"fN9|eM0Ml 4UEd=v:[8Эgval:Jfy> M!OljJqL.'F_KOcκ㷍T)J6U~W\Fc3j]Mnqf7)6K=PQY&Sgaf/F=XgFaF+5ME+Q_"\T][‰#{] bcjr0}y`?JML!>Sk>PSh -A_2醡~yB?3TfWJ$ywڇ#3J_VmJ YN^O*<ݮ (-Bz ȅҽIiâK gp#)WNxlZdM3}~(\+7w$"6&5Y5+^7ֿp g&vA¤ mtXw=^^?rIRp"& S+Owo2yhbgQHOB8a[=[iLPh_u!$z9ʏŒFZmNj13&4.P)h3sx儬Ԙ^L dZq~GjGuȥ{8,̔U,Q@GWn&-82kpӘ(@pRln bxXwE1:9ϤrJG0" XZ;_C t{gX)ظyGhƥOlfτOkOy|Y-ff|="t3O!As#Lt>MCܮ?Rx{*CEL$q^b3ǧH4~{tsc gOq=F0s»I^,0T]ǘa,-i'[*˼4tJˠV5 \myt@q后XkM #i-/؜S5qhpe;bSDر`Wgo sAtUP1ܜ *<ϢqiqzR޽td@mc֜"o9`ջ@ 2VOK s]B`HI壮{qf@ 9\xPS#[I ŃKs{|9}Z%~m`uAy)ep-^3"ʱ6C I7JiȤ}Nj5g٣: 2P%xLZ[y|aȓ4P)-^BM\Dmٝ8 %`?nVю~V\#n+9zd/5 WKJceO7,髎/80I xVtn96Su>z<6sey`91UD,MxñK?݌:[%3/knC^zgS;{k^F <.G!\,N70w=},OŒҕ~`oYNTn |_`3 DӌiKEe2ACX(̄ni¸anA})I Bh7 iFewp#$og]DM5n!SFbt, iDkJ>Esd 7X *.VOgg=\_d6%2ΦRS CP&\&C ȩE;(Ie.{0~@jRȏU5GI#2IB6Y>J;~ IS O][u^[UXJ78 \պ'7$;H@ivWoAT;zIx,& חǯdPMgw)RG- 1{s+ ؗ/ZM~x_~Fh=~ofjԕ$[-\BAMuQe]:DQOK8̺fQC BH?GH$2?ϳy_,íP>X9Dh['ѣCs'=I~QueZeTv^xp0S\LZR7Sbõ1I?'ƥ=E\*zX(n hsܘIҲw F˶M%G3[P>S5d}noJFިMע4D?Z) (I;A"˶:_R 0Mx/*]4 OF>%eamYsRPRI,Y6d}CƊi+n;x=N}0$C[ӥ<9dEk(/Wk(if1@KK8䓽5| DLm3Ahft&gCMIRyL{o[+>sQspW`DWO5"x2Pԃ[{0P% v.,556HiI6j"?L6;vT^{Ănp@|Uq ;Y@3y Xq53U) ]vcjQT>cF|aBˢlmhڤ _tWnrU/#JQRXyRZWw|~}xWWT"@5@n6s?; MiQ WPdfZvGElrڻxmEuJD7j]yhɄ'J+?4u Cqz;' /$`uK5#XpGrsaQ veori.vj]/-ZWjԼ0B_uiO 7{s_iY RIax̑*Ga4ad\y'~WOzTS'Ⱦ ?^w0~|%Nѕ|\j{wܩ2l`XZ5ThgS􅒲D,Ҽ;IC̞#&3[ȅ/S|//!STEDfRwHEeO3ix;G0bɎS~̭-?3 {.o q[aY[ mnXH(V<Sõvb ҥe*^j})5Cg1:uzɩ=+P"H׫4` ot\aSߕĝ\qiY!K Yi(M-nNy<7 nǰrCm z`,RXe%[r\O[u_,"O+ʴxt sm,$.A_E>K &+xa"EYLFZ]NԮbk*\G52#J#:Cfw(Kx%[PN bGJBǭ!|Y..ˉ8l~%5ʨ$`quU,pqT>ov7M]t\%U/eȉK'݅9,j= fr୺L :T!tLM{]%^;؏ RIQ:νfR2co1fk 6UַfS}dHR~Zo!^_fCLCڳOm=쬤u$aĉ9M !߻A鄩j^lSf +ltPfonG)<}{6#yW;u'~3wm%Y.Yp%?3ؠBX='{C&nH`s#?"lgJ)]i$!`# M&iPQX)$3CqWo<0{5Mmfͺ QdU0*ߖp\1]j=D/vߠZ{gt+Llv A^?+قZ8Qdm":J&2A #L { ߌ5|)*HGJ(s5&UxFkIR5ZРk#Ajt + |N?ڹ(b>lQ fS#a0S*TZ3K*KUSP}^d#k:jU0u~[2>9[̻[w[ܒ#ժlYZTi)wij#)ZQb= ݌$\RM N;qW (Nt;Om)F1=WkR4!y c9) WX%5eA0\Z;'o]3VQ<+( gEq#8P3F'G9 gIQ'$F(mH_`.)/xޚJ(G,LD`^ĿyFgԢ! :fg9/8ˍI(5AzN1 ݫeڊMr>j=R{Y 3[/Q"|* !@DM|sr-e =:$(=!8v bP +(&Mk0^KxGFLqٔk P*XycztC߀ZNv1.ٕ3^:m "⢒mz*$xD"Uyf>\ͥKVG!*8F~DZ࣐ [1pTI@w nj zs|bo~މgwFD@ecpzv\ KP'9t4eethN3-x$5hȂySUcOPԂPxw o+Q-I2 2ڟ6IL8ZkbF*4Rw8W,t j}hqX#dl :p\17v91i;1PA>~Y,AlG*ZgJ{/->pA ÂT,k.NUq̻}}5` \#)00%rkR&8ofʚӘldz9&%gj)Vu"ٕ/'[{ :nOd S[CUeڐwI"~AH[Aģ/BOPgNf& '[{=f^v;9rêPIc'8zm ΊN屫@m. iFM렋|-XOfJÝ,%k|5MMpKn^n 3Ĺ3"ǨdwzlMDZ-5'$!$ ZpDo&8r_n HALGk :DPg'a(m^! 8'wla K03Зj\I0VyZAkKd_2t b ]JOwT1a,ZN@x" uѾytmw8PAy_t4q@&ZBk6+U%gg4}_:pft>Mse}_ŕIUwz onF%<*"U(C;%ꕵr6:/jwqέT{eϵ+!Q"&~a }: ԨCa(ת%6piXCTǺ jv/ozÍ[{yeо6sE^YTu ˍQ}/ѵ|d;դ}jA":kB$IN3#NL*[`_oOg-;[rVM(Zu(a2,w LJ+ [ŬzYNr0PjYC}1RM' vp}q]=HDjEa:S'Wi 3>KF@zwHU d+!X;ַ_4>6\'L ׹i١䔞{INXȧdE5๛O o 7uhܧ הnGP]:Lvqvʯ;WVI{au. l F8k"ff|VRj eos*'Tlt[ U)vvuSiT!0N b.d4|Hj6C&.w4tr 9a| 쯃IMS/G7([/ޛ =.RF4ՁfUNP),?@5qt{7e&LjuNdPg+^كtfW y&(r{GbhA 80#[{F.Y9ؠvĦϺ=л;SoRJӎuqD)&00؀ɂ!Oa'!ݼ[;{ݻYiL cE=ȟL4W7d}1ҿV.jvU̸LIxY-R:?K2j)fBz%3&[Lf "wɠiT&PVZ`=GpO#` ,ϊm  <(Һ>ufM21v LkG>螃5_:Pva 1n&c+U|'Պ1v<VwZY}laC;wt FﺙY6o,MOgJ'Z2[}75_މ8۲ta$NhW5Yh?Ͼ7*Ag5A4'qSpv]HEL0HR`jNo^+烪?EABCؓIؙ2 *q*$X/uv xwY eԞW3 )dz0*F=It]mtc(G4t!hZ\Z{%_ȏ,D6cJD!$T o'd~;ҢvrE'&]Mh qocFVm4rCчABGJPco0vz[c1G9OuyjѢ0+*`6܆~hR026kĭp2਩'ζXIu7 6 YD_=JˆiM+N^6 kCuG۽ue5Eh-N_c=wHV1#T'##0Pwf ;.]#WmAc^ F)73_gȸs[:~eWePR"Mo" + HF]; OÈEke̵,0.~hķ1pd& 3-t!]X54.HOr';(cyj¨%ZPiÍ?U3*g܎ИT2d&ȅFpDqRZj8IyR5X(r-+5Y-#YE22+KYce|ڑ)ހtFؓ|yԳ5z495lօ`'l4 Aâ" /nVUPF Mul΋,'J8x[\VΔ۸;bêƳK55^i# tkӫq<>[r*Q_Z<qg -9ayi͑br: .x8D_(.8A4.)lxq1$2W@c$)O~nMWiLfBF`Y?;fezb')r<ǫ?9v&GiLOS3l1oFQhݦBۘM0^bȊ Мpj* [,yJ> S$q1Eb#k8`Io,rL'MP:6,0$ox1`Obrcq3 P U5{:8AuY dM^=kcyAG9n8^5N$tW\CQ1ɩiAn1kpC,Z8՚zz2W,V|SX{@n>b^]yv{lDYӁLqs/N. f#P BYVvr?^Ir , }3鮽$_Z95mq{l-4VN:ȱ5/R&HH4Zc& ʡ -R`wkm iG-'r Dߕ$?XO\G^pXݯMD`m3} ?ln#TFb|P@p6RH7Pg7}8LM4\l󷠄,x`P[<qy벫nls%n߁/^nDVm{>1 K3]Jq##W00GXkzBXSk@ ן =f"# dl*W5p-z@aeۛZC)WDOݿogȗ F*5.3퇌R2<v Sa))1-u5{2N!\Kr?s;-qWUc+4z%mƧȱď^:4ayM'[VuwuZ^Ȉi x ͟,_^6JN0brw`ӂ\Fz@OGB>¯0RU|P%"=,o& BR3(=k7Dsf9ś?뒍?meS= 5oB#{1sm#E @ tYFjҠ?<\iIv[*n=Mxd}&A.[A mP*rKΚkzv E,h1WDkĸNGVu^wleZϲ\죛kZ>pwE{ZLC7/o ^?`o>tXՄ?ٕy̯߳+@?_{>BMʦ »W% U07)Z%s8`y ^dЗ 8[g|75?K@o"> EMkWv_) }6NX\ϕncsbX6GJtƉi_<}_6E#ƒ!lc Dш]'ngt%%%c@2rsI͉s$X߾1%@*'}Y HpW"$AjXqY}{gtZ*+֕m0މ &ìK!U\Zd:@'[v0^GNB37W(g)s'^g/[KG$ARZT:տ$p‰bHW6~7rH_k>@_[9[`%He%B}mi3d&>nScPlÎEbϰu!CH^;*ӄj;}ф#N;80v 7'PyNIg< +< tEwӽùBvdPI(^Z,>A~Rj?o $B4e!hO ,gZ;*OmXHTg 6L c  sĚ|C-&M k,ٚHKb GPa{rŗ##mXeNgL=Vˤs"?*{ BxpT/K :m띠rTN' }鐝J"'XIW~ļƋnߢs1#& vݯ@yz`Enh+vkfZkR VOF)G^&g4nQhTB{s `E 3p:&Ɨĕ=uW\qg5!=5犬7|#e8:o^Wlr>TvJN@^HeP "u&~O]dX{ ̉hq6 E@vieV6+{6O6TFX-XEߪz𣣟*w־ O=4tΰ\q0WkR;w#*E1*tY5(;$7UBrMfeycd{[!1cKՓVUU:J<R~mp}PYBʐ:8SVI8J26:yGiu@vh21u$!W\%ʞ"?hE`ـvvN+v|s,.tܠ OL+-nX8<=pV耋I4 .wrHZ$U}T!0$*[dXl"m=1Yue] 'hp0-Eךhs?NH^b 6CJ$foOicC DǮ7&"|XJUf㻕և_οޞ~>V]9$)Ȍ2y ujXd/׶ C}s0T+͋*I͹b}Qu}FS/`a9 0"ac 2dYjN#nӒn*s"'eAIѥU[6Vc"7GEL<$+ѡ8WZ4Ls"m)Z"5Y֖2A.|6{oӸTzo0RIwhLgJ[ۮֱ/xshfb^7a梡ODp#3f"bCN˽WDoaڨMk˳8*LSp#;ީJ0̨W̰eueU?115~h+LS/ix<§gk 7 a<󀙔bB>9 ҭiY,Tdv&pp./eH݀.؆VRa 2 Fe˥}Ypxz02Hy-b&/'y $dʘ40"z8.:I|B3Q$ k3+Dϝ(SZ$Ff  S[m\"[4ԙ5a ~XTڝE,',uTDzh33]{_`h!BH#!+:xȚޯ;$(h&xjt^?o&2~2c||(Va#=NUǣ~%yiJ(a8꡾ŗU${T /k%n0.oN͏zΝvf4}H=tڻF)U=S“1"we0v= }&uBڷ8ۨV;%b; *ͯh$9owy1z]1RZ3:ѾxJl"k`8kz"J$`'W_dblC8Xw%3TRp^ T EŃ[B|ڂ~ͅҲr6m ]NS gTmk1% 洔k9Y$iҲR! _>w( =# QQZpTCAռj{I:~H;D&D|q9sI*{v,_6P`s5븚^ }/# } YHKb͊916JBÝ':QfojvTvJǾNfDJi'vTv У8ªbмh/ ?s@tYSMOkJOgMNY$Oɩ]}ew}Yح]UrXCaTP mfVk3 c>0dZ^F|5/o{!H'k3CY~>nF/0zJXIFc[}|U][i_$ ?vqG4\]QWY22 X𑕖}ͻaYRa!`-TtvlAp.Gа6x^"wxkT^֜bN:`OM[(c/2AE:r!̓ʧBDzAѻͦK|'gLou?~e*pVAC^a 94o8wi:b[e$N61t! o&s }hfn`&|lPVN W2z_.*`BA ̆8K~:̓sﲼ 6~F<,]Zh݋yI>ũ@zW$҆^yFƶ >WJc.n=)7V3g;5'P:-o`s6t="-d!Y cVr3>`xD cu=E I#>#K여j/gfeWnȚ29cݽ;O/9z6t_7;m0BU[xƐXlutM(Q[8\ &#08@b0n-=Ŵ]Lb~h.ХP7IvRNL/?'T=InI:__`ÀtT3~FL1 %ѱrE&v_O]T'܎'rFk!;XsU ٨!'( ?/ hPH+=[Հ8@}QO>`*eiBM`UR3KdSqT@n&AFHKW+Qd2|Փ(|:sGOi2΀ZE$/k4碊K\(`c!nN|GaL:[u1Z'ꅀ윢π#.x9VHtȄ[DGGyLJEOx! cH%\;?_㕗sou-w10pdsnABNCubFqJnyc`Ӝ(=4}̨¬.ď)TqR!ai5}l8h[͆z:5YntG$R 1:>qHH˯57Vrwhl<! -5|>}Mx_ON aީ S5ӲNy3v{)Y) KI)gpMuoޚYQA-Cߔ %O0]F aH/@N&;Y׹7Pر%,&j*M3ő8qE0$}Կh&DQǡo%%j0Kqnۂ(}! 䀎r6lKMiK[@5#w\G2*>00:WY+҃XBң3ryb.˰0V{e6T.[.΃y6O<[5aX$k>AVϜve]CnL50b茮T6’BN'f*vWV+xy!imchHyIv Ci% V٠} zc>:?{[,)ď@(OEvT{!1tbYP$kDn;Rփ|EAQ+@)渳91i^A?-}V&zdLo\)v _ipI[tAmVҡetW.I+scCw{\/3\^}:-|,w ^ᗫ۬Wk~E!'J=-3>†r6>:%E);xνIJU's S$3V:w™Sr6C?o /V1S;>0x,~OԌ%Ԥ6iIC-')"\5X_v GkڙDE}{}&5چ{jZe׆ SSp] 0r,`n%tAٕJ4F?>yBM 9_"yr`rn쬃%`E{&,^$|$J_IǃܫKpۨW{HKA2>n Oi"!#B4jSOj`4y!5׬}l Me׼ĺY7x4Wt=}>wޚ=Ek^T<"T:~ǃЗ_,((V+w2Hd\z25Q!>}Ȏl{N7 7'4wPڵA$Su4lx}(m)͊`E|t18 w\Xz,ZBK#ĆqGlB'C_>}Y>H+ΌAJ<|Mw] i#Vֻ c_7}Ufo}!{@j}Y_7tV8] PβәɆG-6W?ohUJ r2 TE*e$fsŠD$Ͽhv] lgfp3  K-l#YBs vc3e`=P#3CG ~y|Wh)ϿUbRQ/Ʌmۑb[?eם8e[pT35;Wŀ',ɰsVtB9,Qc&lAvM<+^Vj8geqzCCL[1.ǣm7׭p-˚{i(ߏus"s`ze\ 2NU;ha7/JZ{:Y;mm% f]"?9 )Vᡜ`wcl Y\2nɕV(ŀ]a3z3&y3+|tn%Bbf(;[_@fw0v5sᬳ: -Dx~d]``Ud'0y=f7ZkNh[o<nUP% 8e!>Mב 4ɆhL}X IlPޛR Rzƴ״-=J}?/5-UlPb-N*{L=2> \"Ѣԁam YNni~[n}paFQM8L} l#6h "|P}݃cge:sB|)m{~X%"%=^jw'8Uޙ1"oQT܃-Gg77Շ9;JE%ڶP0MâW1C4X=sJX",g )GOȈsGgOXOɭnCc6roJȼ3H|L5Ϭ+ߙ/O[u1b]p`vv7맺{YC&(`84 &šfSR s|2{oqyF+U'R9ȥ2rI֣mDw2 1šMe4r(PH(^,LG .FŇ{'ihލ wwh;@ vB^MgыLY)v9Onh_*iSOyPӶ?/$L٭^z<z6 ^ԅes!84W@u8*v06P֢H53ŠCRx5Nj# ˸p#[c+-aA112d#s;Lzbd|h%ZZ?b;f:#@7ٳHᩝU.fUY@>y!txƜqHeMA8*+O %~uH_]l,_= ?FxX ܕCd~vj<7jFUڊ욉z"fʰQ~Ȯbx݅uޏL#b{tie"4=sců*d@"eU{[ؐ(̾g_f$X%]`q]<6kI M*+ykw?1Eל oHGhjP %(. yUwMۣ_~]VWSg ҁ閡2Xi%mKTH")wF>v x,v?ԃ]9 #3 hM+ٌJ('brotli-3.4.0/testdata/compressed_file.compressed000064400000000000000000001416641046102023000202010ustar 00000000000000[RE;@}.ҊE\IKox4]MOl!+l\ECKgiE_|ݹɽ#IBƁQ鐺LJE`;l h/@wL1F@q(}fQVF;EFpdqȑX7Jdh 2>W"HA|#n9l[=ʇh^ i~_o#(aHQA9"t,}Sp0Q6a2Q|=,C@UE* oQcHS:MG쿮FZ&Il}Y}i;z5Ù^koq @#H HQ [č~2LRU`QGUUn(ݴәCu. !lr@$zd΃vS->B im};; {4phl"&= AbO\/gj 1+cUz>Ͻ :! ѴVa5h`PxNT)Ѓܙn'>?OϪ;, 1`ppg`̨ "HPߋ #8p&=[QF0rhɌK`}HC;+x D<`T$EH^Bgq^d1^BszmWw8-JH,_.{wsqҷgXْԨu^:K )w4('LXC8pOA q$%B,T)gBm!nCW x6 F}gQq =? %$EIJ'b p4יI.j|!@el) ?&\f60dA_SX2xOi>~ўP6KUwiy W[(b,73(L)+3.hMd-6##Q N=&F&lbZ =&>TkH 0h,gPBu"/Rk9iY.>>'JEm nL_ <%BHB\ƪj9SKcM>[Kh_"0[Y?Q{8ߛDID5^ \ ~'"NIzu@:ֻk $+}OElW IHbxt*mtKnԷC!| Qz.M7{ONs JFECU8X|H,-:,aC{-mjz.iY;Z%3owXE S#;ZXq3DF)"F_~d|RcKU2_$Q;_&^$hm 7+(a!0_vh# >Lkޘ\7;d4/?c.C:Cj$L]K+kʨPwŒEL9y˙|kOVjO3U8@vZ`~̾# @ , D(i"h`cR)k԰[]-ʍQP(G델t+ZvXp4nۑB%ݢBfFΏmMU 4~> Eӌ4vseN7Y叛)9e+3Q 炪oHaa.I5SpcUW-QJF-Lc5<8Jz) *L+:R֫7/A LDGktn(-31^Qx)7\C}h뿉[=&r! 8]^uaR3YH, ?T{F|Qj j-+2V'ܙ CH!OP8,&I?FP*A+ƇnNDk9fm(+sI,EMyr׌W8EKwBh]1FxjOEo23@ eGwyQ(uRkFMM=u;&\?pq]^L ta]zvA)%+'yx[GjkZdj9GQۧLf(T&>2l+\Ec |8 !']&%0W&!;1{I'G7Xs@tɜbʎAFtB8D]0eһ{vO7Le:̌i7L+eO,RiEJpdoid|ƞ;/8Nv!)ž)#K QX:ӲA#=ലbDУ(}~p4YOEI'? )k`!'Fˇ@cbQVjIvQ}ȟ%&R@kҘTKznUنXE1s0/ތ`Pn Aa@NɤE$VmXW.eC:xp*/*kGGN,S"9Vm70J'FMǷ1 \Fgߋ֙\g)d=t)<yВΩ=/8¶! zWjg\Yz< ͵;D}圌<%fӤp&Ґ۪D&%ԜĄ.*PxL, e*R{[OQtԇtD0aXyj UGdIRԩPLLKw i tN;FlpjnPԌM@Q.!I"bEdo~ @9H})ʫ'uMƬޮ([ҕc7vVg.%0@xd(537\oG7FjϼݟYOa]b%yŖz@ d^7;{ Rk,UUg0hw Մ&$9c\j10 n. &Ac^U7BߎdiFj:JxY'0!J6Bi6jOkj/9떎HQ%TCF+-ofž9庲3@O9vFYXI@:o9A<ۦjmbRT4$MƛvN}}] d<\%Dv`0 f&5»u|p+EӍvƶPMzbvG(M}$RUJ.mW 8X ]=#EC9\&%=dQR ;d[}}zW&Da6Z'ݭP_Zm>[!GCrK$EjsH1^0s쯉R ZC-%3[H2Z*?et%F$"Zr+N^m8ъϣTE6S6X3PDꞪUk7ԟbUclBY.-qY"\7{ZiD"dm_1oVԉ4Q2H{0E)ȌS>g;`s0>peIc=zǭ*}FEc 5:oӍ ]Y8+0Ðl@OeSIMƊ>G!`꺄҂O3SAx D1PA\.~r>&*')J :<-[NE<;D rSo§gP$}} kn3vTUfx&m4^\!ܿz !}1a;cĀgla*V٨ O ~tI#x٭i-`~ 2kLe=$*V|2` !+V] YK-ClRV^ qjn,*TP\:0+Y+ÖGxQ< TSc@놌®L]^pZΚFᏔ&:twxK,KsH< gkLNm{~zf:E޲,]]׆" Mx!R~Nͭ.>>lV&KUkzn 7ZC0i5 fIrt=[qdV>Lvkㅅڑ]8^- c@atNt+Ue /m_{LE=CDMw'Q+)xf΃ڮXQ!2 K#g} *"nhʎ9ډѕ>T/1 ^<6B(zV{8G{9ytxȔ&*-7L.y%$u^5ƻ;W7%3̄iL)1iQO#%k|rVP XRϊ~kS]J(?Z@0vS"vz -ǿ΋byYϙIC(`kf&kn"&'L' 7t~eDmoK;AɘVltч8iXc2^f '%:ՄX/=02}7CO. Z]ˉ3u)wnđA?|ݗu{kCH}IE tk[vMPFTS-N_?yЙ&)]Ġw t637_a&&JcL0[ h ߪ6H~Ҽ,@.g#ĩFqKJa; N|z|T}6SNu0Ų얳()' D:Ut?@2FGX&TQŽ!\vd;5z';̦""HEA֖Pm8 @7a;JUݐJrجoul#E͌/҄ (ud&2/s;V;MmtI|}%fiL2ݳ^~|eOجϡq6+|Z!pbT+,?QYK!GxК^7 L Xwq g^bEYւf; ڀ};玾ơ0INUJ;A|>kWS[0^B@fw5C6que>Ĭ5Ev$ڧYm3u RbZeBc|1v`EϹ.>ΌJs,@B2Î"[fGi,܁u_3)& ~yRA hM?ou=1ؙZJ(/U.20JpGl UV7W=v FR]Y@pÆuʻ&3W=A!6>p?(?͸\~`3Ѷrr% kN:/)%'|ElYz$n>.;I?6|:C͒ǟ&=Fj0w#X-34*V9I=rb3徳wg;@w~Z {Ќv& ?+Ҝb^Q%_q+}bT꽙1XbWioφ. +ܗV)brDʋ%G:/9z⫚UfrfQ8F'K^^`|,E6bLq5s%<̛VH{)[g1~|=aAAIR.{ٸws$]X=lQJTH{Lrrm2eV:$*σQ"oIl=HH8MꆌMc-,+HA~ 2%$#+- O4,SedHt%D3[gγV胱dG3 & ?R0RB`I H4z<Ùӂ[|\qpvha$rN@w8 ҵ򕼂768(2ˣ{5 +y_X)9\yekT.|2=e݀:3Xςq}68a->4R-8W?QvicjGHI օl= ?ë~>n"p'ZRp~,n!?!ްf4لe|!CU"5&k-aU0j#sύ?B6NEDG:?75r,=ruO(G5\a 랁mWQs!9O$ϓFInh֔]d\""~+kƙj{Ŷۜե4^/n!]deHoj%wEN1<[YfIe)D7N,mkÌ^yp[G-w4TpqHUz:نT/lM=ԡn(6wP4+E$iR˓y@j. V3S= i|32Er%lyHɌRFd|;-G8F`2+U2(~+9f(sExm?T-Vs0tU|4ւ'l ip.Pg,D+.. Dk+$U!cO냂Hq`7Hg}S[~4s.R$3LDlgց$4YSq{)T*ՏCVrCcX$Yw)<ؙ#v4#Q,;P m&ggI']^g~8mh׺%e{67xG&Ef9 !ޭT;v /'H @;2K=7zD`(2{lՀjccE, yRjOff ژfD_?Vo!;NL]A%Ef{k m(i$> &S%{wzs} #19u1&hV;  yWD\AɃ9ΦOLnt[T&hW}_BfҨ Jq͇#z G`Xn49YÄ@5#f6WAz (oPj1yh3{emArwXp+Oav Ywm&zv AKDHeH4))C)nQJcTWdhzFnEFR9A=DCW*PEqH}NE4[2M9e4%{ř Tͩ=aHW$r;y*7?Xu[S97yM-r99ˋ0k2U ':SFD|"y+)4څӝ{:p*ػ5Dhر, M[9jMCYH<"jdrW^HpܐYyLt#sc0G&lB9]׮z^g-\+v/.Z3/EA i }[0t$&(iYC[l 5R?~)`]8mvIt"KW7ep882.g|9kDn1A,&qqՑdP0f[>cYLGY5~ʭ^/0T_(ն-1HNuldrgŒ(#58'oǬ6DXȢ{U]敺̃mC'BwZY~,BHF  *b3t8@'c[Ӊge;?Xm%ɤKgBjv&ճF.2,׆H>JIΧ>LIln q(iWK$p6cT]2@z{\ \oJ MqZ-K=y\,hdC#JQU\[SvxAM wgi 6:0UU1WCdWfv':*rC x)f:(]A_.R{^ Ɵ_w)2=xxeksAit~W`GNn' I]ޗV`{x&7O F4$?aytgEvLhDDIZ,9E"$84;8Bߟ.Py>tw"]HjƁ&IrGJ~7zЍ^[ttYaAՉE!q w:!ESbyi_֮_Z0$̑s$μc+o8,ai yIskk~1h`1a=_4p=8w^ɺhh*_hG\Y܏{&G܈Ѕ{uBw!W˞4.!#tYB QS6/$i#$je |/Ez Y~B:yzpep+$oƊbH-8Īf NK@H|oTk&"+7+jVg4\v^Eq>?В## A3Qh]{4sm;+FkhNjIvb^N!}e5N{Ƣ"P(?߰dV9>nX/}?k47nVtZnzõ;m(޳+?N +vN"P{,0ePr2 G3\߶Rbo)f1+V*~w شyP4>A5}N yd8OiQbC7noO{ŭӲ~h0aH7Ҹ+5RZu'9IS-oh]rf\HkcVOQפ U?I*:E5,1T`!`xO,%URHMVt9&${1_JBQ:oSA\-T[ЕmCV7n[ C˃ %6OJ0[9"R ; }`ur>xtkjS`X KqUFL%I=a\:9RQ|4 BhsOxQD6A6lņҟbúzl?V[(jNI;6U܆u'Brga>/e ˲V Uz"eZ҂.. 2a,pZϊZl)EJI 32zIR;"ҾjOmp yjM69Ta*L[_̕pRk/8j:|"w f$e֧V4d)0 ~PmPz 7Q03;P6mH n867z =š\ypg.װW.rtsFks]iцnm$OV.KSnZUaMiVdpӎAO"CṮ½!6kxj{Fl3p[}޾ oFz^(W6xhe
ej<+nP:Y@R&8cؒZq*X _/PF:@տ.`CĴ[Ŧ̼ o#Eqd̓lk;n@XYi,Hb8-㋆G|_3צKc]`v lW1͞Ս.y›@nbxT] V䌽RM,]ZbqPGDzɀu d0>6qoY?< Է2m$~>T[]O0p|h )ֈͼ"d{wx<Nq5Hk{ǿXCY{fۦh]DP%*ٰL8aIC=ʺlRRS(F'&0yn m`\ҝ$V5q:H?GE%k-hom_0fңӏ1S,aq5tTbk&,CeGӄ-suJc't |jZrj[:@KnٱG`aMҫY8m/a0+\u+ , 0ZMn; DaڛXpWFۗn r5x3egżxwO;"gas8.+{*(0D|}r az cY"5lۍϭbʝ<ܙBsV wdowkYlkQr=U6{~Hg7*Mf#KT7jC׈ݓ||pҸ,Fad?u߯MWOs,Y#dXھs9Zpe >7_~i5_1dڟTY}̍EUVPC- ϲE>Yf:l\$x>֦hܪ0;_NF4#OD:Pe dCP Ws,-PnJ@B5ߪB]L?nθ0#]*t̑(Dq. rRͬ;2`amw4ھll*#`ynoȰBF[>{ dSPƷ\<.^;HS(Y -#K4Tj 3EFv;]FWv 0r)6c ޜ} TsPq599WYJW:X*HLg;jzRtH t7r4ʯ؁mp-p熰Ȧ2RHJ$鮒{Ier3cu.=6^"WI>/ⱈOFXeɗBgqz"&JfSMP,%z9%QeO=Jj 1'Qm%O$amtF oA5NϘ&6Q9=3m$f&k=B/ວ˾2hw!ɅGq2 q A!DJ~P;v?&ߴT6Kd/e|C3\UU(r1^Xɣd: *^"XUIRlp0$SS1T#\ۻog2FJt-"0q{rp𵄰} 5O{P㏿vP2\mŖ 3 v.iۛS~B(%)i-8EFjxk1eg1^[wocwS7#..ndX16 ;mlHqY?cWutĽBH*i-wON+ Q`iƻ}iQ]xs/PF{кb9ЂzS~vxߚZn!eZ*ןi=WOpqcc%me:]L}&idؑs$=2 |,Qtc%!{ɐ.#t+vb״"׹pLUerh,.wĠkx=^ \ S>eĩ3=| +Ŷch [1@?.~ gv;)^řÄ2۫|f2Z'#GetX:G"~36YgV褏SfPo9șlJ (f^2.S )\B0+c:f? +eV7]]}yt"hIJӺd|  rFH=[<:`McvZ(|v2}!Ӯ5}ۂLZ&k5KM;Tg<ӌ,ls ƫžW5Ëd3- #˺É=%}4yILcKQ|uQJp$oPJ|Qʗ2_-fڗϐSUU%< UN4KeZM^,iJ@4O@܂]2Ag`XDkQ{HY: .q\%IPġi! oH mCHɉqX8]F l4Yv)'\J!'ߝ ^zzG>l 8l9Y}-gE?]lܓoZ\۞z]G#VD #K쀽|J8r%Ӭ ,#m4(Â;RF|8kG'H m*KyK}Ý>唘FXP)ok1JA3L*Ɛ A!QwSU.<{+ip6H\vjY}106~dƙ;qu,#TdM2'~vPpKf5bS#ZT=)sk+C:5h㛴m21ۆ|oee}(_"[]j("I`!>]"g1Zܶ鷛G3FHn@龗鳗} \J/;=gMTt̪qRy9̈́ UF"sG `n#d6f[eGtkQf&M/sQsVN*:ٞ~hO[B6oZ7݌ %c'm4jmq;@o^P?쩥3#j>4u݅}*wu:PER?k%WG]gZY3BZzˁm>R~l'V˿TApwE=/(w=fZ(3jhANj޺5!z| icG`ݻ""CIgsԱeඅ,V".L+|]d;!+@kjzҔږ$M ՜#O[yOp􉉴(B޽>_?$;?&e\/ $#m`5anEJl8pbƬ8fӟؿ$1HBg|Y_G:4/(vnj f3UE}c0SJ#m`6rmn"VϬjJ?!㙜 gCϟjwӌ?#C̶WPt `<$M>qGUkw%|y@"OM3Q,eTmL$~6oNMN([[p#E(Gz:wx`: AέEwaPNdz>$S~_x ĉG屁#)um߶/w72DĎvxA}b n Y[:=׎"4\UJߖ;587{(^,H(ov`Nɔ{O?L͢a{i_94 ~JGclPx\n; ;oC; nE8A$,f * owd13ib,e|a k\\Lq,M?ܺ}dΩ e+`lrb|X<R%rԁh=h5Ѡxpߞa!/yID,1~6A]Ƿ1Z7ĊF#P:Q4n2/"rI]~΋lk!wo=YƇ|"HCfEm .k{ˀ# $$mu_P%Bxh۳>UxdV#XjǑ51[r4pgLra0u =^|={ױ95oc KUYR#ZE.g}P S|G:$u=íj2k)T\ $ugm!Swsk'%Sϳ$^|!KgMeʽ8RiۊR-n eZ9O?(%$ciP̒D_qxoүUqo| ԣaV47ɻC: 9a|:[!Q( (:#f_:;xu|]Z2XЈqv【Z2߰ c. |\W iv0c(0_+]<=` Z,EyaM\-4ܥYR*@ۗ_G]_QhUL{I;:I˴@owe5WLҝYް8WR z*N6T[oY#UnGTFnPӁʌ,D=ķKi; >RWLحBtT޹ܵk&FctQ ɼw(ue>XT0@S`w\>%Yɕ8k-{sAi15 V%)טC~hRyXy{$<5ʛ%7RY( ªx|gV8e$b+M)˚3xwF*X`!rs,5k>ϏZXW~%ѻ~>!\̾ F+xRrOFJʐ0 $%$D%?&0P>aqQwkj(A2-q;s^qXDvd0^ ݆# qO_3X5F3÷̰|<|[آÚprgptA+@W׍+yc)&5cmsޥp 0<_ULs)鸻'+3nK!%JP =T2qMh ,ۈP2b= =pP p*W3RI۳f`dsUɐbxn'3W?8g9 ;`eiR(;uEt%6 F9z+׀%ǪO=O*o0|6,ØY=yl%)6vZHmI78Q1qzE#d#bN\>?=.FލlߐݞMNTU/8ZP /LGU [lR;| As~.Qj%}  Sa~X[4{" B[)ĝZؚ 3_TҬmf?ݴdԝ@ p*R0GvFh}xld9NOQ#N| :!1.{Ϗa)Pb7j ]e33í8f.ߑCb}YMEk嬲,ȷB#wtLR6 L]5xpMlX_ؘilQ`Xꊦ@VER|+]%]X{ccs֏uGh266h&J0V*"-M6Q:YM2:M3m̳ﯣ?pxH1( 85 ͗~|{6/%!|HR%`_H)z ,z3[/shgъpO]'JbZo[1{ffɾt>sjpYQ,J'E+@7`=l㒐]peyOӲ!qX$ 1Z#ZW0.}Iמ9cIb- w@X9Hv_+z[R99+d$9J]];Xjl3Pj#XVWUχ;eɑ̣Oo#KUavMh6*-}hå,qɀ)>#'Ts?h٥Q0KAbaIw=gz&k2.jKzHm={1]%U*$3< =*= rߢzRw?~gd3M0{I8$* ?zM1m#c$gGu&ZީHWk%Owm }{]FC߶sҠsl٤Hτ0%c<: ɓSa;;od>(V<FA'< O?=7}Ӎ#&pC`̓\??~?y=BCR;IUx@SJr-,*Ga\iq{G [inuD?+glQ&|@.*ha&WaᲄE- Z@'~w_L+8e3N4 *ƭQ] b7+FpR*,U`)&pgQ.BuM߽0X6z) )],wj{Z{Do8bҡ!/D "s(xE!ȥ*_]-H^lau?lJxuR=|1+GpCZs¬{ϭcMҒ!;+&1EyY&BR[W]LD+ V*2q$%~j_5_N@kݞ/^MdsάjBV3x5`^W*LDB(,mTi-64)0lz._n'}VdcaW#B&QxNpD.yAuσb m7/_EEv.xbdC [35L!mNu|Z2T`?q}f`I9GI4ɔk$42YlBEE V^-/_Cv%0x7i.IZnuy6#0t wJP}٠V֣$b,Bu-;iXRXmz(om 0Fw~elkN֭)7C2ϽƤWP Ǟ챧LI\CV곏}-*A8DC gGO?|c5[WLh7z-BtZ@&$^at#n\}"fN9|eM0Ml 4UEd=v:[8Эgval:Jfy> M!OljJqL.'F_KOcκ㷍T)J6U~W\Fc3j]Mnqf7)6K=PQY&Sgaf/F=XgFaF+5ME+Q_"\T][‰#{] bcjr0}y`?JML!>Sk>PSh -A_2醡~yB?3TfWJ$ywڇ#3J_VmJ YN^O*<ݮ (-Bz ȅҽIiâK gp#)WNxlZdM3}~(\+7w$"6&5Y5+^7ֿp g&vA¤ mtXw=^^?rIRp"& S+Owo2yhbgQHOB8a[=[iLPh_u!$z9ʏŒFZmNj13&4.P)h3sx儬Ԙ^L dZq~GjGuȥ{8,̔U,Q@GWn&-82kpӘ(@pRln bxXwE1:9ϤrJG0" XZ;_C t{gX)ظyGhƥOlfτOkOy|Y-ff|="t3O!As#Lt>MCܮ?Rx{*CEL$q^b3ǧH4~{tsc gOq=F0s»I^,0T]ǘa,-i'[*˼4tJˠV5 \myt@q后XkM #i-/؜S5qhpe;bSDر`Wgo sAtUP1ܜ *<ϢqiqzR޽td@mc֜"o9`ջ@ 2VOK s]B`HI壮{qf@ 9\xPS#[I ŃKs{|9}Z%~m`uAy)ep-^3"ʱ6C I7JiȤ}Nj5g٣: 2P%xLZ[y|aȓ4P)-^BM\Dmٝ8 %`?nVю~V\#n+9zd/5 WKJceO7,髎/80I xVtn96Su>z<6sey`91UD,MxñK?݌:[%3/knC^zgS;{k^F <.G!\,N70w=},OŒҕ~`oYNTn |_`3 DӌiKEe2ACX(̄ni¸anA})I Bh7 iFewp#$og]DM5n!SFbt, iDkJ>Esd 7X *.VOgg=\_d6%2ΦRS CP&\&C ȩE;(Ie.{0~@jRȏU5GI#2IB6Y>J;~ IS O][u^[UXJ78 \պ'7$;H@ivWoAT;zIx,& חǯdPMgw)RG- 1{s+ ؗ/ZM~x_~Fh=~ofjԕ$[-\BAMuQe]:DQOK8̺fQC BH?GH$2?ϳy_,íP>X9Dh['ѣCs'=I~QueZeTv^xp0S\LZR7Sbõ1I?'ƥ=E\*zX(n hsܘIҲw F˶M%G3[P>S5d}noJFިMע4D?Z) (I;A"˶:_R 0Mx/*]4 OF>%eamYsRPRI,Y6d}CƊi+n;x=N}0$C[ӥ<9dEk(/Wk(if1@KK8䓽5| DLm3Ahft&gCMIRyL{o[+>sQspW`DWO5"x2Pԃ[{0P% v.,556HiI6j"?L6;vT^{Ănp@|Uq ;Y@3y Xq53U) ]vcjQT>cF|aBˢlmhڤ _tWnrU/#JQRXyRZWw|~}xWWT"@5@n6s?; MiQ WPdfZvGElrڻxmEuJD7j]yhɄ'J+?4u Cqz;' /$`uK5#XpGrsaQ veori.vj]/-ZWjԼ0B_uiO 7{s_iY RIax̑*Ga4ad\y'~WOzTS'Ⱦ ?^w0~|%Nѕ|\j{wܩ2l`XZ5ThgS􅒲D,Ҽ;IC̞#&3[ȅ/S|//!STEDfRwHEeO3ix;G0bɎS~̭-?3 {.o q[aY[ mnXH(V<Sõvb ҥe*^j})5Cg1:uzɩ=+P"H׫4` ot\aSߕĝ\qiY!K Yi(M-nNy<7 nǰrCm z`,RXe%[r\O[u_,"O+ʴxt sm,$.A_E>K &+xa"EYLFZ]NԮbk*\G52#J#:Cfw(Kx%[PN bGJBǭ!|Y..ˉ8l~%5ʨ$`quU,pqT>ov7M]t\%U/eȉK'݅9,j= fr୺L :T!tLM{]%^;؏ RIQ:νfR2co1fk 6UַfS}dHR~Zo!^_fCLCڳOm=쬤u$aĉ9M !߻A鄩j^lSf +ltPfonG)<}{6#yW;u'~3wm%Y.Yp%?3ؠBX='{C&nH`s#?"lgJ)]i$!`# M&iPQX)$3CqWo<0{5Mmfͺ QdU0*ߖp\1]j=D/vߠZ{gt+Llv A^?+قZ8Qdm":J&2A #L { ߌ5|)*HGJ(s5&UxFkIR5ZРk#Ajt + |N?ڹ(b>lQ fS#a0S*TZ3K*KUSP}^d#k:jU0u~[2>9[̻[w[ܒ#ժlYZTi)wij#)ZQb= ݌$\RM N;qW (Nt;Om)F1=WkR4!y c9) WX%5eA0\Z;'o]3VQ<+( gEq#8P3F'G9 gIQ'$F(mH_`.)/xޚJ(G,LD`^ĿyFgԢ! :fg9/8ˍI(5AzN1 ݫeڊMr>j=R{Y 3[/Q"|* !@DM|sr-e =:$(=!8v bP +(&Mk0^KxGFLqٔk P*XycztC߀ZNv1.ٕ3^:m "⢒mz*$xD"Uyf>\ͥKVG!*8F~DZ࣐ [1pTI@w nj zs|bo~މgwFD@ecpzv\ KP'9t4eethN3-x$5hȂySUcOPԂPxw o+Q-I2 2ڟ6IL8ZkbF*4Rw8W,t j}hqX#dl :p\17v91i;1PA>~Y,AlG*ZgJ{/->pA ÂT,k.NUq̻}}5` \#)00%rkR&8ofʚӘldz9&%gj)Vu"ٕ/'[{ :nOd S[CUeڐwI"~AH[Aģ/BOPgNf& '[{=f^v;9rêPIc'8zm ΊN屫@m. iFM렋|-XOfJÝ,%k|5MMpKn^n 3Ĺ3"ǨdwzlMDZ-5'$!$ ZpDo&8r_n HALGk :DPg'a(m^! 8'wla K03Зj\I0VyZAkKd_2t b ]JOwT1a,ZN@x" uѾytmw8PAy_t4q@&ZBk6+U%gg4}_:pft>Mse}_ŕIUwz onF%<*"U(C;%ꕵr6:/jwqέT{eϵ+!Q"&~a }: ԨCa(ת%6piXCTǺ jv/ozÍ[{yeо6sE^YTu ˍQ}/ѵ|d;դ}jA":kB$IN3#NL*[`_oOg-;[rVM(Zu(a2,w LJ+ [ŬzYNr0PjYC}1RM' vp}q]=HDjEa:S'Wi 3>KF@zwHU d+!X;ַ_4>6\'L ׹i١䔞{INXȧdE5๛O o 7uhܧ הnGP]:Lvqvʯ;WVI{au. l F8k"ff|VRj eos*'Tlt[ U)vvuSiT!0N b.d4|Hj6C&.w4tr 9a| 쯃IMS/G7([/ޛ =.RF4ՁfUNP),?@5qt{7e&LjuNdPg+^كtfW y&(r{GbhA 80#[{F.Y9ؠvĦϺ=л;SoRJӎuqD)&00؀ɂ!Oa'!ݼ[;{ݻYiL cE=ȟL4W7d}1ҿV.jvU̸LIxY-R:?K2j)fBz%3&[Lf "wɠiT&PVZ`=GpO#` ,ϊm  <(Һ>ufM21v LkG>螃5_:Pva 1n&c+U|'Պ1v<VwZY}laC;wt FﺙY6o,MOgJ'Z2[}75_މ8۲ta$NhW5Yh?Ͼ7*Ag5A4'qSpv]HEL0HR`jNo^+烪?EABCؓIؙ2 *q*$X/uv xwY eԞW3 )dz0*F=It]mtc(G4t!hZ\Z{%_ȏ,D6cJD!$T o'd~;ҢvrE'&]Mh qocFVm4rCчABGJPco0vz[c1G9OuyjѢ0+*`6܆~hR026kĭp2਩'ζXIu7 6 YD_=JˆiM+N^6 kCuG۽ue5Eh-N_c=wHV1#T'##0Pwf ;.]#WmAc^ F)73_gȸs[:~eWePR"Mo" + HF]; OÈEke̵,0.~hķ1pd& 3-t!]X54.HOr';(cyj¨%ZPiÍ?U3*g܎ИT2d&ȅFpDqRZj8IyR5X(r-+5Y-#YE22+KYce|ڑ)ހtFؓ|yԳ5z495lօ`'l4 Aâ" /nVUPF Mul΋,'J8x[\VΔ۸;bêƳK55^i# tkӫq<>[r*Q_Z<qg -9ayi͑br: .x8D_(.8A4.)lxq1$2W@c$)O~nMWiLfBF`Y?;fezb')r<ǫ?9v&GiLOS3l1oFQhݦBۘM0^bȊ Мpj* [,yJ> S$q1Eb#k8`Io,rL'MP:6,0$ox1`Obrcq3 P U5{:8AuY dM^=kcyAG9n8^5N$tW\CQ1ɩiAn1kpC,Z8՚zz2W,V|SX{@n>b^]yv{lDYӁLqs/N. f#P BYVvr?^Ir , }3鮽$_Z95mq{l-4VN:ȱ5/R&HH4Zc& ʡ -R`wkm iG-'r Dߕ$?XO\G^pXݯMD`m3} ?ln#TFb|P@p6RH7Pg7}8LM4\l󷠄,x`P[<qy벫nls%n߁/^nDVm{>1 K3]Jq##W00GXkzBXSk@ ן =f"# dl*W5p-z@aeۛZC)WDOݿogȗ F*5.3퇌R2<v Sa))1-u5{2N!\Kr?s;-qWUc+4z%mƧȱď^:4ayM'[VuwuZ^Ȉi x ͟,_^6JN0brw`ӂ\Fz@OGB>¯0RU|P%"=,o& BR3(=k7Dsf9ś?뒍?meS= 5oB#{1sm#E @ tYFjҠ?<\iIv[*n=Mxd}&A.[A mP*rKΚkzv E,h1WDkĸNGVu^wleZϲ\죛kZ>pwE{ZLC7/o ^?`o>tXՄ?ٕy̯߳+@?_{>BMʦ »W% U07)Z%s8`y ^dЗ 8[g|75?K@o"> EMkWv_) }6NX\ϕncsbX6GJtƉi_<}_6E#ƒ!lc Dш]'ngt%%%c@2rsI͉s$X߾1%@*'}Y HpW"$AjXqY}{gtZ*+֕m0މ &ìK!U\Zd:@'[v0^GNB37W(g)s'^g/[KG$ARZT:տ$p‰bHW6~7rH_k>@_[9[`%He%B}mi3d&>nScPlÎEbϰu!CH^;*ӄj;}ф#N;80v 7'PyNIg< +< tEwӽùBvdPI(^Z,>A~Rj?o $B4e!hO ,gZ;*OmXHTg 6L c  sĚ|C-&M k,ٚHKb GPa{rŗ##mXeNgL=Vˤs"?*{ BxpT/K :m띠rTN' }鐝J"'XIW~ļƋnߢs1#& vݯ@yz`Enh+vkfZkR VOF)G^&g4nQhTB{s `E 3p:&Ɨĕ=uW\qg5!=5犬7|#e8:o^Wlr>TvJN@^HeP "u&~O]dX{ ̉hq6 E@vieV6+{6O6TFX-XEߪz𣣟*w־ O=4tΰ\q0WkR;w#*E1*tY5(;$7UBrMfeycd{[!1cKՓVUU:J<R~mp}PYBʐ:8SVI8J26:yGiu@vh21u$!W\%ʞ"?hE`ـvvN+v|s,.tܠ OL+-nX8<=pV耋I4 .wrHZ$U}T!0$*[dXl"m=1Yue] 'hp0-Eךhs?NH^b 6CJ$foOicC DǮ7&"|XJUf㻕և_οޞ~>V]9$)Ȍ2y ujXd/׶ C}s0T+͋*I͹b}Qu}FS/`a9 0"ac 2dYjN#nӒn*s"'eAIѥU[6Vc"7GEL<$+ѡ8WZ4Ls"m)Z"5Y֖2A.|6{oӸTzo0RIwhLgJ[ۮֱ/xshfb^7a梡ODp#3f"bCN˽WDoaڨMk˳8*LSp#;ީJ0̨W̰eueU?115~h+LS/ix<§gk 7 a<󀙔bB>9 ҭiY,Tdv&pp./eH݀.؆VRa 2 Fe˥}Ypxz02Hy-b&/'y $dʘ40"z8.:I|B3Q$ k3+Dϝ(SZ$Ff  S[m\"[4ԙ5a ~XTڝE,',uTDzh33]{_`h!BH#!+:xȚޯ;$(h&xjt^?o&2~2c||(Va#=NUǣ~%yiJ(a8꡾ŗU${T /k%n0.oN͏zΝvf4}H=tڻF)U=S“1"we0v= }&uBڷ8ۨV;%b; *ͯh$9owy1z]1RZ3:ѾxJl"k`8kz"J$`'W_dblC8Xw%3TRp^ T EŃ[B|ڂ~ͅҲr6m ]NS gTmk1% 洔k9Y$iҲR! _>w( =# QQZpTCAռj{I:~H;D&D|q9sI*{v,_6P`s5븚^ }/# } YHKb͊916JBÝ':QfojvTvJǾNfDJi'vTv У8ªbмh/ ?s@tYSMOkJOgMNY$Oɩ]}ew}Yح]UrXCaTP mfVk3 c>0dZ^F|5/o{!H'k3CY~>nF/0zJXIFc[}|U][i_$ ?vqG4\]QWY22 X𑕖}ͻaYRa!`-TtvlAp.Gа6x^"wxkT^֜bN:`OM[(c/2AE:r!̓ʧBDzAѻͦK|'gLou?~e*pVAC^a 94o8wi:b[e$N61t! o&s }hfn`&|lPVN W2z_.*`BA ̆8K~:̓sﲼ 6~F<,]Zh݋yI>ũ@zW$҆^yFƶ >WJc.n=)7V3g;5'P:-o`s6t="-d!Y cVr3>`xD cu=E I#>#K여j/gfeWnȚ29cݽ;O/9z6t_7;m0BU[xƐXlutM(Q[8\ &#08@b0n-=Ŵ]Lb~h.ХP7IvRNL/?'T=InI:__`ÀtT3~FL1 %ѱrE&v_O]T'܎'rFk!;XsU ٨!'( ?/ hPH+=[Հ8@}QO>`*eiBM`UR3KdSqT@n&AFHKW+Qd2|Փ(|:sGOi2΀ZE$/k4碊K\(`c!nN|GaL:[u1Z'ꅀ윢π#.x9VHtȄ[DGGyLJEOx! cH%\;?_㕗sou-w10pdsnABNCubFqJnyc`Ӝ(=4}̨¬.ď)TqR!ai5}l8h[͆z:5YntG$R 1:>qHH˯57Vrwhl<! -5|>}Mx_ON aީ S5ӲNy3v{)Y) KI)gpMuoޚYQA-Cߔ %O0]F aH/@N&;Y׹7Pر%,&j*M3ő8qE0$}Կh&DQǡo%%j0Kqnۂ(}! 䀎r6lKMiK[@5#w\G2*>00:WY+҃XBң3ryb.˰0V{e6T.[.΃y6O<[5aX$k>AVϜve]CnL50b茮T6’BN'f*vWV+xy!imchHyIv Ci% V٠} zc>:?{[,)ď@(OEvT{!1tbYP$kDn;Rփ|EAQ+@)渳91i^A?-}V&zdLo\)v _ipI[tAmVҡetW.I+scCw{\/3\^}:-|,w ^ᗫ۬Wk~E!'J=-3>†r6>:%E);xνIJU's S$3V:w™Sr6C?o /V1S;>0x,~OԌ%Ԥ6iIC-')"\5X_v GkڙDE}{}&5چ{jZe׆ SSp] 0r,`n%tAٕJ4F?>yBM 9_"yr`rn쬃%`E{&,^$|$J_IǃܫKpۨW{HKA2>n Oi"!#B4jSOj`4y!5׬}l Me׼ĺY7x4Wt=}>wޚ=Ek^T<"T:~ǃЗ_,((V+w2Hd\z25Q!>}Ȏl{N7 7'4wPڵA$Su4lx}(m)͊`E|t18 w\Xz,ZBK#ĆqGlB'C_>}Y>H+ΌAJ<|Mw] i#Vֻ c_7}Ufo}!{@j}Y_7tV8] PβәɆG-6W?ohUJ r2 TE*e$fsŠD$Ͽhv] lgfp3  K-l#YBs vc3e`=P#3CG ~y|Wh)ϿUbRQ/Ʌmۑb[?eם8e[pT35;Wŀ',ɰsVtB9,Qc&lAvM<+^Vj8geqzCCL[1.ǣm7׭p-˚{i(ߏus"s`ze\ 2NU;ha7/JZ{:Y;mm% f]"?9 )Vᡜ`wcl Y\2nɕV(ŀ]a3z3&y3+|tn%Bbf(;[_@fw0v5sᬳ: -Dx~d]``Ud'0y=f7ZkNh[o<nUP% 8e!>Mב 4ɆhL}X IlPޛR Rzƴ״-=J}?/5-UlPb-N*{L=2> \"Ѣԁam YNni~[n}paFQM8L} l#6h "|P}݃cge:sB|)m{~X%"%=^jw'8Uޙ1"oQT܃-Gg77Շ9;JE%ڶP0MâW1C4X=sJX",g )GOȈsGgOXOɭnCc6roJȼ3H|L5Ϭ+ߙ/O[u1b]p`vv7맺{YC&(`84 &šfSR s|2{oqyF+U'R9ȥ2rI֣mDw2 1šMe4r(PH(^,LG .FŇ{'ihލ wwh;@ vB^MgыLY)v9Onh_*iSOyPӶ?/$L٭^z<z6 ^ԅes!84W@u8*v06P֢H53ŠCRx5Nj# ˸p#[c+-aA112d#s;Lzbd|h%ZZ?b;f:#@7ٳHᩝU.fUY@>y!txƜqHeMA8*+O %~uH_]l,_= ?FxX ܕCd~vj<7jFUڊ욉z"fʰQ~Ȯbx݅uޏL#b{tie"4=sců*d@"eU{[ؐ(̾g_f$X%]`q]<6kI M*+ykw?1Eל oHGhjP %(. yUwMۣ_~]VWSg ҁ閡2Xi%mKTH")wF>v x,v?ԃ]9 #3 hM+ٌJ('brotli-3.4.0/testdata/compressed_repeated000064400000000000000000004315401046102023000167030ustar 00000000000000[RE;@}.ҊE\IKox4]MOl!+l\ECKgiE_|ݹɽ#IBƁQ鐺LJE`;l h/@wL1F@q(}fQVF;EFpdqȑX7Jdh 2>W"HA|#n9l[=ʇh^ i~_o#(aHQA9"t,}Sp0Q6a2Q|=,C@UE* oQcHS:MG쿮FZ&Il}Y}i;z5Ù^koq @#H HQ [č~2LRU`QGUUn(ݴәCu. !lr@$zd΃vS->B im};; {4phl"&= AbO\/gj 1+cUz>Ͻ :! ѴVa5h`PxNT)Ѓܙn'>?OϪ;, 1`ppg`̨ "HPߋ #8p&=[QF0rhɌK`}HC;+x D<`T$EH^Bgq^d1^BszmWw8-JH,_.{wsqҷgXْԨu^:K )w4('LXC8pOA q$%B,T)gBm!nCW x6 F}gQq =? %$EIJ'b p4יI.j|!@el) ?&\f60dA_SX2xOi>~ўP6KUwiy W[(b,73(L)+3.hMd-6##Q N=&F&lbZ =&>TkH 0h,gPBu"/Rk9iY.>>'JEm nL_ <%BHB\ƪj9SKcM>[Kh_"0[Y?Q{8ߛDID5^ \ ~'"NIzu@:ֻk $+}OElW IHbxt*mtKnԷC!| Qz.M7{ONs JFECU8X|H,-:,aC{-mjz.iY;Z%3owXE S#;ZXq3DF)"F_~d|RcKU2_$Q;_&^$hm 7+(a!0_vh# >Lkޘ\7;d4/?c.C:Cj$L]K+kʨPwŒEL9y˙|kOVjO3U8@vZ`~̾# @ , D(i"h`cR)k԰[]-ʍQP(G델t+ZvXp4nۑB%ݢBfFΏmMU 4~> Eӌ4vseN7Y叛)9e+3Q 炪oHaa.I5SpcUW-QJF-Lc5<8Jz) *L+:R֫7/A LDGktn(-31^Qx)7\C}h뿉[=&r! 8]^uaR3YH, ?T{F|Qj j-+2V'ܙ CH!OP8,&I?FP*A+ƇnNDk9fm(+sI,EMyr׌W8EKwBh]1FxjOEo23@ eGwyQ(uRkFMM=u;&\?pq]^L ta]zvA)%+'yx[GjkZdj9GQۧLf(T&>2l+\Ec |8 !']&%0W&!;1{I'G7Xs@tɜbʎAFtB8D]0eһ{vO7Le:̌i7L+eO,RiEJpdoid|ƞ;/8Nv!)ž)#K QX:ӲA#=ലbDУ(}~p4YOEI'? )k`!'Fˇ@cbQVjIvQ}ȟ%&R@kҘTKznUنXE1s0/ތ`Pn Aa@NɤE$VmXW.eC:xp*/*kGGN,S"9Vm70J'FMǷ1 \Fgߋ֙\g)d=t)<yВΩ=/8¶! zWjg\Yz< ͵;D}圌<%fӤp&Ґ۪D&%ԜĄ.*PxL, e*R{[OQtԇtD0aXyj UGdIRԩPLLKw i tN;FlpjnPԌM@Q.!I"bEdo~ @9H})ʫ'uMƬޮ([ҕc7vVg.%0@xd(537\oG7FjϼݟYOa]b%yŖz@ d^7;{ Rk,UUg0hw Մ&$9c\j10 n. &Ac^U7BߎdiFj:JxY'0!J6Bi6jOkj/9떎HQ%TCF+-ofž9庲3@O9vFYXI@:o9A<ۦjmbRT4$MƛvN}}] d<\%Dv`0 f&5»u|p+EӍvƶPMzbvG(M}$RUJ.mW 8X ]=#EC9\&%=dQR ;d[}}zW&Da6Z'ݭP_Zm>[!GCrK$EjsH1^0s쯉R ZC-%3[H2Z*?et%F$"Zr+N^m8ъϣTE6S6X3PDꞪUk7ԟbUclBY.-qY"\7{ZiD"dm_1oVԉ4Q2H{0E)ȌS>g;`s0>peIc=zǭ*}FEc 5:oӍ ]Y8+0Ðl@OeSIMƊ>G!`꺄҂O3SAx D1PA\.~r>&*')J :<-[NE<;D rSo§gP$}} kn3vTUfx&m4^\!ܿz !}1a;cĀgla*V٨ O ~tI#x٭i-`~ 2kLe=$*V|2` !+V] YK-ClRV^ qjn,*TP\:0+Y+ÖGxQ< TSc@놌®L]^pZΚFᏔ&:twxK,KsH< gkLNm{~zf:E޲,]]׆" Mx!R~Nͭ.>>lV&KUkzn 7ZC0i5 fIrt=[qdV>Lvkㅅڑ]8^- c@atNt+Ue /m_{LE=CDMw'Q+)xf΃ڮXQ!2 K#g} *"nhʎ9ډѕ>T/1 ^<6B(zV{8G{9ytxȔ&*-7L.y%$u^5ƻ;W7%3̄iL)1iQO#%k|rVP XRϊ~kS]J(?Z@0vS"vz -ǿ΋byYϙIC(`kf&kn"&'L' 7t~eDmoK;AɘVltч8iXc2^f '%:ՄX/=02}7CO. Z]ˉ3u)wnđA?|ݗu{kCH}IE tk[vMPFTS-N_?yЙ&)]Ġw t637_a&&JcL0[ h ߪ6H~Ҽ,@.g#ĩFqKJa; N|z|T}6SNu0Ų얳()' D:Ut?@2FGX&TQŽ!\vd;5z';̦""HEA֖Pm8 @7a;JUݐJrجoul#E͌/҄ (ud&2/s;V;MmtI|}%fiL2ݳ^~|eOجϡq6+|Z!pbT+,?QYK!GxК^7 L Xwq g^bEYւf; ڀ};玾ơ0INUJ;A|>kWS[0^B@fw5C6que>Ĭ5Ev$ڧYm3u RbZeBc|1v`EϹ.>ΌJs,@B2Î"[fGi,܁u_3)& ~yRA hM?ou=1ؙZJ(/U.20JpGl UV7W=v FR]Y@pÆuʻ&3W=A!6>p?(?͸\~`3Ѷrr% kN:/)%'|ElYz$n>.;I?6|:C͒ǟ&=Fj0w#X-34*V9I=rb3徳wg;@w~Z {Ќv& ?+Ҝb^Q%_q+}bT꽙1XbWioφ. +ܗV)brDʋ%G:/9z⫚UfrfQ8F'K^^`|,E6bLq5s%<̛VH{)[g1~|=aAAIR.{ٸws$]X=lQJTH{Lrrm2eV:$*σQ"oIl=HH8MꆌMc-,+HA~ 2%$#+- O4,SedHt%D3[gγV胱dG3 & ?R0RB`I H4z<Ùӂ[|\qpvha$rN@w8 ҵ򕼂768(2ˣ{5 +y_X)9\yekT.|2=e݀:3Xςq}68a->4R-8W?QvicjGHI օl= ?ë~>n"p'ZRp~,n!?!ްf4لe|!CU"5&k-aU0j#sύ?B6NEDG:?75r,=ruO(G5\a 랁mWQs!9O$ϓFInh֔]d\""~+kƙj{Ŷۜե4^/n!]deHoj%wEN1<[YfIe)D7N,mkÌ^yp[G-w4TpqHUz:نT/lM=ԡn(6wP4+E$iR˓y@j. V3S= i|32Er%lyHɌRFd|;-G8F`2+U2(~+9f(sExm?T-Vs0tU|4ւ'l ip.Pg,D+.. Dk+$U!cO냂Hq`7Hg}S[~4s.R$3LDlgց$4YSq{)T*ՏCVrCcX$Yw)<ؙ#v4#Q,;P m&ggI']^g~8mh׺%e{67xG&Ef9 !ޭT;v /'H @;2K=7zD`(2{lՀjccE, yRjOff ژfD_?Vo!;NL]A%Ef{k m(i$> &S%{wzs} #19u1&hV;  yWD\AɃ9ΦOLnt[T&hW}_BfҨ Jq͇#z G`Xn49YÄ@5#f6WAz (oPj1yh3{emArwXp+Oav Ywm&zv AKDHeH4))C)nQJcTWdhzFnEFR9A=DCW*PEqH}NE4[2M9e4%{ř Tͩ=aHW$r;y*7?Xu[S97yM-r99ˋ0k2U ':SFD|"y+)4څӝ{:p*ػ5Dhر, M[9jMCYH<"jdrW^HpܐYyLt#sc0G&lB9]׮z^g-\+v/.Z3/EA i }[0t$&(iYC[l 5R?~)`]8mvIt"KW7ep882.g|9kDn1A,&qqՑdP0f[>cYLGY5~ʭ^/0T_(ն-1HNuldrgŒ(#58'oǬ6DXȢ{U]敺̃mC'BwZY~,BHF  *b3t8@'c[Ӊge;?Xm%ɤKgBjv&ճF.2,׆H>JIΧ>LIln q(iWK$p6cT]2@z{\ \oJ MqZ-K=y\,hdC#JQU\[SvxAM wgi 6:0UU1WCdWfv':*rC x)f:(]A_.R{^ Ɵ_w)2=xxeksAit~W`GNn' I]ޗV`{x&7O F4$?aytgEvLhDDIZ,9E"$84;8Bߟ.Py>tw"]HjƁ&IrGJ~7zЍ^[ttYaAՉE!q w:!ESbyi_֮_Z0$̑s$μc+o8,ai yIskk~1h`1a=_4p=8w^ɺhh*_hG\Y܏{&G܈Ѕ{uBw!W˞4.!#tYB QS6/$i#$je |/Ez Y~B:yzpep+$oƊbH-8Īf NK@H|oTk&"+7+jVg4\v^Eq>?В## A3Qh]{4sm;+FkhNjIvb^N!}e5N{Ƣ"P(?߰dV9>nX/}?k47nVtZnzõ;m(޳+?N +vN"P{,0ePr2 G3\߶Rbo)f1+V*~w شyP4>A5}N yd8OiQbC7noO{ŭӲ~h0aH7Ҹ+5RZu'9IS-oh]rf\HkcVOQפ U?I*:E5,1T`!`xO,%URHMVt9&${1_JBQ:oSA\-T[ЕmCV7n[ C˃ %6OJ0[9"R ; }`ur>xtkjS`X KqUFL%I=a\:9RQ|4 BhsOxQD6A6lņҟbúzl?V[(jNI;6U܆u'Brga>/e ˲V Uz"eZ҂.. 2a,pZϊZl)EJI 32zIR;"ҾjOmp yjM69Ta*L[_̕pRk/8j:|"w f$e֧V4d)0 ~PmPz 7Q03;P6mH n867z =š\ypg.װW.rtsFks]iцnm$OV.KSnZUaMiVdpӎAO"CṮ½!6kxj{Fl3p[}޾ oFz^(W6xhe
ej<+nP:Y@R&8cؒZq*X _/PF:@տ.`CĴ[Ŧ̼ o#Eqd̓lk;n@XYi,Hb8-㋆G|_3צKc]`v lW1͞Ս.y›@nbxT] V䌽RM,]ZbqPGDzɀu d0>6qoY?< Է2m$~>T[]O0p|h )ֈͼ"d{wx<Nq5Hk{ǿXCY{fۦh]DP%*ٰL8aIC=ʺlRRS(F'&0yn m`\ҝ$V5q:H?GE%k-hom_0fңӏ1S,aq5tTbk&,CeGӄ-suJc't |jZrj[:@KnٱG`aMҫY8m/a0+\u+ , 0ZMn; DaڛXpWFۗn r5x3egżxwO;"gas8.+{*(0D|}r az cY"5lۍϭbʝ<ܙBsV wdowkYlkQr=U6{~Hg7*Mf#KT7jC׈ݓ||pҸ,Fad?u߯MWOs,Y#dXھs9Zpe >7_~i5_1dڟTY}̍EUVPC- ϲE>Yf:l\$x>֦hܪ0;_NF4#OD:Pe dCP Ws,-PnJ@B5ߪB]L?nθ0#]*t̑(Dq. rRͬ;2`amw4ھll*#`ynoȰBF[>{ dSPƷ\<.^;HS(Y -#K4Tj 3EFv;]FWv 0r)6c ޜ} TsPq599WYJW:X*HLg;jzRtH t7r4ʯ؁mp-p熰Ȧ2RHJ$鮒{Ier3cu.=6^"WI>/ⱈOFXeɗBgqz"&JfSMP,%z9%QeO=Jj 1'Qm%O$amtF oA5NϘ&6Q9=3m$f&k=B/ວ˾2hw!ɅGq2 q A!DJ~P;v?&ߴT6Kd/e|C3\UU(r1^Xɣd: *^"XUIRlp0$SS1T#\ۻog2FJt-"0q{rp𵄰} 5O{P㏿vP2\mŖ 3 v.iۛS~B(%)i-8EFjxk1eg1^[wocwS7#..ndX16 ;mlHqY?cWutĽBH*i-wON+ Q`iƻ}iQ]xs/PF{кb9ЂzS~vxߚZn!eZ*ןi=WOpqcc%me:]L}&idؑs$=2 |,Qtc%!{ɐ.#t+vb״"׹pLUerh,.wĠkx=^ \ S>eĩ3=| +Ŷch [1@?.~ gv;)^řÄ2۫|f2Z'#GetX:G"~36YgV褏SfPo9șlJ (f^2.S )\B0+c:f? +eV7]]}yt"hIJӺd|  rFH=[<:`McvZ(|v2}!Ӯ5}ۂLZ&k5KM;Tg<ӌ,ls ƫžW5Ëd3- #˺É=%}4yILcKQ|uQJp$oPJ|Qʗ2_-fڗϐSUU%< UN4KeZM^,iJ@4O@܂]2Ag`XDkQ{HY: .q\%IPġi! oH mCHɉqX8]F l4Yv)'\J!'ߝ ^zzG>l 8l9Y}-gE?]lܓoZ\۞z]G#VD #K쀽|J8r%Ӭ ,#m4(Â;RF|8kG'H m*KyK}Ý>唘FXP)ok1JA3L*Ɛ A!QwSU.<{+ip6H\vjY}106~dƙ;qu,#TdM2'~vPpKf5bS#ZT=)sk+C:5h㛴m21ۆ|oee}(_"[]j("I`!>]"g1Zܶ鷛G3FHn@龗鳗} \J/;=gMTt̪qRy9̈́ UF"sG `n#d6f[eGtkQf&M/sQsVN*:ٞ~hO[B6oZ7݌ %c'm4jmq;@o^P?쩥3#j>4u݅}*wu:PER?k%WG]gZY3BZzˁm>R~l'V˿TApwE=/(w=fZ(3jhANj޺5!z| icG`ݻ""CIgsԱeඅ,V".L+|]d;!+@kjzҔږ$M ՜#O[yOp􉉴(B޽>_?$;?&e\/ $#m`5anEJl8pbƬ8fӟؿ$1HBg|Y_G:4/(vnj f3UE}c0SJ#m`6rmn"VϬjJ?!㙜 gCϟjwӌ?#C̶WPt `<$M>qGUkw%|y@"OM3Q,eTmL$~6oNMN([[p#E(Gz:wx`: AέEwaPNdz>$S~_x ĉG屁#)um߶/w72DĎvxA}b n Y[:=׎"4\UJߖ;587{(^,H(ov`Nɔ{O?L͢a{i_94 ~JGclPx\n; ;oC; nE8A$,f * owd13ib,e|a k\\Lq,M?ܺ}dΩ e+`lrb|X<R%rԁh=h5Ѡxpߞa!/yID,1~6A]Ƿ1Z7ĊF#P:Q4n2/"rI]~΋lk!wo=YƇ|"HCfEm .k{ˀ# $$mu_P%Bxh۳>UxdV#XjǑ51[r4pgLra0u =^|={ױ95oc KUYR#ZE.g}P S|G:$u=íj2k)T\ $ugm!Swsk'%Sϳ$^|!KgMeʽ8RiۊR-n eZ9O?(%$ciP̒D_qxoүUqo| ԣaV47ɻC: 9a|:[!Q( (:#f_:;xu|]Z2XЈqv【Z2߰ c. |\W iv0c(0_+]<=` Z,EyaM\-4ܥYR*@ۗ_G]_QhUL{I;:I˴@owe5WLҝYް8WR z*N6T[oY#UnGTFnPӁʌ,D=ķKi; >RWLحBtT޹ܵk&FctQ ɼw(ue>XT0@S`w\>%Yɕ8k-{sAi15 V%)טC~hRyXy{$<5ʛ%7RY( ªx|gV8e$b+M)˚3xwF*X`!rs,5k>ϏZXW~%ѻ~>!\̾ F+xRrOFJʐ0 $%$D%?&0P>aqQwkj(A2-q;s^qXDvd0^ ݆# qO_3X5F3÷̰|<|[آÚprgptA+@W׍+yc)&5cmsޥp 0<_ULs)鸻'+3nK!%JP =T2qMh ,ۈP2b= =pP p*W3RI۳f`dsUɐbxn'3W?8g9 ;`eiR(;uEt%6 F9z+׀%ǪO=O*o0|6,ØY=yl%)6vZHmI78Q1qzE#d#bN\>?=.FލlߐݞMNTU/8ZP /LGU [lR;| As~.Qj%}  Sa~X[4{" B[)ĝZؚ 3_TҬmf?ݴdԝ@ p*R0GvFh}xld9NOQ#N| :!1.{Ϗa)Pb7j ]e33í8f.ߑCb}YMEk嬲,ȷB#wtLR6 L]5xpMlX_ؘilQ`Xꊦ@VER|+]%]X{ccs֏uGh266h&J0V*"-M6Q:YM2:M3m̳ﯣ?pxH1( 85 ͗~|{6/%!|HR%`_H)z ,z3[/shgъpO]'JbZo[1{ffɾt>sjpYQ,J'E+@7`=l㒐]peyOӲ!qX$ 1Z#ZW0.}Iמ9cIb- w@X9Hv_+z[R99+d$9J]];Xjl3Pj#XVWUχ;eɑ̣Oo#KUavMh6*-}hå,qɀ)>#'Ts?h٥Q0KAbaIw=gz&k2.jKzHm={1]%U*$3< =*= rߢzRw?~gd3M0{I8$* ?zM1m#c$gGu&ZީHWk%Owm }{]FC߶sҠsl٤Hτ0%c<: ɓSa;;od>(V<FA'< O?=7}Ӎ#&pC`̓\??~?y=BCR;IUx@SJr-,*Ga\iq{G [inuD?+glQ&|@.*ha&WaᲄE- Z@'~w_L+8e3N4 *ƭQ] b7+FpR*,U`)&pgQ.BuM߽0X6z) )],wj{Z{Do8bҡ!/D "s(xE!ȥ*_]-H^lau?lJxuR=|1+GpCZs¬{ϭcMҒ!;+&1EyY&BR[W]LD+ V*2q$%~j_5_N@kݞ/^MdsάjBV3x5`^W*LDB(,mTi-64)0lz._n'}VdcaW#B&QxNpD.yAuσb m7/_EEv.xbdC [35L!mNu|Z2T`?q}f`I9GI4ɔk$42YlBEE V^-/_Cv%0x7i.IZnuy6#0t wJP}٠V֣$b,Bu-;iXRXmz(om 0Fw~elkN֭)7C2ϽƤWP Ǟ챧LI\CV곏}-*A8DC gGO?|c5[WLh7z-BtZ@&$^at#n\}"fN9|eM0Ml 4UEd=v:[8Эgval:Jfy> M!OljJqL.'F_KOcκ㷍T)J6U~W\Fc3j]Mnqf7)6K=PQY&Sgaf/F=XgFaF+5ME+Q_"\T][‰#{] bcjr0}y`?JML!>Sk>PSh -A_2醡~yB?3TfWJ$ywڇ#3J_VmJ YN^O*<ݮ (-Bz ȅҽIiâK gp#)WNxlZdM3}~(\+7w$"6&5Y5+^7ֿp g&vA¤ mtXw=^^?rIRp"& S+Owo2yhbgQHOB8a[=[iLPh_u!$z9ʏŒFZmNj13&4.P)h3sx儬Ԙ^L dZq~GjGuȥ{8,̔U,Q@GWn&-82kpӘ(@pRln bxXwE1:9ϤrJG0" XZ;_C t{gX)ظyGhƥOlfτOkOy|Y-ff|="t3O!As#Lt>MCܮ?Rx{*CEL$q^b3ǧH4~{tsc gOq=F0s»I^,0T]ǘa,-i'[*˼4tJˠV5 \myt@q后XkM #i-/؜S5qhpe;bSDر`Wgo sAtUP1ܜ *<ϢqiqzR޽td@mc֜"o9`ջ@ 2VOK s]B`HI壮{qf@ 9\xPS#[I ŃKs{|9}Z%~m`uAy)ep-^3"ʱ6C I7JiȤ}Nj5g٣: 2P%xLZ[y|aȓ4P)-^BM\Dmٝ8 %`?nVю~V\#n+9zd/5 WKJceO7,髎/80I xVtn96Su>z<6sey`91UD,MxñK?݌:[%3/knC^zgS;{k^F <.G!\,N70w=},OŒҕ~`oYNTn |_`3 DӌiKEe2ACX(̄ni¸anA})I Bh7 iFewp#$og]DM5n!SFbt, iDkJ>Esd 7X *.VOgg=\_d6%2ΦRS CP&\&C ȩE;(Ie.{0~@jRȏU5GI#2IB6Y>J;~ IS O][u^[UXJ78 \պ'7$;H@ivWoAT;zIx,& חǯdPMgw)RG- 1{s+ ؗ/ZM~x_~Fh=~ofjԕ$[-\BAMuQe]:DQOK8̺fQC BH?GH$2?ϳy_,íP>X9Dh['ѣCs'=I~QueZeTv^xp0S\LZR7Sbõ1I?'ƥ=E\*zX(n hsܘIҲw F˶M%G3[P>S5d}noJFިMע4D?Z) (I;A"˶:_R 0Mx/*]4 OF>%eamYsRPRI,Y6d}CƊi+n;x=N}0$C[ӥ<9dEk(/Wk(if1@KK8䓽5| DLm3Ahft&gCMIRyL{o[+>sQspW`DWO5"x2Pԃ[{0P% v.,556HiI6j"?L6;vT^{Ănp@|Uq ;Y@3y Xq53U) ]vcjQT>cF|aBˢlmhڤ _tWnrU/#JQRXyRZWw|~}xWWT"@5@n6s?; MiQ WPdfZvGElrڻxmEuJD7j]yhɄ'J+?4u Cqz;' /$`uK5#XpGrsaQ veori.vj]/-ZWjԼ0B_uiO 7{s_iY RIax̑*Ga4ad\y'~WOzTS'Ⱦ ?^w0~|%Nѕ|\j{wܩ2l`XZ5ThgS􅒲D,Ҽ;IC̞#&3[ȅ/S|//!STEDfRwHEeO3ix;G0bɎS~̭-?3 {.o q[aY[ mnXH(V<Sõvb ҥe*^j})5Cg1:uzɩ=+P"H׫4` ot\aSߕĝ\qiY!K Yi(M-nNy<7 nǰrCm z`,RXe%[r\O[u_,"O+ʴxt sm,$.A_E>K &+xa"EYLFZ]NԮbk*\G52#J#:Cfw(Kx%[PN bGJBǭ!|Y..ˉ8l~%5ʨ$`quU,pqT>ov7M]t\%U/eȉK'݅9,j= fr୺L :T!tLM{]%^;؏ RIQ:νfR2co1fk 6UַfS}dHR~Zo!^_fCLCڳOm=쬤u$aĉ9M !߻A鄩j^lSf +ltPfonG)<}{6#yW;u'~3wm%Y.Yp%?3ؠBX='{C&nH`s#?"lgJ)]i$!`# M&iPQX)$3CqWo<0{5Mmfͺ QdU0*ߖp\1]j=D/vߠZ{gt+Llv A^?+قZ8Qdm":J&2A #L { ߌ5|)*HGJ(s5&UxFkIR5ZРk#Ajt + |N?ڹ(b>lQ fS#a0S*TZ3K*KUSP}^d#k:jU0u~[2>9[̻[w[ܒ#ժlYZTi)wij#)ZQb= ݌$\RM N;qW (Nt;Om)F1=WkR4!y c9) WX%5eA0\Z;'o]3VQ<+( gEq#8P3F'G9 gIQ'$F(mH_`.)/xޚJ(G,LD`^ĿyFgԢ! :fg9/8ˍI(5AzN1 ݫeڊMr>j=R{Y 3[/Q"|* !@DM|sr-e =:$(=!8v bP +(&Mk0^KxGFLqٔk P*XycztC߀ZNv1.ٕ3^:m "⢒mz*$xD"Uyf>\ͥKVG!*8F~DZ࣐ [1pTI@w nj zs|bo~މgwFD@ecpzv\ KP'9t4eethN3-x$5hȂySUcOPԂPxw o+Q-I2 2ڟ6IL8ZkbF*4Rw8W,t j}hqX#dl :p\17v91i;1PA>~Y,AlG*ZgJ{/->pA ÂT,k.NUq̻}}5` \#)00%rkR&8ofʚӘldz9&%gj)Vu"ٕ/'[{ :nOd S[CUeڐwI"~AH[Aģ/BOPgNf& '[{=f^v;9rêPIc'8zm ΊN屫@m. iFM렋|-XOfJÝ,%k|5MMpKn^n 3Ĺ3"ǨdwzlMDZ-5'$!$ ZpDo&8r_n HALGk :DPg'a(m^! 8'wla K03Зj\I0VyZAkKd_2t b ]JOwT1a,ZN@x" uѾytmw8PAy_t4q@&ZBk6+U%gg4}_:pft>Mse}_ŕIUwz onF%<*"U(C;%ꕵr6:/jwqέT{eϵ+!Q"&~a }: ԨCa(ת%6piXCTǺ jv/ozÍ[{yeо6sE^YTu ˍQ}/ѵ|d;դ}jA":kB$IN3#NL*[`_oOg-;[rVM(Zu(a2,w LJ+ [ŬzYNr0PjYC}1RM' vp}q]=HDjEa:S'Wi 3>KF@zwHU d+!X;ַ_4>6\'L ׹i١䔞{INXȧdE5๛O o 7uhܧ הnGP]:Lvqvʯ;WVI{au. l F8k"ff|VRj eos*'Tlt[ U)vvuSiT!0N b.d4|Hj6C&.w4tr 9a| 쯃IMS/G7([/ޛ =.RF4ՁfUNP),?@5qt{7e&LjuNdPg+^كtfW y&(r{GbhA 80#[{F.Y9ؠvĦϺ=л;SoRJӎuqD)&00؀ɂ!Oa'!ݼ[;{ݻYiL cE=ȟL4W7d}1ҿV.jvU̸LIxY-R:?K2j)fBz%3&[Lf "wɠiT&PVZ`=GpO#` ,ϊm  <(Һ>ufM21v LkG>螃5_:Pva 1n&c+U|'Պ1v<VwZY}laC;wt FﺙY6o,MOgJ'Z2[}75_މ8۲ta$NhW5Yh?Ͼ7*Ag5A4'qSpv]HEL0HR`jNo^+烪?EABCؓIؙ2 *q*$X/uv xwY eԞW3 )dz0*F=It]mtc(G4t!hZ\Z{%_ȏ,D6cJD!$T o'd~;ҢvrE'&]Mh qocFVm4rCчABGJPco0vz[c1G9OuyjѢ0+*`6܆~hR026kĭp2਩'ζXIu7 6 YD_=JˆiM+N^6 kCuG۽ue5Eh-N_c=wHV1#T'##0Pwf ;.]#WmAc^ F)73_gȸs[:~eWePR"Mo" + HF]; OÈEke̵,0.~hķ1pd& 3-t!]X54.HOr';(cyj¨%ZPiÍ?U3*g܎ИT2d&ȅFpDqRZj8IyR5X(r-+5Y-#YE22+KYce|ڑ)ހtFؓ|yԳ5z495lօ`'l4 Aâ" /nVUPF Mul΋,'J8x[\VΔ۸;bêƳK55^i# tkӫq<>[r*Q_Z<qg -9ayi͑br: .x8D_(.8A4.)lxq1$2W@c$)O~nMWiLfBF`Y?;fezb')r<ǫ?9v&GiLOS3l1oFQhݦBۘM0^bȊ Мpj* [,yJ> S$q1Eb#k8`Io,rL'MP:6,0$ox1`Obrcq3 P U5{:8AuY dM^=kcyAG9n8^5N$tW\CQ1ɩiAn1kpC,Z8՚zz2W,V|SX{@n>b^]yv{lDYӁLqs/N. f#P BYVvr?^Ir , }3鮽$_Z95mq{l-4VN:ȱ5/R&HH4Zc& ʡ -R`wkm iG-'r Dߕ$?XO\G^pXݯMD`m3} ?ln#TFb|P@p6RH7Pg7}8LM4\l󷠄,x`P[<qy벫nls%n߁/^nDVm{>1 K3]Jq##W00GXkzBXSk@ ן =f"# dl*W5p-z@aeۛZC)WDOݿogȗ F*5.3퇌R2<v Sa))1-u5{2N!\Kr?s;-qWUc+4z%mƧȱď^:4ayM'[VuwuZ^Ȉi x ͟,_^6JN0brw`ӂ\Fz@OGB>¯0RU|P%"=,o& BR3(=k7Dsf9ś?뒍?meS= 5oB#{1sm#E @ tYFjҠ?<\iIv[*n=Mxd}&A.[A mP*rKΚkzv E,h1WDkĸNGVu^wleZϲ\죛kZ>pwE{ZLC7/o ^?`o>tXՄ?ٕy̯߳+@?_{>BMʦ »W% U07)Z%s8`y ^dЗ 8[g|75?K@o"> EMkWv_) }6NX\ϕncsbX6GJtƉi_<}_6E#ƒ!lc Dш]'ngt%%%c@2rsI͉s$X߾1%@*'}Y HpW"$AjXqY}{gtZ*+֕m0މ &ìK!U\Zd:@'[v0^GNB37W(g)s'^g/[KG$ARZT:տ$p‰bHW6~7rH_k>@_[9[`%He%B}mi3d&>nScPlÎEbϰu!CH^;*ӄj;}ф#N;80v 7'PyNIg< +< tEwӽùBvdPI(^Z,>A~Rj?o $B4e!hO ,gZ;*OmXHTg 6L c  sĚ|C-&M k,ٚHKb GPa{rŗ##mXeNgL=Vˤs"?*{ BxpT/K :m띠rTN' }鐝J"'XIW~ļƋnߢs1#& vݯ@yz`Enh+vkfZkR VOF)G^&g4nQhTB{s `E 3p:&Ɨĕ=uW\qg5!=5犬7|#e8:o^Wlr>TvJN@^HeP "u&~O]dX{ ̉hq6 E@vieV6+{6O6TFX-XEߪz𣣟*w־ O=4tΰ\q0WkR;w#*E1*tY5(;$7UBrMfeycd{[!1cKՓVUU:J<R~mp}PYBʐ:8SVI8J26:yGiu@vh21u$!W\%ʞ"?hE`ـvvN+v|s,.tܠ OL+-nX8<=pV耋I4 .wrHZ$U}T!0$*[dXl"m=1Yue] 'hp0-Eךhs?NH^b 6CJ$foOicC DǮ7&"|XJUf㻕և_οޞ~>V]9$)Ȍ2y ujXd/׶ C}s0T+͋*I͹b}Qu}FS/`a9 0"ac 2dYjN#nӒn*s"'eAIѥU[6Vc"7GEL<$+ѡ8WZ4Ls"m)Z"5Y֖2A.|6{oӸTzo0RIwhLgJ[ۮֱ/xshfb^7a梡ODp#3f"bCN˽WDoaڨMk˳8*LSp#;ީJ0̨W̰eueU?115~h+LS/ix<§gk 7 a<󀙔bB>9 ҭiY,Tdv&pp./eH݀.؆VRa 2 Fe˥}Ypxz02Hy-b&/'y $dʘ40"z8.:I|B3Q$ k3+Dϝ(SZ$Ff  S[m\"[4ԙ5a ~XTڝE,',uTDzh33]{_`h!BH#!+:xȚޯ;$(h&xjt^?o&2~2c||(Va#=NUǣ~%yiJ(a8꡾ŗU${T /k%n0.oN͏zΝvf4}H=tڻF)U=S“1"we0v= }&uBڷ8ۨV;%b; *ͯh$9owy1z]1RZ3:ѾxJl"k`8kz"J$`'W_dblC8Xw%3TRp^ T EŃ[B|ڂ~ͅҲr6m ]NS gTmk1% 洔k9Y$iҲR! _>w( =# QQZpTCAռj{I:~H;D&D|q9sI*{v,_6P`s5븚^ }/# } YHKb͊916JBÝ':QfojvTvJǾNfDJi'vTv У8ªbмh/ ?s@tYSMOkJOgMNY$Oɩ]}ew}Yح]UrXCaTP mfVk3 c>0dZ^F|5/o{!H'k3CY~>nF/0zJXIFc[}|U][i_$ ?vqG4\]QWY22 X𑕖}ͻaYRa!`-TtvlAp.Gа6x^"wxkT^֜bN:`OM[(c/2AE:r!̓ʧBDzAѻͦK|'gLou?~e*pVAC^a 94o8wi:b[e$N61t! o&s }hfn`&|lPVN W2z_.*`BA ̆8K~:̓sﲼ 6~F<,]Zh݋yI>ũ@zW$҆^yFƶ >WJc.n=)7V3g;5'P:-o`s6t="-d!Y cVr3>`xD cu=E I#>#K여j/gfeWnȚ29cݽ;O/9z6t_7;m0BU[xƐXlutM(Q[8\ &#08@b0n-=Ŵ]Lb~h.ХP7IvRNL/?'T=InI:__`ÀtT3~FL1 %ѱrE&v_O]T'܎'rFk!;XsU ٨!'( ?/ hPH+=[Հ8@}QO>`*eiBM`UR3KdSqT@n&AFHKW+Qd2|Փ(|:sGOi2΀ZE$/k4碊K\(`c!nN|GaL:[u1Z'ꅀ윢π#.x9VHtȄ[DGGyLJEOx! cH%\;?_㕗sou-w10pdsnABNCubFqJnyc`Ӝ(=4}̨¬.ď)TqR!ai5}l8h[͆z:5YntG$R 1:>qHH˯57Vrwhl<! -5|>}Mx_ON aީ S5ӲNy3v{)Y) KI)gpMuoޚYQA-Cߔ %O0]F aH/@N&;Y׹7Pر%,&j*M3ő8qE0$}Կh&DQǡo%%j0Kqnۂ(}! 䀎r6lKMiK[@5#w\G2*>00:WY+҃XBң3ryb.˰0V{e6T.[.΃y6O<[5aX$k>AVϜve]CnL50b茮T6’BN'f*vWV+xy!imchHyIv Ci% V٠} zc>:?{[,)ď@(OEvT{!1tbYP$kDn;Rփ|EAQ+@)渳91i^A?-}V&zdLo\)v _ipI[tAmVҡetW.I+scCw{\/3\^}:-|,w ^ᗫ۬Wk~E!'J=-3>†r6>:%E);xνIJU's S$3V:w™Sr6C?o /V1S;>0x,~OԌ%Ԥ6iIC-')"\5X_v GkڙDE}{}&5چ{jZe׆ SSp] 0r,`n%tAٕJ4F?>yBM 9_"yr`rn쬃%`E{&,^$|$J_IǃܫKpۨW{HKA2>n Oi"!#B4jSOj`4y!5׬}l Me׼ĺY7x4Wt=}>wޚ=Ek^T<"T:~ǃЗ_,((V+w2Hd\z25Q!>}Ȏl{N7 7'4wPڵA$Su4lx}(m)͊`E|t18 w\Xz,ZBK#ĆqGlB'C_>}Y>H+ΌAJ<|Mw] i#Vֻ c_7}Ufo}!{@j}Y_7tV8] PβәɆG-6W?ohUJ r2 TE*e$fsŠD$Ͽhv] lgfp3  K-l#YBs vc3e`=P#3CG ~y|Wh)ϿUbRQ/Ʌmۑb[?eם8e[pT35;Wŀ',ɰsVtB9,Qc&lAvM<+^Vj8geqzCCL[1.ǣm7׭p-˚{i(ߏus"s`ze\ 2NU;ha7/JZ{:Y;mm% f]"?9 )Vᡜ`wcl Y\2nɕV(ŀ]a3z3&y3+|tn%Bbf(;[_@fw0v5sᬳ: -Dx~d]``Ud'0y=f7ZkNh[o<nUP% 8e!>Mב 4ɆhL}X IlPޛR Rzƴ״-=J}?/5-UlPb-N*{L=2> \"Ѣԁam YNni~[n}paFQM8L} l#6h "|P}݃cge:sB|)m{~X%"%=^jw'8Uޙ1"oQT܃-Gg77Շ9;JE%ڶP0MâW1C4X=sJX",g )GOȈsGgOXOɭnCc6roJȼ3H|L5Ϭ+ߙ/O[u1b]p`vv7맺{YC&(`84 &šfSR s|2{oqyF+U'R9ȥ2rI֣mDw2 1šMe4r(PH(^,LG .FŇ{'ihލ wwh;@ vB^MgыLY)v9Onh_*iSOyPӶ?/$L٭^z<z6 ^ԅes!84W@u8*v06P֢H53ŠCRx5Nj# ˸p#[c+-aA112d#s;Lzbd|h%ZZ?b;f:#@7ٳHᩝU.fUY@>y!txƜqHeMA8*+O %~uH_]l,_= ?FxX ܕCd~vj<7jFUڊ욉z"fʰQ~Ȯbx݅uޏL#b{tie"4=sců*d@"eU{[ؐ(̾g_f$X%]`q]<6kI M*+ykw?1Eל oHGhjP %(. yUwMۣ_~]VWSg ҁ閡2Xi%mKTH")wF>v x,v?ԃ]9 #3 hM+ٌJ('The quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dog[RE;@}.ҊE\IKox4]MOl!+l\ECKgiE_|ݹɽ#IBƁQ鐺LJE`;l h/@wL1F@q(}fQVF;EFpdqȑX7Jdh 2>W"HA|#n9l[=ʇh^ i~_o#(aHQA9"t,}Sp0Q6a2Q|=,C@UE* oQcHS:MG쿮FZ&Il}Y}i;z5Ù^koq @#H HQ [č~2LRU`QGUUn(ݴәCu. !lr@$zd΃vS->B im};; {4phl"&= AbO\/gj 1+cUz>Ͻ :! ѴVa5h`PxNT)Ѓܙn'>?OϪ;, 1`ppg`̨ "HPߋ #8p&=[QF0rhɌK`}HC;+x D<`T$EH^Bgq^d1^BszmWw8-JH,_.{wsqҷgXْԨu^:K )w4('LXC8pOA q$%B,T)gBm!nCW x6 F}gQq =? %$EIJ'b p4יI.j|!@el) ?&\f60dA_SX2xOi>~ўP6KUwiy W[(b,73(L)+3.hMd-6##Q N=&F&lbZ =&>TkH 0h,gPBu"/Rk9iY.>>'JEm nL_ <%BHB\ƪj9SKcM>[Kh_"0[Y?Q{8ߛDID5^ \ ~'"NIzu@:ֻk $+}OElW IHbxt*mtKnԷC!| Qz.M7{ONs JFECU8X|H,-:,aC{-mjz.iY;Z%3owXE S#;ZXq3DF)"F_~d|RcKU2_$Q;_&^$hm 7+(a!0_vh# >Lkޘ\7;d4/?c.C:Cj$L]K+kʨPwŒEL9y˙|kOVjO3U8@vZ`~̾# @ , D(i"h`cR)k԰[]-ʍQP(G델t+ZvXp4nۑB%ݢBfFΏmMU 4~> Eӌ4vseN7Y叛)9e+3Q 炪oHaa.I5SpcUW-QJF-Lc5<8Jz) *L+:R֫7/A LDGktn(-31^Qx)7\C}h뿉[=&r! 8]^uaR3YH, ?T{F|Qj j-+2V'ܙ CH!OP8,&I?FP*A+ƇnNDk9fm(+sI,EMyr׌W8EKwBh]1FxjOEo23@ eGwyQ(uRkFMM=u;&\?pq]^L ta]zvA)%+'yx[GjkZdj9GQۧLf(T&>2l+\Ec |8 !']&%0W&!;1{I'G7Xs@tɜbʎAFtB8D]0eһ{vO7Le:̌i7L+eO,RiEJpdoid|ƞ;/8Nv!)ž)#K QX:ӲA#=ലbDУ(}~p4YOEI'? )k`!'Fˇ@cbQVjIvQ}ȟ%&R@kҘTKznUنXE1s0/ތ`Pn Aa@NɤE$VmXW.eC:xp*/*kGGN,S"9Vm70J'FMǷ1 \Fgߋ֙\g)d=t)<yВΩ=/8¶! zWjg\Yz< ͵;D}圌<%fӤp&Ґ۪D&%ԜĄ.*PxL, e*R{[OQtԇtD0aXyj UGdIRԩPLLKw i tN;FlpjnPԌM@Q.!I"bEdo~ @9H})ʫ'uMƬޮ([ҕc7vVg.%0@xd(537\oG7FjϼݟYOa]b%yŖz@ d^7;{ Rk,UUg0hw Մ&$9c\j10 n. &Ac^U7BߎdiFj:JxY'0!J6Bi6jOkj/9떎HQ%TCF+-ofž9庲3@O9vFYXI@:o9A<ۦjmbRT4$MƛvN}}] d<\%Dv`0 f&5»u|p+EӍvƶPMzbvG(M}$RUJ.mW 8X ]=#EC9\&%=dQR ;d[}}zW&Da6Z'ݭP_Zm>[!GCrK$EjsH1^0s쯉R ZC-%3[H2Z*?et%F$"Zr+N^m8ъϣTE6S6X3PDꞪUk7ԟbUclBY.-qY"\7{ZiD"dm_1oVԉ4Q2H{0E)ȌS>g;`s0>peIc=zǭ*}FEc 5:oӍ ]Y8+0Ðl@OeSIMƊ>G!`꺄҂O3SAx D1PA\.~r>&*')J :<-[NE<;D rSo§gP$}} kn3vTUfx&m4^\!ܿz !}1a;cĀgla*V٨ O ~tI#x٭i-`~ 2kLe=$*V|2` !+V] YK-ClRV^ qjn,*TP\:0+Y+ÖGxQ< TSc@놌®L]^pZΚFᏔ&:twxK,KsH< gkLNm{~zf:E޲,]]׆" Mx!R~Nͭ.>>lV&KUkzn 7ZC0i5 fIrt=[qdV>Lvkㅅڑ]8^- c@atNt+Ue /m_{LE=CDMw'Q+)xf΃ڮXQ!2 K#g} *"nhʎ9ډѕ>T/1 ^<6B(zV{8G{9ytxȔ&*-7L.y%$u^5ƻ;W7%3̄iL)1iQO#%k|rVP XRϊ~kS]J(?Z@0vS"vz -ǿ΋byYϙIC(`kf&kn"&'L' 7t~eDmoK;AɘVltч8iXc2^f '%:ՄX/=02}7CO. Z]ˉ3u)wnđA?|ݗu{kCH}IE tk[vMPFTS-N_?yЙ&)]Ġw t637_a&&JcL0[ h ߪ6H~Ҽ,@.g#ĩFqKJa; N|z|T}6SNu0Ų얳()' D:Ut?@2FGX&TQŽ!\vd;5z';̦""HEA֖Pm8 @7a;JUݐJrجoul#E͌/҄ (ud&2/s;V;MmtI|}%fiL2ݳ^~|eOجϡq6+|Z!pbT+,?QYK!GxК^7 L Xwq g^bEYւf; ڀ};玾ơ0INUJ;A|>kWS[0^B@fw5C6que>Ĭ5Ev$ڧYm3u RbZeBc|1v`EϹ.>ΌJs,@B2Î"[fGi,܁u_3)& ~yRA hM?ou=1ؙZJ(/U.20JpGl UV7W=v FR]Y@pÆuʻ&3W=A!6>p?(?͸\~`3Ѷrr% kN:/)%'|ElYz$n>.;I?6|:C͒ǟ&=Fj0w#X-34*V9I=rb3徳wg;@w~Z {Ќv& ?+Ҝb^Q%_q+}bT꽙1XbWioφ. +ܗV)brDʋ%G:/9z⫚UfrfQ8F'K^^`|,E6bLq5s%<̛VH{)[g1~|=aAAIR.{ٸws$]X=lQJTH{Lrrm2eV:$*σQ"oIl=HH8MꆌMc-,+HA~ 2%$#+- O4,SedHt%D3[gγV胱dG3 & ?R0RB`I H4z<Ùӂ[|\qpvha$rN@w8 ҵ򕼂768(2ˣ{5 +y_X)9\yekT.|2=e݀:3Xςq}68a->4R-8W?QvicjGHI օl= ?ë~>n"p'ZRp~,n!?!ްf4لe|!CU"5&k-aU0j#sύ?B6NEDG:?75r,=ruO(G5\a 랁mWQs!9O$ϓFInh֔]d\""~+kƙj{Ŷۜե4^/n!]deHoj%wEN1<[YfIe)D7N,mkÌ^yp[G-w4TpqHUz:نT/lM=ԡn(6wP4+E$iR˓y@j. V3S= i|32Er%lyHɌRFd|;-G8F`2+U2(~+9f(sExm?T-Vs0tU|4ւ'l ip.Pg,D+.. Dk+$U!cO냂Hq`7Hg}S[~4s.R$3LDlgց$4YSq{)T*ՏCVrCcX$Yw)<ؙ#v4#Q,;P m&ggI']^g~8mh׺%e{67xG&Ef9 !ޭT;v /'H @;2K=7zD`(2{lՀjccE, yRjOff ژfD_?Vo!;NL]A%Ef{k m(i$> &S%{wzs} #19u1&hV;  yWD\AɃ9ΦOLnt[T&hW}_BfҨ Jq͇#z G`Xn49YÄ@5#f6WAz (oPj1yh3{emArwXp+Oav Ywm&zv AKDHeH4))C)nQJcTWdhzFnEFR9A=DCW*PEqH}NE4[2M9e4%{ř Tͩ=aHW$r;y*7?Xu[S97yM-r99ˋ0k2U ':SFD|"y+)4څӝ{:p*ػ5Dhر, M[9jMCYH<"jdrW^HpܐYyLt#sc0G&lB9]׮z^g-\+v/.Z3/EA i }[0t$&(iYC[l 5R?~)`]8mvIt"KW7ep882.g|9kDn1A,&qqՑdP0f[>cYLGY5~ʭ^/0T_(ն-1HNuldrgŒ(#58'oǬ6DXȢ{U]敺̃mC'BwZY~,BHF  *b3t8@'c[Ӊge;?Xm%ɤKgBjv&ճF.2,׆H>JIΧ>LIln q(iWK$p6cT]2@z{\ \oJ MqZ-K=y\,hdC#JQU\[SvxAM wgi 6:0UU1WCdWfv':*rC x)f:(]A_.R{^ Ɵ_w)2=xxeksAit~W`GNn' I]ޗV`{x&7O F4$?aytgEvLhDDIZ,9E"$84;8Bߟ.Py>tw"]HjƁ&IrGJ~7zЍ^[ttYaAՉE!q w:!ESbyi_֮_Z0$̑s$μc+o8,ai yIskk~1h`1a=_4p=8w^ɺhh*_hG\Y܏{&G܈Ѕ{uBw!W˞4.!#tYB QS6/$i#$je |/Ez Y~B:yzpep+$oƊbH-8Īf NK@H|oTk&"+7+jVg4\v^Eq>?В## A3Qh]{4sm;+FkhNjIvb^N!}e5N{Ƣ"P(?߰dV9>nX/}?k47nVtZnzõ;m(޳+?N +vN"P{,0ePr2 G3\߶Rbo)f1+V*~w شyP4>A5}N yd8OiQbC7noO{ŭӲ~h0aH7Ҹ+5RZu'9IS-oh]rf\HkcVOQפ U?I*:E5,1T`!`xO,%URHMVt9&${1_JBQ:oSA\-T[ЕmCV7n[ C˃ %6OJ0[9"R ; }`ur>xtkjS`X KqUFL%I=a\:9RQ|4 BhsOxQD6A6lņҟbúzl?V[(jNI;6U܆u'Brga>/e ˲V Uz"eZ҂.. 2a,pZϊZl)EJI 32zIR;"ҾjOmp yjM69Ta*L[_̕pRk/8j:|"w f$e֧V4d)0 ~PmPz 7Q03;P6mH n867z =š\ypg.װW.rtsFks]iцnm$OV.KSnZUaMiVdpӎAO"CṮ½!6kxj{Fl3p[}޾ oFz^(W6xhe
ej<+nP:Y@R&8cؒZq*X _/PF:@տ.`CĴ[Ŧ̼ o#Eqd̓lk;n@XYi,Hb8-㋆G|_3צKc]`v lW1͞Ս.y›@nbxT] V䌽RM,]ZbqPGDzɀu d0>6qoY?< Է2m$~>T[]O0p|h )ֈͼ"d{wx<Nq5Hk{ǿXCY{fۦh]DP%*ٰL8aIC=ʺlRRS(F'&0yn m`\ҝ$V5q:H?GE%k-hom_0fңӏ1S,aq5tTbk&,CeGӄ-suJc't |jZrj[:@KnٱG`aMҫY8m/a0+\u+ , 0ZMn; DaڛXpWFۗn r5x3egżxwO;"gas8.+{*(0D|}r az cY"5lۍϭbʝ<ܙBsV wdowkYlkQr=U6{~Hg7*Mf#KT7jC׈ݓ||pҸ,Fad?u߯MWOs,Y#dXھs9Zpe >7_~i5_1dڟTY}̍EUVPC- ϲE>Yf:l\$x>֦hܪ0;_NF4#OD:Pe dCP Ws,-PnJ@B5ߪB]L?nθ0#]*t̑(Dq. rRͬ;2`amw4ھll*#`ynoȰBF[>{ dSPƷ\<.^;HS(Y -#K4Tj 3EFv;]FWv 0r)6c ޜ} TsPq599WYJW:X*HLg;jzRtH t7r4ʯ؁mp-p熰Ȧ2RHJ$鮒{Ier3cu.=6^"WI>/ⱈOFXeɗBgqz"&JfSMP,%z9%QeO=Jj 1'Qm%O$amtF oA5NϘ&6Q9=3m$f&k=B/ວ˾2hw!ɅGq2 q A!DJ~P;v?&ߴT6Kd/e|C3\UU(r1^Xɣd: *^"XUIRlp0$SS1T#\ۻog2FJt-"0q{rp𵄰} 5O{P㏿vP2\mŖ 3 v.iۛS~B(%)i-8EFjxk1eg1^[wocwS7#..ndX16 ;mlHqY?cWutĽBH*i-wON+ Q`iƻ}iQ]xs/PF{кb9ЂzS~vxߚZn!eZ*ןi=WOpqcc%me:]L}&idؑs$=2 |,Qtc%!{ɐ.#t+vb״"׹pLUerh,.wĠkx=^ \ S>eĩ3=| +Ŷch [1@?.~ gv;)^řÄ2۫|f2Z'#GetX:G"~36YgV褏SfPo9șlJ (f^2.S )\B0+c:f? +eV7]]}yt"hIJӺd|  rFH=[<:`McvZ(|v2}!Ӯ5}ۂLZ&k5KM;Tg<ӌ,ls ƫžW5Ëd3- #˺É=%}4yILcKQ|uQJp$oPJ|Qʗ2_-fڗϐSUU%< UN4KeZM^,iJ@4O@܂]2Ag`XDkQ{HY: .q\%IPġi! oH mCHɉqX8]F l4Yv)'\J!'ߝ ^zzG>l 8l9Y}-gE?]lܓoZ\۞z]G#VD #K쀽|J8r%Ӭ ,#m4(Â;RF|8kG'H m*KyK}Ý>唘FXP)ok1JA3L*Ɛ A!QwSU.<{+ip6H\vjY}106~dƙ;qu,#TdM2'~vPpKf5bS#ZT=)sk+C:5h㛴m21ۆ|oee}(_"[]j("I`!>]"g1Zܶ鷛G3FHn@龗鳗} \J/;=gMTt̪qRy9̈́ UF"sG `n#d6f[eGtkQf&M/sQsVN*:ٞ~hO[B6oZ7݌ %c'm4jmq;@o^P?쩥3#j>4u݅}*wu:PER?k%WG]gZY3BZzˁm>R~l'V˿TApwE=/(w=fZ(3jhANj޺5!z| icG`ݻ""CIgsԱeඅ,V".L+|]d;!+@kjzҔږ$M ՜#O[yOp􉉴(B޽>_?$;?&e\/ $#m`5anEJl8pbƬ8fӟؿ$1HBg|Y_G:4/(vnj f3UE}c0SJ#m`6rmn"VϬjJ?!㙜 gCϟjwӌ?#C̶WPt `<$M>qGUkw%|y@"OM3Q,eTmL$~6oNMN([[p#E(Gz:wx`: AέEwaPNdz>$S~_x ĉG屁#)um߶/w72DĎvxA}b n Y[:=׎"4\UJߖ;587{(^,H(ov`Nɔ{O?L͢a{i_94 ~JGclPx\n; ;oC; nE8A$,f * owd13ib,e|a k\\Lq,M?ܺ}dΩ e+`lrb|X<R%rԁh=h5Ѡxpߞa!/yID,1~6A]Ƿ1Z7ĊF#P:Q4n2/"rI]~΋lk!wo=YƇ|"HCfEm .k{ˀ# $$mu_P%Bxh۳>UxdV#XjǑ51[r4pgLra0u =^|={ױ95oc KUYR#ZE.g}P S|G:$u=íj2k)T\ $ugm!Swsk'%Sϳ$^|!KgMeʽ8RiۊR-n eZ9O?(%$ciP̒D_qxoүUqo| ԣaV47ɻC: 9a|:[!Q( (:#f_:;xu|]Z2XЈqv【Z2߰ c. |\W iv0c(0_+]<=` Z,EyaM\-4ܥYR*@ۗ_G]_QhUL{I;:I˴@owe5WLҝYް8WR z*N6T[oY#UnGTFnPӁʌ,D=ķKi; >RWLحBtT޹ܵk&FctQ ɼw(ue>XT0@S`w\>%Yɕ8k-{sAi15 V%)טC~hRyXy{$<5ʛ%7RY( ªx|gV8e$b+M)˚3xwF*X`!rs,5k>ϏZXW~%ѻ~>!\̾ F+xRrOFJʐ0 $%$D%?&0P>aqQwkj(A2-q;s^qXDvd0^ ݆# qO_3X5F3÷̰|<|[آÚprgptA+@W׍+yc)&5cmsޥp 0<_ULs)鸻'+3nK!%JP =T2qMh ,ۈP2b= =pP p*W3RI۳f`dsUɐbxn'3W?8g9 ;`eiR(;uEt%6 F9z+׀%ǪO=O*o0|6,ØY=yl%)6vZHmI78Q1qzE#d#bN\>?=.FލlߐݞMNTU/8ZP /LGU [lR;| As~.Qj%}  Sa~X[4{" B[)ĝZؚ 3_TҬmf?ݴdԝ@ p*R0GvFh}xld9NOQ#N| :!1.{Ϗa)Pb7j ]e33í8f.ߑCb}YMEk嬲,ȷB#wtLR6 L]5xpMlX_ؘilQ`Xꊦ@VER|+]%]X{ccs֏uGh266h&J0V*"-M6Q:YM2:M3m̳ﯣ?pxH1( 85 ͗~|{6/%!|HR%`_H)z ,z3[/shgъpO]'JbZo[1{ffɾt>sjpYQ,J'E+@7`=l㒐]peyOӲ!qX$ 1Z#ZW0.}Iמ9cIb- w@X9Hv_+z[R99+d$9J]];Xjl3Pj#XVWUχ;eɑ̣Oo#KUavMh6*-}hå,qɀ)>#'Ts?h٥Q0KAbaIw=gz&k2.jKzHm={1]%U*$3< =*= rߢzRw?~gd3M0{I8$* ?zM1m#c$gGu&ZީHWk%Owm }{]FC߶sҠsl٤Hτ0%c<: ɓSa;;od>(V<FA'< O?=7}Ӎ#&pC`̓\??~?y=BCR;IUx@SJr-,*Ga\iq{G [inuD?+glQ&|@.*ha&WaᲄE- Z@'~w_L+8e3N4 *ƭQ] b7+FpR*,U`)&pgQ.BuM߽0X6z) )],wj{Z{Do8bҡ!/D "s(xE!ȥ*_]-H^lau?lJxuR=|1+GpCZs¬{ϭcMҒ!;+&1EyY&BR[W]LD+ V*2q$%~j_5_N@kݞ/^MdsάjBV3x5`^W*LDB(,mTi-64)0lz._n'}VdcaW#B&QxNpD.yAuσb m7/_EEv.xbdC [35L!mNu|Z2T`?q}f`I9GI4ɔk$42YlBEE V^-/_Cv%0x7i.IZnuy6#0t wJP}٠V֣$b,Bu-;iXRXmz(om 0Fw~elkN֭)7C2ϽƤWP Ǟ챧LI\CV곏}-*A8DC gGO?|c5[WLh7z-BtZ@&$^at#n\}"fN9|eM0Ml 4UEd=v:[8Эgval:Jfy> M!OljJqL.'F_KOcκ㷍T)J6U~W\Fc3j]Mnqf7)6K=PQY&Sgaf/F=XgFaF+5ME+Q_"\T][‰#{] bcjr0}y`?JML!>Sk>PSh -A_2醡~yB?3TfWJ$ywڇ#3J_VmJ YN^O*<ݮ (-Bz ȅҽIiâK gp#)WNxlZdM3}~(\+7w$"6&5Y5+^7ֿp g&vA¤ mtXw=^^?rIRp"& S+Owo2yhbgQHOB8a[=[iLPh_u!$z9ʏŒFZmNj13&4.P)h3sx儬Ԙ^L dZq~GjGuȥ{8,̔U,Q@GWn&-82kpӘ(@pRln bxXwE1:9ϤrJG0" XZ;_C t{gX)ظyGhƥOlfτOkOy|Y-ff|="t3O!As#Lt>MCܮ?Rx{*CEL$q^b3ǧH4~{tsc gOq=F0s»I^,0T]ǘa,-i'[*˼4tJˠV5 \myt@q后XkM #i-/؜S5qhpe;bSDر`Wgo sAtUP1ܜ *<ϢqiqzR޽td@mc֜"o9`ջ@ 2VOK s]B`HI壮{qf@ 9\xPS#[I ŃKs{|9}Z%~m`uAy)ep-^3"ʱ6C I7JiȤ}Nj5g٣: 2P%xLZ[y|aȓ4P)-^BM\Dmٝ8 %`?nVю~V\#n+9zd/5 WKJceO7,髎/80I xVtn96Su>z<6sey`91UD,MxñK?݌:[%3/knC^zgS;{k^F <.G!\,N70w=},OŒҕ~`oYNTn |_`3 DӌiKEe2ACX(̄ni¸anA})I Bh7 iFewp#$og]DM5n!SFbt, iDkJ>Esd 7X *.VOgg=\_d6%2ΦRS CP&\&C ȩE;(Ie.{0~@jRȏU5GI#2IB6Y>J;~ IS O][u^[UXJ78 \պ'7$;H@ivWoAT;zIx,& חǯdPMgw)RG- 1{s+ ؗ/ZM~x_~Fh=~ofjԕ$[-\BAMuQe]:DQOK8̺fQC BH?GH$2?ϳy_,íP>X9Dh['ѣCs'=I~QueZeTv^xp0S\LZR7Sbõ1I?'ƥ=E\*zX(n hsܘIҲw F˶M%G3[P>S5d}noJFިMע4D?Z) (I;A"˶:_R 0Mx/*]4 OF>%eamYsRPRI,Y6d}CƊi+n;x=N}0$C[ӥ<9dEk(/Wk(if1@KK8䓽5| DLm3Ahft&gCMIRyL{o[+>sQspW`DWO5"x2Pԃ[{0P% v.,556HiI6j"?L6;vT^{Ănp@|Uq ;Y@3y Xq53U) ]vcjQT>cF|aBˢlmhڤ _tWnrU/#JQRXyRZWw|~}xWWT"@5@n6s?; MiQ WPdfZvGElrڻxmEuJD7j]yhɄ'J+?4u Cqz;' /$`uK5#XpGrsaQ veori.vj]/-ZWjԼ0B_uiO 7{s_iY RIax̑*Ga4ad\y'~WOzTS'Ⱦ ?^w0~|%Nѕ|\j{wܩ2l`XZ5ThgS􅒲D,Ҽ;IC̞#&3[ȅ/S|//!STEDfRwHEeO3ix;G0bɎS~̭-?3 {.o q[aY[ mnXH(V<Sõvb ҥe*^j})5Cg1:uzɩ=+P"H׫4` ot\aSߕĝ\qiY!K Yi(M-nNy<7 nǰrCm z`,RXe%[r\O[u_,"O+ʴxt sm,$.A_E>K &+xa"EYLFZ]NԮbk*\G52#J#:Cfw(Kx%[PN bGJBǭ!|Y..ˉ8l~%5ʨ$`quU,pqT>ov7M]t\%U/eȉK'݅9,j= fr୺L :T!tLM{]%^;؏ RIQ:νfR2co1fk 6UַfS}dHR~Zo!^_fCLCڳOm=쬤u$aĉ9M !߻A鄩j^lSf +ltPfonG)<}{6#yW;u'~3wm%Y.Yp%?3ؠBX='{C&nH`s#?"lgJ)]i$!`# M&iPQX)$3CqWo<0{5Mmfͺ QdU0*ߖp\1]j=D/vߠZ{gt+Llv A^?+قZ8Qdm":J&2A #L { ߌ5|)*HGJ(s5&UxFkIR5ZРk#Ajt + |N?ڹ(b>lQ fS#a0S*TZ3K*KUSP}^d#k:jU0u~[2>9[̻[w[ܒ#ժlYZTi)wij#)ZQb= ݌$\RM N;qW (Nt;Om)F1=WkR4!y c9) WX%5eA0\Z;'o]3VQ<+( gEq#8P3F'G9 gIQ'$F(mH_`.)/xޚJ(G,LD`^ĿyFgԢ! :fg9/8ˍI(5AzN1 ݫeڊMr>j=R{Y 3[/Q"|* !@DM|sr-e =:$(=!8v bP +(&Mk0^KxGFLqٔk P*XycztC߀ZNv1.ٕ3^:m "⢒mz*$xD"Uyf>\ͥKVG!*8F~DZ࣐ [1pTI@w nj zs|bo~މgwFD@ecpzv\ KP'9t4eethN3-x$5hȂySUcOPԂPxw o+Q-I2 2ڟ6IL8ZkbF*4Rw8W,t j}hqX#dl :p\17v91i;1PA>~Y,AlG*ZgJ{/->pA ÂT,k.NUq̻}}5` \#)00%rkR&8ofʚӘldz9&%gj)Vu"ٕ/'[{ :nOd S[CUeڐwI"~AH[Aģ/BOPgNf& '[{=f^v;9rêPIc'8zm ΊN屫@m. iFM렋|-XOfJÝ,%k|5MMpKn^n 3Ĺ3"ǨdwzlMDZ-5'$!$ ZpDo&8r_n HALGk :DPg'a(m^! 8'wla K03Зj\I0VyZAkKd_2t b ]JOwT1a,ZN@x" uѾytmw8PAy_t4q@&ZBk6+U%gg4}_:pft>Mse}_ŕIUwz onF%<*"U(C;%ꕵr6:/jwqέT{eϵ+!Q"&~a }: ԨCa(ת%6piXCTǺ jv/ozÍ[{yeо6sE^YTu ˍQ}/ѵ|d;դ}jA":kB$IN3#NL*[`_oOg-;[rVM(Zu(a2,w LJ+ [ŬzYNr0PjYC}1RM' vp}q]=HDjEa:S'Wi 3>KF@zwHU d+!X;ַ_4>6\'L ׹i١䔞{INXȧdE5๛O o 7uhܧ הnGP]:Lvqvʯ;WVI{au. l F8k"ff|VRj eos*'Tlt[ U)vvuSiT!0N b.d4|Hj6C&.w4tr 9a| 쯃IMS/G7([/ޛ =.RF4ՁfUNP),?@5qt{7e&LjuNdPg+^كtfW y&(r{GbhA 80#[{F.Y9ؠvĦϺ=л;SoRJӎuqD)&00؀ɂ!Oa'!ݼ[;{ݻYiL cE=ȟL4W7d}1ҿV.jvU̸LIxY-R:?K2j)fBz%3&[Lf "wɠiT&PVZ`=GpO#` ,ϊm  <(Һ>ufM21v LkG>螃5_:Pva 1n&c+U|'Պ1v<VwZY}laC;wt FﺙY6o,MOgJ'Z2[}75_މ8۲ta$NhW5Yh?Ͼ7*Ag5A4'qSpv]HEL0HR`jNo^+烪?EABCؓIؙ2 *q*$X/uv xwY eԞW3 )dz0*F=It]mtc(G4t!hZ\Z{%_ȏ,D6cJD!$T o'd~;ҢvrE'&]Mh qocFVm4rCчABGJPco0vz[c1G9OuyjѢ0+*`6܆~hR026kĭp2਩'ζXIu7 6 YD_=JˆiM+N^6 kCuG۽ue5Eh-N_c=wHV1#T'##0Pwf ;.]#WmAc^ F)73_gȸs[:~eWePR"Mo" + HF]; OÈEke̵,0.~hķ1pd& 3-t!]X54.HOr';(cyj¨%ZPiÍ?U3*g܎ИT2d&ȅFpDqRZj8IyR5X(r-+5Y-#YE22+KYce|ڑ)ހtFؓ|yԳ5z495lօ`'l4 Aâ" /nVUPF Mul΋,'J8x[\VΔ۸;bêƳK55^i# tkӫq<>[r*Q_Z<qg -9ayi͑br: .x8D_(.8A4.)lxq1$2W@c$)O~nMWiLfBF`Y?;fezb')r<ǫ?9v&GiLOS3l1oFQhݦBۘM0^bȊ Мpj* [,yJ> S$q1Eb#k8`Io,rL'MP:6,0$ox1`Obrcq3 P U5{:8AuY dM^=kcyAG9n8^5N$tW\CQ1ɩiAn1kpC,Z8՚zz2W,V|SX{@n>b^]yv{lDYӁLqs/N. f#P BYVvr?^Ir , }3鮽$_Z95mq{l-4VN:ȱ5/R&HH4Zc& ʡ -R`wkm iG-'r Dߕ$?XO\G^pXݯMD`m3} ?ln#TFb|P@p6RH7Pg7}8LM4\l󷠄,x`P[<qy벫nls%n߁/^nDVm{>1 K3]Jq##W00GXkzBXSk@ ן =f"# dl*W5p-z@aeۛZC)WDOݿogȗ F*5.3퇌R2<v Sa))1-u5{2N!\Kr?s;-qWUc+4z%mƧȱď^:4ayM'[VuwuZ^Ȉi x ͟,_^6JN0brw`ӂ\Fz@OGB>¯0RU|P%"=,o& BR3(=k7Dsf9ś?뒍?meS= 5oB#{1sm#E @ tYFjҠ?<\iIv[*n=Mxd}&A.[A mP*rKΚkzv E,h1WDkĸNGVu^wleZϲ\죛kZ>pwE{ZLC7/o ^?`o>tXՄ?ٕy̯߳+@?_{>BMʦ »W% U07)Z%s8`y ^dЗ 8[g|75?K@o"> EMkWv_) }6NX\ϕncsbX6GJtƉi_<}_6E#ƒ!lc Dш]'ngt%%%c@2rsI͉s$X߾1%@*'}Y HpW"$AjXqY}{gtZ*+֕m0މ &ìK!U\Zd:@'[v0^GNB37W(g)s'^g/[KG$ARZT:տ$p‰bHW6~7rH_k>@_[9[`%He%B}mi3d&>nScPlÎEbϰu!CH^;*ӄj;}ф#N;80v 7'PyNIg< +< tEwӽùBvdPI(^Z,>A~Rj?o $B4e!hO ,gZ;*OmXHTg 6L c  sĚ|C-&M k,ٚHKb GPa{rŗ##mXeNgL=Vˤs"?*{ BxpT/K :m띠rTN' }鐝J"'XIW~ļƋnߢs1#& vݯ@yz`Enh+vkfZkR VOF)G^&g4nQhTB{s `E 3p:&Ɨĕ=uW\qg5!=5犬7|#e8:o^Wlr>TvJN@^HeP "u&~O]dX{ ̉hq6 E@vieV6+{6O6TFX-XEߪz𣣟*w־ O=4tΰ\q0WkR;w#*E1*tY5(;$7UBrMfeycd{[!1cKՓVUU:J<R~mp}PYBʐ:8SVI8J26:yGiu@vh21u$!W\%ʞ"?hE`ـvvN+v|s,.tܠ OL+-nX8<=pV耋I4 .wrHZ$U}T!0$*[dXl"m=1Yue] 'hp0-Eךhs?NH^b 6CJ$foOicC DǮ7&"|XJUf㻕և_οޞ~>V]9$)Ȍ2y ujXd/׶ C}s0T+͋*I͹b}Qu}FS/`a9 0"ac 2dYjN#nӒn*s"'eAIѥU[6Vc"7GEL<$+ѡ8WZ4Ls"m)Z"5Y֖2A.|6{oӸTzo0RIwhLgJ[ۮֱ/xshfb^7a梡ODp#3f"bCN˽WDoaڨMk˳8*LSp#;ީJ0̨W̰eueU?115~h+LS/ix<§gk 7 a<󀙔bB>9 ҭiY,Tdv&pp./eH݀.؆VRa 2 Fe˥}Ypxz02Hy-b&/'y $dʘ40"z8.:I|B3Q$ k3+Dϝ(SZ$Ff  S[m\"[4ԙ5a ~XTڝE,',uTDzh33]{_`h!BH#!+:xȚޯ;$(h&xjt^?o&2~2c||(Va#=NUǣ~%yiJ(a8꡾ŗU${T /k%n0.oN͏zΝvf4}H=tڻF)U=S“1"we0v= }&uBڷ8ۨV;%b; *ͯh$9owy1z]1RZ3:ѾxJl"k`8kz"J$`'W_dblC8Xw%3TRp^ T EŃ[B|ڂ~ͅҲr6m ]NS gTmk1% 洔k9Y$iҲR! _>w( =# QQZpTCAռj{I:~H;D&D|q9sI*{v,_6P`s5븚^ }/# } YHKb͊916JBÝ':QfojvTvJǾNfDJi'vTv У8ªbмh/ ?s@tYSMOkJOgMNY$Oɩ]}ew}Yح]UrXCaTP mfVk3 c>0dZ^F|5/o{!H'k3CY~>nF/0zJXIFc[}|U][i_$ ?vqG4\]QWY22 X𑕖}ͻaYRa!`-TtvlAp.Gа6x^"wxkT^֜bN:`OM[(c/2AE:r!̓ʧBDzAѻͦK|'gLou?~e*pVAC^a 94o8wi:b[e$N61t! o&s }hfn`&|lPVN W2z_.*`BA ̆8K~:̓sﲼ 6~F<,]Zh݋yI>ũ@zW$҆^yFƶ >WJc.n=)7V3g;5'P:-o`s6t="-d!Y cVr3>`xD cu=E I#>#K여j/gfeWnȚ29cݽ;O/9z6t_7;m0BU[xƐXlutM(Q[8\ &#08@b0n-=Ŵ]Lb~h.ХP7IvRNL/?'T=InI:__`ÀtT3~FL1 %ѱrE&v_O]T'܎'rFk!;XsU ٨!'( ?/ hPH+=[Հ8@}QO>`*eiBM`UR3KdSqT@n&AFHKW+Qd2|Փ(|:sGOi2΀ZE$/k4碊K\(`c!nN|GaL:[u1Z'ꅀ윢π#.x9VHtȄ[DGGyLJEOx! cH%\;?_㕗sou-w10pdsnABNCubFqJnyc`Ӝ(=4}̨¬.ď)TqR!ai5}l8h[͆z:5YntG$R 1:>qHH˯57Vrwhl<! -5|>}Mx_ON aީ S5ӲNy3v{)Y) KI)gpMuoޚYQA-Cߔ %O0]F aH/@N&;Y׹7Pر%,&j*M3ő8qE0$}Կh&DQǡo%%j0Kqnۂ(}! 䀎r6lKMiK[@5#w\G2*>00:WY+҃XBң3ryb.˰0V{e6T.[.΃y6O<[5aX$k>AVϜve]CnL50b茮T6’BN'f*vWV+xy!imchHyIv Ci% V٠} zc>:?{[,)ď@(OEvT{!1tbYP$kDn;Rփ|EAQ+@)渳91i^A?-}V&zdLo\)v _ipI[tAmVҡetW.I+scCw{\/3\^}:-|,w ^ᗫ۬Wk~E!'J=-3>†r6>:%E);xνIJU's S$3V:w™Sr6C?o /V1S;>0x,~OԌ%Ԥ6iIC-')"\5X_v GkڙDE}{}&5چ{jZe׆ SSp] 0r,`n%tAٕJ4F?>yBM 9_"yr`rn쬃%`E{&,^$|$J_IǃܫKpۨW{HKA2>n Oi"!#B4jSOj`4y!5׬}l Me׼ĺY7x4Wt=}>wޚ=Ek^T<"T:~ǃЗ_,((V+w2Hd\z25Q!>}Ȏl{N7 7'4wPڵA$Su4lx}(m)͊`E|t18 w\Xz,ZBK#ĆqGlB'C_>}Y>H+ΌAJ<|Mw] i#Vֻ c_7}Ufo}!{@j}Y_7tV8] PβәɆG-6W?ohUJ r2 TE*e$fsŠD$Ͽhv] lgfp3  K-l#YBs vc3e`=P#3CG ~y|Wh)ϿUbRQ/Ʌmۑb[?eם8e[pT35;Wŀ',ɰsVtB9,Qc&lAvM<+^Vj8geqzCCL[1.ǣm7׭p-˚{i(ߏus"s`ze\ 2NU;ha7/JZ{:Y;mm% f]"?9 )Vᡜ`wcl Y\2nɕV(ŀ]a3z3&y3+|tn%Bbf(;[_@fw0v5sᬳ: -Dx~d]``Ud'0y=f7ZkNh[o<nUP% 8e!>Mב 4ɆhL}X IlPޛR Rzƴ״-=J}?/5-UlPb-N*{L=2> \"Ѣԁam YNni~[n}paFQM8L} l#6h "|P}݃cge:sB|)m{~X%"%=^jw'8Uޙ1"oQT܃-Gg77Շ9;JE%ڶP0MâW1C4X=sJX",g )GOȈsGgOXOɭnCc6roJȼ3H|L5Ϭ+ߙ/O[u1b]p`vv7맺{YC&(`84 &šfSR s|2{oqyF+U'R9ȥ2rI֣mDw2 1šMe4r(PH(^,LG .FŇ{'ihލ wwh;@ vB^MgыLY)v9Onh_*iSOyPӶ?/$L٭^z<z6 ^ԅes!84W@u8*v06P֢H53ŠCRx5Nj# ˸p#[c+-aA112d#s;Lzbd|h%ZZ?b;f:#@7ٳHᩝU.fUY@>y!txƜqHeMA8*+O %~uH_]l,_= ?FxX ܕCd~vj<7jFUڊ욉z"fʰQ~Ȯbx݅uޏL#b{tie"4=sců*d@"eU{[ؐ(̾g_f$X%]`q]<6kI M*+ykw?1Eל oHGhjP %(. yUwMۣ_~]VWSg ҁ閡2Xi%mKTH")wF>v x,v?ԃ]9 #3 hM+ٌJ('brotli-3.4.0/testdata/compressed_repeated.compressed000064400000000000000000001421731046102023000210470ustar 00000000000000[_3QW炍$jccH*{VD$,Z`cl ae@PB-ƩZAGXfѕEiD{!6?϶,--O|:%> RLJ8_5ඁp_a r(5V kVXs0qH`2@IB`knW'/n;A}'| Ѓ9xӷFE&0i z"'S$rYUJu`Pd3dR}P*H$(W4U~Ӫ,o$yl,cΜ׳pXD@ ؄PD"HDzhޙ-KObDWR4SWTޤmYάq}KF$AuJ'J3ٜ vSF:_Z?.J$y-( A> bqH!'=<慍: 4Z7/:za̡n1nλTͫ}K'ZlQ{+6c0XSonGT9Xɴ |$㏖ྡf4pHp47~8ځ+#V؏~%A +t@#ІWD .cp8Y@6}yȔ.Io]y1HP!:0s3aMu˲UwOvGp@FvZj7׈ L\ Xvջ{LrIdIX# BrFjqN !$-iS͡l>.G5(CCY%-NPIc5WtH _"}Ai%4tH`Yϔ< SGܘޏpCp!KT4 #f1[oE$4ъNקS=CH'GJ!aV`v],!,IgdJ3l&j@lĢf[dMKAYb#V hl2̀@!`7LbT! Ŀ Iu*#pdTIOQ-/&">-AT'qAŨ{H"$-cFA@hwu-8D[z_l@yx, oK9Xʛn9r1^@g6$ĸ˛Rtgv:hP?8BهDCD(E$k( CNY%94K,.v[} -ĴU)#h/gR.r@XPl֔j\4畇"@7;\A\BNT4•,%ò)"x7B%C1`bh2S8g8/|l[SH@b-WEtRώ.k0jbg+zfk| 82a#F N#P}N +NI& 97jЂ%CSNZg8}~} 1TXq8$O9ޚQ){3s|'HKɶD\H=t0gC7)o2 ոEW톋q!ݚd8*ԟ`6G`P ţ S )_ΫAe@qF-)B^Uf[FB&)- k'^yzK4,&s6&`'Z c|i~'["8e0m2RyӽUTXpy̚r;+xs`N"}-5϶EU-By,ÇYeKᛆCD\aq(Șt^2]cȪ9Ϧ4f.CV܁ ;J9\Jo^݆0z 4ÕdUv(m6V-XTW4Nc,zKʓA=kZ9iRZf +vK/ޣ`>f\Slg:F񍴸;E]$v @As5Sbn>DДNWCQ"ZڦMfR#o YCĬ+D W+![ Wx .*B 뱓{YC. 3tN@MEt:XQEv/@?ňM`l|mNhJed(@FݞY6wDDU^JwEQJuN"KǭsYqҍk ^+ؒHuY3tl'&o:(Z[:?2;̴z,W.19X@U!kcʱ)+~5n*;ᘄF%&?%&eR%;A#Fd>¨D$_ar.r1Ëse0-C[v[yg,81\?ʛdy4Q}o:s8o6/4iᦇ?{~r)XRX-N &SJp;o >trA0O+j1PZ8ĊtH/8=VΥz{2 ajH#4M/}fl7'w#6ٖ?oYa;_eYR57 e>)5V(:rl"=4ru63oqRe.zo3u+uSo߷#Ą}wp}2+Q3ƲKڬ(UK{w 0jPkW;|3ʑDII@"awۢwZFDem5{!vLX)Xs&C=qJD5Bmk Bo8F.W`mVD(ʇJct щqQg)ٔPg͈7?ycF-!س0yPpMv~;E?gO{5%`){:K.1E]%CfcR˯sIX1}ъ<(7xig]{G7[;eF#ĿѳaHdP"ϥs_]P7o:֮Jۮl$$(e ZՙD#UxPdaˁ| >e*0ũ)j;18^CTTu^t TЖڂs@91,eڂ} uNwk ◣Ab٩V.ˊ=³"fo-5,Cel#Ă|à$R}@ZnD :hi2Z(ǥ( t`֌Omμ|/n!oGX:5 "76UT<8w{(R=_(_''S^HTZ.xS net~bߋ1P#Z6<,%QP7l C]qzo?hX{Qn}!:XTegj?|!+oeI 6ޏ^YI1Mi[l1u\Hj ',/EjMTO˵2IYm *@=͉@&+x2n\.9̜{w@%ʪYJخ!#=Z 9SxCqӐYů|K &?Pb`fY0G`)D܎a#XH֗{-'=M&QRX&G=4Y\'\w&Ɠb+̧"RM|lJ`]a\?.?/-6γ S0mѐ㗊 `f}iӊ)pIȨӾV SLQ8`" N09`2NŢ1%t`%9;!Sҙ}]h}r1̛#)@ >(_ˡ,-8D&XwGWR]?H\OND܀فNAl^lD@¹5s ~dyr3h c3 uP ۙPoHG yP@2y56IdHWr))7T~}?½`}R4iG_bq ή;\[ӎ ż%p~}a[xT1X瓡y2=Rj^~-NW\āwY wa0L"o`DE=[ҮAN į ஜt云|&Ӭ|5X>PK ǿJdIxv/]^7ZTUF林U窆ǡ,T,\ȁ^еX;_&K<o ]>3hx~EZhIfP1sI \VQ a =[bZm2mbPfCYYYsL_6ǕS96*g"ɷPR 9ĮS1Q S,y2]Q'1d"?ޭQЏѲk~&?vƒ&y)q`Ⱦfp^_TڃB89;%e>~-`J jo5uiy.@ ,C"#*v.Ƴ8AC[/mS*^aˍTn-efƹ TʫR fOOZO1R-3AkZԤp|\ ' aֲ:ʸ+=!pB nǣT'=mkfrPШ_({:FhMsO.?y\^SJ2-җQׁl@V\ 8}rC:"RԼl tEqA=:m;!OJd@><5 x #Ø'E̠"R5 "`xk06bδz'8߈,=;sg~;V.gר[jx0J6qiIn'$dR'*y/za4y5^x3w. 'դ9 00wHd81_FP}ȅ'}mԣ? qWgw6t6KNG J_ KeBJStHLLaAG:>nrW,Sbythw!,c4j֛Ap V'iuDͶ\G!iI,L\Ў[Vd:MJB-]0)xqu ]2BSw?KNSkXC (_} ?Y.Ջز`$E N23 J/$ۘoΝ]vE4,$`dRQ ê"6f5@#4Jq(Cg0KnXALexC\QW!} a6J|B!-Y[Px[Z(?S`**mH(TMn!rUg {ap$EZe L:WWDP e1n1 01R ٬(w$ج)+2@GCKI`۴]1"{RAi`2L8#~U%8\ߞLƤm)PSӃrkijSPbh Jz ЫM-L |+22 ssS2 ܂ +Iu'~Rx1  (٪ШKT* );%d'>6m" =lڊDn^LMSAgDm=|Aa+@~SD\iZ~x8 ,tX^H!aD %%tcEiF9VOg'e dT'&ȘpRS@PVnŐBdv+=R&r"E x{~7 לﮓ0*4#9+% &1P asTBR̮DL5wGlѢp [[]yxInP*L{ sQ T* _ 4,!|BZ}} sK5-o uBYːGVT!N2|]fJ;\8?-u3 /?$C <˼jFZZ& Lu?jRN2ddyVlU 1gDQi _9c@m[~fg}˄9+'KU]tTiGP~}ZeB Rg.4Li0a%Pxnt`F_gS^-,,6. JԒT8gQ9;qԏj 7Tdalg_rUfUHd! m"[Ԝ+ ŚveL,b7iǶؔJ5`Nqk{ټJ#%ľ y" 'pPK-'นe2d7Rq %ŅoD>-wX2AŅZ߻^8X2X[X) BS@~ sGm9`Ś8缠Dd_k$NJDgkX7kDXt jZ-T0x\~z(d~qYQ4O lND4$/.ݎl1\sVw0qS%k,a~n5Nf$/W['[UwDO$NNxWƫ#nM5UT3 {U+XSGLđTՁɭ=F -\l u3jWN>;rEnD댓'l?$93լ U]vTFjI3mzI!)ew3)@>A\@UCqY h 6 b3!'[ {8Р筝e`cϏ,oOkҝdvL=uIMIMw>߷h w)nvU;VQ\&xӽ)@rsA|`cfG8k7$"2Γ G~d&ݯa[_6o!OtLF2<.|<*ǯOQi eSskem*IkF@ߧ\_ O&RE+qi;`q=>8nWb//6\(sGey2Ժw^hN;Mat^ G`+QpvwnA)xu[Dt;Vn^dbCP |ԱXv _$vi`0HsΗZ GKFNŝg" _G2 tS\HoZ̃MˢL:hCA?뢶/tlI{ɼ71@2|#;C (߸WI#Ѹֈh:qft+ .AJ^!q\FW̅ٛ}WvQr.gMҰ}9u몏/ Bĉ澮"ufWq  Ɠ'Yk#zX`䩅 >WVœ,]_4jľ<ީ"*nF"3ӛ3m ;Whuܬ&Mm4SJ)zaڇn-piHv5sj㿟nc H/"SAP%҉s[2fB Z<)[!$ IXKSa 4 Q]MX*sڨwG /\ Hp5 =& ]gxsV }s&}4,ϕb m6ߨh/t l f%Xw0={PnTԔ&lx8YcpwDiV!c9-mߝ9HZwU ,GV,/64sPtcj~Usmմ5 _Ce)Z0}#WH 23\ 2 ;++d퓼S *By{ [FWW`xo0u?ff ut}0O;`u#*״ͼ[gvŀ{S2J3K2ft3x]+0la!RqnehOO39 Ѝm͆<*vrleY(-x=1" 8[>rXi<a:++'J(~..=,2\G{= tg!LRz+輓Ew le•^S I@ۧcb@ rBU]Tc_QOuC)Sʪq^FnW@ϏMn!6\״-h[xs"eNrén-/:lVmd?C?@jrwþ_"cV#f[s৘H 7-g^lsr&-Nzϡ$]%Ym ?$9;蠋.[Yg?{ޞMB'+?mbp']9(alcS<9ls2b>kƭs7ƾDuԂnXk?s$&XY1jMW|'w5RDnb0R;Dl~L{[8I?.R|1r [»< 8.j'§ j+"Pږ&sqwK̲񗮧\K+/֠x|[U42xti Yc~5/HkPnDn2i9뮗7 p=gBpؤS?ni)5QW'{c+TL ؀ rx2d>%n AVzGcTz1HJ +f\Yсwtv 0"q HuZj}J bg㘡`.fʂFϩ <ՠD4V;a5M zbӘzo|xqe0NcoS8_Q/_Ut˰ 6-Z\ mo M"{GZB&G@Er! BR r# 'k0c 1!.-{Q%J;kgm y]3TeZ8%.q^D>dCKmO,Ac?evʋ}-;)uJqog1L USv&#i=O^XKY5!"ˬ:mC]-eGyM #5y1M~O{"wŖ{g<6뗜=3aǗ@NypݝݘqgAR)*vx̫=tٟzΔP ;V hY^)~d[tW`'\TN[RgV龃FlY}idƯf mwZy m LۖȘQ:37`-JPgY 2hktzDAOT鋸mVunbtFR aA_ "OIls V,3 #@j.&UE%68p1`/~4UF> gq Pz i{cIi]5^ N aѼRv TAZOVv{7x u,ȍ$sXa!VV8H%37ߔ'39;Ex F^"D5}^faF('5[$ܫUne1`Y h z4H3Ѣ  dܨ:{x,?-jZM7}iXT1C1ʸ(2[@/HW/%Ɣ+$5F*?$E' T&.=]pw!n>yflD(pe|?;(G)\!8V{#X> ,S繱o7oQP7̝̳}Dwsd.z{#Fŷ:rH+*i,֚Bh: !KW4ۛ!_'fd&{ .t^}x"ŊFYYK5ܴci{e?!6bS솤(W:*c/`6]y|jlwpXuG2Dp{-+K֬ q%w{ć잕IhG1ŔHbiT3PQ7*^}E;Q, S)enc,lz7ey'o͌T>MhC 3,P;H&9\pDh fp F.SN̈ה!Jx3qR{pIKZ֬J=L:sy Nw^4f{';)]{C5{ vۥ?:gyEcp!$+h\ӼIc;V4mptI$V8ao~4Hv`3ܷc;?{"sq]M4Q`2[І3֔Y_Ьbg@AVo/\m{~es1v2o#;g-%9cѨݜ(VEm'opׂ˘MJi{ #2bir 7n^,45CX!,6/w#[m~ L`\+lС0&l*TQ nV-EsvG?Y3ɟdbUUbT6T7s#^?rه8ˤ4X}_yàS> ; q {dJH59votS7hö#o_8dI%R=2ڪYx7o!NP[kooPҒ[<;|=<o!pO*zslO[Y r) *q)0D4n/UiɩU*K\@/ZfCm])K/^_8 F⌝.]/H͛ZpX+fڵ0ۉ&߉H^]vr'Q΋g@#$.w톩;RRf}}#m$&2$oM^ú:l?rx5mXZp&x2(*2;l 헓O ?>W&#cǤ^W3g]w }w iBm ZH{ &hdƞNPDȏ.,a*U`K6Un]\'s.sՌ<^P(a.&_N T~#YlnCӑnI_>ZwTJ|iݭTIO殗MM&r.h6$(\D˪/Kpƻ[x۾/t7B; }?7 bJȔh,n+ʏ\'(Q?oI1WΣZfaGkWpֲn 㶥k:I.Ȭ~i濑ɢvK#}WX]a0|Up ``.wP%v~\_3Tf!@<1!\#G{[akp Ki=<7-H}Y!= uOs ~RAwJ@"}<,AU29 40l- 1*{|!. $lHu."d24X{>{O$U0VxB# }I4;4Lrk؍%'q_w717K?O>"\uclsԊ/L ]شW{S@3^XuXfЪb>8 3[WiA@UtPK,/iɭ,[TJUKA.$J6ƀxW\" iY{*s{F 885C87ʽu'*ntKB*Zs|pTϛl(K`4T7(4#}xR9fé NG(\~.i ݢIh;̨26 Ko=8ƪ`vƜKB׻GiPf0WOTj%n)I-+Pef2pRa#~@k5*}YMsB$OBDeE+Hs)M5(ܳ 6lf=Hd1`lk|$kAu? 5F4na}+{OْwH10Wibw{`7R"9.G6<ᡶSլoB Uzj"{(0NHzu*8OYzW8D<]0iѮ-yƳ"p(3I)ZNͱK+o,HĶ )|3-L: d^/15\ u>^TeK?Y @O0PR{88=VMLRwWig l0˹ ѭS)eI|| K<xo^$~)>pőQL(wtr?AlIfv(WT gbn~ NBLywV !cg+l}6< Y1LxٸWOeu5} *xP0+\cjcl1)Ep)g\&c+n :{@fMа@38I% L yb&M\cO[a]Fk ԙ> hw|\w9SQ*~TJRN){!'[KdKL򴃲5Y%P[+cv䪖)=#.my-g*6[*YcT1[Csd]q.R1;Y! @5;^uvY^4'osy%rBl5H0j_A˩4dN,skڤeXz7>hpPNȷÚv*d`>35Ok=rOޗ%J34t栣J+8}8f ;;v"0ʬy1$*aݳَ흯]0m*_ɄvVۇq3wNoԴYVsUfk 2g=3;?Z$VaǷ^M@Ysh=^꘢[:5\[=Z1/wݯUyw.Ѽ"n09FqBt5c||Ddg7y->/QDYUUV>݅oD0㪰)![+h٩b֗+g!CjR0݃6)nʪlnV*VwFU`گ);?hHM Ac ֥rI<pvR*jF`+60=tb+/ǵ::}$6KhxӮ(~!x1Q.Vk~A lPk)xD#%ޕFbi\FUfˍs8;ܝ.W, lb3˙VqV>|A$}N9,RL3ْ:b$o R}[$'1 p-۴Lg a8Q e%Y2+#?*ocwY% o*tdz$ȹ q $B S;uG$oyWaMLx ˂o57fWUŹpa,iӈ,3Ⴆ/!PMSq` P~RF`T A~2a{rQ>L/0k#Ȅ{nog篊JTyapA*ya%{Xf[wvrxh iaE- VHk>wS`ұ-M¾ev^P[ؽB?xO xKBf55gӞqo@El=4qW̋-|g'ءkM/0DacL>s<1VwpX:ܤsoθOĂP4 ^lU<Ŭ艏p.;nW^/8N3\R|KrҲ;;?#4_ϷUOlOtp46&ݳ5:EAݺ'(1Hlr#YeJޥPp1Ə%%|L#vnu;1Zo!ZtAP5uJII>lz˨s)ZՃJN/Um3Mt3&3M+Df_ċ2yqȭ>;-lxzyN|dڮ.1ez"'~o 2uj;'zcf4Pk(WF5RHȴz*B H-4c S.#<b6 5y䇽F_6Uc/t "Z2Ah lqZ]Y>F\5X5^u;Ԣ-tcJ%\c:% |f萖Vyk -0 _Au>Vg5a!!]?zfA[A󼨔l5V9ksmo $k@">};M^:BhXQclLlcKmL"xRsW.8JCV)^|qd떀9/w zعg,9XQ1e"COIuRHEEwh6c4Rn9#nl;RKQ Z8(p~U^E(ڏ-w}wņtcfH J37!SM޶T%QH- y:܏-kxP+pu-Ev f pfG#u>HVQ҆s;h.^]%9%{Z(IK`^c6=ILl!:AHb;p,alȃItSJPkvKuh =M)/\ՏZJ +0{-`EC_oO]ui0Ge2v?ScB*_חT#ͥ3,mEs;hSD7m4on'LAYK| }Bd2c+iws%"s o=h2 R(͈l'sYEb4Msޤڝe[ʵ8nHH-dJgAڳGB4+6]F'/ ;J E1 | Ӎ$2gjil`KKlNБ5hGUqJwTGM] %xTE%r~Fn=2#6aG7>6O-Yuy8ʷP|/4+#k:sn_PDsWk[޽kB׾b´?bo:ݍ}ȁ%5%f)ym_u {8oQ(?n,e&FC *fq rwREROxn!U5Ӛd\9Ljk͙[R\+}-9ǘ$GP?W)_tjs奧p5ӢheƩ_b#i|H47!"\Y4w\i|39h HBQ#Jii5{B&D ZJYJ#=*]i:'ǐG֎wxli<?/"F_%5Y[ i '.5g=4{ŋ۰Ḭ>/t0A0[[_D'al|AB2Ӭ.?-*iAes2c~QΫ5ndQFY&-3`s);:{i%NVG$;́7oAt=_'.ikPNVpC0 i$vKT}\;v'|* fU̠1U< %Xc+k~v  ں9s=}0Zz<=u6UE3#Qnm?m l'tM-yowy`gsKh85"Ԟ]k|OO'bQB\Of*eo .{ؕ8v7ކ{?\[uԶCܳ%HS~anܪ6`sxNw?+Xo[g{f\ȫR`wܘ8_5eiݺnƀ4oS^ꚠW 8X,X??v\-NE8V.cMP{aY07_wo0L-5^ƞـGIGc{7iWE.nꆱK!1//to2ed41i7 mKѩF jr ~EG-45]6q:38F*Il_{9OW"wZ |h@Hݰc9\,p8^]X|l3#,M*>aDK>bmoo-jabJ (/k#VD$ɳ`q0gC[fEQ#p蚁tᬙ%'e ʨH󊏼os\,0|fXCKpqkHN59c+ !Z8q<ƪ=Aןd8bcni(ΊAvqJm 1_rp~PO^l\0E%e5Fu+u |}`h;IG/Uwz8 zf=D)HNC}I%$U,V fr|َ̞ȍOSxe7]틸ZwPwRofV )kn6{70qS-;.L0*ȷ ^!O(f^U.m]l39|20mTn_qv!ȍe^ -Cm/gaFιC/XY%bsj/ ] dPdD}p|!F1B:!6:-׹ݹ̟ދ}mO˗kSRGRMB9W նQYwC)ܠCU&=ABT橖%)vz\tn܆ zy޿Yqku.OpibKr~wӤ`es-FOw\gsEe>[;-3Wmm4D9VaNg-ˬ }%LfxI1 {/vsTȄ-{3 b8ҒM `)x?#։dkᄑFj< |:e'lttI 9O#+vlC` Rj1d7(5[`+r𷝾M.\utPrxY42#6{? ;/ |I2E oX“j}"uϮdIM"~(1;zGdbMm1B~}7fA~&) ЦȂeWYy5m0ǃ_KyC}q(Ơ~TbwkC19┓?R$[&{*k:clʠ ;Ƙ7+8|~V0Za:<:"ם[0fNa~0OD3iL->ih"vv)IT?a[ydZ q<?CQ4* Q V^%(,{˪62s^(pGzLiJfbb kb( T9(!B E̕ekVl(ҬgJ—Eg i/G]|s8(c O윢#`%MIb' l P"=1З;Hb.զw(3_jsh%2Բfl~E2 @5sAqƱr WB,z mŧKȎez68X 9;l;NJxԍ8q7( ^n"t, jd":jGPe xl Z+. 44uDpӧNюT6i$JkBLL.}Xne*Qȴ$P˩TW/6EL)'V-G:o4t{nHdB-xh.9u ;'&/?Uq(K,UdNˊX4J1nu5[=J>|[•S+y}NS n3|O&JDJ! % (.,8m*p{l<\Rb3Vӆ5'dǂh,0~""<$eqP.|.+2>ҿQΘCQ/i6"m.5; >vSb<]%]l6mvhҌT.PRϪBH#fǶ~fmM'UJZ'a! M&p/R~pA57agn*mDȉE IMJle=!6"1|Hu%KګGP&w/-HoLu^*vio=<<,KzEd 3y LU6lڜ⾭0(MV ⁀{D'/x 灁 e?Ao^]8 &sx68I^\}_VGSxJ9:h^Qp :<)I\7 zt <Վs6W K8+0D ȹV7>Y5]Jz!䦾#c)<AY: Rdw %kҿaӗ8NK*ѓ5pRc8`1xSʕ o)U=cc\g o /J[Aַ+$U;6=50T$AOl:$V+uX r͚F5"XeC<|Ht; h̾32"@.Ngf8D9X%dBG}&ؤ|rx;>~_aFڣ:Do!\>wbRI 6? t5+5o~dYߝL)&Dca*дͪ%XR{_v ~ e(aLײ q i`%fquʼfBM+UWX#ϻi,GK RjMB<()4Oz5fV)=`-*s޼ۻX!K'Y3 ~/[:uA!%*1C4=Oe-fQ-6u@XA.]=6/s72+䛀%?D^鷒r #?O7?nQAΖfShT93en{}םmwI}G6c/m|cKCο♗aOv[cRC/miZ/>fQMKY`Ol"" 񭡟~!ͻ zg"؀>_eBa'7"2ŹHȶ0dܫufn\]9-E͂_m>Ѷ1mDSښrNekxZ9MThQL!S324x5oO3 8a AV'թR%>ԅ6\4rb=4hǕEj9z#{UhCݴlVW@,@g +C ǟgxW1Q$t ;!fW<;Փ~ J-<=B٭z})Y]풜.Ƙ|.>Ń1s&^LW?IśѪ1]fCС`s'"ڻg#e/ d;|b_wM.: 2'{ @\sDm*up]w:R: _w {?%#Pޤ?Znp/`O]Y5¸3ZǎR_zm~3նl U@_ԯj_\s'$BD\MҺ:ŴooCbe&cI){Qhet> Xɀ!B)5:-v\+hwELo(砹{̝I OV͠R9UE~C =hanvXΠpPۆ5pe ©/9F?r*)g8C#@F)kAnv69ЀhH@+͔Ojy6F+.JФ}15%ڝre'|;uD!uDީP^}%ɩZq:D͞.k6b>/9`KIvs3z1ϔwcpΐ+aU J,3$^)gq.Pø,?f D[҉ wp ?M{;װ]!ȩ Pf}D)xu8q26Uh*?E1]QG[3tCwyUmR`JI ,Zj/p=X uTF]w1{0nX!BxBD4kߺ++XN E%`Rݑx.+Eq2m <-v4C(8{)SP&FĄ NsN|h"M@+M@2(ɀ@s4=vc&j^aƂZSLeD^/4:ǘ^O%a쾋hRZt; _4㧷{sf$#%qp.k%'t "h@9?"הLG$v5r[MVk ؘj D_}~$\2纹-Kr49V$) г e{.'^RyX%gt/Q_5,ٯa$m3OKR[CS/9&@1a]yPN‰16g`XE$VKr^dnTO;rZ{bKv>14dTk^y@Xn^ߍj!gߴ2_S~{&//'|iѡ`ehsj/)^J3HլS9O3(f#)Z5e\@ը h5<|,k? `3uw(#&7AM9b#T~шƘ?k}&l6FWRe8ڷwCVvԶN04d2KRߟ -m? -#OBC ito!;Dl"RHs^a 銏JRcs;Ok I>yf:Y5/oI2d'5#-5[:[m_,vv[3M?p qoe*Wkg&dIYoLa3h`M%m(l( \U+Z|XtBi@5m;uR7ı\ƴvdhM y%t<[6uuX6!`׈iS[77Չ4)Xc h b+8VB|T*T [!>yܛ禸\2ݤcR_S[aG9#F` dCЌ>[LVH"vVՐgo Hѹ\"g& =zA)t U?O-Ty‘L!#XO^_~2jDW5wT=dvN.H֒ ;Xy7B^I%NY>~~D•uP6MiQ({ 낏7ù(SDMyBJnX /Xci9oz|ѧi-QCF9&_,. pN#DS|(t52Sst`PFه G_UJfQ0nem#O+;}+աH@EZHshh,^jZtۛn%.f^Q+lhUnNa,6J_k߫ {;X[/bAA՚<]]Aj!nWfh(-`ié<(IX^#75]֌wyRR8LUL :g7l~Fk{e }}M^.4M@DV~<7c8IeY_\}->a0pѲc{/ٻ2yg 㽗 񂌸9?+@] R`mDh GQgj, Q- ]$V;o|iw$;]&T^/M5$Uyi{>y/slTT8=,̙$^q ?c*<yUڷxKkW#|^|3T n<{Zv!3 hUFZ}nkoFλ sVlYɯwQsoS?#jQT@TRwo8뮻Sy<=>VP!j`-@cXt熔TVQ31+ՂpqF*,ͻ }B YrjiaGI ЭE\ 麬#*g9sʼnzj8rwӷӼ P }1I*Bn|1d1\C0' U:RQ&sgH kC.#O_LA_yFߟtߩ|b1ЂfU0Wy} MjyYន{%"c֞:żyΠW"TV0SBw/=_{7MܒgĻmB.eG90S=]gM{q6NOhz۰אPAPFnw0]*M7z+ѳ=d3gJu,䭢.@W( H]Na1 H>w9y~1.ROqi '߿Ꟁլ;M~ǢYeop޴K3Q0%vґv=k_#ΙjpX'h=wm!'E%{|n0N#Mה[_ҭl[۽7Ig |Ya*;%%*6vG( .@)oJ-WÊx4-')᰹!ehj 0twT- vpTwf>uy|"MA,hW]:7&_ 2kO(q:풁zV!ti.y+h/%9ވ\:NjJ8 [yQڐHW䪛5Sbj0gB4˝?8$hydSA]k6OVN5PӲ"D7DjO~罩)s')? D6|,xmEj ~ ; ԳQ6+[qQ@G-5˴9~fˉ!ToqE$gv_%} @Οьqj&g(%_$C0p>#^o/'3OޖBؼ#!3 ߁9ϓ%k ޿USHҠ$dvTGaF f;̶7K"P4QeOsx(aԵ9_s/0wYu,\ܸnoCk< Һ|GXV4.Ę#I/j'clǭz# ;ރڏaBKXpf%;S> W c=^(:FښF_;$^ܻ%L'⪳ k1xKWV5JpiK|%)W0Ϛ8=3+C ^ڹ\D#?[5Ks+NntZ{ R(Β4'Ig6+J/kkBi}(`JNݍΡcV8IM/7DzSpEF`P!ڐYk2m:E/*]{ɵvs)Ɋ "oxPh l?h$] P(e2]#wB vshtʏ2kՅ/gFɥn}]IY\zINDav|dCf3Hqjh " tAp/ ]qߒ}ol/[ZXiQP51ƭD8m8B  \NJ.Ր?DK1z?ν -au)gdF!Z0r:]Ze!& !BL:r8/'w߶zX,l)^.yV0'7ͨЛy8#x!߼p 1 ~dX;`^HБbPkٻAl.MN@6grC4J!8ꕒkvUYc5)j""q]NvÜFmqY)0) }.KF#hdVZG.oMEL8P>A ø<x uJa)v8$_.bQ%60gy kr1si]Ju6 OMEYLXPu񊂵_k#塪%Q@>&Jm=vbjor/Jr<=*S\A.2o&T$:C*!C^7}Ni\2YZ!e{rWi|r;I^4xZcsT)vUZl]4Y-~"ʙCC"Ia|-M {Co{6зF4uZyT Ǡj Iv=0/fqχB;^l\(x(pbxRe@CQJM%rCwpEGX@7:yQ.,"WdÒrǓ(S%ؘ1&h_[\kg J Ox8gk!m^[,?>I|FҘ(7g8̖/߁C@esx)^O9AlWqrl9v>QV{~}3pA"8˟;-&23 )Gǹ SKlTZ#@6_r"W^pцlPrs wVŵT'Ӵ-1mȗ}^iJhZOt5eat{{ fRyt;1̝g<#{6Hƹ}DV!_JŋdvïWs׊ 1LHMtweKCIm7&bBFe?b?Cۋn*v1${VǞc=ִCb*4gd!wTv|sӕͫybؒ DSB1>Z*H> |`B/? wHTA+lxj3ڙ:}5Є:Ƽ6]2E}2"L_uO(wJ='yWcδ fNS-zΐMg3jkZYX\ȩu ֎DKA<ޕFT>(%Ywd2Z# i2ؐq&RI*jb[a xf4ȹ7vA\\x5k:zplgE;="U=Ue\qՄ6㵞5D < ~{f)D vQTd;f.v~oz߀X* bRQQ :;?k+/0қ}v?\ϑ8ut#0#N,V*,/Qss{CГtK!H),m=gn%? ⼎`u񞵡eQCM>h|ig8FMQx%ݕxXaA2o #*~U2w DA)~}~M<&)s:O%OԐo =+sح1+gnJ]=xy?Z#S1Q(8t`hS }haWH1gEEณyb)jֱ]yn/0,ZP<:wnq&ݵ.ý9BUc\fr$n$VgdY~װ?9PyxHZG}5#"5YRguxZř0 1.JB @^HJ},iYzL7W<{U &?Aba_.& %!4D1Y6TDXC5H, æ`c YVb v}LW6l`ud=FicJXC&ӑypwh⦝qWUMD@A5fYj Ͷ+hE,a1GX-ϛ&Vsqw+<@MͧӟBj{C:d[jCa0rr7Xө{O~G?gPRk~Q($& 9'#?#UBb̵fGq6\N/ʪX˰7R9~kcE/"~ e|qm}=".x@v<}^Axzo2 ^m1:oBB Q]kjb_\́_9MuX)xM dEơ*LMx!\2ek̴f˥fs({ [mZM+zkdRc]W"ǯl8cvҞH׀m=3OBKٵoCRaQ{5\"( h=ԁ`4n]9\:#K%EE>gT)sG do9`+78GsyX GL )o~=/~H?^*V'VehdԪ#u@0/ D3YH7aFZcM'{&M Vw֧@OfK.COk6vA3B` gO& &;1Y%xo|3Oq!%&1Ə`jr:wt&9`|'=l!$.}pW$$9,(pԌ^4GwҢ^K-\e؋&kA># j:PAF2iN<Y%׮ ucX[{.~ ffT0 w&3ז!Tj:TZ폹&q4iŐWgLK gwj(з o}Lx6 4J#A}d6yGC&;ǸR6nSx9) 1oX8it%~ZΏ}] !~G`jwC'`'P,4郎)آn恜pID>u_<r 7Q(Xۛ:SB/JOZ$L*e1! K7ҸPBl1?ʞ$(fؐـJ6ICZ\骣cHCsž7"UU*UsR6c4،@)_ $P/3;6&Nf<*QՈI)/^'1\yN9] {TP TNMe̡hX߷ԺkYٗm7& =rY/ %+}( z}oF3W0sM'^$nՈo4+5FU.q&Gl{䏦JsT|=*=-pjWۖ#'9Lȕ"J'hTCXn( /rf \qڭo2˶vܳ6ӲF_QSK#93  gCVL?Q^/2X`H/ r͓ SXjF-~kyt`(lҶ?#ܔ(C"q$WL߄sƖ ْR9QJ]$sj& xj{^ / I<ӿ^Q :h`7ayg&d@1fUA"w2L[Uv 5lA|E+'c.t"KI-ȿwUq4o`%c=BZa 3 抰;TIvS9vOͻy˓0V!tE"-7n'L(qd[=˸@pD4UeKhD.cYgSҠhگZC|(. jr^냑aϿq)kqdVoV~[p' ard&y`Rp oݕ53-43im~&d6^|^MFWQUPJF{u: VL?@JPWl XecK_<Ͷpxr `fw]"!TG!Eʛ J㏩.l5 @upvILsAKs)H=i*K=ӘK{ir.dS@LF6Pt}+JT_30 e("2<5>ɂG`2 #nFǽ[NZsn$:\%7D}Z,UfS3&a!_,,;(VGjfq&ЪZ]$JfmLYKce \8WcPjt(E:z1Ǒޮ^kCp00Zb0<+*v f7k 2z{[P]/0ܪMnn᠒YVv Ήޫ :b8Vi6uM0Ugddȣ R ƴ*G5h&aG5lYyL1@o܁}Z,R7s&sp٦7 8)SSJ2b3M.tb;dAݖE3"%F%AZ~2`b BƙBd^S$fFɜϝAH}}TZ"Y7NQε=خP^$5l&x*DKI/X"wKa:(e VҺgnZkhz(# i0GX" 1"W?]00ip'gVQwЫUG= ׮y Bǘ [jr`S.NGZ3W8}f@Z'͇>>kI$\j U% 8 v?>m'&PlOSluT DY8^'k{O(](qLvx>rNmHJ+>CgS0p`-ȺЃ'[&(Ӕȓn5jd`Y D"kR1 Bt{SqKG䀘6I,'w;Rt'](2Z蹾İyāwpV|]ǔ*>7OÕ}HN Dx$99 h0wZܨM9Rݙw5RyR5Q>f5)a@Iȿzz-93jkXao~l"ܖ_|!f.YX㋳;g(z|Ґ[6n+@ZQՅK_%^~9t;Gs_cMPRdbm@DѸ}HLMύ6T5G#4R _uut\h:d(A[#rV[1 Ǔ2Υ1lLdl(9_Jt"I*A[-N~:"_2Ow3tR=C3/;φdwϰDڞA76b:C 6m▯[lbsg綍c8RK(mxɶqqݣHQ,~ ;!  .^f0bQBFr { @,%bF]m=t3YqS!%0JLcS84ROvp%)bFѼ"PW>8KkPbH+)^FEjJil&n%.EFe`T$ԹRhM )sr.<.SY;y2DqPiK+ r>LvѻBvsVv;7D~t!sG;AT2^~..GTK)moҕ*3C˽](mU`Gs QªIxx~'ES {ؒ7D8tU9bGaL']lt%sїUq@4C'O&`ZeZxI8gڏF48̲;`۷$|ӣ&[Ȝ-#؉[!tB-%<^~pS}<^٬9"$_WF^ Hؿ>U)3@25PUb i1QuBRj} ( \뒀+SϧV4aJ[M=(:rKcC˝ 8 &٣F=e;/Z֙٥0ȅA0&l94A.v}a" )#TKs|iЎi<AB~j*Mʕ//_y# C߅6({ ՉH:NMws]uOKe|fs0qv7sL_=02F _Ρem?;kTɹwT"4IJd Jc-IԼAs_&TjCesgeUsu)HK!e X~җ6ܫ~$Wf]n*=,ew_^?ԼBِE4wޒEow˺T\EO}HB%_e#(X1l@n(<#\\`oU8 h\#IF!eMȆpEMeX#)O -|hCZGZz)"kR,/l'%ibv%|z< pb۲)k[~`%uGl_fadSפ^ @Z*fqL=2nGDeT6g?Qyڡ{ /cf6h'N9ܞRq7E:*?hEh`e0ʿ lRaJ#7CrSW>h^%7xAĐw>^&ưL'%P,@2Θ;>\FãL@L+GuS&lCct1T' x ò^QZ V=al{4e點^$Ev{lPfÁJim6k D+aWѲ'M`cM3OrC2e\8Q}vN41ƈ0iI*lհ<kҥO7qЮc7v28 JY/]3Zy!lq7!%̢8я~dDM1[}j>InEcP_t^Jfm&:N3^H'#3w[sϯ7algQ&B5'.`@fk{[cENcEQ8<P"?p/[#AdWZW'u,9R'-Pk{mFXJ>Gf?XpDM WNmV@`S͚uZjSjXG+icW}=h1g`?)O!YNšBF)*+#aVGwTva\>毎9=TcPcx)_!])=k`È(Y^ĭ'L ʹaFw#/ \)Z>HKJh}"bE> {~Z2hz_ES^Rއw%=gp1%]tLbii{'~t2XFw &5&;ȥ Ы}'!@ e[Ӆ0M5JQSlvtdщ~}HBFd|B0AV e QKfɨ-@)'o89~֝J1ц,um`T!<6Uk`1} "! )ޒHpݝӖO}͗h͢{.$׳?+_w-:[REuWq]7jן_iӰr\ս*4~|2ZYF0p[`[9誡zWúy J%@_ٸ DM:41 H4i'Yk+Jҗީ A>x@vخhSǞ\Fb(#$ª9&X~qr8RtʥVkV315Fo:6r ϱm)DQZ;'\I ^=0+|Ba]i?tKJ),/Ϝ*_7I 4S\+UcIÄg$T VG>"6Ї{Öbby)7l]An"]Zv5ih0Cb.[WpÚ3e~^ P[~i'0DЏc?ſ~V4?m%EmgrRЅRkZ _eR_ⷷ@$XMBzzM0ƚuokQ"qifV3%1sCE!p[8}9pFRv%jnl+L3Bgq-KTW1f-C[汇k8T9k],&JZ뎵AG1DrMKzI3~ :hL 2VX wŏxS~4pymN6s:]o>_UP}S)'7yu3Ètئ |$ ѻ 7p8Km\K9烲 Va [~m,Ӱ)R 46wHb ~M rFq;H0naF1}2U$e> M~Tl^^}V7RU E+N 2?z0=><[ϭ0M^vPae.}]V lxvVsjB\Q4&kBuyؔEᡎSlhʋ(J07u {>b+y/Mf_u؏w-r߁ 'u6B2=y/l^czSMkH3d=*li m&ۀ>2э$:}N<|R?,1p_{~N0aLmΉW맸 8͝B<6Lf>Mb&̹c~ qy޵"m2G5C^֟5sghwlg-w>il}LY3im56P5$gx?K21űkq>yNl@5񈆭%[;P ؙq.ktQ"y=zI`tD-.1M ,WzhCkWw{Q#At i5'ذZt{vwl/kv)aml+'; c-ѪnkҾ(hSŘT"0ŭ!]OeD ðyXlAUˎ[RT kYoſZ}ؾg}Uͷ9xT0ϡ^ۑ=d *F!Z,Z 4͞=Д÷kҶm+u0 PB>HGX9 $(y!e 'Q ~0܅32MGqBhG&#!-ͲZ{tO&V,dn WT 7ea_ _{ i:$jS`.APcDas@$y7<p7K0fsǓ: aYC Za.Fϼǔv-`4JMAu0wÏqc.慎:L<C"k8,6`Ɇ"-l2@TVښua/_vlDVGl%ZW ( cs> \+.\ A qgg-5]eIpDVHߦлȦ)=ۃ, ^=_%ܱ؋͆vwoH8>\ȇp+n,o[5_]iDMs㔷 ^yGo-STXn'٬y`E[[ 4v&`z?QHt>8rcHYdSX+ a=Fd.Sxam&@p >1~/y}5Df\gd:2%v澑922)OAy߰&M7:6"F`lz=n8-xRiʲba |C,%o>0:^sN' vجޛ2̞o//lT+цzZgmM_*ATM%$<'*0] xx=<]aG*@<,Qs]s&|qo}5y"10WrϭMD ΚhMc|do3L0[=hzxtzi:4gd.x; cY,MLwS5.eN{A77> <´lRs31Yq&q& ݬX׊6!l2ټniTa 待/18|τ8_U;U oK`Ai2woҙ m\wQ0}X-4z/u;r#GM'F ,X'$<_ρ'$&5y̎i,in"c]C:yd{8ꩦ~5kU-|X$tIXu,1,J%s׵yoI|C{m[/[ЀI7yi^p}ZaSmߊɊlD7M"LD[eu6 9ߥ2 z6UH,5Տ=4  5pDamDž[]zHCZw`]ρF.]yܑ@|?EXR$+'TuG.~/{USW6߆] L+d հD#õ~zR|XGX" xs;tZr{_ n !f-ތ*$X,^鈋msk?HXYx#.M+ a)f 6NG\l^W$ARl67H+8qmnz-^ K1Wq:bZ"b`vξbrotli-3.4.0/testdata/empty000064400000000000000000000000001046102023000140030ustar 00000000000000brotli-3.4.0/testdata/empty.compressed000064400000000000000000000000011046102023000161470ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.00000064400000000000000000000000011046102023000163650ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.01000064400000000000000000000000021046102023000163670ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.02000064400000000000000000000000021046102023000163700ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.03000064400000000000000000000000021046102023000163710ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.04000064400000000000000000000000021046102023000163720ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.05000064400000000000000000000000021046102023000163730ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.06000064400000000000000000000000021046102023000163740ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.07000064400000000000000000000000021046102023000163750ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.08000064400000000000000000000000011046102023000163750ustar 000000000000003brotli-3.4.0/testdata/empty.compressed.09000064400000000000000000000000011046102023000163760ustar 000000000000005brotli-3.4.0/testdata/empty.compressed.10000064400000000000000000000000011046102023000163660ustar 000000000000007brotli-3.4.0/testdata/empty.compressed.11000064400000000000000000000000011046102023000163670ustar 000000000000009brotli-3.4.0/testdata/empty.compressed.12000064400000000000000000000000011046102023000163700ustar 00000000000000;brotli-3.4.0/testdata/empty.compressed.13000064400000000000000000000000011046102023000163710ustar 00000000000000=brotli-3.4.0/testdata/empty.compressed.14000064400000000000000000000000011046102023000163720ustar 00000000000000?brotli-3.4.0/testdata/empty.compressed.15000064400000000000000000000000011046102023000163730ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.16000064400000000000000000000000041046102023000163770ustar 00000000000000Xbrotli-3.4.0/testdata/empty.compressed.17000064400000000000000000002000021046102023000164000ustar 00000000000000brotli-3.4.0/testdata/empty.compressed.18000064400000000000000000006000021046102023000164050ustar 00000000000000 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbrotli-3.4.0/testdata/ends_with_truncated_dictionary000064400000000000000000000000261046102023000211370ustar 00000000000000often referred to as brotli-3.4.0/testdata/monkey000064400000000000000000000015131046102023000141610ustar 00000000000000znxcvnmz,xvnm.,zxcnv.,xcn.z,vn.zvn.zxcvn.,zxcn.vn.v,znm.,vnzx.,vnzxc.vn.z,vnz.,nv.z,nvmzxc,nvzxcvcnm.,vczxvnzxcnvmxc.zmcnvzm.,nvmc,nzxmc,vn.mnnmzxc,vnxcnmv,znvzxcnmv,.xcnvm,zxcnzxv.zx,qweryweurqioweupropqwutioweupqrioweutiopweuriopweuriopqwurioputiopqwuriowuqerioupqweropuweropqwurweuqriopuropqwuriopuqwriopuqweopruioqweurqweuriouqweopruioupqiytioqtyiowtyqptypryoqweutioioqtweqruowqeytiowquiourowetyoqwupiotweuqiorweuqroipituqwiorqwtioweuriouytuioerytuioweryuitoweytuiweyuityeruirtyuqriqweuropqweiruioqweurioqwuerioqwyuituierwotueryuiotweyrtuiwertyioweryrueioqptyioruyiopqwtjkasdfhlafhlasdhfjklashjkfhasjklfhklasjdfhklasdhfjkalsdhfklasdhjkflahsjdkfhklasfhjkasdfhasfjkasdhfklsdhalghhaf;hdklasfhjklashjklfasdhfasdjklfhsdjklafsd;hkldadfjjklasdhfjasddfjklfhakjklasdjfkl;asdjfasfljasdfhjklasdfhjkaghjkashf;djfklasdjfkljasdklfjklasdjfkljasdfkljaklfjbrotli-3.4.0/testdata/quickfox000064400000000000000000000000531046102023000145060ustar 00000000000000The quick brown fox jumps over the lazy dogbrotli-3.4.0/testdata/quickfox_repeated000064400000000000000000005300001046102023000163570ustar 00000000000000The quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogbrotli-3.4.0/testdata/random_org_10k.bin000064400000000000000000000234201046102023000162310ustar 00000000000000B U/zǯc4a2-\n\쀼NKpWR꿃Sϲ*F{s9keӐ>C)ڢ>eYt _O~Pv#j\S&>K:+(4f:P._ܴBtH//n}% QO %9A1uT)Ü7E;\3@ tzx%bXw*1Ku9 "oZ[؈ U;~Sr)M8:S.%7v0 D@V?9g(ʾW+&);r_A$/W! : , Qն? /ԵmQ{! 9nӹ ks\OaUA TKAQ/kk|.STnYb8L}`YZ*5\w40YtmM?O[$Mjv?*>άcL5 e˯{7rcY%-y&OIavεraRzjtt\h&aڌ\ӧw+ [La=l9-˸u#󁙈RmrY63AmsKslKf_5y+cEgP:lxYXP˴EJ 5Th#X>ٲq=.^2~\<^3 ѕN8dy_\M?ZsDBYv~,zا%CS /mG⟖JhbDk_Dϖ͢r"IoZ}τ+\_$9v^v>\q)z{KHn-LhѠ$_xo8C,'ݠ-n_aI0[ecr3uI5o,"Ku{Ӂqw1HAS;-Ibԏ} %;zvJgp :~Ow*,bR!^|ɂ>h1 \$4a7P ʀe%0V u&xi 珔b'538n3ؠ|wt:HO L#}-]`*1\UL#KRnz&XR!i+۸ BI{?qxDx/bdw .~ZGRnT"puoa=Q遌G TR:6*\Dn Z qA/i&EmR_`% '(]:85kmǐIF;5v4 O\vPwd{ 9:?LZX$qO 5"L-gl/sQ.Vp4aG8Ҷ)`Dɕ~5 8JHn:5-49֧LAF&vY 0/uAߚV+xB `ɦ[x߸5'zukL@HWqL*U䎙w x`! 8eB\vz9И-}c(-GUńaxP/Bq te%XMrv>2G Cz_L~kK['"3S# |U#ƙ,D[崁>^ʙoz -.O:  K߿dӤ kw:\z{Μw /EH͡\1xv`2$x_3ۍf{ ƖDcqx{ *h}UZ[Qz<9f>0Lb2zfATLcB}*1s Hz^;"p!ځ]%9 CDOI}[Vg󕁙/msl,őJKoj3Ym3`EhH3Zz]aC~k--\M*&MG]3bTO _*%QMYZ./ff.nue:oh2.~{!"voydklhMvd]hǹ޻4TC6nY6 oԪdq1N1(kJ5H ?NMtK:\*}h2!!̫u/k]15Ag^EeYCh{p6S!aȾ٩XN + њ;JlnY? ?F[|sgj&<+BX%]FxនIatH1p6}æB %ªKR4@*Xq| Z OjM0,8pբVN:KjA<R&.t͉.Ə t&M<ޏS)< Pr/W_S"Ke?G:$w.~ ){m|$xɑHvRq ҡsgA]E[RY6ptOHU 6.ӹ)y!C`2@DQ_ДN`t6L wpt'"DqSK'鏝ʢ-L2XR ;Sgk#Uj?1v;@ VP :(5ƖlxQΚR5+@>G"?BshSBTIo1G"ȘQ{_ǾP bEjO1kh], )qZm3bUc?Rb9fpy LbgZ$u:c_[;d]f@0cz֪Hۑo R AP/ce@ ׻qkw;=4.?: c#M2XSy>3;dqF]-[:gsuA $խr큁Rzxt; gxaSrp M~+[ {iW@;ޖO 4j\e0nm{a<0mȗj‡p7,}.霾e]C l**YDseqGC2zzdl\tģlD`|pN'x3&~Ht#}4ӍG{"Q}S{`NT aP@=> 8hz XOϽf)ɞJ3ԣlPIzиrK"3J~(IYEpV5Vb {%8OX :l-DWhE[Q܂v;wS֝-\_MIAD08MBػ,;@B&lP (IKa5t힛,S zsܖaA1*s#o+/I$3?m &;HXC`L'3&jz!q$wh / Zi7%@mLxϤrOUߓPXSFRlDYQ398FN$ O؛UX4 y/L /VNФu%|B\E%:ј)`qϟxmBGƯJ#vW,)Lp_$ϳWSۛlNNh8 _w![8Vwr+Š`T= vS='+#<5y|vH6alTt~>/AGct7[Nv{0A7d>L wNV4t8EnU"6@Ҹu |hc.BB2 , 'f"&]rWXª^:ֺK?ɲ]R_b&r^Nnxxrp\k`Gύ}hSezHOO-rSpp a?Rg5{=PS0w4xSBN ceggw+vpwTlfXz4tKkQH㴥;C}TbOp(!\-KM *UeoF ȡ=:.f,^hwWΨ;p̶6Y*[ {bUS&=]UORКil;̆WvW1zG-{R8~EUKGq'[3sO9SITa䔬62XS 8v)<>'/J] y~:M<pA]N)=";Dw13A El< ܧ~|f9 2jFP4ԝ9oJo¼Ox"4d Htጌ$,2Q[n;\_FjOǽ$ S*ch4o |߇CZUn 0Zmi#ڋM L~ho{k<̑E*Fby[K021NmS55Djf!sڝ&<GL ^nY=BgSgT܇BMs@LǘU0A'֜^H0UVg>b0;#f#@T KE=~V!(X-`^E J{+t(]C<H#`x,ְobwBa:[YAU-hcͭYǗ yΰZe=Y.&A2C47]z;]cV qNZ'`e2JQϤ b[qaM*(3IaԤmg[b-m+R=c-}b+ɆDJfToNU/PI 6%;Kʨ-hu^cyp6Męwy**ڊ=HZ oYMؙK_ʊq]6cZGrOQj /A.k )+KD4\F82_/ =V0TÊN11C3x`! (U&P ۑq #*jviv g v7:.aR]6?J'%~)|+Hc_#qao;>(¯0"|ܕ*uЧb&XY|uuD<=џͫ2TS{.f' T^-6n[#֕2R G>̗ٻxN8F{"5NNueAS0@ iT2W_!d>+0 7=6 E˨K"1h'TU|< QFHpՍҤ'KKgÔLl\]T+9: swUS=#[B1p0ꣃքv]^4k?$//;rU^ݔX}$C~.A.Η;JAm+ xmF&Ɉ]ی/hعA-N Q[5)Mz,9cwc;< ?.h$@BwH|35wƅ>8b8ۮT`i}c\Xe葦xUBtiLm6eꦸ"_:*-!jH^VS}8<LҠ|)cb6|Ec Gi6Mǒ9m-:aM 7A F(mQ{g_8փiC 46H它9ZDi1>1j1(™:0)z*ؽGbD= YaZϐ-FǴ~UckmiMA.vk6%6ʺG,Nd (;=yt=0)\(;lق*w[<Q~"76h}ܣȆ@R2:̚ףU=|Axo3^k:v-H&1ǟ*_n!8t VWMLh$EJ %#`kA/ŶmQljp̹;iۓ.2Ar~G"\#돣4{fKS39UPZ 7~ڝG>[YjBj T_\ wѕ {Z{1Iş*΃e BٮV_ڇqyq3$J3L \V]ѱ95%vq/@i-|72ᜋZn&QUxmf K^9؁js-.hg<}] ڍܖŞCx6%IIJ[ Bf*`W׎9X !>%p~iX<ᵫ#Foαs n 7GWl$r#*[`$S {/ c["?MAAUؕ6dnc0d9Q%As~/x$ EXQ]U5.&E#%;"T)V뮏b¨E`=qZ䃞9!;sZ?MTk#WљΏYpm)[G[lOhA%d_>?¯v U4O9Q._Dꂚ\ƻ6l`y29-0w}د: :HA7Éh}30ӹr#g;JTu)x / seHȦ$ٮ+аTպ/r5OwH tlc\qxtFk_M5aׯ!Jv,&Ň#6x4_5 Xt!)ԶIg֥5!+= é;U]mFn{ޣ~tGv d;jo cˌ"Ҽg7*~|+XhQ* Oģv"[l; me$)*0l| ;Ap|K0qH"r8d;Ɓ`T g;qȩK)Ʋо /&#P(;qiE!߫ Tn2}Qj̥gX}Mڝ)p ?u& q'Ju[2,n8^|FBą}6:h8Sj6FT,C:4±FIo-<x:\)9: Vuuw+fJ~f; d }oW(26R<×oѩ(Q\YX4mHn'w eZ_fV.-8"v$r9qHdY#%?y݇kx&HiamYN"šrtSk@ ml) aWA%god 78Dů7u8rAk?B8޸ŴHʤAu%t;INRJ)P+~M+sip5 0F49^&.co36㣵g&+dcO vJoST_(AjpJ೧j Snɬ[ewg`-Rj{1Wq\qM>]/Cdh58ahj} M {tsmPXZgLN١:׾::*K PCMɣӱ Y م0K s.ν}z'*u&RRN'bw RcF{*F|(L1J= 0A.ޯ**tWLyp7JI'>~ Gz¿ DzP+۹SyJ%H`Qxew(P ^L:hgkБ)7p4@i-WS?t0imqi8E*v~J=St\RWY^q ̟"%{кo{BUv%.ךocpR/܄!t|)ْz']IOahT-x^6fXqJ>@TBRmżOIW5ֹ\"ܔ:j/0'pp0rCmc|77_&2DCl xH 3I=bE`ԧdb58c* J#4-9t2⃏AK|4/ )I@W_q'=ߧ%U/lTQ-%9ܱMMعpY\WmGa|J ʄG6)G[Kê!t)NDỸ9w2>|Yݾˉq&W0[vVE,YQ8{jFu Vƌ]$ɩa`w20ܗW5X g>_F5vf a`q3i:70Fÿ`@d/B-'R:Wv&#ܶ=w$fWpo˹%ʗttr=|ƋC31ls3Fcľx4g.sϢ14ˎ&sb-yYQH&5m*$ H8Rd=H{R`߫D[wų`?r{mږۜy5g!b 0Tֹڎ.~bGcw<9ɉL3gLF!Bt܄DQj?h<EɹiSΏgn ЃʡʬT+_sI ӥN](;ށlI&qp7@3>ZqHvEjp)r`Ef&ݴ_ d5,s |oJ$9J$aMBpoד$:kPkύc3őFl9UQ.C67q '1#SV'-] l:ُnYX\r)A;auP!xitO2(&;S ^g4W\cU8@(As+ƚO8%)1p$b((Қ[jm>wp@Fδ3@6X`ڧöho1 +9J6Qvn1[M7]Ni)PdbdI+%+@1! '}}rWDe 9LY`AM:2mp*H<+R.3qz"7VlJBw5S1]AY6 #.츧9ncQ-_DUc=k/9!~A~&iW=3?ŌKudwLG ]q }oCLYVKE>Ì f݂ w a_M`S"uY#} Hlk'1_5D9IߗPĎD6O_*FD8Bo*0NDt"!䍫'1ٲh)ۙJXc!z.` ˍhM_)5_W| D ´HKܳGSNNv !Gj>}i 'ZԎyq&%@*K 5PnɐrBijԓ3ԌB1h_ V)+u(@QSE!u-:hs'靬"BB>>`[,κ-p歐1kk?VvUʭ(!aL[ݙG!cwvU1\#FIܠ+jY3 21h_[й?\BuZ":k6֖5D?#Rxv"Wdqd&WV'y~ ^ٔa7 B6SҲsCOX<P1h>n6E(d/(qgM-V6ϖ7ewva (B?j)]/TprJ^CgB2WwX-BSMTf&ݔ2& PMڝy^Γ.zfTy_(>rB=a$ LUMץj["dsBZM20? FM/(o )u"697~BQk)&ȍ}ßmSa 9ɥ>~)(<éԩ_E8pv90APr6 <:l;8pWiӎ `Ј&?(Lxh[[Q| I~9NrNW?hZ%!3 xDA0>貧[) fl0gbҵ&.8Y IڻWsM `_~KtFFC;Bfwhy1(#LkGbJ,G&QE;v35RXK "&;Yq Sj3p.(KzxdDP#)boj.v.dw}ӕХ%{񋄹Y{>K:Լi7X:m}^8pN+FtuIoC9 y0Ƅ?w rñ)PX/{ y<: n3ܗf ė>cufPH[-i,}e˦3?C1Aa7a\96ϔPǕ4 >q+|e/¾L2^̰EoȋpSHC|+g4H/F-_4T(:A\Ap5\鿣A z޴1 .@Tj5//$kqd,U耧uFr5}:( u~oLOw vfb`lQ]TޅH.(_ M s,*  ,7žGɈCHLG?m.8΂kP̦b92d^.q.FG;7o[!ve6\f)BBkŬLͅglEd%}WXy vxjfhibGnb0k'YχOXH@(Ys!<{vw}O߾M{'Z fc]6J1BOB zuϩ߆&R-4U-rk*kx[5O$"DͲ>Q})J~޷$ pʩEV>ʟx[!kLYp e3vid}$}Q4JFd-6=n##] /<%GoWJ7Ϥ ڛj9zRgtwz$w,dP8 nۇugu0/F$IX#z "ZiFpNkܩ,?eO3l#g]'TNMENYֻSR@0GhfFS{ek`l6y9Ԃ8k3P< ,žC(읫ZQYׁ|X^R&." "Ut)0aU+aמmV"p@L 3wm|) =lkTy'Y.,xu\\u{],_?IZU8Z֞pØ*pE&,\ZێaQ?$>KMF2N ) eK]GO y(#n^X;ԙtLFLq!^@ ?PHc&The Project Gutenberg EBook of Tou Peng Hsien Hua, by Aina Jushi 弁言 吾鄉先輩詩人徐菊潭有《豆棚吟》一冊,其所詠古風、律絕諸篇,俱宇宙古今奇情快 事,久矣膾炙人口,惜乎人遐世遠、湮沒無傳,至今高人韻士每到秋風豆熟之際,誦 其一二聯句,令人神往。 餘不嗜作詩,乃檢遺事可堪解頤者,偶列數則,以補豆棚之意;仍以菊潭詩一首弁之 ,詩曰:閑著西邊一草堂,熱天無地可乘涼。 池塘六月由來淺,林木三年未得長。栽得豆苗堪作蔭,勝於亭榭反生香。晚風約有溪 南叟,劇對蟬聲話夕陽。 第一則 介之推火封妒婦 江南地土窪下,雖屬卑溫,一交四月便值黃霉節氣,五月六月就是三伏炎天,酷日當 空;無論行道之人汗流浹背,頭額焦枯,即在家住的也吼得氣喘,無處存著。上等除 了富室大家,涼亭水閣,搖扇乘涼,安閑自在;次等便是山僧野叟,散發披襟,逍遙 於長鬆蔭樹之下,方可過得;那些中等小家無計布擺,只得二月中旬覓得幾株羊眼豆 ,種在屋前屋後閑空地邊,或拿幾株木頭、幾根竹竿搭個棚子,搓些草索,周圍結彩 的相似。 不半月間,那豆藤在地上長將起來,彎彎曲曲依傍竹木隨著棚子牽纏滿了,卻比造的 涼亭反透氣涼快。那些人家或老或少、或男或女,或拿根凳子,或掇張椅子,或鋪條 涼蓆,隨高逐低坐在下面,搖著扇子,乘著風涼。鄉老們有說朝報的,有說新聞的, 有說故事的。除了這些,男人便說人家內眷,某老娘賢,某大娘妒,大分說賢的少, 說妒的多;那女人便說人家丈夫,某官人好,某漢子不好,大分愛丈夫的少,妒丈夫 的多。可見『妒』之一字,男男女女日日在口裡提起、心裡轉動。如今我也不說別的 ,就把『妒』字說個暢炔,倒也不負這個搭豆棚的意思。你們且安心聽著。 當日有幾個少年朋友同著幾個老成的人也坐在豆棚之下,右手拿著一把扇子,左手拿 著不知甚麼閑書,看到鬧熱所在,有一首五言四句的詩,忽然把扇於在凳上一拍,叫 將起來,便道:『說得太過!說得太過!』那老成人便立起身子道:『卻是為何?那 少年便把書遞與他,一手指道:『他如何說「青竹蛇兒口,黃蜂尾上針。兩般猶未毒 ,最毒婦人心」?做待的人想是受了婦人閑氣,故意說得這樣利害。難道婦人的心比 這二種惡物還毒些不成?』那老成人便接口說道:『你們後生小夥子不曾經受,不曾 出門看見幾處,又不曾逢人說著幾個,如何肯信?即在下今年已及五旬年紀,寧可做 個鰥夫,不敢娶個婆子。實實在江湖上看見許多,人頭上說將來又聽得許多,一處有 一處的利害,一人有一人的狠毒,我也說不得許多。曾有一個好事的人,把古的妒婦 心腸並近日間見的妒婦實跡備悉纂成一冊《妒鑒》,刻了書本,四處流傳。初意不過 要這些男子看在眼裡,也好防備一番;又要女人看在肚裡,也好懲創一番。男男女女 好過日子。這個功德卻比唐僧往西天取來的聖經還增十分好處。那曉得婦人一經看過 ,反道「妒」之一字從古流傳,應該有的。竟把那《妒鑒》上事跡看得平平常常,各 人另要搜尋出一番意見,做得新新奇奇,又要那人在正本《妒鑒》之後刻一本「補遺 」、二集、三集,乃在婦道中稱個表表豪傑,纔暢快他的意思哩!』又有一個老成人 接口道:『這《妒鑒》上有的卻是現在結局的事,何足為奇?還有妒到千年萬載做了 鬼、成了神纔是希罕的事。那少年聽見兩個老成人說得觔觔節節,就拱著手說道:『 請教!請教!』那老成人說道:『這段書長著哩,你們須烹幾大壺極好的鬆蘿祘片、 上細的龍井芽茶,再添上幾大盤精緻細料的點心,纔與你們說哩!』那少年們道:『 不難不難,都是有的。只要說得真實,不要騙了點心、茶吃,隨口說些謊話哄弄我們 。我們雖是年幼不曾讀書,也要質證他人方肯信哩!』那老成人不慌不忙,就把扇子 折攏了放在凳角頭,立起身來,說道:『某年某月,我同幾個夥計販了藥材前往山東 發賣。騎著驢子,隨了車馱,一程走到濟南府章邱縣臨濟鎮之南數里間,遇著一條大 河。只見兩邊船隻、牲口,你來我往,你往我來,稠稠密密,都也不在心上。見有許 多婦人,或有過去的,或有過來的。那丑頭怪腦的,隨他往來,得個平常;凡有一二 分姿色的,到彼處卻不敢便就過去,一到那邊,都把兩鬢蓬蓬鬆鬆扯將下來,將幾根 亂草插在髻上,又把破舊衣服換在身上,打扮得十分不像樣了,方敢走到河邊過渡。 臨上船時,還將地上的浮土灰泥擦抹幾把,纔放心走上船,得個平平安安渡過河去。 若是略象模樣婦人不肯毀容易服,渡到大河中間,風波陡作,捲起那醃腌臢臢的浪頭 直進船內,把貨物潑濕,衣服穢污,或有時把那婦人隨風捲入水內,連人影也不見了 。你道甚麼妖魔鬼怪在彼作如此的兇險惡孽?我俏俏在那左近飯店輕輕訪問。那裡人 都要過渡,懼怕他的,不敢明白顯易說出他的來頭。只有一個老人家在那裡處蒙館的 ,說道:這個神道其來久矣。在唐時有個人做一篇《述異記》,說道:此河名叫妒婦 津,乃是晉時朝代泰始年號中,一人姓劉名伯玉,有妻段氏名明光,其性妒忌;伯玉 偶然飲了幾杯餓酒,不知不覺在段氏面前誦了曹子建的《洛神賦》幾句道:『其形也 翩若驚鴻,婉若游龍。榮曜秋菊,華茂春鬆。彷彿兮若輕雲之蔽月;飄靗兮若流風之 迴雪。遠而望之,皎若太陽之昇朝霞;迫而察之,灼若芙蕖之出淥波。穠纖得中,修 短合度。肩若削成,腰如約素。延頸秀項,皜質呈露。芳澤無加,鉛華弗御。雲髻峨 峨,修眉聯娟,丹脣外朗,皜齒內鮮,明眸善睞,靨輔承權。瑰姿艷逸,儀靜體閑。 柔情綽態,媚於語言。 奇服曠世,骨象應圖。披羅衣之璀粲兮,珥瑤碧之華琚。戴金翠之首飾,綴明珠以耀 軀。踐遠遊之文履,曳霧綃之輕裾。微幽蘭之芳藹兮,步蜘躕於山隅。 讀至此,不覺把案上一拍,失口說道:『我生平若娶得這樣個標緻婦人,由你潑天的 功名富貴要他什麼!吾一生心滿意足矣!』此乃是醉後無心說這兩句放肆的閑話,那 知段氏聽了心中火起,就發話道:『君何看得水神的面目標緻就十二分尊重,當面把 我奚落?若說水神的好處,我死何愁不為水神!』 不曾說完,一溜煙竟走出門去。那伯玉那知就裡。不料段氏走到河濱,做個鷂子翻身 之勢,望著深處從空一跳,就從水面沈下去了。伯玉慌得魂不附體,放聲大哭。急急 喚人打撈,那有蹤影?整整哭了七日,喉乾嗓咽,一交跌倒朦朧暈去。只見段氏從水 面上走近前來說道:『君家所喜水神,吾今得為神矣! 君須過此,吾將邀子為偕老焉!』言未畢,段氏即將手把伯玉衣袂一扯,似欲同入水 狀,伯玉驚得魂飛天外,猛力一迸,忽然甦醒,乃是南柯一夢。伯玉勉強獨自回家。 詎料段氏陰魂不散,日日在津口忽然作聲,忽時現形,只要伺候丈夫過津,希遂前約 。不料伯玉心餒,終身不渡此津。故後來凡有美色婦人渡此津者,皆改妝易貌,然後 得濟。不然就要興風作浪,行到河水中間便遭不測之虞了。』那些後生道:『這段氏 好沒分曉,只該妒著自己丈夫,如何連別的女人也妒了?』又有個老者道:『這個學 究說的乃是做了鬼還妒的事,適纔說成了神還妒的事,卻在那裡?』內中一個老者道 :『待我來說個明白!那妒婦津天下卻有兩處,這山東的看來也還平常,如今說的纔 是利害哩!』 那後生輩聽見此說,一個個都站將起來,神情錯愕,問道:『這個卻在何處?』老者 便道:『在山東對門山西晉地太原府綿縣地方。行到彼處未及十里,路上人娓娓說長 說短,都是這津頭的舊事,我卻不信。看看行到津口,也有許多過往婦人妝村扮丑, 亦如山東的光景,也不為異。直到那大樹林下,露出一個半大的廟宇,我跳下牲口, 把韁繩、鞭子遞與驢夫,把衣袖扯將下來,整頓了一番,依著照牆背後轉到甬道上去 。抬頭一看,也就把我唬了一驚:只見兩個螭頭直沖霄漢,四圍鷹爪高接雲煙;八寶 妝成鴛鴦瓦脊耀得眼花,渾金鑄就饕餮門環閃人心怕。左邊立的朱髭赤發、火輪火馬 ,人都猜道祝融部下神兵;右邊站的青面獠牙、皂蓋玄旗,我卻認做瘟疫司中牙將。 中間坐著一個碧眼高顴、紫色傴兜面孔、張著簸箕大的紅嘴,乃是個半老婦人,手持 焦木短棍,惡狠狠橫踞在上;旁邊立著一個短小身材、傴僂苦楚形狀的男人,朝著左 側神廚角裡,卻是為何?正待要問,那驢夫搖手道:「莫要開言,走罷走罷!」只得 上驢行路。走了五六里,悄問再三,驢夫方說:「這個娘娘叫做石尤奶奶,旁邊漢子 叫做介之推,直是秦漢以前列國分爭時節晉國人氏。只因晉獻公寵愛了一個驪姬,害 了太子申生,又要害次子重耳。重耳無奈,只得奔逃外國求生。介之推乃是上大夫介 立之子,年紀甫及二十,纔娶一妻,也是上大夫石吁之女,名曰石尤。兩個原生得風 流標緻,過得似水如魚,真個才子佳人天生一對、蓋世無雙的了。卻為重耳猝然遭變 ,立刻起程;之推是東宮侍衛之臣,義不容緩,所以奮不顧身,一轡頭隨他走了,不 曾回家說得明白。就是路中要央個熟人寄信回時,那重耳是晉國公子,隨行有五人: 一個是魏鮤,一個是狐偃,一個是顛頡,一個是趙衰,這個就是之推了。急切裡一時 逃走,恐怕漏了消息驪姬知道,唆聳獻公登時興兵發馬,隨後追趕,不當穩便;都是 改頭換面,襤襤褸褸,夜住曉行,甚是苦楚。石氏在家那曉得這段情節?只說:『正 在恩愛之間,如何這冤家嚯地拋閃?想是有了外遇,頓然把我丟棄!』叫天搶地,忿 恨一回,痛哭一回,咒詛一回,癡想一回,恨不得從半空中將之推一把頭揪在跟前, 生生的咬嚼下肚,方得快心遂意。不料一日一日,一年一年,胸中漸漸長起一塊刀砍 不開、斧打不碎、堅凝如石一般,叫做妒塊。俗語說,女傍有石,石畔無皮,病入膏 肓,再銷熔不得的了。那知之推乃是個忠誠苦節之臣,隨了重耳四遠八方,艱難險阻 ,無不嘗遍。一日逃到深山,七日不得火食,重耳一病幾危。 隨行者雖有五人,獨有之推將股上肉割將下來,煎湯進與重耳食之,救得性命。不覺 荏荏苒苒過了一十九年,重耳方得歸國,立為文公,興起霸來。後來那四個從龍之臣 都補了大官受了厚祿,獨之推一人當日身雖隨著文公周行,那依戀妻子的心腸端然如 舊。一返故國便到家中訪問原妻石氏下落,十餘年前早已搬在那綿竹山中去了,之推 即往山中探訪消息。石氏方在家把泥塑一個丈夫,朝夕打罵得,不已,忽然相見,兩 個顏色俱蒼,卻不認得,細說因由,方纔廝認,忽便震天動地假哭起來。之推把前情 說了一番,那石氏便罵道:『負心賊!閃我多年,故把假言搪塞。』只是不信。少不 得婦人家的舊規,手撾口咬、頭撞腳踢了一回。弄得之推好像敗陣傷亡,垂頭喪氣, 一言也不敢發,只指望待他氣過,溫存幾時,依舊要出山做官受職去的。那知石氏心 毒得緊,原在家中整治得一條紅錦九股套索在衣箱內,取將出來,把之推扣頸縛住, 頃刻不離,一毫展動不得。 說道:『我也不願金紫富貴,流浪天涯,只願在家兩兩相對,齏鹽苦守,還要補完我 十九年的風流趣興,由那一班命運大的做官罷了。』之推既被拘係,上不能具疏奏聞 朝廷,下不能寫書邀人勸解,在晉文公也不知之推在於何處。倒是同難五人中一人不 見之推出山,朝廷又不問他下落,私心十分想慕,不肯甘心,造下一首四言鄙俚之句 ,貼於宮門,暗暗打動文公意思。詩曰:『有龍矯矯,頓失其所。五蛇從之,周流天 下。 龍飢乏食,一蛇割股。龍返於淵,安其壤土。四蛇入穴,皆有處所。一蛇無穴,號於 中野。』一時間宮門傳誦,奏聞文公。 文公惶愧不已,遂喚魏鮤遍訪之推下落。之推身已被係,安得出來?魏鮤是個武夫, 那裡耐煩終日各處搜求,況且綿竹之山七百里開闊,實難蹤跡。卻算計道:『我四下 裡放起火來,燒得急了,怕他不奔將出來!』此時乃是初春天氣,山上草木尚是乾枯 的,順著風勢教人舉火,一霎時漫天漫地卷將起來。那知之推看見四下火起,心知魏 鮤訪求蹤跡,爭奈做了個藤纏螃蟹、草縛團魚,一時出頭不得。即使遇著魏鮤,磨滅 得不成冠裳中人體面,一時忿恨在心,不如速死為快!因而乘著石氏睡熟,也就放一 把無情火來。那火卻也利害,起初不過微煙裊裊,攪著石罅巒光,在山間住久的還不 覺得。未幾,火勢透上樹枝,惹著鬆油柏節,因風煽火,火熾風狂,從空舒卷,就地 亂滾將來。一霎時,百道金蛇昂頭擺尾,千群赤馬縱鬣長嘶。四壁廂嗶嗶叭叭之聲勝 似元宵爆竹,半天裡騰騰閃閃之燄不減三月咸陽。逃出來的狐狸,跳不動的麂鹿,都 成肉爛皮焦;叫不響的鴉鷹,飛不動的鸞鶴,盡是毛摧羽爍。此時石氏上天無路,入 地無門,奔前不能,退後不得,漸漸四下緊逼將來,就把之推一把抱定說道:『此後 再不妒了!』卻也悔之晚矣。那知石氏見火勢逼近,絕不著忙,只願與之推相抱相偎 ,毫無退悔,故此火勢雖狂,介子夫妻到底安然不動。略不多時,之推與石氏俱成灰 燼。後來魏鮤搜山,看見兩個燒死屍骸,方曉得之推夫婦已自盡了。正要收取骸骨, 中間尚有一堆餘火未熄。魏鮤仔細上前看時,卻又不青不紅,不紫不綠,一團鬼火相 似,真也奇異。忙教左右將那燒不過的樹枝撥開看時,乃是斗大一塊鵝卵石滾來滾去 。那火光亦漸漸微了,石子中間卻又放出一道黑氣,上沖霄漢,風吹不斷。魏鮤同一 伙人見得恁般作怪,即忙寫了一道本章,把此一塊寶貝進上文公,大略說之推高隱之 士,不願公侯,自甘焚死。紀載他焚燒之時,正是清明節前一日。文公心中惻然,即 便遣官設祭一壇,望空遙奠,又命下國中,人家門首俱要插柳為記,不許舉火,只許 吃些隔夜冷食。至今傳下一個禁煙寒食的故事。 那塊寶貝也只道甚麼活佛、神仙修煉成的金剛舍利子一樣,忙教後宮娘娘、妃嬪好好 收藏。那知這物卻是禍胎,自從進宮之後,人人不睦,個個參差。後來文公省得此物 在內作祟,無法解禳。 直到週天王老庫中,請出后妃傳下來百鍊降魔破妒金剛寶錘,當中一下將來,打得粉 花零碎,漫天塞地化作萬斛微塵,至今散在民間,這黑氣常時發現。此是外傳,不在 話下。且說那石氏自經大火逼近之際,抱著耿耿英靈,從那烈燄之中一把扭定了介之 推,走闖到上帝駕前,大聲訴說其從前心事。上帝心裡也曉得妒婦罪孽非輕,但守著 丈夫一十九年,心頭積恨一時也便泯滅不得。適值有一班散花仙女又在殿前,懼憐他 兩個夫婦都有不得已一片血誠,在生不曾受得文公所封綿上之田,死後也教他夫妻受 了綿地血食。但是妒心到底不化,凡有過水的婦人,都不容他畫眉搽粉、大袖長衫, 俱要改換裝束。那男人到廟裡看的,也不許說石尤奶奶面目變得醜惡、生前過失。 但有奉承奶奶幾句、數落之推幾句的,路上俱得平安順利。 近日有個鄉間婦人,故意妝扮妖妖嬈嬈渡水而過,卻不見甚麼顯應。 此是石奶奶偶然赴會他出,不及堤防,錯失的事。那知這婦人意氣揚揚,走到廟裡賣 嘴弄脣,說道:『石奶奶如今也不靈了,我如此打扮,端的平安過了渡來。』說未畢 口,那班手下的幫妒將帥火速報知,一霎時狂風大作,把那婦人平空吹入水裡淹死了 。查得當日立廟時節,之推夫婦原是衣冠齊楚併肩坐的,為因這事平空把之推塑像忽 然改向朝著左側坐了。地方不安,改塑正了,不久就坍。如今地方上人理會奶奶意思 ,故意塑了這個模樣。此段說話,卻不是成了神還要妒的故事麼? 至今那一鄉女人氣性極是粗暴,男人個個守法,不敢放肆一些。 凡到津口,只見陰風慘慘,恨霧漫漫,都是石奶奶狠毒英靈障蔽定的。唐時有人到那 裡送行吟詩,有『無將故人酒,不及石尤風』之句,也就是個證了。那幾個後生聽了 嚷道:『大奇!大奇!方纔那首「青竹蛇兒」的詩可見說得不差,不差。』又有一個 說道:『今日搭個豆棚,到是我們一個講學書院,天色將晚,各各回家,老丈明日倘 再肯賜教,千萬早臨。晚生們當備壺酒相候,不似今日草草一茶已也。』 總評《太平廣記》云:『婦人屬金,男子屬木,金剋木,故男受制於女也。』然則女 妒男懼,乃先天稟來,不在化誨條例矣。 雖然,子即以生剋推之,木生火,火能剋金;金生水,水又生木。則相剋相濟,又是 男可制女妙事。故天下分受其氣,所以『妒』、『懼』得半,而理勢常平。艾衲道人 《閑話》第一則就把『妒』字闡發,須知不是左袒婦人,為他增燄也。妒可名津,美 婦易貌;鬱結成塊,後宮參差。此一種可鄙可惡景象,縷縷言之,人人切齒傷心,猶 之經史中『內君子,外小人』。 揣摩小人處,十分荼毒氣概;揣摩君子處,十分狼狽情形。究竟正氣常存,奇衷終餒 ,是良史先賢之一番大補救也。知此則《閑話》第一及妒婦,所謂詩首《關罘,書稱 『矨降』可也。 第二則 范少伯水葬西施 范少伯水葬西施俗語云:『酒逢知己千鍾少,話不投機半句多。』可見飲酒也要知己 。若遇著不知己的,就是半杯也飲不下去;說話也怕不投機,若遇著投機,隨你說千 說萬,都是耳躲順聽、心上喜歡,還只恐那個人三言兩語說完就掃興了。 大凡有意思的高人,彼此相遇,說理談玄,一問一答,娓娓不倦;假使對著沒意思的 ,就如滿頭澆栗,一句也不入耳。倒是那四方怪事、日用常情,後生小子聞所未聞, 最是投機的了。 昨日新搭的豆棚雖有些根苗枝葉長將起來,那豆藤還未延得滿,棚上尚有許多空處, 日色曬將下來,就如說故事的,說到要緊中間尚未說完,剩了許多空隙,終不爽快。 如今不要把話說得煩了。再說那些後生,自昨日聽得許多妒話在肚裡,到家燈下紛紛 的又向家人父子重說一遍。有的道是說評話造出來的,未肯真信,也有信道古來有這 樣狠妒的婦人,也有半信半疑的,尚要處處問人,各自窮究。弄得幾個後生心窩潭裡 、夢寐之中,顛顛倒倒,只等天亮就要往豆棚下聽說古話。 那日色正中,人頭上還未走動。直待日色蹉西,有在市上做生意回來的,有在田地上 做工閑空的,漸漸走到豆棚下,各佔一個空處坐下。不多時,老者也笑嘻嘻的走來, 說道:『眾位哥哥卻早在此,想是昨日約下,今朝又要說甚麼古話了。』 後生俱欣欣然道:『老伯伯!昨日原許下的,我們今日備了酒餚,要聽你說好些話哩 。但今日不要說那妒婦,弄得我們後生輩面上沒甚光輝,卻要說個女人才色兼全,又 有德性,好好收成結果的,也讓我們男人燥一燥皮胃。』那老者把頭側了一側,說道 :『天地間也沒有這十全的事,紅顏薄命,自古皆然。或者有色的未必有才,有才的 未必有色,有色有才的未必有德,即使有才、有色、有德的,後來也未必就有好的結 局。三皇以前遠不可考,只就三代夏、商、周而言,當在興時,看來雖有幾個賢聖之 後,那纔、貌、德、色也不聞有全備之稱。及至亡國之時,每代出了個妖物,倒是纔 色兼備的。』眾後生說:『那興夏禹王的是那一個?』老者道:『待我慢慢想來。記 得禹王之父,名叫伯鯀,娶了有莘氏的女,名叫修己。看見天上流星貫昴,感孕而生 了禹王於道之石紐鄉。那時洪水滔天,禹王娶了塗山氏做親,方得四日,因其父親治 水無功,堯帝把他殺在羽山。虞舜保奏禹王纔能堪以治水,即便出門。在外過了一十 三年,自家門首走過三次,並不道是家裡邊,進去看看妻子。 那塗山氏也曉得丈夫之性孤古乖怪,也並不出門外來看看丈夫。 不幾年間,洪水平定,堯帝賜禹王玄圭,告成其功。後來虞舜把天下亦讓與他,塗山 氏做了皇后,豈不是個有才有德的?但當日也不曾有人說他怎的標緻,此正是賢聖之 君在德不在貌也。 後來傳了十六、七代,傳到履癸,是為帝桀。平生好勇,力敵萬人,兩手能伸鐵鉤; 貪虐荒淫,傷害百姓。曾去伐那諸侯。有施氏見桀王無道,無計可施,止有一女,名為妹喜,生得十分美貌,多才多技,堪 以進獻。那桀王果然一見魂迷,無事不從,無言不聽。把百姓之財盡數搜索攏來,如 水用去;將那珍饈百味堆將起來,肉山相似。造下許多美酒,傾在池中,可通船隻往 來;兩邊的酒糟疊起成堤,人到上面可望十里。凡遊覽至此,上邊打一聲鼓,下邊人 低頭叩到池中飲酒,就像牛吃水的相似,叫做牛飲,不下有三千餘人,妹喜方以為樂 。如此淫縱,萬民嗟怨,虧殺成湯皇帝出來,把妹喜殺了,桀王放於南巢。如今江南 廬州府巢縣地方,就是那無道之君結果處了。此是第一個女中妖物也。 『夏王的天下傳到商時,商朝代代也有賢聖之後,只是平平常常,也無才德之顯。直 傳到二十八代,生一個紂王出來。 他天性聰明,作事敏捷,力氣勇猛可以抵對猛獸。說來的話都是意想不到的,如有人 欲諫止他,就先曉得把言語搪塞在先,人卻開口不得。自己做了不好的事,他卻有無 數巧言搪塞過了。 終日興工動作,做那輿馬宮室之類,件件窮工極巧。就愛上一個諸侯有蘇氏之女,名 喚妲己。寵幸異常,惟其所好,無不依從。當初夏桀無道做下的酒池肉林也就摹仿他 做將起來。又叫宮中男女赤體而行淫污之事,隨地而做,也不怕觸犯天帝。宮中開了 九市,長夜酣歌,沈湎不散,朝政不理,四方怨望。妲已看見人民恨他,威令不行, 乃重為刑闢,以火燒紅熨鬥叫人拿著,手就爛了;更立一銅柱,炭火逼紅,叫人抱柱 ,立刻焦枯,名為炮烙之刑。還有許多慘刻刑罰,卻難盡說。那紂王只要妲己喜歡, 那裡顧得後來?武王興兵伐紂,紂王自焚而死。 假使妲己有這個美色,沒有這種惡纔,也不到得這地方,此又是一個有色有才的妖物 證見了。那時武王之父文王是個聖人,就有一個母親后妃最是賢德。其纔又能內助, 並無妒心。文王姬妾甚多,生了百子,果然千古難得的。當日就有《關罘、《麟趾》 之詩,誦他懿德。尚有人譏刺道:「此詩乃是周公所作,若是周婆決無此言。」這不 是譏刺后妃,只為天下妒婦多了故作此語,越顯得后妃之賢不可及了。到後來周幽王 時,又生出一個妖物,卻比夏商的更不相同,幾乎把周家八百年的社稷一時斷送了。 這個妖物叫做褒姒。雖則是幽王之後,其來頭卻在五六百年前夏時就有種了。』眾後 生道:『這個妖物果是奇怪,怎麼夏時就種這個禍胎在那裡呢?』老者道:『夏德衰 了,褒姒之祖與夏同姓,那時變作二龍降於王庭,乃作人言,「我乃褒國之君也。」 夏王怒而殺之,那龍口裡吐出些津沫來,就不見了。臣子見是龍吐出的,卻為奇異, 就盛在水桶之內,封錮在寶藏庫中。直到周厲王時,到庫中打開桶來看時,那津沫就 地亂滾,直入宮中,撞到幼女身傍,就不見了。此女纔得十二三歲,有了娠孕。是時 民間有個謠言道:『壓弧箕服,實亡周國。」後來鄉間一個男子手拿山桑之弓,一個 婦人手拿草結之衣,上街來賣,市人見他應著重謠,就要報官,二人慌忙逃竄。適然 撞著有孕的童女,生下一個女兒,棄於道傍。那對夫婦憐憫他,收養在懷,逃入褒國 。後值褒君有罪係於獄中,遂將此女獻上。周王見他美貌,收在後官。舉止端莊,並 不開口一笑。若論平常不肯笑的婦人,此是最尊重有德的了。那知這個不笑,卻是相 關甚大,得他一笑,正是傾國傾城之笑,故此一時不能遽然啟齒。周幽王千方百計引 誘著他,褒姒全然不動。那時周王國中有令,凡有外寇之警,舉起烽臺上號火為信, 都來救應。幽王無端卻放一把空火,各路諸侯來時,卻無寇警。 褒姒見哄動諸侯撲了一空,不覺啞然一笑。後來犬戎入犯,兵臨城下,幽王著急,燒 盡了烽臺上火,那諸侯只當戲耍,都不來了。幽王遂被犬戎所殺。卻不又是一個亡國 的妖物麼?如此看來,纔全德備的婦人委實不大見有。』眾少年接口道:『亡國之妖 顛倒朝綱,窮奢極欲,至今人說將來,個個痛恨,人人都是曉得的。昨日前村中做戲 ,我看了一本《浣紗記》,做出西施住居薴蘿山下,范大夫前訪後訪,內中唱出一句 ,說「江東百姓,全是賴卿卿」。可見越國復得興霸,那些文官武將全然無用,那西 施倒是第一個功臣。後來看到同范大夫兩個泛湖而去,人都說他俱成了神仙。這個卻 不是纔色俱備、又成功業、又有好好結果的麼?』老者道:『戲文雖則如此說,人卻 另有一個意思。看見多少功成名遂的人遇著猜忌之王,不肯見機而去,如文種大夫, 畢竟為勾踐所殺。故此假說他成仙,不過要打動天地間富貴功名的人,處在盛滿之地 ,做個急流勇退的樣子,那有真正成仙的道理?我在一本野史上看見的卻又不同。 說這西子住居若耶溪畔,本是一個村莊女子。那范大夫看見富貴家女人打扮,調脂弄 粉,高髻宮妝,委實平時看得厭了。一日山行,忽然遇著淡雅新妝波俏女子,就道標 緻之極。其實也只平常。又見他小門深巷許多丑頭怪腦的東施圍聚左右,獨有他年紀 不大不小,舉止閑雅,又曉得幾句在行說話,怎麼范大夫不就動心?那曾見未室人的 閨女就曉得與人施禮、與人說話? 說得投機,就分一縷所浣之紗贈作表記?又曉得甚麼惹害相思等語?一別三年,在別 人也丟在腦後多時了,那知人也不去娶他,他也不曾嫁人,心裡遂害了一個癡心痛玻 及至相逢,話到那國勢傾頹,靠他做事,他也就呆呆的跟他走了。可見平日他在山裡 住著,原沒甚麼父母拘管得他,要與沒識熟的男子說話就說幾句,要隨沒下落的男子 走路也就走了。 一路行來,混混帳帳,到了越國。學了些吹彈欲舞,馬扁的伎倆,送入吳邦。吳王是 個蘇州空頭,只要肉肉麻麻奉承幾句,那左右許多幫閑篾片,不上三分的就說十分, 不上五六分就說千古罕見的了。況且伯嚊嚭暗裡得了許多賄賂,他說好的,誰敢不加 意幫襯?吳王沒主意的,眾人贊得昏了,自然一見留心,如得珍寶。古語云:「士為 知己者死,女為悅己者容。」那吳王既待你如此恩情,只該從中調停那越王歸國,兩 不相犯。 一面扶持吳王興些霸業,前不負越,後不負吳,這便真是千載奇傑女子。何苦先許身 於范蠡,後又當做鵝酒送與吳王。弄得吳王不理朝政,今日遊獵,明日彩蓮,費了百 姓貲財,造臺鑿池,東征西討,萬民皆怨。兵入內地,覷便抽身,把那個共枕同衾追 歡買笑的知己拋在東洋大海。你道此心如何過得?希圖回到越國,趁著半老丰姿,還 要逞出許多功勞,許多嬌愛,更要駕出越國夫人之上,受用不了。那知范大夫一腔心 事也是僥倖成功。萬一夫差是個精細的人,不聽伯嚭邪言,信著伍員的好語,也不見 得這個敗壞。又萬一暗裡圖謀,那勾踐一朝命短,十年生聚,十年教訓,雖有些工夫 也不到得這樣圓成。況且陰謀詭秘,有許多不可告人的話頭;下賤卑污,有許多令人 不忍見的光景。到那吳國殘破之日,范大夫年紀也有限了,恐怕西子回國又把舊日套 子,斷送越國,又恐怕越王復興霸業猛然想起平日勾當,有些不光不明,被人笑話。 況且范蠡出身,又是楚之三戶人氏,即今吳江縣地方,原自姑蘇屬縣。以吳之百姓為 越之臣子,代謀吳國,在越則忠,在吳則逆。越王雖在流離顛沛之中,那臣子的本未 、君臣的分際,卻從來是明白在心裡的。到了歸國時節,霸業復興,兵多糧足,別的 俱不在心上。 單單隻有這幾個謀國之臣懷著鬼胎,倘或猜忌之主,無心中有些觸犯,一朝追究,未 免害了自己的身家。故此陡然發個念頭,尋了一個船隻,只說飄然物外,扁舟五湖遊 玩去了。那五湖也只有七八百里開闊,難道人蹤跡不到的?後來人都說越王長頸烏喙 ,可與共患難,不可與共安樂。那知范大夫句句說著自家本相,平日做官的時節,處 處藏下些金銀寶貝,到後來假名隱姓,叫做陶朱公,「陶朱」者,「逃」其「誅」也 。不幾年間,成了許多家貲,都是當年這些積蓄。難道他有甚麼指石為金手段麼?那 許昧心腸,只有西子知道。西子未免妝妖做勢,逞吳國娘娘舊時氣質,籠絡著他。那 范大夫心腸卻又與向日不同了:與其日後洩露,被越王追尋起來,不若依舊放出那謀 國的手段,只說請西子起觀月色。西子晚妝纔罷,正待出來舉杯問月,憑弔千秋;不 料范大夫有心算計,覷著冷處,出其不意,當胸一推,撲的一聲,直往水晶宮裡去了 。正是:「只今惟有西江月,曾照吳王宮裡人。」』那後生道:『老伯說來差矣!那 范大夫湖心中做的事,有誰作證?你卻說他如此?』老者道:『我也不是證見,我也 不肯誣他。卻見《野艇新聞》有《范少伯水葬西施傳》,《杜柘林集》中有《洞庭君 代西子上冤書》一段,俱是證見。至今吳地有西施灣、西施浜、西施香汗池、西施錦 帆涇、泛月陂,水中有西子臂、西施舌、西施乳,都在水裡,卻不又是他的證見麼? 他若不葬在水裡,當時范大夫何必改名鴟夷子?鴟者,梟也。夷者,害也。西施一名 夷光。害了西施,故名鴟夷。戰國時孟子也說西子蒙不潔,人皆掩鼻而過。就是葬在 水裡,那不潔之名還洗不幹淨哩!』有一人道:『兄言之謬矣!從古來贊美西施的, 直把個天地間至妙絕佳的抗州一個西湖比他。蘇東坡題一首詩道:「水光瀲灩晴方好 ,山色空濛雨亦奇。欲把西湖比西子,淡妝濃抹總相宜。」如此說來,難道東坡不如 你的見識不成?』老者道:『這坡老看得西湖景致好了,沒得贊賞,偶然把個古來美 色的婦人比方,其實不是贊賞西子。其中還有一個意思,至今還沒一個人參透這段道 理:天下的湖陂草蕩,為儲蓄那萬山之水,處處年年,卻生長許多食物東西,或魚蝦 、菱芡、草柴、藥材之類,就近的貧窮百姓靠他衣食著活。唯有西湖,就在杭州郡城 之外,山明水秀,兩峰三竺高插雲端;裡外六橋,掩映桃柳;庵觀寺院及繞山靜室, 卻有千餘;酒摟臺榭,比鄰相接;畫船蕭鼓,晝夜無休。無論外路來的客商、仕宦, 到此處定要破費些花酒之資。 那本地不務本業的游花浪子,不知在內嫖賭蕩費多多少少。一個杭州地方見得如花似 錦,家家都是空虛。究其原來,都是西湖逼近郡城,每日人家子弟大大小小走到湖上 ,無不破費幾貫錢鈔。前人將西湖比西子者,正說著西湖無益於杭城,卻與西施具那 傾國傾城之貌有害吳國意思一樣。如今人卻重了東坡的纔名,愛看了西湖景致,不曾 參悟到這個所在故耳。只有一個推官胡來朝湖心寺柱上題一對聯,卻道破此意云:四 季笙歌,尚有窮民悲夜月;六橋花柳,渾無隙地種桑麻。 其餘題詠甚多,都是外處往來遊客暫時流寓,無非形容西湖佳妙之處,還要嫌憎那胡 推官道學氣哩。還有個小小故事說與你們聽了。近日吳中有個士夫,宦游經過越地, 特特買舟選騎,直到薴蘿山邊。看見山明水秀,游觀不盡,便哼哼的做起詩來,贊得 西子不知到甚麼天仙地位,還要尋個媒人選聘女子,依稀沾些西子風味回去。正在訪 問,那知走出一個鄉老來,說得極妙:「你道西子是個國色天香,當初乃是敝地一個 老大嫁不出門的滯貨,偶然成了虛名。若果然絕色奇姿,怎麼肯送到你下路受用!」 那士夫一個沒趣,即刻起身去了。』眾後生拍手笑道:『這老老,倒有志氣佔高地步 ,也省得蘇州人譏笑不了。』 正待走動,欲將蔬酒排下,吃個盡興。抬頭忽見天上烏雲西墜,似有『山雨欲來』之 狀,俱各搶地拱手,稱謝而散。 總評人知小說昉於唐人,不知其於漆園莊子、龍門史遷也。 《莊子》一書寓言十九,大至鵾鵬,小及鶯鳩、鷦鷯之屬,散木鳴雁,可喻養生;解 牛賙輪,無非妙義。甚至詼諧賢聖,談笑帝王,此漆園小說也。史遷刑腐著書,其中 《本紀》、《世家》、《表》、《書》、《列傳》,固多正言宏論,燦若日星,大如 江海,而內亦有遇物悲喜、調笑呻吟,不獨滑稽一傳也。如《封禪》,如《平準》, 如《酷吏》、《游俠》等篇,或為諷譏,或為嘲謔,令人肝脾、眉頰之間別有相入相 化而不覺。蓋其心先以正史讀之,而不敢以小說加焉也。即竇田之相軋,何異傳奇? 而《句踐世家》後,附一段陶朱;莊生入楚喪子之事,明明小說耳。故曰小說不昉於 唐人也。艾衲道人《閑話》二則日『水葬西施』,此真真唐突西施矣!然玩其序三代 事,皆讀史者所習曉,卻蒼茫花簇,象新聞而不像舊本。至於西施正傳,乃不徑接著 褒姒,反從他人說浣紗贊美西施,無心襯人,覼覼縷縷,將一千古美姝說得如鄉里村 婦,絕世謀士,說得如積年教唆。三層翻駁,俱別起波紋,不似他則一口說竟。解『 鴟夷』、解『夷光』、注西湖詩、談選女事,皆絕新絕奇,極靈極警,開人智蕊,發 人慧光。雖漆園、龍門,何以如此!唐人不得而比之。 第三則 朝奉郎揮金倡霸 朝奉郎揮金倡霸自那日風雨忽來,凝陰不散,落落停停,約有十來日纔見青天爽朗。 那個種豆的人家走到棚下一看,卻見豆藤驟長,枝葉蓬鬆,細細將苗頭一一理直,都 順著繩子,聽他向上而去,葉下有許多蚊蟲,也一一搜剔乾淨。那些鄰舍人家都在門 外張張望望,嚷道:『天色纔晴就有人在豆棚下等說古話哩,我們就去。』不多時就 有許多坐下,卻不見那說故事的老者。眾人道:『此老胸中卻也有限,想是沒得說了 ,趁著天陰下雨,今日未必來也。』內中一人道:『我昨日在一舍親處聽得一個故事 ,倒也好聽,只怕今日說了,你們明日又要我說。我沒得說了,你們就要把今日說那 老者的說著我也。』 眾人道:『也不必拘,只要肚裡有的便說,如當日東坡學士無事在家,逢人便要問些 新聞,說些鬼話,明知是人說的謊話,他也當著謊話聽。不過養得自家心境靈變,其 實不在人的說話也。』那人遂接口道:『我正說的就是蘇東坡。他生在宋朝仁宗時, 做了龍圖閣學士,自小聰明過人,凡觀古今書史,一目瞭然。看見時事紛更,權奸當 道--如王安石「青苗」等事,也不嘗要把話譏刺他或做詩打動他。聰明尖酸處固自 佔了先頭,那身家性命卻干係在九分九釐之上。倒不如嘿嘿癡癡、隨行逐隊依著仕路 上畫個葫蘆,倒得個一路功名,前程遠大,順溜到底。可見蘇東坡只為這口不謹慎, 受了許多波吒。一日在家睏頓無聊之極,卻向壁上題下一首詩來,說道:「人家生子 要聰明,我被聰明誤一生。但願吾兒愚且魯,無災無難到公卿。」就是這四句詩也是 譏嘲當道公卿的話,卻是老蘇的舊病,不在話下。後來又有個老先生於仕途上不肯通 融,屢遭罷斥,看見那聰明伶俐的做了大官,佔了便宜,也向壁上學那東坡題下四句 道:「只因資稟欠聰明,卻被衣冠誤此生。但願我兒伶且俐,鑽天驀地到公卿。」此 一首詩似與坡公翻案,然而譏誚當道亦與坡老相同,只好當個戲言。難道人家生的兒 子聰明伶俐就是好的不成?也有生來不聰不竣不伶不俐,起初看來是個泥團肉塊,後 來交了時運,一朝發作起來,做了掀天揭地事業、拜將封侯的。譬如三國時有個孔文 舉,年方十歲,隨著父親到洛陽任所。那時有個司隸校尉李元禮,極有名頭,大官府 要去見他,無論本官尊重,那門吏也十分裝腔作勢,一時難得通報。 彼時文舉乃十歲小兒,大模大樣持了通家稱呼的名帖,來到李府門上,說道:「我是 李府通家。」門吏看見小小聰俊孩兒,即與通報。後來李公接見,問道:「足下與我 那裡通家?」那孔文舉不慌不忙,從容對道:「昔先人仲尼與尊公伯陽有師友相資之 誼,在下與老先生就是奕世通家也。」許多賓客在座聽了,各各稱奇。彼時座中有個 陳建,最後方來,李元禮將此言說與陳建,陳建便道:「小時雖則聰明,無不了了, 大來未必果佳。」文舉應聲說道:「看來老丈小時定是聰明,無不了了的了。」滿座 之人俱各笑將起來,稱道:「如此聰明,異日不知至何地位!」那知這張利嘴人人忌 刻,後因父親朋黨之禍,畢竟剪草除根了。 可見小時聰明太露,乃是第一不妙的事。』如今再說一個小時懵懵懂懂,後來做出極 大的功業,封了極大的爵位,纔是奇哩! 此人出在隋末唐初,正當四海鼎沸之際,姓汪名華。初時無名,只有小字興哥。祖居 新安郡--如今叫做徽州府--績溪縣樂義鄉居祝彼處富家甚多,先朝有幾個財主, 助餉十萬,朝廷封他為朝奉郎,故此相敬,俱稱朝奉。 卻說汪華未生時節,父親汪彥是個世代老實百姓,十五六歲跟了夥計學習江湖販賣生 意。徽州風俗,原世樸實,往往來來只是布衣草履,徒步肩挑,真個是一文不捨,一 文不用。做到十餘年,刻苦艱辛,也就積攢了數千兩本錢。到了五旬前後,把家貲打 總盤算,不覺有了二十餘萬,大小夥計就有百十餘人。 算帳完了,始初喜喜歡歡,舉杯把盞,飲至半酣,忽然淚下。 眾夥計問其原故,那汪彥道:「我也不為著別的,只因向日無子,從南海普陀洛迦山 求得一子,叫名興哥。看來面方耳大,也成個人形,其如呆呆癡癡,到了十五歲,格 格喇喇指天劃地,一句說話也不明白,卻似啞子一般。遇著飲食,不論多少,好像肚 內有熱爐熱灶,無有不納,豈不是個焦員外的令郎、胡永兒的丈夫?雖掙了潑天傢俬 ,也是一盤瞎帳。」說畢便淒悽慘慘、嗚嗚咽咽哭將起來。夥計中有那當心的上前勸 慰寬心,有勸到揚州、蘇州再娶一妾,另生幾個好的;有拿酒復來相勸,猜拳行令的 ,都也不在話下。臨了來有個老成的夥計,走近前來,說道:「老朝奉,不消著忙, 明年小主十六歲了。徽州俗例,人到十六歲就要出門學做生意。我看小主雖則不大言 語,心中也還有靈機,面貌上也有些福氣,不若撥出多少本錢,待我幫他出門學學乖 ,待他歷練幾年就不難了。」一面就與興哥說知,興哥也就把頭點了幾點。眾夥計盡 道:「小朝奉心裡是明白的,不難!不難!」俱各散訖。』到了次年正月初一日,眾 夥計會同拜年吃酒,中間老成的夥計也就說起小朝奉生意的事。 汪彥道:「他年小性癡,且把三千兩到下路開個小典,教他坐在那裡看看罷了。」約 定二月起身。 言之未已,那興哥斯斯文文立起身來,卻明明白白說道:「我偌大傢俬,唯我一個承 載,怎麼止把三千兩與我,就要叫找出門?卻是不夠!」眾盡駭異。連那老朝奉聽了 也不覺快活起來,接口連聲說道:「果然奇了,也說的話公然不差!想是福至心靈了 。」滿堂人俱各稱羨,只待二月初頭整備行李,拜別父母起身。汪彥占卜得往平江下 路去好。那平江是個貨物馬頭,市井熱鬧,人煙湊集,開典鋪的甚多,那三千兩那裡 得夠? 興哥開口說:「須得萬金方行,不然我依舊閉著口,坐在家裡。」那老朝奉也道:」 他說得有理。」就湊足了一萬兩。未免照例備了些醃菜乾、豬油罐、炒豆瓶子,歡歡 喜喜出了門。那老夥計已預先託人把鋪面房屋、招牌、架子、家夥什物俱已停當,揀 了黃道吉日開張,掛得一面招牌。就有一個人拿著十個盒子進來,說道:「賀喜!賀 喜!願小朝奉開典鋪,就趁了十對盒利錢,權且當銀十兩做個采頭。」小朝奉聽見說 得快活,他道:「我也不要你的盒子,送你二十兩,酬你這個好意。」那夥計道:「 小朝奉不可聽他!這是從來市井光棍打抽豐、討采頭,都是套子,不可與他!」小朝 奉道:「第一次也讓我一個順利。」夥計就閉口了。不多時,又見一伙衣冠濟楚,捧 著表禮走將進來,看名帖上整齊數來四十位,道是上下排鄰,聞得朝奉開當,各人備 了一兩分資外,又添出五分,備了花紅糕酒,都來賀喜。 那夥計們少不得請出興哥來做主人,眾鄰舍俱各唱喏稱賀,分賓坐了,奉茶而別。興 哥回轉身,欣欣喜色,對眾夥計道:「怪不得老朝奉卜得此地開典好,就是這鄰舍高 情卻難得的。」一面就把那封的分資扯開兩個,眾夥計上前把手按住道:「這是套禮 ,收不得的。過日備戲設席請他後就返璧了。」興哥道:「方纔二十兩出門,今就有 四十兩進門,就是對合利錢佳兆,如何方纔當盒子的不要賞他!」說畢,仍舊把眾分 一卷拿了進去。急得眾夥計沒些布擺,只是叫苦。少刻,喚一個小郎進去,興哥打開 銀庫,揀出十兩一錠的銀子,齊齊整整封作四十封,一面換了衣服,備了名帖,走出 鋪中,說:「我如今要答拜了。」眾道:「四十封銀為何?」興哥道:「陌生所在, 難得他們盛意,備禮答他。」眾夥計道:「只消費二十兩一席戲足夠了,如何要這許 多?」興哥道:「你們只曉得小家子局面,既在他地方開鋪賺錢,就要結識地鄰,日 後有些事情也得便宜。自古道,他敬我一尺,我敬他一丈。這十兩頭也只照歷來規例 ,亦未見得從厚。」言畢徑出門去,各家一一送了。那些鄰舍個個喜歡,人人快活, 稱道:「小朝奉是個大方。」那些夥計齊齊嘆氣跌腳,只好付之無可奈何。興哥拜完 客,回到鋪中坐著,忽見一人牽著匹馬進門道:「在下是個馬販子,販了二十匹馬來 ,馬價都是百金一匹的。遇著行情遲鈍,眾馬嗷嗷,只得將一匹來寶鋪,當五十兩買 料。賣出依舊加利奉贖。」興哥心中愛著駿馬,一眼看了就笑起來,那夥計道:「開 口貨從來不當,出去!出去!」興哥道:「省會地面馬也是要用的,若不當與他,那 四十九匹都餓死了,豈不可憐!」說畢就進裡邊去。那夥計越發回他,那馬販蜘躕半 晌,只要候小朝奉出來討個下落。那知不多時,興哥捧出元寶兩錠,就招馬販進中門 遞與他。馬販說:「當一錠夠了。」興哥說:「你辛苦來此,須要趁錢方好。如何百 金的價止當五十兩?卻不折了本麼。快去!快去!」那馬販倒地四拜,稱謝恩主而去 。眾夥計尚自不知,興哥又到鋪內坐定。又見一個窮人手拿鐵鍋一隻,夥計上帳當去 三錢。纔出門去,興哥把頭一側,想道:「這個窮人家裡不過一隻鍋子,將來當了, 老婆在家如何煮飯?三錢銀值得恁麼?」便走出鋪來,提了鍋子出門就上了馬,一溜 煙追去。畢竟尋著那個窮人還了他去。 鋪中眾人沸沸的說起方纔當馬之事,又吃了一驚,只等興哥回,大白日裡就把當門關 上,接著興哥到廳上。眾夥計一齊依次坐下,老夥計道:「小主人,你從幼未經出門 ,你的身命干係都在我們身上,就是一萬兩本錢也是在老朝奉面前包定加三利息來的 。纔得一二日,如此顛顛倒倒,本錢倒失去了一大塊,將來怎麼算帳?」興哥道:「 不難,不難。若說加三利息,你們眾人就提了三千兩去,餘下本錢聽我發揮罷了。你 們眾夥計舊規俱已曉得,不過以舊抵新,移遠作近,在日用使費上扣刻些須,當官幫 貼中開些虛帳,出入等頭銀水外過克一分,掛失票、留月分、出當包、討些酒錢,就 是你們伎倆,這都不在我心上。你們要去就去,難道我迷失了路頭不成?」眾人被他 數落,頓口無言。那老者諒來不可挽回,同眾人備細寫了稟帖,第二日就回徽州報信 去了。興哥看見老者去了,心中不覺又鬆了一鬆。不久傳聞出去,那些鄰舍也都裝了 套子,或有說官司連累、急急去救父母的,或有說錢糧拖欠、即刻去比卯救家屬的, 或有說父母疾病臨危、要去調治結果的,或有說修蓋廟宇、砌造橋樑,一時工錢要緊 的。興哥一一都不要當頭,悉如來願,應手給散去了。不一月間,那一萬兩金錢俱化 作莊周蝴蝶。正要尋同鄉親戚寫個會稟接來應手,那老朝奉風快的到來,進門前後一 看,叫屈連聲,揪著興哥就打。興哥只是嘻嘻笑道:「人若不把錢財散去,老朝奉在 家只消半間草屋,幾件布衣,數擔粗米,一罐豬油,就夠一生受用,何必艱難險阻, 一一搬到土窖中藏著,有何享用?」老朝奉聽了又氣又惱,晚年止得此子,也無可奈 何。次日即收拾行李,退還房屋,一伙回家去了。就把興哥關閉一室,不許在外應酬 。』不覺過了四五個月,不知那裡尋得五千青蚨,把家中做生意的夥計都送一百文, 按月要收二百文。眾人在他門下也就胡亂送些與他,不半年也就積起三萬上下。老朝 奉知道,說「此子如今曉得生放利錢,比當初大不相同。」興哥只做不知,終日在私 下盤放錢債。老朝奉一日道:「你既知積財當積的,何不再拿一萬出門去?」興哥道 :「前番一萬胡亂散去,如今卻要多些,刻苦翻轉那一萬本來纔好。」老朝奉道:「 說得有理。」問道:「依舊開當罷?」興哥道:「典鋪如今開的多了,不去做他。須 得五萬之數,或進京販賣金珠,或江西澆造瓷器,或買福建海板,或置淮揚鹽引,相 機而行,隨我活變。再不像前番占卜到平江府做的故事也!」老朝奉聽了,爽快就兌 下五萬兩,選下八個家人,仔細包包裹裹,共有三十擔行李。興哥依舊騎著那馬,瀟 瀟灑灑起身,同管家在路上商量得明州曬白鯗生意絕好,徑往明州進發。 訪得浮橋外下塘街有幾家大財主經紀,可以安身,就在他家住下,安頓行李。那知這 曬鯗生意三月中方得通行,興哥卻早到半月。下處甚是寂寞,帶了幾個家人且到洛迦 山遊玩數日。一者進香,再者觀海,亦是暢事。那山上清淨道場並無俗客。次日單身 步月而行,不覺信步一直到那釣鼇磯上,對著汪洋大海盤膝而坐。月色正中,海氣逼 得衣袂生涼。正待回步,忽見磯邊樹林影裡走出一人來,興哥也道:「奇怪,奇怪! 」依舊坐下。 那人將到面前,興哥看見,唬了一跳。看那人時,生得好生怪異:只見兩隻突眼,一 部落腮。兩鬢蓬鬆,宛似鍾馗下界;雙眉倒豎,猶如羅漢西來。雄糾糾難束纏的氣岸 ,分明戲海神龍;意悠悠沒投奔的精神,逼肖失林餓虎。 興哥上前將欲迎他,他卻高足闊步,全不相照,竟靠在一塊凌空奇峭石崖嘴上,大叫 一聲道:「老天,難道我老劉就罷了不成?安得五萬金,成我一天大事也!」興哥聽 見說得奇異,上前問道:「君家於此地要這五萬兩何用?」那漢把眼一橫道:「乳臭 小子,那知我事!」興哥道:「我非乳臭,足下亦不免為田舍翁。看得五萬金恁難得 也。」那漢一聞此言,便回身下拜道:「我誠小人,不識君家何以應我。倘能周旋, 明年此月此日,仍納於此地。還君十萬,不食言也。」興哥道:「去此不遠,我當為 君謀之。」即相拉下船,隨從約有十五六人,一徑回到下處。請出主人,喚小郎們搬 出行李,將五萬兩一一交付那漢收去。那漢道:「足下此馬無甚用處,一井付我馳去 ,異日仍以此馬還君。」興哥連忙解轡送他。兩人拱手而別,並無他言。 主人與小郎在側看了,心目俱呆,不知甚麼來歷。 主人只道是洋裡捕魚客人或是沿海衛所經紀,也都只在那曬鯗的生意上作想。問道: 「此君何姓何名?住居何處?」興哥道:「我也不知。」即便叫小郎們收拾回去。小 郎道:「官人此來為何?」興哥道:「此番生意對本利錢,甚是省力爽快。」小郎也 只得隨口含糊謝別主人,依著路回去。總來不及兩月,已到家裡。老朝奉問道:「甚 麼生意回身得快?」且見行李輕鬆,吃了一驚。興哥道:「對年對月對本利錢,也是 順利的了。」老朝奉仔細問其下落,並無一字回答。問及小郎,那小郎拿指頭指著道 :「只去問他,我們一毫不知。」那老朝奉急得心躁,興哥且自意氣揚楊,指著前邊 該造大廳,指著後邊該造大園,不癡不顛,說來的都是迂闊之論。老朝奉揪發亂打, 興哥嘻嘻道:「不要難為了十萬貫的財主,且自耐煩到了明年此時,若無本利到家再 吵再鬧也未遲哩。」老朝奉只索忍氣吞聲,且自排遣過去。』不覺倏忽已到次年二月 初邊,老朝奉便要催他起身,興哥道:「不消早去,只要此月、此日、此夜到那此地 便了。」果然俟到邊際,興哥束裝前往。先一日已到彼處,暫借僧房歇下。到那晚上 ,依舊單身坐在釣鼇磯上。黃昏已過,二更悄然,將及三更,那樹影裡果見一人大踏 步走上磯來,叫道:「思兄何在?」興哥向前相見,把臂道:「真信人也!去年所事 如何?」那漢道:「多承恩兄慷慨施助,將這五萬銀子即在沿海地方分頭糴得糧食, 接濟六郡義師,方無脫巾之變。幸叨天庇,自去年四月起兵,所到之處,猶如破竹。 今總計之,閩粵以及浙西已得三十郡縣,那海中倭夷島寇歸併百十餘處,令海中所稱 海東天子劉琮即弟也。去年潛身上普陀窺探,亦因營中缺乏糧食,欲向洛迦僧房借些 佈施,不料大大叢林也就荒涼這個模樣。敢問恩兄高姓大名?」興哥道:「山野鄙人 ,毫無施展,留此姓名為何?」劉琮道:「一言相許,五萬銜恩,屍以祝之,猶難為 報。何姓名之見吝也?」興哥遂將姓名、住居一一道破。不料從旁扈從的人早已聞報 ,一面將十萬金錢差人送至徽州汪宅去矣。興哥一些不知,這是後話未題。且說劉琮 邀了興哥,搬了行李,到得河口,艤舟相待。不一時間,到了大港,卻有數十彩鷁鱗 次而集,旗幟央央,就有許多披甲荷戈的,整齊環列。 劉琮扶了興哥過船,便令發擂鳴金,掛帆理幟,出洋而去。未及五更,大洋中數萬艨 艟巨艦,桅燈炮火震地驚天,到了大船即喚出許多宮妝姬嬪,匍伏艙板之上,齊稱恩 主,不減山呼。 興哥也不自覺,如在雲夢之際。一面開筵設席,極盡水陸珍饈;一面列伍排營,曲盡 威嚴陣勢。異方音樂,隊隊爭先;海外奇珍,時時奏獻。興哥整整住了十餘日,即欲 辭歸。那劉琮苦苦相留,情難被袂,心知興哥不能再住,一邊備了船隻,逐程相送; 一邊捧出蓋世奇寶,舉以相贈。興哥眼也不看,一概固辭。劉琮道:「此非酬報恩兄 之物,聊伸萬一之敬。今既不受,弟有錦囊三個,異日要緊之際開看便得。此時未可 預洩其機也。」興哥再拜,受之而別。一路歸家,也不知劉琮將錢十萬早已送到家下 ,不題老朝奉喜得不了。』且說興哥依舊瀟瀟散散而回。老朝奉聞得興哥回來,舉家 迎接。一門勢利都來道喜。興哥心已知之,絕不露一毫於顏色。 那些積年夥計俱來備席接風,興哥也一家不領,每人卻送青蚨五萬文,以償日來相與 之意。卻在後園造起百尺高臺,做那觀星望氣的勾當。耳邊廂聽得道路傳聞,說海東 天子佔了某州某縣,漸漸逼近徽州,人頭上荒荒亂亂,俱作逃竄之計。興哥道:「此 時事勢已急。」開一錦囊看時,如此如此。彼時隋朝既滅,唐主登基。興哥即便具了 一道章疏投在節度使李冕衙門,求其代為申奏。自認團練義兵三千,不費朝廷一文一 粒,保障一方,直待平定之後方受朝廷封賞。李節度正在求賢枯渴之際,得此一疏, 即便轉奏,奉了唐皇新旨,暫授南路總管之職,聽其便宜行事。興哥整師振旅,即使 起行,駐師溫、睦之間。那些倭夷島寇不奉正朔,聽得義師初集,即便整兵秣馬,一 擁前來,把那興哥全營密密層層圍得鐵桶相似。正在危急,再拆一個錦囊看時,他便 營中立起十丈高竿一面黃旗,上書「海東十三路水陸全師都總管汪」。外邊這些島夷 看見旗號,許多頭領即便把旗從左一招,兵分四路,左右前後屯扎住了。不多時西南 角上一隊兵馬約有百十餘人,牽著白馬一匹,飛星相似,直奔前來。一人口稱「奉海 東天子命令,特送白馬奉還恩主汪老爺的」。營中接應報去,即令先鋒出來接了來書 ,驗看明白,果是當初之馬。此馬渾身雪白,背上前後卻有黑斑二十四點,喚名葡萄 雪,乃是一匹龍馬。始初當在鋪中,興哥原是愛上他的,卻叫不出他的名色。自從劉 琮借去,一到海濱如魚得水,劉琮騎了他,到處成功。海東一帶地方都認得一條白龍 現世,不但人人畏懼,就是萬馬見了亦個個攢蹄委鼠,無不懾服他的。 興哥騎了此馬,那沿海地方都認做劉老爺領兵到來,處處擺圍迎接,俱應慇懃,不煩 一矢,俱已貼然歸順。始初止得義兵三千,不及一載已就招徠有五萬之眾。俱是劉琮 有令在先,要讓漳南十鎮報他做個絕世奇功。不料第三年間,天時亢旱,師次建南, 米價騰湧,至六兩一擔。人民洶洶,軍士嗷嗷,朝暮將有不測之變。興哥心急,又將 一個錦囊拆看,卻也正為此著。 即傳令沿海烽臺俱將白帶號旗掛起。海上哨探小卒不日報知劉琮,即便傳令速備糧米 五百萬石,沿海前來接濟。軍民歡聲振地,一路太平。兵馬已抵漳南大鎮,建牙開府 ,大布雄威。節度藩鎮屢屢奏有奇功,不時頒有欽賞,官爵加封至吳國公,袞衣玉帶 ,賜尚方劍,便宜行事,不啻天子行為。正在熱鬧之際,一日劉琮連宗千號,直進南 海小洋,要與吳國公相會。吳國公開營列隊,倍加整肅威嚴,一如前日劉琮相見故事 。酒至三巡,劉琮即問:「恩兄自前歲出山,聞得尚未娶有尊嫂。若不相棄,舍妹年 已及笄,情願送來,以備箕帚。」吳國公見說,遜謝不敢。劉琮決意再三,吳國公道 :「婚姻大事,在家入告父母,身在海外當奏明朝廷方敢應允。但弟又有一說,既與 吾兄結為姻親,方今聖天子正位之初,四海聞風向化。吾兄與其寄身海外,孰若歸奉 王朔?在內不失純臣之節,在外不損薄海之威。 朝廷不疑,海邦安枕,此亦立身揚名之大節也。」劉琮連聲允諾。即日齊集兩邊營內 頭目,設備太牢大禮,歃血盟心,一面賫修降表,一面保奏投誠。此時正是大唐武德 四年,天子御覽奏章,龍顏大喜,特旨差內翰官一員沿海宣揚德化,大頒欽賞,進爵 封為越王,賜名汪華,命欽天監擇日完姻。劉氏封為安海郡君,金書鐵券世襲王爵, 追封五世。劉琮賜爵為平海王,永鎮海東。汪劉兩家世世婚姻不絕,直終唐代,克盡 臣節,以為千秋美談。』眾人道:『今日這位朋友說這故事,更比尋常好聽。不意豆 棚之下卻又添了一位談今說古、有意思的人也。』 那人道:『在下幼年不曾讀書,也是道聽途說。遠年故事,其間朝代、官銜、地名、 稱呼,不過隨口揪著,只要一時大家耳朵裡轟轟的好聽,若比那尋了幾個難字、一一 盤駁鄉館先生,明日便不敢來奉教了。』眾人道:『太謙,太謙!尊兄口比懸河,言 同勒石,胸中必多異聞異見,正要拱聽。』各各稱謝而去。 總評讀此一則者,不可將愚魯、伶俐錯會意了,就把汪興哥看作兩截人。其所以呆癡 啞巴,萬金散盡,正其所以保五州、封越國根基作用也。天下奇材大俠,胸徹萬有, 心中具不可窺測之思,觀人出尋常百倍之眼。一言一動,色色不欲猶人,況區區守錢 之虜、賣菜之傭,錙銖討好,尤其所鄙薄而誹笑之也久矣。如隋末兵亂,世事可知, 不能為唐太宗,則為錢武肅。 若虯髯海外,又是一著妙棋,彼固不屑為北面事人之輩者也。 處此亂世,倘不克藏身,露出奇材大俠,非惟無可見長,抑且招禍。即五代歙人汪臺 符,博學能文章。 徐知誥出鎮建業,臺符上書陳利病,知誥奇之,宋齊丘嫉其纔,遣人誘臺符痛飲,推 石城蚵皮磯下而死。此不能呆癡啞巴之驗也。篇中摹寫興哥舉動,極豪興、極快心之 事,俱庸俗人所為懮愁嘆息焉者。孰知汪君等算然,掀天揭地,已如龜卜而燭照之矣 。錦囊一段波瀾,固是著書人寬展機法耳。此則該演一部傳奇,以開世人盲眼,當拭 目俟之。 第四則 藩伯子破產興家 『陶淵明詩云:「種豆南山下,草盛豆苗希晨興理荒穢,帶月荷鋤歸。」不論甚麼豆 子,但要種他,須先開墾一塊熟地,好好將種子下在裡邊。他得了地氣,自然發生茂 盛。望他成熟,也須日日清晨起來,把他根邊野草芟除淨盡,在地下不佔他的肥力, 天上不遮他的雨露,那豆自然有收成結果。譬如人生在襁褓中,要個正氣的父母教訓 ,沒有什麼忤逆不孝的樣子參雜他;稍長時,又要個正氣的弟兄扶持,也沒有什麼奸 盜詐偽的引誘他,自然日漸只往那正路上做去。小時如此,大來必能成家立業,顯親 揚名,一代如此,後來子孫必然悠久蕃盛,沒有起倒番覆,世世代代就稱為積善之家 了。再沒有小時放闢邪侈,後來有收成結果的,也沒有祖宗行勢作惡,子孫得長遠受 用的。 古語云:「種瓜得瓜,種豆得豆。」分明見天地間陰陽造化俱有本根,積得一分陰鯫 纔得一分享用,人若不說明白,那個曉得這個道理?今日大家閑聚在豆棚之下,也就 不可把種豆的事等閑看過。』內中一人上前拱手道:『昨者尊兄說來的大有意思,今 又說起,這般論頭也就不同了,請竟其說。』這位朋友反又謙讓一回,說道:『今日 在下不說古的,倒說一回現在的,說過了也好等列位就近訪問,始知小弟之言不似那 蘇東坡「姑妄言之、姑妄聽之」一類話也。且將幾句名公現成格言說在前邊當個話柄 ,眾位聽來也有個頭緒。你道那格言是何人的?乃是宋朝一位宰相姓司馬,名光,封 為溫國公,人俱稱他做司馬溫公。曾有幾句垂訓說道:「積金以遺子孫,子孫未必能 守;積書以遺子孫,子孫未必能讀;不如積陰德於冥冥之中,以為子孫長久之計。」 他這幾句不是等閑說得出的,俱是閱歷人情,透徹世故,隨你聰明伶俐的人,逃不出 他這幾句言語。譬如一個王孫公子,他家的金銀擁過北斗。後來子孫不知祖父創業艱 難,只道家家都是有的,不當錢財,當費固費,不當費也費,繩鋸木斷,水滴石川, 只自日漸消磨,不久散失,如何守得他定?「子孫未必能守」正謂此也。又道:錢財 易於耗散,囤在那裡惹人看想。功名富貴都是書香一脈發出來的,不如積下些千古奇 書,子孫看了,一朝發跡,依舊起家;倒不比那積金的,又悠久穩實些?那知富貴之 家享用太過,生的子孫長短不齊,聰明的領會得來,依舊得那書的受用;那愚蠢的生 來與書相忤,不要說不去讀他,看見在面前就如眼中之釘,急急拔去纔好。 或者一大部幾十套的,先零落了幾套;幾十本的,先損壞了幾本。或者內庫纂修,或 者手抄秘錄,人所不經見的,也當尋常《兔園冊》、雜字本兒一樣,值十兩的不上二 三,值二三兩的不消三五錢,也就耗散去了。 又或被幫閑蔑片故意雜亂拆開,說道:「這書是不全的,只好做紙筋稱掉了。」他倒 暗暗做幾遭收去,卻另輯成全部,賣了等段銀子。看將起來不惟不能讀,就是讀字半 邊了,賣也未必能賣了。 故此溫公只要勸人積些陰德,在於人所不知不覺之處,那天地鬼神按著算子,壓著定 盤星,分分釐釐,全然不爽,或於人身,或於子孫,一代享用不盡的再及一代,十代 享用不盡的再及生生世世,不斷頭的。只要看那積的陰鯫厚薄何如,再不錯了一人、 誤了一人。此事向人如何說得明白?連自己也全然不知,或一代就有報應的,或有十 餘代方有效驗的。總之冥冥中自成悠遠,不是那電光池影,霎時便過的事也。話亦不 要說得長了,在下去年往北生意,行至山東青州府臨朐縣地方,信著牲口走到個村落 去處。只見灌木叢陰之中,峻宇如雲,巍牆似雪,飛甍畫棟,峭閣危樓,連著碧沼清 池,雕欄曲檻,令人應接不暇。那周圍膏腴千頃,牲畜成群,也都沒有數目。 此時在下也因日色正中,炎暑酷烈,就在近處一個施茶庵內憩息片時。問著一個憎人 :「此是何宅?」那僧人笑了一笑,兩頭看見沒人,答道:「此是敝檀越閻癡之宅。 這些光景都是癡子自掙來的。」我道:「既癡怎能到這地位?」僧人道:「這話長哩 。居士要知,請進裡邊坐下,吃些素齋,從容說來,倒也是一段佳活。」在下隨著長 老進了齋堂,重複問訊,敘坐一回。奉茶將罷,僧人指著佛前疏頭,道:「此疏就是 檀越大諱,姓閻名顯,今年五十三歲了。他父親名光鬥,是萬曆初年進士,少年科第 ,初為崑山知縣,行取吏科給事。資性敏捷,未經行取時節,做官倒也公道。自到了 吏科,入於朋黨,挺身出頭,連上了兩三個利害本章。皇帝只將本章留中不發。那在 外官兒人人懼怕,不論在朝在家,天下的貪酷官員送他書帕,一日不知多少。到後來 年例轉了浙江方伯,放手一做,扣克錢糧,一年又不知多少。朝中也有看不過的,參 了一本。他就瀟瀟灑灑回來林下。初時無子,也還有鬆動所在。自從得了癡子,只道 掙的家當付託有人,那刻薄尖酸一日一日越發緊了。每日糾集許多游手好閑之徒,逐 家打算。早早的起身到那田頭地腦,查理牛羊馬匹、地土工程。拿了一把小傘,立於 要路所在,見有鄉間財主、放蕩兒郎,慌忙堆落笑容,溫存問候,邀人莊上吃頓小飯 ,就要送些銀子生放利息,或連疆接界的田地就要送價與他。莊客一面騙他寫了賣契 ,一文不與,日後遇著,早早避進去了。不五六年,地土房產添其十倍。公子到得十 歲,那方伯公一朝仙逝去了。留的家當都是管家平分的平分、克落的竟克落了。平素 那些親眷都是被他斲削的,在旁冷眼相覷,並無一人來管著他。夫人請了一位先生教 他讀書,指望他進學,也好保守家當。那知文理不通,連那縣考也不能取一名。公子 一般也曉得榮辱所關,拿了幾兩銀子央人送考,那親眷朋友正欲哄他,那有一人幫襯 ?不覺已到十七八歲,自己也覺有些忿悶。』 一日改換衣裳,直到五六十里之外,仔細探聽自的家世如何如何。卻見三四人坐在樹 下,一人嚷道:『閻布政這樣聲勢,如今卻也報應了!』公子聽聞此言,也就挨身坐 在旁邊,徐徐問道:『閻鄉宦住在那裡?』那人道:『住在城裡。』公子道:『他家 做官的雖死,卻也無甚報應去處。』那人道:『你年小不知。』 把當初吞佔的聲勢、騙哄的局面、盤算的計較,每人說了許多。 臨後一人說到傷心之處,恨不在地下挖那做官的起來,象伍子胥把那楚平王鞭屍三百 纔快心滿意哩。那公子驚得心瞪目呆,往家急走。嘆氣道:『我父親如此為人,我輩 將來無噍類矣!』 一面喚了幾個管家,一面喚了許多莊頭,將那地土字號人戶一一開出,照名檢了文契 ,喚了一個蒼頭,自家騎匹蹇驢,挨家訪問,將文契一一交還,那人感謝不荊不半年 ,還人地土也就十分中去了五分。那些年遠無人的依舊留下。無心讀書,日逐就有許 多幫閑篾片看得公子好著那一件,就著意逢迎個不了。 一年之間,門下食客就有百餘人。跟隨莊戶拿鷹逐犬、打彈踢球、舞槍使棒的,不下 二三百。一日天雨,在家無事,喚一評話先兒到來,叩了一首,手中擎著一尾鮫魚上 獻,公子喚廚司收去不在話下。彼時五月天氣,東海鮫魚卻是時物,每一尾值錢千文 。那先兒虔心覓得,指望打一個大大抽豐。卻見公子全不介意,心中十分委決不下, 說得幾句,便道:『公子,小人所奉之魚卻是致心覓來,此時趁鮮餐用方好。』公子 又不理論,先兒又勉強說了幾句,又把那魚提起。公子即便封銀五兩賞賜先兒,又著 人捧著一個大盒,叫那先兒且去。出門看時,卻有十餘尾鮫魚在內,纔見他家動用, 不是小人意見度量得的了。 老夫人及娘子看見公子浪費不經,再三勸化,公子道:『家中所費值得恁的!清明時 節南莊該我起社,你們上下內外人等乘著車子隨著驢馬來看鄉會,纔見我費得有致哩 !』至日,夫人娘子果到莊上。公子早已喚人搭起十座高臺,選了二十班戲子,合作 十班在那臺上。有愛聽南腔的,有愛聽北腔的,有愛看文戲的,有愛看武戲的,隨人 聚集約有萬人。半本之間恐人腹枵散去,卻抬出青蚨三五十筐,喚人望空灑去。那些 鄉人成團結塊就地搶拾,有跌倒的,有壓著的,有喧嚷的,有和哄的,拾來的錢都就 那火食擔上吃個饜飽,謂之買春。那戲子出力,做到得意所在,就將綾錦手帕、蘇杭 扇子擲將上去,以作纏頭之彩。他在中間四面臺上,頭戴逍遙巾,身披鶴氅,左右青 衣捧茗、執拂,不住口笑嘻嘻,總要買春場上繳萬人個個得些歡心而去。不曉得他心 事,卻說閻布政該有這個散子。那知公子之心,只因當日種了許多毒孽,只當向怫前 拿些果品蔬菜,小小懺悔而已。夫人娘子見此光景,各各心中忿忿,趁早將些細軟之 物藏之別室,以作後日章本。一日早上,正喚家人抱了氈包,持了名帖,上了油壁香 車,出門拜客,卻見大門背後遮遮掩掩,欲前不前,欲止不止,公子道:『那大門外 是甚麼人?』著人去看,只見一個秀士,頭戴折角歪巾,身穿敝衣,足踹草履,菜色 鳩形,上下氣力兩不相接,一息奄奄,似將委填溝壑之狀。 公子連忙下轎,著人扶將過來,一手攙扶,直到大廳之上。從容施禮,分賓而坐。公 子就問道:『先生尊姓大號?有何賜教?』 那人徐徐道『不才姓劉,今年二十三歲,府城益都縣庠生也。』袖中慢慢摸出一帖來,寫著『眷晚弟劉蕃頓首:拜』,公子接著道:『怎麼敢當晚字 !』劉蕃道:『今因科考失利,染了一疾,遂爾伶仃,止有老母在家,餤粥不給。今 日纔好舉步匍匐而來。 聞先生意氣豪華,願投門下做個書記。也不敢有所奢望,只願隨從眾食客之後,派些 小小執事,望得老母三餐周全,意願足矣!』公子道:『做門下之客皆菜傭屠狗之輩 ,何可以辱明公!今既扶恙而來,且在荒齋慈息數日,老伯母處,弟更設處便了。』 一面喚小廝打掃書房,請劉相公住下,即備上等供給,小心伺候。 此時也是劉蕃時運到來,亦是公子具眼能於風塵中識得豪傑,即喚家下老僕:『可備 五百金,以三百為劉母壽,以二百為劉蕃覓一佳配。』不兩月間,劉蕃保養得白白胖 胖。 忽一日,南莊上人來報道:『昨夜三更時分有三五十人,明火執仗,打入莊門,將莊 上當下客人布疋約有百十餘筒捆載而去。莊丁持械追趕上前,眾盜丟棄一半。有一個 生得極長極大,膂力過人,只因天黑路迷,陷在古井之內,眾人協力擒拿在此,只候 公子送官處治。』用命莊丁各各請賞,公子一一喚進,細細問個明白,即書小票,仰 莊頭將奪回布疋照名給散,還免本丁租糧五石,散訖直到黃昏之際。然後帶那所獲之 盜過來,將燈照看。公子忙道:『快快將他鬆了。取件衣服過來教他穿上;取些酒食 ,請他到後軒坐定。』那漢再三負慚,連稱:『不敢!』公子道:『如此好漢到我地 方,我竟不能周旋,致使汝輩乾此不良之事,皆我罪也!看汝一貌堂堂,富貴只在旦 晚,何不奈煩至此。』忙取白金三百兩,一盤托出,送與那漢。那漢惶愧伏地,不敢 仰視。公子心內想道:『左右人多,恐有識認,未便承受。』連將左右叱退,婉言遜 語勸化他:『從此做個好人,莫與此輩為伍。』也不去問他姓名,倒寫了懇切一書, 說是至親姓趙名完璧,薦到遼陽鐵嶺總兵李如鬆標下,做個聽用標官。當晚備了衣裝 ,要他收了銀子,俏悄送他出門。莊客一個不知,看見次日毫無動靜,纔曉得公子已 經釋放,感嘆公子不了。再說劉蕃,自那日收留之後,得了如許盤費,家裡也就像個 人家。候到八月初,大考場裡公然取出一名科舉,放榜中了第三名經魁。回來同了母 親,上門正要拜謝公子,不料那日正值公子運退之時,忽然臥房中烈火沖天,黑煙蔽 地,把前後屋宅化為灰燼。許多田地莊捨又被洪水泛濫,沖沒一空。人頭帳自也就隨 著氣運討不上了。母親、妻子道他日常浪費,俱各自保,那裡顧戀一些?親戚朋友也 都道他退運窮鬼,對面俱不相照。始初賣些驢馬牛羊,次則賣些殘缺家夥,再次將家 中僮僕待他轉身取價,一日一日漸漸艱難。始初還道人到窮時,不過衣服襤褸,飲食 粗糙,那知襤褸衣服、粗糙飲食俱不能夠,連那棲身之所也不便了。公子一朝落魄, 擎著兩行珠淚,徒步走上城來,意中覓兩個舊日知己。那知十投九空,前邊走去後邊 便添許多指搠,道是此人今日合受此報!公子兩耳聽見,也只好置若罔聞。更苦無處 棲身,有人指道:『城外十餘里有個土窖,不風不雨,上市來覓些飲食倒也順便。』 公子也只得依說而行,就在土窖內安身住下。一般交個小運,遇著平日一個相知,偶 然在彼經過,看見公子如此光景,身邊所帶之物傾囊而與,約有百十餘金。公子得手 ,次日就到舊處,租起一所大房,買些家夥什物,收拾幾個舊人,幫身服侍。那些蔑 片小人依舊簇擁而來,將那股水兒不數月間一傾就涸,眾人倏忽走散。 公子依舊到土窖受用去了不題。再說劉蕃中了舉人,那日同了母親上門拜謝,不料遇 著火起沒處相會,只得怏怏而回。且去收拾行李,進京會試。不期聯捷中了進士,選 了大名府推官。 對月領了官憑,離京不遠就到了任。那大名府理刑廳轄著九個知縣,有名叫做十大閻 王,從來錢糧易徵,刑名易結。推官、知縣,個個俱要行取,非科即道,最聰察軒昂 的。劉蕃是個窮儒出身,極能體恤民情,除奸剔暴,不一月間,上司俱欽敬。 一面遣了衙役,持了些須薄俸,接取母親到任。 母親即日起程,將次到那大名府境上,即喚衙役尋一公館住下,不入境內。劉蕃心急 ,不省母親心中是何緣故。疾忙騎了一匹快馬走出境外迎接母親。雙膝跪下,請問不 入境內,此時何意?母親開言道:『今日我兒做了推官,一門榮耀。想起兩年之前未 見恩人閻公子之時,我與汝俱不免為溝中瘠矣!汝曾聞近日閻公子形狀否?今在土窖 棲身,奄奄將斃,欲求汝當日傴僂謁見閻公子時光景,猶未得也。』劉蕃謝罪再三, 請母親入署,一面著人馳救恩人,夫人方肯登車。到了衙內,劉蕃即備俸銀及各縣借 湊千兩之數,差人前往臨朐接請公子。那公子居在土窖,地方人卻也不知。只有一個 老成朋友平日與公子極相契的,也因他浪費勸阻不聽,只得疏了。聞得有人請他,尋 著衙役說道:『閻公子下落我卻知道。但一頓與他千金,他就迂而闊之起來了。我且 往土窖,遠遠說到邊際,看他伎倆何如』那人到彼,早已尋著,道:『有一相知持百 金覓汝,奉酬夙昔意誼,我特引來,汝將何以報我?』公子道:『此時錙銖勝如鉅萬 ,使果有此,我當以半相酬也!』那人道:『杜子春之伎倆猶昔,足下真道器也!汝 當困厄,我不能助汝,而肯受汝之酬那!』因引衙役往見,一面為彼治裝,不數日間 ,意氣揚揚,竟到大名府刑廳來。劉蕃同著母親妻子出拜,公子亦拜,俱各忻忻。住 下不及三年,劉蕃政聲茂著,行取吏部衙門,公子隨了進京。彼時都中功令尚寬,凡 吏部衙門請托及斡旋者,一年六選,無不由公子經手,囊中所積不啻五六萬金。會見 戶、工二部,開設新例,納銀三千,做了內閣中書。三年考滿,昇了湖廣常德府同知 。適遇張居正閣老事敗,奉旨籍沒。上司委他監守,所得寶玩金銖不計其數。動了告 病文書,竟歸林下。 前後田地房產俱各平價交易,絕不相強。莊丁食客依舊如雨如雲,遇人接物無不豪爽 。更有一樁異事:白蓮寇起,山東六府無不騷然,兵馬所過,郡縣一空。獨有青州府 領兵總鎮乃是遼東寧遠伯標下出身,姓趙名完璧,自他領兵到來,即撥精兵一千駐防 閻宅左右,一草一木無人敢動。故此各處州縣村落荒荒涼涼,獨此一莊氣色壯麗。若 不是公子當日遷善改過,那父親的陰鯫,到此時也成一片灰燼了。公子今年五十三歲 了,生有四子,俱已游癢。富貴功名,方興未艾。居土若肯住一日,小僧就同居士往 拜閻老爺。 會會也妙,閻老爺並沒一些紗帽氣質的。在下道:「行路之人不敢輕易謁見顯者。老 師父肯與在下說知,流傳天下以資談柄,齒頰俱欣!」即便備了香儀三錢酬其齋供, 作禮而別。 你道這段說話,不是遊戲學得來的,也費些須本錢的了。』眾人道:『我們豆棚之下 說些故事,提起銀子就陋相了。』那人道:『不為要錢說的,只要眾人聽了該摹仿的 就該摹仿,該懲創的就該懲創,不要虛度我這番佳話便是了。』眾人謝道:『尊兄說 得是!尊兄說得是!』 總評凡著小說,既要入人情中,又要出人意外,如水窮雲起,樹轉峰來。使閱者應接 不暇,卻掩卷而思,不知後來一段路逕纔妙。如閻癡聞人說他父親如此,還人文契、 土田,此人情中所有也,及其大敗一番,則人意中所無也。結納劉趙二人,或得其平 常應援,此人情中所有也。至於火燒一空,安身土窖,乃得中書同知,家中兵燹晏然 ,此人意中所無也。散金積金而身享之;不讀書而功名勝於讀書,不恃祖、父陰德而 自積陰德;又身受用之。較之溫公所訓更進數層矣!乃知極力能癡,大聰明於是乎出 焉;極力善窮,大富貴於是乎顯焉。磨煉豪傑,只在筆尖舌鋒之間。艾衲可謂陶鑄化 工矣。 第五則 小乞兒真心孝義 人生天地間,口裡說一句活,耳裡聽一句話,也便與一生氣運休咎相關。只要認得理 真,說得來,聽得進,便不差了。 古語云:『與善人居,如入芝蘭之室,久而不聞其香,則與之化矣;與不善人居,如 入鮑魚之肆,久而不聞其臭,亦與之化矣。』譬如人立在府縣衙門前,耳邊擾擾攘攘 ,是是非非,肚裡就起了無限打算人的念頭。日漸習熟,胸中一字不通的,也就要代 人寫些呈狀,包攬些事,管把一片善良念頭都變作一個毒蛇窠了。又譬如人走到庵堂 廟宇,看見講經說法,念佛修齋,隨你平昔橫行惡煞也就退悔一分,日漸親近,不知 不覺那些強梁霸道行藏化作清涼世界了。今日我們坐在豆棚之下,不要看做豆棚,當 此煩囂之際,悠悠揚揚搖著扇子,無榮無辱,只當坐在西方極樂淨土,彼此心中一絲 不掛。忽然一陣風來,那些豆花香氣撲人眉宇,直透肌骨,兼之說些古往今來世情閑 話。 莫把『閑』字看得錯了,唯是『閑』的時節,良心發現出來,一言懇切,最能感動。 如今世界不平,人心叵測,那聰明伶俐的人,腹內讀的書史倒是機械變詐的本領,做 了大官,到了高位,那一片孩提赤子初心全然斷滅,說來的話都是天地鬼神猜料不著 ,做來的事都在倫常圈子之外。倒是那不讀書的村鄙之夫,兩腳踏著實地,一心靠著 蒼天,不認得周公、孔子,全在自家衾影夢寐之中,一心不苟,一事不差,倒顯得三 代之直、秉彞之良在於此輩。仔細使人評論起來,那些踢空弄影豪傑,比為糞蛆還不 及也。今日在下斗膽在眾位面前放肆,說個極卑極賤的人,倒做了人所難及的事。說 來雖然一時污耳,想將起來到也有味。你道天下卑賤的是甚麼人?也不是菜傭酒保, 也不是屠狗椎埋,卻是卑田院裡一金心兒。請問諸兄,天下的乞兒,難道祖父生來、 世代襲職就是叫化的不成?卻也有個來頭,這人姓吳名定,乃湖廣荊州府江陵縣人。 他的祖叫做吳立,貢仕出身,為人氣質和平,遇人接物,無不以『吮字、『耐』字化 導鄉人。那一鄉之人,俱尊從他的教誨,稱他為和靖先生。 生有五子,四子俱已入膠癢,耕讀為活。只因晚年欠些主意,房中一個丫頭有些姿色 ,一時禁持不定,收在身邊,生下一子,長成六七歲,喚名吳賢。他的意念就與人大 不相同,四位長兄也俱不放在心上。十餘歲,父親去世,那兄弟照股分居,吳賢也就 隨了母親到自己莊上住了。 請位先生教他攻習詩書,思量幹那正經勾當。到了十七八歲不得入學。忽一日仰天而 嘆,說出一句駭人聞聽之言,道:『人生天地間,上不做玉皇大帝,下情願做卑田乞 兒。若做個世上不沈不涪可有可無之人有何用處?不如死歸地府,另去託生,到也得 個爽利!』此亦是吳賢一時忿激之談,那知屋簷三尺之上,玉帝偶爾遊行從此經過, 左右神司立刻奏聞。玉帝傳旨,即命注生、注死及盤查祿位。判官一齊俱到,查那吳 賢有無陽壽祿籍。那判官接簿清查,內有一條寫著:荊州人吳賢,志大福輕,忘生怨 讟,應行勾攝,抵作卑田。但他生平原無曖昧心腸,委身雖屬卑微,品地還他高潔。 此是幽冥之事不題。 且說吳賢在家說了這句妄話,不數日間,陽壽頓絕。妻子向有妊孕在身,到了十月滿 足,生下遺腹一子,乳名定兒,後來即名吳定,面貌卻也清秀。年歲漸長,奈何家業 日逐凋零,只因他命裡注定是個乞兒,如何橕架得住?到了二十餘歲,肩不能挑,手 不能提,只得奉了母親往他鄉外府。不料母親雙目懼瞽,沿路攙扶乞食而去,家中叔 伯弟兄毫不沾染,那些親戚,只曉得他傲物氣高,不想到別處乾這生涯。朝朝暮暮, 一路討來的,或酒或食,先奉母親夠了,方敢自食。忽然省得本年八月十五日乃是母 親四十歲誕辰,定兒心裡十分懷念,力量卻是不加,日夜思索,竭力設處為母親慶個 壽誕。其時楚中有個顯宦,官至二品,奉旨予告,馳驛還家。那年六月初旬,正是此 公五十華辰,其母亦登七秩,卻在九月之杪。若論富貴聲勢,錦上添花,半年前便有 親親戚戚,水陸雜陳,奇珍畢集,設席開筵,忙亂不了。那顯者道:『我母尚未稱觴 ,如何先敢受祝?況今已歸林下,凡百都要收斂。我且避居山間僧舍,斷酒除葷,拜 經禮懺。雖不邀福,亦足收省身心,一大善事。』偶爾策杖潛行,忽聞鼗鼓之聲,出 自林際,顯者驚道:『是親朋知我在此,張筵備席,率取音樂,以為我壽也!』心中 疑惑。轉過山坡,只見幾株扶疏古木之下,一個瞽目老嫗坐於大石之上,一個乞兒牽 著一隻黃犬,一手攜著食籃,隨將籃中破瓢、土碗同著零星委棄之物一一擺在面前, 然後手中持著一面鼗鼓,搖將起來。 那黃犬亦隨著鼓韻在前跳舞不已。乞兒跪拜於下,高棒盆甌,口裡不知唱著甚麼歌兒 ,恭恭敬敬進將上去,曲盡歡心。那顯者從旁看了半日,卻是不解甚麼緣故。走向前 來問道:『此嫗是汝之何人?』那定兒上前道:『尊官且請迴避。吾母今日千秋之辰 ,弗得驚動!』顯者笑道:『螬食之李,鼠蝕之瓜,釜底餘羹,瓶中濁酒,遂足為母 壽乎?』定兒道:『官人謬矣!我雖讀書不深,古聖先賢之語亦嘗聞之。聖門有個曾 子,養那父親曾晰,每日三餐,酒肉懼備,吃得醉飽之餘問道:「還有麼?」曾子連 連應聲道:「有。」就是沒時,決答是有的。倘或父親要請別人,也立時設備。這教 做養志之孝。到那曾元手裡,卻不解得這個意思。供養三餐之外,雖酒肉照常不缺, 若問說「還有麼」,那曾元就應道「沒了」,不是沒了,卻要留在下頓供養。這教做 養體,如何稱得孝字?我輩雖用破瓢土碗,與那金鑲牙筋、寶嵌玉杯有何分別?就擺 些濁醪殘餚,與那海味山珍又有何各樣?牽著黃犬,播著鼗鼓,唱著歌兒,舞蹈於前 ,便是虞廷百獸率舞,老萊戲彩斑衣,我也不讓過他!』顯者聽罷,連聲贊道:『有 理!有理!』那瞽嫗在上問道:『是誰稱贊?快請過來奉一巨觴!』定兒遵了母命, 請過顯者。那顯者一時感動自己孝母之心,就不推託,竟盡歡一飲而荊遂對定兒道: 『見汝至誠純孝,何不隨我到府中,受用些安耽衣飯,度汝母親殘年,也免得朝夕離 披匍匐之苦。』定兒搖手道:『不去不去!母親百歲之後,我日則沿門持缽,夜則依 宿草廬,不離朝夕,宛若生前。若一入富貴之家,官人雖把我格外看待,那宅內豪僮 悍婢能不輕賤吾母?今見富貴縉紳之家,一膺新命,雙親遠離。雖有憶念之心,關河 阻隔,徒望白雲,一番悲嘆。不幸一朝見背,即有同僚當道,綾錦弔奠輓章,及朝廷 踢有焚黃祭葬,優恤重典,也只好墓頂誇張,墳頭熱鬧。及至拜掃之餘,兒女歸家, 燈前笑語,狐狸塚上,向月哀鳴。那從古來種柏居廬,聞雷撲墓的孝子能有幾人?九 泉之下,一滴難到口中,縱有黃金百萬,能買我母親生前一笑哉!』說得顯者熱鬧胸 中,化作一團冰雪連底凍的相似,垂頭嘆息,尚要開言說些甚麼。 定兒道:『吾母醉矣!』背負瞽嫗竟自去了。那顯者怏怏而回,不在話下。且說定兒 背了母親回到舊日安身去處,照常乞飯。 過了年餘,那母親也就故了。眾乞兒俱來相弔,歌著《薤露》之詞,掩埋在一空闊不 礙之地。墳前左右也植了幾株松柏,結個草棚,便於藏身。日裡如常,乞食供奉三餐 ,整整三年,同於一日。那近處鄉村市上,捨北橋南,都道他是個孝子,人人起敬。 況且遇著成熟之年,一方一境,那佈施供養的都搶著先頭,把定兒吃得肥肥胖胖,比 那遊方僧鋪單打坐、人家輪流齋供的勝如十分。定兒心滿意足,也沒有別的奢念。 一日遇著母親忌辰,清早起來備了些香燭,從人家討了些葷素東西,一直來到墳前擺 下,將香燭點起,仍似生前模樣,把鼗鼓搖將起來,唱了許多歌兒,又哀哀慘慘哭了 一回,把那供養的殘酒也就一一飲在肚裡。眼角乜斜,酒意漸漸湧上,一交放倒,就 在墳上睡了一覺。醒來不覺日色蹉西,睜眼一看,信步便走。不上行有半里之程,要 過一道斷頭小河,脫了破鞋,踏著水沙,將近對岸上涯所在,腳指頭忽然觸著,疼痛 異常,只道撞了石頭。恐怕又撞了後來之人,帶著疼痛彎腰一摸,將欲丟棄道傍。原 來不是石頭,拿起看時,卻是一個大大青布包袱。 即便提到岸上樹陰之下,打開看時,卻是白屑屑、亮光光許多鬆紋雪花在內。定兒看 了,點點頭道:『此不知何人所失,此時又不知如何懊恨,無處追尋。只怕那人性命 未知如何了也!』 仍舊包裹好了,天色將晚,一面將銀包俏悄埋在枯樹之下,就在左近廟宇廊下宿了一 夜。早間討些早飯吃了,卻也不往別處去,依舊走到那斷頭河口、陰涼所在,癡癡對 著那一泓清水,眼也不合,且等甚麼人來。那個所在是個背路,卻也過往的少。 直待日已中時,只見一人披著頭,散開襟袖,失張失智,赤著兩腳下過河來。定兒道 :『此必是也。』立起身走向前去,問著那人何往。那人看是乞兒,恐怕他化錢財逗 留身子,一言不答,只往前奔。定兒道:『老兄如此慌張,莫不失了甚麼東西?』那 人回身即問道:『你莫不拾得麼?』定兒道:『試說何物。』那人道:『在下出門三 年,受了許多艱難辛苦,掙得幾兩銀子,近來聞得母親有病,心急行程,不料遺失中 途。尊兄撿得,若有高懷,憐憫在下,情願將一半奉酬!』定兒道:『可有甚麼包裹 的麼?』那人道:『是一個青布雙層夾包,千針百線紉捺成的。』定兒道:『正是, 正是。可隨我來。』走到枯樹之下,原封不動,雙手交還。那人打開,分了一半送與 定兒。定兒道:『得此一半,何不全以匿之?』斷不肯受。那人跪謝再三,不覺路上 行人聚了一堆,從旁看見推遜不已,定兒執意如初。眾人說:『送他二兩,當個酒資 ,難道你也不收?』 定兒見眾人說得有理,勉強收了藏之懷中。個個嘆道:『乞丐下賤,如此高義,真真 難得!』從此定兒的名頭,遠近也就尊重許多。又一日,聞得北山之下一個僧人募造 白衣觀音寶閣,塑了金相,將要開光,無數善男信女拜經禮懺。一則隨喜,再則趕鬧 佛會,也得幾日素飽。行到中途,望著茂林之間,聊且歇腳。只聞得竹筱叢裡忽有呻 吟之聲,上前一看,卻見一個年紀幼小婦人,瘦骨如柴,形容枯槁,瞬息垂斃。定兒 見了,唬了一驚,想道:『無人去處,何有此一物?莫非山魈木客,假扮前來,哄我 入頭,打算我的性命?』又道:『既要哄我,如何作此羸之狀?也還是人,斷不是鬼 ,其中必有緣故。』復轉身上前細看,那婦人口裡也還說得話出。定兒問道:『你是 何人,須要直言細說,我方救你。』那婦人徐徐道:『我是黃州麻城人家一個女子, 自愧不端,乃被負心薄倖誘我潛逃。不料所帶衣資盤纏殆盡,中途染了一病,旅店中 住了幾時,欠下房錢,沒可布擺。那負心人昨夜把我背負至此拋棄荒林,不知去向。 倘得恩人救援,死不忘恩!』定兒聽了這些說話,信是真的,也就扶掖起來,將他馱 在背上,走到近處一座古廟之中,輕輕放下。一面尋些軟草攤放地上,教他睡得穩了 。一面尋個半破砂鍋,拾些柴枝竹梗,煎些湯水小食,早晚接濟。送畢飲食,那定兒 即便住在門外,另自宿歇,宛如賓客相似。不半月間,那婦人肌肉漸生,略堪步履, 願以身嫁。定兒道:『娘子差矣!汝雖是不端之婦,我自具救人之心。若乘人之危而 利之,非義也!責人之報而私之,非仁也!這段念頭與我然不合,你自早晚調護身體 ,你的父母家鄉離此不遠,何不同你漸漸訪問,回家便了。』不數日間,就到了麻城 。查問住居明白,那父母只得密密收下,感服異常,贈他盤費二兩。定兒固辭,勉強 再三,只得收了藏之懷中,依舊乞食而去。偶然行到黃梅市上,看見一老者愁眉蹙額 ,攜著一子,約有十一二歲,頭上插一草標,口稱負了富室宿逋五金,願賣此子以償 前債。走來走去,卻也不見有人喚動。定兒凝睛看了半晌,嘆口氣道:『富室豪門, 那裡在此些須五兩之負?畢竟鬻子以償,何忍心也!』因出懷中之金,謂其人道:『 吾將為子往請。』因同見富翁。閽者入報,富翁道:『喚經手問其取足本利,還其原 券是矣。見我何為?』閽者道:『又有一乞兒在外候見。』富者道:『是必拉取乞兒 ,將欲向我作無賴事也。』閽者道:『聞得乞兒持銀在外,代其償還。』富者疑心, 因出廳前。那負債者同著定兒立在階下。負債者道:『員外恩債,子母應償。但老病 家貧,實無所抵,還求員外開恩寬限幾時。』富者道:『此話說已久矣!前許鬻兒償 我,今見我何得又是前說?』定兒上前道:『員外家如猗頓,富比陶朱,五兩之負直 太倉一粟耳,何必要人賣子以償?吾不忍見,我雖行乞道上,懷中積有四金,代彼償 之,尚欠一兩,須望寬恩。若必不肯蠲除,我情願在貴地行乞,漸漸填補。』富者聽 了大怒道:『分明此人將這四兩銀子挽他出來將我奚落,情實可恨!你是乞兒,安得 懷中積貯四兩?我前日聞得莊子夜間被盜,失去糧銀四兩,此必無疑!速寫一呈送去 黃梅縣裡,並那欠債老兒指作窩家,追贓正法,刺配他鄉,方平吾氣!』 那些左右家人聽家主指揮,即刻寫成狀紙,將那二個人一條繩子縛雞相似,火速送到 縣裡。彼時縣主乃是新選甲科,姓包名達,聰察異常,不肯徇情枉法,聞名的賽閻羅 。 將狀收進,即刻陞堂,把那前情一問。一邊卻是一人欠債賣子,一人仗義代償;一邊 道是賊情原贓,執獲到官。正在踟躕,只見門外許多良耆裡老魚貫相似,一班約有三 四十人跪向門外。 縣主早已看見,俱喚進來。不待縣主開口,那些跪下之人口裡喊道:『一個義士,一 個義士!眾百姓們俱目擊的,不可被那為富不仁的陷害了。』包大尹道:『我也不憑 你們人多說的就信了,快退下去,待我一一問來。』先叫那欠債老子,將負債賣子原 由說了一遍;又叫定兒將仗義代償,說話觸犯了員外情由說了一遍。包大尹詳情,道 :『乞兒抄化之銀不過糠秕碎米,零星不多,如何有這四兩大塊銀子?』正欲動刑, 那眾人上前把定兒抱住,將當初還金、還婦兩段情節說得真真實實。大尹道:『也難 憑信。若說還金、還婦得來之銀,此地相去不甚相遠。』兩處行文,不幾日都拘到案 前。那失金之人與那失婦之人,說得鑿鑿有據。大尹先暗取四兩銀子,問那二人,那 二人看看不認;復取那四兩銀子驗看,那兩人上前連聲道:『是!是!』將一包零碎 之銀信手撮開兩處,上等子一稱,剛剛卻是二兩之數,一毫不差。 大尹即將富者取出頭號大板,打了四十,發在監中,要問反誣之罪。富者再三求憐叩 免,大尹姑息,於富者名下罰銀三百兩,旌賞定兒;那婦尚未嫁人,即斷為夫婦。 後來生有三子,仍習書香一脈,至今稱為巨族。列位尊兄可信幽冥之事原不爽的?前 邊說那判官簿上,注著吳賢名下出身雖屬卑微,品地還他高潔,今看得來一字不差。 皆因吳賢無心說這兩句放肆之語,那知就落了這個輪迴,可見說話要謹慎的。我們今 日在此說些果報之語,都是有益於身心學問的。若群居在豆棚之下,不知豆棚之上就 有天帝玉皇過的,萬一說些淫邪之話,冥冥之中,我輩也就折罰不盡也。 眾人合掌道:『真是佛菩薩之言,不錯不錯!』俱躬身唯唯作禮而退。 總評儒者立說不同,要歸於全良心、敦本行而已。是篇天人感應在其中,親仁及物在 其中,義利貞淫在其中。雖起先哲先儒,擁臯比,眾學徒,娓娓談道叩玄,亦不出良 心大孝,辨明人禽之關而已。然則何以舉乞人也?蓋為上等人指示,則曰舜、曰文、 曰曾、曰閔,及與下等人言,則舉一卑賤如乞人者,且行孝仗義如此,凡乞人以上俱 可行孝仗義矣!人而不行孝仗義,是乞人不如云耳!冷水澆背,熱火燒心,煞令人唏 噓感慨,寤寐永言,孝義之思油然生、勃然興矣。予尤喜定兒對顯者十數行,宛轉激 切,見得仕宦人棄家而錦歸,雖道是顯親揚名,何如膝下依依,觴酒豆肉,為手舞足 蹈之樂也!況普天下人子抱終天之恨者不少。覽此一則,能不拊膺浩嘆也哉! 第六則 大和尚假意超昇 是日也,天朗氣清,涼風洊至。只見棚上豆花開遍,中間卻有幾枝,結成蓓蓓蕾蕾相 似許多豆莢。那些孩子看見嚷道:『好了,上邊結成豆了。』棚下就有人伸頭縮頸將 要彩他。眾人道:『新生豆莢是難得的。』主人道:『待我彩他下來,先煮熟了。今 日有人說得好故事的,就請他吃。』眾人道:『有理,有理。』棚下襬著一張椅子, 中間走出一個少年道:『今日待我坐在椅上,說個世情中有最不服人的一段話頭,叫 列位聽了猛然想著也要痛恨起來。我想天上只有一個日月,東昇西墜,所以萬古長明 ;地上生物只有一個種子、一條本根,所以生生無荊至於人生天地間,偏偏有許多名 目:君王是治天下的,臣子是輔佐君王的,百姓是耕種田地、養活萬民的,這叫做無 君子莫治野人、無野人莫養君子。因此古聖先賢立個儒教,關係極大。剖判天地陰陽 道理,正明人倫萬古綱常,教化文明,齊家治國平天下俱虧著他。這是天地正氣一脈 ,不可思議的了。 又有一個道教,他也不過講些玄微之理,修養身心,延年益壽,這種類還也不多,且 漫議論著他。獨有釋教,這個法門參雜得緊。自漢明帝十二年佛入中國,道是西方來 了聖人。拈著一個「空」字立論,也不過勸化世人看得萬事皆空,六根清淨,養得心 境玲瓏,毫無罣礙,原沒有甚麼果報輪迥之說。只因後來的人無端穿鑿,說出許多地 獄天堂,就起了騙人章本。』只說這些和尚,我始初也道都是為生死事大,發願修行 ,乃是聰明上智之人勾當。那知其中不論賢愚好歹及奸盜詐偽之人,都因日常間走了 盡頭路,天不容、地不載,沒奈何把這幾根頭剃下,頸上掛著串數珠,肩上褡著件褊 衫,手裡拿個木魚,就道是個和尚,從前過惡,人也就恕他一分。看得這條頭路寬綽 有餘,那無賴之徒逃竄入門,不覺一日一日逐漸多得緊了。沒處生衣食,或者截段竹 頭,鑄口銅鐘,買根鎖條,城市上、鄉村中,天未曾亮,做生意的尚未走動,他便乒 乒乓乓的敲得頭痛,叫得耳聾,指東話西。或是起建殿宇,修蓋鐘樓,裝塑金相,印 請藏經,趁口胡嘲,騙錢騙米。就是這等,守著本分度此一生,也還罷了。那知竟有 窮凶極惡,具那覆地翻天伎倆,只道他就是佛祖菩薩臨凡,致誠供養,末後做出事來 ,拖累人身家性命不保,以此連那好的也不信了。此是佛門變種敗類,我也不必說他 。難道一派都是歹人不成?其中也有度世金仙,現身佛子,登壇說法,救拔沈迷。如 達摩西來,生公說法,他卻在心性上參悟道理,點化世人,說兒句偈語,留幾句名言 ,千古人所不及,委實足以服人,歷代以來,希世有的。從來怫祖傳道的拂子,也不 曾見他輕輕付與那個。如今這些孽畜卻另翻出一個局面,不論肚裡通也未通,只要粗 粗認得幾字,叢林中覓幾本語錄,買幾本註疏,坐在金剛腳下練熟聲口,就假斯文結 識幾個禪友,互相標榜,拜過幾個講師,或自立個宗派,道是幾年上某處大和尚付過 拂的。 悄悄走到外州他縣,窺見冷落所在一個破壞寺院,就聯絡地方上幾個佛總師婆,稱說 某處來了善知識,看得此寺當興,或埋藏些古時碑版,偶然掘出,或裝誣本山伽藍, 在外顯靈,或灑些糖水,假名甘露,騙人之法百計千方。不半月間,那一方一境,愚 夫愚婦,說得轟轟熱熱。略略有些錢糧,道:『我們備辦表禮,去清一位大和尚來。 開期結制,那個不尷不尬的和尚也就糾合許多隨堂行者,公然裝模作樣,將別個叢林 的作為,一一摹做。或央人討了巡檢司的告示,或結識冷鄉宦護法的名頭,抄了許多 偈語,學些宗門棒喝;房廊下貼了幾張規條,齋堂前寫出長篇參語。那些來來往往, 看看一些也摸頭不著,便道:「大和尚學問深遠,一時領悟不來。」分明白日裡被他 瞞過,這些愚人死也不知。』林中還有一件人所不曉得的,大凡大和尚到一處開堂, 各處住靜室的禪和子,日常間都是打成一片,其中花巧名目甚多,如:西堂、維那、 首座、悅眾、書記、都講、堂主、侍者、監院,知客、知寓化主、點座、副寺、貼庫 、行堂、殿主、值歲、值科、香燈、下院、知藏、知隨、鋪堂、巡照、總管、都管、 知眾、知山、庫頭、萊頭、柴頭、田頭、飯頭、茶頭、園頭、火頭、水頭、圊頭。這 些名目科派出來,寫下一張榜文,貼在茶寮卻也好看。到那登壇時節,細吹細打,兩 邊排列許多僧眾,捧著香花燈燭,磕頭禮拜,妝點得不知怎樣尊重。及至開講,也不 過將編成的講章念了一遍,那個解悟得來?又請了幾個廢棄的鄉宦、假高尚的孝廉、 告老打罷的朋友,從旁護法,出身子做個招頭,暗地分些分例,鄉愚之人越發尊信得 緊。如有那外方僧眾,有意思的要到壇前辯駁佛法,那些侍者齊來拿去,打得臭死。 各處寺院遞了知單,認定面貌,不但走遍路頭不許安單,在那地方化碗飯吃也不得了 。還有一個規矩,大殿緣簿上寫來佈施,及在外抄化錢糧,方歸常住;那道場上來的 宰官、居士及婆婆媽媽的錢糧,都是大和尚隨來僧眾一併收貯,只待場期一畢,次日 即照股分享,走得一個沒影,各自回去受用。常住欠了木料、油鹽、米帳,一些不管 ,請自支橕,再打聽得別處開期,又去生。你道這些和尚卻不比合夥的強盜又狠三分 麼?』考得「大和尚」三字,乃是晉朝石勒的時節,有個佛圖澄,自己稱道。其實他 是個聖僧,看那石勒皇帝就如海上鷗鳥一般;神通廣大,能知過去未來,儼然一尊燃 燈古怫,自然動人欽敬。請問這些和尚《華嚴經》尚未念著,不過設局騙人是其本願 ,如何就便替稱為大和尚?時上有個笑話,卻是嘲那大和尚的。說有個相公,乘著一 隻小船去訪那大和尚。進方丈茶話畢,作別起身。大和尚直送出來,到那水口,相公 仍下小船,西邊日色曬來,相公脫下裙子掛著。大和尚道:「直看相公之船箬葉大了 ,小僧方敢進去。」那相公坐在船裡,也把遮的裙子揭開看那和尚。船已漸退,那管 家道:「大和尚立在水口,望去止有七八寸長了,請相公放下裙子罷。」只因和尚叫 得大了,所以嘲他,這是諢話。』 卻又有一段閑話,乃是真真實實的。這話出在那湖廣德安府應山縣,與那河南信陽州 交界地方,叫做恨這關。乃是一座陡峻高山,四面蔥籠樹木,雖是要道,行人過往稀 疏。山岡之上有一古剎,也是唐、宋來的香火,誌書上叫名普明寺。寺內止有二三十 眾僧人,都是茹葷飲酒的羅剎。不知邇來十五六年之間,卻坐化十餘位長老。四邊傳 說,寺內風水原是聖地,所以禪師佛祖屢屢現身,各處佈施倒也年年接湊。不期一日 有個採藥醫人到彼求宿,那僧人抵死不容,醫者只得乘月而行。走了一二十里,卻忘 了一把鋤頭放在山門外石碑亭中,猛然省起,恐怕有人取去,只得跌身轉去,來到碑 亭尋那鋤頭。只聽得牆內一人叫苦連天,口口叫道:『老爺們容我再活幾日,然後上 座罷!』醫者覺得有些古怪,爬上牆頭,挽著樹枝,仔細一看,只見堂前燈光射出, 卻見幾個禿子把一老僧捆縛端正,將他扛上一個坐處,看不明白。 那老僧殺豬般大叫數聲就不響了。醫者挨了一夜,到次日看甚動靜。到了天亮,只聽 得佛堂鐘鼓齊鳴,佛號震天。道人出來說道:『了明禪師昨晚坐化了。』四邊分了齋 帖,來了許多佛頭,正要開張做大法事。那醫者進去仔細一看,卻見一個愁慘之容, 面皮黃如菜葉,一些血色沒有。醫者乘著空隙,將手從那臀下一摸,只見滿手鮮血, 穀道中卻生一個根的模樣。醫者即到信陽州裡將這段情節一一報知。那知州夜有一夢 ,也見一個老僧渾身帶血,聲聲叫苦。知州省得,即便乘了快馬,領了鄉兵,將寺圍 祝進到裡邊,叫住持出來相見,那住持道是大和尚,不肯出來,只有一個當家的迎接 。州官問道:『昨日又坐化了一位禪師,特來頂禮。就便與他合缸造塔。』那當家也 叩一首謝了。州官道:『寺內多少僧人?一一點過,都要施些襯錢。』那幾個如狼似 虎的,俱出來低著頭兒、垂下雙手,聽州官點過上名,每個和尚俱叫鄉兵看守。一面 叫手下請起坐化的僧人,看那手足是怎樣的。兩個鄉兵上前推移不動,用力一抬,那 穀道中一個二尺長的鐵釘登時翻落,下邊缸裡卻有一桶鮮血。知州即將許多和尚綁縛 了,帶到州內;再把僧房層層拆將進去,卻跑出十數個婦女來,大聲喊屈。知州喚皂 隸一一帶過,問道:『你這幾個婦人在內幾時了?』婦人齊招道:『有三五年不等的 ,有本年的,都是這些和尚勾合光棍,在外詐作客商模樣,不論銀錢,只說娶親做夫 妻回家過活的;那知逐漸騙到家鄉,忽一日託名探親,帶了直送到此處,藏於重牆複 壁、深房曲室之中,天日也不得一見。也有近村人家十餘歲女兒在外閑耍,乘人不見 抱來藏在其中,待得十二三歲就受用了。』 州官問道:『這許多年怎麼沒有一人往州縣中首告?』那婦人道:『手下使用的道人 ,俱是平昔殺人做賊之輩,無處投奔,四下收拾進來。日常間也各各自有去路,騙來 錢米平半均分,鄰近村中也俱日常沾些恩惠,故此內內外外沒有人與他作對。 內中若有一人說些刁指之話,眾人也就登時結果殺了,所以到今,眾口一心絕無髮覺 。』州官問道:『歷年來如何有這許多人坐化?』婦人招道:『俱是過往單身客人, 把他圈進裡面,不容脫身,先把蒙汗藥與他吃了,後將網子除下,綁縛了,曬在日中 ,額角與面目都黧黑了,然後把他頭齊眉剪下,扮作頭陀模樣;或將身子上下捆縛做 跏趺坐法,餓了三五日,頭骨俱軟,衣袂之中灌上硫磺燄硝,扶在柴樓龕座之上,叫 喚地方舊日做佛頭佛總的,謠言開去,四處俱來觀看,攢錢設供,造塔看經,不知騙 了多多少少。也照舊規分頭派用,花費盡了,就要乾這活佛勾當。』州官正在查問之 際,門子報道:『竹園內又掘出許多女人腳骨!』州官問道:『都是女人腳骨,為何 !』一婦人道:『男人死了,枯骨都無用處。唯有新死女人,這雙腿骨血氣不散,將 來鋸解碎了,加上水磨工夫,充作象牙□子,無人認得。每得厚利,寺中道人無處生 錢鈔,每每打聽新死婦人,盜取來乾這勾當。腿骨用去,所以存的都是腳骨。』州官 審得其情慘毒,每個和尚打了五十板,心窩裡加上一釘,登時命絕。 備將情節申聞上司,一一將來,除個淨盡,並那普明寺一火焚之,卻是除了大害。這 也是近日大和尚的故事。更有一段故事也是聞得來的。說是唐朝開元年間,河南懷慶 府河內縣地方,開元寺有個僧人,法名死灰。這名就先奇了,生得相貌奇古,氣宇昂 藏,博通經典,貫串百家;兼識天文地理,能知過去未來、生人壽數;做得幾句詩, 寫得幾家字,畫得幾筆畫,賽過海內名公,抹殺四方清客。四遠慕名來求見的,須備 了出奇方物供養,送進禪堂,上了號簿,候了三日,纔出方丈見人一次。 許多僧眾簇擁出來,昇在層臺高座之上。兩旁侍者提爐執佛,捧杖持瓶;面前擺的花 尊燭檯,當中爐內焚起沈檀降速;內外香煙寶篆,結成華蓋相似,好不熱鬧。三聲雲 板,纔許那問事的人依次上前跪下,方將要問的話頭一一說了。他在上面纔把那囫圇 足四面光的話兒開示了幾句,即叫退下;再欲開言,就是攔頭一棒,打得發昏倒暈, 由你自去猜度。然後又輪到第二班的上去,也照前是個模樣,或說下幾句話頭,或留 下幾行詩偈,一般也有撞著之處。也有病人上前,將病原說下一番,問他請方,他胸 中難經脈訣、木草藥性,原是明白,也便寫些與人服去,卻有靈驗。不多時,四方之 人說得長老活龍活現,連這長老也自不信自起來,公然道是活佛祖師出世來了。因此 ,四下錢糧,雲蒸霧集。重建叢林,前後山門殿宇,層層蓋造,天下除了四大名山, 也就數這開元寺了。誰料那年僕固懷恩反了,朝廷起兵發馬,要往征剿。河北地方乃 是要地,設立藩鎮,領兵元帥點了李抱真。此公膂力過人,謀多智足,領了五萬人馬 屯札河北,頗有紀律,不擾民間一草一木,各各相安,民間感激不啻父母。將那兵丁 三日一操,五日一練,寸步不離營伍。李元帥聞得長老大名,到纔三日,即備許多佈 施,執弟子之禮,前去拜他。長老接見,看得元帥尊重了他,他反拿腔做勢,要做那 佛圖澄對那石勒的光景,十分傲慢。李元帥早已窺破這個和尚是個仗著資質做起來的 ,其實性地上的工夫,全無把捉,這也不在話下。那知這個和尚也是合該數荊那河北 一帶地方遇了天時不湊,顆粒無收。朝廷月糧,壓欠七八個月,不來接濟,軍中洶洶 ,暗地謠言將有楚歌吹散八千之意。李元帥無計設處,只得去到寺中,稱說大和尚大 有應變之才,合掌頂禮,跪在面前,虛心下意,請問和尚。那長老日常間,具那騙小 人的伎倆卻是有餘。那兵馬呼吸待變,實實要湊處錢糧,將來支放,卻也一時窘定, 沒有甚麼計策答那元帥。其實李元帥胸中成算早已定之,只要宛宛說將進去,口口奉 承大和尚長、大和尚短,卻使長老墮在計中,毫無知覺,纔有妙處。李元帥故意做那 攢眉蹙額形容,停了一會,問道:『寺中常住錢糧,不知現有多少積貯?可以暫借目 前救濟一兩月麼?』那和尚的心腸與伽藍菩薩一樣,生成拿進歡喜、拿出卻不中意, 說道:『近來常住不夠十日支橕,虧得小僧有些福緣,到那不足時節,就有人緊著送 來,纔度得這些日子。若說有積聚多少,卻是沒有。』李元帥接口道:『如今我也不 要借常住錢糧,有個算計,只求大和尚「福緣」二字,我弟子就有生路了。』長老聽 說不借錢糧,只借『福緣』精神抖擻起十倍,問道:『如何?如何?』 李元帥道:『弟子領著兵馬南征北討,處處走過,看來無如此地百姓好善的多。如今 弟子到有一個粗念,欲杖著大和尚福緣,明日寺前出張榜文,說是弟子奉請大和尚開 講華嚴法寶,並彈孔雀真經,聚集些善男信女,化些錢糧,也可將來答救一時,』長 老道:『這個道場也動不得人頭,就是來也不多,如何得夠?』 元帥道:『弟子還有計較。』附耳低言,如此如此。那長老笑了一笑,連忙點首。即 於寺內寬敞所在,高搭起七層蓮臺,重重俱已遮蔽好了。 外邊化些鬆柴,周圍疊起;臺下掘個地道,可容一人走得出來。直到了開期第一日, 講經完畢,大和尚開口說道:『大眾們須要速速用心理會,我在此也不久了,只待四 十九日道場圓滿,我就要迴首西方去了。』那些善信聽見大和尚就要迴首,卻是異事 。一時開動,四遠傳聞,那些佈施錢糧的堆山塞海而來李元帥密密著落幾個長老上了 號籍,一一收貯在內。看看到那圓滿之期,人也晝夜不散。四圍鬆柴越發添得多了, 四面的人好像似看戲的,只等那時上臺,不知大和尚顯出怎麼活佛的神道、聖憎的證 果。長老心事:『有那臺下的地道出路,只說外邊放起火來,我自有影身法兒。出了 地道,日後隨了元帥,天涯海角受用不了。』那知元帥日常間一片機心,原是要算計 那長老的。到了放火的時節,將那地道關閉緊了,長老方悟得元帥騙他,也說不得, 硬著身軀,不一時頓成灰燼。元帥在下至誠禮拜,就有附會的說道:『親見大和尚穿 著大紅袈裟,五色祥雲,許多幢鏣寶蓋,接引西方去了。』次日,元帥又在火堆中放 些細白石頭,都道撿得許多舍利子。元帥收去,即欲與死灰祖師造塔,這也就應著當 初取法名識了。那方不論男女,都有佈施,不上一月,積了三十餘萬。元帥一一收去 ,充作兵餉,並無一人知覺。這也是一個大和尚超昇故事。若是這長老日常裡只是苦 行焚修,不裝這個模樣,那李元帥也不來下此刻毒之著。後來說出這段情節,天下之 人齊口稱快。『假使大和尚果能知得過去,未來,怎麼被人暗算到這地位?可見大和 尚都是假鈔,人自癡迷,將自己血汗掙的錢財被他騙去。』眾人道:『如今大和尚挨 肩擦背,委實太多,那能個個登壇、人人說法?近來人也有些厭薄,不大十分的與他 。聚做一團,無有齋吃,只好一個頂著一個,猶如屋角頭的臭老鼠,扯長一串,拿個 引磬,托著缽盂,沿街化食,單單學那釋迦乞食舍衛城中光景。這卻是大和尚做出來 的下場頭也!』豆棚主人道:『仁兄此番說話,果然說得痛快。豆已煮熟,請兄一嘗 何如?』 總評舉世佞佛,孰砥狂瀾,有識者未嘗不心痛之。韓文公佛骨一諫,幾罹殺身之禍。 然事不可止,而其表則傳,千古下讀之,正氣凜凜。及為京兆尹,六軍不敢犯法。指 之曰,是尚欲燒佛骨者。噫嘻!闢佛之神亦威矣。今世無昌黎其人,所賴當事權者, 理諭而法禁之,猶不懲俗,乃復為之張其燄,何也? 夫彼以為咄嗟檀施,聊以懺悔罪孽而已。豈知上好下甚,勢所必然也。縱不能如北魏 主毀佛祠數萬區,又不能如唐武宗驅兆者而盡發,第稍為戢抑,以正氣風之,庶可安 四民、靜異端矣。 此篇拈出李抱真處分死灰事,為當權引伸觸發之機,雖不必如此狠心辣手,所謂法乎 上,僅得乎中。代佛家之示現忿怒,即其示現哀憫也。猶夫梵相獰異,正爾低眉垂手 矣。讀者且未可作排擊大和尚觀,謂之昌黎《原道》文也可,謂之驅鱷魚文亦可。 第七則 首陽山叔齊變節 昨日,自這後生朋友把那近日大和尚的陋相說得盡情透快,主人煮豆請他,約次日再 來說些故事,另備點心奉請。那後生果然次日早早坐在棚下。內中一人道:『大和尚 近來委實太多,惹人厭惡。但仁兄嘴尖舌快,太說得刻毒。我們終日吃素看經,邀人 做會,勸人佈施,如今覺得再去開口也難,即使說得亂墜天花,人也不肯信了。今日 不要你說這世情的話,我卻考你一考。昨日主人翁煮豆請你,何不今日把煮豆的故事 說一個我們聽聽,也見你胸中本領,不是剿襲來的世情閑話也。』那後生仰天想了一 想,道:『不難不難。古詩有云:「煮豆燃豆箕,豆在釜中泣;本是同根生,相煎何 太急。」此曹子建之詩。子建乃三國時魏王曹操之子。弟兄三人,伯曰曹丕,字子桓 ,仲曰曹彰,字子文,季曰曹植,字子建,乃是嫡親同胞所生。曹彰早已被曹丕毒藥 鴆害了。子建高才,曹丕心又忌刻,說他的詩詞俱是宿構現成記誦來的。 彼時偶然席上吃那豆子,就以豆子為題教他吟詩一首。子建剛剛走得七步,就把煮豆 之詩朗朗吟出。五言四句,二十個字,其中滋味關著那弟兄相殘相妒之意,一一寫出 。曹丕見他如此捷纔,心益妒忌。其如子建才學雖高,福氣甚薄,不多時也就死了。 天下大統都是曹丕承接。可見纔與福都是前生定的,不必用那殘忍忌刻,徒傷了弟兄 同氣之情。這是三國時事,偶因豆棚之下正及煮豆之時,就把豆的故事說到弟兄身上 。其實天下的弟兄和睦的少、參商的多。 三國前邊有個周朝。周文王之子、武王之弟周公旦,乃是個大聖人。武王去世,他輔 著成王幼主坐了天下。周公攝行相事,真心實意為著成王,人人都是信的。獨有弟兄 行中有個管叔,他雖是與周公同胞生將下來,那肚腸卻是天淵相隔。周公道是自家弟 兄,心腹相托,叫他去監守著殷家子孫。那知管叔乘著監殷之舉,反糾合蔡叔、霍叔 ,捏造許多流言,說周公事權在握,不日之間將有謀叛之心,卻於孺子成王有大不利 之事。 周公在位,聽了這些不利之言,寢食不安。夢寐之間,心神不寧,也就不敢居於相位 。當在商末之世,四方未服,朝廷京東適值起了一股人馬,在商說是義兵,在周道是 頑民,周公也就借個東征題目,領了人馬坐鎮東京,正好避那流言之意。彼時流言四 布,不知起於何人之口,周公也不忍疑心在管叔身上。 後來成王看見管叔與蔡叔、霍叔都幫著商家武庚幹事,纔曉得乃是奸黨流言。況且打 開金鄊櫃中,看見父親武王大病之時,周公曾納一冊,願以身代,方曉得周公心曲。 青天白日,無一毫瞞昧難明之事。先日周公居東之時,大風大雨,走石飛砂,把郊外 大樹盡行吹倒,或是連根拔了起來。是日成王迎請周公歸國,那處處吹倒之樹,仍舊 不扶自起。此見天地鬼神亦為感動。若是當謗言未息之日,周公一朝身死,萬載千秋 也不肯信。 可見一個聖人,遇著幾個不好的弟兄也就受累不校此又是周時一個弟兄的故事。 還有一個故事,經史上也不曾見有記載,偶見秦始皇焚燒未盡辭言野史中、卻有一段 奇事,即在周朝未定之時,商朝既盡之日,有昆仲兩個,雖是同胞,卻有兩念,始雖 相合,終乃相離。乃兄叫做伯夷,令弟叫做叔齊。他是商朝分封一國之君,祖為墨胎 氏,父為孤竹君。夷、齊二人一母所生,原是情投意合,兄友弟敬的,只因伯夷生性 孤僻,不肯通方,父親道他不近人情,沒有容人之量,立不得君位,承不得宗祧。將 死之時,寫有遺命,道叔齊通些世故,諳練民情,要立叔齊為君。也是父命如此,那 叔齊道:「立國立長,天下大義。父親雖有遺命,乃是臨終之亂命。」依舊遜那伯夷 。那伯夷又道:「父親遺命如何改得?」你推我遜不已,相率而逃。把個國君之位看 得棄如敝屣,卻以萬古綱常為重了。 忽因商紂無道,武王興兵來伐。太公呂望領了軍馬前來,一路人民無不倒戈歸順,還 拿著簞食壺漿,沿路恭迎。不消槍刀相殺,早已把天下定了。伯夷、叔齊看見天命、 人心已去,思量欲號召舊日人民起個義師,以圖恢復,卻也並無一人響應,這叫做孤 掌難鳴,只索付之無可奈何。彼時武王興師,文王去世,尚未安葬。夷、齊二人暗自 商量道:「他是商家臣子,既要仗義執言,奪我商家天下把君都弒了。父死安葬為大 ,他為天下,葬父之事不題,最不孝了。把這段大義去責他,如何逃閃得去!」正商 議間,那周家軍馬早已疾如風雨,大隊擁塞而來。夷、齊看得不可遲緩,當著路頭, 弟兄扣馬而諫道:「父死不葬,爰及干戈,可謂孝乎?以臣弒君,可謂仁乎?」這兩 句話說將過去,說得武王開口不得。左右看見君王顏色不善,就要將刀砍去。剛得太 公與武王並馬而馳。武王所行之師,乃是弔民伐罪之師。太公急把左右止住,心裡也 知是夷、齊二人,不便明言,只說:「此義土也,不可動手。」急使人扶而去之、夷 、齊只兩句話,雖然無濟於事,那天地則常倫理卻一手揭出,表於中天。那天下人心 ,曉得大義的,也就激得動了。其如紂王罪大惡極,人心盡去,把這兩句依舊如冰炭 不同爐的。夷、齊見得如此,曉得都城村鎮,處處有周家兵守住,無可藏身。 倘或將這有用之驅無端葬送,不若埋蹤匿跡,留著此身,或者待時而動也不可知。左 思右算,只得鼓著一口義氣,悄悄出了都門,望著郊外一座大山投奔而去。』 『此山喚名首陽,即今蒲州地面。山上有七八十里之遙,其中盤曲險峻,卻有千層。 周圍曠野,何止一二百里?山上樹木稀疏,也無人家屋宇,只有玲瓏孤空巖穴可以藏 身;山頭石罅,有些許薇蕨之苗,清芬葉嫩,可以充飢;澗底岩阿,有幾道飛瀑流泉 ,澄泓寒冽,可以解渴。夷、齊二人只得輸心貼意,住在山中。始初只得他弟兄二人 ,到也清閑自在。那城中市上的人也聽見夷、齊扣馬而諫,數語說得詞嚴義正,也便 激動許多的人,或是商朝在籍的縉紳、告老的朋友,或是半尷不尬的假斯文、偽道學 ,言清行濁。這一班始初躲在靜僻所在,苟延性命,只怕人知;後來聞得某人投誠、 某人出山,不說心中有些懼怕,又不說心中有些艷羨,卻表出自己許多清高意見,許 多溪刻論頭。日子久了,又恐怕新朝的功令追逼將來,身家不當穩便。一邊打聽得夷 、齊兄弟避往西山,也不覺你傳我,我傳你,號召那同心共志的走做一堆,淘淘陣陣 ,魚貫而入。猶如三春二月燒香的相似,都也走到西山裡面來了。』 『且說山中樹木雖稀,那豺狼虎豹平日卻是多得緊的。始初見些人影,都在那草深樹 密之處張牙露爪,做勢揚威,思量尋著幾個時衰命苦的開個大葷。後來卻見路上行人 稠稠密密,那些孽畜也就疑心起來,只道來捉他們的,卻也不見網羅槍棒。 正在躊躇未定之間,只見走出一個二三尺高、龐眉皜齒、白銀須老漢,立在山嘴邊叫 道:「那些孽畜過來聽我吩咐:近日山中來了伯夷、叔齊二人,乃是賢人君子,不是 下賤庸流。只為朝廷換了新主,不肯甘心臣服,卻為著千古義氣相率而來。 汝輩須戢毛斂齒,匿跡藏形,不可胡行妄動!」那眾獸心裡恍然大悟,纔曉得如今天 下不姓商了。因想道:「我輩雖係畜類,具有性靈,人既舊日屬之商家,我等物類也 是踐商之土,茹商之毛,難道這段義氣只該夷、齊二人性天稟成,我輩這個心境就該 頑冥不靈的麼?」只見虎豹把尾一擺,那些獾狗狐狸之屬,也俱鼓著一口義氣,齊往 山上銜尾而進,望著夷、齊住處躬身曲體,垂頭斂足,懼象守戶之犬;睡在山凹石洞 之中,全不想撲兔尋羊、追獐超鹿的勾當。後來山下之人,異言異服、奇形怪狀,一 日兩日越覺多了。怕夷的念頭介然如石,終日徜徉嘯傲,拄杖而行,彩些薇蕨而食, 口裡也並不道個飢字。看見許多人來挨肩擦背,弄得一個首陽本來空洞之山,漸漸擠 成市井。 伯夷也還道:「天下尚義之人居多,猶是商朝一個好大機括。」不料叔齊眼界前看得 不耐煩,肚腹中也枵得不耐煩,一日幡然動念道:「此來我好差矣!家兄伯夷乃是應 襲君爵的國主,於千古倫理上大義看來,守著商家的祖功宗訓是應該的。那微子奔逃 ,比乾諫死,箕子佯狂,把那好題目的文章都做去了。我們雖是河山帶礪,休戚世封 ,不好嘿嘿蚩蚩,隨行逐隊,但我卻是孤竹君次子,又比長兄不同,原可躲閃得些。 前日撞著大兵到來,不自揣量,幫著家兄,觸突了幾句狂言,幾乎性命不免,虧得軍 中姜太公在內,原與家只東海北海大老一脈通家,稱為義士,扶棄道傍,纔得保全, 不然這條性命也當孤注一擲去了。如今大兵已過,眼見得商家局面不能瓦全。前日粗 心浮氣,走上山來,只道山中惟我二人,也還算個千古數一數二的人品。誰料近來借 名養傲者既多,而托隱求征者益復不少,滿山留得些不消耕種、不要納稅的薇蕨貲糧 ,又被那會起早佔頭籌的採取淨荊弄得一付面皮薄薄澆澆,好似曬乾癟的菜葉,幾條 肋骨彎彎曲曲,又如破落戶的窗櫺。數日前也好挺著胸脯,裝著膀子,直撞橫行。怎 奈何腰胯裡、肚皮中軟噹噹、空洞洞,委實支橕不過。猛然想起人生世間,所圖不過 『名』『利』二字。我大兄有人稱他是聖的、賢的、清的、仁的、隘的,這也不枉了 丈夫豪傑。或有人兼著我說,也不過是順口帶契的。若是我趁著他的面皮,隨著他的 跟腳,即使成得名來,也要做個趁鬧幫閑的餓鬼。設或今朝起義,明日興師,萬一偶 然腳蹋手滑,未免做了招災惹禍的都頭。如此算來,就像地上拾著甘蔗楂的,漸漸嚼 來,越覺無味。今日回想,猶喜未遲。古人云:『與其身後享那空名,不老生前一杯 熱酒。』此時大兄主意堅如金石,不可動搖,若是我說明別去,他也斷然不肯。不若 今日乘著大兄後山采薇去了,扶著這條竹杖,攜著荊筐,慢慢的挨到山前,觀望觀望 ,若有一些空隙,就好走下山去。」』『彼時伯夷早已餓得七八分沈重,原不堤防著 叔齊。叔齊卻是懷了二心多日,那下山的打扮先已裝備停當,就把竹杖、荊筐隨地搬 下,身上穿著一件紫花佈道袍,頭上帶著一頂麻布孝巾,腳下踹一雙八耳麻鞋,纔與 山中面貌各別,又與世俗不同。即使路上有人盤問,到底也不失移孝作忠的論頭。不 說叔齊下山的話,且說那豺狼虎豹,自那日隨了夷、齊上山,畜生的心腸到是真真實 實守在那裡,毫無異念。其中只有狐狸一種,善媚多疑,想也肚裡餓得慌了,忽然省 悟道:「難道商家天下換了周朝,這山中濟濟蹌蹌的人都是尚著義氣、毫無改變念頭 ?只怕其中也有身騎兩頭馬、腳踏兩來船的,從中行奸弄巧。」一面就喚著幾個獐兒 、鹿兒、猿兒、兔兒分頭四下哨探些風聲,打聽些響動,報與山君知道。或者捉個破 綻,將些語言挑動,得他一個迴心轉意,我輩也就有肚飽之日了。商量停當,即便分 頭仔細踹探。只見前山樹陰堆裡遮遮掩掩而來,那些打哨的早已窺見,閃在一邊。待 他上前覿面看時,打扮雖新,形容不改,原來不是別人,就是前日為首上山的令弟叔 齊大人。眾獸看見卻也嚇了一跳,上前一齊抓住,遂作人言道:「叔齊大人,今日打 扮有些古怪,你莫不有甚麼改易的念頭?」叔齊道:「其實不敢相瞞!守到今日也執 不得當時的論頭了。」眾獸道:「令兄何在?」叔齊道:「家兄是九死不渝的,我在 下另有一番主意。昨日在山上正要尋見你們主人,說明這段道理,約齊了下山。不料 在此地相會,就請到這山坡碎石頭上大家坐了,與你們說個爽快。就煩將此段情節轉 達山君,一齊都有好處。」眾獸聽見叔齊說得圓活,心裡也便鬆了一鬆,就把衣服放 了,道:「請教,請教。」叔齊道:「我們乃是商朝世冑子弟,家兄該襲君爵,原是 與國同休的。如今尚義入山,不食周粟,是守著千古君臣大義,卻應該的。我為次子 ,名分不同,當以宗祠為重。 前日雖則隨了人山,也不過幫襯家兄進山的意思。不日原要下山,他自行他的志,我 自行我的事。不消說,我懊悔在山住這幾時。如眾位及山君之輩,既不同於人類,又 不關係綱常,上天降生汝輩,只該殘忍慘毒,飲血茹毛,原以食人為事。當此鼎革之 際,世人的前冤宿孽消弭不來,正當借重你們爪牙吞噬之威,肆此吼地驚天之勢,所 謂應運而興,待時而動者也。 為何也學了時人虛驕氣質,口似聖賢,心同盜蹠,半醒半醉,如夢如癡,都也聚在這 裡,忍著腹枵,甘此淡薄,卻是錯到底了。你們速速將我這段議論與山君商酌,他自 然恍然大悟。想了我這段好活,萬一日後世路上相逢,還要拜謝我哩!」眾獸聽了這 一番說話,個個昂頭露齒,抖擻毛皮,攙天撲地,快活個不了。叔齊也就立起身拱手 道:「你們卻去報與山君知也。」眾獸一齊跳起,火速星飛,都不見了。叔齊伸頭將 左右前後周圍一看,道:「我叔齊真僥倖也!若不是這張利嘴滿口花言,幾根枯骨幾 乎斷送在這一班口裡,還要憎慊癟蝨氣哩。」』叔齊從此放心樂意,踹著山坡,從容 往山下走了二三十里,到一市鎮人煙湊集之處,只見人家門首俱供著香花燈燭,門上 都寫貼「順民」二字。又見路上行人有騎騾馬的,有乘小轎的,有挑行李的,意氣揚 揚,卻是為何?仔細從旁打聽,方知都是要往西方朝見新天子的。或是寫了幾款條陳 去獻策的,或是敘著先朝舊職求起用的,或是將著幾篇歪文求徵聘的,或是營求保舉 賢良方正的,紛紛奔走,絡繹不絕。叔齊見了這般熱鬧,不覺心裡又動了一個念頭道 :「這些紛紛紜紜走動的,都是意氣昂昂,望著新朝揚眉吐氣,思量做那致君澤民的 事業,只怕沒些憑據,沒些根腳,也便做不出來。我乃商朝世臣,眼見投誠的官兒都 是我們十親九戚,雖然前日同家兄衝突了幾句閑話,料那做皇帝的人決不把我們錙銖 計較。況且家兄居於北海之濱,曾受文王養老之典,我若在朝,也是一個民之重望, 比那些沒名目小家子騙官騙祿的,大不相同矣!」一邊行路,一邊思想。 正在虛空橫擬之際,心下十分暄熱,抬頭一望,卻見五雲深處縹緲皇都。叔齊知道京 城不遠,也就近城所在尋個小寓,暫且安身,料理出山之事。諸般停當,方敢行動。 整整在那歇客店裡想了一夜。 『次日正要到那都城內外覓著鄉親故舊,生些盤費,走不上一二里路,只見西北角上 一陣黑雲推起,頃刻暗了半天,遠遠的轟轟烈烈,喧喧闐闐,如雷似電,隨著狂風捲 地而來。 叔齊也道是陣暴風疾雨陡然來的,正待要往樹林深處暫為躲避,那知到了面前,卻是 一隊兵馬。黑旗黑幟、黑盔黑甲,許多兵將也都是黑袍、黑面的。叔齊見了,先已閃 得神魂顛倒。不料當著面前大喊一聲道:「拿著一個大奸細也!」不由分說,卻把叔 齊蒼鷹撲兔相似一索捆了,攢著許多刀斧手,解到營內。叔齊還道是周家兵馬,大聲 喊道:」我是初出山來投誠報效的!」上邊傳令道:「既是投誠報效的,且把繩索鬆 了!」叔齊神魂方定,抬頭一看,只見上面坐的都是焦頭爛額、有手沒腳、有頸無頭 的一班陣上傷亡。中間一人道:「你出身投誠報效,有何本事?」叔齊也就相機隨口 說道:「我久住山中,能知百草藥性,凡人疾病,立能起死回生。」眾傷亡聽見這話 ,正在負痛不過的時節,俱道:「你有藥,速速送上來,替我輩療治一治,隨你要做 甚麼官都是便的。」言之未已,忽見左班刀斧手隊裡走出一人,上前將叔齊頭上戴的 孝巾一把扯落,說道:「你既要做官,如何戴此不樣之物?就是做了官兒,人也要把 你做匿喪不孝理論!」那右班又走出一個人來,把叔齊面孔仔細一認,大叫道:「這 是孤竹君之子,伯夷之弟,叫做叔齊。近來臉嘴瘦削,卻就不認得了。」眾人上前齊 聲道:「是,是。若論商家氣脈,到是與我們同心合志的。但是這樣衣冠打扮,又不 見與他令兄同行,其中必有緣故。」中間坐的道:「近來人心奸巧,中藏難測,不可 被他逞著這張利口嘴漏了去!」吩咐眾人帶去,正待仔細盤詰個明白。叔齊心裡纔省 得這班人就是洛邑頑民了,不覺手忙腳亂,口裡尚打點幾句支吾的說話,袖中不覺脫 落一張自己寫的投誠呈子稿兒。眾人拾起,從頭一念,大家拳頭巴掌雨點相似,打得 頭破腦開。中間的罵道,「你世受商家的高爵厚祿,待你可謂不薄,何反蒙著面皮, 敗壞心術,就去出山做官!即使做了官兒,朝南坐在那邊,面皮上也覺有些慚愧! 況且新朝規矩,你扯著兩個空拳怎便有官兒到手?如此無行之輩,速速推出市曹,斬 首示眾!」眾人把叔齊依舊捆縛,正要推出動手。且未說畢。』 『只說前日眾獸得了叔齊這番說話,報與山君,山君省道:「有理,有理!我輩若忍 餓困守山中,到做了逆天之事!」一個個磨牙礪齒,一個個奮鬣張威,都在山頭撼天 振地,望著坡下一隊一隊踹踱而來。行到山下,適值撞著那些頑民營裡綁著叔齊押解 前來,將次行刑之際。那前隊哨探的狐兔早已報與山君道:「前日勸我們出山的叔齊 ,前途有難。」那山君即傳令眾獸上前救應,卻被那頑民隊裡將弓箭刀槍緊緊布定。 眾獸道:「拜上你家頭領!叔齊乃是我輩恩主,若要動手,須與我們山君講個明白。 不然我們並力而來,你們亦未穩便!」不一時,那頑民的頭目與那獸類的山君,兩邊 齊出陣前,俱各拱手通問一番。然後山君道:「叔齊大人乃我輩指迷恩主,今日正要 奉上天功令,度世安民,刈除惡孽,肅清海宇,敷奏太平,你如何把他行害?」那頑 民道:「天無二日,民無二王。叔齊乃商朝世勛,他既上欺君父,下背兄長,是懷二 心之人。我輩仗義興師,不幸彼蒼不佑,致使我輩倫落無依。然而一片忠誠天日可表 ,一腔熱血萬載難枯。今日幸得狹路相逢,若不剿除奸黨,任他衣紫腰金,天理何存 ?王綱何在?」兩邊俱各說得有理,不肯相讓。』 『正在舌鋒未解之時,只見東南角上祥雲冉冉,幾陣香風,一派仙樂齊鳴;前有許多 珍禽異獸跳躍翱翔,後有許多寶蓋幢幡飄靗飛舞;中間天神天將簇擁著龍車鳳輦而來 ,傳呼道:「前邊的畜生餓鬼俱各退避!」那頑民獸類也先打聽得來的神道乃是玉皇 駕前第一位尊神,號為齊物主,澄世金仙。專司下界國祚興衰,生人福祿修短,並清 算人世一切未完冤債等事。 當今國運新舊交接之時,那勾索的與填還的正在歸結之際。兩邊頑民獸類與叔齊見了 ,一齊跪下,俱各訴說一番。齊物主遂將兩邊的說話仔細詳審,開口斷道:「眾生們 見得天下有商周新舊之分,在我視之,一興一亡,就是人家生的兒子一樣,有何分別 ?譬如春夏之花謝了,便該秋冬之花開了,只要應著時令,便是不逆天條。若據頑民 意見,開天闢地就是個商家到底不成,商之後不該有周,商之前不該有夏了。你們不 識天時,妄生意念,東也起義,西也興師,卻與國君無補,徒害生靈! 況且爾輩所作所為,俱是骯髒齷齪之事,又不是那替天行道的真心,終甚麼用!若偏 說爾輩不是把那千古君臣之義便頓然滅絕,也不成個世界。若爾輩這口怨氣不肯消除 ,我與爾輩培養,待清時做個開國元勛罷了。」眾頑民道:「我們事雖不成,也替商 家略略吐氣。可恨叔齊背恩事仇,這等不忠不孝的人,如何容得!」齊物主道:「道 隆則隆,道污則污,從來新朝的臣子,那一個不是先代的苗裔?該他出山同著物類生 生殺殺,風雨雷霆,俱是應天順人,也不失個投明棄暗。」眾頑民道:「今天下塗炭 極矣,難道上天亦好殺耶?」齊物主道:「生殺本是一理,生處備有殺機,殺處全有 生機。爾輩當著場子,自不省得!」眾頑民聽了這番說話,個個點首。忽然虎豹散去 ,那頑民營伍響亮一聲,恍如天崩地裂。那一團黑雲、黑霧俱變作黃雲,逍遙四散, 滿地卻見青蓮萬朵,湧現空中。立起身來,卻是叔齊南柯一夢。省得齊物主這派論頭 ,自信此番出山卻是不差,待有功名到手,再往西山收拾家兄枯骨,未為晚也。』眾 人道:『怪道四書上起初把伯夷叔齊併稱,後來讀到「逸民」這一章書後,就單說著 一個伯夷了。其實是有來歷的,不是此兄鑿空之談。敬服敬服!』 總評滿口詼諧,滿胸憤激。把世上假高尚與狗彘行的,委曲波瀾,層層寫出。其中有 說盡處,又有餘地處,俱是冷眼奇懷,偶為發洩。若腐儒見說翻駁叔齊,便以為唐突 西施矣。必須體貼他幻中之真,真中之幻。明明鼓勵忠義,提醒流俗,如煞看虎豹如 何能言,天神如何出現,豈不是癡人說夢! 第八則 空青石蔚子開盲 昔日孔聖人有個弟子樊遲,曾向夫子請學為圃。那為圃之事,乃是鄉下人勾當,如何 樊遲要去學他?這是樊遲諷勸夫子之意。看見夫子周流天下,道大莫容,不知究竟何 似,不如尋個一丘一畝,種些瓜茄小菜,到也有個收成結果。若論地畝上收成,最多 而有利者,除了瓜蔬之外,就是羊眼豆了。別的菜蔬都是就地生的,隨人踐踏也不計 較。惟有此種在地下長將出來,纔得三四寸就要搭個高棚,任他意兒蔓延上去,方肯 結實得多;若隨地拋棄,盡力長來,不過一二尺長也就黃枯乾癟死了。譬如世上的人 ,生來不是下品賤種,從幼就要好好滋培他,自然超出凡品;成就的局面也不淺陋。 若處非其地,就是天生來異樣資質,其家不得溫飽,父母不令安閑,身體不得康健, 如何成就得來?此又另是豆棚上一樣比方了。昨日主人彩了許多豆莢,到市上換了果 品,打點在棚下請那說書的吃。那知這些人都是鄉愚氣質,聽見請吃東西,恐怕輪流 還席,大半一哄走了。止有十餘個人大雅坐在那裡,正經說過書的一個不在。 卻有一位少年半斯不文,略略象些模樣,主人請過來坐,他也就便坐了。後來眾人上 前道:『今日主人興致甚佳,不要被那班俗老掃盡了。』指著這位少年道:『看來今 日別無人了,卻要借重尊兄,任意說一回故事點綴點綴!』那少年道:『在下雖是這 個模樣,人道是宦門子弟,胸中畢竟有些學問,其實性子從小養驕,睜著兩隻亮光光 眼睛,卻是一個瞎字不識。日常間人淘裡挨著身子聽人說些評話,即使學得幾句,只 好向不在行的面前胡言亂道,潦草壓俗而已。今日若要我上場說那整段的書,萬萬不 敢!』眾人道:『不管前朝後代、真的假的,只要說得熱鬧好聽便了。』少年道:『 昨日房下叫我撿個日子,卻把曆日顛倒拿了,被人笑話。若今日說出些沒頭脫柄的故 事,被側邊尖酸朋友嗅嗅鼻頭、瞻瞻眼睛做鬼臉、捉別字笑個不了,下遭連這個清涼 所在坐也坐不成了。列位諒不是那浮薄之輩,若畢竟要說,沒奈何也只得獻醜。且說 過,我是聽別人嘴裡說來的,即有差錯,你們只罵那人嚼蛆亂話罷了。』眾人道:『 只是這個話柄也就圓活波瀾得緊,自然妙的。』少年道:『我上年到蘇州城裡北寺中 間耍,聽得和尚打著鐃鈸說道:天地開闢以來,一代一代的皇帝都是一尊羅漢下界主 持。唐虞時揖讓,湯武時征誅;後來列國紛爭,秦漢吞併,有以仁義得國的,有以奸 雄得國的,其間千態萬狀,不可計數,總是那冥冥中一位羅漢作主。這也是個輪來苦 差,推不去的。當初不知那個朝代交接之際,天上正在那裡撿取一位羅漢下界,內中 卻有兩個羅漢,一尊叫做電光尊者,一尊叫做自在尊者,都不知塵世齷齪,爭著要行 。往見燃燈古怫,求他作主。古怫道:「下界這一遭都是不可免的,只差個先後來去 ,我也沒個別法。只將我面前鐵樹二株,各人取一株去,種在東西山上。先開花的就 去。」兩尊者俱各領命而行。電光尊者心裡急躁,看得西方背陰處好培植,即將樹種 在西山。隨從的羅剎們道:「鐵樹須要用火去鍛鍊他就有花了。」頃刻移那萬丈火光 中的烈燄,一霎時順風捲去。那花頓然迸發,卻是空花,眼前一晃就不見了。自在尊 者心性從容,看得東方近著生氣,將樹種在東方,待他自然長大開花。卻候了許久, 纔發出一些萌芽,眼見得開花尚有幾時也。 那古佛早已看見,道:「電光,你見識差了,只圖到手得快,卻是不長久的。既有花 在先,你先去罷,自在且略緩些,也隨後就來了。」電光尊者即下塵凡,降生西牛賀 洲,姓焦名薪,任著火性把一片世界如雷如電焚灼得東焦西烈。百姓如在洪爐沸湯之 中,一刻難過。也是這個劫運該當如此,不在話下。』 且說自在尊者,不慌不忙也隨即下了雲端,降生東勝神州,姓蔚名藍,生來性子極好 清淨。一日正在山中放那調神養氣的工夫,那曉得焦薪行那些殘忍暴虐之政,處處禁 受不得,積怨深怒。 上達天庭,上帝震怒,即喚天神天將糾集風伯雨師、雷公電母,領著火輪火部一切神 祗,從空豁喇一聲,霎時山崩地烈,拔木飛砂,連天拄也迸作兩截;世界人民物畜, 一半都被震烈飄揚,化作纖悉微塵,不知去向。那山中蔚藍也被唬得魂不附體,看見 世界這場大變,不知甚麼緣故,竟往山外奔出命來。忽見天上五花迸裂,就像一座極 大高山傾圮半邊,這半邊也象就倒下來的光景。雖有十分懼怕,卻也無處投奔,勉強 看著腳下隨高逐低撿路而去。只見地上斗大一塊圓石,裡外通明,青翠可愛。蔚藍原 是天生智慧的,曉得此石喚名空青。當初女姻氏煉石補天,不知費了多少爐錘煉得成 的。今日天上脫將下來,也是千古奇緣。此石中間止有一泓清水,世間一切瞽目,金 針蘸點,無不光明。緊緊抱在懷中,立願點開世人瞎眼,盡還光明,纔為正果。信步 而行,不覺走到中州地面。漸漸琢開那塊青石,正欲普度人間黑暗地獄,逢著瞽目之 人,一點就亮。 不兩日間,四下瞽者俱已傳遍,來了許多,俱要求點。只見雲端裡現出一位金甲神人 ,大聲呼著蔚子道:「你卻違了天心也!」蔚子跪下就問其故。那神人道:「當今世 時,乃是五百年天道循環輪著的大劫,就是上八洞神仙也難逃遁。這些世上盲子,都 是前冤宿孽,應該受的,你如何一概與他點明?將上天折罰之條是不得行於人世了。 速速藏過,日後自有用頭。不可濫用了!」 言訖,漸漸雲掩攏來就不見了。蔚藍大仙省得上天之意,就把空青收拾好了,訪得陝 西華山是天下名境,中有陳摶老祖,整整睡了千年,忽然醒了,能知世間過去未來之 事,指點愚人吉凶禍福先機,人往叩之,無不響應。不若就往華山尋個靜室,皈依老 祖,也好就近做那訪道修真之事,不在話下。』『且說中州有個先兒,--那地方稱 瞎子,叫名先兒。這瞎子姓遲名先。有人說道:「你怎麼叫做遲先?」那瞎子道:「 我不是先兒之先,卻另有個意思。如今的人眼明手快,捷足高才,遇著世事,如順風 行船,不勞餘力。較之別人受了千辛萬苦橕持不來,他卻三腳兩步、早已走在人先, 佔了許多便宜。那知老天自有方寸,不肯偏枯曲庇著人,惟是那腳輕手快的,偏要平 地上吃跌,畢竟到那十分狼狽地位,許久掙揣不起。倒不如我們慢慢的按著尺寸平平 走去,人自看我蹭蹬步滯,不在心上。那知我到走在人的先頭,因此叫做遲先。」那 人道:「你何苦閉著雙眼,終日嘿嘿癡癡坐在家裡?當此艷陽天氣,何不走在市上生 幾貫錢來,買酒吃也好。」遲先道:「我也悶得極了,昨日獨自睡在冷草鋪上,聽得 屋簷外桃柳枝上燕語鶯啼,叫得十分嬌媚。 又聽得東邊賣花聲,西邊沽酒聲,兒歡女笑,成團結隊,或是上墳的,或是踏青的, 好不喧轟熱鬧。自恨前生不知作何罪孽,把我失卻雙眼,上前不得,退後不得,一個 黑漆漆囫圇空影,不知何時踹得他破!昨日有人傳說,市上來了一個雲遊道人,手持 空青,點開人許多雙瞽。偏我沒緣,急急尋他,又不知那裡去了。如今欲打聽個實信 ,四下找尋。那有眼的,如何肯扶掖我到前路去?今想一個道理在此,站在十字路口 ,等個同伴走過,先去撞他個頭昏腦暈,然後漸漸與他說入港去。」言之未畢,只聽 得西邊巷裡咯支咯支的。明杖響處,卻有個先兒來也。遲先把個頭頸伸放在左臂膊上 ,仔細側著耳朵聽他將到面前,便把肩膊橫沖過,卻好把那先兒的太陽撞得十生九死 、仰面一交跌在地下。那先兒手也憐俐,就把遲先左腿抱定,死也不放。少覺甦醒轉 來,就把遲先腿上咬了兩口,罵道:「你又不是我的兒子,如何也學我把人亂撞!」 一口氣連珠貫串,罵個不了。遲先連忙道:「得罪得罪!」那先兒右手一摸,方曉得 也是同道中人。帶怒問道:「同在黑暗地獄中人,有何心事要緊,走得這般莽撞?」 遲先道:「只怕對你說了,連你也莽撞起來。你不曉得市上有個仙人拿著空青,點開 了許多瞎眼,因要尋他,如此性急。」那先兒道:「奇哉奇哉!我昨日耳邊又聞得華 山頂上陳摶老祖千年睡醒,能言人過去未來現在禍福,往問者紛紛。因此我出門,也 要覓個夥計前往一遭。今既與兄同病,自合與兄同調,不老就在此地盟心設誓,並膽 同心,互相幫扶,一面去訪點眼仙人,一面上山拜問老祖,豈不一舉兩得?」遲先道 :「極妙極妙!」那先兒道:「老兄高姓大名?」遲先就把取名遲先的話兒說了一遍 ,也贊道:「『遲』字上說出個『先』字來大有意理。」遲先道:「也要請教尊兄姓 名?」那先兒道:「弟姓孔名明。」遲先道:「孔明是個後漢時劉先王的軍師。你如 何盜竊先賢名姓?」孔明道:「我不是那三國的孔明,卻另有個取意。如今的人胡亂 眼睛裡讀得幾行書,識得幾個字,就自負為才子;及至行的世事,或是下賤卑污,或 是逆倫傷理;明不畏王章國法,暗不怕天地鬼神,竟如無知無識的禽獸一類。到不如 我們一字不識,循著天理,依著人心,隨你古今是非、聖賢道理,都也口裡講說得出 ,心上理會得來,卻比孔夫子也還明白些,故此叫做孔明。」遲先道:「難得我與你 一對兒合拍的。但是同行合伴前去,途中日子正長,也要彼此預先計較停當,譬如行 商坐賈,也要對著本兒。如今我們出路的勾當,不過空著雙手本領賺錢,不知你我伎 倆何如?不若尋個空處,大家將本事講論明白,試演一番,省得前途你推我諉,被人 譏誚。」孔明道:「有理。尋個僻靜去處方好。」兩個挨查了半日,剛得一個冷落的 廟宇。兩個走進廟裡,放了拐兒,朝著神道連唱數喏,相率坐下。遲先道:「我的本 領多著哩,有個〔西江月〕說與你聽:『挑水擔泥做瓦,煽爐磨粉馱鹽。 子平易課准如仙,鐵口人人羨羨。』」孔明道:「我的伎倆比你高貴哩,也有一個〔 西江月〕:『品竹彈弦打鼓,說書唱曲皆能。祈神保福與禳星,牌譜棋經俱勝。』」 遲先道:「我與你合了夥計,一路行去,不論高低貴賤都用得著,不怕前途沒處尋飯 吃。但各人俱要放出本心來相處,一路有福同享,有苦同受,不要退悔。就是今日各 出少許,在神聖前燒一陌紙,盟一明心,彼此各有個相信處。」孔明道:「妙妙!」 兩個就各問了生年月日,孔明卻長遲先一歲,認做哥哥,先在肚兜內摸出十個錢來, 六個錢買塊豆腐,四個錢買了蠟燭。遲先身邊也取出錢十文,買一小瓶黃酒,又買一 股線香。擺列端正,各各禱祝一番,立了一誓,拜了四拜方完。孔明即伸手悄悄的摸 那酒瓶,私自喝了一口。遲先也去偷那豆腐,兩個以手觸手,登時便喉急嚷將起來。 一個說「你偷來吃」,一個說「你先動手」,可笑兩個盟兄盟弟,登時就變轉臉來, 氣吼吼的俱要動手相打。惹動了地方兩個光棍,一個叫做油裡滑,一個叫做滑裡油, 立在旁邊看了許久,道:「兩個盲囚不知來歷,路上相逢,就要拜盟,一言不合,登 時嚷鬧,到也是個近日好耍子的世情。我們趁他爭競之際,一個裝做官兒,一個扮作 皂隸,拿他過來,問個明白,卻不好麼!」油裡滑即裝皂隸,開聲吆喝道:「不要嚷 !」滑裡油道:「甚麼人喧嚷,快拿過來!」遲先、孔明信道真的,即便跪將過去, 說了一遍。官道:「這樣小事也來驚動上官。本待各打二十,問個罪名,罰幾兩銀子 。憐你廢疾之人,各罰本領試演一出,饒你去罷!」遲先就請官兒的八字,皂隸的勾 當,將子平易課推算了半晌;孔明也就把當時編就的李闖犯神京的故事說了一回,又 把一日天的戲本唱了一出。弄得兩個脣乾舌燥,又磕了許多頭方纔釋放。遲先道:「 此地怎麼有這位好老爺?若經別的衙門,這官司不知何時歸結?今又不動刑、不問罪 ,立刻發落,真難得的。這樣清廉的官,若在大府大縣裡,就該造一個極大的生祠了 。」孔明道:「我與你依舊相好如初,天下拜弟兄的,打場官司也是常事。若不經這 爭論一番,你我心事都未見得。今後把這齷齪心腸大家洗滌乾淨卻就好了。」兩個從 此你敬我愛,一程一程,仗著伎藝趁些飯食。一路來,點空青的道人尚未尋著,不覺 的已到華山腳下。進了山門,一步一拜到了山頂。那山上乃是仙家藏真修煉之處,山 花果木、猿鶴禽魚都非人間所有,藥爐丹灶俱有仙童看守。那些求仙問福的雖有許多 ,也俱在彼靜心守候,直待老祖講道之際方去叩問。遲、孔二人虔心,不遠千里而來 ,巴不得立時討個下落回去,那裡等得,兩個忽然大哭起來。老祖念他心誠,吩咐仙 童扮作採樵漢子,故意作難他道:「你們既要來此問仙,須把舊日肺腸先在山下洗刷 淨盡,方好問道。何得粗心浮氣,剛剛來得就哭泣起來!」遲、孔二先心知自己不誠 ,求懇樵子領路走下山來,在那池邊將雙手掬水入口,噴漱不了。樵子道:「肺腸如 何洗得淨的?我有小白石子數個,從口吞入,待他在內磨礪一番就乾淨了。」遲、孔 二先如法吞下,不一時卻吐出許多腌臢血肉之類,頓覺心地空靈。樵子又每人與棗一 枚食之,也竟不知飢餒。忽有一個仙童立在山頂稜峭崖嘴之上,招呼道:「兩俗子速 上山來聽候吩咐!」遲、孔二先仍復匍匐而上,依著仙童之言,叩到老祖講席之下。 高聲道:「小子罪孽深重,獲怒上天,削奪雙明,糊塗一世。今聞老祖睡足千年,覺 開萬古,弟子虔心拜叩,求問生前有何惡孽,致使五行蹭蹬,一隙無明,受此迷離顛 倒之苦?」老祖道:「二子遠來叩問,性靈中也就開了一線光明。那知你本來惡孽卻 與常人不等,人身受病各有不齊,如聾者、跛者、蹩者、瘤者,不過一世二世。天資 刻雹小佔便宜,或面是背非,或阻人善事,猶與倫常彞理之上不相關涉,乃有當身結 束,或轉世承當,這一盤零星小帳也就勾銷盡了。若鑿去雙睛,沈淪白晝,這孽障更 覺重些。今世界大矣,一雙腳走不盡;寶貝多矣,一雙手拿不完;滋味美矣,一個臭 皮囊裝不滿。只因世人心雄意狠,走出娘懷,逞著聰明,要讀盡世間詩書;憑著氣力 ,要壓倒世間好漢。錢財到手,就想官兒;官兒到手,就想皇帝。若有一句言語隔礙 ,便想以暗箭驀地中傷;若有一個勢利可圖,便想個出妻獻子求媚。 眼見得這些燄頭上根基都是財築起的,強梁的口嘴都是勢裝成的,雄威的體面都是黨 結就的。遇著有識見的,到此地位,早早抽身跳出圈外;略不濟的,便是糞裡蛆蟲和 身鑽入。你在前世兩隻眼睛早已盲矣,今世怎麼又肯把你一對眼睛?你若今世曉得自 己罪孽非輕,急圖修省,後世還把你做明眼人看待;若癡迷錮塞,不肯回頭,那天條 瞽目一款之外,更有泥犁不盡地獄之苦矣!」老祖說得痛切,那遲、孔二先仰天號咷 大哭,覺得此生不得開眼看那光明世界,便要尋個陡險山崖,從空跳下,做個捨身之 計。老祖道:「那『捨身』二字,不過喚醒愚人脫那『貪戀』二字,原不叫人將身跳 下。爾輩既要開眼看那光明世界也不難的,我有個道友蔚藍大仙,現在西山茅茨庵, 可前往求他便了。」遲、孔二先叩謝而下不題。』 『卻說蔚藍大仙,自那日來到華山與老祖終日講論,看得世界擾擾攘攘、東紛西裂, 尚無定所,觀那天星,該是他的氣候方肯出山。一路上訪著那孝子順孫、義夫節婦, 都已收載輪迴簿上,以待天運轉時應世而起,一用著他的。那一塊空青封錮好的,終 日藏在枕下。忽見遲、孔二先仙童領著自東山一步一拜而來,到了面前,依舊是前日 模樣,放聲大哭。蔚藍見了,心上就發出一點仁慈道:「既是老祖送來見我,我卻無 別的說話,只有枕下那一點空青可救得你。」即往睡處取出那一塊石來,開了封皮, 將瞳神上每人蘸上一點,那四個眼珠子豁然而開,朝著蔚藍叩頭就拜。蔚藍道:「去 暗還明乃是上天所主,只該拜謝上天罷了。但此乃是仙家所在,你塵俗之於速速下山 ,不可在此久祝」那遲、孔二光立在山頂從空一望,世界上紅塵碌碌、萬徑千溪都在 目前,反又哭將起來道:「向來合著雙眼,只道世界上不知多少受用。如今開眼一看 ,方悟得都是空花陽燄,一些把捉不來。只樂得許多孽海冤山,劫中尋劫,到添入眼 中無窮芒刺,反不如閉著眼的時節,到也得個清閑自在。 弟子沒眼時到好走上山來,如今有了眼卻不肯走下山去。」蔚藍大仙被他哀求不過, 卻又說道:「此與塵世相隔,不時有天曹仙使往來宣召,爾輩不便容留。向日曾在彌 勒大師處借得布袋一個,此中空空洞洞,可容三千大千世界,所培養者都是忠孝節義 正氣一脈,日後應運而興,正可仗他扶持世界。爾輩乃上天刑餘之夫,不過碌碌等輩 ,又不便與正人君子同居,勉強另顯一個神通。」吩咐仙童往杜康處借一大埕,叫這 二人投身入內。始初遲、孔二人看得埕口甚小,將頭近埕一望,只見埕內尚自寬大。 兩個就和身鑽人,舉頭四顧,俱是平坡曠野,不見城廓宮室。趁著風和日暖,走到一 個市上。覺得風俗甚醇,相與之人俱欣欣揖讓,和和藹藹,絕無喜怒愛憎之色。散誕 開懷,脫帽露頂,或歌詩唱曲,或擲色猜枚,或張拳較力,或肆口詈人。彼此沒有戒 心,爾我俱無仇恨。衣服不須布帛,飲食不須五穀。憨憨呼呼,天不知高,地不知厚 。四時不知寒暑,朝夕不知晦明。要行即行,不知舟車驢馬;要睡便睡,不須牀席枕 衾。與鳥獸魚鱉雜處而不覺;無痛癢疾病之相關。耕作不相為謀,租稅不來相逼。正 所謂「壺中日月常如此,別有天地非人間」也。只叫那遲、孔二人坐在崑崙山頂,大 著兩眼,看那電光尊者雷、風、雹、雨過那一陣,地面上把那些孽火劫灰拈得淨盡, 然後隨著自在尊者出來逍遙世道,安享太平之福也。』 『此段說話實是玄虛,原不堪人耳,既承主人有興,又復承列位雅愛,冒昧而談。便 好請教別位朋友,當個拋磚引玉之意。』 眾人道:『承領高談,不覺兩脅風生,通體透快。乘著天氣涼爽,各且別去,今夜我 等且到杜康埕裡世界安享一夜何如?』 總評此則以瞽目說法,大是奇異。至後以酒終之,真是非非想矣。凡天下事到無可如 何處,惟醉可以銷之,所以劉伶荷鍤、阮藉一醉六十日,俱高人達見,不徒沈醉曲櫱 而已。艾納老人其亦別有萬言於斯乎? 第九則 漁陽道劉健兒試馬 金風一夕,繞地皆秋。萬木梢頭蕭蕭作響,各色草木臨著秋時,一種勃發生機俱已收 斂。譬如天下人成過名、得過利的,到此時候也要退聽謝事了。只有扁豆一種,交到 秋時,西風發起,那豆花越覺開得熱鬧,結的豆莢俱鼓釘相似,圓湛起來,卻與四五 月間結的癟扁無肉者大不相同。俗語雲,『天上起了西北風,羊眼豆兒嫁老公』,也 不過說他交秋時豆莢飽滿,漸漸到那收成結實留個種子,明年又好生。這幾時秋風起 了,豆莢雖結得多,那人身上衣服漸單,肩背上也漸颯颯的冷逼攏來。那有家業的, 衣服整備,只要開箱籠取出穿上,登時溫暖。 那些游手好閑的,風來風盡,雨來雨盡,瓶中尚無隔宿之米,身上那得禦寒之衣?四 下裡沒處擺佈,未免就起一個無賴之想、不良之心。小意思,逞著自己一身伎倆做個 掏摸,隨著造化,偷得或多或少,也有幾時口嘴肥甜,還圖個僥倖,不到那敗露之日 。那大意思的,就去勾合了許多狐朋狗黨,歃血盟心,覓了些刀槍弓箭,聚在一處, 預先打聽得某家豪富,某家殷實,某家有備,某家無備,或乘月黑風雨之夜,或乘人 家忙倦之時,帶著火草、軟梯,爬牆上屋,劈門挖洞,大聲發喊,逞著雄威,持著利 刀,捉住財主活逼獻寶,口氣略鬆些,便綁縛起來,或將弓弦捎?,火燄炙烙,不論 金珠緞匹、器皿衣服,裝拾包裹而去。倘遇外邊風聲緊急,即便放起火來,奪路而走 ,揀個僻靜所在,贓物照股均分,一時星散。這些勾當,全憑時運撞著為數。有劫得 金銀寶貝的,有劫得破爛衣服的,也有用了許多氣力,一毫不曾拿得、反被殺傷捉獲 的。一文錢不曾沾手,一碗麵不曾下肚,到問了已行而但得財,不論首從皆斬之律, 本等清清白白一個百姓,把這條性命骯骯髒髒葬送去了。這都是日常間不遵父母伯叔 之教,不聽弟兄朋友之勸,終日遊花開賭,口嘴吃慣,身上穿慣,手裡用慣,氣質使 慣,以至到這田地。 難道祖、父生將下來限定乾這勾當不成?所以人家子弟從小時就要擇交,遇著憊懶的 小廝,不可容他近身。難道小子就有甚麼行害著他?但是孩子家心性不要容他,習學 慣了,也是防微杜漸之意。在下向在京師住了幾年,看見錦衣衛東廠,及京營捕盜衙 門,管著禁城內外地方,奉旨嚴緝賊盜。屬著錦衣衛東廠的,叫做伙長儅頭,俱是千 百戶官兒出身。屬在東西南北中五城兵馬司的,叫做番子手。逢著三六九日點限比較 。若官府不甚緊急,那比較也是虛應故事。如地方失事,上邊官府嚴追,不消幾個日 子,那盜賊一一捉將來了。卻象甕中捉鱉,手到拿來,不知甚麼神通。 偶然相會一個番子,無心間請問著他,那番子到也口直,說道:『這強盜多沒有真的 。近日拿來的都是我們日常間種就現成有的,所以上邊要緊,下邊就有。』在下一聞 此言,不覺十分驚駭,道:『怎麼盜賊也象瓜兒菜兒種得就的?』那番子道:『我們 京城裡夥伴不下萬人。日常裡伙長儅頭出些盤費,吩咐小番子三兩個一伙,或五六個 一伙,走出京城四五百里之內外,到了村頭鎮腦,或大集大會所在,尋個庵堂寺觀居 祝逢著賭場妓店,挨身進去,或幫嫖捉賭,大手花費,妝著光棍模樣,看得銀子全不 在心。逢人就拜弟兄,娼妓就拜姊妹。自然有那不肖之子親近前來,日日酒肉,夜夜 酣歌。遇著有錢的子弟,乘空就騙他的錢財;無錢的小夥就拐來做了龍陽,到處花費 。看見他身邊沒了銀子,故意哄他輸了賭錢,人人與他吵打,然後伙中替他代應。自 從得他應了銀子,只當這身子賣與他的一般,過了幾日變轉臉來,要他本利算還,卻 無抵手。一邊就挽幾個積賊,暗地哄說銀財便利,手到拿來。不知不覺,勾到空閑之 處,做了一帳兩帳,手便滑利,心便寬閑,吃得肥肥胖胖,也就像個好漢。設或比京 城上甚處失事,比較得緊,即便暗地捉他頂缸。雖然贓物不對,說不得也冤屈了他。 那些小夥子亦拚送這條性命,絕無怨心,所以綁在法場之上還要唱個歌兒。正經那大 夥打劫人的本根老賊,到在家中安享,每月每季只要尋些分例進貢他們。若把本賊緝 獲盡了,這班番子儅頭所靠何來?』這都是京城積年的流弊,惟有番子心裡知道,外 邊人卻不曉得。如今在下再說一個少年,沒要緊聽信人一句說話,到底躲閃不過,把 個性命輕輕送了。這人姓劉名豹,住在順天府遵化縣地方。父親叫做劉藎臣,萬曆庚 子科舉人出身,初任淮安府山陽縣知縣。宦囊居積也有一二萬金。只因居官性子傲僻 ,臨民苛刻,冤死多人,後來昇了工部主事,吏部大科考察,處了貪酷,閑住在家。 妻妾五人,止生此子。平素驕養壞了,到得十五六歲,父親風疾在家,起身不得,家 中用度出入俱付此子經管。始初年紀不多,不過在家使些氣質,逞些公子威風,打大 罵小,卻也沒甚破壞。不料交十九歲上,其父一命歸陰,嫡庶之母日常威服下的,不 敢喘息。卻就有許多惡少拜結弟兄,誘嫖,誘賭。家中跟了僮僕一二十人,兼著幫身 蔑片,將槽上馬騾就騎了三十來匹。或上京城,或到通灣,或到天津,處處自有那等 吃白食、挨幫閑的朋友招接,哄著劉豹放手費錢。若只用在婊子門中到也有限,那知 做了嫖客,就做賭客;若只自己輸錢也還有限,那知自己輸了,幫客又輸;若是幫客 果然輸的,代他清償也還有限,那知自己真正輸了,那幫客假裝作輸,這就沒清頭、 沒底止了。所以出門的時節,皮箱拜匣中帶了幾千兩銀子,不夠十餘日,潑撒精光面 寫信回家拿來接濟,一面又等不得到手就將馬騾爛賤准折去了。可憐一個潑天的傢俬 ,不上三兩年間蕩廢淨荊嫡庶之母無計挽回,未幾兩年,俱氣死了。止存得僮僕三人 ,卻也終日挨飢受餒,別處逃生。剛剛剩得一個本身,流來蕩去,親眷朋友俱已深惡 痛絕。一日,聞得薊鎮乃古漁陽地方,添設一個總督團練衙門,增了五六萬兵馬,人 煙湊集,貨物俱齊,好不熱鬧。遵化與薊州相去止隔得七八十里,那劉豹思想起來, 本地並無一人憐惜,只當個客處他鄉一般。如今看看清晨至晚一碗稀粥也沒處搜尋, 不若忍著空肚慢慢的挨到州裡。或者有人推我向日情面,東邊西邊挨頓飽飯也不可知 。思量已定,即刻抽身出了城門,望著西邊州裡大路迤逶而行。也是劉豹命該交運, 也是劉豹合該倒運。走不上二里多路,卻遇著一個熟識的人,乃是三五年前在天津衛 城裡薛鴇子家的嫖客。身子生得長大,有些膂力,總督看他模樣雄雄糾糾,是個將材 ,又當用人之際,就賞他做個紅旗千總。各處招人,尚無頭緒,無心中坐在馬上,劈 頭撞著,仔細看了一會。劉豹也覺有些熟識,把頭臉佯佯低著。那馬已走過了一段, 仍舊勒將轉來問道:『那走路的可是劉兄麼?』 劉豹聽見,躲避不過,正在落寞之際,巴不得有人問他。他也便抬頭答道:『小子便 是。』那人即跳下馬來,唱了一喏。問道:『劉兄,你如何到這田地?』劉豹道:『 小子向日不才,淪落至此。』即問那人姓名,那人道:『你彼時豪華灑落,正是燄頭 上富貴之人,原也不知我的姓名。小弟姓李,名英,號定山,山西太原府人。當年在 天津薛老鴇家相會,不覺又五年了。看你光景象個支橕不來的,不若同我到薊州住下 。若識得字,就在我營中做個字識,若有力氣,就在我營中補名月糧,寬住幾時,再 與你漸漸圖個出身。只要悔改前邊過失,況且年紀不多,正是日出之光,守定程墨, 依著本分做去,將來未可料也!』即喚伴當將後邊一匹空馬叫他騎上,竟往薊州進發 ,跟到營裡住下。 李千總即尋幾件衣服與他穿了,酒飯與他吃了。不上半月間,也就居移氣,養移體, 依舊成個精壯子弟模樣。那知這種人犯了漂流的命運,吃了飽飯便生出事來。遇著三 朋四友扯去店上,大肆嚼作。始初人也憐他,不要還席。及至過了月餘,李千總把個 空糧名字頂上,待得月糧到手,等不得天亮就去請人還席,不上半月都費去了。李千 總道他有了月糧使用,別項衣食也就不來照管,卻仍舊窘迫得沒奈何。一日正睡在冷 草鋪中,大聲嘆氣道:『我劉豹直恁荒涼得手裡一文也無,不如尋條繩子,做個懸樑 的蘇秦;一把青鋒,做個烏江的楚霸,到也乾淨!』不料隔壁房裡也住著一個營裡家 丁,叫名黃雄,遂接聲道:『老劉,老劉!莫要長吁短嘆,攪我睡頭。可過我房裡來 ,指引你一條好路。』劉豹信是好話,即便跳起身走將過去,聽他說些甚麼。黃雄道 :『我看你又不矬,又不跛,又不聾,又不瞎,雖在這個營裡掛名月糧,那裡夠我們 好漢子用度的? 一般我們當家丁,也只這些月糧。那早早晚晚的花費盡多,也還靠些別處來路,方得 夠用。』劉豹聽了此言,卻是丈二長和尚,摸頭不著。再三請問,黃雄道:『你這癡 人!何須細說,難道我們帶著純陽呂祖的指頭不成?只要臂膊上彎著一張弓,腰胯裡 插著幾條箭,一馬跑去,隨你金珠財寶都有,任你浪費。 只要投在營裡,依傍著將官的聲勢,就沒有人來稽查了。如今眼面前穿紅著綠、乘輿 跨馬的,那個不是從此道中過來?』劉豹道:『我心裡早已有這意思,只是沒有這條 腿,奈何?』黃雄道:『滿地是腿,那一處不尋條來?不難,不難。我的馬這幾日該 操,卻是不空。中右營有個弟兄的馬尚未該操,卻是空的,待我說了你就好與他借騎 。』劉豹耳躲裡聞了此言,心裡想道:『目前這班好漢果然囊中銀錢便意,衣服鮮明 。若非從此道中來,卻是那裡來的?』一時也不敢認是好話,遽然應承,就與黃雄別 道:『承老哥把這話開示我,我曉得乃是耍呆子的。 萬一聽了這句沒來頭的話,設使那人依了做去,日後被你挾制著。倘不依你的性兒或 是不滿你的心願,在人前露些不幹不淨的話頭,我這一生一世只好做你名下的貼戶也 不夠了。不去,不去!』口裡雖把幾句乾淨話兒回覆,也是劉豹的賊星照了,一時發 露的乖處。恐怕遽然應允乾這勾當,被人知道,不當穩便。口裡一邊說,腳下一邊走 ,仍舊歸在自己窩輔。把房門撲的一關,嘆口氣道:『我道你有甚麼好話說!卻原來 是哄我的!』 睡倒連聲嘆氣。黃雄又道:『癡小子,明明指你一條道路,不肯信我!只怕日後我們 乾得勾當興頭,你又在旁看得眼熱,到反說三道四,漏泄風聲,那時你的性命就不保 了。』劉豹又賣乖道:『老哥!你怎麼又把這幾句利害的話恐嚇著我?你也不是疑我 的心腸轉來疑你,卻只是要哄我信這話兒,上那條路去。 我有主意在肚裡,不要哄我!』說言未畢,天已大亮。即起身走到李將主宅內聽候指 使去了。黃雄自言自語道:『這小子口裡雖如此說,心裡卻要做的,恐怕我日後挾制 著他,到說這不做的假話。如今邊關上兵馬用得多了,處處行人俱帶著腰刀弓箭,一 時落巧幹些勾當,卻也偶湊不著,正要勾合這小子上路,做個幫手,他又假惺惺說那 白地上撇清的話!如今安心牢籠著他,畢竟誘他上這條路上。』過了半月有餘,又該 領那月糧之際,劉豹指星望月:到手要做一件夾布箭衣,身面上也得光鮮。 不料走到衙門鹿角邊撞著一個醉漢,姓朱名龍,綽號叫做紅臉老虎。平素最是無賴, 仗著有些氣力,晦氣的撞著他,定要破費幾錢。極不濟也要吃個醉飽方肯放手。這日 劉豹候著本官尚未開門,不期被朱龍著實打一鶻膀。 劉豹猛然驚起,也就還他一拳,嚷道:『你吃酒放在肚裡,如何把個臂膊?地打我一 下?』那朱龍斜著眼睛看,道:『你這小子為何穿我袍子不還?』劉豹道:『我與你 並無半面,此言從那裡說起?』眾人齊近前來折解,對著朱龍道:『想是你醉後誤認 了人?』朱龍一口咬定不差。眾人俱曉得他的舊規,任他結扭做一堆,沒人勸解。少 刻,只見黃雄走來道:『朱哥,這個後生是我的兄弟,千萬看我分上,放了手罷!』 劉豹實要與他並力打鬧一場,到為黃雄說了這話,只得放手。旁邊又有幾個人將話兒 矬著劉豹道:『你在營中吃糧,難道朱哥也不曾認得?適纔即有些得罪你處,你也不 該就舉手回拳。雖朱哥不受你打,你也是得罪的了。』劉豹聽了這話愈加氣忿,卻不 知眾人為何護庇著他。黃雄道:『劉兄弟,你不要動氣!如今好歹陪他一個禮兒,且 到鋪中坐著。你快回去收拾幾錢銀子來,若一時不便,就是衣服到印子鋪裡押幾錢來 亦可。』劉豹聽了此言,爽利口也不開,眼見得身無半文,憑他發付便了。 黃雄道:『想你身邊沒得擺佈,不然把一月份糧,頂與別人,胡亂消繳罷了。』眾人 俱如此說。劉豹是初入營頭的,不知其中有何忌諱。大家俱讓著他,沒奈何只得將月 糧指名揭了六錢銀子與他,按日加一起利,不兩日間月糧屬之烏有。劉豹仔細打聽, 原來朱龍乃是本官的舅子,又是宗室出身,所以人人讓他一分。但是不尋別人,偏偏 尋著劉豹,恰好又遇著黃雄解勸陪禮,這明是黃雄懷著歹心,故意使他顛倒破費,不 容他身邊積攢一些。後來劉豹猜破,也就懷個念頭算計黃雄。日日晚頭到他房裡說話 ,早間同他出門,情意甚篤。一日黃雄感冒風寒,本官處告假在家,那馬放出城外吃 草。劉豹覷個落空,只說『明日有弟兄央我到兵道衙門過隊,要借黃哥號衣鞋帶一用 。』黃雄正在煩躁之際,就應允了,並那壁上掛的方箭撒袋也除在手裡。一面將鞍轡 悄悄運出城外,不到天亮,就在城外把馬備上。一兩個轡頭,走了七八十里,到了三 河縣邦均店地方,在個黑樹林裡閃著。不多時,只見一個骨瘦老者騎一匹大叫驢,身 下坐著一個被囊,覺得有些沈重。 劉豹認道是個鄉間財主,囊中有貨。一馬躍出,裝著西人聲氣喝道:『下來快送些盤 纏與老子!』那老者不慌不忙,拿著鞭梢指道:『盤纏到也夠你用了。但我年紀七旬 有餘,不要驚嚇,待我慢慢下了牲口,你自過來取去。我兩臂軟弱,實提不起來。』 劉豹信是實言,果然在馬上側著身子向驢背取那被囊。不料老者一手做個千金下墜之 勢,把他拉倒在地,鞭乾中抽出一把鋒利尖刀,指著罵道:『乳臭庸奴!老漢在漁陽 道上往返五十餘年,不知結果多少毛賊!將視我為雞皮老翁可啖那!』言未畢,即欲 將刀挖那兩眼,劉豹大聲哀告道:『小子有眼不識!原不敢作此行藏,只因八十老母 抱病臨危,無計策救,勉強行之。 不意冒瀆天威,乞求饒恕!』老漢道:『齷齪小子,不足污我之刀!只剁你兩指以警 將來。』彼時劉豹正在危急之際,只見林內又一馬躍出。馬上坐著一位雄糾大漢,黑 面紫髯,說道:『老翁處之非過,但他為著母病一語似屬可矜。若去兩指,則終身不 復贖矣!』袖中出銀五兩為老漢壽,即請問老漢姓名。 老漢以一笑謝之,不受其金,亦不言其姓名。止將營馬烙印馬尾刀割下來,馬亦負痛 奔回原路,老漢上驢,昂然而去。劉豹起來拜謝大漢,大漢道:『我有空馬在後,你 快犄上,少遲便有番役至矣。』劉豹著忙,坐了空馬緊緊隨著大漢而行。大漢道:『 我輩馳騁於邯鄲道上,已念餘年。凡有舉動,必先從發腳處踹聽著實,窺其護從,尾 其後者;沿途又有四五人扮作商旅,三十里一換,或五十里一換,同其歇宿,使之不 疑;然後於中途一矢加之,無不應弦,拱手從命。若如此冒昧向前,未有不敗者也。 今已到柏鄉縣,與漁陽隔絕千里,諒沒有人知覺。』 遂引入一荒僻古寺佛座之下,取出元寶四錠、碎銀十兩與之潛歸。但云:『汝善藏之 ,母病尚可藥也。』劉豹脫下裡衣包裹好了。正待叩謝,清問姓名,大漢騎上馬,牽 著空的,一溜煙不別而去。劉豹得了元寶,俏悄的變易做村莊下人,也不敢回到薊州 居住,直到永平府遷安縣地方。始初代人耕種,過一二年漸漸置起田地。自知僥倖全 身,改過前非,做個莊家百姓。 就近娶了一妻,將就過活不題。卻說那營馬被老漢割去尾印,飛奔回營。邦均店地方 得知此事,具一報單,各衙門登時知道。 薊鎮總督即批守道查報。那老者拿了馬尾烙印也到道里報了。 即時查出,乃是黃雄的馬。黃雄卻在病中,推個不知,只說劉豹借去騎的。那劉豹又 拿不著,黃雄也推不去,只得代他認罪。 申詳總督,把黃雄依律問罪,立刻梟示。這也是黃雄立心不善,反累其身的報應了。 再說那劉豹避居遷安地方,做個守分百姓,也是改過自新的人,上天也該恕他一分。 那知這年遇著大旱,苗地俱如龜背裂開,秋成無望。只要喚些長年漢子開墾一番,還 有指望。不期人工忙促,沒處尋覓,忽然鎮上遇著十餘個鳳陽府點來築修邊牆的班軍 完工回去,原是空閑身子。劉豹叫他趁工幾日,照例算錢,那一伙班軍也就應允。不 兩日,地上開墾完了,都到家中等算工銀。 劉豹一時手頭不湊,把廚灶下埋著當日剩下兩個元寶,悄悄乘著月夜掘出,將些炭火 燒紅,鏨鑿開來。不意那些班軍聽見鏨銀的聲,爬起屋簷,望見大錠,眾人就起心擁 將進去,一罟而取,不知去向。劉豹也只得嘆幾口氣,正所謂『得之易,失之易』也 。不題。卻說班軍得了這兩大錠,喜喜欣欣從真保等府將到汴梁地方,眾人卻要照股 分用。無計布擺,大膽走到鐵鋪鏨開,卻遇著一班捕役,挨身進去問道:『鑿開要虧 折四五錢,何不到我鋪中換些碎銀,分使兩便?』眾人就攜了元寶,跟著捕人,走到 一個大宅子內。接取元寶一看,認出字號,大聲叫道:『拿賊,拿賊!』倏忽走出二 三十人,把這伙班軍鎖鏈起來。原來這元寶乃是三年前江西差官解的金花銀兩,在汴 梁城外被大盜劫去,至今貽害地方官民,賠補未完。獄中雖捉了幾起大盜,卻不是這 案內人犯。至今捕役監禁,三日一比,卻無原贓。今日錠上印鑿分明,有何疑案?一 伙送到大梁守道衙門,那些班軍大聲喊冤道:『我們俱是築修邊牆班軍領來的鹽菜銀 兩。』官道:『你們雖是班軍鹽菜錢糧,彼處零星分結,那有大錠的?況且這宗錢糧 尚未解到,如何有得發出?』用起刑來,然後將那遷安劉豹家中劫來情節一一招出。 守道就申文撫院,撫院即移文薊督衙門,差人登時押往河南質對。 劉豹將從前試馬及大漢相贈之言從頭訴說,一一備入文內,沿途撥兵護解。行至順德 府地方,忽然遇著大漢半醉單騎而來,劉豹上前泣訴始末。眾人聽了,就曉得是劫元 寶的大盜,向來四下追緝,無處蹤跡著他。內中一人乖巧,滿口稱贊:『好個豪俠! 萍水相逢,能救人性命,反又贈他銀子。今日他自己運蹇,到此敗露。你這種高義甚 是可敬!』眾人要請他店上敘情,大漢推託。一人乘其空隙,用力將那馬腿一砍,倒 墜下地。一齊用力上前就把大漢綁了。地方人道:『你們雖拿住他,卻要謹慎。倘有 風聲漏泄,不上三十里就有追騎搶奪,連你們性命亦不可保!』一人道:『我們有個 處法,此賊害人多矣,不便遠解。若綁縛少鬆,就要脫去。將他顛倒綁在馬上,用小 刀把他穀道錘割出來,再用繩子拴在樹上,把馬一鞭揮去,馬跑腸出,我們豈不放心 快意!』眾道:『有理,有理!』如是而行,割下頭來,丟棄五六里之外,始終無人 知覺。 然後把劉豹解到汴梁,一一承認。問了不待時的死罪,方結這五六年劫鞘公案。那前 邊錯拿的,已死過了一半,其餘因其無贓,盡行釋放。可見天地間非為之事,萬無沒 有報應之理,劉豹少年盂浪,正當危急,忽遇李大漢片言排解,憐其母病一言,即贈 之金,令其速遁。藏之五六年,廚灶之下,神鬼不知,可謂密矣。偏偏遇著鳳陽班軍 ,乃於夜半鏨銀聲一朝漏泄。李大漢二十年邯鄲道上惡孽多端,偏在救人施惠之際, 卻好途中遇著劉豹起解而來,畢命於群解之手。前邊黃雄設心不善,早受冤誅。天道 報施之巧,真如芥子落在針孔,毫忽不差。可見人處於困窮之時,不可聽信歹人言語 。一念之差,終身只在那條線上,任你乖巧伶俐,躲閃不過,只爭在遲早之間。天上 算人,好似傀儡套子,撮弄很得好不花簇哩。眾人道:『我們坐在豆棚下,卻象立在 圈子外頭,冷眼看那世情,不減桃源另一洞天也!』 總評古來天下之亂,大半是盜賊起於飢寒。有牧民之責者,咸思量弭盜。鉛槧家揣摩 窗下,誰不把弭盜尋些策料?也有說得是的,或剿襲前人,或按時創論,非不鑿鑿可 聽。然問策答策,不過看做制科故事,孰肯舉行。及至探丸滿市,萑苻震驚,乃始束 手無策。坐視其潰裂,而莫可誰何。甚至開門揖盜,降死比比,卻悔從來講求弭盜有 何相干。嗟乎!此迂儒懈弛之禍也。到不如道人此則原委警切,可醒愚人,可悟強橫 。大盜無不歐刀,王章猶然星日。真是一篇弭盜古論也! 第 虎丘山賈清客聯盟 《食物誌》云:扁豆二月下種,蔓生延纏,葉大如杯,圓而有尖;其花狀如小蛾,有 翅尾之形,其莢凡十餘樣,或長,或圓,或如豬耳,或如刀鐮,或如龍爪,或如虎爪 ,種種不同。 皆纍纍成枝,白露後結實繁衍。嫩時可充蔬食菜料,老則收子煮食。子有黑、白、赤 、斑四色。惟白者可入藥料,其味甘溫無毒,主治和中下氣,補五臟,止嘔逆,消暑 氣,暖脾胃,除溫熱,療霍亂泄痢不止,解河豚酒毒及一切草木之毒。只此一種,具 此多功,如何人家不種他?還有一件妙處,天下瓜茄小萊有宜南不宜北的,宜東不宜 西的,惟扁豆這種天下俱有。那豬耳、刀鐮、虎爪三種,生來厚實闊大,煮吃有味。 惟龍爪一品,其形似乎厚實,其中卻自空的,望去表裡照見,吃去淡而無味,止生於 蘇州地方,別處卻無。偶然說起,人也不信,今日我們閑話之際,如有解得這個原故 ,也好補在食物《本草》之內,備人參考。內一人道:『這也是照著地土風氣長就來 的。 天下人俱存厚道,所以長來的豆莢亦厚實有味。惟有蘇州風氣澆薄,人生的眉毛尚且 說他空心,地上長的豆莢越發該空虛了。』 眾人道:『姑蘇也是天下名邦,古來挺生豪傑,發祥甚多。理學名儒,接踵不少。怎 見得他風氣澆薄?畢竟有幾件異乎常情、出人意想之事,向我們一一指說。倘遇著蘇 州人嘴頭刻薄,我們也要整備在肚裡尖酸答他!』那人道:『蘇州風俗全是一團虛諱 ,一時也說不荊只就那拳頭大一座虎丘山,便有許多作怪。 閶門外,山塘橋到虎丘名為七里,除了一半大小生意人家,過了半塘橋,那一帶沿河 臨水住的,俱是靠著虎丘山上養活,不知多多少少扯空砑光的人。即使開著幾扇板門 ,賣些雜貨或是吃食,遠遠望去挨次鋪排,到也熱鬧齊整。仔細看來,俗語說得甚好 :翰材院文章,武庫內刀槍,太醫院藥方,都是有名無實的。一半是騙外路的客料, 一半是哄孩子的東西。不要說別處人叫他空頭,就是本地有幾個士夫才子,當初也就 做了幾首《竹枝詞》或是打油詩,數落得也覺有趣。我還記得兒首,從著半塘橋堍下 那些小小人家,漸漸說到斟酌橋頭鋪面上去:路出山塘景漸佳,河橋楊柳暗藏鴉。欲 知春色存多少,請看門前茉莉花。 古董攤 清幽雅致曲欄杆,物件多般擺作攤。內屋半間茶灶小,梅花竹笪避人看。 清客店(並無他物,止有茶具爐瓶。手掌大一間房兒,卻又分作兩截,候人閑坐,兜 攬嫖賭) 外邊開店內書房,茶具花盆小榻牀。香盒爐瓶排竹幾,單條半假董其昌。 茶館(兼麵餅) 茶坊麵餅硬如磚,咸不鹹兮甜不甜。只有燕齊秦晉老,一盤完了一盤添。 酒館(紅裙當壚) 酒店新開在半塘,當壚嬌樣晃娘娘。引來遊客多輕薄,半醉猶然索酒嘗。 小菜店(種種俱是梅醬酸醋,易糖搗碎拌成) 虎丘攢盒最為低,好事猶稱此處奇。切碎搗齏人不識,不加酸醋定加飴。 蹄肚麻酥 向說麻酥虎阜山,又聞金肚壯而鮮。近來兩件都嘗遍,硬肚粗酥殺鬼饞。 海味店 蝦鯗先年出虎丘,風魚近日亦同侔。鯽魚醬出多風味,子鱭鰟皮用滾油。 茶葉 虎丘茶價重當時,真假從來不易知。只說本山其實妙,原來仍舊是天池。 席店 滿牀五尺共開機,老實張家是我哩。看定好個齊調換,等頭銀水要添些。 花樹 海棠謝了牡丹來,芍藥山鵑次第開。柴梗草根人不識,造些名目任人猜。 盆景 曲曲欄杆矮矮窗,折枝盆景繞迴廊。巧排幾塊宣州石,便說天然那哼生。 黃熟香 一箱黃熟盡虛胞,那樣分開那樣包。道是唵叭曾制過,未經燒著手先搔。 時妓 好女新興雅淡妝,散盤頭似油光。梳來時式雙飛鬢,滿頭茉莉夜來香。 老妓 塗朱抹粉污流斑,打扮蹺蹊說話彎。嫖客偭多幫襯少,扯扯拉拉虎丘山。 私窠 機房窠子半村妝,皂帕扳層露額光。古質似金珠似粟,後鷹喜鵲尾巴長。 和尚 三件僧家亦是常,賭錢吃酒養婆娘。近來交結衙門熟,蔑片行中又慣強。 花蓬頭垢面赤空拳,藍縷衣衫露兩肩。茶棚酒店如梭串,哀求只說捨銅錢。 老龍陽 近來世道尚男風,奇醜村男賽老翁。油膩嘴頭三寸厚,賭錢場裡打蓬蓬。 後生 輕佻賣俏後生家,遍體綾羅網繡鞋。氈帽砑光齊欽壓,名公扇子汗巾揩。 大腳嫂 鄉間嫂子最蹺蹊,抹奶汗巾拖子須。敞袖白衫翻轉子,一雙大腳兩鯿魚。 孝子(舉殯者多在山塘一帶,孝子無不醉歸) 堪嗟孝子吃黃湯,面似蒲東關大王。不是手中哭竹棒,幾乎跌倒在街坊。 以上說的都是靠著虎丘山生意的,雖則馬扁居多,也還依傍著個影兒;養活家口,也 還恕得他過。更有一班卻是浪裡浮萍、糞裡臭蛆相似,立便一堆,坐便一塊,不招而 來,揮之不去,叫做老白賞。這個名色,我也不知當初因何取意。有的猜道,說這些 人光著身子隨處插腳,不管人家山水、園亭、骨董、女客,不費一文,白白賞鑒的意 思;一名蔑片,又叫忽板。這都是嫖行裡話頭。譬如嫖客,本領不濟的,望門流涕不 得受用,靠著一條蔑片幫貼了方得進去,所以叫做「蔑片」。大老官嫖了表子,這些 蔑片陪酒夜深,巷門關緊不便走動,就借一條板凳,一忽睡到天亮,所以叫做忽板。 這都是時上舊話,不必提他。只想這一班做人家的,開門七件事,一毫沒些抵頭。早 晨起來就到河口洗了面孔,隔夜留下三四個銅錢,買了幾朵茉莉花簽在頭上,戴上一 個帽子,穿上一件千針百補的破衣出門去,任著十個腳指頭撞著為數。有好嫖的就同 了去,撞寡門,覓私窠,騙小官,有好賭的就同去入賭場,或鋪牌,或擲色,件件皆 能;極不濟也跟大老官背後撮些飛來頭,將來過活。閑話丟過,且說正文。』彼時正 當五月端午之後,大老官纔看過龍船,人頭上不大走動。一班老白賞卻也閑淡得無聊 ,聚在山塘一帶所在,或虎丘二山門下茶館上、古董攤邊,好像折腿鷺鷥立在沙灘上 的光景,眼巴巴只要望著幾個眼熟的走到。忽然大山門外走了幾個人來,前邊乃是一 位相公,頭戴發片凌雲方巾,身穿官綠硬紗道袍,腳穿醬色挽雲緞鞋,手裡拿著螺鈿 邊檀香重金扇子,年可三十上下,面方耳大,沿鬢短胡。後邊隨著四個戴一把抓帽兒 、小袖箭衣的管家,俱拿著氈包、拜匣、扶手之類,搖搖擺擺踱上山來。眾白賞們道 是個西北人,不甚留意。 看他走到千人石上,周圍觀看,徑上天王殿去,對著彌勒佛像拜了四拜。有幾個油花 和尚挾了疏簿上前打話,求他佈施。就上一條椽木上寫著:「山西平陽府信官馬纔捨 銀十兩。」那些和尚即刻慇懃勢利起來,請馬爺方丈奉茶。馬纔道:「咱也不耐煩呷 茶,有句話兒問你,這裡可有唱曲匠麼?」和尚語言不懂,便回道:「這裡沒有甚麼 鯧魚醬。若要買玫瑰醬、梅花醬、蝦子鯗、橄欖脯,俱在城裡吳趨坊顧家舖子裡有。 」馬纔道:「不是。咱今日河下覓了一個船兒,要尋個彈弦子撥琵琶唱曲子的。」和 尚方懂得,打著官話道:「我們蘇州唱曲子的不叫做匠,凡出名掛招牌的叫做小唱, 不出名、蕩來蕩去的叫做清客。」馬纔道:「小唱咱知道的,卻不要他。只要那不掛 招牌、蕩來蕩去的罷了。咱問你怎麼叫做『清客』?」和尚道:「虎丘,天下名山。 客商仕宦聚集之處,往來遊玩作耍的人多,凡遇飲酒遊山時節,若沒有這伙空閑朋友 相陪玩弄,卻也沒興。」馬纔道:「陪酒也算不得清,玩弄也算不得清。」和尚道: 「這班人單身寄食於人家,怎麼不叫客?大半無家無室、衣食不週的,怎麼不叫清? 」馬纔道:「咱今日要尋幾個相陪玩弄的,可有麼?」和尚道:「有,有。」疾忙在 殿前門檻上往下一招,只見那五十三參礓礤上跑起三兩個來,道:「可是那位官兒要 尋訪白賞朋友麼?我去!我去!」和尚道:「弗要亂竄,一伙做淘走去,憑渠揀罷哉 。」這幾人都有個綽號,一個叫做油炸猢猻強捨,當日強夢橋之子。因他日常手零腳 碎,坐不安閑,身材短小,故有此名。一個綽號叫做皮畫眉徐佛保,因他沒些竅頭, 大老官問他一句纔響一聲,沒人理他,就自家吃得頭紅面赤,鼾鼾的就睡著桌上。一 個老的。叫做祝三星,年紀將已望七,面皮格縐,眼角眊,須鬢染得碧綠,腰背半似 彎弓。他恃著是個先輩伯伯,卻佔著人的先頭。人也厭他,改他三星的號為三節。因 他少年人物標緻,唱得清曲,串得好戲,人去邀他,裝腔做勢,卻要接他三次方來, 乃是「接請」之「接」。中年喉嗓秕啞,人皆嫌鄙。清明走到人家,推他不去,直到 端午中秋方肯轉動,乃是「時節」之「節」。如今老景隳頹,人又另起他個笑話,說 小時出身寒簿,乃是呂蒙正上截,中年離披不堪,乃是鄭元和中截,如今老朽龍鍾, 溝壑之料卻是蔡老員外下截,又是「竹節」之「節」。』和尚引了三人,馬纔見了喜 之不勝,說道:「貴處多才之地,怎的把手一招,就有幾位來了?」眾白賞道:「晚 生們乃無貝之才,還仗爺們有貝之才培植培植。」馬纔一手拉了強捨,將與和尚作別 。強捨就把和尚一手扯定,向馬纔道:「馬爺既有興玩水登山、尋花問柳,斷斷少不 得一位長老纔是勝會。今日相湊,乃是奇緣,難道就與馬爺別了不成?況且馬爺寫了 佈施,你也該去領來投在櫃內,韋馱神前也要銷繳這個大諱。」馬纔道:「有理,有 理。同行,同行。但我們還要尋個婊子,只怕長老有些便。」祝老道:「敝處這些人 家,到是長老無甚忌諱,原走慣的,正所謂『色即是空,空即是色』了。」一邊嚼蛆 ,一邊已走到顧家園上。徐佛保道:「這是揚州新來燕賽官住在裡面,待我敲門進去 。」裡面回道:「昨日滸墅關上幾個相公接去了。」又走到山塘橋韓家園上尋那吳老 四。說「今日徐鄉宦設席,不便接見。」連走三四家,不見人影。馬纔便焦躁起來, 道:「些蹄子淫婦!分明見咱故意躲著,難道咱是吃人的麼!」眾白賞齊勸道,「馬 爺勿要焦躁。敝處是個客商馬頭去處,來往人多。近來又添了營頭上人,吵鬧得慌, 婊子們存紮不定,止有這幾個婊子,委實不得空閑。」強捨道:「許老一就在這裡, 身段極介即溜,面孔也介花哨。 馬爺與他相處極好,是介對結個哉。你們倍著馬爺橋上略坐一坐,待我先進去看一看 。只怕此時還睡著哩。」卻不知老一早已梳洗停當,正在廚房下就著一個木盆洗腳, 連聲道:「不要進來。」強捨早已到了面前,吃了一驚道:「老一,我向來在你個邊 走動,卻不曉得你生子一雙乾腳。」老一道:「小烏龜又來嚼蛆哉!那亨是雙乾腳? 」溜強捨道:「若勿是乾腳,那亨就浸漲子一盆?」老一撓起腳來,把水豁了強捨一 臉。罵道:「臭連肩花娘,好意特特送個孤老把你,到弄出多呵水來!」老一道:「 真個?」即便拭子腳,穿上鞋與那衫子,出來接著。 歡天喜地,拂塵看座,連口喚茶,一番熱鬧。馬纔也不通名道姓,便開口道:「咱不 吃那撞門寡茶,到就去船上呷酒罷。」眾白賞也就攙掇下了酒船。馬纔一邊就在腰下 取出銀包,拿了一塊銀子遞與家人,叫買菜取酒。馬纔等不得,就要老一唱個曲子。 老一道:「我們只會睡覺,那裡知道唱甚麼曲子?」祝三星道:「他的《哭皇天》、 《山坡羊》、《銀絞絲》、《玉河郎》是此間第一無賽的了。」馬纔道:「你會唱, 怎說不會?想是初會面生麼。咱們自今日相知了,早上便要唱到晚,晚上還要唱到天 亮哩。」眾白賞道:「別人不敢誇口,若是老一這個力量,卻是不讓人的。除了老一 ,蘇州也便沒第二個了。」老一被這幾個局得快活,也就直了喉嚨喊個不祝少間擺上 一桌菜蔬:燒豬頭,爐牛肚,薰蹄踵,鹵煮雞,約有七八碗,大盤大塊,堆上許多。 裝出幾壺燒酒,斟了幾巡,馬纔舉杯道:「請!」老一就一氣飲了數杯,佛保也就隨 著照杯。強捨看見老一脫介家懷,就照老一做了幾個鬼臉,連篇的打起洞庭市語,嘰 哩咕嚕,好似新來營頭朋友打番語的一般,弄得馬纔兩眼瞪天,不知甚麼來歷。那管 家刻落了些東道使費,心裡忌怕主人算帳。懷著鬼胎,卻到主人耳邊一擦,說道:『 這幾個蠻子罵老爺哩!」馬纔性氣勃發,將桌上一碗醬煮肥肉照著眾白賞頭臉一潑, 抽出拳頭乒乒亂打。徐佛保躲出船外,祝老老直僵僵靠著壁立,許老一油膩污了衣服 ,禿禿的哭個不了。強捨坐在老一上首,一時跑不脫身,一手按著桌角,口裡說道: 「大殺風景哉!」那管家又對主人道:「他還要打殺封君來。」馬纔越覺怒,提起腳 凳打去。強捨拚命跑到艄上,卻往水中一跳就不見了。管家道:「老爺惹出人命來也 。』馬纔也著急,到艄上問那船家,船家道:「無事,剛方隨風飄過對河去哉。」管 家道:「怎麼不沈下去?」船家道:「個些人渾身是海螵蛸樣的,那亨肯沈呀。」此 是一班白賞偶然出醜諢話,不題。 再說一個老白賞叫做賈敬山,自幼隨著主人書房伴讀,文理雖未懂得,那一派文瘋卻 也渾身學就。一日聽見徐佛保、祝三星受了一番狼藉,人頭上越發形容得不像人樣, 他就拉了十餘個老白賞朋友,齊行的相似,都到虎丘千人石上挨次坐了,創起一個論 來道:「我哩個行業,說高原弗高,說低也弗低。 昨日聞得個些小夥子們受了許多狼狽,多因技藝弗曾講習,竅竇弗介玲瓏,身分脫介 寒賤,所以人多看得我哩脫介輕保如今我們也要象秀才們,自己尊重起來,結一個大 社,燒介一陌盟心的紙。」眾白賞道:「請啥神道做個社主。」敬山說道:「吹簫唱 曲,幫襯行中,別的也沒相干。想道當初只有個伍子胥吹簫乞食於吳市,傳了這個譜 兒。伯嚭大夫掇臀捧屁,傳了這個身段。這卻是我輩開山始祖,我哩飲水不要忘了源 頭。」眾人道:「弗可,弗可。伍子胥是個豪傑丈夫,伯嚭是個臭局個小人,弗好同 坐。」敬山道:「我哩個生意,弗論高低,儕好同坐。 得子時,就要充個豪傑;弗得時,囫圇是個臭局。神明是弗計較個。」眾白賞道:「 伍於胥弗敢勞動,到換子鄭元和與我哩親切點罷!請問那亨打扮?」敬山道:「頭上 戴頂過文。」眾人道:「那亨叫做過文?」敬山道:「我哩向來戴著鬃帽,卻坐弗出 。若竟換子高巾闊服,人家見子儕做鬼臉。只戴一頂弗方弗扁個過文,大家儕弗覺著 。身上穿介一件油綠玄青半新弗破個水田直裰,人看子也弗介簇簇,自也道弗介猖狂 。腳上盡穿介宕口黃心草鞋,亦介斯文,弗當破費。路上相喚,儕叫老社盟兄;小一 輩個,儕稱老社盟伯。見子大官府,儕稱公相;差點個便稱老先生。或在人家叫曲, 儕稱敝東尊館,學戲個小男,儕叫愚徒門生。弗拘啥人品物件都以仙人稱喚;撞著子 管家大叔,總也叫他先生。」正在講論之際,只見前日打壞的強捨道:「河口來了兩 隻卷艄二號坐船,上邊擺著深簷黃傘,想是過往仕宦,在此停泊。 老伯伯走動走動,或者尋個線路幫帶幫帶。」敬山聽見,即便奔落山去。卻見船上打 著扶手,主人頭上雲巾、山蠻道袍、大紅雲履,同著閶門蘘裡餛飩書鋪兩個鄉親,一 路打著鄉談,走上山來。敬山悄悄挨著管家輕輕動問,纔知萬曆癸丑科進士,吉安府 吉水人姓劉名謙,官至通政,告致回家。要在蘇州買些文玩古董,置些精巧物件,還 要尋添幾個青秀小子、標緻丫頭,教習兩班戲子哩。敬山聽子,不覺顛頭簸腦,不要 說面孔上增捏十七八個笑靨,就是骨節裡也都扭捏起來。連聲大叔長、先生短,乘個 空隙就扯進棚子裡吃起茶來。又打聽此地那個年家,那個親戚,一一兜搭在心裡,轉 身就到餛飩書鋪,求他轉薦,那人也就對劉公說了。劉公道:「你們在此做生意,端 是客居,若用此輩,須要本地有身家的作個中保方好。」敬山得了口氣,卻道這個題 目甚難,整整候了兩日,猶如熱鍋灶上螻蟻,扒不上來,硬骨頭裡蛆蟲鑽不進去。 卻好管家同了閶門德盛號開緞鋪吳松泉--乃是舊日相與,為買貨批帳請來。又遇著 劉公拜客未回,敬山乘著半面之識,一霎時熱鬧趨奉,求他鼎言推薦。那徽州人是好 勝的,竟應承了。不多時,就同下船,一邊引見一邊極口稱揚道:「他技藝皆精,眼 力高妙,不論書畫、銅窯、器皿,件件董入骨裡。真真實實,他就是一件骨董了。」 劉公笑了一笑,叫書童卷箱內取那個花罇來與敬山賞鑒。那書童包袱尚未解開,敬山 大聲喝采叫好。劉公道:「可是三代法物麼?」敬山道:「這件寶貝青綠俱全,在公 相宅上收藏,極少也得十七八代了。」劉公笑道:「不是這個三代。」敬山即轉口道 :「委實不曾見這三代器皿,晚生的眼睛只好兩代半,不多些的。」劉公又取一幅名 公古筆畫的《雪裡梅花》出來與看,四下卻無名款圖書。敬山開口道:「此畫公相可 認得是那個的?」劉公道:「宋元人的。不曾落款,到也不知。」敬山道:「不是宋 元,卻是金朝張敞畫的。」劉公又笑一笑,道:「想是這書畫骨董足下不大留心。那 宮商音律乃是究心的了。我要尋幾個小女子,教得戲的,可有麼?」敬山道:「有有 。只是近年四鄉成熟,一時尋也費力。即便尋得有時,也弗得草草,面目腳手第一要 緊,弗須說起。還要問渠爺娘曾出痘鴛也未,身上有唦暗疾,肚裡有啥脾氣,夜間要 出尿否,喉音粗亮何如。爺娘弗肯割捨郟遠,只有晚生當日曾與幾位老先生經手幾個 ,後來出跳伶俐,收拾房中,生了公子,至今親戚往來。所以人家俱道晚生得托,有 唦囡兒儕肯放心。 公相不問,晚生也弗敢說,公相既要尋覓幾個,弗是晚生誇口,別人也勿敢應承。」 劉公道:「正要借重。」敬山又問:「公相有幾時停泊?」劉公道:「這也不論時日 ,只要就緒方行。」一面就與鬆泉開了緞疋帳目,即便同敬山別了。敬山即去會了許 多朋友,四處搜尋,卻也沒有頭路。沒奈何只得把個外甥女兒,同著鄰舍的小囡,哄 說陪到虎丘頑耍,就引到船上。劉公看了道:「總之生、旦、淨、丑俱是用的,不必 細看,只問多少身價。」敬山道:「如今成熟年歲,人家俱捨不得出身。聞得公相府 內極肯優待,又是晚生居間,方肯領來。在當日只消念兩一個,如今須得四十兩方肯 。」劉公道:「比當日加十兩罷。」敬山初意不過喚來搪塞,以為進身之計,那知劉 公登時就發銀子。 著管家同到吳松泉處立契成交。敬山心裡又轉了一念道:「即使立了文契,還要我領 去教他。不若將計就計,且騙到手轉動轉動。」立刻寫了文契,收了價錢,連中人酒 水也乾折了。並求鬆泉著個保押。敬山仍舊拿了銀子,走到船中稟道:「公相,女子 雖然買下,他的父母還要做幾件衣服、鞋子與他,須在晚生身上,少待五六日。公相 若要教戲,不若就在晚生家下。晚生雖在公相門下奔走,房下也是會教的。恐怕公相 不肯放心,連銀子也留在公相處。」劉公道:「吳松老所舉斷然不差,就煩尊閫費心 ,容日總酬罷!」敬山欣然拿了銀子回去,一時花哄起來,不在話下。 不料此輩鑽心極密,看見賈敬山謀身進去有些想頭,卻又走出一個顧清之來,也在船 邊伸頭探腦。打聽得劉公差人去請醫生楊沖蓭來合藥,清之與沖蓭也有一面。一口氣 即奔到楊家求其薦舉。沖一就與他同下船來。劉公接見,說了許多閑話,乘便就把清 之贊揚起來。劉公也極藹然,留待午飯。劉公道:「昨日有個賈敬老來相會,我已托 他覓了兩個女子,就留在他家教曲。尚有幾個小價,都不過十五六歲,如今也要叫他 學唱,不知可教得否?」清之道:「十五六歲的孩子正是喉音開發之際,極不費力, 晚生斗膽效勞!」劉公道:「賈敬山曾相識否?」清之一邊看沖蓭在那邊寫方甚忙, 一邊低聲答道:「敬山雖係識認,晚生們從來不便與他同坐。」劉公道:「他人品差 池,行止有甚不端麼?」清之舉手便把鼻子摸了一摸,手一做個勢子還道:「老爺所 託他買的女子,也要留心查看要緊。」劉公也就把頭點了一點。沖蓭將藥方過來說了 一遍。劉公平素極好男風,那幾個要教唱小子就是劉公的龍陽君。清之看見劉公照管 得緊,也就要圖謀這館。佯佯的對沖蓭道:「晚生年紀不多,近來得了痿癥,人道俱 絕。」劉公信道這話是真,即就托他教那幾個小子。一兩日間,把這小館就坐定了。 一面就去尋著敬山要看女子,還要分他媒錢。敬山道:「是我在劉老爺處薦你教曲。 」也要分他束脩。兩個鬼吵鬧了一常次日齊到劉公船上坐了一回。早飯已畢,就同隨 了閶門外買些貨物;專諸巷裡買些玉器。 兩邊面面相覷,背地裡仍舊伸了幾個指頭。各人悄地討了趁錢,各自心照去了。劉公 抵暮赴席而回,坐著一隻小船。敬山悄悄渡船趕上,見了劉公開口指道:「今日小管 家如何不帶出門? 若單留清之在船上,也要悄悄留心體訪。若引誘壞了身子,那喉音再不得亮了。」劉 公卻是專心此道,極要吃醋的。自聽了敬山這句話,就動了覺察的念頭,只因他說陽 道痿絕不去堤防。 那日也是清之合當敗露,當著劉公午睡,不聽見小子唱響,悄地窺他。只見清之正當 興發,挺著那件海狗腎的東西相似,頗稱雄猛,與小子幹那勾當。卻被劉公看見,即 時喚出,將小子打了三十;把清之去了衣巾,一條草繩牽著脖子,只說偷盜銀杯,發 張名帖送在縣裡。血比監追,打得伶伶仃仃。直待把自己十五六歲青秀兒子送進宅內 ,方准問了刺徒,發配京口驛擺站去訖。 敬山自從拔去眼中之釘,卻也十分得意。凡有賣字畫、骨董物件的,俱要抽頭,先來 與他說通,方成交易。就是討書求分上的,一要與他後手,管家小費一網包羅。就有 幾個門生故舊走來,他也要插身奉陪,還要掉句歪文,讀些破句,惹人笑得鼻塌嘴歪 。那知福過災生,蒼蒼之天,毒毒的偏要與此輩弄個花巧。不期敬山驟然騙了許多銀 兩,不敢出手交與妻子,藏在牀下一酒罈內。連日得意,夫妻、女兒三口多吃了幾杯 ,一覺睡熟。卻被一個偷兒挖落門臼,就是臥房廚灶。周圍一摸,摸著牀下兩個酒甕 。一個滿滿盛的是米,一個半空不空,上面壓著一塊大磚,中間不知何物,一手摸下 ,拿著就走。將要出門,神堂前一個香爐跌在馬桶上。響亮一聲,牀上夫妻兩個一覺 驚醒,將壇口一摸,大叫起來,賊已去得遠了。正在喉急之際,劉公宅內催要兩個丫 頭進去伏侍,急得敬山上天無路,人地無門。鄰舍街方娓娓傳說,前日丫頭原是指空 騙的,銀子失去卻是真的。那管家不容寬縱,一直扭到船上說知原故。劉公大怒,即 刻發了名帖,送到府裡追要丫頭。敬山兩隻空拳,泥也捏不成團,如何措手?追出原 契,卻又著落保頭一一代償,仍說敬山拐帶子女。身在監中,敲撲不過,也只得將自 己親女十二三歲,送到船內做了使女。也照顧清之一案,問了站徒,送到京口驛去。 仍舊使他二人打個幫兒,在那南北馬頭送迎官長,也不枉老白賞靠著虎丘山得這一場 結果。至今說起,留了一個笑聲。』 總評蘇白賞佻達尖酸,雖屬趣行,害同虺蜴,乃人自知之而自迷之。則虎丘乃虎穴矣 ,何足為名山重也。艾衲偏游海內名山大川,每每留詩刻記,詠嘆其奇,何獨於姑蘇 勝地,乃摘此一種不足揣摩之人?極意搜羅,恣口諧謔。凡白賞外一切陋習醜態、可 笑可驚、可憐可鄙之形無不淋漓活現,如白賞諸入讀之,不知何如切齒也。雖然,艾 衲言外自有深意存乎其間。 畫鬼者令人生懼心,設阱者令人作避想。知之而不迷之,此輩人無處生活,則自返浮 而樸,反偽為真。後之游虎丘者,別有高人逸士相與往還,雪月風花當更開一生面矣 。雖日日遊虎丘也何傷! 第十一則 黨都司死梟生首 農家祝歲,必曰有秋。何以獨說一個『秋』字?春天耕種,不過萊、麥兩種,濟得多 少?若到四五月,夏天耘耨時節,遇著天雨久澇,大水淹沒,或天晴亢旱,苗種乾枯 ,十分收拾便減五分也還好,趁著未立秋時另排苗秧,望那秋成結實。若到秋來,水 大不退,旱久無雨,這便斷根絕命,沒得指望。所以豐年單單重一『秋』字。張河陽 《田居詩》云:『日移亭午熱,雨打豆花涼。』寒山子《農家》詩云:『紫雲堆裡田 禾足,白豆花開雁鶩忙。』為甚麼說著田家詩偏偏說到這種白豆上?這種豆一邊開花 ,一邊結實。此時初秋天氣,雨水調勻,只看豆棚花盛就是豐熟之年。可見這個豆棚 也是關係著年歲的一行景物。當著此時,農莊家的工夫都已用就,只要看那田間如雲 似錦,不日間『污邪滿車』、『穰穰滿家』是穩實的。大家坐在棚下,心事都安閑自 在的了。若是荒亂之世,田地上都是蓬蒿野草,那裡還有甚麼豆棚?如今豆棚下連日 說的都是太平無事的閑話,卻見世界承平久了,那些後生小子卻不曉得亂離兵火之苦 。今日還請前日說書的老者來,要他將當日受那亂離苦楚從頭說一遍,也令這些後生 小子手裡練習些技藝,心上經識些智著。萬一時年不熟轉到荒亂時,也還有些巴攔, 有些擔架。眾人道:『有理,有理。我們就去請那老者。』卻好那老者是個訓蒙教授 ,許久在館未回。這日乘著風涼,回家探望。眾人請來棚下坐定,就道:『老伯多時 不在,覺得棚下甚是寂寞。雖有眾人說些故事,也不過博古通今的常話。老伯年齒高 大,聞得當年曆過許多兵荒離亂之苦。要求把前事敘述一番,令小子們聽著,當此豐 熟之際也不敢作踐了五穀,蕩壞了身軀。』老者道:『若說起當初光景,你們卻唬殺 也!記得萬曆四十八年,遼東變起。泰昌一月短柞,轉了天啟登基,年紀尚小,癡癡 呆呆,不知一些世事。天下募兵征餉,被魏太監將內帑弄得空空虛虛。彼時的吵鬧還 在山海關外,內地尚自平靜。不料換了崇禎皇帝,他的命運越發比天啟更低。遇著天 時不是連年亢旱,就是大水橫流;不是瘟疫時行,就是蝗蟲滿地。兼之賦性慳嗇,就 有那不諳世務的科官,只圖逢迎上意,奏了一本,把天下驛夫馬錢糧盡行裁革。使那 些游手無賴之徒絕了衣食,俱結黨成群,為起盜來。始初人也不多,不過做些響馬, 邀截客商,打村劫舍。後來上官知道,遣兵發馬,護衛地方。這些盜黨或嘯聚山林, 或團結水泊。那時若得一位有膽勇智謀的元戎出來招安,沒有在朝的官兒逼索他賄賂 當道的上司,掣肘他事權,也還容易消滅的。不料國運將促,用了一個袁崇煥,使他 經略遼東。先在朝廷前誇口說,五年之間便要奏功,住那策勛府第。 後來收局不來,定計先把東江毛師殺了,留下千餘原往陝西去買馬的兵丁,聞得殺了 主帥之信,無所依歸,就在中途變亂起來。四下飢民雲從霧集,成了莫大之勢。或東 或西,沒有定止,叫名流賊。在先也還有幾個頭腦假仁仗義,騙著愚民。後來所到之 處,勢如破竹。關中左右地土遼闊,各州府縣既無兵馬防守,又無山險可據,失了池 村鎮,搶了牛馬頭畜。不論情輕情重,朝廷發下廠衛,緹騎捉去,就按律擬了重闢, 決不待時。 那些守土之官權衡利害,不得不從了流賊,做個頭目快活幾時,即使有那官兵到來, 乾得甚事。那時偶然路上行走,卻聽得一人唱著一隻邊調曲兒,也就曉得天下萬民嗟 怨,如毀如焚,恨不得一時就要天翻地覆,方遂那百姓的心願哩。他歌道:「老天爺 ,你年紀大,耳又聾來眼又花。你看不見人,聽不見話,殺人放火的享著榮華,吃素 看經的活活餓殺。老天爺,你不會做天,你塌了罷!老天爺,你不會做天,你塌了罷 !」四下起了營頭,枝派雖不記清,那名字綽號也還省得,如:大傻子劉通、王老虎 王國權、老迴迴馬進孝、過天星徐世福、闖王高汝景、闖將李自成、沒遮攔閻洪、掃 天王惠登相、平世王賀景、闖塌天韓國基、草天王賀一龍、混十萬劉國龍、活閻羅馬 守應、一秤金牛成虎、虎拉海范世壽、賽金剛薛有功、紅狼劉希堯、巴山虎李園、草 上飛徐世寶、紫金梁馮進孝、鬼子母董國賢、草裡眼孫仁、金翅鳥王國曜、曹操羅汝 纔、九條龍郭大成、一斗谷孫承恩、獨腳虎劉興子、金錢豹柳夫成、莽張飛楊世威、 蠍子塊白廣恩、八大王張獻忠、李公子李嚴、鄧天王鄧廷臣、閻王鼻劉越、雲裡虎張 得功、三猴兒李超、老當家坤一魁。許多頭目在那沒有城池、鄉兵、寨堡的地方,兵 馬一到,老小隨著俱行。憑著力氣,搶得驢馬,收得小子多的,就是管隊。凡四十歲 以上,不論男婦一概殺了,只留十二三歲到二十四五歲上下的當作寶貝,或結義做弟 兄,或拜認作父子。你道他營中為何不要那老成的?因他年紀大了,多有繫戀家小財 產,恐生外心。惟是這些小夥子,奮著少年血氣,身家父母俱無罣礙,不知天高地厚 。遇著打仗,不避利害,即使炮火打來,壞了前邊的,後邊的就湧上去。撞著堅厚城 池,小子們拿著雲梯、遮陽、撓鉤、套索,搭著一個個扒頂而上。一日不破攻一日, 十日不破攻十日。日間一隊一隊更翻攻打,夜間又有一班專扒地洞的,在於城壕一二 里外,用著卷地蜈蚣、穿山鐵甲,繞地而進,或到了一兩個空隙,加上炮火,一聲炸 烈,登時城牆倒塌,一擁入城。城內人民殺戮之外,剩下小子都率領而去。始初破城 ,只擄財帛婆姨;後來賊首有令,凡牲口上帶銀五十兩、兩個婆姨者即行梟示。殘破 地方拋棄的元寶不計其數。有那貪心的只好暗地埋藏,記認明白,希圖日後事平,掘 取受用。誰知性命不保,那裡輪得你著?日久埋沒,聽人造化而已。 所以彼時小子看得錢財如糞土一樣,只要搶些吃食、婆姨,狼藉一番。還有那忍心的 ,將有孕婦人暗猜肚中男女,剖看作樂。亦有刳割人的心肺,整串熏乾以備閑中下酒 。更有極刑慘刻如活剝皮、鑿眼珠、割鼻子、剁手腕、刖腳指,煅煉人的法兒不知多 少!只好粗枝大葉說些光景,叫人在太平時節想那亂離苦楚,凡事俱要修省退悔一番 。前日有個客人從陝西、河南一路回到湖廣地方,遇著行人往往有割去鼻耳的,有剁 去兩手的,見了好不寒心。後來見得多了,不甚希罕。更有一個受傷之人,說來人也 不信。大凡人的耳目口鼻手足四肢有些殘缺,還不傷命;只那頸顱砍了,登時便死, 沒甚麼法兒補救得的。 有個人卻在河南府洛陽縣地方荒村小鎮之上,偶然騎著牲口走到彼處,遇著疾風暴雨 ,無處躲閃,要借人家屋簷之下暫時避雨。不料大雨滂沱,到晚不住,只得要求人家 屋內借宿。裡邊走出個老者道:「屋宇蝸小,不敢相留。須往前村二三十里方有歇店 。」那客人因天色漸晚,不便趲程,看見老者家裡尚有側屋二間空閑閉著,再三相懇 。那老者道:「側房雖是空的,客官借宿何難?此中有個舍弟在內,不便同居。」客 人道:「既是令弟單身在內,有何不便?」老者道:「窮途相值也是奇緣,但你見了 不要害怕。」客人道:「我也在江湖上走了一二十年,隨你甚麼尊官貴客、窮凶極惡 之人,何處不遇?怎便到你宅上就害怕起來?」嘴裡一頭說,腳下一頭走。將及側門 ,老者輕輕叩了一聲,裡邊響動,把門閂拔脫,一手推開。客人隨著老者進內,猛然 抬頭一看,只見門左側站著一個沒頭的人。那客人一見就大聲叫道:「不好,有鬼, 有鬼!」口尚張著,未曾合閉,兩腳也就倒下地去。老者連忙扶起道:「預先我已說 明莫要害怕,你也口強說道不怕,如何便怕到這個地位?」那客人呆了半晌,問道: 「怎麼原故?」老者道:「你且坐定,待我慢慢說與你聽。」一手指著沒頭人道:「 這個舍弟向在潼關賣布生理。前年被流賊一路追趕逃回,不料到家只離得三十里地面 ,卻被土賊從旁殺出,把舍弟一刀將頭砍落,倒在地上。夜間就有許多豺狼把死屍一 半殘食。將次食到弟屍,那魂靈只聽得耳邊一聲喝道:『畜生快走!督陣功曹尚未查 勘,如何就食!』少間卻見許多人馬簇擁而來,將陣上傷亡一一照名驗過。點到舍弟 ,簿上無名,換個簿子查看,乃是受傷不死,尚有陽壽四載。 次日舍弟心上卻就明白起來,將手摸那頭時,只有一條頸骨挺出在外。是夜我尚躲在 村中僻處,卻聽見有人叩門,乃是舍弟聲音。荒村中又無燈火,只得從黑影子裡扶進 屋內。他就將前村遇害緣故說得明明白白,挨到天亮,見是沒頭的;卻原來與沒頭的 說了半夜。始初也吃了一驚,只見身體尚暖,手足不僵,喉嚨管內唧唧有聲,將麵餬 、米湯茶匙挑進,約及飽了便沒聲息,如此年餘。近來學得一件織席技藝,日日做來 ,賣些錢米,到也度過日子。」客人聽見說得明白,心下方安。畢竟是那脫惺忪,一 夜不敢睡著,到底是個「怕」字。這也是古今來的奇事,說做活人不得,說做死人也 不得。如今再說一個分明是死人,到做了活人的事。此事卻在陝西延安府安塞縣地方 ,姓黨名一元。生平性子剛直,膂力過人,家業也極豐足。地方上有那強梁霸道的人 做那不公不法的事,他也就去剪除了他。 凡有貧窮?難之人,他便捐費資財,立為提挈。遠近村坊俱感激他的義氣。一兩年, 處處仰慕他的聲名,不減太平莊上柴大官,鄆城縣的宋押司了。此時流寇尚未充斥, 州縣地方聞有賊警,鄉紳士庶俱各糾集莊丁,措辦月糧、器械,以為固守之計。 上司又恐民間有那不軌之徒乘機生變,也就上了一本:凡流賊蠢動地方,俱要舉一智 力兼備之人在郡城立為都統,州縣立為團練,村堡鎮寨立為防守;俱各從公選舉,若 纔行不足的,也就不敢擔當。那時朝廷公令雖嚴,世風惡保有前程的做官,尚要費許 多資財,若沒前程的百姓,夢也夢不見了。不料時下有團練之舉,人頭上也就當做真 正官職一般。彼時公道在人,地方紳衿保甲齊聲推薦黨一元堪當此任。文書申上,撫 按司道即便發落,黨一元也就承其職任。凡一應城守事務,調停設備,俱各得宜,不 在話下。『卻說延安府清澗縣也有個團練,姓南名正中,乃是鄉紳子弟,家業富厚, 通縣稱為巨族。平日好弄槍棒,行些假仁仗義之事。只是心性好淫,見了人家美色婦 女,卻便魂不附體,不論錢財,畢竟要弄到手方祝若論其素行,怎麼將團練舉他?因 他平日專好結識市井無賴小民,地方村鎮稍有不平,便成群聚黨攪地翻天起來,依著 他的行為方罷。故此地方上大大小小都是懼怕他的,背後起他一個綽號,叫做花花太 歲。這個團練之職,除了此君,別人也不敢指望。 一日吩咐人城外打掃演武廳,選了日子操練莊叮極早備了鮮明旗幟、鋒利刀槍,大吹 大擂,擺列行五,一路整齊迎到教場內去。那些鄉民卻從來未曾經見,有在市上住的 ,預先請了親眷住在家裡,門前垂了簾兒,看那行兵耍子。不料南團練坐在馬上,舉 頭望進簾內,見了一個如花似玉的女人。團練即便勒住了馬,故意道:「前隊兵丁如 何稀少?」忙叫營中字識取那冊來查點,吩咐地方速備圍屏公座,緊緊對著簾內。擺 設停當,下馬坐定,叫那字識,逐名唱過。那團練一眼只射在簾內,做出許多身段賣 弄風騷,到費了兩三個時辰纔到教場內去,也不過虛應故事,即便回衙。眠思夢想, 正沒尋個頭路,卻有門下一個伴當頭李三,綽號叫做鐵裡蛀蟲,曉得本官意思,即便 摘了兩朵玫瑰花,故意走到本官前道:「小的偶在前街張鄉宦宅內彩來,一朵進獻老 爺,一朵進上奶奶。「團練道:」三四位奶奶一朵怎夠?」李三道:「這花不能多得 ,老爺只好送得意的一位奶奶戴罷!」團練道:「有甚麼得意的!昨日我到看見一個 十分得意,卻難得到手。」李三佯作不知,問道:「住在何處?」團練就把簾內住處 說知。李三道:「小的曉得了這是本縣儒學齋長朱伯甫相公之妻黨氏,就是黨團練的 妹子。如何能夠到手?」團練道:「你為我設一計策,重重賞你!」李三貪著重賞左 思右算,想了一回道:「容小的三日後來回話。」團練便欣欣笑道「我心裡如熱鍋灶 上螞蟻,恨不今日就來回說纔好!」李三隨口應著,即便走出宅門。打聽得朱伯甫平 素好酒賭錢,李三就帶了幾十貫錢,尋到彼處,與他相賭。故意賣個撒漫,勾引著他 同去見那團練,往來卻好是三日。團練正在懷想之際,李三先進去附耳低聲,如此如 此。團練一見朱伯甫果然是個酒糟頭沒莑的朋友,即便留茶,稱贊了許多,道舍下少 一位幕賓相公。立刻備了齊整聘禮,即日起館。午後排了極盛酒席,與他痛飲,直到 五更。朱伯甫心中十分快活,次日即將聘禮送與李三作酬。住了三四日,朱伯甫卻要 回家說知,也就要料理些安家糧食。團練道:「我知兄有內顧,早已著人送去。若不 棄我武途出身,就今日與老兄結義,拜了兄弟,尊嫂即請到舍下同住,豈不兩便?」 伯甫乃是糊塗糟鬼,即便應承,就叫李三到家與朱宅娘子說知。娘子道:『我前日在 門首看見團練舉動輕輕狂狂,只怕到宅同住,卻是不便。不若我在城內舍親處覓間小 房,與宅內相近些罷了。」李三見娘子如此說話,卻象有三分知覺的,若說得太緊, 不肯進城,卻不誤事?只得含糊應允。一面備了車兒裝載些要緊家夥,到城中親眷處 住下。團練看得光景十分寬緩,即便同了朱伯甫過門邀請。說是通家盟弟兄嫂,必要 請見。朱伯甫也攛掇娘子出來見了。團練假裝出十分老成恭敬,黨氏不覺墮其術中, 依他搬到宅內。供給周全,自不必說。卻就有些眉來眼去,黨氏也不在意。過了數日 ,李三卻遣妻子攜了酒盒,假以探望為由,吃酒中間露些風情說話。 娘於聽得不甚耐煩,不言不語。李三妻子只道娘子有暗允之意,乘著酒意將團練思慕 、設局穢來之意,一一說個詳悉。袖中拿出一枝金鑲碧玉搔頭、白玉同心結一枚遞與 黨氏。黨氏心知是計,也不推辭,且留在手中做個指證。即喚丈夫出來,商量早早脫 身。無如伯甫口嘴肥甜,一心信道團練是個好人,反把妻子罵個不賢不慧,生出事來 。黨氏無計可施,只得寫了一書,將前後情節通知哥哥黨團練處。』『黨團練聞知此 信,怒衝冠,心下想了一想道:「三日後新總督老爺到任,他必同我一處迎接。」乘 著空隙,密密差了十數名伴當,帶了馬騾,相隔不過二百餘里,火速就到。進了南宅 大門,門上牢子攔擋不住,直入花園之內,竟將娘於攙扶上馬。那酒徒朱伯甫尚在醉 鄉,也不管他,竟自出門來了。宅內登時差人報與南團練知道,彼時就在接官亭上與 黨團練爭嚷起來。同僚相勸尚未息口,李三一馬就跑到黨宅前後探聽娘子下落。南團 練也不回家,帶了二三百個健丁,出其不意竟到黨宅把娘子搶了便行。黨團練路上聞 知,即帶隨從不多兵丁,登時追去百里之外,狹路相湊,打了一仗。黨團練膽勇過人 ,反把南處人馬傷了許多。南團練無心搦戰,只抱著娘子先跑。娘於看見仍落賊手, 披顛狂,罵不絕口。轉到陡險山坡,將身亂迸,馬忽驚跳,南團練手腳略鬆,娘子墮 落重崖。可憐一個如花似玉之人眼見得粉憔玉碎,南團練抱恨不已。黨團練知道妹子 全節而死,即在督臺下馬放告之日,寫狀並朱伯甫一齊告准。督臺看見狀上情節,拍 案大怒,立刻差了八個旗牌找拿。南團練自揣罪孽重大,對頭又狠,後來收拾不來。 平日強橫霸道慣的,向來原有反叛之心,今朝攢促攏來無計可脫。那鐵裡蛀蟲又在傍 十分挑激,遂開聲道:「反了罷!」那些手下兵丁似虎如狼的一哄,就起先把本縣知 縣殺了,劫了庫藏,燒了城摟。一路逢人就殺,怕殺的一路就跟隨了許多。提督早已 知道,點兵發馬,就把黨團練加昇都司,差他領了二千兵丁,上前撲剿。南團練十餘 日間就擁了六七千人馬,雖則人眾,其實難民居多。日間放搶,夜間又怕官兵趕來, 晝夜不睡,卻都是疲倦的,怎當得黨都司奮勇當先?部下又是練熟人馬,一齊抄出小 路,兩下撞著大砍一番,將南團練的兵馬殺了十之六七。負傷大敗,領了殘兵逃入深 山躲避,整整餓了七日。不料李三起手之時,就將本城內所搶輜重帶了許多牛馬,前 往流賊老迴迴營中,先已投順,做個家當在彼。聞得南團練被官兵殺敗躲在山中,即 便請了五千賊黨,抬營前來接應。南團練得這救兵解了重圍,即投入賊營,做個前隊 。』 黨都司得了大捷,督臺甚是喜歡。正在休息之際,忽報賊兵已抵界上,仍復疾忙披掛 ,領兵應敵。只見有賊兵千餘在前誘敵,黨都司不知是計,奮力追上。轉過樹林深處 ,四面盡是砍倒樹枝塞著去路,急待迴軍,那賊兵漫山遍野而來。黨都司逞著雄威, 左沖右突,東擋西搪。雖則殺了多人,自巳牌殺到酉刻,終是氣力有盡,不料騫湊山 凹之處,馬足一蹷墮落崖中。草窠裡伸出許多撓鉤,將黨都司綑困*縛而去。解到營 內,正當老迴迴昇帳。遠遠望見解進,即便下位親解其縛,口口叫道:「哥哥,弟有 罪了!」黨都司忠烈成性,怒目張牙,大聲罵道:「逆,逆賊!朝廷何負於你?如此 跳樑,且又護庇淫惡之賊,無端擾害地方?大兵不日剿除,尚不知死!」張拳就打, 卻被兩邊牙爪上前擠祝黨都司回身一肘,幾個掀翻。老迴迴喝道:「左右與我依舊捆 了,發到剝皮亭上,就差南團練細細擺佈他罷。」南團練得了這句,就像奉了聖旨一 般,換了一件紅袍,吩咐手下襬了公座。兩班牢子大聲喝起堂來,將黨都司挽進營來 ,要他下跪,黨都司挺身罵不絕口。南團練故意搖搖擺擺,做那得意形狀,上前數數 落落。黨都司將自己舌頭嚼得粉碎照臉噴去。南團練掩了面口,復去坐在位上,罵道 :「你如此性烈,如今插翅難飛,少不得受我磨折。」言未了,那黨都司咽喉氣絕, 覺得怒氣尚然未平。左右報道:「黨都司已死,手足如冰。」南團練徐徐走近前來, 上下摸看,果然死了。忙叫左右備起幾桌酒席,請了許多弟兄,開懷吃個得勝之杯。 一邊叫人將黨都司騎的馬攏將過來,扶他屍首坐在馬上,那口雁翎刀也插在他懷裡, 然後大吹大擂起來。南團練手持一杯,走到黨都司屍前罵道,「黨賊,你往日英雄何 在?今日也死在我手!」將酒杯往他臉上一澆,依舊轉身將往上走。口中雖說,心下 卻不堤防。不料那馬縱起身來,將領鬃一抖大嘶一聲,黨都司眉毛豎了幾豎,一手就 把懷中所插之刀掣在手內。兩邊盡道:「黨都司活了!黨都司活了!」南團練急回頭 看時,那雪亮的刀尖往上一幌,不覺南團練之頭早已落地。眾人吃了一諒,黨都司僵 立之屍纔仆倒在地。那馬猛然一躍而起,沖出營門,正撞李三騎馬回來,卻當面一口 把李三咬翻在地,心頭踢了幾踢,眼見李三已死,那馬跳了幾跳也就死了。眾人盡道 :「忠臣義士之魂至死不變,說已死了尚且如此,英靈報了仇去。這個人比那死作厲 鬼殺賊更爽快許多了。」老迴迴看見英魂如此猛烈,也就退兵而去。後來世界平盡, 屢屢顯靈,至今蓋個廟宇,香火不絕。起初說的是活人做死人的事,這回說的死人做 活人的事。可見亂離之世異事頗多。 彼時曾見過亂世的已被殺去,在世的未曾經見,所以淹沒,無人說及。只有在下還留 得這殘喘,尚在豆棚之下閑話及此,亦非偶然。諸公們乘此安靜之時,急宜修省!』 眾人聽罷,俱各凜然,慨嘆而散。 總評人能居安思危,處治防亂,雖一旦變生不測,不至錯愕無支。明季流賊猖狂,肝 腦塗地,顛連困苦之情,離奇駭異之狀,非身歷其境者,不能抵掌而談。至於姦淫、 忠義,到底自有果報。如南團練以縱淫謀叛,黨都司以血戰被擒,邪正判然矣。不意 狹路相逢,陷落仇人之手。小人得志,將欲抒宿恨以博新歡。誰知精靈閃爍,乘此扶 屍數罪之時,即死斷生顱之舉,天之報施忠佞,果若是其不爽耶!乃知世間盡多奇突 之事,人自作井底蛙耳。得此敘述精詳,一開世人聾瞽耳目。 第十二則 陳齋長論地談天 天下事不論大小,若要不知,除非莫為。即如豆棚上生了幾個豆莢,或早或晚,彩些 自吃;或多或少,賣些與人。不費工本,不佔地方,鄉莊人家其實便利,也是小小意 思。只因向來沒人種他,不曉得搭起棚來可以避暑乘涼,可以聚人閑話。 自從此地有了這個豆棚,說了許多故事,聽見的四下揚出名去,到了下午挨擠得人多 ,也就不減如庵觀寺院擺圓場掇桌兒說書的相似。昨日老者說到沒頭人還會織席、死 的人還會殺人,聽見的越發稱道『奇怪之極』。回去睡在牀上,也還夢見許多敗陣傷 亡、張牙舞爪、弄棒拖槍追趕前來,沒處躲閃。醒來雖則心裡十分驚恐,那聽說話的 念頭卻又比往日更要緊些。此是豆棚下的人情,大率如此。不料這個說書的名頭,看 看傳得遠了,忽然傳到城中一個人耳朵裡,聽見城外有人在那裡說故事,即便穿了一 件道袍,戴上一頂方巾,遠遠走出城來,挨村問信。 彼時從人頭上聽得不真,竟不提起豆棚的話,卻誤說了一個『竇朋友』在村中講書, 特來請教。東邊西邊挨村問過,那裡有人曉得?將次問到那村中前後,有一人笑道: 『先生差矣!此地並沒有姓「竇」的朋友會得講書,只有這邊村裡,偶然搭個豆棚, 聚些空閑朋友在那裡談今說古。都是鄉學究的見聞。何以瀆高賢聽!』那人卻也笑將 起來,道:『我委實誤矣!』 即便走到這邊村裡去,果然看見豆棚下有許多人坐著,他也便捱身進去。坐內一個人 看見這人捱進棚來,隨即起身扯著一人附耳低言道:『此老乃城中住的一位齋長,姓 陳名剛,字無欲,別號叫做陳無鬼。為人性氣剛方,議論偏拗。年紀五十餘歲,胸中 無書不讀。聽他翻覆議論天地間道理,口如懸河一般,滔滔不竭,通國之人辯駁不過 。不知那個勾引他到這鄉村裡來的?』 道言未了,那齋長也就對面拱了一拱,開口道:『聞得這裡有一位大學問的朋友講論 古往今來的道理,小弟不遠數十里特來求教!』眾人俱是面面相覷,不知甚麼來歷, 只有昨日說書的老者道:『小弟輩偶然乘著風涼說些閑話,都是耳目前的見聞、道路 間的事實,不通經書,不入理路,就像念那「勸世文」一般的。幸而今日天氣還早, 諸友尚未來齊,萬一小弟不知先生到來,在此放肆胡說,只怕污了先生之耳,連清晨 的早飯也要噴出來哩!』陳齋長道:『老仁翁言之太謙。小弟此來也不是好事,只因 近來儒道式微,理學日晦,思想起來,此身既不能闡揚堯、舜、文、武之道於朝廷, 又不能承接周、程、張、朱之脈於吾黨,任天下邪教橫行,人心顛倒,將千古真儒的 派,便淹沒無聞矣。』老者道:『今日幸荷先生降臨,亦生平難逢之會。先生如不棄 老朽,請登上席,賜教一二,大開眾人茅塞,在先生具有救世婆心,想斷無所吝教! 』齋長聽老者這番說話,卻似挑動疥癩瘡窠一般,連聲道:『予豈好辯哉?亦不得已 也。』 對眾人將手一拱,竟到中央椅上坐了,道:『老仁翁要我從那裡說起?』眾人道:『 從未有天地以來說起,何如?』齋長道:『未有天地以前,太空無窮之中渾然一氣, 乃為無極;無極之虛氣,即為太極之理氣;太極之理氣,即為天地之根罧。天地根罧 化生人物,始初皆屬化生;一生之後,化生老少,形生者多。譬如草中生蟲,人身上 生蝨,皆是化生。若無身上的汗氣、木中朽氣,那裡得這根罧?可見太極的理氣就是 天地的根罧。 或說來未必明白,取一張紙來畫一圖你們去看。』那時就有這些好事的後生取筆的去 取筆,借硯的去借硯,擺列得在桌上。 那齋長取過一張紙來,畫出一圖與眾人觀看:眾人道:『太極理氣怎麼就有陰陽、日 月、星辰?』齋長道:『陽之精為日,陰之精為月。星辰浮運於天,俱以象顯。陰氣 聚會於中為地,五行萬物承載於地,俱以形顯。譬如人鼻中氣息,出者發揚而溫,屬 陽;入者收斂而寒,屬陰。陰凝聚於中,而水泥變化,五行皆備。陽浮動包羅於外, 運旋上下,形如雞蛋。地乃雞黃,浮奠於中而不動。天如雞青,運動於外而不已。天 行常健,自無一息之停。隨氣運動,自成春、夏、秋、冬、風、雲、雷、雨,人物之 化化生生,而世界乃全矣。天地靈秀之氣充溢滿足,自生聖人,以助造化所未備。故 聖人與天地併稱者正謂此也。說來未必明白,再畫一圖你們細看。』隨又畫出一個圖 來:眾人道:『天體輕清,那玉皇大帝在於何處?地體重濁,那閻王鬼獄又在何處? 』齋長道:『天體輕清,時時運行,豈容一物?物既不容,安能容神道居之?晝在上 者,夜必隨時序而漸轉於下;夜在下者,晝必隨時序而漸轉於上。若有玉皇等神果在 天宮,必因時刻運轉。難道神道也隨著倒轉來不成? 地體極厚,下皆水泥土石,重重積聚。若有閻王鬼獄,難道住在水泥土石之中不成? 』眾人道:『聖人與天地並立而為三。 天地在,聖人亦該在。如何羲皇、堯、舜、孔子也就隨世而沒?』 齋長道:『未生聖人之時,此理此氣在天地。既生聖人之後,此理此氣即在聖人。雖 聖人壽老而終,那道德教化垂範萬世,與天地同其悠久,可見聖人之身雖沒,那理道 依舊還之天地。天地常在,即聖人亦常在也。』眾人道:『孔子是個聖人,也還去請 教那太上老君,想也是個怕死的緣故。』齋長道:『老子乃是個貪生的小人,其所立 之論尚虛、尚無、尚柔。觀其訓弟子日:「觀吾舌,舌在,非以其柔耶?觀吾齒,齒 亡,非以其剛耶?」天地生物,宜剛自剛,宜柔自柔。如使人口中牙齒皆象那舌根柔 軟,連飯也不能吃了,何以生長於世?又如金有五色,有黃金,有白銀,有黑鐵,有 銅錫。若說金銀性柔而貴,金銀不過打造首飾、器皿、物等類。在剛鐵,用於耕,則 有粒食養命之功;用於廚,則有烹庖斷割之功;用於兵,則有安民御盜之功。其他難 以盡述,總之為其剛而可用也。人之貪色者,必以柔而眷戀;貪財者,必以柔而彌縫 ;小人之徒,必以柔而趨利避害。假如女人性剛,誰敢調戲得他?火性至烈,誰敢玩 弄得他?義經、易理尊重「剛」字,老子說個「柔」字,則已違悖聖經天道矣。且人 生不過百年,老子貪生於百歲之外。 又欲陽神不滅,以造化之氣。故其尚虛無者實欲貪其有也,尚柔者實欲勝其剛也。與 天地正理不大相悖乎?』考得老子生於週末,即今河南府靈寶縣地方。其父名廣,乃 鄉野貧人,幼與富家傭工,年過七十尚未有妻。其母亦鄉之愚婦,年過四十尚未有夫 。偶在山中苟合,得了天地靈氣,懷胎八十個月。主人惡其胎久,不容于家,不得已 走於曠野大李樹下,生下一白白眉之子。其母亦不知廣為何姓,遂指樹為姓;見其耳 大,遂名李耳。世人見其發白,呼為老子。及長而為週天子看藏書,做個卑官,所以 多知古事、古禮,故孔子有問禮問官之舉。 及後來年老,見周室將亂,遂騎青牛西入函谷關,遇關尹名喜者師之,作《道德經》 五千言於秦川銩稨縣。遂卒於此,其墓在焉。此老子之始終也。生前不能救周室之亂 ,又不建一毫功業於世,死後返為天上三清,豈有是哉!』眾人道:『佛子西來之教 如何?』齋長道:『佛氏亦貪壽之小人。其說尚空,一切人道世事皆棄而不理,並欲 絕滅其念慮,使心常空空無我。 有耳目滅其視聽,使耳目常空。有口、體、手、足、陰陽之形,必盡制之不動,使百 體常空。務要精、氣、神三者完足,會而為一,性靈不滅,常存於世。此以貪生貪有 之心由真空而成其真實也。盜天地之精華,不肯還之天地,是天地間之大賊也,豈得 謂之真空?考得佛未生之時,其母夢一大白象來夢中投生,自此懷胎。日日漸大,腹 不能容,及生時裂其母腹,死而後生。 此天生怪異之人,將亂宇宙,故先殺其母耳。世間惡物如梟鳥,如蠍子,如毒蛇,其 生也,母必先死而後出。佛之生也,豈與惡類之相同乎?因其初生而先傷其母,世人 乃設齋打醮,百方為母祈福,是佛之不保己母者反能保他人之母乎?又考得佛在西域 為梵王國主,有美妻、美妾,稱為菩薩。金帛財寶極多,國雖殷富而地方狹小,氣勢 甚弱。四鄰之國皆強橫暴虐,常常被他侵凌,佛國兵馬微小,不能抵敵,遂棄國而逃 。沒奈何倡一修行好善之說,又立出許多四生六道、報應輪迴的榜樣,以愚弄四鄰。 他的意思不過說道:「你等今世殺我人民,搶我財物,後世必轉變犬馬填還我的。」 是以十二年間,四鄰果被愚惑,佛復歸國與妻子完聚。其國仍舊富強起來,子子孫孫 方得保全。佛本以智術說個真空,反得了許多實利。他原不以術化我中國,只因中國 聖人之教化不行,人的欲心勝了則惑心益勝,不敢向堯、舜、周公、孔子闡明道義, 惟向佛子祈求福澤。聖人教人無欲,教人遠鬼神,以盡人道之常。佛子惟知有已,把 天下國家置之度外,以為苦海,而全不思議。自以為真空,而其實一些不能空,一味 誘人貪欲,誘人妄求,違誤人道之正。 總此求空之一念也。』眾人道:『四大皆空,陽神不滅,佛老之論,總無沾滯。不過 存此真性,可以長生永命,亦天人之正理也。先生言之,何其僻歟?』齋長道:『老 子貪生,壽過百歲,而又欲陽神不滅;佛子貪生,止活六十三歲,而乃要真性常存。 世上人,壽數皆有定期,而佛老獨要長生;舉世死皆滅亡,而佛老獨要長存。此身之 外,又說一個陽神之靈,又有一個真性之靈。故佛氏一身而有三像,老氏一身而分三 清。分明地上一株柳樹,變一個柳精出來,洞裡一個狐狸,又變一個狐精出來。一個 佛老,又能分身出世,豈不與樹木禽獸之成精作怪的有何分別?不惟如此,我還把佛 老邪說、向來世人受其大惑、大亂,皆屬迷而不悟,我今歷歷指出,約有十件,你們 細心領會著:一件,佛經舍利子之說。以此身為房舍,靈常存,世世輪迴。吃母之乳 ,如江水無窮,遂以父母為房舍,特借其房舍轉生。此則輕視親身,比之土木,啟天 下萬世以不孝之罪。 其滅天性一體之大惑,一可恨也。一件,佛經視此身為房舍,而不知愛惜。故求福利 者,今生如不遂意,欲來生受用,乃因朝山進香捨身,投之千丈崖下,跌碎骨體。尤 如蕩子與娼妓,淫男與狂童,情濃愛厚,一時不能割捨,遂同自縊投河者,往往有之 。蓋謂今生不常相守,欲祈來生做夫妻也。此則信了轉身之謬,一旦輕棄此身。其妄 自殺身之大惑,二可恨也。一件,世人視此身為房舍,而不知珍重,故信神奉佛的婦 女被僧道奸徒欺哄,以為此身一客房耳,極不要緊。女體多與男相交,通龍脈,會佛 根,今生陰形,來生必轉為男身。往往富室良家婦女,每被姦淫,甘喪廉恥而隱昧終 身。此其淫亂閨門之大惑,三可恨也。一件,世人迷於前生報應之說,故強盜凶徒執 刀奪人財物,曰:「你前世少我債負,我今來討!」或恃勢逼人之奸,或巧言誘人之 淫,曰:「我與你原有宿緣,今世所以遇我。」其他種種惡積,皆可以藉口前生為解 。又有那好學仙人煉丹養性,每被方士將銀盜去。此其陰助奸盜之大惑,四可恨也。 一件,世人迷惑佛經,信其懺悔罪過。故奉佛者白晝百方為惡,無所不至,及夜間焚 香誦經,祈免罪獲福;日日作惡,夜夜懺悔。 甚者有一盜入午門樓上,及內官拿住,把他衣服剝開搜看,渾身皆是佛經。蓋彼酷信 佛經免禍超脫,故穿在身上以作盜耳。 此陷害世情之大惑,五可恨也。一件,世人迷惑於奉佛敬道,朝山進香。每月苦力攢 錢積米,而父母凍餓,衣食不足,全不在心。又家家設立神龕供奉佛仙外神,而祖宗 先代反無祠堂。 此其滅親背租之大惑,六可恨也。一件,世人惑於清淨苦空之說,以為修仙學佛者必 無妻子家產而後可,不知人乃血氣骨肉以成此身,豈是土木水石,豈無陰陽配合之欲 ?彼佛老雖倡清空之論,亦何曾無妻妾子孫財產?彼乃虛說這個箍圈,天下後世之人 反實實遵行著他,終久戒守不定,仍舊那情慾妄動,無所不為:奸拐徒弟,哄誘良婦 ,甘心為禽獸而不恤。此敗壞廉恥之大惑,七可恨也。一件,佛老倡欺世異說,使後 世人人迷於求福,不修人事。故前有賊兵圍了京都,君臣猶穿了戎馬之服,聽講老子 、聽講佛法者不可勝數。不止於梁武帝餓死臺城,宋徽宗被擄沙漠,唐玄宗播遷蜀道 。此其欺君誣國之大惑,八可恨也。一件,假佛老神術仙方,燒香聚眾。始令人照水 盆,看見自己乃一貧病乞兒,後將家財罄捨;照見盆內男則王侯將相,女則皇后嬪妃 冠裳玉之狀。久之起兵造反,屠城陷陣。如漢時張陵、張角;元時韓林兒、徐增壽; 及明時唐賽兒、趙古元、徐鴻儒等類,流毒天下,傷命數萬。 雖綁在法場,那師師弟弟猶說「我等往西天去」,至死不悟。此其陷世斬殺之大惑, 九可恨也。一件,士農工商各修職業,無非接濟衣食居室之利,盡倫理教化之常,缺 一不可。彼佛老倡修謬說,僧道姑尼四等,男女游手遊食,騙錢安享,做那淫逸不道 之事。 上逆天倫,下廢人事,消磨世間財物,與豬羊魚鱉相同。 如達摩西來在嵩山面壁九年,安享世間衣食,以自修證。使天下人人皆面壁九年,則 職業盡廢,誰人肯去耕織?衣食無所從出,則舉世之人皆凍餓死矣,豈是天地造化之 正!況其修廟宇、貼金像、醮祭齋會,費財無窮。此其廢業蠹財之大惑,十可恨也。 我乃聊舉十件,他類尤多,不可勝述。自此可以相推,彼佛老仙神果可以勸化愚俗, 我亦何苦舉此十件,說他許多違悖正經道理?但我自有生以來凡所聞見,皆其惑世誣 民、蠹財亂倫之事,深可厭惡!諸君果能體察此情,則知我不得已之心,甚於孟子繼 堯、舜、周、孔,以解豁三千年之惑矣!』眾人道:『如先生之說,佛老俱不足取, 則天堂、地獄、鬼神一道亦滅絕矣。』齋長道:『世俗之人醉生夢死,於神鬼之說沈 溺而不可解,總起於貪利邀福之心,成其迷惑。佛老乘迷惑之見,假捏天堂、地獄、 水府等神,及鬼怪人妖、長生錫福等事,騙人之財,惑人之心,亂人之倫,欲與堯、 舜、周公、孔子之教爭立於世。說天上有玉皇仙官,如封神降雨,賞善罰惡,皆奉玉 皇敕旨後行。《玉皇經》雲,西方有淨德國王,四十無子,寶月皇后與君同祈於三清 老君。老君送一子,生即玉皇。《玄武經》雲,西方有淨樂國,國君無子,祈於老君 。老君送一子,即玄武祖師。《佛經》雲,西方有淨善國,生太子名佛,娶妻耶陀氏 ,生子摩睺羅。後出家十二年,得道成佛。如此看來,釋氏之始,實生在周家七百年 之後。古即是今,今即是古。今時之所無,豈古時之所有?如今查考西方皆腥臊羶臭 之夷人,何得以「淨」字名之?今時所見並無三頭六臂、四眼八手之人,何得信其為 天王神將?亦並無二百三百歲之人,何得信其為長生不老乎?』眾人道:『玉皇即上 帝也。書上說,武丁夢上帝賜傅說,孟子說齋戒沐浴可祀上帝,明明的是有上帝矣。 』齋長道:『唐虞之世,已惑於鬼神之說,就傳得有上帝之象。武丁好賢,極其誠篤 ,夢中見一個傅說的形貌,未曾知其名姓,遂畫形像訪而求之。如世上人不曾見生龍 活鳳,夢寐中卻常見之,亦畫像中見過,故能形於夢寐。若說真有上帝,冕旒冠裳模 樣,那黃帝方製衣裳,可見上帝乃在黃帝後所生,黃帝前卻不曾有上帝矣。 若說黃帝前就有的,難道始初赤著身體、到黃帝時重複冠裳乎?所謂帝者,天地萬物 之主宰也,故名之為帝。曰上帝者,自統體一太極者言也太極即上帝,有何形象可見 ?可以祀上帝者,即此心清淨可以對上天也。』眾人道:『地獄閻羅掌管生死,生時 有鬼送他來,死時有鬼勾他去,受罪有鬼拷打他。 人之為善,轉生富貴;物之為善,亦能轉生為人;人之為惡,轉為禽獸;物之為惡, 滅性靈。其說果否?』齋長道:『此戒訓愚俗之人則可,其實道理不然。彼男女交媾 ,父精母血聚而成胎,母腹中本自生生。若待有了胎,然後鬼魂來投,不知從孕婦口 中投的、還從孕婦腰間投的?向來肚中血塊岌岌而動者又是何物?人有此身,必形與 氣相合,而後知疼痛。今有半身不遂癱瘓之夫,火攻針刺尚不知痛,若人死後形氣相 離,都化為飛塵、蕩為冷風矣,有何軀殻形質可以加其刀山、劍樹、油鍋、碓磨之刑 ?即使說黑罡風把惡人的既散之魂,依舊吹合攏來再受罪起,那陰司鬼判也沒這樣細 細工夫。』眾人道:『閻王鬼判注人生時即注死期,一切妻子、富貴、窮通等項皆注 定在簿上,不容改移。這卻有的麼?』齋長道:『《玄傳》上說妖魔吃人無數,玄武 收之,人間方除得害。若果然吃人無數,則閻王處不曾注定人應死之數矣。若說注定 妖魔該吃,此報應正當之法,玄武出力救之,反不是注定生死之說矣。又說八百歲的 彭祖曾娶過妻七十二人。 第七十二之妻將死之時問彭祖:「何故享壽太多,想不在閻王簿上麼?」彭祖曰:「 我的姓名判官做了紙捻兒釘在簿上。」妻見閻王,閻王問道:「彭祖何妻之多?」妻 對云:「他姓名做紙捻了。」閻王拆簿看之,方勾取彭祖而去。這樣看來,彭祖之妻 也圂亂亂生的,閻王不曾注定。彭祖一生衣食窮通,不曾注定,別人的偏註定不成? 況孔、孟時世無紙書,俱以竹簡、木板為之,此地獄尚在水泥土石之下,那得有個簿 籍藏這個紙捻?此說大荒唐矣!』眾人道:『城隍土地之神乃是處處有的,難道也有 甚麼別說?』齋長道:『唐、虞之際尚無城池,夏、商以後方建城池以御盜賊。後人 遂立城隍廟,祀城隍、土地,總稱地祗,是人與萬物之母也。分之在田土,謂其功生 五穀,祀之為社神;在鄉村街市,謂其功能奠安,祀之為土地之神;在一家宅院,謂 其功能承載,祀之為中霤之神;在一方山陵,謂其功出百貨,把之為山嶽之神;在城 牆池濠,謂其有御盜捍患之功,故祀之為城隍之神,皆此一土耳。在人心中,無非飲 水思源、感恩報德之意,豈可以前殿塑男,後殿塑女,在家又塑一老頭子之像?分明 以人身之小形像輙敢誣在天地自然之正神也!此說更又唐矣。』眾人道:『城隍土地 往往顯靈,實實有個人像活現出來,怎麼總說一個沒字?』齋長道:『顯靈者又有一 種道理:世間忠義英雄烈士,或抱冤枉屈死,或無子早年猛死,其英靈之氣不散,多 依神廟顯應。如元時殺了文天祥,明時殺了於忠肅,謂其為今之都城隍。天地間生為 正人,死為正氣,正氣之靈為河嶽山川城隍等神,自然而然,不消敕封,不由人捏, 皆造化正理之妙運耳。其實山川土地本自個神靈,不可專指某人為某神也。』眾人道 :『正人固是以氣為主,天地間盡有妖人異事顯將出來。我數年在中州,看見柳樹上 生一二寸人形;江西地上、天上落下黑米;徐州天上落下人頭細豆,眼、目、口、鼻 俱完全的。世間異事妖物信有之矣。』齋長道:『孔子不語「怪力亂神」,也曉得世 間非常之變,間或有之,乃是災禍徵兆。聖人只道其常,不肯信此怪事,以啟人迷惑 之端。若佛老專專以此嚇人,所以為邪道耳。如世界將變,或萬物將死於兵荒,故五 行皆成妖怪,不獨柳樹、石塊、狐狸、猴子已也。在人只有正身修德以消化之耳。』 眾人道:『妖術怪事,不是神仙也造作不出。明朝成化年間,河南偃師縣一個百姓名 叫朱天寶死了,埋後三日,其妻三翠兒拿了些葷素酒食往去祭祀,走過高嶺,遇見一 塊大石,高有二文,翠兒剛到石邊,忽然一聲響亮,山石崩倒,露出石匣一個。翠兒 上前看時,石匣開著一縫,露出寶劍一口、妖書一本。翠兒悄悄持回,誦習數日,便 知人家未來之事。鄉人稱為奇異,奉為佛母拜從的,不及一年,約有萬人。他有法術 ,田中苗葉吹氣變為刀槍,板凳變成虎豹,布圍變作城池。一日反亂起來,官兵剿捕 ,兩下殺傷甚多,方得拿獲。翠兒監禁在獄,不出三日,枷鎖繚肘俱在,翠兒不知去 向。此等法術不是仙人具此神通,也不能有此靈異。』齋長道:『妖人亦神仙之類, 盜天地一種化工之巧,為此妖術,藏在山間。世運將變,人民應該遭劫,一旦付之妖 人,助以為亂,彼時殺死、餓死、屈死的不可勝數。雖天地氣數所致,萬民生靈所遭 ,然自神仙作之,其逆天之罪難逃。信乎神仙非惟無益於世,而實有損於世者也。』 眾人道:『金主渡揚子江,水不及馬腹,元太子北逃,至大河無船,空中獻一金橋渡 河而去,非怪事乎?』齋長道:『天地造化之氣,不足者助之,有餘者損之。夏、商 以前,人生極少,故天運多生聖賢,以生養萬民。至周家八百年太平以後,人生極多 ,則暴惡亦多,良善極少。天道惡惡人之多,故生好殺之人,彼爭此戰。 如生白起,坑趙卒四十萬人;柳盜蹠橫行天下,壽終于家;助金主返江以亂中原,賜 元太子金橋以存其後。原非天道無知,乃損其有餘故也。即如天意欲復漢業,故光武 有冰堅可渡之異。 天道窮則變通,怪異之事亦或有之,不可一概拘拘論也。』眾人道:『先生之言俱是 窮源探本之論,大醒群迷。我輩聞所未聞,開盡從來茅塞。但佛老之教盈滿天地、浸 灌人心久矣,先生一人獨持其說,排以斥之,《佛骨表》、《無鬼論》不足奇也。 竊恐外道之羽翼居多,先生之脣舌有限,先生未必能為世人福,而世人實能為先生禍 也!』齋長覺得眾人之論牢不可破,乃云:『日將暮矣,餘將返駕入城。』老者送過 溪橋,回來對著豆棚主人道:『閑話之興,老夫始之。今四遠風聞,聚集日眾。方今 官府禁約甚嚴,又且人心叵測,若盡如陳齋長之論,萬一外人不知,只說老夫在此搖 脣鼓舌,倡發異端曲學,惑亂人心,則此一豆棚未免為將來釀禍之藪矣。今時當秋杪 ,霜氣逼人,豆梗亦將槁也。』眾人道:『老伯慮得深遠,極為持重。』不覺膀子靠 去,柱腳一鬆,連棚帶柱一齊倒下。大家笑了一陣,主人折去竹木竿子,抱蔓而歸。 眾人道:『可恨這老齋長執此迂腐之論,把世界上佛老鬼神之說掃得精光。我們搭豆 棚,說閑話,要勸人吃齋念佛之興一些也沒了。』老者道:『天下事被此老迂僻之論 敗壞者多矣,不獨此一豆棚也。』 總評滔滔萬言,舉混沌滄桑、物情道理,自大入細,由粗及精,剖析無遺。雖起仲尼 、老聃、釋迦三祖同堂而談,當亦少此貫串博綜也。且漢疏宋注止可對理學名懦,不 能如此清辨空行,足使庸人野老沁心入耳。不寧惟是,即村婦頑童從旁聽之,亦有點 頭會意處,真可聚石而說法矣。篇中闢佛老數條,是極力拒盶行放淫辭,一片苦心大 力。艾衲所云『知我不得已之心,甚於孟子繼堯、舜、周、孔以解豁三千年之惑』, 豈不信哉!著書立言,皆聖賢發憤之所為作也,亦在乎後學之善讀。 如不善讀,則王君介甫,以經術禍天下,所必然矣。 即小說一則,奇如《水滸記》,而不善讀之,乃誤豪俠而為盜趣。如《西門傳》,而 不善讀之,乃誤風流而為淫。其間警戒世人處,或在反面,或在夾縫,或極快極艷, 而慘傷寥落寓乎其中,世人一時不解也。此雖作者深意,俟人善讀,而吾以為不如明 白簡易,隨讀隨解,棒喝悟道,止在片時,殊有關乎世道也。艾衲道人胸藏萬卷,口 若懸河,下筆不休,拈義即透。凡詩集傳奇,剞劂而膾炙天下者,亦無數矣。邇當盛 夏,謀所以銷之者,於是《豆棚閑話》不數日而成。爍石流金,人人雨汗,道人獨北 窗高枕,揮筆構思。憶一聞,出一見,縱橫創闢,議論生風,獲心而肌骨俱涼,解頤 而蘊隆不虐。凡讀乏者,無論其善與不善也,目之有以得乎目,耳之有以得乎耳。無 一邪詞,無一盶說。凡經傳子史所闡發之未明者,覽此而或有所棖觸焉;凡父母師友 所教之未諭者,聽此而或有所恍悟焉,則人人善讀之矣。則成十二先示人間。續有嘉 言,此筆伊始。 敘 天空嘯鶴 有艾衲先生者,當今之韻人,在古曰狂士。七步八叉,真擅萬身之才;一短二長,妙 通三耳之智。一時咸呼為驚座,處眾洵可為脫囊。乃者驕鴿彌矜,懶龍好戲。賣不去 一肚詩云子曰,無妨別顯神通;算將來許多社弟盟兄,何苦隨人鬼諢。況這猢猻隊子 ,斷難尋別弄之蛇;兼之狼狽生涯,豈還待守株之兔。收燕苓雞壅於藥裹,化嘻笑怒 罵為文章。莽將二十一史掀翻,另數芝麻賬目;學說十八尊因果,尋思橄欖甜頭。那 趲舊聞,便李代桃僵,不聲冤屈;倒顛成案,雖董帽薛戴,好像生成。止因蘇學士滿 腹不平,惹得東方生長嘴發訕。看他解鈴妙手,真會虎背上筋斗一番;比之穿縷精心 ,可通蟻鬢邊連環九曲。忽啼忽笑,發深省處,勝海上人醫病仙方;曰是曰非,當下 凜然,似竹林裡說法說偈。假使鼾呼宰我,正當謔浪,那思飯後伸腰?便是不笑閻羅 ,偶湊機緣,也向人前撫掌。遲遲晝永,真可下泉醞三升;習習風生,真得消雨茶一 盞。謂餘不信,請展斯編。 brotli-3.4.0/testdata/ukkonooa000064400000000000000000000001671046102023000145110ustar 00000000000000ukko nooa, ukko nooa oli kunnon mies, kun han meni saunaan, pisti laukun naulaan, ukko nooa, ukko nooa oli kunnon mies.brotli-3.4.0/testdata/x000064400000000000000000000000011046102023000131150ustar 00000000000000Xbrotli-3.4.0/testdata/x.compressed.00000064400000000000000000000000051046102023000155020ustar 00000000000000Xbrotli-3.4.0/testdata/x.compressed.01000064400000000000000000000000101046102023000154770ustar 00000000000000,XXbrotli-3.4.0/testdata/x.compressed.02000064400000000000000000000000051046102023000155040ustar 00000000000000X brotli-3.4.0/testdata/x.compressed.03000064400000000000000000000000121046102023000155030ustar 00000000000000brotli-3.4.0/testdata/xyzzy000064400000000000000000000000051046102023000140670ustar 00000000000000Xyzzybrotli-3.4.0/uncorrode.py000064400000000000000000000132151046102023000134770ustar 00000000000000import re import sys pointer_whitelist = set([ 'use_rle_for_non_zero', 'use_rle_for_zero', 'self', 'total', ]) p = re.compile("""fn[^(]+[(]((([^),]*),)*)(([^),]*)[)])""") VARIABLE_TO_DEREFERENCE="""[A-Za-z0-9_.]+""" #+"""|(\(\*[A-Za-z0-9_.]+\))[.][A-Za-z0-9_.]+)""" NOT_ISIZE = """([^(]|\n|(\([^i])|(\(i[^s])|(\(is[^i]))+""" TRAILING_PARENS = """[ \t\n\)\]\}]*""" offset_pat = VARIABLE_TO_DEREFERENCE + """[.]offset\(""" + NOT_ISIZE + """\(isize\)[ \n\t]*\)""" + TRAILING_PARENS o2 = """\*""" + offset_pat p2 = re.compile(o2) pointer_cast = re.compile("""as \(\*[^\)]+\)""") psubarray = re.compile(offset_pat) elite_something = """if[\n ]+1337i?3?2?[\n ]*!=[\n ]*0[\n ]*({[\n ]*(SOMETHING([\n ]+'[a-zA-Z0-9_]+)?(\n )*;)[\n ]*})""" elite_break = re.compile(elite_something.replace("SOMETHING", "break")) elite_continue = re.compile(elite_something.replace("SOMETHING", "continue")) def subbreak(match): return match.group(1) def subfun(match): all_items = match.group() #if all_items.count(".offset") > 1: # print "ignoring " + all_items +" for multi_item" # assert not all_items # return all_items # not the inner-most each_arg = all_items.split(',') out_arg = [] for index in range(len(each_arg)): v = each_arg[index] out_arg.append(v) is_single = False for item in pointer_whitelist: if item in v: is_single = True where = v.find('*mut') if where != -1: if is_single: v= v.replace('*mut', '&mut', 1) else: v= v.replace('*mut', '&mut [', 1).replace('[ ','[') + ']' where = v.find('*const') if where != -1: if is_single: v= v.replace('*const', '&', 1) else: v= v.replace('*const', '& [', 1).replace('[ ','[')+']' if v.endswith(')]'): v = v[:-2] + '])' out_arg[index] = v return balance(','.join(out_arg)) def recursive_offset_match(data): if data.find('.offset') != -1: data = p2.sub(dereffun, data) data = psubarray.sub(desubarrayfun, data) return data def zerofirstoffset(data): where = data.find('.offset') if where == -1: assert False return data[0:where] + '.\xff' + data[where + 2:] def cut_out_both_offset(data): split_loc = data.find('.offset') + 1 ret = data[split_loc:] ret = p2.sub(dereffun, ret) ret = psubarray.sub(desubarrayfun, ret) return data[:split_loc] + ret def dereffun(match): data = match.group() if data.count('.offset') > 1: return cut_out_both_offset(data) data = data[1:] # zero out the * data = data.replace('.offset(','[(', 1) data = data.replace('(isize)', '(usize)') data = data + ']' data = recursive_offset_match(data) data = balance(data) return data def desubarrayfun(match): data = match.group() if data.count('.offset') > 1: return cut_out_both_offset(data) data = data.replace('.offset(','[(', 1) data = data.replace('(isize)', '(usize)') data = data + '..]' data = recursive_offset_match(data) data = balance(data) return data def balance(data): for ch in "[]{}()": data = data.replace("""b'""" + ch + """'""", str(ord(ch))) retlist = [] stack = [] bad_chars = [] rev_paren = { '{':'}','}':'{', '[':']',']':'[', '(':')',')':'(',} while True: matches = [data.find(c) for c in "{}()[]"] where = min(x if x >= 0 else len(data) for x in matches) if where == len(data): retlist.append(data) data = b'' retlist += [b.replace(' ','').replace('\n','').replace('\t','') for b in bad_chars] break ch = data[where] if ch in '({[': stack.append(ch) retlist.append(data[:where+1]) data = data[where + 1:] else: if len(bad_chars) and bad_chars[0][-1] == rev_paren[ch]: retlist.append(bad_chars[-1]) bad_chars = bad_chars[1:] elif len(stack) and ch == rev_paren[stack[-1]]: retlist.append(data[:where + 1]) data = data[where+1:] stack.pop() while len(bad_chars) and len(stack) and bad_chars[0][-1] ==rev_paren[stack[-1][-1]]: retlist.append(bad_chars[0]) bad_chars= bad_chars[1:] stack.pop() elif len(stack) != 0: bad_chars.append(data[:where + 1]) data = data[where+1:] else: retlist.append(data[:where+1]) data = data[where+1:] return ''.join(retlist) def rem(match): return "" with open(sys.argv[1]) as f: ret = p.sub(subfun, f.read()) ret = p2.sub(dereffun, ret) ret = p2.sub(dereffun, ret) ret = p2.sub(dereffun, ret) ret = psubarray.sub(desubarrayfun, ret) ret = psubarray.sub(desubarrayfun, ret) ret = psubarray.sub(desubarrayfun, ret) ret = p2.sub(dereffun, ret) ret = p2.sub(dereffun, ret) ret = p2.sub(dereffun, ret) ret = ret.replace('i32 as (usize)', 'usize') ret = ret.replace('i32 as (u32)', 'u32') ret = pointer_cast.sub(rem, ret) ret = elite_break.sub(subbreak, ret) ret = elite_continue.sub(subbreak, ret) ret = ret.replace("#[derive(Clone, Copy)]", "") ret = ret.replace("#[repr(C)]", "") ret = ret.replace("#[no_mangle]", "") ret = ret.replace("unsafe extern ", "") ret = ret.replace("unsafe", "") ret = ret.replace('self', 'xself') #ret = balance(ret) sys.stdout.write(ret)