diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8933060 --- /dev/null +++ b/.gitignore @@ -0,0 +1,81 @@ +# Created by .ignore support plugin (hsz.mobi) +### Android template +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/* + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + + +*.gpg + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b0c3392 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 IAmCodingCoding + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9a0d6ee --- /dev/null +++ b/README.md @@ -0,0 +1,120 @@ +# yuv_convert +是一个基于libyuv的图像色彩空间转换框架.支持NV12,NV21,YUV420,RGBA四种格式的相互转化 + +# 支持的abi: +armeabi-v7a,arm64-v8a + +# 集成: +implementation 'io.github.IAmCodingCoding:yuv_convert:$last_version' +具体版本请查看 [release](https://github.com/IAmCodingCoding/yuv_convert/releases) + +# 支持不同形式的输入输出: +1. 输入: +- ByteBufferInput: 以DirectByteBuffer作为数据载体.所有不同的色彩通道放到不同的ByteBuffer中.比如: RGBA格式需要输入:\[bufferR,bufferG,bufferB,bufferA\] +- PackedByteBufferInput: 以DirectByteBuffer作为数据载体.所有色彩通道放到同一个ByteBuffer中 +- ByteArrayInput: 以ByteArray作为数据载体.所有不同的色彩通道放到不同的ByteArray中.比如:RGBA格式需要输入\[arrayR,arrayG,arrayB,arrayA\] +- PackedByteArrayInput:以ByteArray作为数据载体.所有色彩通道放到同一个ByteArray中 +3. 输出: +- ByteBufferOutput: 以DirectByteBuffer作为数据载体.所有不同的色彩通道放到不同的ByteBuffer中.比如: RGBA格式输出为:\[bufferR,bufferG,bufferB,bufferA\] +- PackedByteBufferOutput:以DirectByteBuffer作为数据载体.所有色彩通道放到同一个ByteBuffer中 +- ByteArrayOutput: 以ByteArray作为数据载体.所有不同的色彩通道放到不同的ByteArray中.比如:RGBA格式输出{arrayR,arrayG,arrayB,arrayA} +- PackedByteArrayOutput:以ByteArray作为数据载体.所有不同的色彩通道放到同一个ByteArray中 + +# Sample: +1. nv12数据转换成rgba数据.并装载到bitmap中: +```kotlin +//创建一个输入端口.输入数据为打包的bytebuffer(即所有色彩通道都在一个DirectByteBuffer中) +val input = PackedByteBufferInput() +//创建一个输出端口.输出数据为打包的bytebuffer(即所有色彩通道都在一个DirectByteBuffer中) +val output = PackedByteBufferOutput(Format.RGBA) +input.provide(nv12Src, Format.NV12, width, height, intArrayOf(width, width)) +Converter(input).convert(output) + +val result:ByteBuffer=output.getOutput() +val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) +bitmap.copyPixelsFromBuffer(result) +showBitmap(bitmap)//显示bitmap +``` + +2. 使用ImageReader读取到RGAB数据后需要转换为NV12: +```kotlin +val imageReader = ImageReader.newInstance(videoWidth, videoHeight, android.graphics.PixelFormat.RGBA_8888, 3) +private val input by lazy { PackedByteBufferInput() } +private val converter by lazy { Converter(input) } +private val nv12Output by lazy { ByteBufferOutput(Format.NV12) }//输出格式为Array +imageReader.setOnImageAvailableListener(object :ImageReader.OnImageAvailableListener{ + override fun onImageAvailable(reader: ImageReader?) { + if (reader == null) return + val image = reader.acquireNextImage() + input.provide( + image.planes[0].buffer, //ImageReader读取rgba数据时.所有的通道都放在planes[0]中.所以这里选择了PackedByteBufferInput + Format.RGBA,//指定输入数据的格式.此处为RGBA + image.width,//输入图像的宽 + image.height,//输入图像的高 + intArrayOf(image.planes[0].rowStride)//输入图像每个通道每行的步长 + ) + converter.convert(nv12Output)//转换为nv12格式.转换后的数据存放在nv12Output中.同一个converter可以对接多个不同的Output + image.close()//归还image + val output:Array = output.getOutput()//从Output中获取转换后的数据,可以重复调用 + val componentY=output[0] //存放y通道的ByteBuffer + val componentUV=output[1] //存放uv通道的ByteBuffer + val componentSize:Int=output.format.getComponentCount()//NV12和NV21格式固定返回2.YUV420返回3.RGBA返回4 + val strides=output.format.getStandardStride(image.width,image.height)//获取特定格式每行的步长 + val yCapacity=output.format.getComponentCapacity(0,image.width,image.height)//y通道的size + val uvCapacity=output.format.getComponentCapacity(1,image.width,image.height)//uv通道的size + val minSize=output.format.getMinFrameSize(image.width,image.height)//获取存储该格式一帧画面最小所需要的空间.nv12、nv21、yu420所需空间为width*height*1.5 rgba所需空间为width*height*4 + //todo use the nv12 data ... + } +},workHandler) +``` +3. 并发场景: +- 使用synchronized +```kotlin + private val input by lazy { PackedByteBufferInput() } + private val output by lazy { ByteBufferOutput(Format.YUV420) } + private val converter by lazy { Converter(input) } + + imageProducer.parallelProduce{rgbaImage->//伪代码,此处的ImageProducer会并发的生产rgba格式的数据 + synchronized(imageProducer){ + input.provide( + image.planes[0].buffer, //ImageReader读取rgba数据时.所有的通道都放在planes[0]中.所以这里选择了PackedByteBufferInput + Format.RGBA,//指定输入数据的格式.此处为RGBA + image.width,//输入图像的宽 + image.height,//输入图像的高 + intArrayOf(image.planes[0].rowStride)//输入图像每个通道每行的步长 + ) + converter.convert(output) + val result=output.getOutput() + } + } +``` +- 使用ThreadLocal +```kotlin + val input = object : ThreadLocal() { + override fun initialValue(): PackedByteBufferInput { + return PackedByteBufferInput() + } + } + val output = object : ThreadLocal() { + override fun initialValue(): PackedByteBufferOutput { + return PackedByteBufferOutput(Format.YUV420) + } + } + val converter = object : ThreadLocal>() { + override fun initialValue(): Converter { + return Converter(input.get()) + } + } + imageProducer.parallelProduce{rgbaImage->//伪代码,此处的ImageProducer会并发的生产rgba格式的数据 + input.get()?.provide( + image.planes[0].buffer, //ImageReader读取rgba数据时.所有的通道都放在planes[0]中.所以这里选择了PackedByteBufferInput + Format.RGBA,//指定输入数据的格式.此处为RGBA + image.width,//输入图像的宽 + image.height,//输入图像的高 + intArrayOf(image.planes[0].rowStride)//输入图像每个通道每行的步长 + ) + converter.get()?.convert(output.get()!!) + val result=output.get()?.getOutput() + } +``` + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..4dfc3f8 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.zmy.yuv_convert.example" + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation project(path: ':yuv_convert') + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/zmy/yuv_convert/example/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/zmy/yuv_convert/example/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..4a60c0a --- /dev/null +++ b/app/src/androidTest/java/com/zmy/yuv_convert/example/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.zmy.yuv_convert.example + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.zmy.yuv_convert.example", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1342cb8 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/720_1280.yuv420 b/app/src/main/assets/720_1280.yuv420 new file mode 100644 index 0000000..2821ca0 --- /dev/null +++ b/app/src/main/assets/720_1280.yuv420 @@ -0,0 +1 @@ +........///////......///.////..//...///...//./010000000000000000/0000000/////...//////////00/.//000000000011110/0000001100000000000///11100110/01/..01101111111211111111111111111100011100011111111101110//0122111222112211111221123211122221111222221111122222322211111123211121112221224443433122111112222322222221112222222111122222321122222322111122222211121111223111221222111111222111222221111101112222112222222211111111111111111221342211222211111111122112222111111111111001111100000110/0110/0111111111110111111111110///00///01110/000000//000.---.../00000.//////.////....-.../0/-........-...--.0/..---.-+,---,,,---,+-/---.-------,-----,-.---.-,,,,,,,,,,,,,,++,-...---,++++,,,,,,,,---,+++++,,++++++++++++,,,,++++++++++++++++......../000///////..///.//////0//.////.//////000000000//////000/0000000///0//////////////00////0000000/0000110//00000110000000000//01111//00//0100001111111211211111111111111111110112101111110111111111001222111222112211122222233221122222111222221111122222322111111122111122222211234443333332211112123322222221123222232111122223321122223222111122222222222222233211222222211111222222222221111111112222112332333211111111111111111111232322211111111111111122111112112211111111011111110110001100111111111110001111111111000/00///00000/0000000/000/.//0/01110///00////.////////.////0/-...--...//....//-,,,,-.-,--.---....-,./----------,,,-----......-,,,,,,,,,,,,,+,,,,------,++++,,,,,,,,---,,+++,,,+,++++++++++,,,,-,,,,,,,++++++++........//00.-./////.///..////00////////00000000000000/...../000//000000//000///00000000//00////0000000/00/0000///0001110000000/000011110////./0111100111111111111111111111111121110111111122110011111111111222212233322211222112223221122232212222221111222212221111111222211222233211234443333542111122223332222221122333333221222333221122223222211223333333333333333211222222221112222222222222111112111122122222232211111111111112221111233322211111111111111121111111112111111111001111111111111111100111111110001111001110000/00/0000000000000000000///00001110000000///../0000///0/////.../.....0/..////,++,+,----...../....-./.---------,,,-----......-,,++,,,++,,,++,---------,+++,,,,,,,,----,,++,,,,++++,,,,,,,,------,,,,,,,+++++++.......////0.,-//00///////////000000000010000000000000/..--./000//00000000000////00000000000////0000000010//000/000001111000000/01110001100110/001111011111111221111111111111112211111111111111111111110111111222223332111112211212232212222222222222112122211122112322332221122112322233445433354211112233333333222222222333332322333322222212322222222444444444333443322112222332112222222221111221111311112332232232222221111111111223222223321232222111111112211111111222221111112111111122111111111100011111111000111100111000101100000000011100000010/////000//0110000////./01110/000//////00//.///.-.///.-,--,,--,-./.../.--.....--,,,----,,----.--------,,+,,,,+,,,,++,---------,+++,,,,,,,,----,++++,,+++++,-------------,,++++++++++++../////././0/..//000//0000000000000000000000000000000//.....////./00000000010/////0000001000///00000011010/0010000000111100001000111000111111100/011111211111123111222121122122222111111111111111111121111111112122233211211122122233321111222222222222222221112322343232222112211123322334543334321122234332333322222222222223333233333222322342222222334444443444444333211122233211222233332111233222221111232233333322222211223322222322222332223223222211111321112221222232111221111111112221111111211111111222100011111111111111111001111111111100111100000000000//0010///../00000/0000////0111////...../......----,-.//..-.---.....-,,------,--....-------,,,,,,,,,,,,,,,,-----...-,++,,----------,++++,,,++++,--------------,,,++++++++++//////..../00////00000000000000000000000000000000000///////.////./00000000110000000000000/00//001111111100001111000/011111011111100011101101111111111111/1111122111222222222222221122222111122111111222122222112112233212221122222234332111232222222222333222222433332222222222222223211123443332222223344422333333333333333333333333344223333343333333333444443433444333321122233211223344433222233332221232331334444321222222344444322222323444333222221111111111123211111122112221122111122221123321111111111111111111111112211111110/001111111111111111111111111100/0110/...//////000000////01110////00/////--..-----./00/--.---.--./.-------,,--../..------,,,,,,,,,,,,,,,+,---....-,,,,,,-.-------,,+++,,,++++,----------------,+++,,,,,++///////.../00////000000/0000000000000000000000000000//////////////0000//00010///00000000000100111111111000111111100001111001111111111111111111112111111001111122211222222221112211122112222222111111222112233211111232122221122222234444222232222211123333222223333333222222222223322221122333322233333345432343443333333334444333333334223332234433333444433443333333333321122222222234445443333333333221233332334444322233223444433332223323444333222111112111111122211111122212321122211222222123321112221111111111121111112221111110//011111112111121111111121001111111//.////////0000000//011100//000100//0.-----...//00/..//-----./.-------,,,-../..---..-,,,,,,,,,,,,,,,+,-.....-,,,,,,,,--------,,,,,,,,+++++,-------..-----,,+++,,,,,,+/.../////0110000000000000000000/00000000000000000000///0//////////0000//00000/..00000000001110111111111001111100111111110000111111211111112222222111121122211233211122222211112211122111222222112111231111233211111221111221123222234566542222232111122343222223233334432222221123322223222223322344443345543444554322332234444344433333222321115444444454432333333333332332222211233234444433344333333332222454444444322333223443212344223212433234432111233322222222211111123322221222211222113212221212332223222111121111112221111111/0011111222211121221111111111110110/.//0./000000001110111110/00010000000/...-.///////...01/-..-/.--------,,--../...--..,+,,,,+,,,,,,,,,,,-...-,,+,,,,++++,,-..--,,,,,,,,,,+++,,,--,--------,,,++,,,++,,+//...././001000/00//////00000000000000000000000000000000000/////0/./0110/0100////000100000111111111111111111110011111111110012211221111111211111111111111111123321112222221112213332222222222222111123111234443333212221333222221233345644443333211223322332244333333333223321222232223333233333234444444333334544333433333246654433443333333223444433335433333333333223443322223222333434444444444444433222343333344321334433445433333434322332322222332223322122222221111122342222222122222211222233212222222222211111111111232221232111111122222111121221111111111110110/.//.////0000000011111110000000000000/.,-.//..///000.000000///.-----.-,,-....--.//-,-,,,,,,,,,,,,,++,,--,+,,,,,,,,,,,,-...-,,,++,-,,,,,++++,--,,,,---,,,,,,,,,,,,,,,,/////////000000/000/..//////00000000/////000000000000000000//000//./0111/01100000000100000110000111111111111100011111111011122111222211112221111111211111111123222112222111112222443222222333332221123212334444443222322333222212333333443333333222233333333344444333333233332233343333332233333444434444333333444445544333246655544554444443334444433334444454433333234444333333322234444444454444454433323333333334433344444443444444444311233222112223332222222222211112222232222222122222211112233222222222122211222111112222221121112222112222111122222111111111111110/./////../00000//0000000///0000000000/.--//.-./0//0///0/010000/.--,,,---...--,,.//-,,,,+++,,----,,+++,,,,+,,,-,,+,,,,,-...-,+,,,,,+++,,,,,,,---,,,,,,,,,,,,,,+,,,,,++//000000000000000000/.//..//0010000////////0000000000000/00000000///0111001111110111110011111111111111111121111111111111011122112112211222221221222221221222223222222233222222333454322223344433333334444443333333223433333333222233333333233332333334444434444444333333333333333444444344444433554434444444344445554455443346665654555555554444344333334455555555555455554433323332223445555555444566545555555654333444444444433344454444322233322112223333333333223222223332233222222222223321122333222222222222222222211122211221111123332122222111122222111111111111110//00///../111100/000/000///000111111110/./..-./000000////0000/..-----.--.//.-+,.//.-,-,,,,,------,,,,,,,,,,----,,+,,,+,-../.,,,,,,++,,,,,,,,--,,++,,,,,,,,,,++,,,,,,,//000000000000000000////..//01111000000///00000000000000/0000000000001110011111111111100111111111111111122221111112222211111121221121113332112212222222222323332333322333333233434543333333444322444444444432223322234433333333222333333333333324444334444344434433333334433333444444444555554444444455445544554565433455544455556545545455556543333333345555555555544554444332223444334555555554445665455544445543334444444443334433454333333343333233323344333333333332344433333222222222233212222222232222222222222222222222222211112222222221221111222222111111111110000000/00/./1101111111001000000011111112110//../000000100//00/0/.-......-,,../.--....-.--,-------------,,,----.--,,,,,,++,-..--,,,,,,,,,,+++,,-,,++,,,,,,,,,,+++,,,,,,,/000000000000000000000/..////0111000000//00111000011100000000000001111000011110001111111111122111111111111211111111111111111222232122113332112212222222223333443444433344433333433433333333443321344334343333333333344323333333222233444344333334444333443344444334444335543334545544455544555554444555534544555665433456655554455545545555556653443333345555555555545554444332212455555555555555444554444443334333334434444554334433555333443333344443222344433344333343344432233333222221233221111223443222222122223332233223333321122111122111221111222222211111122110100000/000/01101112211000100011011111111111000/00000///110010/00/.......-,,-.//...---..--,---,,,,,-----,,,,,,,,,,,,,---+,---,,+-,,,---,,,+++,--+++,+,,,,,,,,,+++,,,,+,,0000000000//0000000000/./////00000000/////00000001111111111000000011111011111110/1111112111222111111111111111112122221111112332222233222333222222222322222333443444433444333333433333443333333332333334444433323333344433333333332223333344433444444334533344444444444335543344444444455555544456543455534555555566554556666544456555555665556655554433344444555566555553344443323454455555556554444555555544445233455443445554434445565433443233344443233333444444333333344322233344333322233221111234543222112222222222333223334332222321122111211111222232211211233111110/00/00001110011222100111111111100000/011111000010000111010/00/..//../...//...//....-.--,,,,-,,-------,,,,,++,,------,-.--,,,--,,-.-+,,,,,,,,,,,,++++,,,,,,,++,---,,,/0000000000000000000000//00000000000///////000000011111111100000011111111111111101111111111111111111111111111123333333322222321222233322444333333333433223334443333333444334444444434554344332333443445545543322333344443344444433223333344444444444445534433443444444334443444444444455555554446543456544555555566666556556555556556655665555566665444444445555455555544445554334555445555566655555666544433344334555543455555444455555544443333444443233334444444333334444322233344334433333212112234443233223333222222344333333322321222222111111121222222222222222111110000/000011110112111111111111111011101111110000011111110000/01/..///////00//////////-....---.---...----,,+,,+,---------...---------,++++++++,--,,+++,,,,,,,,,,,,-,,,,//00000/000000000000//000111111000000000000000000011111111100000111111111111111111111111111111111111111111111123334333333322111333333444454444443344443334434442222233443334544444444555444432233444444345555444444333331344455544344555344554433443344555533444555544444444444444545555445555565444566544455545555556655555556755556655655555566776544455556766566666654445554345676666666667767766654343333344444555432355554444444444445555444444444334444443444433334444332332344333443343212222222132344444444334443445443323322431112211121111122222211122122211110111111/0001111101111011111111111110111111100011100111001100000010////////00//.//////0/.-.///.......//..---++,,+,,-,,,,,.------,+---,,++++++++,----,,,----,,,++,-,++++,,000000000000000000///00011111111000000000000000111111111111111111111221111111111222111121111111111111111111111223345433333332223233334444445555454344433344445423222334444444555555456554444333334445554456655444554443313554455443455555445544444444455566445655555544554455554665555565555556655555556456666667655555545556776666788656665555677765544544456665667864555555543457777655666667777766654444333455556654444555554655555453455555555554444444444434444333445544443445444443423542322223332332344444543333342334544433333222222221111111222322232111122111111111110011111111111111011111111111111111110/01110011100011000111/////////////////////.--.00/.--.//../.-,-,,,+++--,,,,,,-....---,,,,,,,+++++++,..-,-------,,,,,,-,++++,,000/00000000000/100//00001111111000111111111101111111111111111111111111111111111222111111111111111111122221112232334333443322123222234443344455454334444344434333333344445444444554456654554433344455555556665444554444434554455443445554456654555555555466545655555555555566655566666656666666755554434677776668766665566667777765677777777666677765555554566666767765655555544456677766666667777766654555433445556765554555665666655554555555556554444344444434444334455544444455544443333554421233333233333453443332332223544444333332232111132111233322221121134321122211111111111101122221111111111211111121110011110011111111100110/01000/000//.////////..//000/...//////-----.-,----------....---------,,,,,+++,--,,,--,,,,,,,,,,-,,++,,-100000000000000/11000000/0111111000111111111101111111111111111111111111111111211111111122221111112211232332112333344433454433223322234553344455454444554455433334433334455555554554456545554444444456566555555444444455545655555444444454456655566666655357656655665556655667766666777656666666676555444677777778766666566666667666678776677887667666666655667767765666655555566455567766555666656656765665444444445666676555665666655565555555545555554444444434444444565545554444444444433554531233223245433453443332332222433344322333333222122111233333321232122222221111111111111100221122111122222211211121111111111001111111000110/010000000/.-/0.////////000/////////0/.----..--........-....---.--..----,,,+,,,------,,,,,,,,,,-,,,,,-.1110000/0000010011100010/01111110/0111111111001111111111111111111111221112212221011222333332111113321332333223344444434454444333322245554555555545544554555433444433334545555555555556665555444454455557543344554445555556655555544455556655555666666654357766666665567666677766666677666666666687555455677777778766666765566567777777766667777777666666665667778765567666666777666667766555666655555676555555554445566666666665666556665655555544445554555544444444445566555555443344444444444442233222246534444542222332322222444323333332222211112333333332223112223311111111111011111111112112223222222211121112211111100111111100110/////00000/../0//0///00///////0///.///../.-..--......................-----,,,,,,------,,,,,,,,,,,,--,--1111000/0000010001100111011111110001111111111011122211111111111111122222232222211112234433332221233223333333333344444334443444443212444355555554345445666543344444332345455555555555678855554445555554455444455554455555556555665555556677765666666666544677666667655676776777777666677777777777765444556677778888776678777776788776667777776667777666665555567787776887666678777776777666566777777556653345666666555666457777765444566666655555555555546765444555555555567655555544555544555555543234322454443245322223323222125543344332112221111233343323332233343321111222223211111121111112222333221222222211111100111111111111111110///000000/////1110////////000/0/////..0/.......//........--.//..../...../.-,,,+,,,,--,-,,+,,,,,,-..-,,111000///000000/01111111111111110001110111111111122111111111111111222222232222211111112233332222233222333443333343344444443334454334543345555554344335785433455544433346566666665665456755555555555554455555654444455555555556665555556788887776666776545677777777766776776677776677777777777766666666666667788888876678777766677777777777776567887666665555567787787887777788767887777766667777887556653456777777655555457877654433466666655555776655546765445666666665567765565555555555565444553235422345444345434333223333235444443332112321212333455322333332232211112232223311111121111011222222211122223322221111111111111111111110/0000/////0///0000//////0000//0000//../.--....///.---...----./..../...////-,,,+++,,-----,,,,--,-----,,111000///011100/0111111111111110111111111111111111211111111111111122222222222222111111113333332223322233344444434345655555444456544565444444555443334567533345554443345656766666666433446666555655566666555666544445555656555666555555677888888666777665666777777777777776567877667777777777776577888777777778888877677877766666678888777777777778877777666566778668778688887777788767777666666677765676666666666665555455787764455556766666556577666665665445666677666656776666555555556566444355433432234554555655554333433434444554333322222122233235544444443111111112222221111111111111101121112211112212233332222112211111111111111//0000///00///////00000/00000//00000....-,,-....//.,,-...----...--.....////.-,,,,,,-,--.--,--..,--,,--,111100///01110000111111111111110111111111111111112222222222111111112222222222222222233332333333222222223344444444345665555555445433565554334454343345554433444444444445556666666577544568776555566666665556666655556655766655666555555677777788766777766666777777678887776678887666666788778876677777667888888888766788878877776788888888888887678887788666666678567667678886667787666777766666677766777776655566666676544578875467667777777666656666777653345556676666666666666666555666456556655554333335544466655554343443423445653343343221122344234345554443222111122211111111111111211011111111111112111111221232112321211222111111000000000110/0100001110001110000000/.....--.....//.,,-...--------,--.../////.----,--,,-------..-.-+,..-01111000000000000111111111111111222112331111111111122223222112222232221323333321223456544432222233333333445554444455554543455566644665565434554343466446545434655455555457547757666655567777666677665555567766555556666677766665666666787667876777777777776788877778877788777777777777788888876777777777889888887677788788888888888777888888888778888888767767867776555677766677877777778767777877756787777765444567877655556777666788878886566755556777654443465567656776666556665555665545667754465324434665586554445564443333555554443323322222344432345544332222222222222222231332312221112331112112112211111111111111243111222211111100000111111100000001110001110010////.-//.......//.--........---,+,-...//..//..---------,++,-..-,,-,---11110011000000000111122211111122122112322211111111222122221111111121231223333332223344444443322234433444555555554455444443454555534666666555776433455457644467754456665456557778777776666676666677666667777666776787667767777888776666787667777887777778877788877766667888776678777776788888886777766777788888877777788778888778888888888888888888888888878877768887777877656777887776677777788777766888788876555567776665666766556788888888776676666777655544456678656787776656666666677655566765455434545665576555555433554356655444564334433333333333456543222222333422223333232443533332222332222212122222221111111111133211223321111111111211111110111110001111111100//////...--..-.//....../////...----../////000/........-,++,--.-----,,+11111111111000111111111111111111122112222111111122222123221111111111221234432333233333345554333234433444544555443444444454554444434566765677887654455456543577655455566565566678887766786677667766666667876556776777666777877778877666777667778887888778887788887766677888876678777777788888887777767788888888777777788778877778888887888888888898889:988888876788778888876678888887677777777888888767887788766666566655555677776677888887777667888777776655555567887677766666556555556666555678654444445445555655666554445655666654445643444434444433333454432232223333222233333445434334543233322332122222222211111111111221111122211111111111111111111111100/1111111110///000//.........../....///..-......//////000//.......--,,,----,----,+11111100111101111111111111111111222112221111122222222234321111111111121134432343333333446654333344434543344554333444455565665455334556654677888765445445454565466654467654565567888767886677777776666566666666666666777678876666887777777778887877788678888888887777888888888777888877887778887787778888888898888778788788887778778887788887778898889:988888886877778888877888888887788888876788888777766666666776556655566788887888888887677778888877777765566666887777544455655544345655555667665445444444445444555554544566766555555543444333345543333343333332222222333333334555323335554333222222223322222122222111111222111112111111111111111111111111110/1111111111000001000/.///.....///......--..../....///////..........-------,,----,11111101111101111111222211111233332222222111112222222234321122121111121245432343332233335443333344334553456544444444555665665455445556643577788764345555456664367653356554676566678877776677777777776666667777767778887788887778888888887788887776788778888888997778888888888887888888886777877888888899888898888888888888888778778887788887778888889:98887788788778888888888888888778878887778887788887666556667666776666666666667777887778887778887766776566665577777655555666544444675555555566555654444445543344444453345776666665554344433333444333444333333222222333333333556533443455433322222222432222212222222211112211111111111111111111111111111111101111111111011000000//////////00/////////.---...-..//////...//......---,,.---,,,+11111111111111111112233222222333332222232211122222222233321222222111243544433333322233333334443344335665666644565444556655664456555656644677777775445654556665567665456554676666678777777777777777777666677777777888877788888888888899888877888866788888888888898877888888778888889888887777777888888888888888778888788888888888878888888888877889999999987787788888888888887778888888878888888887788887667766667766777766776555566677777667776667777666766666665677777566655666555555665555555455556654454444555444444444443566666666564444544433333344444445554333322322233344556544454555544333322222332233212222221111112222112222223221111111111111111001101111111110011000000//////00000/.//////00/-,,-...../////////00//.....-------.---+01111111111111111222332223444322322222222233333333233333322332222221343543344334332233443334443334334566776655565555666655665456556655556778777787655554556766656677667666676777787656778888888777787777777767887888777788888888888899888877888877788888888888889877888888778888899889887777887888888888999988778888788888888888888888888888888899888999987778888888888888887788888888888888888888888777777777667777667788888887666677767655567767777666766776555788777567765666655566665556666655556655555544556555455545653455666777665445554444334555444456775565422323333455657545455555554444433433222223212222211111112332222333333322111112222111111011101111100100011000000//000/01100///////////.--.//0/////.////0000//////....---.///.111111121122221122333433344444433323333334455433333343333223322321212323433454343333335643332333344324677666665566667766667765665555445488888777777666665688667666687787777778887887677699888877888888888887678888777887888888888888998888778888778899888888878898788888888888888998898787689887888888888999888788887888888888898888888888899889998889:9988778878888888888888888889988898888888888887678777777778887667777887766665667777766788877777776777886555788766567765676544567887656777776666666555554566566555556665554556787656545554444345666555566665677533344444456646546565555555444444543112223212222222211111232112333333332222222222211111111101111000100011//00////000/010///000000////...//000000/..////0/////00/.../.--../0/1111111111222211123333222233344444333333444434332333344333333334432223323235544433334444555434434444346786566654566678877777665555455555877887777765666765886676876666667888777776778877888788778888788777888888888888888898899888888888888789987789998889988888998888888888898899988888888888878889999999888888888888988888899899888988988999999889888:9888889888888888887888888899888:999998888878888787886676688787677888766666667778677778876677777777777766568876566666666665567776777656677667777666666666677666666555666556667874764455445566667766675554555554455555545666666655655566654433334432333321233323321112222222222234333333333333211111111111111111111000000/////000000////00000000/.//00000/000/...//////////////////....--.221111121122222212222322233322333334433344433333333333334455432343223333222344443322453345554444445545567655665555555666778876665556666787788777676665687678778787777777788877778888888888888878788778888888888888888888899888988888888988888888778888889::98887888889988888888999999889998898888889999999988888:88888998888888789888888989:99::889::988988889988888888887788998889988899999988888888887778876766887876778888777788888887887788777876666655667766677877667776666665567778776666766666665655677767777666665555666667777756544555555666666777765555444445666666556555555555556555554433344433333333343223212222222222222233333333333322111111001111111111111110110/////0///000////1111110///0000000000///0000000//...../////.,,---221111221112233322222222233222333234433344433343444433334456422244333333332334443323443335665555555555668655565554455567667876666666666788888777777775687677788888888888888887888888888888888888788888998888888898889988898888998888999:88888878888888899:988888888899998998888:::999999999998888889::9:99:9878888899998999888888988898888:;989:889::998888899988888888888889998999999999999999999999988688876777887777778888887888888888887677788887667766677777777887767777666776677777777777767788778876677777777665666556777777777776544565665665556777765555433345677777666566566654567544554443344333433433443222222222222111111123223333333222111111111112112211121111111///00000000000001111111/////000000000000000000////////////.,+---1112222221122333222222222222334443344334554333444445433445554223333334445543344344434445455555555544456787655556544555687667766777766567778888888888876876777888888888888888888888888788888888898888889988888888:88888998888999999889999888998789999999999888889999999988998889:::99999999999888889::::;::9988898889::98999999999988::9989::989:99999::998899::9888899999::999999::9:::99999999999999988888877888886678888888888888888888887678888888888888888888888888877777666877777667777777678898888887667777777766677666777777776677655666676555556767754555444444577777777776666654577434444443344334543332333222222222222111211123222222232112211122222222112211111121111001111111100/011111111100000000000000000000000////0000/../.----,11223322222223221222222222223554543444445544334444454345556543343344444455544554554345555555555555444566776655665545666786567777777665677888888888889877778878888888888888888888988888888888889:98888889888889999888888999999999999899888888888899:::9888999889:99899888999889:;:::999999999998889::99:<;:999889:9999:999999:::;:988::989:::999::9889:;:988999:98889:::99:;:98889:::::::99999999999999888888888888877888888888888889888888888888777888887778899999999888888877777777777777778876889988888887667776777667776667777777766777667666766666677777555555444444776677877776666665665444444443343355433334333323333332221112111232222222311122111122221121122111111211111111111111000011111111111111111111111111111100//./0000//.../.-,-12222233333333221222333322234554544454434455434544444445556653343444555545555776652245546545565655555556665566676656666687667877777666677888888899889987788888888888888888888888999888888888889998888888888889::88899889:::9999999989888998889:9:::;;:8889:;:8899889999999999:;;;;::99999999999989::99:;<:9999999999::99988999:;:988::99:::9::9:::999:::999999::9889:::98:;:98999:;;:::::::9999988889999998899888888889888888888889988888888888888788887777889999889::99998887777777788988888887888888888898777776777777777777777777777767767655666788888787555665554456776567878887666665665555445443344344334445445423444433221122111233222223311122110122221121122111112211111122221111111111111111111111111111111111111100/////000110....-,-1222112333333322222233332333344455544543345654455555555566665444444445554555567765434544555666665665556776666677666677767776677766677778888778889:989988888888888888888888888888888888888888789998889888888889::99999889::::99999:99:988998889:::::;;:9889:;:8888889999999999::;;;;:::999999999999:::::;;::9::988999;:999889:::;::99:999:;989:9:;:9::999999989:::999::::9:::::99::;;;::::::99999888899::::98::99888:9888888888888999888888888888988888888888999888889:99999888888888889:98888888888888889:9877777777777788888877778788876766665666678888888755667666666777656888888866676556555555444334434434555544542344443333222211233333222332111122122222112222222121221111123332221112111111111111110000111111111111111100000001110/..--..2221112322222322222222221344334455433553346764566766666676665556544444444554445557654335556776676665567887766667666678756886677777778888888678889;:889888888988888888888888887888888888888887899:989:9888888889:;:99999:89:::999:;::::9:99899999::9:;:98889::98888899888999999::;;;::::::999999999:;<<;;;;::::98:;98998:989:;;;<9:99:88::;:8999:;:9::989889999:;::9:::;;::::::99;::;;:999999999999889::;;;98:::;:89:98888999988999:9999:98888888888888888889::99899988998888888888999999999999::99888888887556777777777788887777777788866777766776667788888865777777777766656888888865665556555554444444434445665533541333333333333322233333212333211124332112222222222121110011123433222222211111111111110//01111111111111111111111100000/.-///122212232223343343322223455444555666666545655566665555557776555654444432445566655665555555567877877655556788778877778888888877778888877888888888:99999999888878899998888887778888888888888888899:99999888889:99::;;;:9:::999:::::9:9888::::9999:99889:::;::9::9989::::99::9:8::8;99:;;:::999:::;:9889:;;:;<<;999:;;:99:;;::::99:99999::::;;::;:9:;;989::<:9::99:;;;;;;:99:;<;:;:;;;;:9899988888998889:;<<<;::;;:99:98889999999999999:;:88778889:9888899888889:::999:::88:98888888789988:8888998999999988878888888888778887888878888888888888776677677656876677776777888766667776566666545566654443455333534666665665433443334433553112223334443334333212233333333333321111122111222233211232111111111111111//0111112211111111111111100//////000/23333333333344333333322233333455555555545666666666666666665555665444555555556666777655556666778777766666778888887777888888888888888888888889999:::99999998899889999999888888888888888888888889::::9:::98888::99::;;;:::::999:::::9:9888:::::::::999999::;;:9:::999::::99999:9;;:;:9::::::999:999::::;;;;;;;::9::;;::9::;:::::::;:999:;;::;;::;:99:;:::;;<;:::99:;;;;;;;:;:;:99:;<<;;:999998888999888899::;<;;;::9888:;;::999999999999999:98888998888899888889:::999::99::9888888888::88:9989:999:::999888788888888888888878898888888888888887777887886568866777777778877788766666666666566677765544565555446666656665444444444334432223233334444443333223333233333333221222222222332232123321111111111111110/1111111111111111111111111000000000/234444443334443233333322233334445444444456665455556666655444455554445666555556667887666666777777777777778877888877788888888888888888888888899899998888999999988899999988888888889988889:889999::::9:;:988889:99::;;;::;;::::;;:998:9889::;:::;:99:;:99:;;;:9::::::::::::99:::;<;;:9::::::::::::::::;;<;:;;::::;;<:99:;;;:::9:;<<;:::;;;::;;::;:99:;;;;;;;;;;;;:9;;;;;;;:;;;:99:;<<<;:99:99889998988888889;<<;;::;;<;989::988899999998889::9999998889998888888:;:::::99:;;98888888889:99::999:999999999888788888888888888888899888888888888777788888887668766777777778877788655666776676566677765544577776556666656666544344444433233333344334455665455443332223323333222222222223332233333321111111111111110011111111111111111111111111111100///2344555533455432333333333444444444444455665432344455555554445555445555555555566677766667678877778887777788778888788888888888888888878888888888888888899:999888888888888888888889998889::889999::999:::988889:99:;;;;;;<<;;::;;:998:9899::;:::;:9:;<;:9:;;;:::::;;::::;;;::;:;;<;::9:::::;;;;;;;<;;:::;;;;;;;<;;;;:99:;<<;:99:;<<;;;;;;;;;;;:;;:9::;;;;;;;<<<<<;:;;;;;;;:::;:99::<<<;:99:99999999999998889:;;;;;<;;::::9998888899899:9888999889:98999998888888:;::::9889;:988888899999::99989998999999988878888888889998888888988888878888887777788878877777777887767887776666777777777766667776554457777656666665555554434444443223444444444444455444434333223333333332222332112233333334332111111112222111111111111111111111111111111111110////33444554445554433333333344444444344444555554334444444445566655665566655456676667677666676788766788877777888888888888888888888888998888988888889988999999999888888898888888888899888889::999:::::8999999:999:::::;;;;;;<<;;::;;;::9::9:::::::9:::;;;;;:;;;;:::;;;<;;;;;;;;;<;<:;<::::::::;;;;;<<<<;:9::;;;;<<<<;;;::99:;<<:::;;;;;<<;;:;;;;;;;;;;;;;;;;;;;<<;;<<;;;;;;;;:;:;;99::;<<;;::99::::9::::::::9::::;;;;<::::::9999899999:9:::988999889:999:9889999888:;:::9::::;9998888899889::998889989;;;::988888888888889999989988898888888888888888888888888777778887777888777778888888888756666776565456777667766665555554435544443333454444434443334444323333333333333333333332222233333444322212211122222111211211111111111111111111111111110////44443443654434443344433233444554445444444455555555444445567666676666666678888777677766776788766688877777888888888888888888889999988888988999999999:99888999888989::999889999999988888999:::::99999::::;;:::;;;::;;;;;;;;;:::;;<<;:;:::9:::::::;<;;;;;;;;;;::;;;<<<<<;:::;;;:<;;<:;;;;;::;;<<=<<<<<<;;;<<;;<<<;;;==<;::;<<;;==;::;<<;::;;;;;;;<<==<;;;;;<<<;::<=<;;;;;;;:=<<;::;;<<<<;;:99:::99:;;;;;;:;;99:;<;;::;<;9889:::::;;;;;::::::::988998:::9999:::999:;;:99:;;;;:;:99998988889988888988:::::::9888898888888899999::8889999988899988888888988888888888888888888878888888888888875655666666655677777787776555665555665555444555444433444333455443434444433333333334433222333344445432221233222222211121122111111111111211111111111111000004444333355433344444444434444454445554444445666555555455666665566666666778888877667777777777777778887778888888888888899888899999998888999999989999:::998899988899:;;::9999999999988989999;99::989999::;;;;::;;;;;;;;;;;;;::::;;<<<:;:::::;:9::::<;;;;;<;;;;;;;;;;;<<;:99:;;::;;:<;<<<;<;;<<<===<<<<<<<<<<<<<<;;;;===<;:;<<<<==<;;;<<<;;<<<<<<<<=>=;;;<;<<==<;;<==;;;;;<<;=<<;::;;;<<;;;:99:::99:;;;;;::;;:::;;::::989:::9:;;;;;;;;;;::;<;;:9899989:::99::;:99:::;;::;;<<;;;;:9::998889998988898899988999988998888889999999::9889:999999988888888889988888888888888887888788888888888888766666667766666777888877765666665556655555556555444334554323334434444444433333233344332233333444343223322343223322111211221111111111122111111112221110001145655455444444444443445555555544455544555666665555555667766556666666666677888766677777778888888888888888888898878888998899:::::::889:::;::9889:::::;::9999999999:;;;:9998899999999999999:999:989:989:;;:::::;<;;;;;;<<<;;;::;;<<<:;;;<;;<:9:;:9;;;;<<<<<;;;;;;;;:;;:999:;;9:::9;;;;;;<<<=<<<==<<<<<<<<<<<<<<<;;<<<<;::;;<<<;<==<<<<<<=====<<<<=><;:;<<<<<<<<<<<;;;;;<==<;;;;99::;;;:;;;9::::::;;;;:::9:;;;;;:9:;9:::99:;:;;;;;;;:;;::;<;;::9:;:99::::::::98::9:;<;;;;;;;;;;99:;::888::::98888889:988899988998889::::9999999999::999999988888888889:988888888877787777788888889888887888777776678566667788887777556666655555555554665555444445544443456554444555444333333444444334334433343354334432233322122112221111111112222121122222211100111555555555543344544444455444455445555444556766667777766676666666667766776667888877788777888888889888888888888998888888988989:9989:89;:9::::99999:::::9999:9:::99::;;;::99999999::::::9999:::::99::9999:;::;;;;;;::<9;;<;;;;:;=><;;;;;<;:;<;9:::989:;<<<<;;;;;;;;;;<<:9::::9:;::;;;;;;;;<<<;<<=><=====<<<<<<<<<<<<<<=<99:8::;<<===<<<;<=>=<<;;;;<=;;:<<;<;<<<<<<<<<;;;<<;:;;;;;;;;;;::;;::::;;:;;;:;;:::::;;:99<<;9:;<:9<<:9:;;;:;;;<<<<<<<;:;;;::::::;;:9::::99:<<=<;::;;;;;;;::::9889::9999999999989999888998888::::988899999:::98999998788888888998888888887788876788998888:98788766777776678876676666788887777766665555556776456665555566545434555555533455554334333333334444433233332223333444322333212222344211222231222222212112211111111115555555545445555555555554444555555565556677766777776666766666677787677776678888777888888888888888888888888889988888899989999988999::::::::::::::;:999:::;::;:::::;;::::::::::::::::::99::;;;;;:::99:::;:;;<<<;;::<:;;;;;<=<;<<;;=;;<<;;;;;::::::::;;;;;;;;;::;;;;;:9:<<:;:::::;;:;<;;<==;<=<<==>====<<<<========<=>=;;<;;;;;<===<<<<<==<;;<<;;;;;<;==<=<========<;;;<<<<<===<<<<;;:;;<;;::;;;;;;;:::;<;:;;;::<=<====;9<<<<<;:99;<<<<<<<<<;:;<<;;;;::;;:9:;;;:9:<<<;;<=<:99::::::::999:::::::9:999999:::999999999;:::988889999:::9999998888888888899899888888777887679:9888899887887777778777887667776667777777777776655666566655666666656666544455555555444455554454333433344443333343332222334433222322233233443223322222222222221122121111111155555544454456666666655554445666666666667777667767766677776667888877788876788887778899888888888888889999888899988899999999999:::9;:99:;:::::::::::99:;;:;;;;;;;;:::99::::;;::;;;;;;::9::;;<;;;;;:::;;;;:;;;<<<;::<:<;;;<<<;::9:=><;<<<<<<;;;;::;::::;;;;;;:::;;;;;99:=<:;;::9;<<<<==<==>;<><<>>=====<<<==============<<>===<=========>>=;;<<;:::;<;=>=>=>=======<<;;;<===>>=;;<=<<;;;;;:::;;;;;;;;:;<=<:;;;;;=>==>=><;<<<;;;:9:<=<<<<<<<<;;;<<<;;;;;;;;:;<=<;::;:::;<<;:99::::::;::::::;::::9:99999:;;:99999::::;;::998989::::::::::99988889888889889988888887888888::888899888888888777888888767777776667777777787666677665555677777776655654456666655555555666555544444333333333445444333333443333222323333344322333333222233333212111111111114455555455435666666666666544565576567766777766776777778888766778887778888778888778899988778899888889999999889::988999::::::::;<;:<;9:;:;;;;:::::::::;<<;;;;;;;;;9:999::::;;::;<;;;;;:9::;<;::;<;::;<;<<;;;;;<<<;;<;<<<<<;;;::9:=>=<<<<<<=<<;;;;;;::;;;;;<;:::;;;:::::;;;;;;::=>=<=======<<==>?><>====<==>>>=======<=><<>>>>>>==<====>>>><<;;;:::;<;=>=>=>>=====<=<<<<<=====<::;<=<<<<;:::;;;;;;<<<=<<<<<<<<<;=>=<==>=;=<:::;<;;<=<<<<<<<<<;<<<;;;;;;;<<;;<=<;;;:9:::::::::;;;;;;;;;::::;::::::::::::;;:9999::;;;;;;;:9999:;;;;::::::99:99889888899889988888888898899998889998888888887788888887688888877777777777776678766666667778887775556555667776654555666655555555554443333444444455544444433432112223333334322233422222333332111111111111144555554554456676677666776656655655677668877667777777888888777788777888888888887888999887788999999999999:9899:998899::;;:;:::;;::<;:;;:;;<;;:;;;:;;;;;<<;;;;;;:::::::::::;;::;;;;;;;:::;<<;::<<;::;;;;<;;;;;<==<;<;;===<;;::;;:;==<<=====<;;;;;;;;;<<<;;<;;;;<;;::;<;::<;;;;;>>>;<<<<<<<=;<=>>=>>==>===>>>>>>>>>>>==><<>=====>>>==<==>===<;;;;;:<<<=>>>=>>===========<<<=====<;;;;;<<<;;;;;;;;<==>>==========>>>====<;<;:::;<;;;<;;<<====<<<<<;;;<;;;<<;:;;;;;;::::;;::;::;;;;<<:;;;:9::;;;;:;;;::::;;:::::::;;;;;;;;:9::;;;;::999::99998888888899888988888888888888899:::9988888889877888888888888888877777778866667887666777767787766666655676677765554556666565556655654433444333334565554433334311122233333354322222121223333332111111111111444555434544665667777777876666665556777688877778778777888888888877788888888888888889998888899999::999999999999999:::9999:::::;;:::::;:9::;;:;<<;<<<;;;<=;;;;;;:9:;;;;;;;:;<;::;;;;;;;;;<;;;;<==<;;;;;;<;;;;;<===<<;;><=<::::<<;:<<<<=====;::;<;;;;<<<<;;;<;;<<<;:9:<<;:;;;<<<=>><==<<<;;<:;<<<<>>==>>==>>>>>>>>>>>=>>=<>>>===>>>>=====<<=<;<<<;:<<<=>>>==<<<<==<<<=====<======<;<<<<=<<;;;;;;<==>>=<=========>>>>=;<;:<;::;;:9:;<<<<<<<<<<<<<;;;<<<<;;;;;;;;<<<;:99;<;::;;;;;;;<;;;;;:::;;;;::::::::;;;;;;:::::::;;;;::::;;;;:::99999999988888888888899888888899988889999888888888898888889888888888888877777888877788877778887677876666787667766665556655556666665666546544333443333345555554433443222333333333333222212222223332331121111221115555554445556655677777777766666755677777888887787888777888888888887888888888888888899999999::999:::999::::::::::;;;;::99:99:;;;;:9:;::::8:;:;<<;<<<;;;<<;;;;;;:9:;<<;;;;;<=<;:;<<;;;;<<=<;;<===<=<<<<<<<<<<;<<<<<=<<>;=<9;;:;<<;;<<<<=>==<;;<<<;<<<<<<<<<<<<<<<;;::;<<<<<;<<<====>>>==<;<;<<;;;==<=>>>=>=>>>==>>>==>>>>>>>>>>>>>>=>>>=<==<<==<<<<<<>>>>==<;<===<<<======>=<<<========<<<;;;;<=>>>>=<==>=>=<===>>=<;<;;=<;:;;:9:;<<<<<<;;;;;<<;;<<==<<<<;<<<<<<<<:9:;<;:;<<<;;;;<<<<<<;;;;;;;::::;;;;;;;;<<;:::::;;;<;;::::;;;;;;:9:::::999999888888899998889:::::9888998888888898888888888998888888888888888888988888888888887778777777777776777766656676655665566666555665544445444445655555554444333333333322323322222222112333233112221222111666667666776666666787777766556677778888888888777888887888888888888888889989989::9999999989::::99;::::::::;;;;;;;;;;;;;;;;::;;;::;:;;:;<;8:;;;<<;;;;;<<<<;;;;;<;::;<<;;;<:;==;:;<=<;;<<<<=;:;<<<<=<<=<==<<=<<<<<<<==<=;<<;==;;<<<<====>>>>=<<<<<<<<<<<<=====<<<;;;==<<=>=<<====>><==>>>>>==>===::<<=??>>>=>>=<<=>>=>>>>?>=>>>>>>===>>>>======<;<=<=<>>>>>>>==>>=<==<=====>>==============<<<<=>>>>>?>==>?>=<<<=>===<==<><=<;<<:::;;<<<<<<<<<<<<<<<<==<===<<<=<;;<;;<=<;;=<<<;;;<===<<<<;;;<<;;;;;<<<<<;;<<<;::::;;;;;;:::9:::;<<<;::::;:9999999999:99:::9999:::::::::999999::99999998888788998888888888888888889988888888888877788766888766677678777776666666665456776556777665556666655555555555443333322223222344422332222112345343113211122111566667777665666777777777765556787778888788877888888988887888778899888999888889::9999889999:;:99::;;:::::::;;;;;;;;;;;;;;;;;;;;:9:;;;;;::;;;<<<<<<<;<==<;;;;;;;;;::;=<::<;<=<;<<;;<<<<<<<=<;;<<<<<<<====<<<<<<<<;<=>><<=>>><;=<;=;<===>>>>===<<<<===<<==<====<<;;;;;=>======>>>>>=>>=>=>>=<====;;<<=>>>>>==>>==>>>>>??>>>==>>>>>>>>>>========<<=====>>>>>>>>>>>>>=====<==>>>==========>>=====>>>?>>>>==>>>>=<<>>>>=====<<<;::;;:::;<<<<<<<<======<<<=>>=;;;<<<<<<:;;<<;<<<<<;;;<==<<<<<;;;<=<<<<;;;;;;;;;<<<;:::;;;;;;;::;::::;<=<;::::::999999999999::::9:::::::::98898889:999999999988888888889888889888888888:88998888888888888877777776677777777766666666665555666666776666544775554455555555455333333422432344323443221123443344322311122111666666777766666677677888766777787677888788877788888998888888888998888999988888998899889:99:;:99:9:;:::::::;;;;;;;;:;;<;;;;;;;;::9:<==;:8<;;;;;<<<;;<<<<<;;;;;;;;:;<>=;;<;<=<<<<<<<==<<<<==;;<===<<=====<<<<<<=======<=>?>=;;<<<<<=>>>>==>>>=<<<<============<<<;:::<========>>>>??>>><<;==>>>>====>>>>>>>>>>>>??>????>>>>>>>>>>>>>>>===>>>>>=======>>>>>>>>>>==>>>>>>==>>>>==========>>====>>>>>>>>>>>>=>>>==>>===>>>=<;<;::;;;;;<=====<=======<====>>>=<<<;;;;:;;<<<<<<<<<;;;<<>=<<<<;:;<<<<<<;;;;;;;;;<<;;;;;;;;;;;;;;::::;<<<<;;;:::::::::::::::::;::9:::::::;:988888899999989999988998788888988898898888888988999888888888888887777788888888887766666666666654457876666666544543343455566665454334443444543344333433222334443234433222222111666666667777777776668888778888887778888888888788988999988888888888888999:9888998889999::99:;:9:::;;:::;;;;;;;;;;;;::;<<::::;;<;;::;;;;:9<<;;::;<<<<;;;;;;<<<<<<;;;<<;;<<;<<<<<<<<<==<<<<>=<<===>========<=====>>>===<=>>><;;;<<=>=>>>>==>>>=<<===========<<<==<<;;;<=<<<<<<<=====>==>>><==>>>>=>=>>>>>>>>>>>?????@@>>>>>>>>???>>>>>>>>>>>>>>========>>>>>>>>>=<>>>>>>>>>>>>>>>>>>>>==>>====>>>>>>>>>>?>>>>>=<==<;=>>=;;;<;;;;;<<<<=<<==<<=======>>>>>>>=>=<<;;;;<<<<<<<<<<<;<<===<<<<<<<;<<;;;;;;;;;:::;;;;<;;;;;;;;<<<;;;;;;;;;;;;;::::;;;;::;;;;:::;:9::::::::;:988888899999999999988::8889999988998898888888989998888888888888887778888888888888766666666666665457764666555545543455545566666554444435556544343344433433344434334444322233222766666666777888777778888888888888888888888888889:9889999888888888999999:;999999898999:;::9:;:::;;;;;:::;<<<;;;;;;;;;<<<;:::;;;;;;:::;;;:;;;;;;<===<;;;;;;<<<<<<<<<<;;<<<;<<<<<<<<<===<<<=>==>>=>======>>>>>>=>>>>===<<=<==>=:;=>>=<>>>>><>>=<=>====>>=====<==========<<<=========>==>==<=<>==><==>>?@?>>>>>???>>?@?>>>>>>>?????>>>?@@?>===>>==>>>>===>>>=>>>=<<=<<=>>>>>>>>>>>>>>>>>=>>====>??>>>>>>???>>>=<<===<==<;;;<=<<<<<<====<===<<=>>=>>>>>>>>>=<>>==<<<<========<<<<<===<<<<====;<<;::;;;;;;:::;;<<<<<;;;;;;;<<<;;<<<<;;;;;;;::;;;;;::;;;;::::::::::::::;::999989999:;:9999:988::999889::98998899888899:99998888888888888988888877788888778877666666666666666655765445667645676755666666654444446555444332344334543344444344444333333322776677776667777778888888888878888888888888899889:9889999999999989999999::99:99:9999:::;::::;;;;<;;;;:::;;;;;<<<<;<<<<<;;;;;;::::;;;<==<;:;<<<<<<<<;<<===;;;;;<<<<====>=<========<========>==>>=>======>>>>>>>>>>>==>===<==>>;<>>=<<=>>>>>>>====<===>>=============>====>>>>>>>==>?>>>>>===>>>>==>>@AA@@@@???@?>>>??>>>>>>????@@@???@@@>===>>==>>>>>>>>>>>>>>===><=>>>>>>>>>>>>>>>>>>>>>>>>=>??>>>>>>>>>>>>===>>>>=<<<==>====<<<=>>==>>>=>>>>>====>>>>=<<<=>>=<<=>==>>>>>>>======<===<<<;<==;99:;;;;;:::;<<===<;;;;;;;;<<:;;;<<<<<<<<<;<<;;;;:::;<;:::;;::::;;;:::::;;;:99999:;;::::::9898999888:::99888898888999:::9988898888888988889886778888867777777777776666777777766555678654577666667776665445555545544543334443444333555434433435433322277776777777777777888878889988888888888888889988898888899999:::99::999999989999:::9:::::::::;;;;<;;;;;;;;<<<<<<<<;;;;;::;<<<;;:::<<<===<;;;<==<<<<<;<====<<;;<===<====>>===========>>>====>>=>==>>======>>>>>>>>>>>>>==>======>>====>>>>>>>>>=>=<=================>>===>>>>>>>>===>=>>>>>==>>>>>>>???@@@@@@????>>>>>>>>>>>?@@?@AA?>>>>>>=>=>>=>>=>>>>??>>>>>>>>>?==>??>>>>>>>>>>>>>?>>>>>>>=>>>>>?>>>=>>>>>>>>>>>>=<==>>=====<<<<>>>>>>>>>>>>===<<======<<=>>=======>>>>>>>>==========<<;=>><::;<;;;;;:;;<<<<<<;;;;<;;;<=;;;;<<<<<<<<<<<<<<;;::::;;:::;;;::;;;;;::::::;;:::99:;;99::;;:888889999:9998888899999999:::998999988888898888987677887777776678877777766777778776666776555567755666776667655655544455554444544444444455434442344433333336787667888888888788888888998889988888888889999888999888999999999::9::::9:88999;;::;;::;:;:;<;;;;;::;<;;;<<<<<;;:<::;;::;;<<<<;<<=<<<<<<=<;<<==<<<<<<<=====<<======<<<============>>>>>==>>>====>>>>>>>>>>>>>>>>>>>>>===<<=<<>>>=>>>>>???>>>=>>>======>>>>>>>>====>>===>>>>>>>>>=>>=??>>>>>>>>>>>>>>??????????>>>>>>>?>>??@@@@AA@?>>=>>>>>==>>>>==>>>??>>===>>>>?>>>>>>>>>??>>>>>>>?>>>>>>>=>>>>>>>>>>>>>>>>>>===>======<====<<<=>>>>>?>>>>>=======<<<======>>>=====>>>>>>>>===>>========>>>=<<<<<<<<<;;;;;;;<<;;;<<<;;<=<<;;<<;;<<<<<;;;<<<;;;;;;;;;;<<;;;;;;;;::::::;;:;:::;<;:9:;;;;9899999:::999998899::99:99::999999998888888887888777887776887666888777777787777776777777534666776566666677766776665445665445554445566554434454334432234444788877888888888888888888888778:;98888888999999889:::9889::::9999::::;;:9;9999;<<;;<<;;;:<;<=<;;:;::;<<;;;;;;;;;:<:9;<;:;<===<<<=<<<<<<=>=<;<<=<<<<<<<<=>=====>=========<>>>>=====>>>>>>>>>>====>>>>>>>>>>>>>>>>>=>??>==<<>=<>>=>>>==>?@@?>>>>>>====<=>>>>>>>>>==<==>>>>>>>>??>>>>><@A@>>>>>>>>>>>>?@@????????>>>??????>?@@@@@A@>?>>>>>>>>==>>>>==>>>>??>>>>>>>>>>>??>>>>>???>>>>>>??>>>>>>>>>>>>>>>>>>>=>>>>>>>?>>>>>==========>>>>>???>??>=====>=<;<=>>=<<=>>><==>>>>>>>>><<<<=>>====>>>>=<<==<=====<;;<<<<<<<<<<=<;;<=<<<<<<<<<<<<<<;:<<<<<<<<<<<<<=<<<<;;;;;:;;;;;;;:;;::;<<:9;<;<<:89999889::99::99:;;:999:::::9999999999888888888888888877788876688887777787777777787667865467677666666678865688877664466444554345566655444445433433334444378887788888888888888888889988899999999998999::9999::999:::;:99:;::;:::::;99:;;;<;:;<;;<<;;<<<<;;;;;<<<;;;;::;;;;<<;;;;;;;<==========<<=<<<<<<===<<<<<<==>==>=<<=>========>>>>===>>>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>??>>=======<=>===>>>>>?>>>>>>>=====>>>>>>>>>>>===>>>>>>>>??>>>>==@@@>>>>?>>?>=>?@A@@@@@@@@?>?A@@@@@@@@@@@@@@?>>?>>>?>=?=<=>>>==>>>>>>?>?>>>=>>>>>>>?>>>>>>>>??>>??>>>?>>>??>>>>=>>>>>>>=>>>>??>>>>>>>>====<<=>>>>>>>???>>===>>>>>========>>>>><>>>>?>>===<<===>>=>>>>>>>===>>=====<==<<<<;<<<<<<==<<<<=<<==<<<<==<<<;;;;;;<<<=<<<;;<<<;;;;;::;;;<<<<;:;;;:;;;<;;;;<;:99::9888:::::::::;;:889;;:::9:999999999889:8888888888888888777788887778887877777777777777766676666666677767777788765554444445555667766655554444332433432378888889888898879998888889988899:::99:99999::::99999889:;;<;:9:;;;;:::;;:99::::<;;;<;;<<;<<===<<<<===<<<;<<=====<<<<<<<;;<==<<<<==>>>=<<<==<<<=======>>>>=======>>>>>>>=>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?>>====>>=<<====>>>>>@??@?>>>>>>>>>>>>>>>>??>>>>>>>>>>>>>>>>>>>>?>@@@=>?>>?@??ABA@@@@AAAA??@B@@AAAAAAAA@@@@@@AA?>>>>>@>=>>???>>>>>??@@@???>>>>>>>>?@?>>>>>?????@@?????>>>>>>>?>??>>>>>>???????>>>>>>>>>>>=<<=>>>>>>??>>>=<<===>>>>>===>>>>>>==>>>>>>>=====>>>>>>>>>>?>>==>>=<<<===>>===<<<<<;<===<<<<=<<======>=<<<;;;;;;;;;<<<<;;<<;;;;;;;;;::;;;;;:;;:::;;;<;:::::::::9989:99999999:;:88899:;:::99:889:::99::989999:8888999888887778777788888777888877777888766776677777765666777776666665455577777666666765545543334444333788888898888888899988888999888899999:::9999::::9999999:;;<<;:::;;;;;;;;;;::::::<;;;<::<<<<=====<==>>=<<<;<>>====<<<<==<;;<<<<<<<><>?>=<<=>>><<====<==>>>=>>==>>===>>>>>=>>>>>>>>=>>>>?>>>>>>>>>>>>>>>>>>>>>>>>?>>>>>>>>>>>>>=<<=====>>>>@@@@?>>>>>>>>>>>>>>>????>>>>>>>>>>>>>>>>=???>@@>=?@??@A@??@@??@@@@@@??@A@?@@@@@@@@@@@@@AAA?>>>>>?>>>>??>>>>>??@@@@??@?>>>??>>@@?>>>>??????@@@@@@???>>>>??@???>>@?????@?>>>>>>>>>>>>>>=<=>>>>>>>>>>>>===>>>>>>>>=>>>>>>>==>>>>>>====>>>>??>>>>>>?>><=>>><<===<<==<==<===<<============<==>>=<<<;::;;;;;:;<<<;;;;:;;::;;;::::;;;;;:;::;;;;<;:::9::::999::::9999999:;;988889::::99:889:;::;:::9999:;:99:::98888888787777888777777888877788888767876678877666666776556777765656788776777788865556544444433338888888898888888999889999::9888988889:::99:::::9:::;;:::;;;;:::;;;<<<;;;;;;;;::<<;<<;:;<====<<<<====<;;;;<===<<<;;;<==<;===<<<<<><=>=<<==>>>======<<=>====>>>>>=========>>>>>>==>>>>>>>>>>>>>>>>>>>??>>>>??>>???>>>>>>>>???>>====>>>>>>>>??@?>>>>>>>>>?@????????>>>?????>>>>>>>>>>>>>A@<>@AA@@@???@@@@@@@@@@@@AB@@@AAA@@?@AAA@@@?@?>>>>????????>>?>>?@@@@???@?>>>????@?>>>>????????@@@???????>>>??>>>>>@>??>@A@?>>>>>>>>>>>>>>=>>>>>>>>>??>>>>>>>>>>>>>=>>>>>>>>>>>>>>>>==>>>>>>??>>>>>>>>==>>>=>>>>==>>=====>>=<==>>>>>===<<<==>>=;<<;::;;<<;;<<<<;;;:8;;:9:;;:;;;;;<<<;;;:;<;;;;;;;:::::999:::;::9999:9:::99989:::;:9:9889::;=;;:::99:;:99::9998888888877778887778877788888888776678766777777766677765667776656667776777888888765566554455445488888888888888889999999999::988888889:::::::;;;::::;;::::;;;:::;;;<<<<;;;;;;;:;<<<==<;<<====<<<<===<;:;;<<<<<==<<<<<==<;=>>=<==>>==<;<=<<=>>>>>=>====>====>??>>>>>>==>>>>>>>>>===>>>>>>>>>>>?>>>>>>??>>>????????>>>>>>>>>??>==>>>>>>>>>>>>???>>>>>>>>>>?????????>>>??>>>>>>>>>>>?>=<>@B?@@A@@@?>?@@@@@@?@@@@@@AA@@@AAA@@@@AAA@@?>?????>??@@???>>>?>>????@@????>?>??????>>>?@@@@????@@????????>>>??>>>?>?>??>@A@?>>>>>>>>@>>>>>==?>>>>>>=>>>>??>>>>>==>>=>>>>>>>>>>>>>>>>>>>>>>>??>>>>>>>>>>=====>>>>==>>>>>>>>=<<==>>>>><<<<<=>>>><;<<;;:;<<<;;<<=<<<<;9<<:9:;<:<==<<<<<;<;;<<<<;;;<<;::::::9::::::999:::::::999::::;;:::88999:<;;::::99:9989:;<<;9999888788889977888777888888886766787677877777778888777776555666788778888888887655665544565565888889988888888899:99999999::99999889:::::::;;;;:::::::;;;;;:::;<<;;;;;;:;;;;;;<<<=><;<<==>>===>>>=<;;;<=<<<<=========<<=>>===>>>>=;;<=;<===>>>>>>=>>>>=<<=??>>>>>>>>>>>>>>>>>>>=>>>=>>??>>??????>????>??????>>>>>>>>>>>>>>>>>>>>>>>>>>>>???>>>>>>>>>>>????????>>>>>>>>>>>>??????>>=>?AAA@@?@@@???@@@@@@@@@?@@@@@@@@@@@@AAA@@@??@@@????????>>>>>>??>??>??@?>>>>@???????????@@@@@??@@@????????>>?>>>>??>=>@@?AA@@??>>>>????>>?>>>?>>>>>>==>>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?@A@?????>>>>>====>==>>===>>>>>>>>=======>>===<<=>>>>=<<<<<<<<<<;;<<<<<<=<;<<<;;<<<=====<<;;<<;<<<<<<<<<;;;;;;:::::::::::;<;;::::::::9:;;99:9:;:99:::989:9889999:;;<;::::998888899988788888888888887877787778888877788888777765556756898888888888886666665554555554888899998889988889:::::::989::::::9999:9::::;;;;;;;;;;;<<<<;;;;;<<;;<<<;;;;;<<<;;;<==<<<==>>>>>>>>>==<<<<<<<<====>>>====>>>==>>>>=<<;==;<=>>>>>>>>>>>===<<=>>>>>>????>>>???>>>>>>>>>>>>???????@@???@@??@???@?>>>>>>>>>>>>??>>???>>???????????>>>>>>??@@@???????>????????>>>???@@@>@>>>@@A@@@@@A@@AAABBBBABAAABBBCBBAAAABAA@@@???A@@?@???A@@????@?@@???????>>>>>@??>????@??????????@@@@?????@@??>>>>???>=>@@@A@?A@@??????>???@@?>>>>>>?>>>>??>>>?>>>>>>?>>>>>>>>>>>>>>>>>>?>=>?@@@@??>>>>>>>>>>>?>>>?>>>>=>>>>>>>>>====>>>>>>=>>=>>><<<<======<;<<<<<<==<<====<====>>==<;<=<<<<<<=====<;<<;;;;;;;;;;;::;<<;;;;;;;9::;<;9:::;;;:988::8899889:;;;:9988888998888899888778888888888888888878877888888788888877776666756888888888888887667776555445544888899999889988889:;;;;;<:89::;;:::999999::::;;;;;<<<<;;<<<<;;;;<<<<==<;;;;;<<;:;;<==<====>>>==>>>>>>=<;<<<<<==<<=>>====>>>>=>>>><;;<====>?>>>>>>>>>========>??>>>>>>>??@@?>>=>>??>>>????@@??@AA???@???@???@?>>>>>>>>>>????>>?@???@@@@@@?@@???>>>>?@@@@@@@???>>?@????>>>>>>>>>?@B@@>>>@A@AAAA@@@@@A@@@@@@A@?@ABBCBA@???@@@@@@@@@@@?@A@??@??@@?>?@AA@@??@?>>>>>?@?>>@@?>????>>??@??@@@@@@>?@AA@?>>>??>?@>>@@@A@?AAA@@@@???@@@@A@>?>>>?@??>?@@>>>@?>>>>>??>>>>>>>>>>??>>>>>?>==>?>>>>>>===>>>>>>>>>==>>>>=>>>>>>>>>>>==>>>>>>>>?>=>>>=<<<=<=<===<<===<<===<<=>===>==>>>=<<<==<<<<======<<<<;;;;<;:;;;;;:;<<;;;;;;;:;<==<;<9::;;:988;;889::999:;;;::98889::98888898888889988888888898887788888778888888888877887778777777777888888887777776664455458988:988998889989:;;;;;<;;::99;;:9999999:99:;::;;;<=<;<<<<=<;;;<<=<<==<<<<<<<<<;<<==>=<<=>>>========<<<==>>=<<<<;=>>===>>>>==>>=>=<<<<=>==>>>>>>>>>>===>>=<<>??????>????@@?>>>>?@>?@??@???@?@@@@??@@@??@@?@AA>>>>????>??>@@@?>???A@?@A@@@@@@@??@@@@@@@??????>>??@@??@@??>>>>>>?@??B@?A?@@BBBBA@@@AAA@???????@ABBBA@????@@@@AAAA@@@AAAA?@A@@@@@@@ABBBA@@??>>?@AA@???????>>>>>>?@??@@@@AA@@@@AA@?????@>@@@@@ABA??@A@@@@@@?@@@@@@??@>>>>?@@?@@@@@@?>>>>>???>?>>>>>>?>>??>>>???>>>>>>>>>>>==>@?>>>=>>>==>>>=>>>=>>>?>>>>>>>>?>>>>@?>>>>>;==:<<<====>>>>==>>><<==<;=>=>>>>=<<===<<<<<====<<<===<<<==<<<<;;<;:;;;;;;:9:<>>==>@<:99999:8;;98:;;99:;<<<;::99988899989888998889989888888889988889887788777877678778888888776556546899899888888876875666559:989:999988899999:::;;<<<:::9;;;::::::::9:;;;:::;<=;;;<<<=<<=;;<=<<==<<<<<;;;;;;<<=>=<<==>>====<<<=====<==<<<==<=>>>>>>>>>>>>>>>=<<<<<=<<=>>>>>==>>=<<=>>>>?@@>??>>????>???>>>>@?@@@???>?@@@@AA???@@?@@@?>??>>?????????@@@????@AA@?A@@B@@@@????@@@@@@?>>>>???>>>?@@?>@CA>>>>>?A@>@??CA@@ABBBA??@ABBA@@@@???@ABB@@@@@@@@@@@@@AA@@@AAAA?@@@AA@??@@BBAACCA@???????@@@??@A@>>??>?@????@@@@@A@@AA@@@??>@>@@>??@AA@@A@@@AAA@@@@@@@@??@>>>>?@???@??@?>???????>?@?>>>>>>>>??@@@@@?>>>>>>===>>>=>??>>>>>?>==>>>=<=>>>>>>=>>>>??>>>>>>???>=>=;=>;=<=>>>>>>>>>>>>====>=<=>=>>>>==<==<<;;;;<<<<<<<===<<<<<<==<;:;::;<;::;;;<=>>=<<=>><;:9:::::999::999:;;;;::::99999:988888999888888889988888888888776788777887778878888878887778877899888888888988877766559:989999:98899999999999:::9:::<<;;;;;::::::;;;::;;;<<<<<<;<<=><<<==<====<;;<<;;<;<<=>=<=====<<<=====>>>====<<=>>>>>>>?>>>>>>>>>>>>>>=====<<==>>><<=>>===>>>>?@?>??>>??@?>?@@?>>?@@@@@??@??@@@@AA??@@@AAA@?????@@@@@@@@??@@???@@@A@?@A@@BAA@@@???@@@@@???????@@?>>?@?>=?BB>>?@??@@?>??CA@@BBBBA@@@AABBAAA@@@@AAAB@@@@A@@????????>??AAAA@A@ABA@??A@AAAAAA@????>>>?@AAAAAAA>>?@??????@@@??@AAAAAAAA@>>??A@>>?@@@ABA@@AAAAAA@@@@@@???>>>??@@???>??@???@@@?>>@A@>>????>???@@?????>>==>>>>>>>=>>>>>>>?>>>>?@@?>>>>??>>=>>>>>??>?>>>>??>>>=<=><====>>>>@?>>>>>>>==>>=<============<;;<<<<;<<<========<<>=<;;:::;<<;:;<<:;<=>======;::::<::;;::::::::::;::::::::9:988889999988888899988888888998888888888887778888878878888888888998888888889:988888766699988999:9889::9:::99889898:;<==<<;<;;::::;;;;;:<:;<=>=<<;===>===>===>==<;;==<<<====>=<<<===<<=>>>>>>>>>>>>==>>>>>>>>?>>>>>>>?>>>>>>>>>>>>>>==>==<=>>?>>>>>>>??>??>>?@@??@@@?>?@@A@?@??AB@@@@@AA@@AAABBA@@@@@@@@A@@@@@?????@@AA@@??@A@@A@AAAA@@@@@@@@@@@A@@@@@?>?@@?>>>@B??A@???@@@A>AAABCCBBAAA@@AAAAAAA@@AAAABBBA@@@??????>??>>?@@ABABBBBAA@@AA@@BA?>>????>>>?@ABBBAA@???@@?@A@@ABA?@AAAAAAAAA@??@AA@?????@ABBA@@@AAA@AAAAA@@@@????@A@@@>>>@@@?@@A@@??@A@??@????@????>>>>?>>==>>>>??>>>>>>>>>?>>>?@AA@?>>>??>>>>>==>?>>>?????>?>>>==>=>>==>?@?@????>??>===>=<<============<<==<<<<=======>>=<=>=<<<;;;;<<<<<;;9:;<=>>>;;;;:::;<;:;<;:;;;;:::::::::::::9:9899:;:9899889999:::99::9999888888888888887788888888778888888899:99999988899888888788799999:::::99::::::;;::::9:9:;;=<<<<<<;::;;;;;;;;;:;<===<<<>=>>===>======;;<>>=<==>>>>=<<<====>>?>>>>>>>>>>>>>>>?>>>>>>>>>>>>>>>>>>>>>???>>>>======>>>>?>>>>=>>?>??>>>???@@@???@A@A?>?>?ACA??@@AAABAABBBB@@@??@@?@@@@@????@@@@AAA@@@@@A@@@@AAA@?????@@@AABAA@@@@?@@@@A@??CBA@??@?@@@A?ABBBCCBBA@@@@AAAAAAAAAAAAAABB@@@@@???@@@@@???@?@A@BBBBBAA@ABAACCA@AAA@@????@ABCBA@@@@?@@@@BAABBA@@BAAAAABAA@@@@A@@A@?@@@?ACBA??@AA@AAAAA@@@@?@@@@AAA@?>>?@@??@@@@??@@@????>??@@???>>>>>>>>>=>>????@?>>?>>>?>>>>??@?>>>???>=>>>>>??>>>>??@?>>>>>=>>>>>>=>?@?????>>?@@>===<<=>================<<==>=====>>====<<=<<;<;<<===;:;;<<<<<<;;<=<::;;;::::;;;;;::999::::::;;:;:999:;;9889999999:;;:8::;:988888887788899888898988887788999:::::;::999:988998799888888989::::::::::;:::::;::::9:9:;;<;<<==<;::;;;;;<;;:;==<;<=<<>>>>===>======<<=>>==<>>>>>=<<==>>==>>>>>>>>>?>>>>>>>>>>>>>>>>>>???>>>>???????>>>>==>>=>?>>>>>>>>>>>>>??>>>???>??@??@AA@?>>>?AB@>>?@AABBBAABBA@@?>?@@@@@@@@@@@@AA@??@AAAA@?AA@@@AAA@??@@@@AABBAAAAA@@@?@@AA@??ABB@?@@@???ABBDCBCCCBA?>@@ABBBAAABBAAAAABBAAA@@?>>???@A@AAA??@?@@ACCA@@ABCCBBCCBBBAAAAAAAABBA@@@AA@@AAABAABCBAABABBBBCBA@@A@A?@B@@@A@?ADCA@?@AAAAAAA@@@@@@@A@@A@AA@????>?@@@@???@?@@???>??@A@@@???>>>>>>>>??>>???>????????>>>>??>>>>>>>=>>>>>??>???@@@?>==>>>>>?>>>>>???>??>>>??@>>==<<>>>======>==<========>>>>===>====<<<==<<<<<<<==<;<<<<<<<<;<=>>=;<;<<:9:;;:;;::::::;;;;;;;;<;9989:;99:;;;;;9889:999:::88899888888888888888999899889::::;:999:::999:9999988:988899898:;:::::::::::::::99999::9:;;=<<<==<;::;<<;<<<;;;==<;<<<<===>===>=<=>==<==>>>==>>>>>==>>>>>===>??>>>=>>>>>>>>>>>>>>>>>?>>?@@?>????@@???>>>>=>>>>>>>>>>>>>>>>>>>?>>>>???>?????@BB@??>>??@@>>?@AABBA@@ABAA@???@AA@AAAA@@@AAA@?@@AAAA@?ACAAABBA@@@AAAAABBCAAAAA@@@@AA@@??@@@AA@@A@@?@@CBDCCDCBBA??@@AABBBBABB@@ABBBBBBAA@?>>>??@A?BAA@@A@A@BCCA@@ABDDBABCBBBBBBBBBBBBBBA@@ABA@BB@@@ABCCCBBBBBBCCBA@AA@A?@B@@@A@@ABBAA@AAAAAAAA@@@@@@@A@@@@AA@??@@?@@AA@@????@A????@@AA@????????>>=>???>>>>?>????@>>>?>>>??>>>>>>>>>>>>>>>>@@AAA@>>=>>>>>>?>>>>>??@@@?>???>>======>>>===>>>>====>=====>>>>>>>>>====<<=<<===<<<<<<<<<<<<=>>=<>>?@@?>>>><:;;;;;;;;;;;;;;;;;;;;<;:999:;;<=>>>>=;9999::9::989::878999:88889:9889:::;:9:;;;:;;:9:99::9999999999888899988:8:<;::;9::::::9::999:;;<<:;;<====>>=;::;<<<<<<:<;;<<<<;<;<<=>=<==<<=========>>>>>>====>=>>>>>>>>>>>=>>>>>?>>>>>??>>>>??>>?@@???@?@A@?>?@>>>>>>>>>=<>??>>>?????>?>>>>?????????ABB@@@>>?>?@?>>@AABBA@@ABAA@?@@AAA@AAA@??@AAAAAAA@A@@@@BCBBBBBAAAAAAAAAAABBBA@@@@@AA@@AAABCA@@??AABAAAC@DCCCBAAA@@AA@@@ABBBCB@@BCCBBBBAAAA@??@ABB@AAAAABBCCCBBBBBBABCCBBBCCCCBAAABCBCDCA@@ABAACB@??@BBCCCBBBBBCDCAAAA@A>@BAAAAAAAA@AAAAAAAAABA@@@AA@AA@@@@A@>>>@A@@ABBAA@@?>@B@?@@@?@A@??@?????@@@>>>>>>???>>>>??=>?@@?>>>>>???>>>>>?@?>>=?@@@@??>>?>>>=>?>>>>>>@ABA@?@A@>=<<>>>>>>>>>>>>>>===>>>>===>>>>>>>>>====;<=<<=>=;<=<<<<===<;=>><>@A@ADC@A@>><;;;<<<;;;;;;;;;;;:::;;::::;<>??>>>>>>>>=<;;;;;:9:;;989<===;<;;==<:99:;;<<;;;;;;<=<;=<;::9999:::999988899888;<;:;<<;;;:99:;;;:::;;;<;:::<====>>=<<<;;;<<<<;:;<<==<<<;<;:<==>>=;;=>>====<<>>==>>>===<>>>>=>>?@?>=>>>?>???>>>>??>?@@@@@@??>>>>AA@>>?@?>>>?????????@??>>>??@@?>?AA@?>?A???@@?@@????@@@@@??>?ABBBABBAAA@@@@AAAAAAAABBABCBBBBBBBABA@ABB@>?ABBBA@ABABBBAAAAAAABA@@A@@@@@@@BBBBAAABBAA@@ABABBBBBAAAABBBCCBBCBBBCCCCBBBBBBA@@AAAAAAAAAAAAABCBCCCCCCCCCBBCA@DCA?@AA@ABCCCA@AABCCBAAABAAAA@@ACDBA@@AAAAAAAAABCCCA@@ABCDA?>?AAAAAAAABBAAAAAAAAA@@@@>>@@??@@AAAAA@AAABB@BBA?>AC@??>@>?@??@?>?A??@?>?A@>>>>???>>>>????>>>>>>>?????>=>?><>?@@>>>?>>>??>>==>@@>>>>>>>>>>>=>>=<>>>>===>@@@?>>>>>>>=?>>>>>=<=>=;;<=<=>>><;=>>??@ABA@@@@?><;<=;;<==<;<<;<<;:<;9;<99;:;>>@>?>??>>>>>==<<<<;;<<><:;==>><<<=>>><;;;=>;:<<:;>>=<<><;:::::::::99::99:;;999<=;::;;:;;;::::;;;:;;;;<;;<<==>>>>>=<<<<==<<<<<<<<;;;;;<<=<<===>>===========<>>>=>?>>=>>>>>>>>>@@?>>>>??>???>>>?>>>??@@@@???????????>?@??>>>>?@A@??????>?????????A@????@@?@@@?@@????@@@@@@@@ABCBAABBAAA@@?@@AAAABAABA@ABCCBAABBBCBBABA@?@BCCCBAABBBBBBBBAABBBBA@@@AAA@@@AABAABCCBAAA@ABBABBABAAAAAAABCBBBBBCCCCCCCCCCBAAABBAAAAAABBBABBCCCCCBCCCCCAAB@@CCA@AAAABBBBBAAA@ABCBAAAAAAAAA@ACBBBAAAABBBAAAABCBBAAAABBDBB@@AAABBBABBBBAAAAAAAAAABB@@AA@@@@AAAAAAAAABBA@A@@ADDC@@@A>BCAA@@A@??>??@A@BCBBBA??@@?>???????>??@@??>>>>>>?????@?>>>>>>>>>>>>>>>???>>?CDA>>>>>>>>>>>><===>>=>=>>@BBA???@?>>>>@@?>>==<<==<;<=====<<=>???@AABBA@AA@??>=<<;<<<;:;;:;<;:;<;;<::;;;>>@??>>>>>>?>>><<<<;;<=>=<<=======>>>>=<<<=><<=<;;=>=<<>>====<<;;;;::99999::999<<;9:;:9::;;;;;;;;;;;::;<===<<=>>>>=====>==<<====<;;;;<<<==<=====>>>========<=>>==>==>>>>>>@?>>@@?>>>???????>>??>>>?@@@@??????????@@@@AA?>>>>?AA@?>>?@@@@@A@????@@???@?@A@@AAAAA@@@@@@@@@@@@ABBBAABBAAAAAAAAAAAABBBBA@@ACCBAABBBCCCBAAAAACCCCCCBBBBBBBBBBBBBCBAA@ABBBA@A@@@@@ABCBBBBBBBABCBAAA@AAAA@ABBCCBBCCCBCCCCDDCBBBDCBBBBBBBBBBBBCCCCCBBCCCB@@A@ACCAABBABCA@AAABBABCDDCBBBAABBBAAAABCBAABCCBAAAABBBBBBBBBADCDBAAAABBBBBBBBBBBBBBBAAACCBAAAAABBBBBBBBBBBCCB?A@@ACCB@@AA@AAAA??@@A@??>@CDDDDDCB@??@@@@@???@A@@@??@??@@@??????@AB@>>A??>>>>>>?>>>>>>>>@A@>>????>>==>>>>?@@>>?>>@BDDCBAABBA??????>=<<=<===<;<<<===>>@@@@AABBBB@BBAAB@><<==<<;;<;;;=<;<<<<<;:;<;??A?@?>?>>??>>>==<<<<<=>====>=<==>>>===>==>=<=><;;===<=>>>>>=<<;;::::9999:::999;<;;<<;:::;::;<<<;;<;::;===<;;=>=>>>==<<<<<=====>=<<<<==<==<=====>==<=>>>=====>>>>=>>?>>>>>????@??>>?@@@@@@??>?@?>>??@@@????????>>?@>>?@>>?>>?@?>>>>?@AAAAA@????@@?>?@@AA@@AAAAAAA@@@??????>?@@@@ABBAABBCBBBBAAABBBBA@ABABBBBCBABBCBAAABADDCCDCCBCBBBCCBCCBBBBBB?ABBA@ABBAAABBCDCBCDDCBABCBBBAAAABAABCCCDCBCCBCCCCCDDDCCCDDCCCCBBBBBBBBBCDDCBBCCCB@@@@ACCBBCCBBCA@ABBCDBDDEEDDCCBBBBBBA@ABBBAABBCBAAAABCBBCCCBBBCBDBAABCBBBBBBBBCCCBCCCBAACCBAABBCDDDDDDDCCBBBBB@BA@@@@ABBBACAABA>>?@AAA??@CDDDDDCBBA@@AAA@@@@@AA@???@AACDDC@>?@@@BDDBABAA@?>>>??>>>?@AA?>>?>>=>>>>>==>>>@BCBA@@@@ABDDDDCCCCDC@>>>>>=<<======<<=<=>?@AAAAAAABBBBBBBBBA?>=>>>=<<==<;;<=<=<<<;<;;<=@@A?@@?@????>>=====<<=>>>===>>==<=>>=>>>=>>=<>>=<<====>>>>>=====<::::9999:;::98:<<<==<;;;;;;;<=<<<<;;;<==<<<<<=<<<<=<<;;<===>======>==>=>=<===>===<=>>?>>>>=>>>>>>>>>>>>????@@?@????@@@??????@@@???@@@@???@@@??????>>>?>>?>>>>>>>>??@AAA@@?????@A@??@@BA@@A@@@@??@@@@@@@@??@@@@@ABB@ABBBBBBBAABBBBBBABCBBBCDDCABBBBBBBBBDDBBCCCCCCBBCCCDCCCCCBBABBBA@ABBBBABBCCCCCDCCCBBBBBCCBBBBBBCCCCCCBCCCCDCCDDDDDDCDDCDDCCCBBBBBBCCDDDCCCDCCBB@@BCBCCDCBBBBBCCCDDDDDEEDDDCCCCBCCBABBBBBBBCCCBBAABDCCCDCCCCCBCBABBCCCCBBBCCDCCCCCDCBBBBBABDCDDDDDDEDDCBAABBBCBAA@ADEDDDGDCDA@@AAAA@@AACDEEDDCBCCBAAAA@AAAA@A@???@BBDEEDA@@@@ABDDDCBCCCA?>>???>>>?@AA@?@@>>>>>>>>>>>>@BBABBAAABCDDCBBCCBCDA>===>>>>===<=>>>>>?ABCCCBBBBBBBBBCBBBB@????@?><<>><::;<====<<<<;=<@@A?@@??????>>>>>====>>?>>>>>>>=;<=>>>>>=>>==>>>=====>>=>>>>>>?>><;;:99::::::::;<;;<=<;;<<<<;;<<;;<<<<===<==>=<<<<<===<<==========>>===>>>==>=>====>>>>>>>>>>>>>?@?>>>>>@@?>@@??????@@?>????@@AA@@@AAAA??@@@@@@BABA?>?@>>??>>>>??@@@@@@@@??@@@?@AA??@ABBAABA@AA@@@AAAAAAAAABBBAAABBAABBBBBBBAABBBBBBAABCCCCDDCBBBBBCCBBBDCBBCCCCCCCCCCBCCCCCCBBBCCB@@ABAAAAABBBDBBBBCDCCCBBCCBBBCCCDDCCBCDDDDDDDDDDDDDDDDCCDCCCCBBCCBBCDDDDDDDDDDDDAACCBCDDCBBBCCDDCDDDDDEDDDDCCCCCCDCCCCBBCCCCDDCBBABCCCCDDCCDDACCCCBCCDCBBBCCCCCCCCCCCBBBCBCDDDDDCCDEDDCCBABCBCBBAABDEEFFHDCDBABCBBBBDDCCDEEEDDDDDDBBA@@ABBA???@@@@AACDCCBA@?@ABBBBCCCBBA@???@??>>>>>?AB@??@??>>>????>@BA@BCAABDDDDCB@BBAABB@>>>>>>>=>>=>>>>?@ACCDDDDCCCCBBBBCBBCB@@B@AAA?>?@@>===>?>>====<<<<@@@?@?>>>?>>>>>>>>>>>>>>>>>>>??=<;<===<===>==>=>>>===>=;=>?????>>===<;:<;:::;;<<<<:;<;;;<==<;;;<;;<<<===<<=>>=<====>>>===>=======>>=<=>>>>====>=>>>>>>>>>>>>??>>?@@?????@@??@@????@@@?>?????@@A@@@AAAAA?@@@@@AAABB@>>?>??@@>>>>@@@@@@@@?@@@AAA@@AA@@@@AAABCBBCCCCBBBBBAABBBCCBAAABBABCBCCCCBAABBBBBBAABDCBBCDCBCCBCDDCBBCCBCCCDBBCCCBBBCCCCCBBBCCCBAAABBBBBCCCDDBBBBCDDDDCBCCBBCCCCDDCCCDDDDDDDCDDDDDDDDDCDDCCDCBBCCBBCDDDDDDDDDDDDCCDDCCDDCCCCCCCCCDDCDEEDCDDDDCCDDDDDDDCCCDDDCCBCCBBBCCCDDCDDDBCCCDCCCDDCCCCCCDDDDDDDCBABCCBDDDEDCCDDDCDDCBCDCBBCBBCDDDFEECCDCAABBCDEFEDDEDDEEDDDDCBBAAAABA@?@@AA@@@ABAAAAA@@@AAA@ABBA@@@@@@@@@???????BB@>?@?A@@?@@AAAACBACDBBCDEEDDCBBCBBBBB@A@?>>>>>>>>>>>?AAABCCCCABCCCCCCCBBBBABDBBCCBBBDCAA@?@BA@>>>=<=<=A@?>>>>>>>>>=>>??>?>>>>>>>>>>?@>=<<<==;<===>>==>>>>=>>=<=>>?>>>>>>>>==<<<<::;<<<=<;<=<<:;<<;;;<=<<======<<<========>>=<<========>>><<=>>>>=>>>>>>>>>>>>>>???AA?>>>>?@?>?????????@@AAA?>???>>?@A???@AA@@@@@@@@@AABBA???>@?@A?>??@?>>?@???@AAA@@@@AA@AA@@AABCBABCDCCCCBBBBBBBBBBAAAABBBBABCCCCBCCBBBBBBBBCCBBCDCBDCCCDDCBBBBCCCDDCCCDDCBBDCBBABBCCCBBBBBBAABCCCDDDCCCCDDCDDBBCCCCCCBBDDCCDEECBCCBCCDDDDDDEDDDDDCDDCCDDCBCDDDDDDDDDCDEDDEDCDDDDDDDCCCCDDDCCDECCDDDDDDDDDDDDDDDCCCDBBBCDDCBCCCDDCDDECCCCCCDCDDDDDDDCDDDDDDDCBABDCACDEFFDCCDCBCDCBCDCACDDDDCDEFFDCDECBBCCDEFEDDEFDCEEEDDBAABBBBAA@@?BBBA@@ABABAAAAAA@@@ABBBA@@@@??@@AA@?>??@@@AAAABCCBA@@AABCBCDCDDDDDDDDDDDDBBDDCBBCCCA?>>>>>>>==>@@???AAA?@ACCCCCCCCBBBBCCCDDDCCCCDCCB@ABAB>>>==>=>>>>>>>==>>A@@@@???@??@?>>>>>>==>><;<==>><<>>>>>>>>=>>?????@@@?>>=====<<<;:;;;;<<==<<<=<;;<<=======<<<====>===>>>>==>>>>>>>>>=<=>>>?>>===>>>>>>>>>>>>??@A@>==>>?@?>???@@@?>@@@@@???@@@@@??@??@AA@??@AAAA@@@@BCCA??@@@AA>?>?AAACCCBBBBCCBABAAAAAAAAA@ABBBBBCDDCCBBBBBBAAAABCAAABBCBBABCBBBBAABCCBBABBCBBBCCBCCCBBCCDCBBBCDDDCBBCCBBBCCCBBBBBDDCCBBBABBBCCCDDBCDDDCCBDCBCCCDDCDDCDDCCDDDCCCCDDDDDDDEEFEEDDDDCDCDEDCCCDDDEFEDDDCBCDDDDDDDDDDDDCBDDDDDCDDDDCCDECDEFDDEFFEFEDCCDDDDDDDDDDDDDDDDDDCBCDDCCCDDDDDDDDDEFFFEEDCDDDCBDDEFEDDDDCCCDDCCDBBDFFEDCDDDCCDEEDDDDEDDFFEEEFGFEEEDDCBCCDCCCCBAADCCB@AAACABCCAABCAABBCCBA@?@@??AACCA@@AAAAACCCCCBAAAABCCDDDDEFFEEFFEDEEEDDCDDDCCDCCBA?>>=>>??@??BA@@@@?>??BDDDCACDDCBBCBCDDCCCCCCCBBBBBBC@?>=>?>@CB@??>?@?>?@@??@@@@@@@????@?>>?@?>>>>>>=>>>?>==><=>>>><=>>???????>>??>>>>==<<<<<<<<<==><<===<<=<==============>==>>>>>====>>>>>>>>=>>>>>>>==>>>>>>>>>??>????@?>>>>>>@@@????@@@??@@@@@@@AA@@A@@@??@AA@@@@ABBAA@@ABBA@@@@AABB?@?@CCBCCCBBBBCDCCDCAAAAAAAA@ABBBBCCCDDCCBBABBAABBBDCBBBCCCCBBBBBCCCCCDDCBCCDDCBCCCCDDCBBCDEDDDCCCCCDCCBBCCCDDCCCCCCCCCCCDDDCCCDDDDDDDDEEEEEEDDDDDDDDDDDDDDDDDDDEDDDCDDDDDDDDDEDCCDDDDDDDDDDBCDDDDCCDDDDDDDEEEEDDDDDDCDDDEDDFDDDDCDDDDEGFFFFGFHGFEDDDDDDEEEEDDDDDDDDDDCCDDDDDDEDDCCDDDEEEEEEEDEDDCCDDEEEDDDDCCCCCCCDDCCDCBBBDDCCDEFFFGFGHGEEDEEFGGGFEEDDDDCBBBBCCBBACBDBABBABBBBABBBCBBA@ABABBCBA@?@@AA@@BBBCBBBBBBBCCCCDDDEEEDDEFFFEEFFEEEEEDDEFEDCBBBBAAAB@@@???@AA@@@@A@>>>>>>@CCDDDCCDCCDDDCCCDCCCCCCCCCCAABBA@AACBAA@@ABA@ABBAA@@@@@@@@@@@@?>??@@?>>>????>>>=:::9:<=>>=>>>>>>>>>>>>>>>>>>>=====<<<<<<<<<<===<<<======>>>>>>>==>=>>>>>>>===>>>>>>>>>>??>>>>>>??@@@?>>??@?????>>>>>>=>?@@@@@@@A@??@@@@@@ABB@?@AABA@@ABA@A@ABBBAAAAA@@@@@@@@AA?@>>DDCCCCBBAAAABCDCBBAAAAAA@ABBBBCDCDCCBBBAAAAABBCDDCCCCDDDCCBBCDDDDDDCCCCDDDDCCCCDDDCCCCDEDDDDDDDDDDCCCDDDDDDDDDDDCCCDDDEDDDDDDDDDDDCDDDEEEDDEEEEEEDDDDDEFFFEDDDDDDDDDDDDDDDEFEFGGEDDDEFEDCDEEEDDDDDDEEDEFFFEEEDDDDBDDDDDDGDDDEDDDDDDEGIIJGFHHHHFEDDDDEEEEEEDDEFEDDDDDDEEDDEFFDCCDDDDDDDEEEDEDCCDFEEEFEDDDDDDDDDDDDDEEDCDDDCBCDGHGHGGGIHFFEEEDDEFFEDDDEEDCCCDDDCCBBBDCBCCCCCCAACCBAAA@@CDBDEEDDDDCBBBBBDDCDCCCCCDDDDDDEFGGGGFEEEEEFFGGFEDEFEEEFFDCCCCCCCDDDCCA@@ABBAA@@@@>>=>>>?CDDCBCDDDDDDDDCDDDCDDDCCCCCCBBCCBCABBCB@@BCCBBBBBAAAAA@AAA@AA@@@@@@??>??@@??>=>=;;9::;=>>>>>?@@@@@?@AA?>>>>>>==>>><<<<<<<;<<===<<<=====>>>>>>>>>==>>>>>>>>>>>>>>>>>>>>???>>>>???@@@@???@@A@@@?>>>>>>>>>>>>???@AA@???@@@@@@ABA@ABCCA@@BCBAAAABBBBAABBA??@@@A@BAAB@@CCDDCCBBBBBABDEDCBAAAAAAABBBBBCDDDCCBBBCBCBBCCCCDCCCCDDDDDDCCDDCDDDDCCDDDDDDCCDDDCCDDDDDDDDDDDDEDDDCDDDDDDDDDDDDCDDDDDDDDDDDDDDDDDDDDEEFDDDDEEEEDDDEDDFGFFEDDDDDDDDDDDEFDDDEFGFDEFDDFFEEDDDDDDDDCDDEEDEFFFEEEEEDDDEEDDDGEDDEFEDDEEDDHJJJIGHHIJHGDDDEEFEEGFFFGHFEFFEDEGGFGGHHGDDDEEDDDDEEDCDDDDEGGFFGGFDDDDDDDDDDCDFGEDDDDDCDEGHHIHFFHIHGFFFEEEFFEDDDFFFDEFEDDDDDBBDCBDDDEEDCBDDCBABCDFGDFHHFFHHGEEDDEEEDDDDDDEEFFEFFGHGGGGGFEEEEHGGFEDDEFFEEEFEDDDDCBBCDDDDBA@AACBBAAA@>>>???ADEEDBCDDDDDDDDDDDDDDDDDDDCDDC@BDCCBBCCB@@BCCBAABBAAABAAAAAAAA@@AAA@????@@@>?>>>>>>>>==>>>>@@@@@@?>>?@@?>>=>>>>=>>>=======<==>>><<==>===>>>>>>>>>>>>>>>>>==>>???>>>?>>>????????????>???@@AA@@?>>>>>??>>>>>>>>>?@A@????@@@@?@BCCCCBBBAABCBBBBBBBAAABBCBA@AA@BABABCBABCDDCCBBCCCCCDEDCBAAABBAABBBBBCDDDDDDCCDCDCCDCBCCCCCDDDDDDDDCCCCDDDDDDDDDDDDDDDEDDCDDDCCDDDDDDDDEEDDDDEDDDEEDDDDCDDDDDDDDDDDDDDDDDEEEEEFEEDDEDDDDDDDDDEFDDEEDEFEDDEEEEEFGEEEFFDCDFEDFFEEEEDDDDDDDDDEEDDEGFEEEEEDEDEEEDDGDDEEEEEEEFFGJJIIJHHHHIGEGFEFGHHHGGFFGHGFFGFFGHHGHHIJIFEDFFFDDDDEEDEFFFFGHFFHHGEDDDDDDEEEDFHHFEEEGFEEFGGHJIGFIIHFDDEFGGFEEEEEFFFEFGGFEEEEDDDDCDDEGFFEEEFEFEFHHHHGIIHGGJJHGHHHGGGFGGFEEFFFFFGGHHGGFFFFFGGFGGFGFEEGGFFEFGFEDEEDCCCCDDDCBAA@BBBBBBB@@@??@ACEEDDDDDDDDDDDDDDCDDCDDDDDCDDCDDCBCDDCBBBBCCBABCCCABBBAAAAAAA@@BCCBA@@@@@@>@@@AA??@A?>?>>>AAAAA@@?>>????>>>??>>>?><<========>>>==>=>>===>>>>>>>>>>??>>>>==>>?@????@?>?@@@@???????????@@@??@??>>>>>?>>>>>>>?????@@????@@@@@BCCBCBBBCBBBBCCDDCBAAAAABCCAABBAA@B@ABBACDDCCCCCCCCDDDCABBAABBBBBBCCCCDDDDDEDCCCCDCCDCBCDCCDDDDDDDDDCDDDCDDDDCDDDDDDDDDEFDDDEDDCDDDDEEEDFEDDDDDDDDEEEDDDCDDDDDEFEDDDDDDDCDEFEDDDEDDEEEEEEDDDDDFGGDDEEGHEDEFGFEDDGGGGFEEDDFFEEDDDFFEDEFFDEDEEEEEFGFFFFFEEFEEEEEDEDEFEDEFEEFGHIIIJHGHHHIGEHHGGGHHHGGFEFHHHEGGGIIHGHGGHHGFEEFFEEEFFFDFHHHGGHGGHIGFEEEDDDEGGGGIIHGGGHGGFGGHHHHHHIIFDEEFGHIHGDEFGGGFFEFGGFFFFGFGEDEFFGFGHHHHHIIJJHGHIHHHGHIIGHIIIHGHHHHGEEFGGGGGHHHHGFFFGHHHGGGGGGFFFGFFFGFFEEFGFEEEEEDDCBBBABAAAABBAAA@@AABDDDDEEDDDDDDDDDDDDCBCDDDDDDDEEDBBCDDDCDDCCCBBBBCCBCDCBABBAAABBBCDBBA@@@@@@BBBCB@AAA@?@@@@@@AAABBAA@????@@???>>>?><<<<<<===>>>>==>>>>>=>>>>>>>>>>>???>>>>>>>???@@@@??@@@????????@@?@@@@???@@?>>>?>?>>>>???AA@@@@@@@@@@@@@ACBAABBBCCDCCCDDCCCBAAAAAABBAABCABBDABCCBCDDDCDDDDCDDDDCBBBBBBCCBCCDDDDDDDDDEDCBCCDDDDCCDDDDDEEDDDDDDDDDDDDEEDCCDDDDDDDEEEEDDEEDDDDDEFFEDEDDDDDDEDEFFEDDDDDDDDDEFEEEEDDDEDDFGFEEEDDEFFFFGFFEEFFFGHFFEDFHGEFGGGFFEFFGGFFFDEEGGEDDEEEEDEFEDEEFFFEFFGGGGGGGGIHGFHHFGEEEEEFFFFFGGFGHIGGIIIJIGHHGGFFFFFFFEFHIIFGGHJIHGHGFFGGFFEFGFFFGGFEHIHHGHHHGHHHGFGGFEEGHIFFGHHHHFGGGFGIIIGHHHIIFDDDDDDEEEEEFGHHGGEFGHGFFGHGIGEFGHGFGIJJJIIIIIHHIIHGHIIIHHIIJIHGGHHHGFFGHHHHHHHHHHGGGHHHGGGHHHGGFFGFFGGFFGEFFEEFFEFEDDCCCCCBBBABBAABBCDBBDDEEEDDDDDDDDDDDDDCBCDDEEEDDDDDDDDDDDDDDCDCCCCBAACDDCBBBCBBCDDCCDCBAAAAABBDCBCBAAAABBAABBBBA@@@??A@?>>>>?????????=<<;;<==>>>>>>=>>>>>>>>>>>>>>>>>>>??>>??>>>>?@@?@??@@?>>>>>>>???????@@AAAA@>>@@??????@@?@@AAAAAA@AAA@?@AAA@BDDBBCDDCCCCABBAAABBBABBABDDBCBDABCCBADDDDDDDDCCDCCCBCCCCCCCCDDDDDDDDEEDEDCCDDDDDDDDDDDDDEEDDDDDDEEDCDEFFDCCDDDDDDEFEDDEEEEEEDDDEFEDDDDDEEEEEDFFFEEDDEEEEEEDDEFFFEDEFEEFFFEDDEFGHHHGHGHGFGGEEEEHHDEGGIHGGGGHHIGGHHHGEFFGHEDEEFGGGGHGFFGHHFEEEFGHHIIIIHIHGHHGIHFDEGGGGGGHHFEFEFFHGFGFEGGGGFFEEEEEEFGHHHHGHIIHHHGFEFGGGFGHGFEEFFEHJHHHJHHHHHHHGHHGFFHIHHGGGHIIHHHHGHJJHJJJHHIHGFGGFFGGHHHHHHHGGFFGGFDEFGGHGFGGGGGHJJJJIIIIIJJJHJIJJJIHIJJJIHGGHHIIHHIIHHHHHHHHHFGHHHHHGHHHGGHHHHGGGGGHIGHGFFGGFEEEDDCDDDDCCCCCBABBCDCDGFGFDDDEEDDDDDEDDDDDDDDEGGEDDDEFEFDDEDCCCDCCDDCCCBCDCAABCCCDEDCCDCCBBBBCDCDCBCB@ABBDDBBCBBBAAAAAAAAAA@???@@?@@@@A=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?@?>>?A?>>>?@@@?@@@@@><=>>>???>?????@AB@@?????????@@@@@??@@@@@@@@@AAAA@A@?ADDBACCCCCBBBABAA@@AC@ABBBBBBCCCBBCCBCCDDEEDDDDDCBBCCCDCBCCCCDDDDDDDDDDDDDDDCDDDEDDDDECDDDDDEDDDEEDDDEDEEDDEFFEEDDEFEDDEFEEEEDDDFEFFDDDDDDDEGEEFFFFEEEFFEEFFDFGGGFFFFFDEFFFDEFGIIGGGHHGHHGEEDDEGHGEFHIFGFFHHHHGGGFFGGFFGGFFGFGIIJIIJHIIHFFFFGHGGHIIIIIHHHHIIHIHGGGGGGGGHHGFEEEEFHFHHGHFHHHFGFEFFEFHHHIIHGHJJHHHGGGGGGGGFGGEFFFGHJJIHIJIHGGIIGIJHFGIHGHHHHHHIIHHHGHIHHJJIIJJIHHIHHGGHHIIHHHGFGGGFGHIIIHGFFGGGGFGHIIIJJJJJJIHGGIIJJJIIIIJJIHHHIHGGIJHHHHIIHHIIHGHHHHHIGHIIIHHHHHHFGHHIIHIHGGHGFFFGFFEEEDDEGFDDCCCCCCBCFFGFEDDFGFDDDEEEEDDEDDDEFFDEEEEDFFFEEFECBDCCCCDDCCDDCBBCDDDFEDDDDDCBBBCDDDDDDDBAAABCCCBBBBBA@@@AAAAA@@@@@@@A@@ABC<===>>>>>>>>>>>>>>>>>>>>>>>>>>>>??@?>>>????????????@@?>>>>>????????@@@AA@@@???>??@@AAA@@??@A@@@@AA@@@AAAA@@BCCCBCCBBAABCCCBAAAABAAAABBCCCCBAABCCCCCDEEEDDDDCBBCBCDCBCDCCDDDCDDDDDDDDDDDDDDEEDDDEEDDDDDEEDDEFEEEEEDDDDDEEEEEEDDFEDDEFDDEFEDEFEFFDDDEFGFGHFFFFFEFGFFGGHGFEGGGGGFFGGFFFGFEGGHHGFFFGIGHHGFGGGGHIHGGHHFGGHIIJIGGHGFFEFFGGEEGGGHIJIJKIJJHGFFGIHHHIIIHHJIIJIIJJIIIHGGHIGGHIIGGGFEEGEFFFGDFGHGHFEGFEGHHHJJIIIIIIHHHHHHHGIHGHHGGGGGHIJIIJJIIIIJIHHIHHIHHHIIIIIIIHHHIIJJHGGHIHHHIIHIHHGGHHIIHHHHGHGGGIJJJJIIIIJJJJJJIIIIJJJJJJJJIIIIJJJIIIJJJIHFGHIHIJJIIIHIIIIIIHHHIIHIIHIIIIIIIIHHFGHHIIHIHGGHGGGGHHGGGGEFHIIGEDDDDCBABEEFGGFEFGGEDDEFEEDEEEDDEFEDEEEEDEFFFFGFEEDDCCCDDDDDDDDDDEDDFEDDDDCBBCDDDDEEEEEDDDCCBBCCBABBBA@AABBBA@@@ABBAA@ABCB<===>>>>>>>>>>>>>>?>>>>>>>>>>>>>?>>>>>>?@@@@???@???@@???>>??@@@@???@@@@@?@@@??>@>?@BBBAA??@AA@@@AAA@ABBBAABCCCCDDDCBAABCCB@@BBABCBAAABCCCCBBABCDDCCCDDDDDDDCCDDCDDCCBCDCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCDFEDDEFDDDDFFEDEFFDEFFEFGFDDFGEDFGFGGEDDEGGGGGFFFFEEFGGGHIJIHHFFFFGGGGHGGFFGFGHHHGGGGGIHHHGGHHIIHGFGHIIGHHIJJJJJJJIIHGGGGGFGHHHIJJIJKIJJIGGGIJIIIIIIHHGFGHGGIIIIIHGGHHHGHIIHGGHFEHFGGHIGGGHHHGEGFFGHIIJIJJIGHJHIJJIHGFHIHIHGHIGGGIJIIJJIIJIJJIGHIJJHGIIIIIIIIHIHHHIJHHGGGGGHIJIIIHHIIHHHHHIIHIJHGIJKKKJJJKKKKKJJJJJJJKJJJJJJJJIIJJJJJIJIJJHGGIIJJJJJJJIIJIIIIHHIJJJJJIIIIIIIIIIIGHHHIHGHGFGHHHGGHHHHHHFGHJJIGFFEDDCBDFDEGGGGGGGGFEEFFEEEEEEEEEEDEEEDDEFGGGFFFGDEFEDDDDDDDDDDDEDDFEDDDDBBCDEEEDEEFFEEDDDDBBCCBABBBBAABCCCBAAAABCBAABCCC>>>>>>>>>>>>>>>>>>????>>>>>>>>>>>==>?>>?@@@@??@A@@???>?@?????@@@????@@???@@@@@?@?@ABBBAA@@@@A@@A@@AABBBBABCCDDDDDDDDCBBBBBAACCBCDCBABCCCCCBBBBCDDCBABBCDDDCBCDDCDCCCCDEDDDDDEDDDDDDDDDDDDDDDDDDDDDDDDDDEDCDFFDDEFEEEEGGFDEFFEFFFGGGGEEFGFFGHGHHGFGGHHHGHFGGGFEFGGHHIIIIIHGFFGGGGIHHGHIHHHHHHIIHHHHHIHGGFIIHFFGHJIHIIIJIIJIJIIIJJIHHHHJJIIJJKJJKIJJIHHHIJIIIHIIJJIJJJIIJKJIGGHIIHHHHHHGFFGFEFFGGHHHJJKJGEFGGGHIIJJIJJJHHJIJJJJIGEGHGIIIJJHHHIJJIJJIJJJIJJHIJJKJIKKJJIHHIIJIHGHJIIIHGGHJJIHIIIIIIIHIHIIIIIJIGJKKKKKKKLMLKKKKKKKKKLJJJJJJJJIJJJKJJJJJIJIIIJIJJJJJKJJJJJJIIHIJJJJJJJJJJJIIIIJIHIIHHHGHHGHIHHGGGGHHGGGGGHHHHHGGFEEEFHEFFGGGGGGHHGFFFGEEEEFFEDFDDDDDDFGHHGFEEGFGHGFDDDDDEEEDDDDDEDDDDDBBDEGGEDDDEEEDDEDDDDDDCBBBBCCCCCDDCCBAAABBCCCCDD>>>>>>>>>>??>>>>>>????>>>>>>>>>??>>??>>?@@@???@AA@??>>?@??>>>???@???@@@?@@??@A@ABBBBBBBBAA@@@AAB@@AAABBABBBCCCCCABCCCBBCDDCCDDCCDCCCCCCCCBCCCCCDCCBBBCCDDDDCDEEDDCDDDEGFDDEEEDCCDDEDDEEEEDDDEFEDEDDFEEEFGDEGGFEEEEFFFGGFEEEEFFGGGFGGEEEEEEFFFFFEGHHHHHGGFGGGGFFHGHHHHIIHJIHHHHHGJIJJJJJJIIIIIHHGGGIJIGFFGIJJHHIJHGHIIJIJHIJIHHJJIIIIHIJJIJJLJJKJJIHGIIHHIIIHIJJJJJJJIHIJJIGHIJJJHHHHHHGFHIIHIJJIJJHGGHIJHIIHIIIJIJJKJJJJJJJJJIGGHHGIKKKIIIIIJJJJJIJLKJJJKLLLLLKLMMLJIIJJJJJHHIGHHHHHJJIHHIIIIIIIIIIIJIIJJIJLMLKLLLLMMMLLMLKJJJKLJJJJKKKKJJJKLKJJJJJIJJJIIJJJJKKKKJJJJJJIIIJJJJJJJJJJJJJIJJIJJHHHHIIHIIHHHGFFGGFEFGGFGHHHHHGGHHGHHHHGFFFFGHHGGGGGEEEEFGFFGEEDDDDGGHGGFFFGFGGFEDEFEFGGFEDDDDEDDDDDCCDEFFEEDDEEEDDEDDEEEEDDDCBDDDDDDDDCCBBBBBCCCDDD==>>>>>>>>??>>>>????@??>>>>>>>>???@@@??@A@@@@AAAA@?????@@@?>>??@A@??@A@@@@??@AAABBBBBBCCBBAAAABBBBAAAABBBBBCCCCCBBBCCBCCDDDDDCBCCDDDDCCCCCCDDDDDDDDDDDDCDDDDDEFEDDDDDEEDDFFEEDDDDEEEDDDDFEDEFGFFFDDFFFFFHFFGGFEDDEGGFFGGFFEDFFFGGFFGFFFEGGGGGGGFFGHIHHGFEEEEEDFGGIIHHJIGIIHHHHIIJIJJJKJJJJIIIIHHGGIJIHHHHIJJIIIJIHIIIJJJIJKJHHIIIJJJHHJJJJKKJJJJIIHHIIHHHIIIIJJIJJJKJJJJJJIIHIIJIIJJJJIHGHHFHIIGHJJJJIHHIJIIJIIJIJJKKKJJJJJJIIIIHJJKKJKKJJIIJJJKJJJKJJKLMNMLMMLLLMNMKKKLKKJHGGFGGGGGHIIIIIIHHIIIHIIIIIIJJJKMMLKLLLLLMMMMMLKKKKKLKKKKKKKKKKKLLKJJKKJIJLKJJKKJJKKJKJJJJJJJIJJJJJJJJJJKJJJJJJJJJHIIHIIHIIHGHGFFFFFEFGGGGHHHHHGHIIHHIIIIHHHHIGFGHIHFEEEEFGGGFEFEEEEGGHGFGFFFGGGFEEEEFGHHGFEEEDFEDEEDDDDEEEEDEEEEEEDDDDEDDDDDDCBDDDDDDDDCCCDDCCBCDDDC=>=>>>>>>>?>>>>>?@@AA@?>>>>>>>>?>??@@@@AAA@AAAAA@@@@@@@??@@@??@@A@@@AAAAAA@?AAABAABBCCCDCCCCCBCCCCBAAABBCCCBBBBCCCBBCCCCCCCCDCCCCDDDDCDDDDDDDDDDEEEDDDDDCCDDDDDDEFEDEEDDGGFFFEDDFGFEDDDDFEEFFFFGFEEEEGGGIGGHGGFEEEGHGFGHGHFEFFFGHGGGGGGFFFFEFFEDFHJJJJIHFEEEDDEGIIIHIJIHHIIHHHIJJIJJJJJJJJJJIIJJGHJJIIJJIIIIIHIJJIJJJJJJIJJJHHHGJJKJHHJJKLJJKJJJJJJIIIIJIJJJJJJIJJJKKKKJJJJIIIIIJJJJJJJJJJJHJJJJJLJJJJIIJJIJJJJJIJJKKLKJKKKJJJJJJLMMKJLMKKJJKKKKKJJJJJMONNMLMMLLKLMMMMMMLKJHGHGIHHHGFGIJJJIHIJJIIJJJIIJKMMMMLKKLKKKLLLLLLLLLLLLLLLMLLKKKKKKKKKJJJKJJJLLKKKKJJKKJJKKJJJKKJJKKKKJJJJJKKJJJJJJJJHIJIJIHHIIIGGFFFEFFGHHHHIIHHHHHIIIIJJIIHIJJJHGHIIHGFGFFFFGGGEFFFFFHHHHGGFEFGHHGGFDDEFHHGFEEEEFEDEEEDDDDDDDEFEEEEEDDEEDDDCDDDCCDDDCCDDDDDDEEDDCCDDDC>>>>>>>>>>?>>>>>?@AAA@?>>>>?>>>>>>?@@AAA@@@AAAAA@@@@AA@>>@@@@@@@A@@@ABBAABA@AAABBBCCCCCCCDDDDDDDCBBAAABBCCCBAABCCBBBCCDDDCCCDDCDBDDDDDDEDDDDDDDDDEDBBDFEDDEFEDDEEGFEGGFFHHGGHHFFFGGFEEFFFFFFEEFGFGGEEHJHJIJJIHHGFEGHGFGHHIHFFFFHIHHHGGGHIIHHIIGGFHIIIIIHHGGGFFFHJHGHIIIIJJJJHHJJKIJJJJJKJJJJJJIIGHJJIIJJIHIJJIIIIIJJJJJJJJJIHJJIJJJJIIJIKLJJLKJKJKKJJJJLKKKJJKJJKJJJKKJHJIIJJKJJJJJIIJKKKKJILKLMKMKKJKJJJJJJJJIJJJJKLKKKLLMLKKKKLMLMMLNMMMLLMMLLKKLMLLMNNNNNNNMNKLLMMMLLJJKJJKJJIIIIIIIIKJHHJKJJJKKJJJJMMMNMMLLMLLLLLLLLMLKKKKKKKLLLLLLLKJJJJJKKJJJJJKKKKKJJJKKKJLMKJJKLLKLLLLKJJJJKKKJJJJJJJHJJJJIGHJJJGHHGFEFHHIIHHJJIIJIIIIHIJJIGGHIJJJIJIHHIHHHGFFFGHGHGGGGJHIIIIHGHHGGFFFEDEFHHGFFFEDFEDEEEEEEEDDDEFEEEEEDDFFEDDDDDDCDEDCCDEEEEEEEEEEDDDDDD>>>>>>>>>??????>?@@@@@??>>>>>>?@@@?>?@@@@@AAA@AAA@@AAA@@@@@@@@@A@@@@AABCBAAAABBBBBCCBCDDDDDDCBCDDDDCBABCCCCBBBBCCCCCCDDDDDDDDDDCDDDDDCDDDDDDDDDDDDDCCDDEEEEEEEDCDDDEFGGFGFGIJHHHHHGFFFFEFFEGGFGFFHHFGIJJJIHIIIIHFHGFGGFGHHGHHHGIIGHIGGGIIHHIIIIHHIJIIIJJHHJJJHGJIIIIIIJJKKKJJJJJKJJJKKKJKKKKKJJJJJJJJJJJHIJIIJJIJJJJJJJJIIIIJKJJJJJJJKKJKKJJJKKKKJJLMLKJJKJJLLKLLLKKKJJHIIIJKKJJJJJIJJJKKLLKKKKLMJKKKKIJJJIJJJIJJKKKLKKKKMMMOOMLMMLLMNNMMLLLMLKKKKMOONNNMLMPOMMONNNMNONMMLLMMNNMJKLJIHJKKKKLMMMMMMLLLLLLMMMMMMMLLLLLLLLLLLLLLLKKJMMMLMMJKKJJJJKKKKKKKKKKJKKKKLLLLKLKJJLKJKLKKKKJJJJKKJJJJJKJJIJJJJJIIJJJIHHIIHHIIIHHIJJJIJJJJJJHIHHHIJJJJJJIHHHIJJIHGGGGHHHHHHHIIHIJIHIJIIHGGGFEGGGHGFFFFFEDEFFEFFFEEEEDFDEEDEGEEFFEDDDEDDEDDDDDDFGGFEEDFFEEDDDD??????????@@@@@??@@?>??>?>>>>??@@@?>>?????@@@@AA@@@@AABB@@@@@@@A@???@ABBBBAAAABBBBCDDDDDDDDDDCCCDDDCBBCCCCCDDDCCCCCCCDDDDDDDDDDDDDDDDDDDDDEEDDDDEEDDCCDFEEDDEEEDDDEFGHHHHGFGHGGHIIHGGGGGFFEGHGGFFIIHGIIIJJIIHHHHGGGFGGHHHHHHIIHIIEFHIIHHHFGIIIIIIJJIIIJJIHJJJIHJLKKJJJJLKJJJKKKKKJJKKKKJKKLMMLKJKLLKKLKKJJJHHJJJJJJJJJJJJJJJKKJJIJKKKKLMKKKKKLLMLKJKKKKKJKJKMMMNNOOOMLLLKJJJKKKKJKKKKKKKKLMKJKLLLKLKKKKLKJJJJJJKLKKLLLLMMNMMNOMMMMMMMMNNMLKKLMLKLMNOOPPPMMNOOMMOPPPNNNNMLLMMMNNNKLLKKKLMMMMMNNNNMMMMMMMMLMNONMLLLMMMMMMMMLLMMMLLKMMLKKKIJJJJKLLLLMMLKKKJJKKKLMNMLKKKKKKKKKJJJKKKKKKKKKKKKKLKKJJJJKKJJJJJJIJJJJJJJJJJJJKJJJJJJJIIIIIIJJJJJJJJJIIIJJJIIIHGGGGHIIIJHHIJIHIJIJJIHGGHGGHHHGFEGGFEFGGGFFGGFGGFGEGGFHIGFGGFEEEFFFEEDEEFDEEFFFGFFEEDDCDD?????@@@@@@@@@@@?@@?>??????>>?@@@@?>>?@?????@@@@@AAA@@ABAAAAAAAAA@?@ABBBBBAAAAABAABCDDDDDDEEDDDDDDDCCCBBCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEFFEEEEFEDDDDEFHGFFFGGFFFGGGGGGHGFGGGGHIIIHHHHHHGFHIHIHGIJHGHHHJIHIHHHHGFFGGHHHHIIIJIHIIEEGIJIHIGHJJJJJJJJJJJJJJIJJJJJKKKLMKJJKJJJKKKLMLKKLLKKJJKLMMLKKMMLLKLLLKLKJJKKJJJKKKKJJJKJJJJJJJLNMLLLMKKKLKKLNMLKJJJKLKJJLMNOOOOOOOMMMLLKLLKJKKMOONNMLLMMLJLMKMNMLLLNNNMKLMLKLLJLNMLMMOONMNOOOMMMMMMMNMLLLMMMMMOOOOPPPNNNONNNOPPPONNNMNNOONNOOMMLLMNNNLLLMMNNOMMMMMMMMNNOONMMNMMNNNMMMMMLMMMMLLMLLKLLJMLKLMNMMMNNMLLKJKKLLMMMMLKKKLKKLKKKJKLLLLLLLLLLLKLMLKJJJJLLKJJJJJJJKKJJJJJJJJJKJJJJJJJIJJJJJJJJJJJJJJIIJJJJJJJIHHHHHIIIIIIJJIIIIIJJJHGHIIIHHGGGGGGFFGHIIGGGGGGHGGFGHGHJHGGGFFFFFFFEDDEFFFEEFGGGGFEDDCCCD????@@@AA@@@@??@@A@@?@A@@@@??@@????>?@AA@@??????@BCBAAA@BBBBBBBBAA@ABBBABBBBAAABBBABBBBCCDDDDDDDDDDDCCBBBBBCDDDDDEEEEDDDDDDDDDDDDDEEDDDDDEEEDEFFFEDDEFFEFFFGGFFEFFFFFFFEFFGHIHHHHHIHHHHHIIGIIIJJIIIGGGHIJHGHHHIHHFGIHHIHIJJJJHHIIFGGHIIJIGHJJIJJJJJJJJJJKJJKJJJLKKKLKJIJJJJKKJJMMLLLLKKJKKKLLLLKLLLKKKLMLMMMMMLKJKKKLLKKKKJJJJKLNNNNNMLLKJKLKJKMMMLLKKLMKJKNNNOOOMLMNMLLLLMMNLKLNOPPOPPMNLMLKMOLMOMMMMPOPONOPPNMLJLNLLMMPPOOOOOONLLMNMMMMNNNNMNOOPPOOPPPNOOOOOOOPPPOOOONOOOPOOPPONMMMNNNNNMMMNOPNNMMMMNOOOOONMMNMMNNNMMMMMMMMMMMMMLMLMNKNMLNONNMMNNMLMMLLLLMMLLLKLLLKJKNLLLMNNMLKMNMMMMLKLMLKJJKKLLKJJKLJJJKJJJJJJJJJJJJJIIJJJJJJJJJKKKKKJJJJJJJJJJJJJJIJJJJJJJJJJJJIJJHJIIIIIHHJJJHGHHHGGGGHIIIHGGGFGHHHGGGGHIHGGGGGGGGFFEEEEFGGFFGGGFFFEDDCCDE????@@AAAA@AA@@@@AA@@AAA@A@??@@??????@ABAA@@@@@@ABBBBBBAABCBBCCBAAABAAABCCCCBBBCCCCBBABCBCDDDDDDDDDDDCCBBCCDDDDDDDEEEEDDDDDEEEDDDEFFEEDDDDDDDEFFGFEDDEFFEEFGGGFFFEEFGHHGDEGIIHGGGHIIHHIIIJHIIHJJJJIHHIIJJIIIHHIIJHIJIIJJJJJJIGHJJHHHGIIJIHIJJJKLJJKKKKJJKJLKJJJKNLJJJIJKJJJKKJJKLJKKKKKJKKKKKLLMLLLLKLMNNMMLMMMLLLLLLLLLMMLKLLLMNMMMNONLLKKLMLLLMMNMMLMMLKNPOOOOOMLMMMLLLLLMNMNOOPPPPPPNNKKMLMNLLMLMOOQPPPPPPPPOOLMMKKNNOOOPPOONOMLMNNMNMNOPONOOPOPPPOPPNOOOOOOOPOOOPPPONMNOPPPPPONNNNNOOOONMMNNNNNNNOPPOOPPPNLLNNNNNNNNNNNNNNNNNNMMLMNLNLLMOONNMNNMMNNMLLMNNMLLLMMLLKLOMMMNOONLKLMMMMMLLLLLKKKKKLLLKJKKKKKKKKJJKKKKKKLLKJJKKJJJJJJJKKKKJJKKKJJJJJJJJJJJJJJJJJJJJJKJJJJHJIHIIIHGHJJJIIIIJJJJJJJIHHGGFHIIIHHHHIIHGGGGGHHHGGGGGGGGFFFGGFFGFEDDDDDE?????@@@AAAAA@@@@AA@@@@@@@@@?????@@?@ABBAAAAAAAABBBABBBABCCCBCCCBBBAAABCCCCCBBCCDDDDCBCDCCDDDCCDDDDDCCCDCDDEDDDDDDDEEEDDDDDEEEEEDDEEEEEEDDDDEFFEGGGEDDGIHGGGGFGHDDDDFGGFFGHHHHGGGHIIIIIIHJJJIHJJJJIJJJJJIIJJHHJKJJJJIIJJJJJJIHIJJIIIIJJJJJJKJJLLJKKLLLKJLJLLJJJJLJJJJJJJKJJJLKJJJJJKKKKKJKKLLLMMMMMMMLNOONMLMMMMMNMMLLMMMMMMNMMMMMMMNNNNMLLMNMMMMMNNMMMMNNPPPPPPOOONMLMOMMNNNMMNOOPPQRQPOLKMMMMMMMMOPPQPPPQPOOPPPOONMMONOOPPPPONNNNONNNONNOPPPPOPOOPPOOPOOPOOPPOPOOPPPPOONNOPPPOPPOOOOOPOONNNNNNNNOOPPPPPOOOONMMNNNNNNNNNNNNNNNNNNLMLMNMNMMNNNNNNNMLMNNMMMNOOMLLMMLLMMMMNMNOOONMLMMMMMMMMMMMLLKLLLMMLJJJLLLLLMLKLLLLLLLLLKKLLKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIIIIIIIHHHIJJJJJJJJJJJJJJIIIHHHIHHHHIIJIHGGGGGHHHGGGGHHHGGGGFFEFHGGFEDEEE??>>?@@?@@AAAAA@@A@@?@@@@@@@@@?@@AA@ABCBBBCBBAABBBBBAAAABCCBBCCCBBBBBBCDCCCCCCCCDDDDDCDDDDDDCCCDCCCBBCDDDEEEEDDDDDDDEFEEDDEFFFFFDDDEFFEFEFFFGHGFGGGFEFHJIGGFFEFGHGGHIJIIIIIHHHHHHIIIIIJJJJJJJIJJJIJJJJJJIIJKJIJJJKKJJIIJJJJJJJJJJIJJJKJJJJKJJJJJKLLLLLLKMJLLJKKJIIJKKKJJKJJKKLLLKJJLKKLKJKLLLMMNNNNNMMNOPONNNNMMNNNMLLMMLMMMNNMMNNNNNNOONNMMMNMMMMMMMNOOPPPPQQPPPPPOLLMOMNOOOMLLOPPPQQPPPONNMMNOPOPPPQPPPPQPOOPPPPPPPPONPOPQPPPOOPPOOOOPPPPPQQPPPOPPPPPOPPPPPPPPPPPPOOOOPPPPPPPOPPPPPPPPNOOOPPPPOOOPPPPOPPPOOOOOOOOOOOOONNNMMMNNNNMNMMONNNNNNNNNNMLLMNNMNNNOONMMNNMMMOOLNNNOOONNNNNNMMMNNNMNMMLLMLMMMLKKMMMMMNNMKLLLLMMMMLLLLLLKLLLLLLLLKJJJJJJJJJJJKKJJKLLLLLKJJJJJJJJJJJJJIIIJJJIJJJJKJJJJJKKKJJIIIIIGGHHHJJHGGGGGGHHHFGGGHHHHIIHGFFGGGHGFFGGF@?>>?@@??@AABBA@@AA@@AAA@@@AA@@AAAAABCCBCDDCBAAAAABCBAAABCCBABCBABBCCCCCCCCCDDDDDDDDDDDDDDDDCBCDCCCBBCDDFEDDDEEEEEDDEFFEEEFFFFFGGEEFFEEEFGHHHIHGHHHHHHIIIHHHGGGIGGGGHIIHIIIHGHHIIJJJJJJJJKJJJIJJIIJJJJJJJIJJJJIHJLMLLJJJJJJJKKJJJJKJJJJJKLMLJKKKLLLLLLLLMJLMLMLJIJKLLKJJJKLKJKLNLKLLLKKKLLLLLMNNMMNNNMNOPONMNNNNNNNMLLMNNNMMNNMNNNNNNOONOONMMMMMNNNMNPPPQQPPQRPPQQPNMMMNNONOONMNOPPPPPOPPQPONOPQQPPPPQPQOOPPPQQPPQPOPPPPPOPQPPPPPPPPPQPPPPPPPPPPPPPPPQPOPPPPPPPPPPPPONOPPPPPPPPPPPPPPPOONNNOOOONOOOOPPPPPQPPPPPPPPOPPPPOOONNNNNNOONNNNONMNONNNNNNMLMOOONMMMOONMNNNONMOOMMMNOONNNONNONMMNNNMOMNMMMLLMNMMMNONMNNNNKLLLMNNMONMLLLKJLLLKKLLLLKKKKKJJIJJKKKKJJKKKKKKJJJJJJKKJKKJJIJJJKJJJKKJJLKJJKKKKJJIIIJJIHIHHIJIHHHHHHHHHGGGGHIIIHHHGFGGFGHHFFHGF@?>?????@@AAABBAAAAAABBBAABCCA@AAAABBBDBCDDDBAABAACDCCBBBCCBABCCBABCDDDCCDDDDDDDDDDDEEEDDDDCDDDCCDDCCDDDFEEEEEEEEFFEEFFEDEFHIIIIIGFFFEEFGHIHIGIJJJHIIJHHHHHGIJIFFIIHHHIJHHHIIIIIIJJJJJJJLKJJJJJJIJJJKJJJJJJJJJJJJKMLJJJJJKJJKJJKLKJJKKKKKKMNMLLLMMMMMMMNMLLMLKJJJJJKLLKJLMLKKKLMMKKNLMMMLLLMMMNNMLNONMMNPPLNMMNNNNNOOOOOONNNMMOOONOOPNONPNMMMNMLMPPMPQQPPPPQRQPPPRQNLMNNMNNONNOPPPPPPQPORQQQQQQRRPOPPPPQQPPPQRPPPPPPOOPPQPPPPPQPQPPPPPQPPQQPPPPQQPPPPPPPRPPQQPOPPOOPPPPPPONOPPPPOPPPPOOOOOPPONNOOOOOOPPPPPQQQQQPPPPPPPPPOOOOOOOOPPONOPPOMNOONNOPONMMNNNNMMMNNOONMNNNOOONNMNOOONNNONMLMNOONNNONNNLMMLMOONONNNNONNNNNONLNNNNMMMMMLLKKKLLMMLMLKKLLLKKKKKKKKKKKKKKLLMKJKLLLKLKJJJJJJJJJKKKKKLLKKLLKJJJJJJJJJJJHJIHJIHHHHHIIHGHHHIJIHGGGGGHHGFGGGHHGH@?>?????@AAAABCB@@@@@ABCBBCDDBAB@@BDBACBABBBBBBCBBCCCBBCCDDCBCCCCCCDDDDCCDDDDEEEEDDEGGFDDEDDDDDDDDEDDDDDEEEFFFFEFGGFFGGFEGIJIHIJJIHHHGHHHHJHJHIJIJIJIIGHIHHHIJJIGJIIIHHHGIJJIIIJJJKKJKKKKJJJKLLLJJJKMKJKKKKKKJJJKLMLJKKJKKJJKKJKLKKKLMMMMLLLLLMLLLMMMMMNNMMLLLMLMLJJKKLMNNMKKJKLNMMPNNMMLLLMMNNNLLMNNMMNPPKMMMNNPOOOONNNOPPPOOPOONONNMONMOPOONNNNPPPQQQQQQQRRQPPQQPONOOOPONNNOOOPQQPPQQPQQQQQQPPQPPPPPPRPPPPPQPPQPPPPPPPPPQRQQQPPQQQQQPPRRQPPPPPQQQPPPPPQPPPPPPPPPPPPPPPPOOPPPPPPPPPOOOPPPPPPONOPPOOOPPPPPQQPQQQPPPPPPPPOPPPPPPPPPPOOPPONOPONMNOPONOPPOPOONNOOPPONNOOPONNNOOONNNNOONMMMNONNNNNNNNNMLMNONNOOONNNNNNMNMLMLLLMMMMLLKLMMMMLKLMMMLMLKKKKLLLLLKKKKJKKKJKLLKJJJJJJKKKKKJJJKLKKKKLLKKKJJJJJJJJJJJIIJJIJJJIIHHHHHIJIIJJIHGHHHHIHHHHGHIIHI@??@@???ABBBABCB@??@@@ACBCDDDCBB@ABDCABCBBAABCCBBCCCBBCDDDDDDDDDDDDDDDDDDDDDDEEFGEDEGGFEEFFEDDDEEDEEDDDDEEFFGFFEFFGFGGGGFGIJIGHJJJIHHIIIJJJJKJJJIJJJIIHIJIHIIJJJIJIIIHIHHJKLJJJJJKKKKKLLKKJJJKLLKJJKMKJKLLLLLKKKMMMLKKLJLKKKKKKKLLLLMMMNMLLMNNMLLMNNMMMNMMMLKMNNNLKKKLLMNNMLLKLNNMNPNNMLMMNNNOONLMNNONLNOOLNMMNOPPOOOPPPPRSRPPPNNNOOOMNNLNPPONNOPPPPRPQRRQQRSRQQRQPPPPPPQPOOOOOOPRRQQQRQQQRRQQPPPPPPPPPPPPPPPQPPQQQQQQQQQPPQPPPPQRRQQQQPQQPPPPQRQQQQPPPPPPPPPQQQPPPPPPPQPOOPPPPPPPPPOOPPPPPPPPOOPPPOPPPPPPPQQQQQQQPPPPQQPPPPPPPPQPPPPPPPPPPPONOOPOOPPPPPPPONNPPPPONOOOONOOPOONOOOOONMMMMNNNNNMNOOONNMNNNNOPONOOOMLKNNNONMMLLLLLLPONMKKLMMNNMMMLKLLLLMMMLLKLLKLLJKMNNLKKLMLLLLLKJJJKLLKKKKLLKKKKJJJJJJJJJJIIKKJJJJJJIHHIIJJJIJJIHHHHHHIJIIHHHIIII@@@AA@@ABCCCBBCBA@@AA@@BBCDCCCCBAAACB@BCCBBBCCBBBCDDDCCDDEEDDEEEEDDDDDEDDDDDDEEFGFEFFFFHGHHGEDDEDDEEEDDEFFFFFFFFFFFGGGGHGGGIIHHIJJIHHIJIIJJIJJKJIJIIJJIJJJIJJJJJJJIIJJJJJJLLLLKKKKKKJKLLLLLKJJJKLKJJKLLLMMMMLMMMNMMMLLLKLLLLKKLKLMMMMMMNLLMNNOMKMOPONMNMKLMLLMNMMLLLMMMLMMLMMLLPNNNONNMMNOPPOPPNNONNPNLNOONNNNOPPPOOPPRRRSTTRPONNPPQQPONOOOOOOOOPPQQQPPRRQQRSRQRSRQRRQPPQPPPPPPOPRSRRRRQRRRQQRQPPPPPQRQPPQQPQRQQQQQQQQQQRPPPPPPPPRRQPQRQSSQPQPPPQQQQPPPPQQRQQQQQQQQQPPQQPPPPPPPPPPPPPPPQPPPPPPPPPPPPPPPOOPQRSRRQQQQPPRRQPPPPPPQQQQPPPPPPPPOOOPOOPOOPPOOPPPPNNPPPPONNONOOPPPPPPPPPPPONMNNONNNNMNOOOOOONNNOPONMNPPPPNOOMNMNNNNNNMMLMMMMLMNONMMMMMLMMMMMMMLMLLMMMMKLLLLLLLLLJJJJKLKJKLMLKKKLLLLLLLKJJJJJJJJJJJKKJJJJJJIHHIJJJIIJJIHHHHGHIJJIHHIIIII@@@ABAAACCDDBBCCBAABA@?ABCDCCDCBBA@BB@BCBBBBCCBBCDDEDDCDEDDEEFFFFEEEEEEDDDDDEDDEEFFGFFGHHHHGFDDEDDEFFFEGGGFFFFGGGFFGHHHJHGFHJIIIJJJJJJJJJJJHJJKKHIHHJIIJJIJKKJJJJKJIJJJJJJLLLLKKLLLKKKLLLLLLKKLLMMKJJMMLMNNNMMMNMMNNMMMLMMMMLLMLMMNNMMNOONNMLMMLMOPONNNNLLMNMMMNNMLLMMNNNMMMMKKNOOOOONNNNOPPOOONPPONPOMNOOPOOOPPQQPPPPQQPPQSRPPPPRQRSRQPQPPOPPPPPQRRQQQQRRQRSSRSRRRSSRQQRQQRRRQQQRSRRSSQRSRQQRRRRSRQPQRSRRSQQRQQRRQRRRRQQPPPPPOOPQRRRQQPSSRQQQPPRQQQQQQPQSSRQQRRQQRRQQQRQPPQQPPPPPQQQQQQQQQQQPPPPPPPPPOOPPQRRSRRQRQQRSRPPQPPPPPQPPPPPPPPPPOOOOOOPPPPPOPPPPPPPPPPPPOOOOPPPPPPPQPPPPPPOOOOOOOONMNOOOPPPPPPQPONNNONNNNPPPQPOOPPPPONNNOONNNOONMMMMNMMMMMNNMLMLMMMNNLLLLLMNMLLKJJJKLLKLMMLLLLMLLLMNMKJJJJJJJJJJJJJJJJJJIIHIIJJJIIJJIHHIHHHIIIIHIIHHII@?@ABBABBCDDCCCCBBBBB@@ABCCCCDCBBBACDBBCCCCCCBBCDDDDDDCDDDDDEEEFFEEFEEDDDEDEEDDEDDEFGHGGGHHGGEEFFEFFGGFHHGFEEFGHHGGHHHIIIHGHIIIJJJJJJJJJKJJIJJJKGJJIJIIJIIJLLKKLJLJJJJJIIJLLKJJKLLKJKLLLMLKLNNMLLMMLKNNKMMNNNMLLLLNONMMMMNNMLMMLMMMMMNOPQQPOMNNMMNONNOPPOMNONMNOOMLLMNNNONNOOLKMMNNNONNNMNPPOOONPPONOPOPPPPOPPPPRRQPPQPPPOPQRQQQRSQPRSRSRRQPPPPQQRRSQRRQRQQRSSRSQQRSSRRSSSSSSSSSRRRRRSSRRRSSSSSSRRRRRRRRQRSQRSQRRRRRSSRRRQPPPPPPPQRRQQQQQRQRSSRSSRRRRRRRQSTSRRRRRRSSSRRRRRRRRQPPQQQQQQQQQQQRQQQQQPPPPPPPRQQPQRSSRRRRRSRPQQRRRQPPPPPPPPPPPPPPPPPPPPPPPPPQPQQQQQQPPPPPPPPRQPPPQRQPPPQQPPPPOOOONNNOOPPPPPQRQPPPPPPPPPPQPPPPQPPPPPPOQPPNNMNPONNNNNNONNNNOONMLLMMMNNMMNOOOOONNMMKJKLKKMNNMMMMNMLLMNMJJJJJKKKKKJJIJKJJJJJIIIJJJJJIJJIIIJJJJJIIIJJJHHJI@?@ABBABCCDDCCCCCBBBBAAABBBCCCCCCCBCDCCCDDDDCBCDDDCDDDDDDDDEEEEEEDEEEEDDDDEEEDDFDDEEGIHGGHHGGGGHGFGFFFFGGFFEEFHIHGGHHIIHIIHHHIIJJJJKKJJJJJJIJIIJHJJJKJJLJJJLLLKLKLKJJJJIIJLLKJKKLLKJKLLLMMMNOONMLMNNMMMLLMMMMMLLLLNNMMMNMONMMLKLLLLMNNOOPPQQPPPONNNOOPPPPOOONNOOONMNNNNNOOOPPNMNMNNLONNNNNOPOOOONOPONOPPPPQOPPPPQRQPQQPPPPPPPRRPQTQQRTRSRRRQQQQQRRRTRSSQSRQQSRRSRRRRSSTTSSSTTTTSSRRRSRRRQRSTSRSSRPPRTSRQQQRQRSRSSRRSSSRRSSRPPQRRSRRQQPRSSTSSSSRRSSSSSSSSSSSSSSSSSSTTTSRRSSSRQQQPRQQQQRQQQRRRRRRRQPPQQQQRRRQQRSSSSSSRRQQQQRRSSSQPPPPPPQQPPPPPQQPPPPQPPQQQQRRRRQQPPQQPQQQQPPPPQRQPPPQQPPPPPOOONNOPPPQPPQRRRQPRRRQQPPPQQPRQRQPPPPPPMMNOPONNNNOOONOPOONOOONMLLMNNOONMOPOOONMKLMLKLMLKMONNNNMNNMLLMLJJJJKKLLLKKKIJLJKKJJJJJJJKKJJJJJJJJKKJJJJJJLJHIJI@?@ABBAACCDDCBCCCCCBBBBBBBBCCCCCBDBBDCCCDDDDCCDDDDCDDEDDDDDEFEEEEDDDDEEEDDEEEDDGDFFEFIIHHJIHHHIJHHHFEFFGFFFEEGIJHGGHIIIHJIHHIJJJJJKLLKJKKJJJKIJJJJJHKJJMLKKLLKKKKMKJJJJJJJKLMMLLLLKJKMMLMNOPONNNNMOPNMMMMMMMMNNNMMNNLLMNMPOMMLKLLLMNONNMMNPPPQRPONNOPPPPPPPPOPPOPONNOOOONNNOPONOOPOMPOPPONNOPPPPLNPOMNPPPOPNPPPPRRQPQRQPPPONOQQNQUTTTURRSSRQRSRRRQQUSTSRTSQRSRRSTSRRSTTTRRSTUUSRRRSTSRQRQRSSRQRTUTSSSRSTRRSQQRQQRRRSSSRRRTTRRSSRSRRSRQRTRSSSTTTURSTTSSSTTSSSTTTSSSTTTSRRSTTRQQPPQPPQRRQPQRRSSRRSQQQRQPPPQRSUUUTSSSSRQPQRRRRRSSRQQQQQQQQPPNNPQRPOPPQPPRRRRRRRQQPPPPPPQRQPPPPPQRQPPQQPPPPPPPOOOOPPPRRRQRRPTRQSSQQRRQPPPPPOOPPPQQQPSQPPPOOONOOONNOPPOOOOONLMMNNNOPOPPPPPPPNNOPNKLMLKMOONNNNNNMLKLLKKKKKKLLLKKKIJMKKKJJJJJJJJKJJJKJJJKKKJKKKJKMKIJJIBBBBBBAAAADACADCCCCCBABBCCA@ADDDCBACDCBDDDDDCDDDDDDDDEDCCDDDDDDEEDDEFFEDDDDDEFFFFHHGGGHHHGIJHHJJJIHGHIIHHGGFHJJJJJJIJJJHIIHHHJJILJJJJJJJKKLLLKJJJJKKKKKKKKKLMNNLJJJLNNLMJJKMLLNMNMLNLONLNLKMOPOONNNNMNNOONLNNPNMMNOONMNONNOONMMMNNNOOONMNNPPPQRPOOPPPOMOPPRRPPOPPPPPPPPPOPOPPPPOPPPOOPPPPPPQQQQPPPNNPPPQPOPPPPPPQQQPPRSPPPPPPPQPQSTTSRSSSSRRSTSRRSSSSSSSSSQSQVSSUTSSSTSRRSUUTSSSSSSSSSRRTTTTTTSSTSSSSSSRSSTTSSSRSTSSTUTTVTUUTSRRQRSRRSTTTTUUVUUUSRQSTSRTVTTTUUUTSSSSSSRRTUSRRTTSSTSSSSSSRRRSSRRSSSRQQQQRSSSSTTTSTTTTTRSTSSRSTTSRSTTRQRRRRRQQQQQQQQRRQQQRSSRRRQQQPPQRQPPQSSRSSRPQRQQQQQQPPPPPPPPPQRPRPSPPQQQRRRRQQPPPPQQPPPPPPQPOPQPPPPQQQPPOOONNMMNOOOOOOOOOOOOONOPPOOONNOPPOOOONONLLNOOONNMMMMMLLLLKJJJIJJJKLKKKKLLLKJJJKKJJJLLLKKJKKKJKKKKJJJJABBBBBBAABDBCBDCCCCCCCCCACCCDDCCCCBCDDCCCDDDDDDDDDDDDDDCEEEEDDEEFFEFGGFEDDEEFFFFGGGFGHHHIGHJIHIJIIIIHHHHGFHGHJIJJJJIJJJIJJIHHJJIJJKMLKKKKKLLKKKKJJKKLKLLKJKKLMMKKLLLMLLLLJKLLLMMNMMMLNNMONMNOOOONNMNNNNOMNMOOPNNNNOOONNPNNOPONNNOOOOONNMNNOPQRSQOOPOOOOPPPQQPPOPPPPPPPPPPPOOPPQPPPPOOPPPPPPQPPONNOPPPONPPPPPPQPPQQRQQSSQRRQPPPPPSSSTTUTRSSSRRSSSSSSTTTSTTSSRSTSTUSSTSTTSTTUUSSSSSSSTTSSSUTSSSTTTUTRSTUSQTSSSSSTSTTTTUVUUVTTTSSRSRSSSRSTTTTTTUVVVTRRSUTSTUTSSTTTSTTTTTTSSTUSRSTTTTUTSTTSTSRSSSRRRRSSSSRRRTTTTTTTTUTTUTSSTRRRRSSRQQSTTSSSSSRRRRRRQQQRRQQRSSRRQRRQQQQQRRQQRSRRSTRPQRSTTSRQQPPPQQQQPRRPQPSRRSSRRRRRQRRRRQRRQQQPPQRQPPQQQPQQQQQPPPPPPOOOONNOOOPPONNOOPPPOOOOPOPPPPPPPPPPNMOPOOONNNNNNNNNMLJJJJJJJKMLLLLLMMMLLLMLLKLLMKKKKKKKKLKKKJJJJABBBBBBB@BDCBBBCCCCCCCDDBCDDDDBCBDCCDDDCCCDDDCCDDDDCDDEDEDDEEEEFGGGGGGGFHGGGFEDDHGFFHHHHJGGJJIIJIIIIHGHIGGIIJJIJJJKJJJJJJJIIIJJJIJLMLKKKKKLKKJKLLKKLMLLNLLLLMNNLMNNMMLLMLKKMLLMMMNNLLMNNOOOOONOOOMMOONMNMNNPOONNNOOPONNONOOPPOOOPPPOOOOONNOPRTTRPPPPOPQRPOPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPQQPPPOMNOPPONQPPPPPQQPPPRRRRSRQQQQPPQSTTTTUUTRSSSSRRSTURRTTSSSTSURURSUTSSUTTTSTTUUTSSSSSTTUTTTUSSSTTTTUTSTUVTRSSTTTTTSTTTTVVVVWUUTSSSSSTTSSSTTTTSTUVVVTSRTUUTUVUTTTUTTSSSSTTSRTUTSTUUTUUUTTTTTTSSTSSRRSSSTUUTSTUUUTTTTTTTTTTTSSSRRRRRRQSTTSSSSRRQQRRRRQQQQQQRRSRQQRRRRSRRSTTTSSSRSTSQRRTVVTSRRQQQQRSRPQRQQQRSSTSRRRRQQRRRRRRSRRRQQSSRRQQRRRQQQQQQPPQQPQQPONNOOPPPOMMNOPPPPOOPPPPPPPPPPPPPOOOPPPPOOOOOOMLLMMLKLKJKJKMKKLKLLMMMMMMLKKKLLKLLLKJKLLKKKJJKJABBBBBCC@BCDBBBBCDDDCCCCDDDDDCCDBDDCDEDDDDDDDCCDDDDDDDEFEDDEEDDEFGGFFGGGFFGHHGFGHHGGHHHIIHHIIHHIJJIHGFHJJIJJJJJJJKKKKKJJIIJJJJJJJJKJIJJKKLLLKJKLMLLMMLMNMMMMMOOMNOOMMLMMLLLMMMLLMONKMLNOOOOOONOOONNOONMLNOOONNOOOOOPONNNOOOOOPPOPPPPOOOPONOPRTTSRPSQPRTSPOPPPPPPPPPPPPPPPQPQQPPPPPPPQPPPQPPPQQQQPONOPPPRPPPPPQQQPPQRRRRRPPPPPPRTTVVVUTTTSSSTSSTUUSRSTSRSRTVSUQRVTSTVUTSSTTUUTTTSSSTUUTTUTTTUVUUTTTUUUUUUSSTUUUTSTUTTUVVVWUVVUUTTTTTTTTTTTTTTUUUUUTSTVVUUUUTSSSSSSSTUUUTSTUTSTUTTUVUTUUTUUTTTTSSTTTTUUUTTSTUUTTTTSTTTTUTSSSSRRRRSSSSSRSTTRQQQRSSRRRRRRQQRSRQQRSSSSSRRSUTSSSSTTSSTTTUTSSSSRRRSSRQQPQSRSRSSSRRQQQQQRRRRQQRRRQQRRSRRQQRSSRRSRQQQQQQQRSRPNOPPPPOONMNOPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOONNOOMMMMNNMMNLMMMMMNNNNMMMMMMMMLLLKJJKLKKKKJJKJBBBBBCCCBCBDCDCCCDEDCCCCFEDDEDDDDDDDDDEFFEEEDDDEFFFDDDDEFFFGEDDEFGGFEFGGFFGHHHHHHIHHIIHIIIIHHGGGKJHHGGIJKJJJKJJJJJJJKKJJIIJJJJJJKJJIHJJKMMNNLKLMMMMLLMNNMMMMMNNLMNMLLMMMNMLMMMMMNONKMMOPPPOOOOOOOOOMNONLNOOOOOPPOOPPONMMOOONOPPPPPPPPPPPOOOPQRRSSRTSQSSRPPPPPPPPPQQPPPPPRSQPPPQSQPPPPPPQQQQPPPQQQPPPRQPQPOPPPQQQQQQRSRQRRQPPPPQRUVVVUTUUTSSTTTTUUUTTSSTTTVVSTTSUUSTVUTTUTTTUTUUUTTTTTTUUTUVVVUUUSUVVUTUVVUUUTUVUUVUUUVVVWUVVUUTUUTTTUUUUTTTUUVUUVUTUVVUUVUTTSSSSSTTUVVUTTUTTUUTTUVVUVVVVVVUTTTTTTUUUTTTTSTUUUUTTTTTTUUTSSSSSSSSTUTSSSTTTTSRSSTSSSSSSRRRSRRRRRSSSRRRQRTTSRTTTTSSUUTSSSSSTRQRTTRQRPQTSTRSSRRSRRRRRRSTSQQRSRQQRRRRRRRRSSRSTSRQRRQQQRSRQPPPPPOOOOOOPPPQPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOOONNNNOPMMMLMNMMNNNNNMMMMMMMMLLLKKKLLKJKLKLLKCCCCCDDCCCBDCDCDCEFEDDEEFFEFGFDDEDEFDDEFEEFFEDDDFFFEDDDEFFGGFEEFHHHFEFFGIIHHHHGFIJJJJJJJIJJHHHGHJJIIIIJJLKJJKKLKKJJJJKKKKJJJJIJJKJJJJKKKMNNNMLLMMMMLLNNNMMMMMNNMMMLLMNMMONLKLLMNOONMNOPPOOOOPPPPPPOMMOPOOOPOPPPPPPPPPNNNPPOOOPQPPPQQPPPPOPOPPPPRQPSSRSSRRQQPPQPPQQQQPPPQSSQQPPQSSQPPPPQRRRRQQQPPRRQQRPPQRPPQQQQRRRQRSRQRSRQQRRSSUVVUUVUUTTTUUUTTTUUUTTUUVVSRSVTTVTTUTTUVVUTTTUVVUUUUTTUVVVVVVUUUUUUUUUUVVVVVVVVVVVVUVVVVWUVVTUUVVUTUVVUUTTUUVVVVVVVVVVUUVVUUUUUUTTUUVUTTTUTTUUUUVVVVVVVVVVUTSSTSSTUVVVUUTUUVVVUUUTTUUUTSRRSUUTTTUTSSUUTTUUUUUTSSTSSSSSSSRRRSSSSSRRRQRTUUSTUTTTTVUTSSTTTSRQRTTRRTQRUTTSTTSTTTSRSSSSTSQQSTSRRRSRRRSSSSRRSTTRRSSQQQQRRQQRRQPPPPPOPPPQQPPPPPQPPQQPPPPPPPPPPPPPPPPPPPMMNNNNNOMNNKJLKMMMMMNNNNMMMLLLLLLKKLLLLKKKLMMMMLDCCCCDDCCCBDDDDDDEFEFGGFEEEFGFEEFEFFDDEEEEFFFEEDEEFFFEFGFGGGGGGGHHHGFFGHHHGFHJJIJKJJJKJIIJJIIIIJJJJJJJJKKLJKKKMLKKKKKKLMLLKJJJJKLKKLLLMLLMNNMLMNMMMNNNNNNLMNNNNMMMMMOONNNNLLMMMOPOOPOOOPNOOOPPPPPPOOOOPPPPQPPPQPPPPPPOOOPPPOPQQPQQQQQQPPPPPPQPPQPPRRRSRSSRRPPQPPQQQQQQQQQRQRQPPQRQQQQQRRQRRRQQQQRSRPPPPQRPQQQRQQRSSSTSRSRSSSTUUVUUUUVVVUTUVVUUUUUUUUUUUVVUTTUVUUVUUUTUVVVUUUTUVVUUUUUUUVWVVVVVVVVVUUUUVUUUVWVVVUVVVVVVVVWVVVUUUVVVUVVVVVUVVVVVVVVVVUUUTUVUTTUUUUUVVVVVVVUUUUUUUVVVVVVVVVVVUTTTUTTTUVVWVVTUVVVVVVUTUUVUTTSRSUVUUUUTSTUUUTUUUUUTSSTTSSSSSSSSSSSSSSRSSRSTUURTTTTTTUUUTUUUTSRRRSSSSSRSUTTSTUUTTTTTTTTSTSSSTSSRRSSRRRSSSRRSSTSSSRSSSRQQQQRRRQQPPPPOOPQQQPPPPPQPPQQPPQQQQQPPPPPPQQPPPPPPPPOOONNOOLLNMONNNOOOOOOOONMMNNMLKKLMMMLLLMMMMLDCCBCCCBCCCDDCDDDEEDEGGFDDDDEDEFFEEEDDDDEFFFFGFFEEFGGGGIIHHGHIIHHGHHGFGHIIGFHKKJJJJIJKJHIIIIJJJKIJJJJKLLKMKKKJMKJKLLKJKMMLLLLKKMPNMNNMMNLLMNMMNONMNOPONNMLLNNMMMMMMNONMNMNMNOONPPNNPNONOOOOOOPPOPOPQPOOPPQQOPPQPPPPPPOOOPPPPPQQPRQQRRRQPRRQQRQPQPPQQQQPQSRSQPRQPPQQRSRQPPRQRQPPQPQQRRRRQQQQPPPQQQSRQRQPQQPQPPSRQSUUUVUTVTUVUTUUUUUVVVWVVUVVVVVVVVUUVVUUVUTVWVVVVVVVUUUVUVVVVVVVUVVVVUUUVWVVVVVVVVVVVUUVVUUVVVVVVVWWVWWVVWVXWVVVVVVVVVUVWVVWVVVUUUVUUTTTUVUUUVVVVUUUUUUUVVVUUUUUVVVVVVVUUTUUUUVVVVUUVVVUTTUVVUUUVUUUVVUUVUSSTUUVVVUUUUUUVUUUTTSSTUTTTTSSSSTTTSSSSSSSSTTUTQSSSTTSSUUUUUTSSTTTRSTSQQSTTTTTUUTSSTUUUTSSTTTTRSRRSSRRRRRSRRSTTSTTRSUUSRQPQRRQQPPPPPOPRQQQQPPPPQPPQQPQQQQQQQPPPPPQQPPPPOPPPPPPOOOONOPNNNNOOOOOOOONMMMMNPNLKLMNOMLMMMMMLDDCDDDDDDCCDDDDDEDDEFFFFEFEDDEFGFEEEEEEEDGGGFHJIJHGGFDFIJJIHHHIIIHHHHHIJHHHIHIJJJJHIIJIJJJJJJJJJIIJJJKKKKKJKLKLKJJKKLLMMMMMNMLKKMNMMLMNNONMMNNNNNMMNONNNNNOONMNNNNNNOOPPONNOPOOOOPOPNNMNOPPPPOPOPPQPPPPPPPPPQQQQPPPPPPPPPQPPPQQQRSSRRRRRRQRRQPQPRPPRRQPPQRRQPQQPPQQQQRRRRQPRRPPRQQRSRRRRSTTSRTTSQTSSSRSTSSRRRSSRSUUUVVUUVVVVTTUUVVVVVVVVVWWVVVWVVVVWVVVVVVVVVVVWWVVVVVVVWWVVUUUUVVUUUTUVVVVUVVVWVVVVVUVVVUUUUUVVVVWWWWWWWVWVUVVVVVVVWTVWVVVVUUUVUUUTVTVUVUUVVVVVVVVUUUVVVVVUUVVVVVVVVVVVUUUUUVUUVVVVVVTSSVVVVVUVVVVVVVVWVVUUUVVVVUUUUVVUVVVTTTSSUUVUTTTTUVUSSUVUSSSSSSTUTUTRSTSTTUUUTSSSSSSSSTTSRTUTTTTTTTSSSTUUTSSSSSSRRRRRRRRRQRSRRRRSSSTTTTSTRRSSRRRRPPPQPPQRQQRRRQPPQRRRRSRQPPQQQPPPPPPQPPPPNPPPPPPONOPPQQPPPOONOOOOONNOMKLOPOMMMMNNNNNNMLLMDDDEDCDDDDDDDCDDDDDEEEEEFFEEEFGGFFFFFGGGGGFGFGJJJHGGFFHJJJJIIIHIIHHHHHHJIHIIIIIHIJHIJKJLKKKKJKKKKKJJKLLKLLJKLKLLJKKLLLMNNNNNNMMLNMMNMLMPPONNOOOONNNOOOOONNNONOOOOOOOOPPPPPPOOPOOOOOPNOOPNPPPPPQQQQQPPPPPPPPQQQPPPPPPPPPPPRQPQRQQRSSRQRSSTSSSRRQPRQQRRQQQQQQRQQQQQRQQRRRRRQQRRQQRRQQRSSSQPQRQRSTTTVTUUTSRRSTTTTSSSUUUVVUVUUVVUUVVVVVVVVVVVWWWVWWWWVVWWWVVVVWWWVVVWVVWWWVVWWVVVVVVVVVVVVVVVVWUWVVVVVVVVVWVVVUUUUUVVVVWWWWXWVXWVVVVVVVVXUVWVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVUUVVWVUVVWVVVUUUVVVVVVVVVUUUVVVVVVVVVVVVVVVVVVUUUVUVVTUVVVVUTTTTTTSTUUTTTTTSTTUTVUSSUUUUVUUTSSRSSSSSTTSSUUTUUUUTTTTTUUUTTTTTTSSSSSSSSSSSSSSRRRSSSTTTTSSSSSSRRSTQPQRRRRRRRSSRQPPQRRRQQRRQQRRQQPPQPPPPPPPQPPPPOOPPPPPPPPPOOOOOOOONNNNNMMNNNNNMMMNNNNNNMMMEDEHECDDEFFECCDDEEFEEDDEGGFFGGGHFGGFGHHFHGGIHGJJHGFFGGGHHHIIJHHIJHHIIIIJJJJJJJIHHIHJJLKLKLKJKKKKLKKKLMMMMLJLMLMMKLLLLLMNNNNNNNNMNMNOMLMPPOOOPPPPOOOOOPPPOMMNOOPOPOOOPPPPOPPPOPPOPPPPOOPPOPPPPPSSSRQPQQQQQQRRRQQPPPPPQQQQPQQPQRQQRTTSSSUVUTTSRRRPSRRSSRRRRRSTSRSTRRRRSRRRSRRRRRRSRQQRSTTSTTUUUUVVVVUVVUSRSSUVUTTUVVVVVVUVSTUVUVVVVVVVVVVWWWWWWWWWWWWWWWVVVVWWWWVVWVWXXXWUWWWWXXWVVVVVVVWWVVXVWWVVVWVWWVWVVVUUUUVVVVVVWWWXWWYXVVVVVVVVXVWWVWWVVVVVVWWVVVVVVVVVVWWVVVVVVVVVVWWVVVVVWWVVVVVVVVVVXXVUVVWVVWVVVVTUVVVVVWWVVWVVVVVVVVVVVVVVVVVUUUVVVWVVVVVUUUTTTTTTTUTTUUTTTTUUTVVTTUUUTTTTUUUTSSSSTTTTTVVUUVUUUVVUUUUVUUUUTTTSTTTTTTTTUTSTSRRTSTTTTTTSSTTSRRSTSRRRTTTSSSTTSQPPQRRRQQQRRRSSRQQQQPPPPPQPRPPPONNPQPPPOOOOOPPPONNOONMMMNNOLMNONMMNMMNOOONNFDEHFDECEFGEDDDDDDEDDDEEHHGFGHHHGGGGHHHGGGHJJHJJJJIIJJIHHHHJJIIJJIHIJJJJJJKLKKJJJJJJKKKJKKJJKKJKLLKLMNNNMLJMNLMNMMMMLLMMMNNNNONMMOONMNOPOOOPPPPPPPONNOPPPNNNOOPPPOOOPPPPOPPPPPPPPPPPPPPPPRPPPQRRSSRRRRRQQQQQQPPPPPQQQQQRPQPPQRRQRTUTTTTTRSTSPPRRRRRRRRRRRRRSRRSTSSRRSSRRSSRPQRSTSRRRQRTTSTTSSSSTVVTUUTTTTTUVVTUVVVVVVVVVTTUVUVVVVVVVVVVWXWVWWVVWWWVVWWVVVWVVVWWVWVWXXXWVWWWWXYXWWWWWWWWWVVXVWXWVVWVWWVWVVVVVUUUVVVWWWWWXXWXWVVVWWVVVYVWWWWWWWWWWWXWWVVVVVVWVVWVVVVWVUTVVWXXWWVVWXXWVVVWWWWVWXXVUVVWVVWVWWVUVVVVVVVVVVWVUVVVVVVVVVVVVVVVUUUVVVWVVVVVUUVUUUTTUUUUUUTTTUUUUSVVVVVVUVVVVUUTTTTTTUTTTTVVVVVVTVVVVUUUUVVUUTSSSUUUUUUUUUUUTSSSTSTUTUUUTSTTTTSSTTTRQTTSSSSTTSRRSSRRRRRRRRSSSSRQQQPQRQQQQRQPPPPPPPPPPPOPPPPPPPOOOOONMMOPOMNOONNNNMMNOPONMDDEFEFHDDEFFEEEEDDDDEFHHIHGGHHHIHGGHIIIJGHHIHHJJJIHGHIIHHHHIJHHJJIHJJJJJJJJKKKLKKJJJKKKKLKJKLJJLNNMMMMMMMLKMNLMNNNNNMLMNNNNNOOONMOOOOPPONNOPPPPPPPONNOPPPPOOOOPPPOOOPPPPOPPQPPPQPPPPPPPQQQPPPQRQRSSSRRRQRRRRQQQQPQRRQQQQPQQQRTSRTTUTUUTSRRSSQQSSRRRRRQQRRRRRQRSSTTRRSSRRRSRPPSTTTSRQPQRSTTTTTSTTTTRSUTUUUTUVVVVWWVVVVWWVVVUVVVVWWWWVWWVWXVVWVVVWWWVWWXWVVWWVVWWWVVWWWXXWVVVVWXXWXWWWWWWWVVXVWXVVVWVWWVWVVVVVVVUUVVWWWWXYXWXVVWWXWWWVYVWWWXXWWXYXWXWWVVVVVWVVVVVVVUWVVUVWWVVWWXXXXWVVWWWVXXWWXWVVWVVVVWVWWVVVVVVVVVVUVWWVWWWVVVVVVVVVVVVUVVVVVVUVVVVVVVVVUTTUVVVVVUUUUVVURTVVVWWVWWXWVVUUTTUVVUTTUVVUVVVUVVVUUUUUUVVUUTTTUUUUUUUUTVVUSTUTTUUUUVUTSSTUUUUTTTSQSSRSSSTTSRSTTSSSSRSSRSSSSRRRRQQRRQQPQQPPPQQQQQQPPPPQPPPPPPPPOPPOOPPOOONNNNOOONNOONMLDEFEDEGEBDEEFGFEFFFEFHIIIHGHIHHIIGGIJHIJFHIJIIJIKJIHHJJJIIIIIIJJJJJJKJKLJJJKKLLLLKKKKKMLLKJLMLKLNNNMLLLLLLKMNMMMNOONMMMNNNOOOOONONOPPPPPOOPPQQQQPPOOPPPPPPPPOOPPPOOOOOONPPPQPPPQPPPPPPQRPQPPQRRQQRRQQQQQRSRRRQRRQRSRQQQQQRRRTUTSTTSTUVVUSRRRRSTSRSSRRRRRRSSRRSTSSTSRSSRQRSSRRTUTTSRSTUUTTTTTTTTTUTQTVUUTTSTVWVUVXWWVVWWVVVVVVVVXVWWWXXVWWVVWVVWXXWWWXXXWVWXXWWWWWWXXVVWWWVVVWWWWXXWXXWWWVVXVXXWVWXWXXWXWVVVWWVVVWWWWWWXYXWXWWXXXWXWVXVWWVWWVVXXXVWVWWWVVVVVVVVVUVTXVXWVXXWWVWXXXWVVVWWWVWWWWWWVVXWWVVWVWVVVVVVVVVWWWWXWVXWWWVVVUVVVVVVVVWWVVVVUVVVWXWWVVVUVVVVUVVVVVVUUUTUVVVVVVVVWWVVVVVUVVVVUUVVUUVVVVUVUUUVVVTTUVVUUTUTTTUUUUTVVUTUUTTUUUTUUTUTTTTUTSSTTSTSRSRSSSRRSTSTUTRRSUSSSSSSSSSQPQRRRPRRPPPRRQQQQPPPQRQPPPPPPPPPPNNPPPPPOOOOPPONNOONNMDFFEEDFEDDEEEFFEFGFEEFGFHGGHIHHJJJIJJHIJHIIKJJJIJJJHHHJJJKKJJLLMKJKLLKLMKJKLLMMLLKMKJJLLKKKLMMMLLMMLLLMNMMLMNNOOOOOONNNNONOOPOONOOPPPPPPPPPPPPPPPPPPPPPPPOPPPPPPPPPPPPOOPPPPPPPQRPPPPPQRQRPPRRRQQQQQQRRRRRRRQQQQPRSSRQQQRSTTUVUTTSRRTVVUTSRSSTTSSTTTSSSSRRRQQRRRSTSRSTSRSTUTSUVUTTUVVWWVVVVUUVUTVUSUVVUTTSTVVVVVWVVVUVVVVVVVWVVXVXWWYXVWWWWWVVWYXXWXXWWWWWXXWVVWWWXXVVVVWXXWWWWWXXWWXWWWWVWVXXWWXYXXXWXWVVVWWWWXXXXXXWWXYXYXWYXXXXXVWVVVVXXVVXXXWXVXWWVVVVVWWVUTWUYVYWVXYZYWVWWWXXXXXXXXWWWWWWVVXWXVVWVWVUVVVVVVVWXXXWVUWVVVVVVVVVVVVVVVWWWVVVVVVVWWVVVVVVVVVVUUVVVVVVVVVVVWVVVVWWWVVVVVVVVWWVVVWVUUVVVVVVUUUVVVTTUUVVUUUTTTUUVUUUTTUUUTTUUUTTTTVUTTTTTSTSTUTTSSSSSSSSSSRTUTRRSUTSRSSTTSSQQRRRRQTSRRRRRRQQQPPPPQPPPPPPPPQPONOPPPPPPPPPPPNNNOPPOOEFDFGFGFFGGFEFFEFGHFFGHHFFGHIHHJKJJJJIJJKJIKLJKKJKKJJIJJJLKIJKLKLKLLLKLMKKKLMMMLMLMKJIKKJKLLLOOLLMMLLLNOMMLNOPPPPPPPOOOOOOOPPONNOPQPPPPOPPPPPPPPQPOPPPPPPOPPPQRRPPPPQQPPPQQPPQRQRQRPRQSSRSRRRQQPQQQRSTTTTTTTSSSSPQSTSQQQRTUUVVVTVVUUVVVUSSSSSSTSSTTTTTTSTSRSSRRRSUTRSUTRTUUSSTVVUUVWWWWWVWVVVVVUVVTVVTTUUTUVVVVVVVVVVVYYWXWXZXWYXYXXZXVVXXYXWWXZYXXXWVVWXXXXWVVWVVVWWWWWWXYXWWWWXWWWWWWWVVVVXWWWWXWWVVVVVVVVVVWWXXYYXXXYZXXWWXXXXYXVVUVVWYYXXYYXXYWYXXVVVVVVWVVVXUZVWVVYYZYVVVWWXXXWWWWXYXXXXXWVWWXWWWVXVVWWVWXWXWXXXXXXVVUUVVWWWWWWWWWVVVVVVWVVVVVVVVVXVVVVVVVVVVVVVVVWVVVXWWXWVVVVVWXXWWWXXWVWWVVVVVUUVVVUVVVVVVUUUVVVVUUUVVVVVTSTVUTUTTUUUSTTUUUUUUUUUSTUTSTTTTTTTTTTSUUTSSTUTSRRSTSSSSTTSRSSRQQRQPPQQQQQPPPPQQQQPPPPPPPPQQPNNOPPPOOOOOOPPPPPFFDFGEFGGIHHHHGFEFGGGGGGFGGHIIIHJJIIIJJIMJJKLKJLJKLLJJJJJJJJJJJKKLLLMLKKLKKLLNNKKLMKKKJKJLLLMNNNMMMMMMMNNMLMOPPPPPPOOOOOOOOOOPPOPQQPPPPPPPPPPOPPPPPPPPPPPPPPPPPPPPQQQQPPQPPPPPQQQQPQQSRRRQRSRQRSRSRQRSTUTUUUUTSSQRSSSRQQRUVVVVVVVUVVUUURRRRSSSSSTRUSTTUTUTSRRRRRRSSSTTTSUUUUSSTVTUVWWWWWWVVVVWVVUTTTTTTTUUTTVVVWWVVWXYYYXXXWYZYXXWXXYXVVYYYYXXXXXXXXWWWWXZZWVVWWVWWWWWVYXVXWXYWWXXWVVXVVVXXVVWXWVWXWVUVWVVVVVWWWYYZYXXYXZYYXXXXXWXYXVUVVZZYXXXXXXYWYWVVWVVVVVVVVXVZVWVWXZZYWVVXXXXYXXWXYXXXXXXWXXXXWWXWWWVVWXXXXXYXWXXXXVVUUVVVVWWWWWWWVVVVVVVVVVVVVUVVWXWVVVWWVVUVVVWWXXWWXXXXXWVVVWXXXWWWWWWVVVUUVVVVVWVVUVVVVVVVVVUUVUTVVVWWVVTTUUUVUTUUUUUUTUUUUUTUUUUUUUTTUUUUUUUUUTTUTSTTUTTSSSSSSRSTSRQQRQRSSRQPPQPPPPPPPQPPQPOOQPPPQRRPPPPPPOOPPPPPPPPPPGGEHIHGGHJJHHHGFFGGGGFFEGHHHIJJIIHHHIJJJKKJJKKKKJJMMLKKJJKLLLLMMMMMMNMMNMLLMLNNLLKKKMNLLLMMLMNNNNMLLNOOMNLLMNOPPPOOOOOOOOOOOOOPOPQPPPPPPPPPPPPPPPQPPPPPPPPPPPPPPPPQQPPPPRQQQPPQQRQPRPRRQRQQRRRSTSSSRRRTTTUUUTTSSUTSSSRRRSTUUVVVWVUUUTTTSTTTSSSSRTRUSTTTTTTTTUTSRSTTTUUUUUTTTSSTVUUVWWWVVVVUUVVWVUUTSSSTUUUTUVVVXWWVWXXXWWWWWWXXWXXYXXXVWYYYYXXWWXXXXXXXYYZ[YXXYYYYYXXWVXZYYYYXVVWXWVVVVWWXXWWXXXXYYYWWXXVVVVWWWXYYZYXXYYZYYYXXXYXXXXVVWWYYYXXXXXWXVXWWWWVVVVWWWWYVZVWWWXYZ[[ZYYXXYYYYYYZXXXXXXXYXXXXXXXWXWWXYYXXXYXWXXWXVVVVVVVVVWXXXXXWVVWWWVVVVVVVVVWXXWWWXYXWVVVVVXWXXWXYYYYXWWWXXXWWWWVVVVVWVVVVVVVVWWWVVVVVVVVWWVVVUUVVWXXVVVVVTTUVUUUUUVVVUUUVUUUUVVVVVVVVVVVVUUUUUUUTTTUUTTTTTSSSTTTSRQPPSTTTSSRQQQQQQQQQPPPQQPPPQPPPPQQQQPPOOPPPPPPPPPPPGGEHJIIIIJJIHHHHIIIIHHIIJJJIIJJJIIIJJJJJJLKJJLLJJKNONMLKJKKKJJJJLMNOONMNMLMMMNNMNMLKMOMMNONMMNNNNMLLNOOMNMLMNOOPPPPPOOOOOOOOOPPPPPPQQQQPPQQPPQQPPPPPPQRQPPPPPQQQQRRRQPPPPPQQRRSSRRQSQSRRSRQSTTTTRSTSRTUTUVVVVUVVVTSTTSSUTTSSTTVWWVVVUVVUTUTSSTSSSSUTUUTUTTSTTTTSTTUUUUUUUTTTTTTUVWWWXXWVVVVVVVVVTUUUTTUTTTTTUUUVXWWWXXXXXXXXXXWWYXYYYXVXXXXYYYXXXXXYYXYZZ[[YYYYXYX[ZYXXYYZYZYWWWXXXXXWVXWWWWXXYYZYYYYYYWWWWXYYYYYYZYYYZZZYXYYYYYXXXXXXYXZYYYYXWXWWVXXXXXWWWWWWXXYVYVWWWWYYZZZZYYXXXXXXWWXXXYYYZZXXXYYXWXYXXYZYXXXXXXXWVWWVVWWWVVVWXXWWXXVWXXWVVVVVVVXYYXXXWXYZYXVVVVVWWXXWXYYYXWXXXXXXXYWWVVVVWXWXXVVWXWWWWVVUVVVVWWWVVVUVVVWWWWVWWVUUVWVVUTTUVVVVVVVVVVVVVVVUUVVVVUUUUUVVUTTUUUUUUUTTSSTSSSSSRQRRRRRRQQRRRRRQQQQPPPPPPQRQQPPQQQRQPPPPQQPPPPPPPPHHFHJIJJIJJJJJJJGHHHGGHIKKKJIIJJJJJKLJJJJLKJKMLJKKMOOMLLOONMLLMLKMNNNMMNMLNNMNONOONLMONOOONNNNNOONNMMMNPONMNOOOOPPPPPPPOPPPPPPQQQPPQPPPPPQQPPQRQPPPPQRRQPPPPQRRSRRSSRQPQRRRRRRRRSSRTRTSSSRRSTTTTRRSSRVVUTUVVUUVVVTTUUSSUTSRRSSTVVVVUUUUTUUUTSTTRTTUTVUTUUTTTTTTTUUUUUTUUUUUVVVUUVVVVWXWVWWWWWWVVSUVVVVUSTUUTTTTUVVUUVVVWWWWXYYXWYY[ZZYXYYXXZZZYYYXYZZXXYZZZYYYYXXW[[YYZZYZXZYWYYYYYYZYXXVVWXXXYZZYYYYYYXYYXYZZYZYZZZZYZZZYYYZZYYYYYYYYYXZYYZYXWXWXWYXXYYYXXWWWXXYWZWXXXWYYYXYYZYYYXYYYXWWWWXYYZZXXXYYXXXYXXYZYYYYYXXXWVVWVVWWXXXWWWWWWXXWXXXXVVVWWWWYZYYYYXXYZYYWVWVVXWXXXXYYYYWXYYXXXXYXXWWVWXXXYXVVXXWWWVVVVVVVWWVVVVVVVVVWWVWWXVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVUUUVVVVVUTUUUUVUUUUTTTTSSSTTTSTTTTTUUTRSSRRRQPRRQPPPQRRRRRRRRQRQQQRRQPPPPPPPPPIIHIJIJJJJJJKJIKJJJKJJJIKKKJIJJJJJJKLKJJJKKKLMLKLKLMMLMMLMMLLMMMMNMLLLNPNMNONNOONOPNNOOPOOONOONOPOOPNLNPONNNOOOONNOPPPPPQQQPPPPPPPPQPPPPPRRPPPQQQQQQQQPPQQPPPQRRQRRSRQQQRRSSRRQQTTSTRSSSSSRRRSTUTSSSSVVSTTUUUUUVWVUVVTSUUTSSSRRTVVVUUUUVVVVTSTSQUUVUUUSUUUVVVVUTVVVVUTTUUVVVVVVVVVVVWYXVWWXXWWVVTUUTUVVTUVVVVUTUVUTTTUUVUUVWYZYXYZ[[[ZXZZYYZ[ZYYZYZ[[YXYZYYYZ[[ZXX[ZXYYYZ[YZZXYXYZZZZZYXXWXYZYZ[ZYYYYZ[ZYYXXZZYYY[[Z[ZYZ[ZZZZZZZYZZZYXYXYYYYYXXYXZZYXWYYYYYXXXXXXXZYYXYXYYZZZZZYYYYYZ[ZYXWWXYYYYYYYZYXXYZXXXYYXYXXXXXWVVXWWWXXYZZYXXXXXXWWWWXXWWWXXWYYYYZZ[ZYYYXYXXWWYXXZYZZZ[ZXWXYYXWWWXXXWWWXYZYXWXXWWVVWXXWVVVWWVVVWWVWWWXWVXXYWVVWVVVVVVVVWWVVWVVVVXXWVVXWVVWVVUVVVVVVUUVVVVVUUUUUUUUUTTSSSSRRRRSTSSRRSSSRQQQRRRRSRQRRRRRSRPRQQQRQPPPPPPPPPPGIHJJJJJLJJJKIHJKJJJJJJJJKKJJJKKKJJKKKKKKKKLMMMMNMMMLLMMLNNNNOONNNMMMMNONMNONNONNNOOPPNNOOOOPONOQOOPPMMPOOOPPPPPOOPPQPPPPPPPPQQQPPPQPPQQQRRQPPPQQQQRRRQQRRQPPQRRQQRSSRQQQRRSSSTTSSRSRTSSSTTTSSSTTRRRSUURUUUUUUUUVUUUTSTUVVVUUSRSTUSRSSTVUUUTTTSRUUVVUVVWVVVVWVVUWVVVVUUUVVVVUUVVVWWXYYWVVVVVVVVVUUUUUVVUUVVVVVVVVVUVVUTUUUVWYZYXYZ[[[ZYZZYYZZZZYYYY[[YYYZYYYZ[[ZYY[YXYYYYZYZ[ZZXX[\ZYZYYYYZ[[ZZ[[ZYYXY[ZZZYYZZYZY[[Z[ZYZ[ZZZZZZZZZ[ZYXXXYXXYYYYYY[[ZYWZYXYYYYYXXXXYYYXYXYYZZZZZYYYXYZZYYZYYYYYYYZZZZYXXYYXXXYYXXXYXXYXWXXXXYYYYZZXWYZYXXXWVWXXXWVYXWXYYZ[\\[ZYXWZY[ZZZYYZZZZZZZXWXYYYXXXYXXWWXYZ[YXXXXWWWWXWVVWXWWWWVVVVVWWWWWWWWXWWVVVVVVVVVWWVWWWVVVVXWWVVWWVUWVVUUUVVVVVVVVVVVUUUUUUVUUTTSSSSRRSSTTTSRRSSSSSSQRRRRSSRRRQQRRRQSRQQRQQPPPPQQQQQFHHIJJJJLJJJJIIJKJIIJJJJJKKKKLLKKKKKKKKLLLLMNMMNPOONMMNMNOONNOONMNNNONMNNMNONNNNOOONPPNMOPPPPONPPPOPPNOPPPPPPPPQQQQQQQPPPPPPQRRRQQPPPQQQQRRRQQQQQPQRSSSSRRQQQRRRRRRSSSRRTTSSSSSTTSRSRTTTSTUUTTSSTSSRSTTSTTTTTTSSSTTSSTUUVVVVVTTTUVUTTUVWUUTTUUUUVVVWVXWYWWWWWVVVVVVVVUUVVVVUTUVVVVVWWVVUVVVVVVVVVVVWWVVUUVVVWWVVVVVVVUTTWWWXXXXYZZ[[[ZXZYYYZZ[ZZYYYZZZZYZZZZZZYXYZZXY[Z[XXZYZ[ZYY[[ZYYYZZZ[[[[[[\ZZYYYZYZZZZZYZ[Y[ZZ[[Z[ZZZZZZYZZZ[ZYYYYYYYYYYYYZ\\[ZX[ZYYYYYYYYYXXYYYYXYYYYYZZZ[[ZZZZZZ[ZZZZZYYYZZZYXYZYYYZ[ZYYXYYYYYYYYYYYYYZZYXWYZZYYYXXXXXWWWZYXZZZ[[\\[ZZYXZZ[Z[[YYZZZYXYYXYYYYYYZ[YYXXXYZ[[ZYYXWWWYXXVVVWXWXXWWVVVVWWWWWXWVVWXWVWXXXXWXXXXXWVVVVVWXWWWXWVVVVVUUUUUVVVVVVVVVUUVVVVVUUUTTTSSSSSSTTTSRSSSSSTTSSRRRSSSRRRRRRRRSSRRRRQQPPPQRRRRIJHIJIJJJJJIIIJKJJJJJJIGJJKKLLKJJJKKLLLLLLLLMNMNOOOONOOOOPOMMNONNNNNOONNOMNPONOOOPPNOPOPOPPPPOOPPPPONOPPQQQQPPQQQQQRRRRQPPPPRSSQQRPPQQPPQQQRRRQQQPQRRSSSSSRRRRRRRRRSSSRRRRRRRSTUVUSTSUTTSSSRSTVVUVUTTTTUUUUUUTTTSUVTSUUTUVVVUUUVTVUTTTUVVVUUUVVVWVWXVXWXXYYZZYWVVVUVVVVVVVVVUVVUUUUVVVVVVVVWWWVVVVWXWVVVVVVWYYXXWVVWWVVVXXXXWWXZZZ[[ZZXZZZYZZZZYZZZZ[[[ZZZZ[[ZYXZ[ZXY\[\YY[XX[ZZZYXYZYYZYZ[\\\\\[ZZZZ[[ZXZ[ZYXY\Y[ZY[[Z[[ZZ[[ZZZ[ZZZYZ[ZZZZZZZYY[\\[[Y[ZZZZYYZZZZYXYZZZXXYYZZZZYZZZZZZZZZYYYZZYYXYZZYZ[[ZZZ\\\ZYXZZYZZZZYYYYYYZ[ZXWY[[[\YXXYYXXXWZYXZ[[[\[ZYZ[[ZYYZYZ[ZZ[ZZYXYZXYYYYYYXXYYYZZZZ[[[[YXWWWZYXXXXWVVWXWXYYXVWYXWXZXXVWXWWXWXWWWWXXXXWVVVVVVWWWWWVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVUUSRSSSSSTSSSSSSSSTTTTTTTTSRRRSTTSRSSRRRRRQQPPPQRRRRJIHIJJJIJJJIHJLKIJJJJJIGJKKKJKLMKKKKLLLLLLKLMNMMLOPNMMMLNNNNNOONMNOONNNOPPPPPPONOPPOPPPOPPOOOOOPPPPQQPPPPQRQPPQRSRQQQQRQPPQRRRQQQRPPRRQQQRRQQRRRRQQRSTSSTSSSSRSSRSSSSSSSTTTTUUTUTTTTTTUTUUUUTTTUUUUVVVVUUUUVTUTTTUUTUVVTUVVVVVVVVUUUUUVWVVVVVVWX[VWYXWVWWYZZWVVWVXWVVVVVVWVVVVVWVVVWVVWVVWWVVWWVVVXYVVWXWWXXXXYYZXXXYXXXZZYXXXYY[[[ZZYYZYYY[[ZZ\ZZZZZZZ[\\[[[[Z[ZZ\Z\\\\ZZ[[ZY[[[YXY[ZZZZZ[\\\\\\ZZ[[ZZ[ZZYZ[YY\Z[ZY\\[\\[[\\[[[[ZZYYZ[[[[ZZZZYY[[[[[[[Z[[ZZ[ZYZZZZYZZZYYZZZZ[ZYZZ[ZZ[[[ZYYYZZZYZZ[[ZYYZZZZ[\\\[[[ZXYZZZXYZZZYYYXX[[YZ\\[[YXZXWXYYYZ[[[[[[ZZZ[[[Y[[[ZYZYZ[ZXXZZYYYZZZYYXYYYYZZZZZ[[YXXXXYYXYYYXWVWXXWXYZZXWXYYXXXXXXXYXWXXXXXXXXXWVVVVVVVWXXWWWXVWWVVWXWWWVVVVVVVVVVVVVVVVVVVVVVUTTTTTTUTTTTTTTTTTUUUTSSSSSRRSSTUSSUTRQSRQQQRRRRJIIJJJJJJJKJJKLJJKJIIJJJKKKJKLMMLKKMMMMMMMMMNONMNOPOOONNPPOOOPONMNNNNOPPQQPPQQPOPPPPPPOOPPPPPPPPQPPPRQQQQRRQPPQRRQQQPQRRQQRRRRQQPRSSSSRQSSSRQRRRSRRSSSSSSSSTTSRRSSTTTTSSTUUUVUUVVVVVUUVUUUUUUUUUTTUVVVVVUVVVVVUUVUTUUVUUUVVVUUVVUUUVXXVUVVVVVVXZZVXZYYXXWY[[XVUVUWXVVUUVVVVVVVVVVVWWVVVVVXXXXYZYXXZZXXYXXYYZZYYYZYZ[[YXYZZZYYZZZZ[[ZZYYZYYYZZYZ[[[[[[ZZ\\\\\\[Z[[Y[Z\\[Y[[[[ZZ[[\[Z[[ZZZ[[\\\\\\\[[[[YYYYXX[\ZZ\Z[ZZ\\\\\\[\\\\\ZZYYY[[[\[ZZZZZZZZ[[[[[[[\[[[ZXXZZZYZZZYZ[[ZZ[ZYZZZZZZ[[\ZZZ[[ZZYZZZYYZ[\\[[\\\[\[ZYYZ[[YYXXXYZ[[[\\[[\\\[YYZYWXZYXZ\\\[[[[[[[ZZ[[ZZZZ[[\\[YYYZYXYYYYZYYZYYYYYYZ[[ZXWYZZYYXXXXXXWXXXXXYYZYYYYYXXZYXWWXYYXWWWXXXXVVWWWXXXWXXXWVWXVVXXXXXXXXWWVVVVVVVVVWVVVVVVVVVVUUTTUTUUUUUUUUUUTTTTTSSRSTSRSSSTVTTTSRRTTSRRRSSSJJJJJKKJJJKKJKKJJKKJJLMMLLLKLMMMMKLNOMMNLMMNOPONMMMNOONMOOOOPPPOOOONOOPQPPPPPPPNPPOPQPPPPPQPPPPQRPPQRRRQQRRRQPQRRRRRQQRSRRRSRRRSQRSSSTUTTTSRRRSSSSSTTSSSRSSTUTSSSTTUUUUTUVVVVVVVXWWVVVVUVVUUUUVVUUUVVVVVUVVUVUTTVTTVVUUVWXXVUUVVUUVVVVUTUUVVWWXZYWYZZ[ZZZ[[YVUUVVWVVVVVVVVVVXWVVVVWWVVWWWYZZZZZZZZ[ZYYZXZZ[[[[ZZZZ\\\YYZ[[[Z[[[[[[[[[ZYZZZZZZZ[[\[[\\ZZ\]\\\\\[\[X[[\\\Y[[[[ZZ[[\\\\\ZZZ\\\\\\\\\\\\\[Z[YWY\\[[\ZZZZ[\\[[[\\]\\[ZZYYZ\\\\[ZZ[[[[ZZ[[[[\\[\\[\[YZZZZYZZZY[\\[[[[Z[\\[[[[[\\ZZ\[YYYZZZYZ[\]]\\\\[[[[ZYYZZ[[ZYXY[\\\\\\\\]\\\[[\[Z[ZYY[\\\[[\\\\[ZZ\\ZZZZ\\\\[[[[[ZZZYYZZZYZYYYYYZZ[[ZYYZ[YYYXWWXYZXXXYZZYYYZ[[ZYYZYXXXYXXXXWWWXXXXWWXYYXXXWXYXVVWYVVXYYXXXXXXWWVVVWVVVWWWVVWWVVVVVUUVVVVVVVUUUUUVVUTSSTTSSSTTSTTTTTTUVUSRRTSRRRSSRJJJKKKKJKKKJJKKJJKMLLNNMLMNMLLNOMMMNONNOMNNNOPONONNOPPONMNOOOOPPPPOOOPPPPPPPPQPPPPOPSRQRSSRRRRSTRQQQRRQQPQQRRQQRRRSSQQRSRRRRRRSTQPRRRTVTTTTTSSSTTSSTTTTTSTSSUUSTTTUVVVVVVVVVVVVVXXXWVVVUVUUUUVVVWVVUUUVVVXWVXUTVVUUVWVVVYYYWVVWWXWWVVVVWVVVWXWXZYYZ[Z[\[\\ZXVVVWWWVVWXWVWWWXYXWWWWWXWWWVXY[[ZYYZ[[[ZYZZY\[ZZ[\\\\[\\[YZ\\\[[[\[[[[[[\[Z[[\[[[[\[[[\[\Z[\\\\\\[[\^[\\[[[Z[[[[ZZ[\[[\\[Z[[\\\\\\\\\\\\\\\\[YZ\\[\\[[[\[\\\[[\\]\[Z[[ZYZ\]\\[[[\\[[\[[[[[\\Z\\\]\[\\[[ZZZZZ[\\\\\\\\\\\\\\\\\[[\\YYZZZZYZ[\]]]]\\[Z\[Z[ZZZ[\[[[[\\\\\\\\\\\[\\\\\[[ZZ[\\[[[[\\\\[[[[\Z[[Z\\[[[\\\\[\[[ZZZZYZZZZZZZ[[\[ZZ[ZXYYYXXY[\YYYZ[[ZYYZ[[[ZZZXXYZZYWVYXWWXXXXYXXYZXWWWYYXVVWYWWWXXWXYXWWWWVVVWVVVWWVVVVVVVVVVUVVVVVVVVUTTUVVVUUTTUUUTSTTTTTTTUUTSRSTUSSRRSTSRJJKKKKKJKKKJJJKLJLMLLNNMMNNMMMNNNNNNNOONOOONNONNPOOPQPPNNOPPNNOPOOOOPPPPPPPPPQQPQPPQSRQRTSRSSSSSRRRSRRQQPPQQQQQQQQRRQQRRRQQRRRSSRSTUTUVUUUUUTSSTUSSSTTUUSUSRTUTUTTUUVVVVVVVUVVVVWWXXWWWVVVUUUVVVWWVVVVVVUWWUXVUVWVVWXXXXXWXYYXXYXWWXYYYWXWXYYXYZYZ[[[[\[[[ZYXVVVVWWWWWWYYYYYYXWWWVWXXYYXXXZ[[Z[\\\[\\ZZ[\[ZZ[\\\\\\\[Z[\\\[[[\[[[[[[\[Z[[\\[[\\[Z[\Z\[\]\\\\\[\]^\]]\\\\\\\\[[\\\\[[[[\\\\\\\\\\]\\\\[[\[[\\[\\\\\]\\\\\\\\[[[[Z\\\ZZ\\]\[[\\\\\\\\\\[\\[\\\\\[\\\[[[[[[\\\\\\\\\\\\]\\\\\\\]\ZZZZZZZZ[\\]]]]\\[\\\\\[[\\\\\\\\\]]]\\\\\\\\\\[[Z[[\\\[[[[\\\\\\\[\[[[Z\\\[[\\\[\\\\[[ZZYZZZZZZZ[\\[YYZZYYZZZZZ[\[[[[[ZZYYYZZZZYYYYYZZYXXZYXXYYYYYXXYZYXXWXYXWWXYXWWWWWXYXWWWWWVVWVVVWWVVVVWVVVVVVVVVVVVVVUUUUVVVUUUUVVUTTUTTUUTTUVVUTRQPTTTSTUTRKKKLKKKKKLLLLJJLLMMMMMMLNMMMNONMNONMNOPNNNNNOOOPPPPPPPONNPPPNNOPPPPPPPPPPPPOPPPPPPPQSQQRRRRSSSRQRSTSSRQQQRRQQQQQQQRRRRRRRQQRSSSSTTUUTUWYVVVUUTUUUTSSTTUUTUTRSTUVUUUUVVVVVWVVVWVVXWXXXWVUVVVUUVVVVVVVVWVVVXWUWVTVYYXWWYYYXXY[\ZXXVVWXYYXWYYYYYYZ[Z[ZZZ[\[YZZZYWVVVWWXYYXYYZYXYYXYXWXYZ[[ZYYZZZ[[\\\\]][Z\\\\\\\\\]\\\\\\\\\\[\\\\[\[[\\[[\\\\\\\[[\]Z\\^]\\]\\\\]\[\\\^]]]\\\\\\\^]\\\\\\\\\]]]]]]]]\\\\\Y[\\\\\\\\]]\\\]]\\[[\\[\\\\\\\\\\\\\\\]\[[\\\[[\\\\\\\\\\[[[[\\\\\\\\\\\\\\]\\\\\\\]\[[[[[[ZZ[\\\\\\]]]]\\\\\\\\\\\\\\\\]]]\\\\\\\\[\\\\\[\\\\\\\]^]]\\\\[[[[\\\[[[\\\\\\\\\\[[[[\\[ZYZ[[[[[[[ZYZ[[[Z[[Z[[[[[ZZZZZ[[ZYYZYYZZZYYZZYYZZZZZYXYYYXYXXYXXXXYYXXXXXXXXWWWWWVVWVVVWWVVVWWWVVVVVVVUUVVVVVVVVVVVVVVVVVUTUUTTUUUUTTSRSTVVSTTTTTSRKKKLLLLKKLLMNLKMMMMNNNMMNMMNOPOMNONNNOPONMNOPPPQPPPPPPPOOOPPOPPQQQRQQQPPPQQPPQQQPPPRSRQRSSTTTTSSSSSSRRQQSSSRRRRRQQRSRSSSSRRSTTTSSRRRSTVXWVUTVVVVUUUTTTUUTUUTTUVVUUUVVVVVWXXWWXXXYXYYXWVTVVVVVVVVVVVVXXXWY[YWWVUWYYXWWXYZZZZ[[[ZXYZZZXWXZYZZZZZ[[Z\ZZZZ\[ZZZZXWWWXWVX[[YXXYYXY[[[\\\[ZZZY[[ZZZ[[[[\\\]\[\\\]]]\\\\]\\\\\\\\\\\\\\\\\\\\\\\\]]]]\\\\][^\^]\]^]^^\\\\\\\][\]]]]\\]]^^]]]^]\\\\\]]]]^^^]\\\]Z[\]^]\\\]\\]]\\\]]\]]\\\\\\\\\\]]\\\\]_\\\\]\\\]\\\\\]\\\\\\\\]]\\\\\\\\[\\]\\\\\\\\\\\\\\\[\\]\\\\\]]]]]\\\]]\]\\\\\\\\]\\]]]]\\]\\\^]\\\]^]]\]]^^^^]]\\[\\\\\[[[\\\\\\\\\\\\\\\\\\[[[Z[\\\\[[[[[[[[[[ZZZ[\\\[[[[[[ZZZZZZZZ[ZY[ZZZ[[[[[ZZYXXYZYYXXYYYYYYXXXYXXXWWWXWWWWWWWWWWWWWXWWVVVVWVUVVWVWVVVVVVVVVVVVVVVVVUUVVUUVVVVVTRQSTUSSSSRKJKLLLLLMMLMOMLNNLLMNMNONNOOPPONOOOOPPPPONOPQPPPOPPPPPPPPPPPPPQQRRRRRQQQPQQPPPQQRSSTUSQRSSSSRRSTTTSRQRQQRRSSRRRRRQRSSTUTSRSTUUTSUTSUXVTUZXVTVXXVTUVVUTUVUVVVUVVVTUVVWWVVWYZXXXXYYYYYXXWVUUVVVVVWVVVVXYYYY[XWVWVXXXXYYYY[Z[ZXY[[Z[ZZYYYYYZ[\ZZ[[ZZ\YYZZ\[[[[[ZXXXXXXXYYYYYZYXZ\\\\\\\[[\\[[[[[[[Z[\\\\\\]\\]]]\\\[\\[[\]\\\\\]]]\\\\\\\\\\\]]]]\\\\^\_\]]\^^^`_\[Z\]]\^\^]\\]\]]^\]]^^^]\\\\\\]]^^^]\\\\\\\\^`^\]\]\\^^\\]]]\]^]\]\[\\\\\]]\\\\]^`]\]^]\]_]]]\\]\\\]]]\]_^]]]]\\\\[\]]\\\\\\\\\\\\\\\\\\^]]\\]]]\]\\\\]^]^\\\\]\\]]]]^^]]]]^]\\]\\\^__^]]^^]]^^^]]][\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[\\\[[[[[[[[ZZ[\\\[[[[[ZZZZ[[ZYZ[\[[[[[[[[[YZ[YWXZ\ZYXYZZYYZYXWXYYXXXWXYYXXWWXXWWXYWXXXWWWWVWWVVWWVWWWWVVVVVWVVVVVVVVUUVVVUVUUVVVUUSUUTSTTTKKKKLLLLMLNNNNLNNNMMNOONMNOPPPPOMPPPPPPOOPPPPQPOOPQQPPPQPPOPPPQQRRRRRRSSRTSRQQRPRQRSTSSSSTSTSSUUURSRPRSSRSSRSSSSRSRRTUUUVUTSTTTRTTSVWWXVWYXVWYXUVUUUUVWVUVXVVVWVVVVVXXXXYYYXYZZ[YYZZZYWUVVVVWVVWVVVVVYZXZ[ZWVWXZZYY[\\[Z\[ZY\[ZZZ\\Z\\[[Z\\[\\\[[[[[[[\\]]\[ZZZZZYYYYZZYZ\[Z\^][\\[[[[\\\[Z[Z[[[[[]]\^^\\[\\\\\\\\\\\]]\\]]\]\\]\\\\]]\\]]]]]]]]]]]^]\\]\^^]^]\]\\]]^^^]_]\]]]\]\\]]]\]^___^]^^^_^]]]\\\]]]^__^\\^]\^\^]\\^_]\]\]]\\\\]]]]\\\\]_`_]]__^]_]^^\]_^]^^___^]]^__^]\\\\\\]\\\\\]\\\]\\\\\\\\\]]^^^^]\\^^\\^^\\]^^^^]\]]^]]\\]^^^]\\]]_^]]]]]]^]]\^]]]\]\\\[\\\\\\]^\\\\\\\\\\\\\\\\\[\\\\YZ\\\\\\\\\\\\\\\\[[\\[[ZZYY[[ZZZ[[[[[[ZZZ[[[ZYXXYZ[YYXYZ[ZY[YXXYYYXXXWXXXYYWXXXWWXYYXXXXWVWVVWYWWWVWWWWXVUVWVVVVVVVVVUUVVVVVVVVWVUTTUVUTTTTKLLLLKKMLLNONNMNONNMNOONPPPPOOOOOPPPPONNPPPPPPPPOPPQQQQPPPPPPPQQQRRSSSSRRSSSRRRQRRSTTTSSSTTTTTUUUSTSQSSSSTSRRRRRSSSTVVVVVVUTTTSRTUVWWVWWVXXWWXXWVVUTTVXYXXZXXWYWWXWWWXXXXYZZ[[YYXYZYZ[YVVVVWXWVXWWWVVXZXY[[YXXYYZYY[\[[[[ZZY\[[\Z\\[[[ZZZ\\\\\\\[[[[[[[[\\\\\[ZZYYYYXYZYZ\\Z\]]\[[[[[[[[\[\\[[\[[\\\\^_]\\\\\\\\\\\\]^]\\\\\]]]]]]\\]]\\]^^]]^^^]\\]\\\]]^^]^]]^]\\\\]^^\\\^_^]]\\\\\\\\^`a_^_`a`_]]]]]]^^^^^__^\]]^^]]]]\]_]]]\\]^^\\\^^]]]]^_```_^__^^_]^]\\^]^^_____^^___^]\]]\\\\\\\\\\\\\\\\\\\\\\\]^^^^^^]\]]\\^^^\]^]]]]\]]]]\\]]^^^^^]]]]]]\\]^^\]^\^]]\\]\\\[\\[[\\\^]^\\\\\\\\\\\\\\\\\\\\Z[\\\\\\\\\\\\\\\\\\\[[\\\\[[[[[\\\[[[[ZZYYZ[[ZZZZ[[ZYYYZ[[ZYYXXXXXWYYYYYYYXXXYYXXYZYYYXYYWXVVWYWVWWVWVVWVVVVVVVVVVVVVVVVWWWWVVWWVVVTUVVVUUULLLLMMMNMNPONNMNNNNOOOONOOPPOOOOPPPPPONOPPPPPQQPPPPQQRRPQPPQQQQPQQRSSSRRSTSSSRSRSTUUVUTSSTTUUTUUTSUTSUUUUUUTSSSSSSTUVVUVVVVVVUUUVVWYYWXXVVWXWVWYVVUUVVXXXWZYXY[YYYXWWWWXYZZZ[ZYZZZZXXYXVVVVWXWWXXYZWVXYXY[[ZZZYZZZZ[[[[\\[[[\YXZZ\\[[[[\\\\\\\\\[\\\\[[[\\\\\\\[\[\[Z[\\[\\\\\\\\\\\\\[[\\\\\\\[\\]]]__]\\\\\\\\]]\\]^]\\\\\]^^]]^^^__^]\^^]\]^^]]]]\\\^^^_^^^__^]]\\]__]]^__^^^__^]]]]]_`a_^^_``__^^__^______``]\^_^^]^_]^_^]]\\\]^^]]^_^]]^___`a`______^^]\\]]^____```____^]^^_^]]]\\\\\\\\]]\\\\\\\]]^____^__]]]]]^^^\]]]]]]]]]]]]\\\\]^_^^^^_`_^\\]^\]_^_]]\\]\]]\\]]]^\\\\\]]\\\\\\\]]]]\\\\\\\\\\\[[\\\\\]\\\\\\\]\[[[\\[[Z[\\\\\[\\\[\\\\[[[[Z[[[[ZYYZ[[ZYYYYXXXXYYZZZZYYYYYXXYZZYYYXYYXXWVWXWWXXVWVVWWVVUVVVVVVVVVVVVWWXWVVWWVVVUUVVVVVVMMLMOONOOPPONONOOOOPPPONMNOOOOPPPPOOPPPQPPPPQRRPQQQPPPQQRQQRQQPPQQQRRSSSTTSTTRSTTVVVVVVTTUUUUTUUTTVTTVVVVUUTTTTTSSTVVUTUVWYXVVVWVWWYZYZYXWWXXWWXVVVVVVWWWVXYXY[YZZYXWWWXZ[ZYXXY[\\[ZYXWVWVVVWWWXY[[YWYZXYZZYZ[Z[[Z[[[[[\\\\]][[\Y[\[Z[\]]\\\\\\[[\\\\\\[\\\\\\\\\\\\\\\\[\]\\\\\\\\\\\\\\\\\\\]\]]^^__^]\\\\\\\]^\\\]]]]]\\^^_`^\^^]^^]]]^^]\\]]^^^^^]^_`_`_]_`_]]]]\]_`_^^^^^^_``_]]]^^]^^^_`a`_____```_`````aa`]^_]_]_`__`_]]]]\\^_^^__^^^___^`a`___```__^\]^^^___``aa``__^^__`__^^]]]]\]]]__^^^]\\]^^_```__``_____^^^\]]]\]^^]]^^^^]\\\]^____^^^]\]]^^^_^_]]\[\\]^]^^]^_\\]]]]]]]\\\\\]]]]]\\]]]]\]\\[\\\\\\]]]]]]]]]\\[ZZZZZZ\]\\[[\\\\\[[ZY[[[[[[[[[[ZYZZZZZZZYYYYYXYZ[[[ZZZ[ZXXYYYYYZXYZXXZXWXYYXWVXXXXXWWVVVVWWWXWWWWWWWWVVVVWVVUUVVVVVVVNNNNONMNPPPONPPPPPPQQPONOPPPOOPPPPOOPRRQQQQQRSRQSRRQPPRQRQQRQPPPQQQQRSSTUUTUTRSUUVVVVWVTVVUVUTVVUVVTUVVWVUUUTTUTTUVWXVVVVVWXWWVVVWVWXWXWXYYYYXXWVVVUVVVXXWXZXZZYZZXXYYXXYZZYXXY\\[ZZYWVWXXWWWWXXY[[ZY[[YYZZY[[[[[[[[\\\\\\\]\\[[[[\\[[\\][[\\\\[[[\\\\\\\\\\\\\\]]^]\\\\\\\]]]\\\\]]\\\\\\\\\\^^^^]]^^]\\\\\\\]^_\\\]^^^]\]^^_`___^\]]^^^_^]]]^]^^^^^^^^_``^]`a_]]^]]^``_]\]]]_`a`_]]^^^____`a`____^_`aa`````aa`a^^_\_]^__`a`^^_^_``_^^`____`a`__aa__``a`___^^__^__``aaa```________`__^^]]]^_``_^^^^^^___``a`__`__``_^]]^_^]\]^^^^____^^^^^^______^^^^^]_^^\^]]]\]]^`__^]^_]]_^^]]]]]]\\\]]]]\\\\\\\\\\\\\\\\\\]]^^]]]\\\\\[[Z[\[\\\\\\\\\\\\\[[\\\[[[[[[[[ZZ[[Z[ZYYYZZYXYZ[[[[[[\[YYZZYXYZYZ[YYZYXYYYXXXYZYXXXWXWWWWWXXXXXWXXXWWVUVWWVVVVVTTVVVMOOONMMOPPPONOOPPPPPPOOPQPPPOOPQPQPPQSRPQSSSRRSSSRRRRSSQRQQRQQQQQQQQRSTTUUUUTRTUUVVVWWVUUVUUUUVVVVVUVWWYXVVWVVVVVVWYYXVWVVVWYZXVVWWWVVWWWYZZYXXXXXWVWVVWXXXZYZYYYYXXZZZYWYYYYYY[ZYXYXVVXZYYXWXYYYYZZ[\\ZZ[[[\\\\\\\\\]\\\\[\Z[ZZ\\]]\\\\\\[\\]\\\\\\\\\\\\\\\\\\]]^]\\\\\\\\^^]]]]]]]\\\\\\\\]__^]\\]]\\]]]]]]]^_]\]^___^^^^]^^^______^___^^^^_^]^^____^]__]]`a`_^^]]^``^]]]^^_`aa`^^^__`aba`___`_^^__aba`__`aa``^_`^^]]^`aaa``a```````````aa```_aa__`ab```________````_`````__^^__``___^^^__``_]^__`````_```___```__^^_`a`^]^^__^^^^_```______^a``___^]_^^\^]^^^_]^_^^]^^_]]_^^^^^]]]]]]]^]]\\\\\\\\\]^^]]]\\\]\]]]]]\\[\\\\\\\\\\\\\\\Z[\\\\\\\\\\[[[[[[[[[[[[[ZYYZZZZYZZ[[[[[[[[ZZ[ZYXYZZ[[YYZZYYYXXZZZZYWWYYXXXXXXXXXXXXXYYXWVVWXXWVVVVTUVVVMNOONNNPOOPONNNPPPPPOOPPQPPPPPPQQQRRSSRQRSSSSSSSSSSTTTTSSRRSRQRRRQQRSTUUVVTUUTVVVVWWWXVUUVUUUUVVVVWVWXWYZWXZXXXWWXYYYXWWWWVXZ[YXXYXXWVWWWXYYYYYYZ[ZZZWVWYZXZZZXZYYWWYZZZYYXXYZZZ\[[ZYXY[ZZ[ZXY[[ZZZ[[\\Z[\\\\\\\\\\\\]]\\\\\[]]\]\\^^^^\\]\\]]\\\\]]]\\\\\\\\\\\\\]]\\\\\]]]__^]]^^^^]]^^]]]]]^^^^]]^]\]^]]]]]]^^^]^_```___^^^^_]^^_`^]^`_^_________`a`_^__^^_```_^^]_``_^^_____`____^^^]_```abba``````bba```aaa_`aab__^_aa`bbaaa`_`aba_`aba`__``a`__`aa`a````_____``a````````_____``________``_^__`````___``__`ba`_^_`aaa`_^___^^^^^^_``_^^__^]^]]]^_`_^^_]_^__^`^__]^^]]^]^__`_^^^]]^^^^^^]]]]]^\\^^]__^]]]]]\\\]\]^^\\\]]\\[\]\\\\\\\\\\\\[ZZ\\\\[[[[[\\[[[[[[[[ZZZ[[[[[[Z[[[ZZZZZ[[[ZZ[Z[[YZ[[YYZYXYZYYYXXYYYXXXXXXXXXWWXXYYXWWXXWWWWVVVVVVVNNMNPPOPNNPPOONPPQRPPOPPPPPPPPPPPQRSSRRRSRQRSUTRRSUUTTUUUTTTSRRRSRQRSTVVVUSUVVVVVWWXXWVUUVUVVVWWWXXWXWVWYVWYXXYXXYYYYYXYYYZYYYYYXXVWXWXWYWWY[[ZZ\\[Z[YX[[\ZZZZXZZYWWXYYY\ZWVXZYZ[\\ZYZ[[Z[\\YZ\\\\\\\[[Z\]]\\\\\\\\\\\\\]^^^[]\[^\\\]]]\]_^]]\[\\]]^]]\\]]\\\]^^^^__^^^]\^__``^\^_``_^___^^^^^^]^_^_`_\]]\\\]]]^^^^_```_^__^```ab`___^^`a____^_`aa``abba``___^^``^^^^_`_^^^_______`aa`__`a```abababcba`bbbaaaaba_bbbcaba`b`_aa```aa``a`_`aba_^`a`a`^_```````a`__````abba````````````___````__`a_aa`______^^`````bba___`aaa`^^_``^________^]^_`_]__^^^_``]^`_`^__^```_^_````_]]\]__^]]]^^^^^^^^____]]__^__^]]^^]\\]]]^`_]^^]\\\[\\]^]\[[\[\\]\\\\\\\\[[[[\\\[[[[[[[[[ZZZ[\[[ZZZ[[[ZYYZZ\\\[\[\[Y[\[WWZZXXZWXYYZZYZYXXXXXXWXXWWXYYXXXXWVVXWVVVWVVVLMOONPPONOOOONNPPQQQPPQQQPPRQPOPPQQQPQQPRRQQTVVUSTTVVTUTTTTRQRSUTSRQRTUTUTTTTVVVUVWXXXWVVVVVVUVXYZZYWVWXWXYYXWXXXXYZYXXXZYWWXXXZZYXXXXXXYZZ[[[[[[[[\[[Z[[[YZYZZXZZYZ[YYYZXWY[[ZY\[[[[[[[[\\[[\\[\\[Z\]\\]]\_^^]]\\\\]]]]]^^]]]]]^\\]^^]\\^^^^^]]]]]]]^^]\\]]^_^]]^^^^]]`a`````__^_______^_______^^_`^\\]]]^^^^^]`_]]`_a_``__```a__``_]]__`aab`_`ba``abbbbaa`_^_`a]_a_`a^_`a_]]^_`aaaaa_]_aa```a`bbb``bbaa``bba``bbb`abaabbbabb`_abbbaaaa`bba`bb`a`````````aa``bbaa```abb`a``aa``^^__```_`aa`_``a``bba__`_bb`__a_aaa`___`aa`___```__``aaa`_____^^a_\_`^``^_a_`_a````__````_]^__^_____^]^^_^]\]]^^_^^\\]^^^^^^^^^^^__]\\\]_][\]\]\\]^]]]]]\]\\\[[]][\\\\[\\\\\\\\YZZ[[[[[[\\[ZZZZZZ[\[\\\\[[[[[[[[[[ZZYZZYXYYY[[YYZYXXYZYYXXXXXXXYYWVXWVVVVVVWWWWVNNPPOPPOOPPOOPPQRQQQPQQQQPPQQPPPPPQPPQQQQRQRTVVVVVVVVUUUTTTSRSTUTSRSTUUUVUUVTTVWWXXXXXXWVVVWWVWXXXXWWVWXWWYZYYZZYYYZZYXXYZZYYXXYZYXYYXXXXYZ[[[ZZ[[[\[[Z[[[Y\ZZZZ\\Z[\[\\\YWWYZZ[\\[\\\\[\\\\\\\\\\\[\\\\\\\^]]\\]]\\\\]\]]^]]]^^^]^^^^^\]^^^^^^^]]\\\]^^^]\\\^^^]^^^^]]```__`````````____```````_^^__^]]]]]]^^___`__`^a````````a_`_`_]]__`_`a`_`bbbbbbbbbbaaaabba^^`__`_```__```aa`____^aaaaabbbbbbbbbbabaaaabbabbb`abababbaa``bbbbabbbbbbbbbbbbba`````a`aaaa`aa``__``aa`a``aaaa````aa```aa`_`aaaabba_`a`bbaaaa___`_^_`aaaa``aaabaaaaaaaa`____^^__^``^``_`a___````````aaaa`____```_______^^^^___^^]\\]^^_______^]\]^]\]_^^\]]]^]]]]]]^]]]^]\]\\]]\\\\\[\\[\\\]]\[[\\\\\\\\\\\[[[Z[\[[\\\[[\\\[ZZ\\[[ZZYYYZ[[ZYZ[[YXXYZZZYYZZYYYYYXWXXWVWWVWXXXWVNOOOOPPOOPPPPQQQQQRRRSRPPPPQPPQRQQRQRRRQRRRRTVVVVVUVVTUTTTTSRSTUTSSUVUUVVUUVUTVWXXXXWWXXXXXXYYYXXXXWWWWXXXYZZ[\[ZYYZZYYXX[[ZZZYYYXXYZYYYYZ[[[[[[[[[\[[[[[ZY\\YZ\]][\\[\\\\ZYY[\\\\\\\\\\\]]]\\\\\\\\\\\\\\\]\]\\^^]]\]]]^^^^^^^^^^__^]^^^^^^^^^^^^]\]^^__^]\]^^^^^^^^]^_````````a``____^_``````__^^^___^^^^^_```_`a`_]`````````a``_``^^_``__a``abbbbbbbbbbbbbbbba__``__```_^_aaabba`_`aabba`bbcbbbbbbbbbccbaabbbbbbabbababbba`abbbbbbbbbcbbbbbbccbaaaaaaaaaaaaaaa`````aa`a```aabbbaabbaaaaa`_`aa`abbaaaaababbba_`abaaaabaaaaabbbbbbbbbabba````___`_``_````a___```a```aaaaa`__^_a`_^_`a`^_____````__^____________^]]_^\\_]^_]]^^^^]\\]^]]^^]]]\\]]\\\\\[\\[\\]]]\\\\\\\\\\\\\\\\\Z[\[[[\\[\\\\[ZY[[[ZZZZYYYYZZ[\[[ZYYZZZZZZ[ZZYYYYXXYYXXXXXYYYYXVNNONOPPPPQQPQRQQRSTSRSSRRRRQQQQRRRRRTTTSRSSSTUTTSUUVVTUUUUSRQRTUUTUVVVUVUUUUUVWVWWXXXWXYYYYXYZZYYYYXXWXYZYYYYZ[[ZZZZZYYYYYYYZ[Z[YYYZ[[ZZ[\\\\\\\\\\\\\\\ZYY\\Z[\^^\\\[[Z\]\[[\\\]\\\\\\\]\]]]]\\\[\]\\\\\]]]]]]]^^^^^^_________^__``^]^_^^^^^^^^^^^^_`__^^^_______^^^^_`aaaaa`_____^^____`___`___`_^^__^_```aa`_`aa`^]^__`_````a````aa`aba``aaabbbbbbbbbcbbbbbbbaa````_a`_^^_`````a``aabbbaabccbbbcbbbccddbbbbbbbbbbbcbbbbbbbbabbbcbbbbbbbbbbbcccbaabbbaaaabbbbbbaabbaababa`aaaabbbbbbbbbba```aa`abbbbbabbabbbb`abcbb``_bbbbbbbbbaaabbbbbaa`aaaa``__``````a```aaaaaaaa``_`_^^_`a`_^_aa`^___________^^___^________^_`_]]_]^_]]_]]^]\]^^^^]]]]]]\\\\]]\\\]\\\\\\\\\\\\\\\\\\\]]]\\\\\[[[\\\\[[[[[[\\\\\\\[ZYYZZ\\[[ZZZZ[ZZ[[ZZZYYYYYYYYYYYYYYYXYYWOOOOOPPPSRPPQQQSTUTRQRTTTTTSRRSSSRQRTUTRRSSTUUUVTVVWVVWWVVTSSTUVVVVVVVVVUVVVVXXWWXXYXXXYZZYXXZZYYYYYXWYZZZZZYYZ[[Z[[ZYZ[ZYYZ[[[\[ZZ[\\[[\\\\\\\\\\\\\\\\[[[\\\\\]]\\]\\\\]]\[\\]\\]]]\\\]\\]^^\\\\\]\\]]]]^]]]^^]]_``__`aaa````___``^^_________^^^__```_^^_``__``_____`aabbba`_^_______``````````aa_^_`_``aaaa`^`aa`^^^__```aaab```abbbbbaaaaabbbbbbbbcccccccba`_ba`aa`a``_```````abbbbbbbbbbbbbbbcbbbdeddcbbbbbbbbbcdbbbbbccbbabbccbbbbbbbbbbcbcbaabbbabbbbbbbbbbbbbaababbabaaabbbbbbbbbbbaaaaaababbcb_cbabbbbbbccbbaaaccbbbbbba``aaabbbaaaabbb```_`aa`aa`aaaaaaaaaaa`____^_``a````aa`_`_______^___^^__________]^_``_``_]_]]_]^^^^__^^^]]]]]]]\\]]^^\\]]\\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[[[\\\\\\\\\\[[[\\ZZ\[[[[[[[ZZ\[YYZZZZZZYXYZZZYYYXXYZXPPPPPPPQTRQRSRQSSSSSSUUTSTUTTUVVVTSTTTSRSTTUUUUVVXWXWVXYWVVVVVWWVVVVVVVUVVVXWVWYYYYYXXYZZ[ZYYZYXWXYYXXYZ[[\\ZZ[[[[[[[ZZ[[Z[\\ZZ]\\\\\\[[Z[\\\\\\\\\\\\\\\\[\\\][\\\\]]]\\]]\\\\\[\]^^]\\^^^^__^\\\]^]]^_]^_]]]^^\]^``__`aaaa````````_```_``````_____`````_____`aa___^_``aaaaa``_`````````aaa`aaabba``aa`aaa`````````^`^`_```aaab`aabcdcca`abaabbabbccdddbbbccbb``bb`aba``aabaaaabbbbbbbcbbbbbbbbbbcbbbceddcccbbbcbcbcdbbbbbcbbbbbbbbbbbbbbcbbccbbbaabbbabbcdcbbabbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbbbbabba_bbabbbcbccbaabbcccbbaabbaaaaaabbbaa`aaab_`baaa`aba_``aaaaaaaaa```a`_`a```aabba``a```````_```__``aa`````_^_`__````^^^__^_^^__^^^^^]^^^^^\]_]^^\\]]\\]]\]]]]]]\\]]^]]\\\\\\\\]]\\[[[\\\\\\\\[[\\\[\\\\\[[Z[\\\[ZZZ\ZYYZ[ZZZYYXYZZZZZZYXYZYPQPPQPPRRRRSTSRRRRTUUUUTSSTTUVVWWVVUUTSSTUUUUUUVXXWXWWXXWWWWWWWWVVVVVVVVWVWXWVWYYZZYXXYYYZ[ZZZYXXXXYYYZZ\[\\\\\\\[[[[[[\[\\]\[[\\\\\\[[[Z[\\\\\\]\\\\\\\\\\\\\^\\][\\]]\\]^^]\\\\\]]]]\\]^_____]]^^^^^_`]^`^_^_^]]^``__``aba```aa`aa``a````````````_````aaaa`_`ba_``__``aaaaaaa`````aaa``abbaaaaabbaabaaaaaaaaaa``a`_a_`````aaababbbcccba`bba`bbbbbcddddbbbcccbbbbbbbaaabbbcbbbbbaaaabbbbbbbcbbbbbbbbbccddcbbcbbcccbcdbbbbccbbcbcbaabbcbbcdcbccbbbabbbbbbcdddcbbbbbbbbbcbbbbbbbcbbbbbbbbbbbbbbcbccbbbbbabbabbbcbbba`abbbbcbbaabbbbbbbbbbbbaaaaab_`bbbb`aba`a`a`abba`abbbabbaaa`_`abbbaa`a``abbaa``_^^___aa``aa`_```__`__`_^^_______^^_^^_^_^]^_\]_]]^\\]^\]^^^^^^^^^]\]^^^^]\\\\\\\]]\\\\\\\\\\\\\\\]]]]\\[\\\[Z\\\\\ZZ[\[YZZ[[[[ZYYYZZZZZZZYYZZPPPPQPPRRSRQRTSSUUUTRRTUTTTTTUVVVVVVUTUVTUUUVUVVXXVWXWWVWVVVVVVVVVVVVWWVWWWVVXYWYZZYYYYXXYZ[[ZXWYXYZZ[[[\ZZZZ\\\\[Z[\\\[[\\\\\\\\\\\[[[\[\\\\\\\^]]]]]\\]\\\]\_]]]\\\]^]]^^]\\]]^]\\\\\\\]_^]^^]^`_^__`a]^`^`__]^^_`a``aabbb``abaabb````aaaaaa```a``_``_`abcbaaba`aa``aabaa`aaaaa`_`bbb`abbbbaaa_abb``aaabbaaaaaaabb`b_aaaaabaababbbbcbbbabba`bbbbbbcddcdddddddccbbcbaabbbbccbbccbbbbbbccbbbccbbccccccbbcedbbcdbdccbbcbbbbccbbcbbbbbbbccdcddbbccbbbbbbcccccddddebcbbbbccccbbbccdccbbbbbbbbbabbccbcccccbbbbabccc`cbbbccbbbccbbbbbbbbbbbbbbbbbbbbbbabbbb``bbbcbbabcba`abbbabbbaa`_``bbba``a``abba`a`_^_`_____`aa`^`___``aa_`^__^`______``_`___^__]]`]^_\]_`__________^]]^_^^^]]\\\\\\\\\\]]]]\\\\\[\\\\]\\[\\\\\[\\\]\\[[\\[[[[[[\\\ZZZZZZYYZ[ZYYYPPQRRRRRRSRRSTTRTSSTTTUUTTTTUUUVVVVVVVUUUUUVWXUWXWVWXXWVVVVVVWXYXXWVVVWWWWVVVXXXYZZYYYYYY[[Z[[YYZ[[[Z[\\\\[\\\\[Z\\\\\\\\\\\\\\\\\\\\\[[[[[\\^\\]]\\\]]]]\\\]^_^\\\\\]^]^]\\\\]^]]]]\\\]^^^^]^^]^__^^`aaa^a`]a\^__```__`abbb``aab```a`abaaaaa``_``aaaa```abbbbbabaa``aaa`bbaaabbaa`aabbbbbaaabbbaaa`_`a`abba`aaaabababa`bba``bbaaabbcbbcbbbbbbbccdcccdddddddddccddcccbbbcccccdccccdeedcccccbcdddddcbbcccccdcbbbbbcccdcbccbbbbddbbccbbcccccccbbbbbbbbbbccbbcccdbddeedccccdddddccbbbbbbbbbbbbbbbccccccddcbbccbbcbabbccbbbbbcdbbbbbbbbbbbbbbbbabb`babbbbbbbabbccbaabba_`bbbabbbbba`bbbbbba`a``abbaab`____```aaa`````_^__````______^___````aaa`_^__^_]]^_____^__^^__``__``__^^^]\[\^]\\\\\\\\\]\\\\\[\\\\\^]\\\]]\[[\\]]\\\\[[[[[[[[\\[[[[ZZYZZZZZZZQQRRRRSSRSSRSTTTTUVVUVUTTTTTVVVWVVVVWWWVUVVVVWVWXWWWXYXXWWWWWXXWWYYXVVXYXYYXXYXWYZZZZZZ[\\\[\\[[[[[Z[[\\\\[\[[\\\\\\\\\\\\\\[[\\\\\\\\\\\\\\\]]]]]\\\\]]]]^^^^^]\\^_^^^\]]]]]]]^^]]]]]]^_^^^^^^^_____```b_``]`^_````a`abbbbbbbbbba`_`aabbbbbbaa``aaaaaaaaabbbbbbabbaa`aaaaaaabbbbbbbbbbbbaaaabbbaaaa``aaabbaaaaabbababbbbbbbabbaabbbccbcbbbbbbcbcddddddddddddddddccdeddcccccccccbbceedccbcbbbcddcccbcddbcbcdcbbbbcccdccbcccccddbbdedddddcccccccccbbbccccbbcccddeccccbbccccccccccddcccccccccbbcdcddccddcccdcbbccbbbccbbbbbccbbbcbbbbbbbbbbbbbbbaabbbbbbcbbbccbbaabbbbbbcbbccbcbbbbbbbbba`a``abbaaaa``````aaa`__````````aaaaaa``````````````_^_``__^^^^^^___``____^__`ba_^_^^]\\]^^]\\\\\\\]]\\\\\\]\\\\^^]^]]]\\\\\]]\\\[[\\\\\\\\\[[[[[[[\[[[[Z[SSSRRRSTRTTSSRSUUVVUTVVUUUUTVVVVWWWWWXXWVVVVUVVWXXWWWXXWWWWWXXXWWXYYXXYZ[\\[[[[ZZ[[[[[[\\\\\]]\]\\[Z[\\\\\[[ZZ\\]\\\\\\]\\\\[Z[[\\]]\\\\]]]]]\]^\]]\\]]]]]^^]]^_^^__^]]]\]]^^^^^^^]]^^^^a`^_`_^`___``a`_a__`_``aa`_`abbbbbabbbbbbbb`_ababbbbbaaabbba``abbbbabbcbbbcbbbbbba`abbbbbbbbbabbbbbabbbbbbbbaabbbbbbbbbbbbbbbcbbdddcbbbabbbcddcbbaabbbbbbcdddddddddddddedccdefeeddddccdddddedcccbbccccegddccdedccccddcbdcdddcbbbcdeeeeecceeeeeddbcdddddddcccccdccbbccdfebbbcdccddddccccceeddcddddccccbcbccccdddcdddbbbcdccddcbcbccccccbbccccccbbbbcbbbbbcbbbbcccbbccbbbbccbbbbccbbbcdcbbbbbbbba````abbbbbba``aa`baa`__````aa`abababa``aaa````````````aa`___^]]_`_`a`___^^__`aa_^`_^^^^^^^^]]]]]]]]]]]]]\]^\\\\^^^^]]]\\\]\]]]]\[\\\\\\\\\\\\\\\\\\\\\[[[TTSRRRRSSTTTSSSUVVVTRTVVVVVVVWWXXWWWXXWWVVVVUVWWXYXWWWWVWWWWWXYYXWWXZ[[Z[[[[[[ZZZ[[\\[[\\\\\]]]^\\[Z[\\\]]\\\[\]\\\\\\\\\\\\\[[[\]]]]\\]]]^^^\]^]]]]]]^^]\]]\\]^`__^]]^^\]^______^^^____`_]_`^\`__``aa`_a`^ab`aaba`abbbbbbbbbbbbbbbbaaa`abbaaaaabbbbaaababa`abb`bcccbbbbbaabbbbbbcccbbbbbbbbbbbbbbbcbbbbbbbbbbbcccbbbcccedddbbbbcdcdeedcbabbbbbbbceddcccdddeeddefdccdeeedeeeeeeffeddccdeccdedcehffdcceeddedbdddccceebbccdeffeeecdeedeeddccdeeeeeddddccddcccdcdgdcbcdeddeeedcccddeeedddeedccdcbbbbbcddddcdddcbbcecdddccccdccddcbbbbbccccbdbccbccbbbbbccbbbbcbbbbbccbbbbbcbbbcddbbbbbbbbba``abbbbbbbb``aaaaaaaa``a````abb`abbb``aaaaaaaaaabbaaaba````^]^`a``aa___^^__`aa`___^___^^^__^^^^^]^^^^^^]]^]]]\]]]]]]^]\\]\]^]]\\\]^^]\\\\\\\\\\\\\\\\[[[STTSSRSRSTTTUTUVUUVVTTUUTUTTUVVWXXXXXXXWWVWVVXXWXYYXWXXXYZZYXXYZ[YXZ\\\[[[ZZZZYYZ[[\\\[\\\\]\\]^\\\[[\\]^^\\]\\\[\\\\\\\\]^^^]\\]]]]]]]]]\]]_]^^]]^^^^^^]\]^]\\\^^__^__^^^__`__``___```___^_a^\`_`aaaa``ba_ab_a`bbbbbbbbbbbaabbabbbbbaaabbbbbbbb`abbbbbbbbbabbcbbbbbbbbbbabcdbbdcdddccbbcccbabbdcbbbbbbbbbcedcccbcbbbdddcbbccddccdcdefedbbbbbbbbbdeedcccddeeedddfeeddddedddeeeeeeeddcdegeeffeccfgfdcdeedefdcdeddbbdecceeeeffdeeceeddeeeeddeeefffeedddddddddfddgdfdccccdfeeddcdeedeeeeeeddcddcccbbcdeeedcbccdcbdfcdddddddedcdedcccccbbbbbecdcbcccbbbbcbbbbcbbbccbabbcccccbbbcedbbbbbbbbbbbbbbbbbabbb``ababbbbbbbba```abb`bbbbaabbbbbbaaaabbaaaa`_`a``_`aaaaaa```_^`aaaa______^^^]^_____^^^__^^^^^]^]^^]]\]]]]^]]]]]]]\\\\\]___^^]\\\]\\\\\\\\\[[[RTUTTTTSSTTTUUUUUUVVUTTUVVVVVWXYWWXXYYXXXVWVXYYXYYYYYYYYZ[\[ZZZZ[ZZ[[[[[[[[\\[[ZZ[[\\\\]\\\]\\\][\\\[[\]^_\]_]\\[]\[\]]\]]]^^]]]]]]]]]]]^\]]^]^^^^^^^_^^]\\]^^^\]^_`_``____`____a```aaa`_`_`a_^a``aa`__`bb`ab`bbbbbbbbbbbbcbbbcbcbbcbbbbbbbbbbbbbbcccbbbbbbbbdeeccbccbbbbbbddbbdcddcccbbcddbbbcddbbbbbccbceffdcbddbcbdcddcccdeedcdddddccbbbbbbbbcdeeccccddeeedddeefffeeeeedeeeedeeeeddefeeefeddeffeeefffeddefededbbdddddfffedeedeedcdeefeeeeeffffedddedccdeeddfddcccdddeeeddddeedddeeedceddedddcdeffedcbbbcddcdfcdddeddeeccdeddddddcbbbbdcdcbcbbcbbbbbbbbbbbcddcbbbcccccbbbcedcbbbbbbbbbbbcbbbbabbbbbbbabbbbbbbbabbbbbbbabbbaabb`abaabaaaaaaaa`_`aaaaa``baaa```_`abaa``a``_^]^^^^_____^^``_^]^__^^]^^]]\]]\\]]]^^^^^\\\\]^^^^]]\\\\\\\\[\\\\\\[\STUUUUUTTVUUUVUTVVVVUUVVWWVVVWWYWXXYYYYYYXYWZZYYZYYYYYYZZ[\\\[[[YYZ[[ZZ\[[[\\[ZZ[\\\\]\]\\\\\\]\\\\\[\\]^_]]_]\]\]]\]^^^^^]^]]\\]]^^]]^___^^]^^^_^^^___^^]]]^``^^_aa__``__```__`ba`abbba__^^^___``aaa``aabaababcbbbcbbbbbbbbbcccdccbbbbcbbbbbbbbccdddcbbbbaabbccdddddcccecbccccddeeddedccddcbbcddcccbcddcdeeeedceeddbcccedddefecdeedcbbccbcccccbdefecccdddeeddefffffffffffffffeefeffeeeeeddefedefffggffgeddfffeefecddccdffffefedeeddeeefeeeeeffggfeeddddcceeddddccdeeeddeedddeeeeddddedceeeedeedeefeedddccdddddecdddeddfdcccddddddddccccdcdcddbccccccbbccccddddeedcccccdccccddccdccbbccbbccbbbbbbbccccbbbbbbbbbbbbbcbbccaabbbbbb_abbbbbaaabbbaaaaaabbaaabaaaaaa`bba```abaa`__``_`_____^^```^]^_`_^]__]]\]]\\]]]^_^_^\\]]]]]\\\\\\\\]]\\[\\\\\\\\SUVUUVUTUVVVVVVVVVVWVVWWVWVVWWXZYYYYYYYYZYZX[ZYZYYYYZZ[\\\\\\\[[YXY[[[[\]\\\[ZYZ[\\[\\\\]\\\[\^\\]]\\\]^]_\\^]]_\]^^____`___^]\\]^__^_`aaa__]__``_^^_`_^_____`_]^`bb`_````aaaa`abbabbbbba`_^_aa`aaabbbbbabbacbbbdcbccccccbbbcccddedbbbbbbbbbbbbbbcddddcccccccbbccdddcbcdfdbcdddeddddeffddeddddccbcddccdcdeeddeeeeeddcddeddeeeffddeeedbbdccfgedcceffeddddeedddefhgfeffgggggggfffgfffffefffedeeedcgfgggeegfeffeggeeffeeccffffffgfdfeeeeeeffffffgggfggfdcdeedfeeedfggfeeeeeddcdefffeedddeeefffedefeeffeeeffddddddddcedddddfddccddddccddddddeeedeececcdedcceddefedddedddddcdcddcddddddcccdeededbbbbbbbbcccccccccccccbbbbbbbbbbbbbbcb`bcbbbbabbbbbaabbaaaaabcbaabbbbaaaa`aaaaaaaaabb`a`_^^____``_^_``__^``_^\]^]]^^]^_^_^]]^]]]\\\]]]]]]]]]\\\\\\]]]]UUVWWVVVVVWWVVVVVWWVVVWVVWWVVXYYXXXYYYYZZYYZZZZZZYYZZZZZ\\\[Z[\\YYZZ[[\\[[\\\\\\\\[\\\\[\]]\\]]]]]]]]]]]^^]]]]]^]^`````aa````_]^^_`___`aaa`^]_``__^___```______`````a````aabbbbbbbbbbbbbbaabbbbcbbbbbbbcabbbbbbbddddddccccddccddddecbcdabbbbddcbbccccbbcbdcbcdbbbdedcbcdfdccdeefddccdefeeeeeeedddcddccdddedecffffeddddeedeeeddefedcdefedcefeeeedeeffedeefffeeeffghgdehhhggggfffgeehgeedffeeeffffffhheeggggfefggffgggedeffffffgfegffgfeffefggfffgfgggfefgffffedeffffedeeeeeeefgfgegfefeeffffeeedeeffeffffgedddeeceddddeeeedddddddcccdeeeefeeeeedddddedcdfeeeeedddddeeeeeeddcbcdddddddcefdedcbbbbbbbbcccccccddddddcbbcbbbbabcccdcbbbbbbbbbbbbbaaaab``abbabbbbbbbb`a``abbaba`abba``ba`__`_^__`___`a`__``^^\\^^]^^^___^^]]]^^^^\]_``\\]]]]\\]]^]\]^\TTVXYXYYYYZYXXXXWWWVVWVVVWXWWYYYXXYZZZZ[ZZZZZZZZZZZZ[[[[\\\[Z[\\\\\\\[[[\\\\\\\\\\[[\\\\^^]\\]]\^^^^^^^^__^]]]^`__a``a````aaa`]^^_____`a`a`__`aaa`____```__```aaa```````aabbbbbbbbbbbbbbbbbbbbccbbbbbbccbbbbbbbcdcccddddddddddddeeecbcdbbbcdccbbcddddccdbdcbddbbbcddccccdccdeeefddddegggffffffffddddccddcddfdfggfeeeeefegffffeeeeeeeedeedffddeeeddefeeefggggfffffggefhhgggggfgghgfggggffggfffffghfggefhgghgffggggghgfefgfffgggffgffggfffefggffgghfdehhhgffffeddeffeeeeedegfefgggghggggfggggffeddefffgfefgeeffgfeeeeddefeeeeeeeeeddddeddeddeeeeffdeeedddeeeeeddccddeddddddddddedddddddefeedccccccbbccccccbccdddddbbbccccbbbccdedbbbbbccbbbbbbbbbbbbcbbbaabbbbbbbaaa`abbbaaaabba``bba``````___````__^``^_\^_^]^^^_____]\\^]^_^^^^\\\]]^^]]^^^]\]\\VVVYYXXWXYYYXWWXXWVVWWVVXYYXXYYYYYYZZYYYZZZZZZ[\[[[[[[[[\\\\[ZZZ\\\\\\\[\\]]\\\\^]\\\\\]^]]]]]]]__^^^^^^_`_^]^_b`_`_`baabaaaa`^_______``aaa``````_^__````__`abbbbaaaaaaa`bbbbbbcbbcddcccbbbbbbbbbbaabbbcccbcdcccdccddddeddddeeeeeddcbccbbbdddcccdeeeeddededdeecbeeeeddccddeeeeeeeeefgggffeeefffefeeedddddeeheffgfdeffffeggfgffffffffedefeffeefggddefffffhhhgffggfggeghhggggggghhhhghhggfffggffghhgggfghgffggggghhgghggghgfghhggghfghhffffggggggggfffghhhhhhhhgffffffggfeehgeeghghhhhhgggfgffgfeeeffffedegeeeeeedeeeccefdefgfeeeeedddddddddddddefffeddefeefeeeeeeeeeeddeeddeeeddcddddcdededdddedcccccccbbbccccddcccddcccbcccbcddbbbbbcdcbbbbbbbbaabca`bbbbbbbbbaaabbaabb`aabbbbaba`aaaabb`___`a```_^``__]^_^]^_^_^___^]]^]^^^^^]\]]^^^_^^^^^]]]]\VVVYYYYYYZZZYYYYXWVVWVVVYZZYXYYYYYYZZZYY[Z[[[[\\\\[[[[[[\\\\\[ZZ\[[[\\]]]]^^\\\\]]]\\]]^^]]^__^]`_^^^^^^_`_^^^`ba``_`bbabaaaa`^```__````abba`````__`aa`````abbbbbbbbbbbaabbbbbbbbbbbbcccbbccbccbbbbbbbbbddcdedcddcceedcdcddeeeeeedddcccbbbbdefeddefeeedfedddedbbffeeeeeeeddeffffeeefggfffeeeefeeffffeeeeefghfffgfeefffffggfeddefeddefgffefggfgghedeggfffhhgggghhfffeghggggggggghhhhhhfgfefgggfggggghghhfeefghggghfghhgghggghhgghhgghhfffgghgggggfghgffghgghhhgfffffghhgfeggeeghhgggghgggggffggffefffeeefgfffeefeeedddeedeghffffeeeeeedeeeefeddefgfdddffffffeefggeeeeeeefdeefedccdddcbcccdddeeedccccccccccddcdddcccdcbcccedcbbbbbbbbccdcccbbbbbaabbb``bccbbbbbbaaabcbbabbabbbbbbb```aaabb``_`aaa`a`_aa__]]_____^`__`a`_^^^]^^^^^^^]^]^_]^^]]]]__]UVWYYY[[ZZ[[ZZZ[YXWWVVWWXYYYYZZZZ[[[[[[Z[[[[\\\\\\[[[[\\\[\\\\\\\[Z[\]^^^^^_^^]\\\\]]^_``__``_^]__^^^^__``__```abaa``a`aaabbba^^aa``aaaaaaaaaabbbaaabbaaaaabbbbbbbbbcbbbbbcbbbbabbbbcccdccdccddbbbbbcddcccdeedcdecceeccdbceeeeeffedddddddccdffeddefefeegfddeedddeeeedefgeddefgggfeefgggggggffggfgfggfffedfghfhhggfffffgfggfeddefedceghgffghgfffffefghgffffghhhhggffefgfggggggggghhghhfgfgghggggfghhhhggfggghhhffhgghihhhhhhhhgghhgghgfffhggggggggffgghhhgghhhgffffefgggefgffffghfeefghhhhhgghgfeeffgfeegeefgfgggfedeeffffggffggfeeeeffffefffffghheddeeffghgfeeffeeeeedeffeeeedddeeedcbceddddeedccdddddeeeedddedcbcccccddddcbbbbbcccddddddcbbbbbbdcdbbcbbbbbbbbbbabbcbbbbbbbbbaaabbabbbaa```abbbba`_a`__]]`a``__aa``aa`^]___``_^]]\]]^_]^__^]]__]VVXYXXYYYZZZYYYYYYYXWWXXXYYZZZZYZ[[[\\\[\\\\\\\\\\[[[\\]\\\\\\\\\\[\\]]^^]^___^]]]]]]^_`a__``__________`````aa`aa`a````aa`aaba^_aa`aabbbbaaaaabbba`aabbcbbbbccbbbbbbbbbbcccccdcbbbcddeedcccbbccbbbbbceecbcdeeddffdcddccdbceeeeefffdcdeefeedddddddeeefffggefgffffeffedefggffghhggggffggffghhgggggggggffgfdfghfhhghfffffgggggfgggfffffggggfgggfffggggghhhgggghhhhghggffgfhggghhhhhhhfghhhfggfefggfhhhhgffghggghhgfhhhiihhhhhhhggghhhhhgghhhhhhhhhhhgfghhhhhhhihhgghggfgggfhhghhgghgfffghihhhhhhhffgghhgedfeeghgghggeeggfghhhgffggfffefffffdefffffghfefgeefhhggedefeeeeeddefeeeedddeeeddcceeeddddeedeeddeeefedeeeddceedeedcbcddcccccddccccccccbcddcebbbccbbdcccbbbbbabcdcbbbbbbbba`baaabba```aabbbb```aa`a_^ab`_^_ba``bbb`_baa```___^_^^_]]a`_^^__^UVWXWXYYZZYYYYYYYZZYXYYZZZZ[[[ZZYZZ[\]]\\\\\\\\\\\\\\\]]^]\\[\\\\[[\\\]]]\]____]^^^^^^^_`__```aa_``````a`a`aaaab`_aaaa`bbaa`aa_aaaaaabbbbbaaabbbbaaaabcddcbcccbbbbbbbbbccccbcdedbbbbcdccbbbbbbcbbbbbdfedbdeefffgfeddddddddeeeeffffdceeefeeedcccddeeefffgedegffgfggggffffhhhhhghhhhggggfefghgfffgggggfgggfgfhfhgfhffffghhhhhhhiihhhhhggghgggggghhghgghhihihhhhhhiihhghhfhhhhhhhhhhggghhhgfgfefggghhhhgggggggghhhghhhiihhhhhhhhhhhhhhhghhhhhhhhhhhhhhhgfghhhhhhhggihhgghhhhhhhhhhihhhggijhhhhhhhghhhhhgedehhhhhhhhgffggghhihhgfffggfffgggfeeffffffgggggfffgghhfddffeeffeeffeefeddeefeefecefeedddeeefgecdeefedeedddegfeffdccddeeedddcccccccbccbcddbdbbbbcbcdddcbbbbbbbcdccbbbbbccbaaaaaaaaaaaabbbbaaaabbbba`ba`a``aa``bbbbbbba``aaaa``_``^^a``__``_VVWXWXYYXXXXXXXXYZZYZ[[ZZZYZZ[[\\]\\\\\[\\]]\\]_]]]\\\\]]]\\\\\\\\\\\\]]]\]____^]^_______``````a_`aaaaaa`aaaa`abb`bbbbabbbbbbb`aabbbbbbbcbabbbbbbbcbbbcddccccbbbbbccbbbbcdcbbcdcdcbbcccccccdcdedbbbcegfeeffeffffffffffedeeeefffffgedffeeeedddddedeefggggffghgghgghhhhhgghhhgfghjggggghhffhhhfefggggggghhhgfhghhhhfffghhihihhghhhhhhhhhhhhhhhhhgghhhfgijiiiihhhijhhhghhfhhhhhhhhhhghhhhghhhhhgghgghhhhhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhfhhhhhhhhhhhgggggghhhhhiihhhhhhgghhhhhhghhhijihhhjkhhhhggghhihhhgffhhhhgefghhhhhghhhhhhggfghhggghhggggghhhhhgggfefgggghhfccffeeggeeffffgfddfffeegfcdggffeeeefhheddeegeeffddeefedfgeeedddeddcedcdefecbddccedbedecccbbbcccccdcbdedbbbbccccdecbabbaaabbbbbbccbbbbbbbbbbbbaabbaabaaaaaaaabbaaba_a_```a__aaa````_VWWWXYYYYYYYYYXXYZ\[ZZYZ[[ZYZ[[\\\\\\\\]\[[\]]\]^]\\\\\]]\\\\[\\\^]\\]]]]]^__^^]\^_```_^_`aa``aa``aaa`aaa```aaaabbbbcbbbbbdccdba`bbbbbbbbbbbbbcbbbdccdbdcbbbccbbdbbcbcdcccbbbbcddccccdefffdeeddededcegfefcegefgdefhhgfedfgfdfffgggfffeeeeeeeefffeeefhhhgghhhgghgghhhhhgggfffghhhhefhhhhfhhhhgghhhghhghhggghhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiijhhihihhhhhhhhhhhhhhhhhhhhhhhhhhijhhhhhhhhihhhhhhhhhhhhhiihhhijiiiihhiihhhhihhhhhhhhhhhhhhhhhhhhhhijihhhhhhhfgjjihghiihiihhhiihhhhhhgghhffghhhhhhhggffghhhhhhhhhhhggghhhghhhhihhhghhhhhghgffggfgggggfffggefhfffffgggfeefggffffeeeeddeeeeggeeeeefegeedgfeegedfefgeeeedbdededcddeeeffdfbcegecdcbabbccdeffedbbbcccccccddccdcbbbbbbbbccccbbabbbbcbbabbbbcbabbba``abbabbaa`b````aa`_a``a``_`XXWWYZZ[[[[[[[ZYZ[\\ZZYY[[[ZZ[[\\\\\\]^^\[[\]^\]]]]\\\\]]]]\\\\\]^^\\]]]]^___^^^^^____``_``___``ba`aaaa```_``aaabbbbbbbcbbddedbaabbbbbcbbbbbccbcbbddccbbbbbbccccbbcdcdeddddccdeedccddeeffedeeddeeffefgfefdegefgedfgfeeeefgfeggghhgfefffgfffffffffffghhhggghgghhhhhhhhhhhgffghihhhghhghhhhhhhhhhhhghhhhihhhhhghhhhghhhihhhggghhhhhhihhhhhhhhhhhhiiihhhhhhiighihhhghiiihhhhhhhhhhhhhhhhihhhjihhhihiihihhhhhhhhhiiihiihhhhhiiihhhiiijjjkihhiiiihhiiiiiihhhhhhhiiihhgghhhhhjkkihijiihhhhhiihihhhhhhhggghhhhghhhhhhhhhhhhhhhhhhhhhggghhhhhhhhhhghhgggghhggggghhhhhhhgfhfghgffffgggggfgggfeeeddefedeeeefffggfedefeeegfffgeefeeeddeeeceedeedeeffegeefefegeccccdcccccdddeedccddddddcddddedcbbbccccccccbbbcbbbcbbbbbbbbbbabbb``abbbbaababbbbbaaa`aaaaa```XXXX[\\\[[[\\\[ZZ[\[YYXY[\\[\\\\\\\\\]]]\\\[]_]^^^^]\\\]]^^]]]]]^^^]\]^]^____^^________````___``bbaabaaabaabbbbbaabbbbccbbbdedcbbbbbcdcbbaabcbbbbcccccccbbbcccddcbcdcdeeddddddddcccdddeefedefeddfhgffgfefeefeffeefffefffggggggghhgeeeghhhgfgggggggghhhhfhgggghhghhgfghhggggghhhhghhhhhhjhhhhhhhhhghhhiihhhihhhhhihhhhhhihgghhhhhhhiihhhhhhhhhhhiiiiiihhhhihhjihhhhjjihhhhhhhhiiiiihhhihhhjjhhijijjiihhhhhhhhiijjijjihhhhhhiihijihijkkkiiijjiiijkjjjjihhhhhhijiihgghhihhijjihjjiiiiiiiihhhhhhhhhfhhhhhihhhhhiiihihhhhhhhhiihhgghhhiihiihhhhghhghhhhhhhgfghggghihgfhgghggfgggggggghggfeeddefffefffefffhhgfefgfeggfffgfffefecdeddcdedeeegggffffegfgdffeedccdddeeedeeffddeedcddcddddddcbbccbccccccbbcdbcbbbbbbbbabbbbbbaaabbbbba`aaabbbbabbaaaaaaaa`WXYZ\\\[[[[[\\\[[\\\ZZZ[\\\\]]\\\]]]]]\\^]\\]_^_____^]]^^__^^__^^]]]\^_]]__^_^^``_```_^^```````abbbbaabbbbabbbbbaabbabcbbcbddbdcbbbcddcbbbbbcbbbcdbbcbfecddddddeedddccdecdddddddbcddedeegfeefedefhhgffffffffffedefgggggghhghgfghhgfefghhhgfhhgghghhhhhhghgghhhhhhhgfghhgghhhghhhiihhhhhhihhhihhhhhhhhiihhhihhhhhihhhhhhhhhhhhhhhhhhhhhhihhhhhhhhhijjiiiihihijihhiiihhhhihiiiijjjjjihhihhhijiikkikkjihhhhhhhhhijjijjjiiihhhiiiijihijjjkjjiiijjjklkjkkjiihhhijjihhhhhhhhhihhhhiihijjjiiihhiiiijjihhhhhhiiihhhiihhiiihhhhhiijihhhhihjihihhhihghhhhhhhhhhhgggggghihhhhgghfghghhggggghggggfefffggffggefefhhhgghhgeggefegfffegfdeeddddedfffgghfgehehffefghgfddeeeggffgcefdddeebdddddddcddcdddbccccbbbcbbbbcccecbbbbbbbbb``bbbabbcaabaaabbbabbbabbabbbaWYZZ[[[[[[[[\\\\\\\[Z[[\\\\\^^]\\\]]]]]]]]]\^_^_`________``____]^]]^]^_^]_^^_^]`a`abb`__````a`abbbbaaabcbbabbbbbbbbbbbcacddfebccbbccccbbcccccdddddbcccffffffeefgffedcbceddeeeeedcdeeeeefgfeeffeefhhggffghhhhhgefffghgggghgghgghhhhgfghhhhgfhhgghhhhhhhhggghhhhhhghgghhhgghiihhhhhhhhiihhihhiihhiiihhiiiiiiihhhhhihiihihhhhhhhhhihhhhhiiihhhhhhiiijjjiiiihiiiiihhiiihhhijiijjjjiiijjiiiiihijijkkikjjiiiihhhhhhiijjjjjjjiiiiiiiijiikjijjjjjjijkkkkkkkjihhhhhhiiihijjihiiiiiihiiiijiiiiiiiiiiiijjjhhhhijiiiihhiihhijjiiiiiiijjjihhhhjihhhhhihhhhhhhhhghhhhhhhhhhiihihghhfghghhhgggggfghhggggghggfggffedfghhhhhgegfeffggfffggeffffeffeggfgggfgfgggfegffffffffffggffgcefeddefdeddeedecddddedceddccccdccbbcbbccbbbcccbbbabcdbaccdbbcbbbccbbbbbbbbbbbbbY[[[[[[\\\\[\\\\\[\[Z[[\\\\\]^]\\\]]]]]]\\]]__^__^^_`aa````___^^_^^_^^_____^__^`aaabba````_```abbbbbbbbbbbbbcccdbbbcccbbbdefecdcddddcccdcddccefedddefeedffffeffgfffffdcedeeefffeeeeffefgffedffeefgggggghhhhhhhfgggghhhhhhhhhgghhhhhhhhhhhgghhgghhhhghhgfefhhhhhhhhhhhiiihhhhhiiihhhhiijjjiiiihijjjiiiihjiiighhhhihhihihhhhiihiijiiiiiiihiiiiijjjkkkjihhhhijiiihhhhijjjjiijjkkjjiijjiiijjjjiiikkkjjkjjjjijjjjijjkjjjjkjjjlkjiijjjkkjiijjklkklllkjkjiihhiiihhhhijjhjiijkjjjjjiiiiijjiiijjjhiiiiiiijihiiiijiiiiiijjjjjjjjiihiiiiihhijjiiihhihhhhghhhhgghihhhhhhiiihhhghifghhhhhhhhhgghhhhhhhhhhhgghhhgefghhhhhhfhhggghgfgefffgfggefffhhggfffegdhdhehgffffgffffggfffeeeeddefffeddedededccddeffeeddeefeecdbbbcbbcddcbbcddddbbccdccdcccdcbbbbbbbbbbcbb[\\\\\\\\\\\\\\\\\]\[\\\\]]\]^]^^]]]]^^]]]_^^^^``_^_abba```______`___^^`````aaaabbaaaa``a``aa`abcbbbbbbbbbbbbbccccbcccbcbbdddeddeeeeeeeecddccdeeddeffgeeeeeeeeffefghhececdeffgfefffffffgfgeefgfefffghhhhgghhhhgghgghhhhhihhhghhgghhhhhhhhhhhhhhhhhhhhhgfffhihhhhhhhhiiiihhhhhiiiiijjhhhhkjiijiiiijiiihhiijihhihhihhhhijjhhiiiijjiiiiiiihijjjjkkkkkkjiiiiihjijjhhhhijjjjjjjkkkkjjjjjjjijjlkjijklljjljkjkjkkjjjkkkkjjkkkkkmkjjijkjkkiijjjkllllllkjjiiiijkjjiiiijklhjkjjkkjjkjhhiiikkkjjjjkkjjjjiiilkihhijihjjiiijjjkkkjjjjiihhijjjkkkkjjjhiihiihhhhhhghiihhhhiiihhhhhhhgghhhhhhhhhhhhhhhhiiihiihhiijhhhhhiiiihhhhhhhhhhhfeeggfhhdfffhhhhgggfgdheheihhhhhhffggggffefeefeeeffgfeeedeggfeddfgffffeeeecddceeffcccdddddddeeddcbdcdccdcdccbbbbcccbbbccbb\\\\\\\\\\\\\\\\\\\\\\\\\^^]^^_`_^^^^_``___^]]]a`___aaaa`_^^^__`_``__^^`a`abbbcbbbbbba`_aabcbbbbbcddcbbccbbbccccccbbccbedbcbbeddedefffeeddddddefecddehfgeeeefffffgghhecedefgghgfggggggghggffggfefffghhhhhghhhhhhhgghihhhhhhhhhihghhhhhhhhhhhhhhhhhhhihhfgghijiihhhhiiihhhiiiiihhhhhihijhkjiijjjiijiijhhiikjhijhiihhhhiiiihiijjihiiiiiijjjjjjjkkkjjjjjjkkjijiklhhiiiiijkkjjjjkjjjjiijjjjknlkkkklmjjlkljlkjiiijjkkkkkkkkklkjjjjkkjkjiijjijjkllkkkkjijkkkkijjjkkkkkjlljjkkkjkihhjjkkjjjjjjkkjiiihhhjkjhhjjhhjjihijiklllkjjjjiiijjjijjkjiiihjihjjhihjkihhhhhhhhijihghjhgghhihhhhhhhhhhhhgghiihhiiijjjjihijjjihhggfhhhhhhhifcdhhgjhegffiihhggghehgggfgfghgfgfghhhgfedgeefgffgfghgfeeegffedddfefffeeddeeececdcdddddddeeeccddcbeccccdcdccbbabddcbbcccbb\[\\\\\\\\\\\\]^^]\\\\\\^\\\^_^^^]^^^``]\^_``^^`a``aaaaa____`a``^_`a`^_abbbbceeedcbbbbbbcbbbbbbacdeedccdcbbbccbbcbbbbccbbbcbbeccdddeeeedcddffdefegfeffedfghggggggfgggedgeeghhhgghhgghhhhhgfghgfffffghhhhghhhhhhhhhhhhhiihhhhihhhhhhhhhhhhhhhghijiijkjhhhhiihhiihhhiiihhhijiihhjkjhhiiiihjiijjjjijkjjihhhiijiikjhhhiiihhhhhhhijihijjiiijjkjiijkkjkjjjkkkjikkiliijjjjjjjiijjjjjjjjjiiiijkmkllnkkklmjklklkkjiijkkkkkkjjkmmlkjjkkkjikmljkjhijkkkjjkljkkkklkikkjlnmklnnmiijkkkjjkkkkklkjkkjjkkkkjjjjiijjjjjihhijihhjkkllkkkkkkkjjjjjihiiihihhjiiiiiijlkihhiiihhhiiihhikiggiihhhhhhgghhhhhhhiiihhhihhikijihhkkiihhgghhhhhhhhhehhhgggghhhiihhgghhfhghfgeffghhhhihhhggfchfefgghhgghhhfedgggeecdfeefeeeeefhgeedceeeececdedbdccedfgdbbdddcccdcbbbcbbbbbccb\[\\\\\\\]]\\]^^]^]]]]]]]\\]^^^^_^^^^__]]^^_`__`a``aaaaa``__`a``aaaba`abccbbccdddcbbbbbbbbbccccdcefedcccccbbbbbccccccdddcbdcdfdeeddddeedcccefefefgffghfefffghhhgffggggfhffhhhhgghhhhhhhggggggfeffghhhhhghhhhhhhgghhhhhihhhihjhhhhhhhhhhhjhhiiiihiijkjihhhiihhhhhhhhihhhhiijjiiiijhiiiiihjiiijjiijjjjiiiiiijiikiijjkkkiiiihhiikkjhijjjkjjkkkklllkkjjjkkihklljmjjljjjjjiijjiiijjkkkkjjjklmlmmnkmllnklllmllkklljiijkkkklmlllkllkjkjkmljkjijjklkkkkkllkkllkjkkklnmkkmnlkklllkkjjkkkklkllljjkmlkjjjjjjkkjjjjijjkjijklklllklllllkkkkjijjjjkkjhiijkjijkkjjiiiihiihhhiiijkjiijiiihhhhhhhggghiiihiihihhhijiiihijjhhhhhhiihhhhhhhgghhhiijkhhihhhhhhhghhihhfghhihhihhhhgghhihghhhhhgggggfeefgfffeefeeeeefffeffghecffeecedeefdedddbdfdccddddddcddddecbbbbbcb\\\]\\\\\^^\\]^^]^_^]^^^\]^^_____^]]]^_]^^__`aa`````aaabb```aaaabbabbbbbbbbbbcdddcbbcccdfdccddbbceeeddddcddccbcddccccdeedcdddeeffeefeffefedfghhgggffghgfggfghhhhfghgghhhgfhhhhghhhhhhhhgfgghgeegghhgghhfhhhhhhhhhhhhhiiiihihjhiihhiiiiiijhhiijjiiijjjiiiiiihhhhhhhiihhhhjiiiiiihiiihhiiiiiiijjiijjjihhhijkkijkijkklllkkkkjiijkkjiijjkkkjiklljjlmmlkkkkkjlllkmjkmkjjjjjjjjihijkklkkkkkllllnmmkmmkmklllmllklnmkijkllllmmmlmlmmkjkllmlkkjjklllklmmkmlllllllkkllnmlkmmllllkklkkjjkkkllmmlkklnmmllllllmmlllmmlkkkjjllklmllllllllllkkjkkkkllkkjijjjiiijjjiiiiijjjiijjjjjjkkjijiiiiiiiijiijjkkkjjjjihijjiiihijihhhiiiiijiiiijihhhhhhhhihhhhhihhhhhhhihhghhhiiiihhhhfghiihhhhhhhgfffffffffffggffffeeefgggffghfdefefegeeefdeeedbdedcdeddeedccdeeedbbbbbcc]]^^^]]]]^^]\]]]^__^]]]^]]^_````_^^^^^_^_````bba```aaaabba`ababbbbabbbbbbbbbbcdeccccddeedeeecccdddddeeeeddddccdfeddddeeeddddedddeddeefffghghhhihhhgffggghhhhhhhhhhhgghhigfhgghghhhgghhhgfggggfghhhhffhhhhhhhijiiiihhiijjiiihjhiihiiijjjiiijjiijjiiiiiiiiijjiiiiiiiijihhijihhhijkjihhhijiiiiijjjjjjjihhijjlkilmjklkkllllmlkjjjklkkkjjjkjjiklkkklmmmmllmnnlklkmjkmkkkkkjkkjiiijkklkllllllllmlmkmlkljlllmmmllmmmmlllllmmmmlmlmnkjklkllkkkklmmllmmmmmllmmmlmlmmmnnlkmmlllkjkllkkkklkllmmmllmnnnnmmmmlllklmnmmkkllkkkllmmmlkkjkkllkkkkkllkklnlihijjihjjjiijjjkkkjjjjijjjkkjijjjjjjjjijiiiiijjkkkkjijkjiiihhiiiiiiiiihiiiihiihhhhiijjkjhiiikkkihhhhghhiihhhhhjhhhhhhhhihhhhhhhhgggfffffggghgffggfefggghhgfggggeefehffefeefeddeeddffeefedccddeedcccccdc\]^^^^^_____^]]^^^__^\]^____`aa`a``_____``aa`aba``aaaabbba`aaaabbbbbbbbbbbbbbccccccdeeeedeffdcegedcceffedcccdddefedeffedeeeeecccdddeefgffgfghhhhhhhfffghggghggghhghgghghhhhhhhghhhggghhgffffgghihhhhhhiihhhhijjjjjiiijjjjjjijhiihhhijkkjiknnlkkjjihijjihiijjijjjjjjjjiiijjiihiklkihhhjkjiiiijjjjjjjjjkkljkjimnllmllllllllkkkkllkllkkkkjjjjklnnmkklmnnnmmlkmlmjlmlllllkkkkjjjkkkkklmllmmlllknlmlkljlllnmnmllmnmmlkklmmmllmlmnlkkllklllkllmlmnnmlmlllmnmmmmnnnnnmllmmllkkllmmllllllmnnmmmnnmmnnmmnmmllmnnlmklnmlljlmmmmlkkjkllllllllmmlklnljijllkjjkkkjjkkkllkkkkjjkkjkkkkkkkjjjihiikkkkkkkkkkkkkkjkjihhhijiijjjjiiiiiiiihhiijjjjkiijiijjkjjkhjhihiihhhhijhhghiiiijiiiihhhhhhhgffffhhgggffhhggghhhhhhfghhhfefegfffgffgfeeefeeghgfeeddddddedcdddccb]^]]^^^^___`_^^^]]^`_]]_aa`_`aa````aa``aa`bb`aba`aaaabbabaabbaabbbbbbbbbcccbbbbbcccdeeedffffeeeefeddefeedcbcddddfeefffedefefecddedefffgfffefhghfghggggghgffgggghgfggghghiijhhhghhhhhhhhhgfffgghigghijjiihhhhiijjjjjiijjjjjkjkiiihhhhjkkjjkmmllljiijjkkjhhijjjjjkjjjjjijjjklkjjjkkihhikkjjiijjjjjijjjjkklllkjmnlkmmmnmlkklllllllkklllllkjkklllmmmmmmmmmllmmnmmlmmmmmmmlllmlllmmllklmlllmmmlknlmllmkmmmnnnnmmmmmmnllmnnnmlnlmnmlllmlmmlkllmlmnnmlllllmnnnnnnnnnnmmmnnmlllmlnnmmnmlmnnnnmmmmmlmmmnnnnnmnnmlmkmnmmmkllmmlkkklmmmmmmmmmmmmlkkkklmlkjjklmmllllkkkllkkkklkijklkkllkkkjihhiiiiiijjjklllkjkjiihijkjjjjjiijjjjjjjhhijjkjiihhjhhhhikkljkjjhhihhiiijhhhhhhikjjjiiiiiiijihgffghhggggghhhhhhhhhhhhhhhihgfdfefgfgfggfgffffgggfeeeeddddedccdcdcb^_^]^]]^^^__``_^\]]^___`aa`__`a`_``abbaba`ab`abaaababbbabbbbbbbbbbbbbbbbbbcbbcdddddeeeddceggfefgeeeeeeeddccdeeeeeffgffeeegefedfeedeedeeeggfhhggfgggghhghhgghhhhhhghgghhhhhjihhghiiihhhhhhhhhhhhjhhhiijihiiiiiihhijjjjjjjijjikiijiiihijkkjkkjjklljkkkjjjiijkkjijkkjjjjjjkkkllkjjkljjjjjkjjjjjkkkkjjkkkkkjllmklnlklmmnnlllnmmmlllkklmllkkkjlmmkkmnnnnmlllmnnnmmmnmmmmnmmmnnmmmnnmmllmllklmmmlmlmmlnlmmlmnnnnnnnnnommnoonmmnmmnnnmlnmmnllmmmmmmmnmlllllmnnnnooonmmnmnnmnnmlmnnnnnnmnnnnnnmmmllmmmmnnnnnmmlkmklmklnllllmlkklmnnmmmmnnnmmmmlkkkllkiijklmmlllllkkmmlkkklkijkllkllkkllkkjjjkkjjjjkklmljjkjijjjklkkkkjiiiiiiiiihhijkllkkjjkjijijjjjhiiihhiiiiiikiihhihhjijjiiiiiiiiiihhghhhghhgghhhhhhhhhhhihhhhhggefeghfgffgghffggffffffeeeeddedcdddddc__]]^^]_`aa`aa`^]]]]^`aa_``^_`aa_aabbbabb`ab`abbabbabbbaabbbbbbbbbccccccbbcbcdeefeeeeeeegffghgfddeffedddeddeffffeghhgffffhffedgfffffeeffhhhhheghhhfghhhhiiiihghjiihffhhhghiihhhhijjihiihhhhiihikkkigghhgiiiiihhhhijjjiiiiiihjhijjkjihijkjklkjkllklljiijjjkllkjjkkjjjkkkkkkkjjjklljkkkjjjjiijkkllkklllllkiikkkmmlllmnnmmnnmmmmmnmlmlkjjkkklmnnnmkkmonljlnnnnmmmnmmmmmmmmnnmlmnnnmmmmmlklnmnmmknnmnmmmmnnoonnnnnnnkkmnnnmmnnnnnnnmnmnnllmnnnmjknnmmmmlmnooopppommnlnnnnonnmnonnonnnnnmmmnnllmnnmmnnoonnnnnmklljlnnlllllkklnnnmmmnnnnnmllmmlkkkkjjkkllkjjklmllnnlkkllkjkllmlmlkjkkjjiijllkijkllllkjjkiikkklklllllkkjjjjijkjjjjijjjjjikjijjjkkjiilmmkkkjiiikjjhikjhihhihhhhhiihijihhhihhhhhfhiiihhhhhhhhghihghhghfghfhfggghefhhfefgghfeeeeedeeefedcb_```__^```_`aa`^^^_``__`bbaaaabbaabbbaaba`bbaabcbbbbbb`abaabbbbcccccccddcbcddddeeeddeeefggfffffffeecccdehhhggggggfghgggfhgfeefffdeggefggfgggghhhhgggghhhjihiiijighhhiihhhijihiihjihhhiihhkjjihhhhhihhhhhhijjihhhjkhhiijjjkkiiijijkkkkkklmkjkllkjkkjikkjjmmljjkjhijkkjjkllllkkkkljjjkklllljijlmmlmkkmmmkjklllkmknnmlklnnnmlknonmnmmnjkojkklmnnmllmnnnmnnnmmmmmmmmnmmkmlmlllmnnnmmmmnnmmmnnnnnnnnnmmnnmmoonnnnnnoommnnnnnnnmmnnnnnnmnnllnonnnmnnnnnnmpnpooonnnononnnnnnnnoonnnnnnnmmmnnnnmmmnnnnmmnnmllmnnnkknnnnnnnnnnnnmlmnnmllmnnmnnnnljkkjjkkjjlnmkjkmnmlmmllnlllkmnnlklllkkllmmmmmmlkjkmmklmjmnnmlkkkklkjkklmlkklkjkljijmnlklllkllkjijkkkkjjjjjjjiijkjiiijjjijiiiijjihhhhiiihhjjgihhfhhhhghhijihhiihhgghhhhgghhhffghghhhfffghgfddfggggggfeefe_`_^^^_``````a`__^^_``aaba_`aba`aabbbbbbaabbaabbbbbbccbbcbbbbbbcccccccdddddddccdefeefffffgfffffgfedddefghhhhhhhggghhhggfffgggggfeggfefggghhgghhhhhhhghhhihhhhhhigiiikjhhhijhhiiiihiiijihhkjjjijiiiiiijjiiikkiiihjkiiiijiijkkkkjhijjjkkkklkkkkkkjkkjikkkkklljjkkklkkklllkllllkklmkkklllmmmlkklmmlmkkllllkkklllmkmmlmmnnnnnmmnnmlmlmnkknjlnnnnmlmmnnnnnnnnnnnmmnnmnmlkllmllmnnnmmnnnnnnnnooonnmnnnnnnnmnnnnnnnnnoonmnonnnoonnnonoonmmnmmnmnnnnnooonnnpnppnponoonnnnnnnnnnooonnoonnnnmmnnnnnnnnnnmnnnnnnnnnomnnnnnnnnmnnnnmnnnnmlmmnnnnnnnllllkkllkkmnnmllkllmnnlkknnnkllmlklmmlllmmllllllllmmljlmllllkkklmnnmlllkklllmkklmkjklmkklkkklllkjjjkkkkkklkkkjjjkkjijjkkkkjiiijjiiiihhiiihijijihhhhhhhjhiihhhiihhhhhhhhhhhhhhhhhhhhgefghhhhgfghggghhgffgfaa`____```aaaa```_^^`abbaaaaaabbbbaaabbabbbbbbbbbbbbbccbbbbbbbbcccccccccdddccdccdeefggeeefeffeegfeeefghhhgghhhhggghhhhgfffghhgfffhhefgghhhhghhhhhhhhghhhhfhiihhihhhghhhiiiihhiiiiiiihijiikiijjkjjiijjlljjjkkjjjijkiijijiiijklkjijjjjlllmjlmkjllkkkjjkllljkllkkklmlkkllkklkklkkllmmmmmmmmmlllmmmmnmmmllnnnnnmnmklmmnnnonnnnnnnmmllnnmlllnmnnnnnnnooonnnnnnnnnnnnnmmllkmllmmnnnnnnnnnnnnooopponnnnnnnonnnmmnnnnnonnmnnnnnopoonnnoppnnonnnnnnnooppqopppoponoonppnpopppponopoonoonnmnnnnnnoonnnnnnnnnoonoooopnnnmmnnnnmnnnnnnnmmmmmmnnnnnnnklmmllllklmnnnmmlnmnnnnmnmmnmmkllklmnmklmmmlkkklmmnnmklmlkklllllmnmllllkkllmmllmmlklllkkllllllllkjkkllllllkkkkkkljiijjkkllkjjjjjjkkjihhijihiljiikhhhhhkihhhhiiihhhhhhhhhhgghhhiihhhgghhgghhhghgghhhhhgggf`a``a```aabbbaa````_`bbbabbbaabccba`abbabbbbbbbabbbbbbcbbbbbbbbbccccccccdddddedcdeeeffeeeefffdehgfefggghhghhihhghghhhggghgghhffggihfghhhhhhhhhhhhhhhhhhhhfiiijhighiijihiiiiiiiijjiihhhjjjkhhiijjjijjkllkkjjjjkkjjkjjlkkjjjjkkjjklljiklmmjlmmllmlkkjklllmkklmlkkllmmlkkkllllllkkllllmmmmmmlllmmmmmlllklmmnmnknnnnnnonnonnmmnnnnnmmnnnmlnnmmnonnnnooonnnnnnnnnnnnnnnmmlnmmnnnnnnnnnnnnnnnnopponnnmmnnonnnnnnnnnnonnnnnnnoopponnnnoppppoooonnnppppqppqopppnooopqpqpqqqqpppqoooooonnnnnnnnoponnnooopoooooooopnnnnmnnnnnnnnnnnnnmmmmnnnnnnnnkmnnnmlllkmnnllnnonnnmmmnmlmmmllmllmnmkkmmmmllmnnmnnmkkllklmmmlllmmkkllmmmmnmllmmllmmmlllllllllllllllllmmlkkkkkklkkklllmmmlkkkkkkllkjiijkjhhlihiljihhikiiiijiiiiihhiiiihhhghhhhhhhhgghhgfgggghhhhhhiihhgg___`aaaaaaaabaa``aaa`abbbb``bbbbbbbabcbbcddcccccbbbbbcdcbcdddccbbccccddeeeeddeeeefeeffeeffggfedghfeefgghhhhiihhhhghhhggghhhhhghhhihfhhhiihhhhhhhiiiihhihhgjhilijhiiijihijjjjkjjjjiihhhijjkhhiijjkjkkkkllkjjjjklkkkjkmmlklkklkjkmmmkijkkkkjlmmmmljjkkllmmlllmmkklkmnmllmmmmmmmlllllllllllmmmmmmmmmlmmlmmlmmnknnnonnnnnnnnmnnnnnonnnnonlnnnnnnnnnnooonnnnnnnnnnnnmoonnnnnnonnnnnnnponnnnnoooonnnnnnnnnmmnnoonnnoonnonnnppnopponnnoooonnnnooooppppqoopnqpqnqpoqrppoppppooppqppppoonnnnnnnooonnoppppooooooooonnonnnonnnnnnnnnnnnmmnnnnnnnnnlmnnnnmllkmnmllnooonnnmllnmlmmnnonmmnmklmlmnnnnnonnmkjklmmnnmlllmnnmlmmnnnnnmlmmlmnnnmmmlllllllllmmmmllllllkkkkkkkkklllllmkjjkklmlllkkkkkkiilhijlkjjhijiiijjiiijjiiiiiihhhhhhhhhhihgffgghhhhhiihhhhijhhhg_`__aaaaaaaaaaa``abbaaabbbaabbbbbbbcdcbbbcbbbbbbbcdcbcccbdeeeedccccbcdfggfeccdeeggeeffffgggggedegfedeghhghhhhhhhhghhhhhggghhhhhihihhhhhijihhhhhhiiiihiihhhihhkkkijhhhhhijjjkkkjjjijjihjjijiijjkkkkklkklllkjjjklkklklmmmlllmmmklnmmlkllllkjkmnnmljjklklmlmllmmllmmnnnnnnmnnnnnnmmnmmmmnmlnnnnmmmlmnnnnnnmnnonnonnnmnmnonnnoponoonoonpomnnnnnnnnnnoonnnnnnnnnnnnnnnnnnnnnnooooonnnooonnnoonopooooonnnnoonnonnnoponoponnqpnnopoooooppnnopoopppppppqoppnpppnqpoqrppopoooppqqqqppooonnnnnnnnnnnnpqpppoooooppoomnoonopoonnnnnnmnnnnnnooonnnnonnnnnonnlnnnnnnnnoooonnnnnnmnnnnnnnmnmmmnmmnnnnnmnnnllllmnnnmmmmmmnnnnnnnnmmmmmmlnnnmmmllmmmmmmmmlllkkkkklllllllmlkkkkllllkjjjlmmkkklllkkkkkljjjjiijhiihhhiihhhiijiiiiiiijiiihhihijhhhhhijiiijjhhhhijihhhaa``aaaaaaaaaaaaaabbbaabbbcbbbbcbbcddcbbcdbbcdcccddccccbbcddddedcddddefggfedddefffeefgggghhggfdefgfefhhhgghhhhhhhhhhhhhhhhhiiihhhhhhhhhijihiiiiiihhihiihhhhhikkkjkkkkihhjjjjjjjjkjjkjijjilkklkllkjklkkllmllkjkkkkmllmlmmmmmnmmlmlmmmnmmmlkkmmnmkkjklkklllllmmmmnnnnmnnnmmmmnnnnnnnnnnnnnnnnnnmmllmnnmnnmkmnnnononmnmmnnpnqqonnooonoppnonnnnnnnnnnnnnnnnnnnnnnooooonnnnonooppooopnnpqponnnoppqpponnnnppnoonnopooopppoooonnpppooooqqonpqppqqqppppppqpoppooppoqqpqqqppppqqrqppooonnnooonnnnnnopqqppoooopppoonnoooppooonnnnnnnnnnnoppononnonnnnnonnnnnnnoonnnnnnnnnnnnnpnonnpnnmnnnnnnnnnnmlnnnnnnmnnnnnnnmmmmnnnnnnmlmnmmnnnmmmmmmmmnnnnmnnkkkkkkkkkklmmmmmmmmmnmmmllkjjlmlkkklllkkkllklkkjjhjhjhhiijjhhhiijjjjkkkjjjkjiijhhjjjjiiijjijjihhhhijihhhaaa`abab`aaa`abbbbbbbbabbbbbbbbbbbcdcbbcddbbdecbbddceedcceedcdeddeeffffeeefffefgeeeeghhhghhhhgfefghgghhhghhhhhhhhghhhhhhiiiiiihhihhhhhhiihhiiijjhhhhijjihhikkjkiklkkkjijjjjiijkkljjjiijjkmlllkmmkjjkklllmmmljjkjjmmmlkmnnmmmmmllmnmlllklkklklmmjkjkljkllklmnnmnnnonnnnnnmlmnnnnnnmmmnnnnnnnnnnmmkmnnmnnnnoonmononnnlkmnpnppnnnnpnmoppnpoppponnnpoonnnnnnooonnnooqppnonoonoppnnnnopqqponnnnoooppooonnnnnppooppppqqppqpnnopqqpooonprqooopqqrrqpppooqppqqpqqqpqqqrrrqpoppqqqppooooooppoooooonoqqqppoooopppoopqpooqpooonnnnoooooppqrpononnoonnoponnooonnoppoppppoonnoonnmnnpponnnoonnnnnoonnnonnonnoponnnnnnnnnnoonnllnnnnnplklmnnnnmnnnnmmnllllmmllllmnmlkklllmnmlkmnmkklljkkkkkkjjklkjlkjkmjkikjjklmlkjkkkjjklmmlkijkjijjhijjjjjiiijjjkjhhhhjlkjjja`abbbbcbacababbbbbbbbbbbbbbbbbbbbcccbbbcbbbcdcbdcdfeefdfffedddeefffeeeegfhgdgegffffhhhghhhhhhhgggghijiihhhhhhhihhhhhhhhhhiiihhhhhhhhhhhihhiihikjiijklkiiijkkkjijjiijjjjkkjjkkkkllkkkjjjlllmllklljjllkjkllmlllllikmnnllmnnnmmmmknnmlllllkklmmmmnmllllllklmnnnmmnnnnnnnnnnnnnnnnoonmnnnnpnnlmnnnnnmnnmnoonoopmononnomnnopnooooononnonopnpoponnoooooonnoonpoonnnopqqqqqonpoopqqpoonosppnnnppppqqqpooonnnopppppppppponopponpqqpooooqrroopppprsrrqooopppqqpppqrsrqqrrqpqqoorpsropqppqponopqrqpopqqponoopppoopppppqqpopooooppoqpqopopppoqoqqqnopponooppoooopppopopqpoppnonpnnmnnnnnnnnonnnopooonnnnnnnnpnonnnnnnnoonmmnmnmkmnklnnooopnnnnmmnnlnnmmnnnmnnnnnmklmmmnmkkmmkkmnlkllmlkijlnlkkkkkjkjkjlklljkkkjjjjkllllmmllkihijjkkkklkjiihihklijjjjijjihi``abbbbbbacbbbbbbbccbcccbbbbbbbbbccbbcccccccdedcedefeeedefffeeeeffffffgghghhegeghhhhhhhhhhhhhhhhhhgghhhhhhhiiihhhhhhhiiiiiiiiiiiiiiiiiiijihiiijlkkkmmkihijklkjjkklkkllllkkkkllllllllllllmllkkjkkkkmmlkjkllkkmnmlklmnnmlmmnnnmmmllmnmlllmmmlmmnnonmlmnnnmmmnnmlmnnnnonmnoooonnnnoonnnonnpnnmnooppnnoonnnoopopmonooppnooppnnooopppnnonopnoopppooonnoppooppppoooopqopqrrqqrqpppqqqqqqtqqppqppooopppoonnnoopooprrqqpqqqqpooqppqqqqqqqqrppqqqqrqqqpppopppqqppppqqqqrrrrrrrpoqpssrqqqqrqqppqrrrqppqrqpooppppppppppppoopqrqooopoppoopppqpoqprrrpppoooopqqqppppppopoprppopopnpoonoonnopooopqpnnnoooopponnnpnooopoonnoonnnnnnnnnnnnnmmnnnnnnnnnnnnnnnnoonnnnmnnnnmmmmnmllmmklnnmlmmnnmkklmlllkkkjkklkllmmmmmnmllklllkkmmmjijklkklmljjjjkkkkijihiijjjijjii`abbbbabbababbbbbbccccccccccccccddccccdeddddeeedfeeedeeeefffffffgggggggghghhgihhhhhhhhhhhhhhhiihiihhhhhhihhijjihiiihijjjjjjjiiiiiiiiiiijiiijjiijjhhjkkkkjkllkjjjklllllllkllllllmmmmmmmmmmmlkjjjkklmmllkkllllmnmlmllnnmlmmnnnnmlmlmnnmmmnnnnnnnnnonnnoonnnnnnnmnnnnnonmnpoopnnnnnnnnooopqnnnnonooooooonnoopopnononponnonnonopppqpnoonopooopqppponnoppoopqppppppqroppqrrrssrppqssrrrsqqqqrpppoopppponnopppppqrrrrrrrrqooprqqqrrqqrrqsrpqqqrqppqppqqqppqpppqqrqrssrrtttsqpqqrssrqrqqrrqqqrqrrqpqrrpqqqqpoooppqqqpoopqqponooooooppqpqppqprrqqqpopooqqrqqqqpppopoprpppqppnppqprqnnqrppopqpnnppppoopooonpnoooooooopqqponnopppnpoonnnnnnnonnnnnoonnnonmmmnnnnnnmnmmnmlmlmlmnnmmnnnnmlklllnnllllkmmmmnmmmllllllkkmnnnnmkmkkmmklmmmlklmlklkijihjkjkjiklkjabbbbbbbcbcabbccccccccccccdddccddddddeeedeffffffeeefeefffffffgggghhhhggghhhihihhhhhhhhiihhhhhiihhhhiiihhiijiiiiiiiiijjjjkjjjjjiiiiiihhijjjklkjjjmkijjjkmlkkklkjijkkkllkkllllllklnmllllmmmmmlkkkkllllmmlklmnmmlmmnllmmmmnnnnnnmmmmnnnnnnonnnnnnnmnnooonnnooonnnnnonnnonnomnpnnonnnnopnoqqopoppopopnnnqonoppopnpnpnpoooqnnqnoqpqrppppnoqooppppppppqpoonopqppqqqqrrqqpprsrrsrqpqssrrqrppqqrrssrrrrrqoooqqqqrrrrrrsssrpppqqqrqqqqqqrrpssqqrqrqpqrpoqrqqrqqqqpqrqqrrpqstsrrqrrpqsrrrqqrsqqrsrssrpprrprrrqonnoppqqqqppqpoooppopoqoqpqprqpqpqqpprpoqpoqqqqqqqqqpppopqooqrqpnopqqqpoprrqqpoopopqqqpooooooopooonnooooopppponopqqnpppqqponnnooonnnpponnnnnmmnnnnnmmnnnnnmnmmnnnnmnnnmmmlmmlmnnmmnmlmlmlnmmnmlllmmmlllllllknmnnmlkmlmmmnnmlkkkkkjklmlkjlmlkccccdddddcecddefedcccdcccccdcccdddedeeeeefffefffefffffeffffffghhgghhhhhhhihjhhhhhiiiiijkhiiiiihhhhhiiihhijkjjjjjijjjjkkjkjiikkjiijjiiijjkkjjiijlmlklkijkkjklmllkklkkllllnmkkllllllkkllmnmnnmlllkkklmnnmllmnnmlmmmmmmmmmnnnmnnnnnnnnnnnnonnnnnonnnnooonnooonnnnnnoonnooonlnonnonnoopqooppoooppopppnmnponoqpoonpoqnpoppronqnoqpqqoppqoopooqqqqqqrrrqoonnoqpqqqrrrrssqpqqqrsrqqrssrqqqqpqpqppqqqqqpqppqqqqrqrsssrrrsrqqrsrqqpprrrrrqorrprrrrqprsqprrqqrrssrqssqqrrqqssrqrrssqqrqqrqrttrrsttttsqqrrqqqrqpoopppqqqppprqqpqqqpqqsqpoqoqqrqpqqqqsqprqoqqqrrrrqqqpqppqoorsqqoqppqpppqqqqqqpopqpopppppponoopooqpqppppppppppnoppqnpooopppoonnnonnnpponnnoonnnnnnnnnnnoonnnnnnnnmnnnmlmmmnnmnnnmmnnmnmmlnmmonmlmnnnmmlllmmlkmnnnmlklmmllmmmlllllkkknmkklljkdddddeedccfdeeffedcccddccccddddeeeeedeffeeeedeeefggghgefeffgghhghhhgghhhijijhhhhghhhghhhiiiiiihghiiiihhiijjjllkiiijjjkkjiihiklkjjjjjjijkjjjjjjklkkklljjkjklmlklllmmmmmmmmlkklllmmmmmmllmmnnlkllkjkmnnnmnnmmnnnnmmmnnmmnonnnnnnnnnnnnonnnnnnnoopooonnooooonooonnnnpponooonopnopnoooqqppqpnooppnonooooonopqpoonooqnoopqqonpnoppppoppqpqqnoppqrrrrsrrrqoopqqqqrrsssstsqppqsssrrrttsrqqrqrpqrrrrrsstqqqrrqqsrrrrrrrrrsrrstsrqqrsssrrqprqprrrrqqrsrrtsrssrssqstsrqrstrssrrsstssrrppqstttrrsttstsqqrrqqqrrqpppqqrqqpppqrssrqqqqprqpprpqqrqqqrrrsrqqqpqrrrrqqqpppqppqooprqrqrpprqqrsrrrqqqppqpnpppppqqppppooqqrqqqqqrrqqqoppoqoqpoopppponnnonnopponnnoonnnnnnopnoooonmnnnnonnnonmmmnnnnnnnmlmnmnnmnnnmmnnmlmmmmmnnnoonlkmnnmmmllmmlklllmlnmllklnljkllkldddddeeddcedeeeeeedddddcdddddeeffffeeeffeeddddeegggghhfffgghhhhhiihhgghhhihjhhihiiiiiijjiiiiihhhhjjiihhjjjjjklkijjjjkkkkjjjjklkkjkkkkjkkklmnmlllmmnnmllllmmmlkklmnnnnnmmmlllmmmnnnnnmllmmnmlkmmklmnnnnnnnnnnnnnmmnnnnnnononnnooonnnooonnnnooooopppooooooooopppoooppooooppppoppopopqpqrqqpqprqppoopqonopprpppppoqqqqqrqppooppppppppqqqqoqqppqrrrsrssqppqrrrrrssssrtsrqqrsssssttttrqqrqrprrssrrsttsrrsrqqsrrqqrrssrssssttrrrssssrqrrsqqrrrrrrstssttttsrsspssrqqqrssttttttttttrqqrtttsrrssssssrrssrrrrrrqppqrsrrqqrqrssrrrrrqqrqstrrqsqrqrqrrrrrqqqrrrrqqqqpprqqrqppqqrqsrqsrrsssssqqqqqqqqqqqppqrrqqppnqpropqqqqqqrqpqqpqqqqqrrqqpqonoooooooonnnnnnnnoooppoooponnonmnoonoonnnnnnnnnnnnmnnnonnnnnnnnnnnnmnnnnmlmnnnmnnmlmnnnnmmllllmmnnmnlmmmllmmlmcdeeeffefdeceeeeeffeddddddddeeefffgffeffffeeeeeefgffhhghhhhhhhhhhhhhhhhhhhgihhihhhhhhiiiiiiihhiihjjjjiijjkkiijkjllkklmmmllllkkllkkllkklllmmlkjjjklmnnmmlmmmmmmllmnnnnmlmlmmnnnnnnnnnlllmmnnmmnnmnnmkmopnnnnonmmnnnnnnnonoppooooonnnoonnonnpponnnopqqpopqpppqqppoppopppppqppoppoprrqopqqqoppqqppoopponqrpsqqqrrqsrqqproopprqpqqqqqpppqqpsrqpqqqrttsrpqrrqrrrsstttsssrttsrrsttttsssrrsrsqssttttttttsssrqqsqqrstssssssstttsrrrrrrrqrstrrsssrrsttssttttsrttqtsrsssssstttttttttsrssrtttssssttssssssssssssssrqqrssrrrsrrrrsststsrsqttrtrsrrqrpqrstsrrqrsrrrrsrrrtsstrqprqqpsstrssssttsqqrsrpqrqrrrrqqqqqqqorpqqrrrrrqqsrqrrqrrrrrrrrqqrpoppooopoooonnnnnoooopqpppqpnnpnmnpqqpnonnnnmmnnnonnoonpnnnomnnnnnnnnnnnnnnoonmlmmnmmmnnnmllllmmmonnnllnnnmnnmledcdedddefffffeeeefffeddeeddeefffffeeefgffffffffggghhhhghhhgghihhhhhhhhhhhghhhihhhhhijihijjjjihhiijkjjijkkkjjjjkjjkmnlkklllkjklmkkllkjjkmnllnnmnlllmnnnnmmmnnnnnnnmmnnnnmmnnmmnnnnnnmllmnnnnmmnnnnmmnnnnnnnnonmooonnnnnnoqqonnopppnnoopqoopqpnnppppppqqoppqqqqpopppqqoppppppqpoprrqqrqprqqqqqrqooppnoqrrqrrqrrrsrrrqqqpoqrrqqqqsrqppqrpqqqqrrrrrutrrrrrrsrsttttutrrtutrqqrstttssttsssstttsttsststtsqqrrrsttsrsrqstsrttssrrrrrssssrsssssrrqpsuutttrttsuusstsssttrsssttttstttsttsttrttsttsssstttssssttsstsrrrsssstsrqrrssstssstttsssrrrssrssssrqqrrssssssssssssssrqrsrrttsrststtsprtsqqqqrsqssqqsqqqrsqrrrtrrrrrrrssrrrrrrrrrrrqqqqpopqppppqqpoqqoorpoppqqppqproonnnppqqqrpqqppponoonomooopnnnnnnoonnnnmnooooooonmnnnnmmnonnmnnnnnnnnnnmlmnnnnnnmmedddddefeeeeggfeeeeeeeddeeeeeffggffeeffgggggggghhhhhhgghhhhghijiihgghhhihhghhhihiiihijkkijiijjiijijkkjjjklkkkkklkkkkklllllllkkllkkklkjkkkmnnmllmnmmmmmmmnnnnnnnnnnnmnnnnnmnnmmnnnnnnmlmnnnnnnnnnnnnnnnnnnnnmnnnpponnnnnooooonnpqqpoooppqoopqqopqqppoopqpopqqqqpppqpqqopoopppqqpqqrqqrqpprrrqqrrqqqppqqqrrsrrrrrrqrrqrrrqqrrrrqqsrqqqrrpqrrrsssrstttssssssssttssttttuutrqrrsssssstttttttttstttttttttsrsssqstssttssttstttttssssssttsstsstsqrrtsrtuutttsttsttssttustsrrsttttttttttttsutssssssstttssstttttttssrrrsttsrrrrssstrrssssrtssttsrrsssrqqrsrstsssrstttssrsstttssttstssstttrrsrqqqqqqprtsrrqqrtprqsqtrrrrrsssrrrrssssrrqqqqrrqqrrqqqqrsqpqqporqqrqqqpprrrponoopqrqpprqpqrrqonnnpoponppoponnnoooonnnnooooooonnnnonnnonnmnnoopnnnnnnmmnnmmnnmmeedddeffeedegfeffffeeeeeeeeffgghhgfffgghhhhhhhhhghhhgfghhhhhhijiihgghihhhhhiiijhghhiiijkkjhhjjjiijjkkjjkklkkllllkkkkkllkkllllmmmllllllllllmnmmmlnnnmmmnnnonnnnnnnnnmnnnnnnnnnnnnmmmnmmmnonnoonnnnnnonnnooonmnpqqqpoppoopoopppooqpooopqqqpppqqqpqpppqqqqpopqrqqqqprqqqpqoppppqqppqqqrsrqpqqpppqqqrqpqrqqrqrrrrrrrqqqqrrrqpqqrsrqrrrsrssqrrrrttssssttttsttssstsrrsttttttttsssssttsrsttuutsstssstttsrttstssrstsstsrsttstttttttttttttrqrrsttssrsssuvutttsttttuttttuttsttttttttvutststtttttttttttttrrttttuutttsrrrsttsssssssrrrttttttvtsssrrsstsrrrsssttttsrsttutttttttttttttttstttttttsrssqqpprttrrrssuosqtrtsrrrsttsssrsttttsrqqqrrsrrssrqqrstrppqqprqrrpqqqpqrpppnppppqrrqppqqqqppponpoponppppponnooooonnnnnnnooppnoponnnoonnnnoponnonnonnnnlmnnnneeddeggedeeffeegfffffffffeefgghhhhhggghhhhhhhhhhghhhhghhhiihhijihihhiihhiihiiijihijlljjjjjhhjjjjjjkkkkkkllkkmmllikklllljkllmmnmmmmmmmmmmnmmnmnnmmmmmmnnnnnnnnnnnmnnnnnnnnnnonnnnmmmnnnnnonnoonnopononnnoonnnoqrrrppqqpopopqrrqppoonoqqqqqqpqqrqqopqrsrqqpqssrqqqpqqrrpqprqppqqpqqrqrrrrrsrrqqrrrqqqqrqqrprrqqrrsrrrqqrrrqqqrsrqrsstssrrtrrrsttssrttuttttrrsttsrstttrstuvtttttuttssttuutttttrssstsqutstssstttttsrsttttttttttttttttrqqrsttttstuuuutttsrttttuutttuutstuuttttuvvtttssstttttvuuutttrstuttutrtttssttssqrstttttqrstttttttttutrqsstssttstttttsrrttuuttttssstttttttttttttttsstsrrrssttsrsstuptrututststttttsssttttssrrrrrrrsssrqrrstsqqrrpqpqqpqqrpproqqpqpppqrrsqqssrqrsrqqqooopqpooppppnnoooooonooooopoopponoppooponpqnnopoopponnmnnnnnfffffggfeffggeehfffffggggfefghhhghhhggghhhhhhhhhhhhihhhhhjjihiiihiiijjihihhihhjikjjkkjijiiiijiijklllllllllklmmllkjklllllllmmmmlknnnmnnnmmmnnllnnnmmllmnnnnnnnnnnmnnnnnnnnnoonmnnnmmnnnnnnnnoonnnponpnnmnonnoppqsqppqqppqnpqqqrrqqqppqrqqqqqqrssqpqqrssrsrssrqqrrqppssqqrrqpqrrqrqrrqqrssqqqqqpppprsqqqrsqrrppqqrrsrqqrsstsrrrrrsrsttrqqtssssssssstttttttssttttttsttttuututtttuuttttstttttvutttsstruvtttsssttttttsstuuutstttuttttvtsssttsuvvwvtuuttussttttuuuttuutttttttuvuvutttttttstustuutttttttvututstuttttttsttttttsssstttttttttttttssttstttttttsttsstttttttstsstttttttttttttutttttttttttutttsttrtrttttttttttttsssttstsssssrrqrssrrrsssttrrssqqprrrsssqqsprrqqrsssrqqsrqrssrrrqssqpppspoopqqpoooopppqpqqppooooppooopqpprpnprpoqqoopponnnnnnnnfghgfffgggffggfgfffggggghgfghhhhghhhggghhhhhhhhhhhhiihhhhijjiiiiijiijjjjiihihhjijhhjjihhijjjjjijmmmllllkklllnnmmlklmnmmnmmmnnnmlnnnmnnnmllnnmmnnnnmmmmnnnnnnnnnnmnononnonnonmnnonnnnnnnnonnoonnopononpnoonoppoqspopqqpqrqrrqqrsqqqqqrrrrsrrqrssrqrrstsqsttsrqqstsrqttrrtrqpqsrqqrrsrqrsrrrrssrqqqstrqqrsqrqppqqrrrrrrsttttsrrsssqsttsrqtttttttttttttuttttsssttttttttuvutvtttrtuttttttttstvvtttsstttutttttttttttttstuvvtsttuuuuttutsttttsuvvvuttustvttvutttttuuuttttutttuvuttttututttttstuutttttuvvuuvttvutttttttuuttttttuttttuvvuuttttuuuttsttttttssttttttttuvttutsttttutuutttttuuttttttttttttttststtsrttstttttttttttttttssrsssrqsttssttsssssstsrrrsrrtssrqsrrrqqrssrqqqrqqqqqqqrqqpqqrqrpooqqqqppooppqqpppooopppqqqpppprrrpnoqqpqqnnoonoooooooofffffefghhgghgggfggggggghhhhhhhhghhhhhhhhhghiihhhhiiihhhhiijiijjjjhijjjkjihihhjjjjjllkjjjkkkkkkkmmmllllkllmmnnmmmmnnnnnmmnnnnnnnnnnmnnnnmmmmnnnnonmnnnnonnnnnnnnmnonnnnonnoonnoonnooonnooooppoppppnpnqpqoopqpprropppppqrssrrqrrrqqqqrsssssrrssssrssttsqrsssrrssttsrttrstsrpqssrrtsrqqrsrppqrsrqrrssrrrrsqrrrrsssrststttttutsstttrsttttrttttttttttttuuuutttssttttuttttvvuvtttrtutttuuuttstuvutttttututsttttttttuuuttvvvvtuuuuuuuuttsttttstttuutuuttuttvuuttstttuttuvvuuttuuttttttututtutvvuttttuwvttuvuttuttttttutttttuvwttttttvwtuvwvuttuttttttttttstttuuttuwwvuttsttuuuttuttttttttstttttttttuusttttttrtssttttttuuuttttttsssttssrsttttttssststtsssssrrtrsrrrssrqrrrrqqrrrsssqqrssqqnpqssqpopqqqqqqpppqqqppppoppqqqqrqpopssqonoppoppnnopoppppppppgedefgghhhhhgggggggggggghijjihhhhhhhiijjihhhjjihiijjjihhiiijkkkkkjhikkjjjjiiihkkmlllllmnllkkkkklmnmllllllnnnnnmnmnnnnnnmnnnnnnnmnnnmnnnnnonnnnmnpnnoonnonnnnnnnonoooonnonnoooonnnopqpooqooppppqqqrproroonnpqpqrpopqpooqrrrrsrrrrqrrrssrsrqqrstttttsstsqtrrsssssrttrrrqrrtspqstuvtsqppstrqqrstssttttttsststtsttsssttttttttuutttttssssttttstttttttttuuuuuuttttttttttttuuttvttuttvutttttuuuvvwutuwwtwtvvtvvuttttuwxwuuvuuvvutttttuuvttttttttttuvuuuutttuttuuvuuttuuuuutttttuvvuuutuvuvutuuwvvuuvvwyyvuwxxvttuuuttvwwwvuttttvvvvtuvwwvuutttvuttttttttuttttuwwvuuvvutttttuuututttuuttuuuttuutvtuttvwttutsttsttttutttttttttttsstttuttrssssttsrtstttttttsrrqruttsrqtsssssssrrrrsssrstsrrrsqqqttsrqqqppqqqqqrsrrsssrrqqpqqqrqpopqqpnoppqppponoppppooppppghhhgfffhhhhhhhghhggggghhhhhhhhiiiiikjikkkjjjjijiijjjjihkjkljklkkljkklijkkkkjijmkklkkmnnmljjjklllmnmklmnnnnmmmmnnnnnnnmmnnnnnnnnmnnmmmnonoonnnnonpnnoonoonnnnnnononnqnoonnonnnnoooooooprooppoqrqrsqropmooopqqqqporrpqqqqrqsqrqsrsrqqrsssrrqrrsutttstrsstqrsttsssssstsrrrqrttttsstsrqrssstttuutsttttttttttttrrstuuvvuttttttuutttrsttuvutttttsstuttuuuutttttutttttttutttutuutvuwuuuvvuuuuvxwvuuuwwwvvwvuvwuuttuvwxwvvuuuwyxwuxutwuvvvuwuuuuututtvwvutuvttvvwwutuuuuuvvuttuwvuuuvvwwwvuvvvvxwvvwwwzxuwxxvtutvvttttttuttttuvwwwvuuuuuvwwutuwuttuuttuuuvuttuuwwwvvvvvvvvvvuttuuuvuuutuuuttutttuttututttttttttuuvuttttuttttrqtsttttusttrrttsrrutssssssstttrssstsssrststtsrsttrtttsssrqrrstrqqrssssrqqrqqqstsrqpqqqqpqqqqrrqpqqpoopqqqqrpoppppqpooppoophggghhggfhhhhhggggfffhhihhhhhhhiiihikjjkkkkjjihiiijkjkkjlklljklkklkklliilklkjjkmllmmlmnmllllkkllklnnmmnnnnmmllmnnnnnnnnmnnnnnnnnmnnnnnnnnnonnnnononmoonoonnnnnopnonnpnoonooonnnnooppppppppppoqsssrnpnporpprrqqrrrqqqrqpqqrsqsrsrrsrsssstttstsrtsttttttttrsttttttssttsstsrstttttttttssttsttuuvuttuttttttvttttttuttuttttuvuutttttstuuvvuttssttttuttuuuuuuuututtutuvuuutuutvvuvuwutuvvvvvuuvvvuuvvwvuvwwvvvuuuuuuvvuuvvvvwxxwuxvtwuuuvvwvvuuuuuutvwwvtvwvvwwwwvuvvuuuvwvtuvvutttuvwxxwvwwwwxyxwvvvxwuwxwwuvuwwvuvvuvwxwwwwwvvvvuuvvwvvvutuvvuuvwvuuvvvvvvuuvwvutuvvvvuuvvvuuuvvvvvtvuuttuttuvtuvuvuttuvvvuttuttstttuttttsruttttttstsrrstttttsrsssssttttsstttttttsssttsrsttsttttttsssstttsstssssrqrrsrrtttsrrrrrqqpqrrssrqrrrqqqrrrrqpooppqrqpoppppphhgghhhhghhhhhhhiihhhhiihhhhiiijihhijkkjjkkkkjijkjjkkjkkjjkkjkllllkkmlkjllllkklmmlmnmmmllllllkklmmnnmmmmnnnnmmmnnnnnnnnnnnnnnnoonnnnooonnnnnnnnnnonnoooooooonnopooonpnooopppooooqppppppppqpppqrtsroqnqpqqqrrqqqqrqqrrrqpqsspsrstqssssssttttttstrsttuttttstutttttsttttttstttttuttuuuttttttttuutstttttttuvuuttuvutuuttttuwvutttttttuuvvvuvttuwvuvutuutuvvvvtttuvttvvvuuwwuwwvvuvutvvwxwvuutvvuuvvvwvwvvvwwuuuvvvvvvvwwwvvvwwvxvtwvwvwwwvvvvwvwvvwxwuuvwwxxwwwvvvvvvvwxwvvvvwvuuwwwxxwvwwwwxxyxvwwwxwxxwwvwwxxwwwwvvvxxwvwwyyxwvuuvxvuvvvuvvvvwwvuuvwvvwwuvvwwutvwvwvuuvwwvvvvvvvvtvvwuvwutuvtuvvvvttvvvvuututtsuttuttttttvuuttttttttsstttttsrttssttttsrstttstuutsstttstttttttttttttssttttttttsrrssrrrtttstssssssssrrssrrsssrrrrrrsrqqrrqqqppoopqqqhhhhhhhhhhhhhihhhhhhhiiihhhhjiijjiijjkljijjklkkkljjkkjjkmmmlkklllklknmmlkklllllmmmmmmlllnnmmnnmmnnlmlnmlnnnnnnnnnnnnnnnnnnnnnoopponnoponnnonnnnnoonnopppppppnnoppppnpnonpqpooopoppppooooprqqrrrtqqqsoppqrpppqrrqqrsrprsprtsorqstrssrrsstutsuvttrtttutttttuvututtttsttttsttttttttuuutttttttttttsttsttuttvvuuttuuuvvvuvuuuvutuuttuttuuvvvvwvwxwvvwuwvuvxxxwuuvwwuuvuuuvxxvxxwvvvvuvwxxxvuttwwvuvwvwwxwuvxywvvvvwwxxxwwwvvwvwvxvuwwxxwwvvvwvwwwvuwvvvwwuvwwxwwvvvvwxxxxxwvvvvvvvwwvwxwvwvvwxvwxxyyvyxzywxwwxxxwwwwvywxyvuwwxxxwwwwxwvvwxxwwvwxwvuuvwwuuxwvwwwwvwwwvwvuuvwxwvvvuuvwuvuvuuxvuvwuuvvvutuvvuuuvuvtuswuuvttttttwuutttttuuttttuutttttttttutttttuttstuutttttttuuttttttttsttsstttttttttssstrrrttsstrrrrrrssrrssrrssrrrssrssssstsrqpqqpopqqphhhhhhhhihhhhiihhhhhhhhhiihhjiijkijkklmjjjjklkjjkijkkklllmlllllmmklkmlnmkkllmmmlmmllmmmmnnmnnnmmnmlnlnnnnnnnnnnnnnnnooonnnnooopppoonnooooooonnnnoonnopppoppponopoppopnonpppoopponoqqponnqrrqrrqsqqqspqrsqpppqstsrstsrstrstsorqrtsttsstttuttvvttsuuutttttstuuuvvuvtrtttttttuutttuuvvuttuuuuutuutttttuutuwvvvttuvvuvvvvvttttuvuttuuuvvvvvvxvwxvuuwuvvuvwwwwuvvwwuvvuuvwxxvxxxwwwxwwwxxwvutuwxvvwxxvwxxvwxwxxwvwwwxxwwwwwxxwxxxwwxwwwwwvvvwxyxxwwxwxxyxvvwvyxxxwvvwxxxwwwvvvwwwwyyxwxwwwwwxwuvyyxxvyxzxwxwwxxxwxxwwzxyyvuwwwwwwwwwxwvvxyxwxwwwvvvvvvwvvxwvwvvvwxxvvvvvvvwwxvvvvvwwuwuuttvwvwxuvwvvuuvvvuuvwwwtvtvttwuttuutvtuttttuuuuuuuvuustttttttuuuttuuuvuuuttuttttuuuutttuuttttttttttttssttssssttsttsstssrrrrrrsrstssssrrssssstssrrrrrrssqppppphggghhgfhhhhhhiikkjihhhhiihijiijjijklllkklllmlkkkjjkklmmjlkklmmnnllkkkmllllmmmmlmnmlnnnnlmnnnlllnnnpmnmoonnnnnnonnnoppoonnnooooooonnnoppooooooopppppppqqoppqpoopoppoqopoopqqqqppnprqqqqprrrrqqrsrqqrrsssrqrrqrtttsrtttttsttrtrrssttttuttttuvtstuvuuuvtttstttuvwvxtttutuvuvwvtttuvwvuttuvuuvuuvtuuuuuuuvxvvwvuuvvvvvvvuttuuuuuuuvuuvwwvvvwvwxvuuvtvvuuuuuvvwwvwvwwvwwwxxwwwxwxwxxwwxxxwvvvxxwwyzzxwvwwxxwxwwwwwxxxwwwxxwwxxxxwwwwwxxywwvwyzyyyyzxxwwxxyywxxyxwvvvwwwwwxxxyzywwyzzxxxwxyyzxwxyxvvwyxyxxyyxwwxyyxxwxwwxvwxxxyxxwwwwwwwwwwwxxwuvwyxwvwvwxwuvvuvxyxvvuvwwvvwxwvwxxxwvwuvvuwwvwxvvwwwvvvvvuttuvvtvtvuuwvutvvtvtuttututuvvvvutttuvtttuuuuuutuuuvuuttuvuuutuuvuuuttuuttuuttttuutstttttttttsrrstttssssttststttsssrrsttsssrrrrrrrrrrrqqqqqhhgghhgfghiihhiiiihhhijjjjijkjjkjjklmlkllllmmmlllkkllmmlnnnmnnlmnmlljkllmmmmmnnmmnnmnonnnnoonnnnnoormmlnqpnnnnoonnnopppoonnooonnoooooppqpooooopqpqqqpqqqppqqqpppoqqpqpqoppqsrqppqrqpprssrqrsqqrssrrsttsrssssqrsstsqsttsttttttrssstttuvutttuvttvvvuuuwuuttttttuvvxuuuuuvwvwwwuuuvwwwuuuuvvvvuvvuuuvvuuvwxuvwvvvvvwwvuvvuuvvvuvvvvtuvwwwvvwvwxwvwwvxxwwvvwxwxwwxxyyxxwwxxwxxxvwwxxxxxxyxxxwxxxyzzzzwvwwxxxwvvwwxyzyxxxyxxxxxxwwxwwxzzzyxwwwyxxyyywwwvwyyyywxyxwwwwxxxxxyyyzzywwwxxyyxwxyzzyyyxwvvxzxxxxzyywxxyyxxxwxxxxyyywwxyyxxywxxwwwxwwwwwyzyxwwxxwvuvvwxxxxwvwwwwwwwxwuvxxwwvwtwyxxwvwxvvwwwvwwwvvuttuuuwuvvvwvvuvvuvtvuuwtvuvvwwvtttuvwuttuuxwxwvvwvuttuuvvvwvuuvvvvuttutttvuttsstuttttuttttttsrrtttsrrrsttstssttttssssttsssrsttssqpqqrrqpqrhhhhhhhhhhhiijjiijiiijjjkkjklkklkllmnljlkllkkkkllkkklmnlklllnnmnnmmnjlllnnmmnnnnnonnopnnnnnnnnnnnnmpnnnoqpnnoonnnnnnpppoooopponnooooppqppooooopqppqqoppprqqqqqqqprqoqoqoqpqrrpopqqpoprsrqprtrqrrrsssttsttrrrrstsssrrtttuutuuusttstttuvutuuuuttvuwuutwuvuutuuvvvvvuuuttuvuvvvvvwwwwwvuuvvwwxvwwuuuvwvvvwvvwwvwwwvvvuuvvvvwwvvwxwvuvwwxwvvwwxyxwxxvxxxwuvxwvwuuwwxyyyxwxyxyyywxvxxyyxyyyyxwxxyyzzyxxyzxwxxxwwwwwyzyyxyzzzzxxxwwxwwxyzzyyxyyzzzz{zyyyxxxwwyxyyxwxyzzzzyyyzzzzzzyyyzzzxwxyzzzzywxyxyzxxxyzyxxxxxwwxyyzywxxwwwxyyxwwvwyyxwxxwvxzzzzzyyxyywuvxvyzxvwxvxxxxxxxwwuuwwvvwwtvxwxxwxxvvwwwuwwwwwwwwvuvxvuuvwvwvvvuvtwvvxtwvvvwxwuttwwwvvuuvwwwvuuvvutuvvuvvwvvvwvvvwuuuuttvuttsstvuuuuuuuuuttttttttttsstttttsstttttssssssssrstttssrssssrppqihhhhhhhhiiihijkkjiiijjjkkkllllljklmlkklllllllllljkllmnmmmlmnnnmnnnnmmmmnlnonnonnooooonoooonnnnnnopnmopnqonpooonnnnopqqoppooppqrqoooppppqqpnnppppqrspqqqsqprrrrqpprppqopqqqpoprsrpprssrqtrrsqpqrssstttsqttutrstsrsqsttuvuttttttttttttuuuvutvvtvvvuttvvttuuvywwxuuvuvvuuxxvvwwwxxwxwwvuuwwxwvvvutuvwwvwwvuuwwvwwuwwvuwxwwvvvwwxxxxxwwwwwwywxzywxxwxxxywwzxuyvwxyyyyxxxyywxyyyyxwxxyyyyxxyyyzzyyyyyyyzyxyzzxwwxyzzxzvxxzzxzyxxxyxwvxywzyzzzyyyzzzxxxxxxyywzzzzzyyzzzzzyxyzzyyxxyz|zyxxxyzzzxxyxz{z{{{zyxxwzywvwyyxxxywzxxyxxxxxxxyyxxywwyyyzz{zxxzzyyyxwxywwyzyyyxxxxyyyyvxwxxxxyyytvwvwxyxxwwxwvvwxxvwxxwutuwxutvwwttvuvvuvwxwuuwutvxxwwwxwwwwvvwvwxuwuvvuvuuvwwwwwwvuvwwvuuuuuuvvvutttttuuuuuuuuuuuuttssstsrttsssstttuttsrssrstrsssrrsttsqrstsrphhhhhhhhhhhhhhijjjjjjjkllkklmllllklmmlllmmmmlllllkjkklmnlllmmmmnmlmnnnnnnmnonnnmmnnooooopqpnnnooooonnopoqpppooopnnoppponpqqrqponnpqqpopqqppppopqnpprqssrrppqppqppprqpqpqrsrqqprssqqrsstsrrttsrrqsstttttsssttsttsuvttutuvvuttsttttttttuutvutvvvwvuuuuuttuwyxwwutuwwuvwvuwxvvwwvwwwxxwwvvwtuvwyywvvwxwvwwwwwwwvvvvxwvuvwvuvvvvvwxxwwxxxyyyxvxzxwxyxxxyzyxzyvywxyyyxyzzzzzyxyyyzzyyyzzyyyyyzzzzzzyxyyzzyyyyxwxyzzzzwzwzyzzyxxxwxxwwwyzyyzzzyyyzz{zxyyyyyzzxxxxxyyyzzzzzzyyzzzzzzzyz{{z{{zzyyxxyzz{zzzz{zyyxzzzyyyyyzzzxzyyzxxxzzzzzyxyzzyxxzzzzxwxyzzyxyyyxxxxyxxyyxxxyyyywxxyzzzzyyuvwvwwxwxxxyyxywwwwwxxvvvvvvuvvtvvwwuvwuuvvvuvwywwxwwwwwvvwwwvwwxyvwvvvuvuuvvvvwwwvvvvuttuuttuvutttvwvttuuttuvvttuutttsuuutuuttttttttttssttssttsstsssstsrsttssrhhhhiiiiijjiiijkjjjjjjkmmllmmmllnmllllmmnnnnmmmmnmllmllnoonnmlmmnmmnnnnmnnnnooonnnooponnooonnnoppooooppopopqpopppoppppqqopqrrqqqppppoopqqppqqpqrpqqrrtrqqqqqpqqpqprrqrqrrsrqqpqsrrrrrssstttsrssrrrssstttttuutuuttuttuttuvutttttttuuuuvutututtvvttvvvuttvtxwtwvuxwvvwxwvwxwvwwvvvwxwwwwvwxxwvwwwxvxxwvvwwxxxwvuuwwwwwvuvwxxwwwwxxxyyxxxxxywxywvwxzzxyzyxzzxzyyyzzzyzzzzzzzzzzzzzyzzzyyyyyzzzzzzzxyzzzyzzyzzyzzyyyyzyyxxzzxyyxxyyxyzzzxzzzzyyz{{zyzzzzyzzxwyyyzzzzzzzyzywxzz{zzzyy|{z{|{zxyyyzz{{{zzz{zyzzzzzzyxxx{zzwywwxyyzzzzzzzzzz{zyyzzzzyyyyyzzyyzzxzyyyxxxxyyxzzyzxyyzzzyxwxvxyxxxxxyyxxvvvvvvwxxwvuwxvuvwwxxxyvuwxxxxwvvwxwvuvvwxxvwwwwxwwwxxvwvwwvvvvvvuvwwvvwwvuuvvvtttuvvvvwxvttuuttuvvtttttuttttuutttttuutssttstttttttssstttssssttsssshiiiijjjjjjjjjjkkjiiiikmllklmmmlmmnmlklmnnnnnmnnmnmmnlkmnnmlmnnnnnnnnnnmnnnnpqponpppponnnnooooopqppppppooopqpopppppqqrssrrrrqqqrrqpopqqqqqpqqqrsssrsrsqoqqqqqqqorqrrrqqrrsrpqpqtrrrsrqrstttsqrtttttttuuvvutttuututstvvvutuuuuuttuvvvvwvuuuwttvutuuuvwwvvvzzvywvxxwwwxwwwwwwvwwwxwwwwxwwwwwwxyyxxvwxwwwwwxywwvuuxxvwyxxyyyyxxxyzzzzyxwwwwzyyywvxy{zzzyxyzzzzzyyz{{yxyyzzzzzzzzzyyzzzyyzzyzzzz{{zyzzzzyyzzyyyzzzzzyzyyxyyyzzzzyzzzz{zzxzzy{zzzzzzzzzzzyzzyyzzzz{zzzzzz{zzzzzzzz{zzzzyyzzzzzzzz||{|{zzzzyzz{zzzzzzzzzywyxyzzzzzyyzz{{zz||zzzyyyzzyxxzzyxwxxzzzzyxxwyzyzyyzyyxyyyyxwzxzzzyyyxyyyxwvwxwwxzzyxwyywvvwvzyxxvvyxxxxwwxyyyxxxxxxxwxwwwyyxxwwuxwxxvwwwwvvvwwwwwwwvvwwwvuuvvxxwvvutuvvttvwvtuttuvutttuvututtuuttsttttuttttttsssttssssstssssiijjjkkkkkkkkkkkkjijjjkkkkjklmmljknnnlkknnnnmmmnlnnnnnmnnnmmmnnnonnnnnnnoonnpponopppqpoooopppoopqqqpnopoqppqqppqppqrrrrprsssrqppqrsrrrrqqqqprssqrsrtrsrqrrssssrorrrssqqqrtsrsrrtsqrtsqsusstutstuutttuuuuvuuuuvutvutuvvvtuvvuttuuvvvuuwwwwvwuuxvtuuuuxxwvwxzwwwwvxxxxxvvvwxwvvwwxwwwwyxwxvvvwyyxxwwwxxxxwxxwwxwvxzwwyzzzxxxxxyzzzzzyxxyyyzxyzyzzzyyz{zzzzzzzzzzz{zxyzzzzzyzzzzzzzzzzzzzzzzzzz{{zzzzzzzzz{zz{}|{zyxxyzzzzzz{zzyzz{{|{zxzzz}{zzzzz{|{{zyzzzzzzzz{zzz{{zzzzzzz{zz|{{zzzzzz{|z|zz||z|{z{zzz{{{zzzzzzz{{zxzzz{zzyyzzzzyzzz||{{zyyyzzzyzzzzyxyy{zz{zyxwyzzzxwzyyyyyyzzy{zzyyyxyxyyyyxwwxxxxzzyyyzzxvvwwxwwyyxywxxwwwwwwyyyyyyxxxxwwwyzzywwvyxxxwwwwxxwwwwwwvvvvvvwwwvvvuvwvvwwvuvvuuvwvvvutuvvtttuwuuuttttuuuuututttttttttsrrsttstttttsjjjjkkllllmmllllkkkklllkjkjkkmmlkklmnmmmnnnmmmmmnnnnnnnnopqonmnopooonnonpppooponooopqpppooopoopqqqqonoqqsqppppqqrqpppqqppqsssrrsrrrrrsrqprrqrtspqrrtrtsrtttttttqrrrssrsrstttttstsqqssrtvttuwuttvvttuutttuttuwwutuuuvututvwwvttuuvvuuuvwxxvuuvywuvwvvxyxxxtzvvxywwwxxwvwwwywvvvvwwwwxyxxxzywwxxxyyxxxyyxwxxwxyxwwzzzzzyyyxxxxxyyyyyyyzzzzzxyzzzzzzzz{{{zzzzxzz{zzzzz{z{{{z{{zzzz{{{zz{{{{zz{{{zzz{yyz{{zz{{|||zzyzxyyz{zz{{zzyzz{{{zzzzzz|{{{{{{{|{{zzzzzzzzzzzzzz{{zzyyz|{||||zzzz{{{{{{z|{z|{zz{{{{z{||zzz{zyyz}|{z|z{|{zyz{{zzwyz{||{{zzzzzzzzzyyz{{zz{zzzzzzyyzzzxxzyzzzzzzywzyzyzzxyyzyyyxwwyyyyyyyxyyxxxxyzxyyzzxxvyyyyxxxwwxxxyyxyxxwwwyzzyxxxzxwwwxxxyyxxwwwwvvvwwwwxxwwvuuuuwyyyuwwvvwwvwwvuvvutttuvuuuutttvvvvvtttttuttstttrqsttttttttsjkkkkkkkkkkkkkkklmmllmlkkllllmmlmlllmmnnnnnnnmmlnnnnmnnnlnppnnoqpoponnooppppoprpppppppoooooppoprqpppopqqsqppooqqrrqpopqrsssrqqqrtrqprtsqqrrqrttrstststtstsstssssrsqsttuttttttttttssttttuvuvvuuvvvuuvvuuvttttuvuuvvvwutwvvwwvuvvvwvvwwvvxxvuvwwxvwxwwxyyyzvzwxyzxvvxxwwxxxzywxwvwxyyyyxxyxxyz{zyzzzyyzzyxxxxxxyywxz{zxwxzzyyxyyyyzzyyzzzzzyzzzzzzzzzzzz{zz|zzz{{z{{{zz{}}|}|{{zz{|{{{|{{|z{{{zzzzzzzzz{zzyyyyzzzz|yzyz{zzzzz{{zz{zzzz{zz{z{|||||{{{{zzz{zzzzz{zzzz{{|||}~||}|||zz{{|||{{{{|{z{zzz{|{zz{|{zz{|{zzzzzzy|{}~|{zz{{zzyz{{{{|zzzzzzzzyyyyzzzzy{zz{zzzzzzzzzzzyzzzzyyxvyxyzz{yzyzzzzzzzzzzzzzzzyyxxyzzyzzzzzxxxxxxzzzzzz{zzzyxxxxxwwxyzyxyxzwwxxxxxyyxxwwwxwwvwxxxxxwvvvuuvwwxxvwwvwwwwwvvwwwvuvvvvvuuwuttuvvvvuuvvtuutsttttttttttttttsjkllkkjjjjkkkkklmnnlklmlmmnnnnnmmmnnmlmnnnnnnnnmnnoonopnlnpqpooonnopoopqooppnpsqpppoppoorrrsrppqqooqqppprppqppqqqrssqppprrsrqqppqstsrssrrrqqqstttttttutttsttsstvrsqstuwuttsssttuuuvvuvvtutuuvwxvtttutttvwvttvwwywvuvttwvwvuttvxxwwxyxvvwyyxzyvyyxxvuwxxxyuyvzzyxyxyywwxwxzzyzywwyzzzzyyzzzyzzzzzzzzzzyyyxxxxwxywxzyxyzyzzyyyyzzz{zzyyzzy{zzzyyzzyz|{zz{zz{zzz{|}|{zz{}|{{{zzzz{|{{||z{|zzzzz{{zz{{zyz{{|||{{zzz|y{z}|zzzzz||zzzzzzz}zz|z{|||||{{{{{{{|{{{{{{zz{}}|||{z{|{|||{z{}|{{{|||||{zzzz{}}|zy{|{zzzz{zzz|{zyzz{||{{zzz{|}|{zyz{zz{|{{{zzz{|{z{{z{z{|{{{zzzzz{{{yyyyxyzzz{zyxzzzzz{{zyxxyxzzyxyyxzzzyzzyvyzxy{zzzyxyzzxwxwzzyzzyyyxxxxwwyyxyxyvxzyyxxyyxwyxwxxwuuwwwxwwwwwwwxwuvxxxwwwwwwvvwxxxwwwwututtvxvuuutuvuuwwttuttsstvvutsstuttttimmjlkmkkjkllllmmnnmlmmmmmlllnnnnnllnnnonnnnoonnnnnnnnnlnnppoooonnpoproopooooooqqronqpnnssssrqqprqqppqqqppqpprrppqrrrrrrqqurqtprtsqstssrrrrqrtttstuttttssssstttutuutttutvttvvuutstvwvvvuuttvyywvvwvvwvvxvxxuwuwuvvvvwwwwwvyuwxvuvvwxyyxvvvwyzzyyvvwxxvwxxxxyyyzzwyxwxzzzyyxyzxxzzyyyyzzyxyyzzzzzy{y{xyzzzyxxxxxxxzzzzzzyxxyyyz{zz{zyzzzzzzz{|{{{{{}}z{|{{|{}z}|{|zz{{||{|{{{{||zy|~}}|zzz{zz{|{zz{{|z}zyzzz{{zz|zz|wzzzz{{{{{{{{{|{~}|{z|zz||{{zz}~||}{||||||}~}}|}|zz~|z{{||{|}{zz{{{{|{{{|}|z}~|z|}}||z{{z{{}{|||{|||{z{|{zz}|{{||zz{{{zz{zz|{zz{||{{zz||zzzzz{zzzzzz{{zzzzzzzzzzzzzzzyyz{zzyzzzzzzzxyzzyz{zzyyzy{{{zzyyyyzzzzzyyyzzyyyyyyzzzyyzz{yxxxxxxyyxxxxxxxyyyxxxxxwvvvvwwwxxxuvvwwxxyxxxyxxxwttvwuuutuuvwvtttttttvutuvttuvtttuttvttttjllkmklljklmnmmmnnnmmnnnmnnnnnnnnnnnnnnnnnoooonnnnnooponnopooooonoopppqpqqqqqpqrqqonrsrrtsrqpprrrrqppqrrsrqqqqqqrrrqqrrrqrtrrtrsttrtttssrsssstttsttttttttttttututuuttuututuvtttttuvvvvvvvvuvxxwwvvvuvvvwtvwvxvxwvvwyyyxxvvyvwxwvuvwxyzyxxxyzzzyyvvwyxwwxxxyyyyyzyyxxzzzyzyxxzyz{{zzzyzzyzzzzzzzzzzz{zyz{zzyyxxyzzzzzzzzzyyyyxzzzzzzyzzzzzzzzzzzz{||{{{|}}|{|z|||zzz||}}}}|{{{||{z|}|||zz{|{z||{z{||~{z}zz{{z{{zzzzyz{{{{{|||||||}|{z{{{{z}zz||}~{z{|{{{{{{{|||}}}}|||{{||{||}}|}}{zz{{|}|{{{|}|{|}|z{||||z||z{{|}|{zz||{|}}|{zzz{|||||{zz{{{{z{|{zz||{{zzz||zz{{{|zzzzzzzzzzzzzzzzzzzzzzzxyzzzzzzzyzzzzzz{zyyzzzzzzxzzzzzz{zyyz{zzyyyzyxyyyyyzzzyyyzzzyyyyyxxxxwxxxxxxyyywwwxxxxwxxwwxxxxwwwwwwvxwxxxxxxwuvwvuuuvvvwwvvwvvuuvutuvttuuttttstvuuutkllmnklmkklmmmmmnnnnnnnnnnpqonnnnnnoonmnnoopoonnonnpoooonoooooppoqoqqorqpqqqqqqqqqoorsrrrrssqprstttsssssroprrrstttsqqsssrsssssstttstttttsttttttttssttuttttttuvuutttuuuutuuvvuttuuvvvvvvvvwvvvwwwvvvvvvvwuwwwywxxwwxzyxxxxxzxxwwwwwwxyzzyxxyzzzzzxyzzzyyyyyzzzzzzyzzzzzzzzzxxyzz{{zzzzzzzzzzzzzzzzz{z{zz{zzzyxyz|zzzzzzyzzzzzzz{zzzzyzzzzzzz{||||}}{||{}}|{zz{||{z{}~~~}||{z{|{{z||{||{{}}|{||{z|}|}zz|{{|{{||{{x}|z}xz{{||||||{|||{}|||z}||}}}}}|{{{{{{{{|||||||}|{}}|{||~}|}|}}|{{{|}~}|||||{|{{|{{|||||~}{|{{||{{|}|z{}}{{||{z||{{}|zz{||zz{|{{{||{zzzz{{{{|{{|zzzz{zzz{{zzzz{zyyz{zzzyzzzz{|{zyzzyz{{{zzzzz{zzzxzzzzzz{zyyzzzzzzyzyxyzzzzzzzyyyyzzyyzyyyyyxxyyyyyyyyyxwwxyyyxyyxxxyxzzyyzzxvwwxxxxxvyvuwxutvvwwwwwwwwwvuvutuuttuuttttttuvvvuklmmnklmmmllllmmnnmnnoonnoqpnnnnnnnnponnnnoppoononnoonnoopqppqrrqrprqprropppppqqpqqqssqpqqstsqrtttttsssssqrtsrqrtutsstttttsttsttttsttttttttttttuuttuvvutuuuuvvuvuttuvvuuvvvwwwvvwvvwwvvvvwvuuvwxwwwwwwwxwxwwxvxxzyyyxwwxzyyxwwwyyyyyyzzzxxxxyyzzyyyzzzyyzzyzzzzzzzzzzzz{zzzyzzzzzzz{{{zzzzzzz{{{zz{wzz{zzzzzz{|}{zzzzzzzz{{{{||{{{zz{{zzzzz{}~}|||{{~~|{|{|{||{z{}|||{{|||}}|}z}||}}||}|{{||{||}}}zz||||||}}||x{{z{||}}~}}|||{|}|~|}}{~}}~~||||}}|{|||}}}}|||||{}~}{}}}|}|}~}}||||}}}}}|{{|{{|}||}|}}~}|}||{|}}}|||{|{zz|}}|}|{{}}{{|}|zz|{{{|}|{zz{z{{{|{zz|zzz{{zzzz{{zz|{zzzz{{zzzzzzz{|{zzzzzz|zzzz{{z{zzzyzzz{zzzzz{zzzzzzzzyyzzzzzzzzzzzyzzyxyyyyzzzzzzzzzzyyyyyyzyyxxyyyyyyxzyyzzzxvvwxxxxwtxwuwywuxvwxwwwwvvvvvvuuuuuuuuuttvuuuuuuukmmlnlmmnnmllmmnnnnnoooooooonnoooonoqqppnnnoppononopoopqrrrqpqrrrpqqqrprqqrqqrrqoqrstsrrsqqsrrstttsrrsttttttsrrqtuutttttuvtuututtuttttuuuttuuuttvwwvvwvtuvvvwvvvwutuvvvvuwwwxxwwyxwwwvvvvwvuvwwxwwwxxwwwvwvvxvyy{zzyxwxyzyxxwwxzzyyyyzzzzzzyyyyyzzzzzzzzzyyzzzzz{zyz||zz{{{zz{zyyzz{||{zyzzz||||{zzxy|{{{{zz|||{{{{zz{{{||{{|}|{{{{{||{{||||}~}||z{}}~~}||~|}{}~|{|}|||{|}}}~}~}~}}~~}}~}||}||}|~~}|{}}}||}}}}|{z||}~|}|}~}}}}}}}}{|{|~}~}}~~}{{{}~}|||}}~~~}}||||}}|}}}~}|~~~~~}}||||}}}||~|{}~}|}}}~}|}}}||{|}|z{~||{{{{|}~~}|||||}|}|z{|{{|}}}|{{|{{|||{zz}{z{{|{{zz{{z{}||{{{{{z{{{{zz{|{zzzzzzzzzzz|{zz{zzy{zz{zzzzz{zzzzzzzzzyzzzzzz{{z{{zzzzyyyzzzzzzyzzzzzyxyzzzzyyyyyyyyzzzzzzzzywvwxyxxxwtwwvwyxwwwxxxwwvvuuvvvvvuuvvuuvvuuvvvvuuulnnlnmnmnnmlmnnnnnnnooonnnoonopopppppopqnnnoqqpopoppopqrqrrqpqqqqoqpqrpqrrrrrrrroqrssssstrrrrsttttssstttsstssttttuutttttvvtuututuvttttuuvttvwvtuvwwuuvwwvwwvwwvwywuuvvvvuwwwxwvyywvvvuvwxxwvwxxxxwxyxxxwvxxxzxzzzzyxxxxyzzxzyxyzyxxxyzzzzzzyyzzyzzzz{{zzzyzz{zzyzzz{|{zz{{{zz{{zzzzz||{{z{{z|||}|{z{{|z{|{z{||{z{|{zz{|{}}zz{||{z{{{}|||}}}~~~~}~}|{}|~~~~|}}}}~~}~~}}}~~~~|}}|~~}|}}}}~}~~~}}}~~||}}||{~|{|z|||}}}}}}~~|}{~~~}~~~~}}{{|~~|{||}}~}}}}}}}||~}}~}}~~~~~}}}~~~}||}~}}}~}}~~~~||}}}}|{|~}{{}|||||{|}~}}|zz|}|||||||{|}}}}}||{{||}|z{}|{{{||{{z{{{|}{||{z{{zz{{{zz{{{|{zzzzz{{z{{zz{|{{z{zzzzzzzzzzzzzzzzzzzzzzzzz{{z|{zzzz{zzzzzzzzyyyzzzyxyyzzyyyzzzyxxzz{zzzzyyyyxxxxwxxvvwwwxxxwxxwwwwwwvvvwwxxvuwwvvwwvtuvwwvuvmnnlnnnnmnmmnnnnnnnoonnonnoonoppppoooooppooppqqpqpqqppqqpppppqqqqqqpqrqqrrrssrrqrrssrrsrsrssssssrrrsstsrtttsrrttttuuuuttvuttuuutuvututvvvuuwwuuvvuuuttuwvwwwwwwxywvvvvvvwxwwxwvyywvvvvvwyyxxyyxyyxyyxxyyxzzyzyzzzzywxyyxz{yzzzzyyyxyyzzzzzyyyzzyzyzz{zzzzzz{zzzzzz{|{z{||{{zyz|zz{zz||{|||{{|{{}}|z}}|{{{|||}|{z|||{{{{|||{z{|{{{{||}}|}|||}}|}~}~~}~~~|}||}~}|}}}}~~~~}}|{}}}}}}}}~}~~}~||}|||{~zz~~}}}~~~~~~~~}~~~}}|~}}}~}||||}}}}~~~~}{{~~}~}~~}~~~~~~~~~}}}}}}}}~~}~~}}~|}~||}~~}|||||}}|}}~}}}|z{}~}||}}|}||}}}~}}}{{{|}}||~}||{|||{{{||||{||{z{{zzz{{zz{{{|}{zzzz||{{{{{||{{z|z{|||}}|{{{z{{zz{zzzzzzzz{{{{zzzz{{{zzzzzzzyyzzzzyyyyyzzzzzzzyxxz{{yyyyyyzzyyyxxxyxxxxwwxxwyxwxwwwwwvwwvxxvvwxwvwwwuvuvwvuwlnmlnmnmnnnnnoonnnnnnnnoooponnppqpopqqpprqqpppppppqqpqrqpqqppqqprtqrrqsrrrrtttsststtssrqrrssrrsrttsssttttsssrrtuuutuvvttuuttvvvuuwvuvuvvvuvwwuuxvttvuttwwxxwwwxyxxwwwwwwyyvvyxwzyxxyyxxxyyyzzzyzzyzzxxzzxzzyzyzzzzywxzzyzzxzzzzzzzzzzzzzzzzyzzzyzzz{|zzzz{{{zyz{||{{{{|}}||zzz|zz{{{}}||||{{|{z||}{|}|}z{|}~}|}}}||}|{{}z|{{||{{||}}}}|~~}}}}|}~~~~}~~}|~~~~~}}}}~~~~}{}}~}}~~~~}~~}}||}|{||||{~}~~}~~~}}||}}~}~{}~~}|~}~|~~~}}}}}}}~}{{|}|}~~~}~~~}~~~~}|}}||}~}~}}~~{|~|}~}}}}}}~}}}}~}}}||{}~|{||{}|}}|}~~}}|{{|~~|~}}}{|}||{{|}|{|}}{{{{{{{{{{{|{z|~}zzz{|{zz|||||z{z|{|}{{|}||{{{{{zz{zz{{{zzz{z{{zzz{zzzyyyzzzzzzzzzzyxzzzz{{zzzzzyyzzzzzzzzzzzzyyyyyyyyxxxvwxxzyyzywvwywvvuwxuwxyxwwwwxwtuwvuwmnnnnnnnmmmnnnnnnnnppoooopqpppooooopqqppqqppqqqrqqpooqrrqqrsrppqqqrssrrrrttssssrtssttrqssttrrrsttttuttssrttttttwvtuvuvututttuuuuuvwwvvwvtvwwwvwwuttuuttvwvwxvwxvvzyyxvxwxyxvyzzyxzzyxzzyxyyyzzyzzzzzyyzyyyzzzzzz{zyyxyzzzzxzzyzzzyzzyzzz{{zzzzzz{zzz{zz{zz{{{z{|{zyz|||}}|{zz|||{z{}~}|}~~{zzzz|}}}}||{{|}~~}}}{z|}}{|}{zz|}~~|}}}}}}}}}}~~~~}}~~|~~~~~}~}~~||~}~~}}}}~|}}|}}{~~~~}}}}~}}~~|~~}~~~~~~}}}}}}}~~}}}~~~~~~~~~~~~~~~~~~}}}}}~~~~~|}{}}}}~}|}~~~||~~||~~}|||}~z|}}}~~~}~}|z{|}~}{|}}~|||}~~}|~}}|z{|{{{{|||||||}|{{{{|z|||}{{|{{||{{||||||{{{{|{z||{{{{{{zzzzzzzzzzzyzz{{{zzxzzzz{{{{zzzzzzzzzzzyxyzz{{{zzzzzyyzzzyyyyzzyxwwxwxyzyxvuxxxwwxxwyxxwwwwxvxwvuuuxonnnooonooonnnoonopqqpoooqqqppqronnprrqopppqqqppqrrrrsssssssrqqsqrsttsssrssrrststssttsststttttttuttttsssuuttuuuwvuvvvwvvstuttuuuvvxxwwwvvwvvvwxywuuvvuvwwvwwvwxvxyxyzyywxyxwxyyzyyyxxzzyyzyxzzzzyyzzzzzzyyzzzzzzzz{zyxzz{zyzzzzzzzzzzz{{||{{zzzz{z{z{{z{zz{{zz{}}{z|}}}~|||{{|}}{{|}}}|}|||{}|{{|}}}}||||}~~}||}{{|}|{|}|{|}~~~}}}~~}}}~~~~~|}}}~~~~~~~~~~~~~~~~~}~~~~~~~~~~~}}}}~~~~~~~~~~}|}~~~~~}|~~}~~}~~~~}}~~~}}}}}}~~~|}}}}~~}}}}|{||}|~~}}~}|}|}~~|{}}}||}}|}||}~}||}}||||||{{|||}}}|{|||{{||||||{{||}|z{{zz{|||{zzz{zz{{{zzzzzz{{zzzzzzz{{zyyyyzzzzzz{zzyyz{zzyzzzzzzzzzzzyz{zzyxwwyyxxyzxwxyyyxxxxxxxwwwwxxxwvuttwonnooppoooonnnooopqqqppopppppprrqoprrssqpppqqqppqrstttssttssrqqsssrrrsssssssrssrsrsstttussttttttuttuuttsuuttvvuvvvwvvvuwuwxwvwwvwwxywwwwxwwvvwxxxxwwwwxxwwwwwxxwxywyzzzyxzyxxxyzzyyyzzzzzzzyz{zzz{zzzzzyyyzz{zzzyz|{zyzz{zyzzyzzzzz{{{||{|||||||zz{{{|z{zz{{zzz|}||}~~}~}}}}|||}}}|||}}}|}}}~||}~~~}}}}}}}}||}~~}}}}}~~|}~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~}}}}~~~~~}~~}~~}}~~~~}}~~~~~~~}}}~}{{{|}~~~||~~~}|{}|~~}}{|}||~~~}}}|}~~|{}|||}}}|{|||||~}||}}}|||}|||}{{|{|{{|||||||{{z{{|{{{{|||zzzz{||{|{zzzzzyzzzzzzzzzz{|zyyzzzyyyzzz{zzz{|{zyyyyzzzzzyxxyzyxxyzzyxyzyxxxxxxyxxwwvutvnnopoooppooopponopqqpppoqpoppqrrpoqroprqqqppqqpqrrstttsrttsssrqrtsssssttsrttrstrsstttttttttttttuuvvvvutsttttuuuvuvvuuutwvwwwvuvwxwxxwwwxxxxyxxwvyxwwwxyyxxwwxxxyxyyyyxyzyzyyxxzzyxyyzyyyzzzzzzzyzzyyzzzzyyz{{zyzzzzzzzzz{{zzzyzzzzz{{{||{{{{|}}}z{|{|}{{{{{|{z{||||~~~~~~~}~}{{|~~}||}~~~~~~~}}}~~}}~}}||||~~}}||}~}~~}~~~~}~~}~~~}}~~~~~~~~~~~~~}}~~~~~~}}~~}}}~~~|{{|~~}|~~||}|}|~|}~||}||~}}||}}~}}|}||}}}|{|}|}|{}{{|}}}}}|~}|}~|{|}}|||||||||{{{||}|{{||||{{z{|}|{{{{z{{{z{{||{{{{zz{{zzz{zzzzzzzzzyyz{||zzzzzzzxxyyyyyyyyxyzzyxyzyyxxxxxywwwxxvuunopppopqqpoopponopqpoppprqqqqqqrrqssqqrrqqppqqqrsssssssstttttsssrrstttssrrtutsttsttttuttuuttttuuvvuuuvuuttuuuuuvuvvuvutwxvwxxwwyyxxyxxxywxyyyyxvxxwwwyyyxxwwxxyzzzzyxwwzzzzzyyzzzzzzzyxy{{{{{zyzzzzz{{z{yyz|{zyzzzzzzz{zz|{{zzz{zz{{{{||{{{{|}}}|}}z{}|||||}}|{|{|}~~~}}||}}|||}~~|}~~~~}|}}}~}|}~~~~}}}~}}~}}~~~|~~~|}~~~~~~~~}}~~~~~~~~~}}}}~~~~~}|}~~~~~~||~~|}~|~}}~}|~~}}}}~~~}}}}}}}}|{{}~}}||~{{|}}||||~|{}}{|}|||||||||}}}}||}||||||{|{{{|}|{z{{{{|{{||||||{{z{zzz||{{{{{{{zzzzzzz{{z{{{zzyxxyzzyyzzzzzzzyxxyyxxxxwxxxwwyyxvupoooppqpqqqpooopqqqqppqqqqrrqoprqoprrrqoqqqqrrqrstssstttttssttttvvuuutuvttuutsttstttuutttuutttuuuuuuvwvvvuuuuuvwwwxwwwvxwuvxxvvxxwxxxyyyxxxxxyyyxxxxxyyyyxxyyxyzzyzyyzyzzzzzyyzy{{{|{zz{||{{{yy{{zzzzzyyzz{||zz{zzzzzz{zz{||{z{|zzz{{{||}|{{|}}}~~}zz||~}|}~~}||||}~~~~}~}|}~~}}|}~~~~}~~~}}}}}~~}}~~~~~~~}~~}~~~~~~~~~~~}~~~~~~}}~~~~~}}~~|}~~|}}}~~}}~~~}}~~}||}}~~}|||}}~~}}~}}}}}}}||~|{}~|}}||}}}}}||}}}|||}}}}}|||||{|}}|{||||{{{z{{{{||||z|{z{}}{{{{{{{{zzzzzzzzzzzzzzzzzzzyyzzzzzzzzzzzzzyyyyxxyzxxxxxwvpoooppporrrqppqrrrrrqqqqqqqrqopqrqqsttrqrrrstsrstttssttttttsstuvvuttssttvvuutttttttuuutttvvtttuutvwwwxwvwvvvvvwxxwxyxywwxxyzyxxyywwwwyzxxxxxxyzzyyyyyyyyzyzzzyzyyxzyz{zzzz{zyzzyyzzzzzz{|{{{{zz{|{|}}}}}zz{|||{|z{|{z{|{z{{|{{||{zz{z{{{}}||}~~~~~~zz{|~}}}~~}}}}~~~~~~}~~~~~~~~|}~~~~}~~~~~~~~~~~~~}~~~~~~~~~~~~~~}~~~~~~}~~}}~~~}~~~~~~}}~}}}~}}|||}~~}}}~~}~|}~~}}}~~~~~~}}~}}~}}~}}|}}}|||}}}}}}}}}}||{|}}|{{{|{{|}}|{{{||||{||{{||{{{{{{{{{{zzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzzyyzzxwwwyywopqqqpppppoppqqqrqqrrqqqrpoqrqpprrrrssrsstttttsttuuttuuttttsstuvvvvvutuvvuttuuttuuuuvuuttwwttuwwvwwvvxxxwwwxwwyzywyyxywuuwxxwxyzzywvvyzyyyzzzzzyzzzzyyyyzyz|zyzyyyzyz{yzzz||zzzyzzz{|{zzz{{{|}|||z{}||{zz{||||||{{|{{|}{{|{|||}||{{{{||||||}~}~~{z{{}}}~~}|}~~~~~~}~~~~~~~~~~~}~~~}~~~~~~~~~~~~~~~}}~~~}}~~~}}~~~}}}~~|}}}}~~}z|~~~~}~||~~}|}~~~}}}~~|}~}}}~~~~}|||||||}|||||}|||||{zz{|}|{{|}|||||{zz{|{{||||||{zzzzz{{zzzzzzzzzz{{zzzzzzzyzzyxzzzzyyyzxwwwwyzwoprrqqrrrssqqqrqrqqqqrrrsqorsrrqsrsssttssttsttttuuutttttutttuuvwwvtuvvtttttuvvwuuvvvwwvuuxwuuwwvwxwwwxxxwwxxxxxzyzyxxyyxwwwxyyyxzzxwyzzyzyzzzxyxzzxwyzzzzzz{zzzyyzzzzzz{z{}|{{zzz{||{{{{|||||{{||{{|zzz{{||||{}|||}}|z{|||||}}}|||}}}~~}||||~~}}}{||}}~~}}~~~~}~~}~~~~~~~~~~}}~~~}~}~~~~~~~~~|~|}~|}|~}}~~~}}~~~~~~||}~~}}|||}}~||}}}}}|||}}|{{||}}}}}||{|}|{z{}}||}~||||{{zzzz|{zz{zzzzz{}}|{{{zzzzzzzxyzzzzyyzxwxyyxxyopqrqrrrprrqpqrrrqqqqrrrrrqstrssttttttttttttttttttuuuuutuutuvwwwwwwwwwvvvvuvuuvtvwwvwxvuuwvuvwwwxxwwxxxxwwxxxxxzyyyxxyzzzywwxyyyyzzyyzzzzzzzzyyyyzzzzzzzxyzzz{{yzzzzzz|~||}|{|{||}}|{{||}~~|{z{|{z{}|{||}}}~}}~}~}}}|{{|}}|||}}||||||}}||}}}~~~}}~|||}~~}~~}~~~~}~~}~~~~~~}~~~~~}~}~~~~~~}~}~~~}~~~~~~~~}}}}}}~}|}}}~}~~~~~}}}~~~}}|}}}}}}|}}||||{{{|~}|}}|||}}|{zzz{{{{{{zzzzz{{{{zz{zzzz{zzzzzzzzyzzzyxxxyyppqrrrsrsttrqpqrsrrrrrrqrrrssrstrrssrssstutttuttttuwwutuuutuuvvvuuuvuuttvwvvuuvtwxwwxyxwwxwwwvvxxwvwxxxxwwyyxxxyzzyyxyzzyxwwxyyxwyzzxxyz||zzyzyzxzz{{{zzz{{zz||yz||{zz{}}}~}|}|}}~~}|||||~~|{|||}|{{{|~~~~}~~}|||||~}|}}}}}}|||}~~}~~~~}~}}|~}~~~~~~~~~~}~~}~~~~}~~}}~~~~~~|||~~~~~~~~~~}}}}~~~~~}}}}}}}}||~|||}||||~~}||||||}}|{{|||{{{{zzzzz{{{{{zzzzzzzzzzzzzzzzzzzzxxzzzqpqrrrsrqrrrppqssssssssrrrqrqqststuuttutuuuuvvuuutvwwuuuuvvvvwwvxwwwxxvuuvvvvvwtxyxwxxxxxyyxxwwxxwvwxxwxxxzyyyxzzyyyyyyzyyzzzzzzxzzzxxxy|}zzz{zzyyyz{|zz{}}zy||zz|}}|{{|}}~}~||{|}}}}}|||||~~~}~}|{{}~~~~~~}~~~}}~}}~~~~~~~~~~~~~~~~~~~~~~~~}~}}~}~~~~~~}}}~~~~~~}}}}~~~~}}}}}}~~}||}}}|}~~}}~|{||{|}}|{||}||{{{{|||{{{|{{z{{{{{{zzzzzzzzzzyzzzzz{zqpqqqrrqqrrrqqrsrrrsssssssqrrrstrsttsttttuuuvvuuutuvvvvwuwwvvvwwuuuwwwvvvwwwvvxvyyxwwwwwwyyxxxwwwwwxyxwxyxzzzzyzyxwxzzzyyyyxxyzzzzzzzzzyz{zyz{||zyxyz{z{yz||{|}{zzzz{{{|~}~}~|{|}}}}}}|}|}~}}}}~~}~~}~~~~}~~~~}}~~~~~~~~~~~~}~~~~~~~~~~~}~~~~~}|~~}}}~~~~~~}||}}|}~}|{{||{{|||||||{{{{{zz{{||{zzzzzzzzzzzzyzzzzz{qqqrqrrqsttsrrrssssssssssssttststtttstttuuuvwvuuvuuuuuvwvwwvuuvwuvwxwwwxwwvvvvxxwxwvwxxxvyyxxxwvwwwxyxwxxwyyyzyzzyxyzzzzzzzzzzz{zzyzzzzzzz{z{{|{z{zzzzz|z{|}{|}}}|{{}~~}}~|}|}}}}~~~~}~~}~}}~~~}~~~~~~~}}~~~~~~~~~~}~~}~~~~}~~~~~~~}|}~}|}|{{|||{{|}}|{{{{{{{zzzz{zzzzzz{{zzzzzz{zzzzzz{qqrrqqrqqrrrrttstttsssssstttttttutttttuuuvvvvvvvwwvuuuvwyyxxwwxxvwxxwvvwxwuwwwyxvwwwxyxxwxxxxwvwwxxwxyyyyxyyyzyzzzzzzzzzzzzzzzzzzyzzzzzz{{|{{{|{||||{zz}~}||{{|}{{{{}}}|~}}~}~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~|||{|}~|{|}}}||||||{{{{{||{z{||{{{zz{{zz{{zzzzz{qqrrrrrrtttstttsssssstttttttttuuttuuuvvutuuuvvvvwwwvuvwxzxvwwwwxwwwwxwwwxwvxxwxwxyyxyyxwvvwxyxwxxyxwxzz{zzzzzzyzz{zzzz|||{{{{{zyzzz{zzzz{||~{}}}~}|||{|~}|||{|}|}}}}~~~}~}|}}~~~}}~~~~}~~~~~~~~~~}}~~}|}}||~}|||}}}}}}}}||{{||||{z{}|zzzzz{{zzz{{zz{||rrsssssssttttttssssttuuuttuvuttttttuwwvvvuvutvwtuwxxwwwxyxwwxyyywxxwvvwxxwvwyzxwxyzzzyyzxzxyzyzyzzzzzzzzxz{z{z{z{z{zyz{{z{{|||||z{zz}}|||}|}|~||}||}}}|}}|||}}}~}||~~}}~~}~~~}~~~~~~~~}~~~}}}}~~||}~~~~~~}}||}}{|{|}~}{{{{zzz}}{zz{|{{|}ssssssrrstutttttssstttttuuuuutttuvuvwwvvwvvuuwwvuwyyyxxxxxyyyyyzyxxxwwwwxvvxzyxzxxzzzyyzzzyyyyzzzzzzyzzyy{{{{z{zzzz{{{{{{{{{|||}{{{{||||{~~~||||~}|}~~}|}}}}}}}~~~~~~~~~~~}||}~~~}~~~~}|}}|{|}~|zz{||{zz||z{zz{{{||tttttsssstuuttttttttttttutttuuutvwwvwxwvxywuvxxwvwxyxwvwxyyyyyyzyxxxxxxwwyxwxyyyxyyzzzzzzyzyyzzzzz{zyyzzz|{{z{{zzzz{}||}{}{{}|{}||}}{{||{~|{{}~}}~~}|}~}~~~}~~~~~~~}~~}||}~~}}}~}}~}|}}|{|~~|z{|}|{z{|}||z{{{{{{ttttttttttttttttttutttuututtuvvuuwwvwxwvxywuwyxwwwwxwvvwyyyyyyyyyxxxyyyxxzyxxyyyyzzzzzzzyx{zzz{{z{|{zzzzz|z{z{{z{{z{|{{~|}|{}|{}||}}{{}}|~|{|}~}}~~~~~~}~}~}|~~~~~~~~|}}~}}}~~}}}||}~}}}}||}~~}|}}|{|||}~|{{{{||ztttttttttttttttttvvuuuvuuuvuvvvuuwwvwxxwwxwvxzyxwwxyyxxyzzyzzzyyyyyyyyyyzxwzzyy{yzzz{zzzyx|zz{{{{|}|zzzz{|z{z|}}||{{{zz}{}|{}|z|||}}{{}~}}~}}}}}~~~~~~~~~~~~~~~}~~||}~~~~~|{|}~}}}}||||||}|{|||||zttttttttutttuuuuvwwvvvvvuvvvvvvvuwwvwxxwyyyxyyxxwwyzzzzzzzyzzzyyyyyyyxxyyxwyzzz{yzzz{zyzzz|zzz{{z{||zz{z||zzz{||{{{{{z{}|}}|}|z|}}~~}}~~~~}|~~}~~~~}|}}{||~~~~~}}}~~}}}}}}}}}}}}}}}|}|zttuutttuuuuvvvvvvxxwvwwwvvvwwwvvvwwwxxxyzzzzyxxxwxyzzzyyyzzzzzzyyzzzyyyxxzzxy|{zy{zz{zzz{{|z{z{zzz{{{|}|||{{|{}|{{||||}}|}~~~}|}~~~~~|~~~~~~~~~~}~~~}|}|~~}}}~~~~~~~}}}~~~~~~~}|}}{stuuuuuuvvwwwvvvuwwvvwxwwvvwxwvvwxwwxxyzzxyyxxyywyzyyzzzyzzzzzzzzzzzzzzyyzzyz||{y|{z|{z{{}|z~z|{{{|{{|}}||}}}~}}}|}~||}~~~}~~~~~|~~~~~~~~~~}~~~~~~~}}~}}}~~}||}|ttutuuvvwvxywwwuvvvvvwwvwvwxyxxxxxxxyzzzyyzzzzzzxyyyyyzzzz{z{zzzzz{|||zyzzyzzz{}{||}}|{z||{z{|}|z|}|}zz|~}||}~}|}~}|~~~~~}~~~~}~~~}~~~~}~~}~}}~~}|}~~}}}{zuvuvtvuuuvyyvuvvvwwxxxxwwvvxxxxxxxxxyzzyxyzzzyxyzzzzzyxyzzzyzzzyzzz{{{zzyyz|}{{|zz{||{{{}}||{|}~~|zy||||~}||}~~}}~~}}}~~~~~~~~}~~~}}}}}}~|twuwtwvwvwxxwvvwvwxxxxxxxxxyyyzzyxxxyyyzyyzzzyyzyyzzzzzz{zzyzzzzzzz{{{{zyz{||{{|zz{|}||}}{{||||}~}|{}|}}}|||}~~}|}}}}~~~~~~~~~~~~~~~~~}~~tuvwvwwxxxwwwwwxxxxxxxxxxwxxwwyzzyxyyyyzzzzzzzz{zyyzzyyzzzzyzzzzzzz{||||{{zzzz{|{{|~~}}}|zz|~~}|{}~|}~}|{}~~~~~~}~~~~}~vuwwxuvwxxwwxxwwzyxxyzzyzzzzyxz{{zyzzyyzzzzz{{{{zzz{{zyzz{zzzz{{{zzz{{|||{zz{|}}}|}}}}}}|||}~}}|{||~~~}|~~~~~xuwwzuvwxxxxxwwwyyyyzzzyyyzzyxyz{zzzzzyyzzzz|}{zzz{}|{z{z|||{||}|{{zz{|}|{zz}~~~}||}}~}~}}~}{|{~~~~~~~~~~xvwwywxxxwxyxxyxwxyyzzzyzzzzzzzzzzzzzzzyzzzz{}|zzz{{zzzzz|{{z{{|||||{{|}}|{{}~~~}||~~}}}|}|}~~~~~~~~xxwwxyyxyvvwxzzywxyyxxyyyxxzzzzzzzzzzzzzzzyyz||{{{{zz{}}~||z|{|{|}}|||}~~~~~|}~~|}~~|~~|}~~~~|~}~~wyxyyywywyzyxyywxyzzzzzz{zzyzzzzy{{zz{||{zz{{z{}}}|}|{|}{}{}z~}|~{}||~~~~~~~~~~~~}~~xyyzzywyxxyzyyzzzzzzzzzz{zzzzzzyy{|zzz{{{zz{{{|}}{z{||{{|}{~{~}}}~}|~~~~~~~~~~|~yyxzzywzzxxzzzz|{{zzzzzz{{{{{zzyyz{zz{{|{{z{||||}||{{{|}}|z}{}|}~~|}~~~~xxxyyyyz{zyzzzz||{{zzz{z{{|||{zzyz{{{||}|||{|}}||||{zz{}|{z}{}}}~~|}~~~xxyyyzzy{{zzzzz{||{{{{zzz{{{{{{{{||{||||}}}}}~}|||||}||{|||}|~~~~}~}~~~yzzzzzzxz{zzz{z{}}||{{zz{{{{{{|||}||}}||||}}~~~}}}}|||}}|}}}}}~~~}~zz{zzzzxz{zz{{z|}}}|{{{{||||||||||||}}}}||}~~~}}|}}{z{}~~~~}~}~~{yzzzyzzz|{z|zz|}}|{{{|}|||||||{{|}}}}}~}}~~}~~~~~~}~~~~~~~zzzzzzzyz|{{~|z}|{zzz{{||{z{}|||||{}~~}~}}~~~~zzzzzzzzz{{{|{{}||{{{||}||{{|{{|||||}}|}~~z{{{{zz{{{{{{{|}}~~}}}}}{||}}|{|}~}|}~}}~{|||{zzz|zz{{|}}}~~~~~}{|||}}|}~~}~{{{||zz{}z{||~~}|}}}~}~}zz{}}~~~|}~~zzz|||||}{{}}~}}}}~}~}{{}~~~|}~~~}~~{zz{}||}}|||}~~~~~}|}}}}~~}~~~}{z|}|||}||||}~}}~~}}~|}~}}~~}~~~~|{{|}||}|}}|||~~}}}~~~~~~~}|{|}}}}|~~~}}~~~~~~}}~~~}||}~}}}~}}~~~~}|}}}}~~}}~}~~}}}~~~}}}~~}~~~~~±±ðïðñññIJIJIJòóIJŲŴųųȴɵɴȴȶȶǷȷȷȷȷɷɷɷɷʷʸʸʸʸʸʷʸʹ˹˹˹˹˹˺˻̻̻˻˻˻̻̻̻̼̽̽ͽͼͼͼͽͽ̽̽ͽͽͽͽ̽;;ͽͽͽͽͽͽξϾϽνξξνϾξϽϽϽннннϽннннϾϾннннннннлллмнϽмллмϼллмлйййкϺϹϹϹϸϷηηͷηηηζεζζεδʹͲͱ̳Ͳ̲̲ͱϛnķ˱ȾʴP/jƮÍj˰ɲywʲʼ@8vʣV=ϖsnS>kr̯hgʗZ˹XShХQ?;bɬnazt4.312>ˮ=JSĻ=xl¿ŲC?|ȾŽz8:ʷPɫtG|efʱъʕztfsŒP0-++-4ͰÕab/@NČQe8DiëbI81;N\gOxƴN+%|<ʹzamvaȱClzϽLDL:MϪtT3*131*+uʭ^VE,8HP1~IzL\ŨP535HVjh\>WƥJ,)P9N{IĽ}yqoj͗\faϳg͛Z`ud_}Q09H875../VSķ̮STV\,4=PL5g]gÿuPEY>l`ruBtʲɋ3,)RPKsZʰkzud\dSh`yjnʽ̷bn}eh|B7]nx_Yx>QjI-kuS\+.GcuylnC.ItWOEQ52,++6<9+PϹlDdxiS>PD=3,+/6th>77WnVrZ8Atgƀ;DJWTABDH:NtvqżЗ8`ȟTD2*4>46dϰyWk˱xQHi\68\5+.1K]O21.8G@I>+0-*.1.5.,3PǏbMmqF=89+)10++6Û_}h;9A>ċYD|ƽ`07yț8*../(,4ung<[KWZǧ_VD=N88`FKhiJ65E_uyʊscd<+++,'2)-44PP+.')1/+*.1./++/?1,.+PΔl\rzrB̓-3DtG#10eþh-.0'01,1QPkV4*3PaͺuJRgi4/D^r\9dlZaJ\lɽv\hf0++,1+-/+('70-+/.++1.+++.+7JC-.+,8]N«̵n|y}Xtjn=:4F6--.0,-29VzlLmG@SgKJAOUB-5DF\\gRjvştON87DH-J=E?:JJϢAJAb5ke(13JÄ0-/-)7..11GNC-,11pȸßvow6+DvO=0,3GJGfpB\x˷ijwM*3,,-,+-+./++..,.0/*+/++,3Lb>,,)//--m`˝jvszfJ]M..122+0,*...5WVWryhVV:;HM56V_QLLYA7nrvcfO¾ɥ`\GJ3SJ?3PPA6Dg9ɻʣOX<-2W[nyx>1+.-13.SezFsljȵxQS2-.+,,.,--,.,+--,.,,/..-+1<=6-0-/++/+c>oˬrz^aVl}AuVmD>5+-*+,,+-/,..>[QX>1,PDP\@>?9831C0P\=aD¿ËgE58D<^B=b~xX]l|<[vȾɽnftnnJ[UhV6,5:.,Vn87++/-*--/E8*.,-.)DqŽIz|D++.,118T?A0-,*-,,48576?vmTŒt_D1--+-,+.,+.+,,,--,-+,.-.-+/1.++.+-,,-*OO%>kɫP:QuG*kvtyK?*;3+0+-+-/0,,..>@u\t=*2JL@ZMB>,(..10ON|4>WdDnT\771FK7VW9Du[>X[A++Sľ£D'8PQW|ɮyn`\G.-+,3/4@9/+3,,.----.,-,-++2*Uf[˓`Ŀϭwḻ|B/,.-++-8I+-)+..:70B>1,/3neXúnhh<,,.,.-+-,+.,,-------.+,.,-+-+.+,/,,*-7'*-5=ơoO6F\<-oczTviSf[1-.-.,1,,18,-,0:4LP7./.PH=TE1401-+->EA\Kpz5@P^NOUƇ¾ƟbXbZP=5,.bW6:-,Hƿ¿Ɇ2.GlanE324-/+--,.)*+-+-.,/,.-)/0+-++*9ccDxʽŕN`P|Ͳh>HΖM,,),.,--(+.-,-+490+,83+,/8;}ʪG1U?>.--,---,----,-----,,.,--,.-----,,--,,22-0*4Űb189AON2gQb\>7<>J-+-1)6-/+32--,'317we@,125L<>B085,+/>OnztPB_a,1MoqKpVǘyýòQV81,.PX3:4JƵſĽƾå̿8AmxNjϙudG.1(..,--,,1+1+-,,.,,//-+.+,.6YcQ>JРƥRTZP`ʫWKSʴ3.+1+,-(./5.+.+,03.0+-/,.+0>}D*16J1.-,,-.,..,-,,------,.--.,-.,+-.--+-+-.+.-EǷh.9Dnr\Dzk{R^N+AI/.+/+-*2+,./++-.,.+>zkwU_\J:FV5C33117/1-(uVK94Mpc\J41+9UeLxEwVLk¾²nuni|o]<:4>.*8P6-+Jxʴsÿã;ѽusâg:FcQYf|wjF.;6*-0++.0.,+..-/-.-+,,,,,/*1BK;-Z_}ǒkhbzpYčPt}../)-.,-,+2-.-/+*/.,.+..-+.0:5NW2,+,3/,.-,,.,-,,--------.+---.,,--/,+--...-+++5C|ƥhI>WM]{heD_pZita`V74/+-./+0+.,-*-.+--.+7@4LiP:118<,6-8@TK51,-zheLJBPfw0.-.->;C80.+D8OP|s-0,+1'JrkZD2uJCpĸd_[°|PJ=J67:9*3(.++.1,=zzzoþ¿ǜPn¹g~gpF-.?bJ:ʟXBEP>*0,--,+,-,--,,,,,,,,,,,+,-/(Jdprjy~qB.kcl?6P{nԴS+1+++,--,+-,,..,,.,0-,1.*,/,./':J*-.*.)/+-,-------------------------------..++.,+>ʵa`ȾwA14?Oen8iDG/9BC}rSeJ[ouoi^0,.-+.,.*/,,--,/-+,+-./0Yqht1+,-,+,/+*,,.+,+137mw3+,/).1+71)9|G@;n÷[Pfud|rbcf[5.657,2/6DdPjsƬ½gnĽĵzÿûǫxkwAD4-1>=BvϺlU1,.,--,+----,,,,----,,,,,,--.Bgs~z\O<-/jQ>1H8_ftz>0,,,,---,,-,,..,,-,.,,--+,./+,.+-.,,,+,,--,,,----,------------------------,+-/*1?9<}ͽͥ?Zn̰rS;MEVSPuA7,16<_nsca\|QPrVbgfP3+-+/+,.+.,,,--+--+..)+2ROFY4++++-.,,-,,,--+-,*Plb[WxI,+,++1-1)1Wn798\oRh±mPjngWZhdSYGKHK94NW[271?92^{ubî_nzĆnƿÇ[|be4,,:D?EʹœE./-+,,-,,----,,------,,,---,,-*0?KchÓsE0\;3TrFhoYkWGB1+,,---,,-.--------,--+,---,-,,,+-,+.+.,.-,,-----,---,,-------------------,.++./7.0pYqɟbN@QinCXXvJ*,64-*HZZ[>lxVRYqT|z^S]840++.+,.,,--,-,./+.0+++-)>JK>@fG1-,+..+-.+,//1++-+3>0:da;-1+,,,./2;b>8AAwkQYǴuQCPzzPUPIA7@:1++1DMG;3,-1+tVJXqXÝrlþšXbµqRuK.+AFG:Y|G5*,+----,,--,-,-----,,,,,--,,,/0PWQyqÓpva>1,^}J<0J2GE.------,,----------,..,,-,-,-,-.,+,------------------,,-------------------++-..++.2avtyeƽ~zbaSY17cmooj:*/59/28B1X]:IFRPj}MjfxF8goUAhĜh`btvbbU`V?37-21.QW/00BsMA6;,cʢqPHzmvkƾÿbemnzþ̙\wszCbutnAE8-,+9<2)ViF[C&+0.,-,-,,--,-----,,,,,,---,,-+,Y`iVPG_bǥOPdV--1Bhb<+..2/*/,-,,----,---,-..-,-----,,+--,,++,,---,-,,-,,,,,--------------------------,+-++1/+,BbTy`g½ɩK\fc2.P~mVJQ?*/>NM/*4AXJuK\P2`Z9NXi^X\)Mgn:=;U9&+)0/,-,,,,-.-,--+-/,+56/1Jc9//--.---++,++.+.,,20HQvrYI\n¤K2-,.+,C\knjgBb2=:1KhtcbWbfd{ɯeb1Pǿk@/0--96/)%PP@11@dîz~fQAcxŽkloĽbtPqNR^r\lbhls6,4.5<3//-6BhT11*,-,,-,,--,-----,,,-----,,-.11.//>=6&0:Xy„BUK?*/,/811-//.,-0.--,,---,,---,---,,-,+--,-+,--+,0+,,-,-,-,,,,,,,---------------------------,*/-+).*LRpV_R˜`JC@J>/-2AwaW=-,-,(1DGQbn|^mR`JDOzmM_hqun@BvHo[C~|B+1AzA5+1,/-.-).,--,,,---+--+,.1/.++Eë[)1-,,,,-.-,..++,.,).4+/\xMbzr2+120+++3afzvY7C86;QhRw``cGE\rMCVhQ=ws`YM517,1/+/375B;8-:2Dy˱h=KJfsýĪPTø\854GCzyS`T9J8+/,+.,++7?137+,0,,,,-,,--,-----------,,----)-32---,..Kk\>2.-+.+'1+,(0++,+.,,,--,,,------,,---,---.--+,.,+,-,.,.,-,,,,,---------------------------,,-+-,./)3CUichŽlǻʾҥxP-00+,.,>r^uDLK31),,-,,J{~LJ@RQbszE:98Pm}m?IhSE\,4I^eJwA,OfbM6+-++/+,,.---.,,+,-,-/,+.+,++/-6dpt[206,.+-.,,-.--,+-+,-,/,+2Tkj;Lm=-./+,,0'^iQ?F5J>?XVwhmKYldMhiW;gklH:--=7Jzɠ{R>P`k¾ÿ×tRRyȽȧO*-+G5,5CeG3-,9A--)-*//*/Ea51+,)/,-,-,,,,,-------,,-,,,--,,.,A9.+--++Zƹz@*0.,30,+./)/-..,----,,,,-,,---,,,,-.,-.---.,,.,-,-----,,-----------,,---,---,,----,,,,++,--,.+--*4GςXxżjǿ}?.+/*.>@`zxLTp:1D5+0,/+-11VZ53VVbz\i\EJ66CMPrvyA4gtqaVP)-.>ZEy~J7IbB1/-+,--,,,--------,,,,,,-+.,.-,6iPytWJ40++/..--,,,,,,--,,,,,---1BM/)-4K7/+/++-/*.6JVdPUCGgxdjlTS`vP?brYOLtYF2.-..CP:jb^Zz|nvyPcy½¾ýncnh]Teôs=-,5,-+EK++,+*+-,-,-/+->xvJ/,1---+-,,,,,,,-,,,,---,--,,,-.+4>11+-.*-FD.,*/1.++,--,--,-,,,--,---,,,,,,,,,,,------,,---,---,,---,,,,,,,,,,,,,,,,,,,,,,,,.--,,-++,,-.-+,.++N}h[no`ÿɹM9(...02@>y|D:q~hI?R7+.+-0-,.-33018[b`lcU7P85Cfotm0JqZttg<9*+,+==VqvC.Qa9/+,.---,,-----------,,+,+.---/0DǜnO^;.+++.++.,,,,-,,,-,------,,+7J-/)1,+,/0,,-/(2b}PeXJH\Wz¨}o`/ECOdwmP8.Bmmro`4--*,-('3)V\_JBHBV[b@0+7B2n[zVJ\hystQLhuĠYÿƥ¾«S\~UKizaǵwF>6.+.,2,6[o10-,+,----0*-,+131/41.+-,/-,,,------------,,,,,----31*/.,+0+/Krnwe\gSQJ,+-,++-,.,-,,-----,,--,----------------------------------------------------------,,--..--.-/1+,+).1W\noUhJjf_?ƱyK0*0883/1hVPS8ZppR73kY00.1+-,0+)-/+bY`qcnY,(0DV[\bY76,:I7COWfP0+-1+-0-FmBW8.Dnb).1+---,,-.----,----,-,-+.,,-/1D}hQIfVy<'-..+0-,-,,---,,,,,---,---0:03/0).tgFi[fv~r@u_X29KIb~feJ7[^ýOûL¾jI7syfggcʽ|P6=E+1,.%+)8D0).,,..---+-,.,+<>.1*-,,+,-,,------------,-,,----,.++1*.-.+&0+7iubD0++0/-.,+,,---,,---,-,,,-,-----------------------------------------------------------,,,+,,,-.-40,/--+3;2c~pJTF½ɫSRI^P:93//6|hlLMhUDVspV-8nV++-+/-,+*0..8H51I{CLth/,1?R]r|tLV1L+1<,:VEDJ0++../--*SD,0,2;__^fX'.*---------,-------,+.+,+++,//9hh9*0,D\ozT:-+,+,+,,.--------,,,--,,,.+,3Rr/,,,1@18UUP;T\A>8HV-5C6ADDtì{gJswIA?863,8891HnD7DT{¯_rub^hr|H?Kfa15\w¿fxþ[\Eü}zgT.7cVPltq^g6**,3/..0.+-+,----,-,,,1+4/+--1++.+-,,------------,-----,,++0+/0--.*/,>]˴S/+1,+++,0/.,----,---------------------------------------------------------------------,,-,,.-.1.+0./,*-.=8Hc|bi{S+E@ń+08622+1+/FQ{Z_dfEhve8B/,1.-.+0*+-//0).C307l{U,>aQ2=44Hz}aXV78//DH1=Q\L4.-+/*,-1,`ra-+*+2htbUWZM9,,------,-----,--,.+-,,+,,.0/.+/06ZS1/,-+.+--,-------------,-+-181?czw:?..,-/.5/28-1.:6,.B]xS//-/TXIJVvPYbUVRg|hWE=?7B;WXebYpùO-+/+-:hzhehVlv;4>@818P<804OTF2,+?aXhotddvmR8Nta;2D|V,7Qi{jç~nHhuzeAfþ<123GXY\{P]J\;-/.+-+---.,,,,+-.,++.-.,*./.,++-/--,--------------,,-,,,,,/+./-+,+.18nSD90.++/.,/*+-.,,,-,,---.----------------------------------------------------------------,,-.,,.,.03-,+*+11Tgn]J30*1*>+++1,/*--:QgdNNL?_D/+/-.,,/+.-+,/>3-20-XgJ,00F9-061:VUacoRDM?91+16+DibbtN0+-,,--./*Dvya`81,1+-9Z~oD.,-------,----,,,--+,/,/,-++/10.8xy=,,--.+-,+,-.----,-----,,,-+1618OOh30(0,*+.,.++./,801b|H07641@DEZb}n^ZYD@EjtL039g~n]H8gZt:.++//7IeEOSjXLfdD80,-..1-.+.@D;.1/7+HX+5NP=KfJ/.2Oihs~sww tP10,@lxu]x@3-:4,--.+/).*/,--++-.-,--,+--.,+...+*-,,--------------,,--,,--,.-+=-,.-*7zY78+*++1-.++,,/*,0/-.-,-----------,---------------------------------------------------------,+-+,1/*/+/,4==SiwheM+-0(Ƚ=*++,,11.2^jn}P4;@.gjPB.(1/+.,--+-+..40+-6Ww,3'+1+.0+++0Zs>:?J;0+0,6_evnVi8+-+.+/+,.,7dNL1-+1+*-1a|D891,,---,,--------,+,++,-+/+0,/0695Iy_8nn\cN:SQC:Vh]jmeDNV†Q^JDbnkV999\nv{yAQVub4--+6blyllZ0//20+0+++++181@H?8M3?850-1/PQaoh1+1eVO¾h¥{wTXuÙcFG6*0I}}}nh[s:>2,/-.-,*0,+0+-,--+,----+0+-00+,+,-+---,,,-----------------------.=d0..,0.13/.+./--,.,,/--,)0,,00.---,,,---,-,,,,-------------------------------------------------------,+-,.43--+17x|H+.+,\§i1*+5.J8+(8]m72186JsJ'(+3++-,-.,.,+,..,1AnB3z4(4-+*-+,,2ZibUN2B5.+*-16\[9?t9(-/,-+/,++8h/,.,.22+,Lgg1))-,-+-..-,,,-.---..,+,.-1,+.,,.N{kvLGbqeFD47.-1,/+/+/00-++-.---.-,,,.+,5F>/>'61/,-.+6C3]ldZaJ2-9a008>JC3X\bX`e:Vbp>TKNz^QD>bt\W3)5C60*NûØtBcWtû­vgwSHrúnj1+*3+9JikxY_@,-+,.,.++-+,,+-,+,,+-+-,+0++.-.,/,-+-,,,,,,---------,--,,--,,-*03E0+,4%3;?1-))+,0,+.+*//4NZ:+0/-,..-,-..----,,--.--,,,,,,------,,---,---,,-----------------------------+.++1-./-*Acoӥ5-.+-1Jb̲^?1fV;57Au`:/-,,.(')12.,+-.------+,--+/@HU;%0}\J?.,+.)2@@8+Xh8'+.KK<*,09hJ3=Qa20=+1,/,.+--)+1Q3/,.+8J:Ggl3*-.,.+,-----,,-,/+.,+-,,+-+*1491/>ezkzOEdV1->>,/++41/,+.-)/+-+-..+,-+4696+4=B[.11+-+.*4@3^dkbS[b_`DY>18>K=PVc1.OvPnnzi]G4^nzP_7+?<*0,&++0-Crfùm3.(+/+/++-+XU0*/@`RDQRFV1+1AD?7K>Fa/)*//393+BÆLA,2Rje[R8@m;,+/,/AU^ba]ZR;3sd0,+,-.--,,-.-,.-+-.-0*.+-.+--.++.++.,-,,,----------,,,---,,,-,++.)0071/-B[T5+2)-6DJ;/.,,-./.,+.,.+++--.-,,---,,,,---------------------------------------------,,--++-,+.-1,))+0IKAUcsT+-)/*..TɱjZ_i=7vT]Iu9.*,113,/(--/0-,--,---,,--,0/)+7LJL9+++0.,.9YrV1HE95:8N2-0-*RH.-Qb936+0**,-.+.0*.S\72,,222Wzs~G+,-..,.-----,,,-+,/,.-,+-.0/,-Bd[TTuoJ816C7013/>@41.,+/+.-1/-++-,,--.:PVD>1+*\UiI(+++--,1E>+7/yjkY_P11H>Uz[9018du>-201735/,-/4BB[DF80-1-,.<8*>|jsD,-tuTnF=Tafn\(--0214EVnQNK^F.5?8,,-+-.,+,0.,,---+-,+.+,,*+1.,+-/-.-,*--,,----------,,--------*0.,,-BwK:=YYhkX;60J1-++-+/0-,-.,--,,---,,6eJwo;/*-*.0*/6<>2DC6D>186-+//AH5-0@>8-/+-/..--,,+.-9vn8-..116<8Q[F,--+-,,+-----,,-.--,,,/-+*,-0+7JPZcb8/12/9441>F8+)0,/--)/.,-+-+,--7nhIBF=13./-,1--+,8//2ZnjjbuebQ\J>4?YbDQM?H]bCbz`hR;6Yjuh:mR85+-/:B-Vi;9,+,++0715/-0,2LRRIqtsP5.+6^VN>*3N\:bK+>US9..++++,,...-,16FEQ,.,+.-,.-/44Jƽi/5\{b][úĨ_‡zejfb>/9J]W.0+,.2,67JP+,++..,,-,+-,+,/,,,--.--,.,.,+-+-,//+-,,/--,,,---------,,.---.-,+-,+./2OvB;IOY{jD4+<:60+0++.,..----,,,+/+-,+/-+.////.---------------------------------------------------,,,---,..+-*./.)/*+0.-,-/,,--)/5@Jɾǥ\FJEO6,0<8:A/960*/+3@+-,//,,,----,-,,---,-.>lYwT%0/0+-0.+*+/JSA4-->KdR/.*-+.-.11+1,./)++---+-,8iS>8J<1>IGNP1///01..-,+++---/*)=Q++.-,+,-,2L\^`J//++-++,*+/--/'6yOP[efhMA8G=/(0>prm33Tnn}V\G.7P[hAY6,+2+(0.4?ëh(.,3384//(++++/-T~nl\VL>+./@?68:1?O6J_<4aXTD-+-0+,0&0-*)-,.,53,/0--*,-,-*+VõvgW?+8Ykeq¹bf88+58:6F>+01+,+-4.=nL/*.,-/.-+,,,-/-,-,-,-+..+...08+--,,+,---+,----------------,,,--,+.+.++/1;3-bʺE/(/.--,-+,/,,..-,+,-,1+/1+,-,-./0/-,,---,----------------------------------------------,+,,,++1+,..+/+-../)*2+*2(,0++.-19YlÇG810+1-8.cn^>0/+1-/-./,+.,+-.,+,,,,--,,-*9;+804Z)1+..++-,/,+.-*/,0F_V51--+.(6-+./+)-----,,-,>MVF1-/1,+-----,,-+,.-+.+++7H>^]P945<>4@34;<;>30++,.-+,/0.31-+,175+-.-+----.(1ID-).,,.//,--,.,--;tazKnmkWFbXD{xQ.Wr_]~=+//.+018]gV:FNVVB4BbUQC2;.-.)1--,/,c}D*,.0hpB4..+-..,/14i7/./+-,-/*9,17//8,0m_d>F7/*1,34438<3+1.++,-.,-*/+2tt|f251*W|hnb;Ou[sWbS*/,A6cp4+,./+,.11`>;D[./-.,+--.+,--++--..+/+-,,-145H+-//+/>4+.-,---------------,,,,-...)/,/-,++/D8_·@,2+-0.,0++-+----,+-..),9C8+,.,,,-,,,-,,,,--------------------------------------------,--,,----+,1,+/+2+,**01)-0'1,).-0--.*,/HVPnr82)1)7J]jF831----,+,.+-----,,,-,,--,,--./0+-.FD0+.+1,.+/.+.+-/+.1VTRO8,,15648C9F7..,*,+,+,0/n}bI7;>2,.-..-----,,,+/D8*PzW>9ROMfksyg.31.-+/110+1?8+,/.+-,.,,+.-++;=85>LR2+..+/++-,-.+-/+(//EdY>0>PB18YL4.lvtzvEPot{SwV+++/HN;..,37LA>_`zKanV1(/,.,+/+,,/(.2h\XA>4+..,+,5D.*-.-/+.-+//+-,,--,-.-/+*,+).,,---------,,,-------------------------------------------,---,---,-,,/++-,---/+,-+-++.--,+,--+,+)+)))3ST<5:0).9bGVB+,+/*,/-1-.,-,---,------------,-,.+.(-,0++0+,-+.-.-+-.,4:**,-8AFF`n>^yvl]B.3.,-,0/11--3-,/+--+,-,,-.,++CEN>0(*+.-,--/-+-,-.,.+,-+/,)(0*751/3&1/@Vun|vgosnqUY`BB/{r]y1?;Bju]\P8S_\PUbKfYH<63%*+)-.+,-,/,/+.+++.9>Vi4,++.+/.)-+)6--,5]Q88qOg7?>:/(,18HhLzyJL:9A51,+CMbk]2:1+../++*.+4V]}QQE+1/>^{üuD/4+.-52/-+0,-)1+*,-,..+,/+,,,----------------,,,,,+/+,-,,-+-/+&'%'+)+.+.-+.,-.+,.+,,------+-/+++/-,-----,,---,-------------------------------------------------------,.-,.+.-+,-/,--,/--*-+0,--,+-+,-,*,(+-+,+-,++*--,.,+,+.-+,.,.---..---.---------,--0+,--.-/,/--+,.,.,0/18;:;DFnJP]QPYI,)0.)*,,+/;c;@ITmG+,++,/-+---,--,,,,-/,.+20-,+6546/*/,,.+*/2)/)/+..,+,..*--++.,.-,,,--,.,,/++0610,+.,,-,.+-,..+---,,1(+/-,++/--1,.,++4JV9JIK710:SO8Ubb`c6;>>@;8116;2..*736-K\^`Qdpusb9KaXbhndðe2*,,*F[8&1+/+---,,*,..+,+<`R>+.-,,,,-,,0,-+.0333):CbfzwdrN//+.---K|L|IzH+0+-1<:GT>6+-//,.,-/-,.-6:8=?zj=4.*/8{Q+,9=GSR=+,1.+0.01.,/*,)2F1-1XpR8+,-,.1...++.)-,-f{V+//10,,)8BA4*,-.+,1+.-,-------------------------,-.,-,-+--+1.--,*0.-,,-----,-.,..,------.+-+-,+----,-..----,-------------------------------------------------.---,.-,/--,-.,.-+..+.,+-.,.,-,-.-,.-,--.-+,,/0--+.*--,-/.-,,,,----------------------,,--..+-/.+*+,-,--..,++,0;>JZru]eb80--2+8004&>h\\OcZ7*10232+,,,-...---.--,,,,,---+-)10),000*/..,*-/)+.-,+,,,..-1..,-..-----,,----,,.,/0)+/+1,,-----------,-.,,-+(+0,-++-+++.+.+1/,-+,++//++0,.-++-//1+,(--%.,+.3%+,/0*-+13,023/5:98CGWvJ\tzytY]L1+(9Swk4+-.-,-.-,+4.,,,./-38rtYjf5..+,.+-,++.,/++--+,-/--1\ûx_dsu˜gP0+++,,OpLpO}hSH423G8G1///-+*,-).-,-*,+-1bhReJ,/1+>h[7SnJ3+0.5H.36:B61+,..%.,,1/5>@-*3ThPH;HU/++-,-+/,1,>rP*+CEA-+QhP5*--+,+-,.,-------,-------------------,---/+,.-*(,1/-,,-------,------,-----.-------,---,,----,-----------------------,,----,---,,----,-----------------------,,----,---,,--------,+,,,-+*+/1.*)-.+))-//-,,-,,-..-,,-,,,,,,-,,,,,,,,--,,,----+*+.0.,------,+-,1,-3KxvmI*+1./.,('EnC>8<17>>4/1,1-,..+.*1/-+++,,--.--,,,+,+/++1*,+1,*+*/0)*/-+-0-/*1+0+/,-,.,.+,-,,,------,,--,,+.*,0-.*-------------,-./++./-+-++./0,.0,-,/'1',3+++(.2+0--0/+(*-+3*,.,3,0++/..*+1+..#0,,,.*1-+'0/(/,.19:2?\hr{tkI@MZ|rM0,(,,,,----++,,++,/,/40n~F11,.++,+*.0/.,./,+-/-,)1,1MgmPoJ{n8G>,7]nlNYi[IJ\lD/:?QnXW>-+-2,8\J=995G?F\qN=/+++5LhcR|`1+-+0D.25PJ&.//(4DN21,).+%11:O`}sn~gNK4++.-(+87big0Ue5,Mtemub4.+,/--+,--------,-----------------.-,,,,-++,/0.+)-,,-.--,-,,,,-------------,-----------------------------------------------------------------------------------------------,,,,,,-++-/.,,&+/0/-.0/-,,,,,----.--,,,,,,,,,,--------------,,...-,,,-,------,+.+..+?Zbijhr}t5/++-,-1,OP3.1-(,*.,0*,/+0*--+.0),//,++,---,,,-,----+++,/,-,.0.--..,+,-,+/--+0.,+.--+/-,,,,,------,,--,,1*-++.,..----,---,,--,,-+0/+,.,,1,++.-+'..0,...-*././.+++-+*+/0.)+-/1/0((+.+/)*0/*-+.1-,++.+)+01++/,-//%++*.0,+-4O\yhT2+,/+,,------..++0/+,.,+0Zd50,...,,.-++--++..,,,,/3@JA@FenkhnO[K=9^P?_lbkn]zUhfRVO6ERYOF@309D<5a^jhSsax|{1,+-+>kėD,,,*/:*N?/+..*+2+611+//-/7+,6NOUJb\`1--1,1KN>A15*647/JiR/-/>PJ8./+..-,,,--------,,-------------------,,+++0-+++--,+,-----,-,,,,----------,,,,,----------------------------------------------------------------------------------------------,,,,,--,+,...-0/,,-.,+-,./-+,-.-----------------------------,,--.-,,--,,------/-.+-/--+.-+109>>IKQ..,.+1*+,--493,+++,.,/++.,.--/,,,-+0+++,--,+---,,---,+-,,-)1*.+-,).,,..,+--,++.,0+--,.--,/.--,,,-------,,,,,,.+0-)0-----,,--,,,--,,,./,*,-+,+...+-/1+-+-.*.,/,+,-,,.-..,+,--/0(.++0+/,.+,/++,--/+.,,-+)1-0++*0*+,/*0+----,+/+-.8JT[\b?++,.*1------,,)-.,-,,1*.--=yly85-/.0,+.-,+,,++,--,+--Z}UnVfjaw}N1.8M\phYTegB|gTKWlkXNP8-/Ef^^synarcoc}U4+-10O\nJ-++---2JG-/++-,JD51.+-,.,28>P{l{]pJ9(++11(-+-,1.47+.,,+/,+1+0--,0.++,.-,------------------------------,,+,..-,+,,-.-------,,------------,,,------------------------------------------------------------------------------------------------,,,,,---,+,-.+,-,,,-.,,..,,----------------------------------,,,,----,,------,-,-.,*.,.-+-+-+*++)-,-.-+.,.++++-/-.+,.+,--,-+-.,.++.+-/-,+,--,---,-----,+/,-./.----.-,-,,-.-,.+,,..-,-,-,-,-,---,,-------,-,,-++,..-,+-----,---,,--,,,/,+..,+-,.,,+-,+-.,/,.+-/+,.+-.*,+,//,,.,,,0,/+...,/+,0+.-+-*/,,+--.,,-.--,/.+,-.+-,+,,+/+-+,*+)+)..,.,,-,,----,--,,--++-,.5QH1JPjY11,,+0,+-/,--,,-,,./++AinW8ajxnn;..04OGF7d|d[@nt]\Vchw}jq[=gb|[\xkG(+/(F>3.5CMC_5NQI95.,>b}P5AyU9mZ<+*).2+8C?61sxb0,-./(1,*/(:0.0-/3(4:inbYA,+*43PlZ:5(,0,)-++-,/+,/,-+,--,,-.+--,,.--+--.--------------------------,,--,---,,---,,--------------,--------------------------------------------------------------------------------------------------------,,------,---..-,-,,,+,..+,..-,+---,,,,----,,,,----------,,,,,,--,,,,-------,----+0-..++---,-,.+.--.,--,-+.+.+-,+,.+,.,+-+,,,+*.-,-,-,+-+/-,,,-,+,,-,,,,,,,/*-0+.,-,---.--++--,,-.,+-.,+.,--.----------.---,,----,----,-,-------------,--/++,,--,.,-+-,-,+.,,,-.,-,,-.-,-++,---,+,/.--+.+,,1+-.,,,--,.,,+-,+----/-+/.++/+,+,,.--,.,-.-+,,+.--,.-+------,,..-,+,-,0+1+%,+-1)8bI:./)+---.,+--,,.-)-(3Ikxt?06(.0,2/./+1,+./=4OP>1+.jS83=;4HrFG;;@318<+*-/.+-/+.-,+./+...+-++.+-,-*...,,,---,,,,---,--,-----,---,,----,,--,----,,,--,,--------------,--------,,,------------,----,----,-----,---,,---,,----,--------,----,----,-----,---,,---,,----,--------,,-------------.,,--,,,+--++--,.+,,--,,,--------,,,,,,,,,,,,,,,-,,--,,,,---,,---.+--+,---,.,-,,,+-,--,,.-+-,-+---+/,,-,-..,---+-,-+-+.,,+,,,,---,,------/,,.-+.,,---,,,----,,--,+---,-,-+,-,,,,,--------,--,,,,..*,-,.,,---------,---,,---,-.-,---,.--+,,,+.,-+,--,,-.-,---,,,,-.+-.+/,-.,+.-,/,-.,-,/,.-,/-,+-,,/-,--,--,--,+/-.,---/.-.+,,+-+.,-------,.-,--,+--+-1+1(*,/@nvU2/.-+-,---+,.-+-0-.,2nn6-*1,+-0+.-+0,/-,(10++*0/Nogvn|úH]S_\@~G*./++LrF1(+0%2/+,..,+,.+-++,15GVVqY/305sZ1;,7D21&*,.1*++-,.-+------+--,,,+.-,--+--.-------,-------------------------.--.---,,-.--,,----.------------------,,-.--------------------------------------..--------------------------------------..--------------------,-.--,,,..+,.-,,,,,,--------------------------,,,-----,------.------..--,,-.-,------,-,,,,,,,,-----,,,-,++,--,--,,,,--,--,,,,,-,,,--,,,,,,,-,,-----,,,,,,,,,,,,------,--,,---,,,,,,,,,,,,,-----------,,,,,,,-.,,--,,,-,,-,,------,,,,,,,---,,,------------,,,,,--,,,--,,,,-----,,,,,-,,,,-----,,---,,,,,----,,,,,,,,,,-,,-,+,.-,,,-,,---,--------,++,.+-.-,-,*//--153/*.-+,-,,,,,,,,,,+++/6=@@J;>AHTS481.+.,-+-.+-.,*..*0+-/+/*0+202559+@\VYahvyM@?8E\xwE+5;>O>,+(08_V2//-.00,+,,--,++--.---/28;L]U66-,22.;-+/+/.--,++-.+,--,,,,,,,,,,,-,,,,,,,,,,,,,,,,,,,,,,-----------------------------,,,,,-----,,---------------------------------,,,,,,,,--------------------------------,,,,,,,,--------------------------------,,,,,,,,,,,,,,,,----,,,,,,,,,,--------------------,,---,,,,,,---,,,,-------------,,,,--,,,,,,,,------,,,--,,,,,,--,,-------,,---,,--,,---,,-------,,,-,,--------------,,,---,,,,--------,---,,,,,,------.-------------------------------,,,,,--,,,---,++---,,------,,,,--------.--,,,,,,,,,,,---------,,,,--,,,,+,,-,,,,,,,,,,,,-,,-,+,.-,,--,,-,,,,---,----,,,-.-,-,+,.+--,+,..+--+--,,--------/-,,,,++-.*-/-+0-,/--+--+-,,/-+-+0(/,+.+.,0,-,+-+..,.1+-136=F>4/,0,/0Efmtp880-*--0,,,-+1@G4-,.-,,-,-/-,,,,,-,../.--./310-/++,...+-+0).--,+,..,---,,,,---,,,----------,,----,,,,,,,--------------------------------,,,----------------------------------------------------------------------------------------------------------------------------------------,,------,,,,---------------------,,,--,,,,,,,,,,,,,,---,---,,,,--,,,,--,,,,,,,--------,+-,,,,-,,,----,--,,----,,,,--,,---,,-------,,,,,,,,,-----------,,,,,,,,,+,---,,,-,----,,,,,-------------------,,,--------,---,,,,,,,,---------,,,---,,-----,,,,,-,,,,,-----,,,,,,,,,,---------,,,,-----,-,,--,,,,----,,,----,,,,--,,--,,-,,,,----.------,.,,..++.----,,,-+--,--,----------,,-.--/-.+.*-,.+,----.-+,-+.--,,/)/+-,+-*1+.-,..,-,,/-,-,0-,,+,+,+.-.013B=25,,+/+-.++-.-*--,,-+---,,-.----,,--,,,--,,,,,,,,,--+,-,,.-0+-,-,,,-.,-----,,-----,,,--------,,----,,,,,-------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------,-------,,,----,-----,,,,,,,,,,,,,,,,-,,,,,,,,,-,,,,---,---,,,,,---,,----,,-----------,,-,,,---,,----,--,,,--,,,,---,,--------,,,--,,,,,,,---,---,,,---,,,,,,,,,,,--,,,-,----,--,,---,----,,--,,,,,--,,,-,,,,-,,,---,,,,,-------.----------,,-----,,,,,,,,,,,----,,,,,,----------------,---------------------,-----,,,,,------,----------------,,,-..,,,-,+-..,,,-,,------,-----.---,++,,+,----+..,-,.-,,,.,,-.,-+/--.+-,,----.--+.--,,++++,+..+-..-,,+,-,-,*,+.,.--..+,,..+,.,-,-.----,,-.-,,------,,--,/,+--+-,+/-,.,-,,--,,---------,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,----------,,---,--------,---,-----------,--,,,------------,,--------------,,----,------,--------.---------------,---------------------------------------,--------------,----------,----,--------,---------,----------------,,,,,--------,,,------------,-----------------------------------,,--,------------------------,---,---,----,,+----------------,--,,-..,-.,/+,.,--.+-,,---.,---,+/,.+--,/+.-,-,,-.,.,,./.+/-+--,-,-...,,.-0++/+.,-,--.-..--,,,.-------.--..,,--.--.--,,-+,-.,-.--,----,---.-----------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-.-----------------,----,---------,--------------,,---,------------------------,-------,--------------,----------,----,----,---,--------------,-----,------------------,-------------------------------.--------------------------------------------------------------------------------------.-------.-..-,-.----------------------..,--.,,./,,--.,-----,/,.-----,.-------.....+,-.+--+.--,.,--..-,+..,,,+-.+,-+/--,.,--+-/..,-,,----..------,-,,-------1-,+.+-.-..-.----.-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------,---------,----,--------,,,,----,,,,-,,-,,-,,,--,,,---,,------,,---,,,,,-,,,---,,,,,,,,-,,,---,,--,,--,,-,,,,,,-,----,--,,--,,--,--,-----------------------------------------------------------------------------------------------------------------------..-,--,,,-.-------------------------,,.,-.-+./-,----------.--.,---.,-.,.,--,-,/.+..-,-,-,-.,.-,--.--,-,,,,,,.-./,--,.-/.,.,,.------,,.------,/---,,---,,,.-..,,.,--,.-------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,----------------------------------------,------,,---,---------,,--,,,---,,---,,--,,---,,,--,,,,-----------,,--,,-,--,,,---------,--,----,---,,---,---,,--,,---,---------,--,,--,,--------,---,,--,----,,----,,-----------------------------,,--------,----------,-----------------------,-------------,,----,----,---------,----,-.--,--------,,-------.-,---,,---,,--,,-.,-.,,---,-.-,,---.+--.-,---.+----,.,.---,,-,+--.,,.-,----/+..,.,-.--.,--,---.,--,.,---,---,,-.---.-,,---,------.--.,------,/-.,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------,,--,,---,,---,,,--,,----,--------,,----,,--,,---,,---,,,--,,----,--------,,----,,--,,---,,---,,,--,,----,--------,,----,,--,,---,,---,,,--,,----,--------,,----,,--,,---,,---,,,--,,----,--------,,----,,--,,---,,----,---,,,--,,----,-------------,,----,----,----,,---,----,-------------,,----,----,----,,---,----,-------------,,----,----,----,,---,----,-------------,,----,----,----,,---,----,-------------,,----,----,----,,---,----,-------------,,----,----,----,,---,----,-------------,,----,----,----,,---,.-,,,,--------------------------------------------------,,---,,,---,-----,---,,---------,----,--,,---,,,-----------------------------------------------------------------------------------------------------------,,,,,,,,,,-,,,,-,,,,-,,,,--,,,,,,,,,,,,,,,,,,,,,,,-,,,,-,,,,-,,,,--,,,,,,,,,,,,,,,,,,,,,,,-,,,,-,,,,-,,,,--,,,,,,,,,,,,,,,,,,,,,,,-,,,,-,,,,-,,,,--,,,,,,,,,,,,,,,,,,,,,,,-,,,,-,,,,-,,,,--,,,,,,,,,,,,,,,,,,,,,,,-,,,,--,,,--,,,--,,---,,---,,,--,,,--,,---,,,--,,,--,,,---,---,,---,,,--,,,--,,---,,,--,,,--,,,---,---,,---,,,--,,,--,,---,,,--,,,--,,,---,---,,---,,,--,,,--,,---,,,--,,,--,,,---,---,,---,,,--,,,--,,---,,,--,,,--,,,---,---,,---,,,--,,,--,,---,,,--,,,--,,,---,---,,---,,,--,,,--,,---,,,--,,,--,,,---,------,,-------------------------------------------------------,---,---------,-------------------------,-------------------------------------------------------------------------------------------------------------------,,--,----------------,----,-------------,,--,----------------,----,-------------,,--,----------------,----,-------------,,--,----------------,----,-------------,,--,----------------,----,-------------,,--,-----,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------,,----------------------------------------------------------------------------------------.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,--.-------------------------------------------------------,-----------------------------,---------,----------------------------------------------------------------------------------------------------------------,---,-----,----,-------------------,,---,---,-----,----,-------------------,,---,---,-----,----,-------------------,,---,---,-----,----,-------------------,,---,---,-----,----,-------------------,,---,---,-----------------------,--------------,,-----------------------,--------------,,-----------------------,--------------,,-----------------------,--------------,,-----------------------,--------------,,-----------------------,--------------,,-----------------------,--------------,,-------------------------,,------------------------------------------------,------,---,---------,----------,----,--,------,----------------------------------------------------------------------------------------------------------------,---,,---,,,,-,,-,,,,,,,,---,,,-,,,,,,,,,---,,---,,,,-,,-,,,,,,,,---,,,-,,,,,,,,,---,,---,,,,-,,-,,,,,,,,---,,,-,,,,,,,,,---,,---,,,,-,,-,,,,,,,,---,,,-,,,,,,,,,---,,---,,,,-,,-,,,,,,,,---,,,-,,,,,,,,,---,,----,--------------------------------,,-----,--------------------------------,,-----,--------------------------------,,-----,--------------------------------,,-----,--------------------------------,,-----,--------------------------------,,-----,--------------------------------,,-----,-------------,--.--,,-----------------------------------------------------------,--------------------------------------,,---,------------------------,----,----,,---,------------------------,----,----,,---,----------------------,,,---,-----,----,--,,----,----,--,------,,---,-----,----,--,,----,----,--,------,,---,-----,----,--,,----,----,--,------,,---,-----,----,--,,----,----,--,------,,---,-----,----,--,,----,----,--,------,,---,--------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------------------,---------------------------------------,--------,,,---,------------------------,---,,---,,,---,------------------------,---,,---,,,---,---------------------,,,,--,,--,----------,,----,---,,,-,------,,--,,--,----------,,----,---,,,-,------,,--,,--,----------,,----,---,,,-,------,,--,,--,----------,,----,---,,,-,------,,--,,--,----------,,----,---,,,-,------,,--,,--,-----,,---,----,---,,,--,,----,,--,,---,-----,,--,,,---,---,,,--,,----,,--,,---,-----,,--,,,---,---,,,--,,----,,--,,---,-----,,--,,,---,---,,,--,,----,,--,,---,-----,,--,,,---,---,,,--,,----,,--,,---,-----,,--,,,---,---,,,--,,----,,--,,---,-----,,--,,,---,---,,,--,,----,,--,,---,-----,,--,,,---,------------,,,--,,,---,---,----,----,----,----,----,---,,-,,,,--,,,--,,,---,,,--,,---,,----,---,,-,,,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,--------------..--------------------------------------------,---------,,---------,------------------------------------------,----,----------------------------------,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------,---,---------------------------,---------,,--------,,---,------,--,,---,----------------------------------------,,,--,,,--------------------------------,,,--,,,---------------------------------,,----,---------------------------------,,----,---------------------------------,,----,---------------------------------,,----,---------------------------------,,----,---------------------------------,,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,-----,--,,,--,,,---,--------------------,---,-,,,,,,,,,,-,,,-,,,--,,,---,,--,,,,--,,,--,,,,,,,,,-,,--,,---------,---,,----------,,----,,-,,--,,---------,---,,----------,,----,,-,,--,,---------,---,,-----------,,----,---------,,--,,---------,---,,---,,----,---------,,--,,---------,---,,---,,----,---------,,--,,---------,---,,---,,----,---------,,--,,---------,---,,---,,----,---------,,--,,---------,---,,---,,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,------------------------------------------------,---------,,-------------,----,----,,---,---------,,--,,---------,---,,---,,,--,,---------,,--,,---------,---,,---,,,--,,---------,,--,,---------,---,,------------,,----------------------------,---,,----,,----------------------------,---,,----,,----------------------------,---,,----,,----------------------------,---,,----,,----------------------------,---,,----,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,----------------------------------,----,----------------------------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,--,----------------,-----------------------,,--,-------------------,------------,------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------,,,--,,,,--,,--,--,------------------,--------------,--------------------------------,,---,,,----------------------------------,,---,----------------------------------,,---,----------------------------------------,,--,,,,----------------------------,---,,--,,,,----------------------------,---,,--,,,,----------------------------,---,,--,,,,----------------------------,---,,--,,,,----------------------------,---,,--,,,,--------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,--------------.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,-------------------,---,,------------------,,,,,,,,--------,---,,------------------,,,,,,,,--------,---,,------------------,,,,,,,,--------,---,,------------------,,,,,,,,--------,---,,------------------,,,,,,,,--------,---,,------------------,,,,,,,,--------,---,,------------------,,,,,,,,--------,---,,-----------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,----,-,,,,--,,,-------------------------,,---,----------------------------------,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,----,----,---,,---------,---------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--,,-------.-----------------------------------------------------------------------------------------------------------,----,----------------------------------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----------,,---,,,--,,--------,--------------,-------,----------------,----,----,,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-,,--,-,,,----,------,-,,,---,---------,,---,,--,,,---,------,--,,---,----,,----,,---,,--,,,--,------,-,,,---,,---,,---,,---,,---,,---,,---,,,-,,,---,,---,,---,,---,,---,,---,,---,,,-,,,---,,---,,---,,---,,---,,,,-----------------,----,,---,----,------------------------,----,,---,----,------------------------,----,,---,----,------------------------,----,,---,----,------------------------,----,,---,----,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------,,--------------------,,,--,,---------,,,-,,,--,,,,------------,----,---,,,-------------,,-------------,----,,---,,----,----,---,,--,----------,----,,---,,----,----,---,,--,----------,----,,---,,----,----,--,,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,---,,--------------------,---,,-----,,,,--,,,,---,,,---,--,,,---,---,,,-,--,---,--,,,,----,,---,---,,,---,----,----,---,----,,----,,---,---,,,---,----,----,---,----,,----,,---,---,,,---,----,---,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,-------------------------------------------------,---,,------------------------,---------,---,,--------------,,---,,---,,--------,---,,,-------------,,---,,---,,--------,---,,,-------------,,---,,---,,------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,------------.---------------------------------------,-----------------------------------------------------------,-------------------,-------------------,-------------------,-------------------,----------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,,,,,,-----------------------------------------,-------------------,-------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------.,------,--,----,----------,-----------------------,,---,----------------,--,,-------------------------------------------,---------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,,,,-,,,,----------,------------------------------------------.----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,-------------------------------------------------------------------------------------------------,,----------------------------,---------,,---,----,----------------------------------,----,----------------------------------,----,------------------------,---,,--,,,,,,,,---,,---,,--,,,---,,---,,---,,--,,,,,,,,---,,---,,--,,,---,,---,,---,,--,,,,,,,,---,,---,,--,,,---,,---,,---,,--,,,,,,,,---,,---,,--,,,---,,---,,---,,--,,,,,,,,---,,---,,--,,,---,,---,,---,,-----------------------,--,------,-----------------------------,--,------,-----------------------------,--,------,-----------------------------,--,------,-----------------------------,--,------,-----------------------------,--,------,-----------------------------,--,------,---------------------------------------,---------------,--------------------------------------------------------------------------,,---,,---,,----------------------------,,---,,---,,----------------------------,,---,,---,,------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,------------------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,-------------------------------------------------,,----,----,,--,---,,,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,---,,--,,--,,,--------------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,,,,--------------------,,---,,---,,,---,,---,--------,,---,,--------------,----,--------,,---,,---,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------------,,---------------------,,----,---------,----,----------------------------------,---------------------------------------------------------------------------------------------------------------------------------------,-------------,------,-------------,----,-------------,------,-------------,----,-------------,------,-------------,----,-------------,------,-------------,----,-------------,------,-------------,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,-------------------------------------------------------,----,---------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------,,,,---------,,---,,,-,---------------,---,,----------,,,-,,,,--------,---,,,--,,,---,,--,,,--,,,-,,,,--,,---,----------------------------------,,---,----------------------------------,,---,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------,--------------------,------------------,--------------------,------------------,--------------------,------------------,--------------------,------------------,--------------------,------------------,--------------------,------------------,--------------------,--------------------------.------------,---------,,-------------,,---,,---,,,-,,,---,,---,,,--,,,--,,---,,---,,---,,,--------,----,----,,---,------------------------,----,----,,---,------------------------,----,----,,---,--------,------,---,,---,,----,,-,,,--,,--------,------,---,,---,,----,,-,,,--,,--------,------,---,,---,,----,,-,,,--,,--------,------,---,,---,,----,,-,,,--,,--------,------,---,,---,,----,,-,,,--,,--------,------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,,---,,----,---,,---,-----,,------------,,,,--,-----,---,-----,---,,----,------,,,,,,-,-----,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,---,-----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------,,,---,,----,-------------------,-------,,,---,,----,-------------------,-------,,,---,,----,-------------------,-------,,,---,,----,-------------------,-------,,,---,,----,-------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-------------------,------------------------------------------------------------------,------,--------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,---------,,----,,----,,--,,---,,---,,,--,,---,,,---,----,----,,--,,---,,---,,,--,,---,,,---,----,----,,--,,---,,---,,,--,,---,,,---,----,----,,--,,---,,---,,,--,,---,,,---,----,----,,--,,---,,---,,,--,,---,,,---,----,----,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,------------,,---,,---,---,,---,,----,---,,,-,------,---,,---,---,,----,----,,---,,--,,----,,---,,--------,----,----,-----------------------------,----,----,-----------------------------,----,----,---------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,---,,-,,,----,-------,----,,----,---,,,-----------,,--------------,----,------------------,,--------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------,------------------------------------------------------------------------,,,,,,,,-------------------------------------------------------------------------------------------------------------------------,,----,--,,----,---------,,----,--,,,---,,----,--,,----,---------,,----,--,,,---,,----,--,,----,---------,,----,--,,,---,,----,--,,----,---------,,----,--,,,---,,----,--,,----,---------,,----,--,,,---,,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-,,,---,-----,,---------,----,----------------------------------------------------------,,,,,-,,,----,--,---,,--,,,,,,,,,,,,,,,,,,,,,-,,,----,--,---,,--,,,,,,,,,,,,,,,,,,,,,-,,,----,--,---,,--,,,,,,,---,----,----------------.-,,----,---,,----,----,----------------.-,,----,---,,----,----,----------------.-,,----,---,,----,----,----------------.-,,----,---,,----,----,----------------.-,,----,---,,----,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-------------------------------------------------------------------------------------------------------------,,,,,,,,-,,,---,,---,,,-,,,,,,,,--------,,,,,,,,-,,,---,,---,,,-,,,,,,,,--------,,,,,,,,-,,,---,,---,,--,,----,,.-,,---,,---,,,--,,,---,---,,,--,,----,,.-,,---,,---,,,--,,,---,---,,,--,,----,,.-,,---,,---,,,--,,,---,---,,,--,,----,,.-,,---,,---,,,--,,,---,---,,,--,,----,,.-,,---,,---,,,--,,,---,---,,,--,,----,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.--,,,---------------------------------------------,---------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,-------------------------,----------,--------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-----------------------------------------------------------,---,----------,-----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,----------,-----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.----------.----------------------------.----------.----------------------------.----------.----------------------------.----------.----------------------------.----------.-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,--------------------,,,--,,---,,---,,----,,---,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------,,---------------------,,,--,,---,,,--,,,--,,,--,,--.--,-----------------------,----,----------,-------------------------------------------------------------------------------------------------------------------,,---,,---,----,,---,,---,,---,,--,,----,,---,,---,----,,---,,---,,---,,--,,----,,---,,---,----,,---,,---,,---,,--,,----,,---,,---,----,,---,,---,,---,,--,,----,,---,,---,----,,---,,---,,---,,--,,----,,---,,---,----,,,--------,---,,---,,,---,---,,---,----,,,--------,---,,---,,,---,---,,---,----,,,--------,---,,---,,,---,---,,---,----,,,--------,---,,---,,,---,---,,---,----,,,--------,---,,---,,,---,---,,---,----,,,--------,---,,---,,,---,---,,---,----,,,--------,---,,---,,,---,---,,---,----,,,--------,,----,,,,--,,------------------------------------------,,,--,,,--,,--,,,---,,,--,,,---,,--,,,,-,,,--,,,--,----,---,,----,-.-,,----,----,---------,----,---,,----,-.-,,----,----,---------,----,---,,----,-.-,,----,,,----,----,---------,----,------,--,---------,----,---------,----,------,--,---------,----,---------,----,------,--,---------,----,---------,----,------,--,---------,----,---------,----,------,--,---------,----,----------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------------------------.----------------------------------------,,----,,,---------,----,--------,----,--,,----,,--------------------------------,---,,----------------------------------,---,,----------------------------------,-,--,-,--,,---,-,----,-,,---,,----,---,,-,--,-,--,,---,-,----,-,,---,,----,---,,-,--,-,--,,---,-,----,-,,---,,----,---,,-,--,-,--,,---,-,----,-,,---,,----,---,,-,--,-,--,,---,-,----,-,,---,,----,---,,-,--,-,----------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,---------------------------------------------------------------------------------------,,----,,---,,---,----,,-.-,--------,----------,,---,----,,---,,---,---,,,---,,----,,--,,,--,----,,---,,---,---,,,---,,----,,--,,,--,----,,---,,---,---,,,--,,------,----,----,--.-,-------------------,----,----,----,--.-,-------------------,----,----,----,--.-,-------------------,----,----,----,--.-,-------------------,----,----,----,--.-,-------------------,----,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,,--,,,,,,--------,---,,----,----,-----,---,,--,,,---,,---,,--,,,---,,---,-----,--,,----,,---,,---,---,,,--,,,---,,--,,---,,,---,,---,,---,---,,,--,,,---,,--,,---,,,---,,---,,---,---,,,--,,,---,,--,,---,,------,----,---------,-,----,-----------------,----,---------,-,----,-----------------,----,---------,-,----,-----------------,----,---------,-,----,-----------------,----,---------,-,----,-----------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,,--,,--,,,,,,,,,,,----,----,----------,---,---------,,-----,,,,,,,---,,--,---,,,--,,,,,,,---,,---,-.----------.------,-------------------,-.----------.------,-------------------,-.----------.------,-----------,-,--,-,----,,---,----,---,--,--,---,,,-,-,--,-,----,,---,----,---,--,--,---,,,-,-,--,-,----,,---,----,---,--,--,---,,,-,-,--,-,----,,---,----,---,--,--,---,,,-,-,--,-,----,,---,----,---,--,--,---,,,-,-,--,-,--,----,,,-,,,,---,,---,--------,,,,,,,,--,----,,,-,,,,---,,---,--------,,,,,,,,--,----,,,-,,,,---,,---,--------,,,,,,,,--,----,,,-,,,,---,,---,--------,,,,,,,,--,----,,,-,,,,---,,---,--------,,,,,,,,--,----,,,-,,,,---,,---,--------,,,,,,,,--,----,,,-,,,,---,,---,--------,,,,,,,,--,----,,,-,,,,---,,,,---------,--------,---,,---,,,--,,,----,---,,-----,,----,,--,,,-,,,---,,,-,,--,,,---,,,---,,----,,------------------------------------------------------------------------------------------------------------------,----,----,,---,----,---,-----,-.-,,,---,----,----,,---,----,---,-----,-.-,,,---,----,----,,---,----,---,-----,-.-,,,---,----,----,,---,----,---,-----,-.-,,,---,----,----,,---,----,---,-----,-.-,,,---,----,--,,---,,----,----,----,--------,,----,,--,,---,,----,----,----,--------,,----,,--,,---,,----,----,----,--------,,----,,--,,---,,----,----,----,--------,,----,,--,,---,,----,----,----,--------,,----,,--,,---,,----,----,----,--------,,----,,--,,---,,----,----,----,--------,,----,,--,,---,,----,-----,,----------------------------,,,--,,--,------,,---------------------,---,,----,-----------------------,----,--------,,---,,---,,----,---------,----,--------,,---,,---,,----,---------,----,--------,,---,,-----------,----,---------,----,---------,-.-------,----,---------,----,---------,-.-------,----,---------,----,---------,-.-------,----,---------,----,---------,-.-------,----,---------,----,---------,-.-------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---------,---,,---,,----,---------,----,---------,---,,---,,----,---------,----,---------,---,,---------,-,--,-,-,,----,-,----,--,,---,,---,,---,-,--,-,-,,----,-,----,--,,---,,---,,---,-,--,-,-,,----,-,----,--,,---,,---,,---,-,--,-,-,,----,-,----,--,,---,,---,,---,-,--,-,-,,----,-,----,--,,---,,---,,---,-,--,-,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-,,,---,,----,,---,,-----------------------,---------,---------------------------------------------------------------------,----,,---,-----,-----------------------,----,,---,-----,-----------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,--,--------------------------------------------,---------,---------------------------------------------------------------------------------------------------------------------------------------------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----------.-----------------------------------------------------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------,--------,---------,----,-----,---------,---------------------------------------------------------------------------------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,---------,----------,,---,,---,,---,,---------,,---------,---------------------------------------,--------------------------------------------------------------------------------------------------------------,,,---,,,-,,,,,,,,---------,,,--,,-,,,--,,,---,,,-,,,,,,,,---------,,,--,,-,,,--,,,---,,,-,,,,,,,,---------,,,--,,-,,,--,,,---,,,-,,,,,,,,---------,,,--,,-,,,--,,,---,,,-,,,,,,,,---------,,,--,,-,,,--,,,---,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------------------------------,,,--,,----,--------,----,,---------,,----,,-,,----,------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------.-------------------------,,--,,,,-,,,,,,,,,,,,,,,,,,-,,,,-,,,,,,,,,--,,,,-,,,,,,,,------------------,,---,--------,,,,,,,,------------------,,---,--------,,,,,,,,------------------,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,-------------,,---,--,----,--------------------,,--,------,--,,----,----,----,,--------,,-----------------------,----,----,-----,-----------------------,----,----,-----,-----------------------,-----,,-----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------.------------,-------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.-------------------,,,,-,,,---,,--,---,,,----,,------------,,,,-,,,---,,--,---,,,----,,------------,,,,-,,,---,,--,---,,,----,,------------,,,,-,,,---,,--,---,,,----,,------------,,,,-,,,---,,--,---,,,----,,--------------,,-----------,---,,--,,,,,,,,--,,---,---,,-----------,---,,--,,,,,,,,--,,---,---,,-----------,---,,--,,,,,,,,--,,---,---,,-----------,---,,--,,,,,,,,--,,---,---,,-----------,---,,--,,,,,,,,--,,---,---,,-----------,---,,--,,,,,,,,--,,---,---,,-----------,---,,--,,,,,,,,--,,---,---,,-----------,,--,,------------------,---------,,---------,----,-------------,---,,---,,,--,,---------,,--,,---------,--,,--,,,,,,,,,-,,,---,,,,,,,--,,,,,,,,,--,,--,,,,,,,,,-,,,---,,,,,,,--,,,,,,,,,--,,--,,,,,,,,,-,,,---,,,,----------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,--,,--------------,----,----,,--------------,-----,---------------------------------------,-------------------------------,---------,,---,------------------------,---------,,---,------------------------------------------------,------------------,,-------------------,------------------,,-------------------,------------------,,-------------------,------------------,,-------------------,------------------,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-,,----------------------------------------,-----,--,,--,-------------------,,-----------,--,,--,-------------------------------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,---,,,,,,,,,,,-,,,,-,,,,,,,,,,,,,,,,,,,,---,,,,,,,,,,,-,,,,-,,,,,,,,,,,,,,,,,,,,---,,,,,,,,,,,-,,,,-,,,,,,,,,,,,,,,,,,,,---,,,,,,,,,,,-,,,,-,,,,,,,,,,,,,,,,,,,,---,,,,,,,,,,,-,,,,-,,,,,,,,,,,,--,,,--------------------------,----,,,,--,,,--------------------------,----,,,,--,,,--------------------------,----,,,,--,,,--------------------------,----,,,,--,,,--------------------------,----,,,,--,,,--------------------------,----,,,,--,,,--------------------------,----,,,,--,,,----------,,--,,,,---------------------------------------,,--,,-,--,,--,,,,,,,,,-,,,,--,,,,,,,,,,,,,,,,,,--,,--,,,,,,,,,,,,,,,,,,,,,,,,,,---,,,,-,,,--,,,,,,,,,,,,,,,,,,,,,,,,,,,---,,,,-,,,--,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---,,,,,,,,-,,,---,--,,,,--,,,,,,,,---,,---,,,,,,,,-,,,---,--,,,,--,,,,,,,,---,,---,,,,,,,,-,,,---,--,,,,--,,,,,,,,---,,---,,,,,,,,-,,,---,--,,,,--,,,,,,,,---,,---,,,,,,,,-,,,---,--,,,,--,,,,,,,,---,,---,,,,,,,,------------------,,---,---------,,,---,------------------,,---,---------,,,---,------------------,,---,---------,,,---,------------------,,---,---------,,,---,------------------,,---,---------,,,---,------------------,,---,---------,,,---,------------------,,---,---------,,,---,------------------,-----------------------------------------------------------------------------------------------------,--,,--,,,----,,--------,--------,,,--,,,--,,--,,,----,,--------,--------,,,--,,,--,,--,,,----,,--------,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.----.----.-----------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-.-,,,-,,,,,-------------------,---------------,,,-,,,---,,---,,---,,--,,,,--,,---------,,--,,---,,---,--------,,,--,,,--,,---,----,,,---,,---,--------,,,--,,,--,,---,----,,,---,,---,--------,,,--,,,--,,---,------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--.-,,----,--,---------------,------,--,--.-,,----,--,---------------,------,--,--.-,,----,--,---------------,------,--,--.-,,----,--,---------------,------,--,--.-,,----,--,---------------,------,--,--.-,--,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,--------,----,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---,,,---,--,,,---,,---,,----,,--,,----,---,,,---,--,,,---,,---,,----,,--,,----,---,,,---,--,,,---,,---,,----,,--,,----,---,,,---,--,,,---,,---,,----,,--,,----,---,,,---,--,,,---,,---,,----,,--,,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,--,,,---,--,,,---,,---,,---,,,--,,----,,--,,,---,--,,,---,,---,,---,,,--,,----,,--,,,---,--,,,---,,---,,---,,,--,,----,,--,,,---,--,,,---,,---,,---,,,--,,----,,--,,,---,--,,,---,,---,,---,,,--,,----,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,----------,,--------,,,,,,,,,,,,,,,,,,,,,,,,,,,---------------------,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-,,,--------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----,---------------------------------------,---------------------------------------,---------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------,,,,,,,,,,,,,,,,---------,,,,,,-,,,,,,,,,,,,,,,,,----,----------------------------------,----,----------------------------------,----,--------------------------,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,---,,---,,---,,,--,,----,---,,----,----,---,,---,---------,,----,---,,----,----,---,,---,---------,,----,---,,----,----,---,,---,---------,,----,---,,----,----,---,,---,---------,,----,---,,----,----,---,,---,---------,,----,---,,----,----,---,,---,---------,,----,---,,----,----,---,,---,---------,,----,---,,----,,----------------------------------------------------------------------------------------------------,---,,--,,,,,,,,--,---------------------,---,,--,,,,,,,,--,---------------------,---,,--,,,,,,,,--,-------------,---,,,---,,-.-,,---,,---,,---,,---,,,--,---,,,---,,-.-,,---,,---,,---,,---,,,--,---,,,---,,-.-,,---,,---,,---,,---,,,--,---,,,---,,-.-,,---,,---,,---,,---,,,--,---,,,---,,-.-,,---,,---,,---,,---,,,--,---,,,---,,----,---,,---,,,--,,---,,--.,,---,,,--,,----,---,,---,,,--,,---,,--.,,---,,,--,,----,---,,---,,,--,,---,,--.,,---,,,--,,----,---,,---,,,--,,---,,--.,,---,,,--,,----,---,,---,,,--,,---,,--.,,---,,,--,,----,---,,---,,,--,,---,,--.,,---,,,--,,----,---,,---,,,--,,---,,--.,,---,,,--,,----,---,,-------------------------------------------------------,----------,----,,--,,,---,--,,---,,----,,-----------------,,,,--,,--,,,---,,---,,,-,,,--,,--------,,,,--,,--,,,---,,---,,,-,,,--,,--------,,,,--,,--,,,---,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,---------,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,----------------------------------------------,,--,,,,,,,,-,,,---,,---,,,--,,,--,,,---,,,-,,,,,,,,---------------,--------,----,---------,---------------,--------,----,---------,---------------,--------,--------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------,--,,,--,,,--,,---,,---,,,--,,,--,,,--,,,--,,,--,,,-----------------------,---------------------------------------,---------------------------------------,----,---,------,--,---------------,,,--,--------,------,--,---------------,,,--,--------,------,--,---------------,,,--,--------,------,--,---------------,,,--,--------,------,--,---------------,,,--,--------,------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.----.----------------------------------------------------------,,----,---,,------------------------------------------------------------------------------------------------------------------------------------------,-------------------------,,---,--------,-------------------------,,---,--------,-------------------------,,---,--------,-------------------------,,---,--------,-------------------------,,---,--------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------,----,-------------------------,--------,----,-------------------------,--------,----,-----------------,-------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,------------------------------------------------,----------.---------------------------------------------,---,,--------------------,----,--------,---,,--------------------,----,--------,---,,----------,------,,----,----,---------------,----,-------,,----,----,---------------,----,-------,,----,----,---------------,----,-------,,----,----,---------------,----,-------,,----,----,---------------,----,-------,,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------,---,,----,--------------------------------------------------,,---,----,,---------,---,----,---------,,---,----,,---------,---,----,---------,,---,----,,---------,-------,,,---,,,----------------,,,---,,---,---,,,---,,,----------------,,,---,,---,---,,,---,,,----------------,,,---,,---,---,,,---,,,----------------,,,---,,---,---,,,---,,,----------------,,,---,,---,---,,,---,,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------,-----,,----,,--,,---,,---,,------------,,,---,,----,,--,,---,----,,--,------,---,,---,----,----,,---,----,,--,------,---,,---,----,----,,---,----,,--,------,---,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,-------,----,,--------------,,--,------,---,,-------------,,----,----,,-,------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------------------------------------------------------------------------------------------,------------------------------------------------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,,,,,,,,,--------------------,,--,,,,,,,,--,-------------------------,,--,,,,,,,,--,-------------------------,,--,,,,,,,,--,-------------------------,,--,,,,,,,,--,-------------------------,,--,,,,,,,,--,-------------------------,,--,,,,,,,,--,-------------------------,,--,,,,,,,,--,---------------------,,-------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-,,---,,----,----,---,----,--------------,,---------,---------------------------------------------------------------------,---------------------------------------,---------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.----------------------------------------------,,----------------------,,---------,--,,,,--,,----,,--,,---,,---,,----,----,--,,,,--,---,,---------------,---,,--,,---------,---,,---------------,---,,--,,---------,---,,---------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,,-,,,--,,,-,,,---,,,-,,,,,--------,---,,,-,,,--,,,-,,,---,,,-,,,,,--------,---,,,-,,,--,,,-,,,---,,,-,,,,,--------,---,,,-,,,--,,,-,,,---,,,-,,,,,--------,---,,,-,,,--,,,-,,,---,,,-,,,,,--------,---,,,-,,,--,,,-,,,---,,,-,,,,,--------,---,,,-,,,--,,,-,,,---,,,-,,,,,--------,---,,,------------------------------------------------------------,,---,------,-,,,--,,---,,,--,,-----,---,,---,---,,----------------------------------,---,,----------------------------------,---,,------------------------,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-,,,,-,,,,--,,,,,,,,,,-,,,,-,,--------,,-,,,,-,,,,--,,,,,,,,,,-,,,,-,,--------,,-,,,,-,,,,--,,,,,,,,,,-,,,,-,,--------,,-,,,,-,,,,--,,,,,,,,,,-,,,,-,,--------,,-,,,,-,,,,--,,,,,,,,,,-,,,,-,,--------,,-,,,,-,,,,--,,,,,,,,,,-,,,,-,,--------,,-,,,,-,,,,--,,,,,,,,,,-,,,,-,,--------,,-,,,,---,---------------------------------------------------------------------,----,------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------,---------,----,-----------------------------,---------,------------------.----.--,-------------------------------.----.--,-------------------------------.----.--,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--------,----,----,,---,----------,----,--------,----,----,,---,----------,----,--------,----,----,,---,----------,----,--------,----,----,,---,----------,----,--------,----,----,,---,----------,----,--------,----,----,,---,----------,----,--------,----,----,,---,----------,----,----,,,-,,,-----,----,,-----,---,,----,,.-,,------------,,---,,,--,,---,,---,,----,,---------,--,,---,,,---,----,----,----,,---,-------------------,----,----,----,,---,-------------------,----,----,----,,---,---,,--------------,,---,----,,---,,---,----,--------------,,---,----,,---,,---,----,--------------,,---,----,,---,,---,----,--------------,,---,----,,---,,---,----,--------------,,---,----,,---,,---,----,-------------,--.-,----,,-------------,----,----,,---,--.-,----,,-------------,----,----,,---,--.-,----,,-------------,----,----,,---,--.-,----,,-------------,----,----,,---,--.-,----,,-------------,----,----,,---,--.-,----,,-------------,----,----,,---,--.-,----,,-------------,----,----,,---,--.-,----,,----------------..---.------------,----,----,---------,---,,---,,,--,,---,,---,,-------------,,,--,,---,,,---,----,----,----,,---,---,,---,,----,,---,----,----,----,,---,---,,---,,----,,---,----,----,----,,---,------------------------,----,--------------,-------------------,----,--------------,-------------------,----,--------------,-------------------,----,--------------,-------------------,----,--------------,-------------,----,-------------------,----,----,----,----,-------------------,----,----,----,----,-------------------,----,----,----,----,-------------------,----,----,----,----,-------------------,----,----,----,----,-------------------,----,----,----,----,-------------------,----,----,----,----,--------,,,,,,,,,,,,,,,-,,,,,,,,----------------------------,--------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---,,,---,--------,---,,-----,----,----,---,,,---,--------,---,,-----,----,----,---,,,---,--------,---,,-----,----,----,---,,,---,--------,---,,-----,----,----,---,,,---,--------,---,,-----,----,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.------------------------------------------------------------------------------,------------------,,---,--------,,----,,------------------,,---,--------,,----,,------------------,,---,--------,----------------,,----,--------,---,,-----,-------------,,----,--------,---,,-----,-------------,,----,--------,---,,-----,-------------,,----,--------,---,,-----,-------------,,----,--------,---,,-----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,-,,,,,,---,,---,,----,,------,,-,,,,,-,,--,,,---,,--,,,--,,,--,,--,,,,--,,,---,,--,,,---,----,,---,----,,----,--,,----,,--------,----,,---,----,,----,--,,----,,--------,----,,---,----,,----,--,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-,,,--,,---,,,--,,---,,--,,,,--,--,,----,----,----,----,--,,----,-----,,--,,----,---------------------------------------,---------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,---------,-------------------,----,----,---------,-------------------,----,----,---------,-------------------,----,----,---------,-------------------,----,----,---------,-------------------,----,----,---------,-------------------,----,----,---------,-------------------,----,-----,--,,-,,,---,--------,,,---,,----,---,,---,,,--,,-------------------------------------------------------.---------------------------------------.---------------------------------------.----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,--,,----,----,---,---------------,----,,--,,----,----,---,---------------,----,,--,,----,----,---,---------------,----,,--,,----,----,---,---------------,----,,--,,----,----,---,---------------,----,,--,,----,----,---,---------------,----,,--,,----,----,---,---------------,----,,-----------------------------------------------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------,--,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,,--------,,--,,,,-,,,---,,---,,,-,,,--,,,--------,,--,,,--,,,---,,----,---,,--,,---------,,--,,,--,,,---,,----,---,,--,,---------,,--,,,--,,,---,,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---,,----,----,-------------------,----,---,,----,----,-------------------,----,---,,----,----,-------------------,----,---,,----,----,-------------------,----,---,,----,----,-------------------,----,---,,----,----,-------------------,----,---,,----,----,-------------------,----,--------------------------------------------------,----,,,--------,,--,,,,-,,,---,,---,,--,,,--,,,--------,,--,,,,-,,,---,,---,,--,,,--,,,--------,,--,,,,-,,,---,,---,,--,,,--,,,--------,,--,,,,-,,,---,,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----,---,,---,,,--,,---,,-------------,-----,---,,---,,,--,,---,,-------------,-----,---,,---,,,--,,---,,-------------,-----,---,,---,,,--,,---,,-------------,-----,---,,---,,,--,,---,,-------------,-----,---,,---,,,--,,---,,-------------,-----,---,,---,,,--,,---,,-------------,-----,---,,--------------------------------------------------,----,,,--------,,---,,,--------,---,,--,,----,,--------,---------,,---,------------------------,---------,,---,------------------------,---------,,---,---------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,---------------,----,------------------,---------------,----,------------------,---------------,----,------------------,---------------,----,------------------,---------------,----,------------------,---------------,----,------------------,---------------,----,------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------,----------------------------,----------,----------------------------,----------,----------------------------,----------,----------------------------,----------,----------------------------,----------,----------------------------,----------,------------------------------------,,,,,,,,--------,,,,,,,,,,,,,,,,,,,,,,,,--,,--------------------,----,----,,---,-----------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-,,---,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,,,,--,----,----------------,----,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------,,------------------------------------------,,--,,-------------------,-----,---,----,,--,,-----------------------------------------------------------------------------------------------------------------,,----,,--------------------------------,,----,,--------------------------------,,----,,--------------------------------,,----,,--------------------------------,,----,,--------------------------------,,----,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------------------------------------------,,---,,---,,---,----------,---------,---,,---,,------------------------------,---------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--,,,,-,-----------------------------------------------,----,,--------,------------------------,----,,------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----,,,,-,,,,,,----,,---,--,----,,----,---,,---,,---,,---,,---,,,--,,---,,---,,---,,---,----,,,--,,---,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,-,,--,,,-,,,,,,,,,,-,,,,-,,,,,,,,-,,,,,,-,,--,,,-,,,,,,,,,,-,,,,-,,,,,,,,-,,,,,,-,,--,,,-,,,,,,,,,,-,,,,-,,,,,,,,-,,,,,,-,,--,,,-,,,,,,,,,,-,,,,-,,,,,,,,-,,,,,,-,,--,,,-,,,,,,,,,,-,,,,-,,,,,,,,-,,,,,,-,,--,,,-,,,,,,,,,,-,,,,-,,,,,,,,-,,,,,,-,,--,,,-,,,,,,,,,,-,,,,-,,,,,,,,-,,,,,,-,,--,,,---------,----------------,,,---,,,--,,,--,,---,,---,,---,,---,,,-,,,---,,,,,,,,,-,,,-,,,,-,,,,--,,---,,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,---,,---,,,---,,----,-------------,,---,---,,---,,,---,,----,-------------,,---,---,,---,,,---,,----,-------------,,---,---,,---,,,---,,----,-------------,,---,---,,---,,,---,,----,-------------,,---,---,,---,,,---,,----,-------------,,---,---,,---,,,---,,----,-------------,,---,---,,----------------------------,,---,---------,,---,,--------,--.-,,---,,---,-------------------,,---,--.-,,-----------------------------------------------------------------------------------------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,----------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.------,,,--------.-,,----,,-------,-----,-.--,-.--,---,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,-------------------,----,----,--------,,------------------,,---,,---,,--,,,,,,,,--------,---,,----------,---,,,---,,---,---,,---,---,,----------,---,,,---,,---,---,,---,---,,----------,---,,,-----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------,,-----------------,,,,,,,,,,,,,,,,,,-,,,---,,---,,,-,,,--,,,,,,,,,,,,---,,--------------------,----,--------,---,,--------------------,----,--------,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,--,,-,,,,-,,,,--,,--,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,-------------------------------------------.-------------,------------,------------------------------------------------------,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,----,,,,,,,,,-------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,---,,,---,,---,--------,,----,,--,----,,---,,,---,,---,--------,,----,,--,----,,---,,,---,,---,,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,------------------------------------------,----,,---,,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--,------,--,,--------------------,---,,--,------,--,,--------------------,---,,--,------,--,,--------------------,---,,--,------,--,,--------------------,---,,--,------,--,,--------------------,---,,--,------,--,,---,,----,----,,---,--------,------,--,,---,,----,----,,---,--------,------,--,,---,,----,----,,---,--------,------,--,,---,,----,----,,---,--------,------,--,,---,,----,----,,---,--------,------,--,,---,,----,----,,---,--------,------,--,,---,,----,----,,---,--------,------,--,,---,,----,------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,-------------------,,-----------------------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,---,-----------------------------,---,,,---,------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,------------------------------------------,------------------------------------.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,-----.----------------------------,----,-----.----------------------------,----,-----.----------------------------,----,-----.----------------------------,----,-----.----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--------,,,,,,,,-,,,,-,,,---,,,-,,----,,------------------,----,--------,------,-----------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,,,--,,---,,,--,,,-,------,--------,,,,,,,,,,,,,,,,-,,--,,--,,,,,,-,,,,,,,,,,,,,,,,,,,,,,,,-,,--,,--,,,,,,-,,,,,,,,,,,,,,,,,,,,,,,,-,,--,,-,,,,,---,------,------------------,,---,,---,,--,------,------------------,,---,,---,,--,------,------------------,,---,,---,,--,------,------------------,,---,,---,,--,------,------------------,,---,,---,,--,------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,---------------------------------,,,,-,,,,,,,,,--,,--,,---,,,,--,,--,,,--,,,,-,,,,,,,,,--,,--,,---,,,,--,,--,,,--,,,,-,,,,,,,,,--,,--,,--,,,,---,,----,,-,,,,--,,,--,,,--,,,,-,,,---,,--,,----,,-,,,,--,,,--,,,--,,,,-,,,---,,--,,----,,-,,,,--,,,--,,,--,,,,-,,,---,,--,,----,,-,,,,--,,,--,,,--,,,,-,,,---,,--,,----,,-,,,,--,,,--,,,--,,,,-,,,---,,--,,----,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,------------------------,---,,----,----,------------------------,---,,----,----,-------------------,----,------,-,,,,-,,,---,,----------,---,,--,------,-,,,,-,,,---,,----------,---,,--,------,-,,,,-,,,---,,----------,---,,--,------,-,,,,-,,,---,,----------,---,,--,------,-,,,,-,,,---,,----------,---,,--,------,-------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------,----,----,-----------------------,,----,---------,----,------------------,,---,----,----,,--,,---------,---,,----,,---,----,----,,--,,---------,---,,----,,---,----,----,,--,,---,,---,---------------,------------------,,---,---------------,------------------,,---,---------------,------------------,,---,---------------,------------------,,---,---------------,------------------,,---,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,-------------------------------------------------,,,---,,,--,,,-,,,,,,,,--,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,--,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,-,,,--,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,--,,-----,-----,---,,---,----,,---,----,-----,---,-----,---,,---,----,,---,----,-----,---,-----,---,,---,----,,---,----,-----,---,-----,---,,---,----,,---,----,-----,---,-----,---,,---,----,,---,----,-----,---,-----,--,----,,----,----,---------,-------------,----,,----,----,---------,-------------,----,,----,----,---------,-------------,----,,----,----,---------,-------------,----,,----,----,---------,-------------,----,,----,----,---------,-------------,----,,----,----,---------,-------------,----,,----,----------,--,,--,----------,,---,,----,------------------,,,,,,,,-,,,--,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------------------------,----------,----------------------------,----------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,---,,,--,,---,----,,---,---,,---,,,---,,---,,,--,,---,----,,---,---,,---,,,---,,---,,,--,,---,----,,---,---,,---,,,---,,---,,,--,,---,----,,---,---,,---,,,---,,---,,,--,,---,----,,---,---,,---,,,---,,---,,,--,,---,----,,---,---,,---,,,---,,---,,,--,,---,----,,---,---,,---,,,---,,---,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.----------------------------,-----,---------------------------------,-----,---------------------------------,-----,---------------------------------,-----,---------------------------------,-----,---------------------------------,-----,---------------------------------,-----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---,,---,----,----,----,-----,----,----,---,,---,----,----,----,-----,----,----,---,,---,----,----,----,-----,----,----,---,,---,----,----,----,-----,----,----,---,,---,----,----,----,-----,----,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------,--------,----,----------,--------------,--------,----,----------,--------------,--------,----,----------,--------------,--------,----,----------,--------------,--------,----,----------,--------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-----------------------------------------------------,---------,----,------------------------,---------------,------,---,----------------------------,------,---,----------------------------,------,---,----,-------,-----------------------------------,,--,-----------------------------------,,--,-----------------------------------,,--,-----------------------------------,,--,-----------------------------------,,--,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-------------------------------------------------------------------------------------------------------------,------,--------------------------------,------,--------------------------------,------,--------,-------,---------,----,-----,----,,---,----,,--,---------,----,-----,----,,---,----,,--,---------,----,-----,----,,---,----,,--,---------,----,-----,----,,---,----,,--,---------,----,-----,----,,---,----,,--,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-------------------------------------------------------------.---------------------------------------.------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---,,,--,,,----------------------------------------------------------------------------------,----,---------,,--,,-------------------,----,---------,,--,,-------------------,----,---------,,--,,----,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---,,----,,----------------------------------------------------------------------------------,----,----,,---,,--,,---------,---------,----,----,,---,,--,,---------,---------,----,----,,---,,--,,----,,--,----,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---,,----,---,,---,,,---,,---,,---,----,---,,----,---,,---,,,---,,---,,---,----,---,,----,---,,----,,--,----,,----,,---,--------,---,,---------,----,,----,,---,--------,---,,---------,----,,----,,---,--------,---,,---------,----,,----,,---,--------,---,,---------,----,,----,,---,--------,---,,---------,----,,------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,-----------------------------------------,----,---------,----,----,,---,--------------------------------------------------------,------,--,,--------,,---,,,---,,---,,,-,------,--,,--------,,---,,,---,,---,,,-,------,--,,--------,,-----,---,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,-----------------------------------------,---,,---,,,---,---,,,,,,--,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,,-,,----,,-,,,--,,,--,,,--,,,---,,---,,,--,,----,,-,,,--,,,--,,,--,,,---,,---,,,--,,----,,-,,,--,,,--,,,--,,,,---,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,--------------------------------------------------------,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,--.-,,---,,---,---------------,---,,---,--.-,,---,,---,---------------,---,,---,--.-,,---,,---,---------------,---,,---,--.-,,---,,---,---------------,---,,---,--.-,,---,,---,---------------,---,,---,--.-,,---,,---,---------------,---,,---,--.-,,---,,---,---------------,---,,---,--.-,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------,----------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.----------------------------------------------------------------,----,---,,---,,----,---,,----,----,----,----,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,,---------,----,-------------------,,--,,---,,---,,---,,---,,,--,,----,----,,--,,-----------------------------------------------------------------------------------------------------------------,,,,,,,,--,,---,,,--,,,-----------------,,,,,,,,--,,---,,,--,,,-----------------,,,,,,,,--,,---,,,--,,,-----------------,,,,,,,,--,,---,,,--,,,-----------------,,,,,,,,--,,---,,,--,,,-----------------,,,,,,,,---,,---,,---,,---,----,,----,---,,---,,---,,---,,---,,---,----,,----,---,,---,,---,,---,,---,,---,----,,----,---,,---,,---,,---,,---,,---,----,,----,---,,---,,---,,---,,---,,---,----,,----,---,,---,,---,,---,,---,,---,----,,----,---,,---,,---,,---,,---,,---,----,,----,---,,---,,---,,---,,---,,-----------------,---,,-----------------------------------,----,--------,,----,---,,----,,---,,---,----,---------------------------------------------------------------------------------------------------------------------------------,---,,,---------------------------------,---,,,---------------------------------,---,,,---------------------------------,---,,,---------------------------------,---,,,----------------------------,,---,--.-,,---,,---,-----,---,----,,---,,---,--.-,,---,,---,-----,---,----,,---,,---,--.-,,---,,---,-----,---,----,,---,,---,--.-,,---,,---,-----,---,----,,---,,---,--.-,,---,,---,-----,---,----,,---,,---,--.-,,---,,---,-----,---,----,,---,,---,--.-,,---,,---,-----,---,----,,---,,---,--.-,,----------------------------------------------------------,----,-------------------,---------,,---,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,------.-------------------------------,,------.-------------------------------,,------.-------------------------------,,------.-------------------------------,,------.-------------------------------,,------.-------------------------------,,------.-------------------------------,,------.------------------------------------------------------------------------------------------------,,-----------------------------------------------------------------------------------------------------------------------------------,,,---,---------------------------------,,,---,---------------------------------,,,---,---------------------------------,,,---,---------------------------------,,,---,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,-----,-------------------,--------,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,---,,,---,----,,--,,----,,--,,,---,----,---,,,---,----,,--,,----,,--,,,---,----,---,,,---,----,,--,,----,,--,,,---,----,---,,,---,----,,--,,----,,--,,,---,----,---,,,---,----,,--,,----,,--,,,---,----,----------.-------,-------------------------------.-------,-------------------------------.-------,-------------------------------.-------,-------------------------------.-------,-------------------------------.-------,-------------------------------.-------,-------------------------------.-------,--------------,---------------,--------,-----------------------------------------------------------------------,---,,----,,---,--------,------,--------,---,,----,,---,--------,------,--------,---,,----,,---,------------------,----,--------,-------------------------,----,--------,-------------------------,----,--------,-------------------------,----,--------,-------------------------,----,--------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------,---------------,--------,------,--,-------------------------------------------------------------,,--,,,--,,,---,---,,,--,,----,,--------,,--,,,--,,,---,---,,,--,,----,,--------,,--,,,--,,,---,---,,------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------,,------------,----,----------,---------,,------------,----,----------,---------,,------------,----,----------,---------,,------------,----,----------,---------,,------------,----,----------,---------,,------------,----,----------,---------,,------------,----,----------,---------,,------------,----------------------------------------------,--------------------------------------------------------------------------,--------,,,--,------,------------------,--------,,,--,------,------------------,--------,,--,-,,,--,,,,,,,,,,-,,,,,,,----,,--,------,-,,,--,,,,,,,,,,-,,,,,,,----,,--,------,-,,,--,,,,,,,,,,-,,,,,,,----,,--,------,-,,,--,,,,,,,,,,-,,,,,,,----,,--,------,-,,,--,,,,,,,,,,-,,,,,,,----,,--,------,-,,,--,,-,,,------------,----,----,-----,--------,,,------------,----,----,-----,--------,,,------------,----,----,-----,--------,,,------------,----,----,-----,--------,,,------------,----,----,-----,--------,,,------------,----,----,-----,--------,,,------------,----,----,-----,--------,,,------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,-,,,---,,---,,,-,,,,--,,----,,--,,-,,-,,-,,,---,,---,,,-,,,,--,,----,,--,,-,,-,,-,,,---,,---,,,-,,,,--,,----,,--,,-,,-,,-,,,---,,---,,,-,,,,--,,----,,--,,-,,-,,-,,,---,,---,,,-,,,,--,,----,,--,,-,,-,,-,,,---,-,,---,,--------,----,----,--------------,,---,,--------,----,----,--------------,,---,,--------,----,----,--------------,,---,,--------,----,----,--------------,,---,,--------,----,----,--------------,,---,,--------,----,----,--------------,,---,,--------,----,----,--------------,,---,,--------,,---------,--------------,,----,----,,---,----,------,,----------------,---,,,--,,,---,-,,,---,--------,---,,----------,---,,--,,,---,,---,,---,---,,----------,---,,--,,,---,,---,,---,---,,----------,---,,--,,--------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------,,---,,-------.,------------------------,,---,,-------.,------------------------,,---,,-------.,------------------------,,---,,-------.,------------------------,,---,,-------.,------------------------,,---,,-------.,------------------------,,---,,-------.,------------------------,,---,,-------.---------------,----------,,----,,--,,,,,,,---,,--,---,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,--,,,,,,,,,,,,-,,,,,--,----,,---,,--,,,,--,,---,,---,,-,,,,,--,----,,---,,--,,,,--,,---,,---,,-,,,,,--,----,,---,,--,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------,----,-----------------,----------------------------------------------------------,---------------------------------------,---------------------------------------,-------------------------------------,----,----,----,----,-------------------,----,----,----,----,-------------------,----,----,----,----,-------------------,----,----,----,----,-------------------,----,----,----,----,------------------------,---------,--------,--------------------,---------,--------,--------------------,---------,--------,--------------------,---------,--------,--------------------,---------,--------,--------------------,---------,--------,--------------------,---------,--------,--------------------,----------------------------------------------------------,----,----,----,----------,----,--------,----,--------------------------------------------------------------------------------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-------------------------------------------------------.---------------------------------------.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--------,--------------,---------------,--------,--------------,---------------,--------,--------------,---------------,--------,--------------,---------------,--------,--------------,---------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------------------------------------------,----,---------,------------------------,---,,---------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----,,----,,---,--,,---,,------,-,,,--,,,---,,----,,---,--,,---,,------,-,,,--,,,---,,----,,---,--,,---,,------,-,,,--,,,---,,----,,---,--,,---,,------,-,,,--,,,---,,----,,---,--,,---,,------,-,,,--,,,---,,----,,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---,,---------,--------,----,----------,---,,---------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------,,----------------------------------,---,,---------,--------,----,-------------------------,-------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------,,,-----..------------------------------------------,------------------,--------------------,---------------------------------------------------------------------------------------------------------------,,---,,,--,,,--,,--,,,,--,,---,,--,,,--,,,---,,,--,,,--,,--,,,,--,,---,,--,,,--,,,---,,,--,,,--,,--,,,,--,,---,,--,,,--,,,---,,,--,,,--,,--,,,,--,,---,,--,,,--,,,---,,,--,,,--,,--,,,,--,,---,,--,,,--,,,---,,,--,,--,,---------,---,,---,,,---,---------,,--,,---------,---,,---,,,---,---------,,--,,---------,---,,---,,,---,---------,,--,,---------,---,,---,,,---,---------,,--,,---------,---,,---,,,---,---------,,--,,---------,---,,---,,,---,---------,,--,,---------,---,,---,,,---,---------,,--,,---------------,,---,,,--,,,--,,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,,---,,----,---,,---,,---,,---,,---,,---,,---,,----,---,,---,,---,,---,,---,,---,,---,,----,---,,---,,---,,---,,---,,---,,---,,----,---,,---,,---,,---,,---,,---,,---,,----,---,,---,,---,,---,,---,,---,,------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,--------------------------------------------------------------------------------------------------------.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,-----------------------------.--,--------,,--,,----------------,--------,-----------------,,,---,----,----,----,,----,,-----------,,,---,----,----,----,,----,,-----------,,,---,----,----,,,,---,,,---,,,,,,,,,-,,--,,-,---,,--,---,,,--,,,---,,,,,,,,,-,,--,,-,---,,--,---,,,--,,,---,,,,,,,,,-,,--,,-,---,,--,---,,,--,,,---,,,,,,,,,-,,--,,-,---,,--,---,,,--,,,---,,,,,,,,,-,,--,,-,---,,--,---,,,--,,,---,--------,---,,----,,---,,--,,--,,------,--------,---,,----,,---,,--,,--,,------,--------,---,,----,,---,,--,,--,,------,--------,---,,----,,---,,--,,--,,------,--------,---,,----,,---,,--,,--,,------,--------,---,,----,,---,,--,,--,,------,--------,---,,----,,---,,--,,--,,------,--------,---,,-------------------------,-------------------------------,,----,---,,--,,----,,---,,---,,,--,,----,----,---,----,---,,----,---,,----,,---,,----,---,----,---,,----,---,,----,,---,,----,---,----,---,,----,---,,------------,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------,--,,,---,,---,,--,,----,,---,,--,,,,-,,----,,---,,---,----,---,,----,---,,----,,---,,---,,---,----,---,,----,---,,----,,---,,---,,---,----,---,,----,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------,---,,--,,,--,,,,,,,,,,,,,,,,,,,--,,---,----,,---,,--,,---------,----,---,,----,----,,------------,,,---,----,----,----,---,,,------------,,,---,----,----,----,---,,,------------,,,---,----,----,,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,---,------,------------------------,---,---,------,------------------------,---,---,------,------------------------,---,---,------,------------------------,---,---,------,------------------------,---,---,------,------------------------,---,---,------,-------------------------------------,--------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,------------------,,---,,---,,,--,,,---,,---,,--,,----,,--,,---,,---,,,--,,,---,,---,,--,,----,,--,,---,,---,,,--,,,---,,---,,--,,----,,--,,---,,---,,,--,,,---,,---,,--,,----,,--,,---,,---,,,--,,,---,,---,,--,,----,,--,,---,,---,,,--,,,---,,---,,--,,----,,--,,---,,---,,,--,,,---,,---,,--,,----,,--,,---,,---,,,--------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,---,,----,,---,,---,,--,,----,,-,,,---,,---,,----,,---,,---,,--,,----,,-,,,---,,---,,----,,---,,---,,--,,----,,-,,,---,,---,,----,,---,,---,,--,,----,,-,,,---,,---,,----,,---,,---,,--,,----,,-,,,---,,---,,----,,---,,---,,--,,----,,-,,,---,,---,,----,,---,,---,,--,,----,,-,,,---,,---,,----------------------------,------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,---,,,-,,----,,,---,,--,---,,,--,,,---,,---,,,-,,----,,,---,,--,---,,,--,,,---,,---,,,-,,----,,,---,,--,---,,,--,,,---,,---,,,-,,----,,,---,,--,---,,,--,,,---,,---,,,-,,----,,,---,,--,---,,,--,,,---,-,,--,,---------,---,,----,----,---,,----,,--,,---------,---,,----,----,---,,----,,--,,---------,---,,----,----,---,,----,,--,,---------,---,,----,----,---,,----,,--,,---------,---,,----,----,---,,----,,--,,---------,---,,----,----,---,,----,,--,,---------,---,,----,----,---,,----,,--,,-----------------------,,----------,---------------,-----,--,---------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,---,,,-,,----,,--,,,---,---,,---,,,---,,---,,,-,,----,,--,,,---,---,,---,,,---,,---,,,-,,----,,--,,,---,---,,---,,,---,,---,,,-,,----,,--,,,---,---,,---,,,---,,---,,,-,,----,,--,,,---,---,,---,,,---,-,,--,,---,,---,,----,-------------,,----,,--,,---,,---,,----,-------------,,----,,--,,---,,---,,----,-------------,,----,,--,,---,,---,,----,-------------,,----,,--,,---,,---,,----,-------------,,----,,--,,---,,---,,----,-------------,,----,,--,,---,,---,,----,-------------,,----,,--,,---,,---,,--------------,---------,,,,-,,,--,,,---,,,-,,,,--,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,---,,---,---,,---,------,,---,,--,----,,---,,---,---,,---,------,,---,,--,----,,---,,---,---,,---,------,,---,,--,----,,---,,---,---,,---,------,,---,,--,----,,---,,---,---,,---,------,,---,,--,----,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,,--,,,---,---,,---,,---,,,--,,---,,---,,,--,,,---,---,,---,,---,,,--,,---,,---,,,--,,,---,---,,---,,---,,,--,,---,,---,,,--,,,---,---,,---,,---,,,--,,---,,---,,,--,,,---,---,,---,,---,,,--,,---,,---,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------,,---,------------------------------------------------------------------------------------------------------------------,---------------------------------------,------------------------------------,------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,--------------------------------------------,--------,,-----------------------------,--------,,-----------------------------,--------,,-----------------------------,--------,,-----------------------------,--------,,-----------------------------,--------,,-----------------------------,--------,,-------------------,,----------,,,,-,,,---,--,,---,--,,-----,---,,-,,,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------,,-.--,---------------------------------,,-.--,---------------------------------,,-.--,---------------------------------,,-.--,---------------------------------,,-.--,---------------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,--------------------------------------------..---------------------------------.--------.-----------------------------------------,,----,---,,--------------,---,----,,---,,----,---,,--------------,---,----,,---,,----,---,,--------------,,---,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--,,---,---,,----,---,,--------,,------,--------,----,------------------,----,----------,----,------------------,----,----------,----,-------------,,,---------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----------------------------------------------------,-------------------,----,----,,--------,--------,--------------------,---,,----,----,,--,--------------------,---,,----,----,,--,--------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------------------.------------------------------,,--------,----------,----,----,,---,----,--------,----,,---,,---,,---,,---,,----,----,,--,----,,---,,---,,---,,---,,----,----,,--,----,,---,,---,,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-------------,----,---,,,,,,,,--------,,-,,,,,------,,----,,--,,---,,,--,,,--,,,---,,--,,,--,,----,,--,----,,---,,---,,---,,---,,----,----,---,----,,---,,---,,---,,---,,----,----,---,----,,---,,---,,---,,---,,,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,--,,,,,,,,-----------------------,----,,---------,---,,----,----,---,,---,----,,---------------------------------,---------------------------------------,----------------------------------,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------.--------.------------------------------.--------.------------------------------.--------.------------------------------.--------.------------------------------.--------.------------------------------.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------,--------,,,,,,,,----------------,----,,---,,----,---,,----,----,---,,---,----,,----------------------------------------------------------------------------------------------------------------,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------,----,--------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,,--,,--,,----,,---,,--,,,-,,,--,,,,,--,,,--,,--,,----,,---,,--,,,-,,,--,,,,,--,,,--,,--,,----,,---,,--,,,-,,,--,,,,,--,,,--,,--,,----,,---,,--,,,-,,,--,,,,,--,,,--,,--,,----,,---,,--,,,-,,,--,,,,,--,,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,------------------,,------------------------,-------------,,------------------------,-------------,,------------------------,-------------,,------------------------,-------------,,------------------------,-------------,,------------------------,-------------,,------------------------,-------------,,------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------,---,,---------,---,,----,----,---------,---,,---------,---,,----,----,---------,---,,---------,---,,----,----,---------,---,,---------,---,,----,----,---------,---,,---------,---,,----,----,--------,,----,,--,,----,---,,---,,,---,----,,--,,----,,--,,----,---,,---,,,---,----,,--,,----,,--,,----,---,,---,,,---,----,,--,,----,,--,,----,---,,---,,,---,----,,--,,----,,--,,----,---,,---,,,---,----,,--,,----,,--,,----,---,,---,,,---,----,,--,,----,,--,,----,---,,---,,,---,----,,--,,----,,--,,------------,---,,---,,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,,,--,,---,,,--------,,--,,,---,----,--,,,,--,,---,,,--------,,--,,,---,----,--,,,,--,,---,,,--------,,--,,,---,----,--,,,,--,,---,,,--------,,--,,,---,----,--,,,,--,,---,,,--------,,--,,,---,----,--,,,,--,,----,,--------,---,,,--,,,---,,---,,--,,----,,--------,---,,,--,,,---,,---,,--,,----,,--------,---,,,--,,,---,,---,,--,,----,,--------,---,,,--,,,---,,---,,--,,----,,--------,---,,,--,,,---,,---,,--,,----,,--------,---,,,--,,,---,,---,,--,,----,,--------,---,,,--,,,---,,---,,--,,----,,---------------,---,,,---,,---,,------------------------------------------------,,,,,,,,---------------------------------------------------------------------------------------------------------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,----,,--,,,---,,--,,,--,,,--,,,,-,,,---,,--,,,,-,,,---,,--,,,--,,,--,,,,-,,,---,,--,,,,-,,,---,,--,,,--,,,--,,,,-,,,---,,--,,,,-,,,---,,--,,,--,,,--,,,,-,,,---,,--,,,,-,,,---,,--,,,--,,,--,,,,-,,,---,,--,,,,-,,,---,,---,,---,---------,,---,-----,---------,---,,---,---------,,---,-----,---------,---,,---,---------,,---,-----,---------,---,,---,---------,,---,-----,---------,---,,---,---------,,---,-----,---------,---,,---,---------,,---,-----,---------,---,,---,---------,,---,-----,---------,---,,---,-----------------------------------------------------------------------------------------------------------------,-----,---,,----,----,---,,--------,----,-----,---,,----,----,---,,--------,----,-----,---,,----,----,----,,--,,,---,,--,+,--,,---,,,--,,,--,,,---,,--,,,---,,--,+,--,,---,,,--,,,--,,,---,,--,,,---,,--,+,--,,---,,,--,,,--,,,---,,--,,,---,,--,+,--,,---,,,--,,,--,,,---,,--,,,---,,--,+,--,,---,,,--,,,--,,,---,,--,,,---,,---,,---,----,,---,-----,----,---,,----,---,,---,----,,---,-----,----,---,,----,---,,---,----,,---,-----,----,---,,----,---,,---,----,,---,-----,----,---,,----,---,,---,----,,---,-----,----,---,,----,---,,---,----,,---,-----,----,---,,----,---,,---,----,,---,-----,----,---,,----,---,,---,----,,---------------------------------------------------------,----,-----------------------------,----,----,--------------------------.---------------------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--,,,---,---,,-------------------------,--,,,---,---,,-------------------------,--,,,---,---,,-------------------------,--,,,---,---,,-------------------------,--,,,---,---,,-------------------------,--,,,---,---,,-------------------------,--,,,---,---,,-------------------------,-------------------------------------------------------,-------------------,,----,----,---,,,--,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,--,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------,,,---,,---,,---,,,--,,,--,,,--,----------,----,-----------------------,---,,-----,----,-----------------------,---,,-----,----,----------------,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,-----------------------------------------------,---,,----,----,----,------------------------------------------------------------------------------------------------------------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-----------------------------------------,,---,----------------------------------,,---,----------------------------------,,---,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------------------------------------------,------------------------------------------------------,----,--------------------,,--,------,--,----,--------------------,,--,------,--,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,--------------------------------------------------------------------------------,----,---------------------------------------------------------------------------------------------------------------------------------------------------------,---,,,-,----,--------------------------,---,,,-,----,--------------------------,---,,,-,----,--------------------------,---,,,-,----,--------------------------,---,,,-,----,--------------------,,----,----,----,----,-----,------------,,----,----,----,----,-----,------------,,----,----,----,----,-----,------------,,----,----,----,----,-----,------------,,----,----,----,----,-----,------------,,----,----,----,----,-----,------------,,----,----,----,----,-----,------------,,----,-----------------,----,------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------,----,------------,---------------------,----,------------,---------------------,----,------------,---------------------,----,------------,---------------------,----,------------,-----------------------..--------------------------------------..--------------------------------------..--------------------------------------..--------------------------------------..--------------------------------------..--------------------------------------..-------------------------------------------,----,,-,--------,,----,,----,,--,---,,-----,,--------------,----,----,----,----,----,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.-----------------------------------------,-,--,,-,--,----,------------------,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------------,----,,---,-----------------------------,-----------,--,----------,------------------,,---,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------,,----.---------------------------------------------------------,---,-------------------,------,-----------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----.-.--.----------------------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------.------,---,,-------------------,---,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---------,,,---,---,--------------,----,---------,,,---,---,--------------,----,---------,,,---,---,--------------,----,---------,,,---,---,--------------,----,---------,,,---,---,---------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------,-------------,,---,,------------------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------,,---,---,,-------------,----,----------,,---,---,,-------------,----,----------,,---,---,,-------------,----,----------,,---,---,,-------------,----,----------,,---,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------,----,----------,----,----,,---,---,,,--,,,--,,,--,,,---,---,,,--,,,---,,---,,--,,,--,,,----------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------,--------,,----,------------------------,--------,,----,------------------------,--------,,----,------------------------,--------,,----,------------------------,--------,,----,------------------------,--------,,----,------------------------,--------,,----,---------------------------------------------------.------------------,,---------------,--------,----,,--------,------------------------,----,----------------------------------,----,----------------------------------,----,---,,---,,----------,----,---,,---,---------,,---,----------,----,---,,---,---------,,---,----------,----,---,,---,---------,,---,----------,----,---,,---,---------,,---,----------,----,---,,---,---------,,---,--------,,,,--,,---,,,--,,,--,,,--,,,--,,,--,,,-,,,,--,,---,,,--,,,--,,,--,,,--,,,--,,,-,,,,--,,---,,,--,,,--,,,--,,,--,,,--,,,-,,,,--,,---,,,--,,,--,,,--,,,--,,,--,,,-,,,,--,,---,,,--,,,--,,,--,,,--,,,--,,,-,,,,--,,---,,,--,,,--,,,--,,,--,,,--,,,-,,,,--,,---,,,--,,,--,,,--,,,--,,,--,,,-,,,,--,,---,,,---------,----------,,---,--------,----,,---,------------,-,,--,,---,----,--------,,,---,,--,,---,-,,--,,-----------------,---,,--,,,,,,,,------------------------,---,,--,,,,,,,,------------------------,---,,---,,----,---,,,--,,,,--,,,--,,--,,,--,,,,-,,,--,,---,,,--,,,,--,,,--,,--,,,--,,,,-,,,--,,---,,,--,,,,--,,,--,,--,,,--,,,,-,,,--,,---,,,--,,,,--,,,--,,--,,,--,,,,-,,,--,,---,,,--,,,,--,,,--,,--,,,--,,,,-,,,--,,---,,,----,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,---------,,-------------------,,---,,---,,--,,,---,---------,----,----,---------,----,,---,---------,----,----------------------------------------------------------------------------------------------------------------,----,,---,,,--,,---,,---,,---,,,-,,,---,----,,---,,,--,,---,,---,,---,,,-,,,---,----,,---,,,--,,---,,---,,---,,,-,,,---,----,,---,,,--,,---,,---,,---,,,-,,,---,----,,---,,,--,,---,,---,,---,,,-,,,---,----,,----,,-,--,--,,--------,,----,---,--,,------,,-,--,--,,--------,,----,---,--,,------,,-,--,--,,--------,,----,---,--,,------,,-,--,--,,--------,,----,---,--,,------,,-,--,--,,--------,,----,---,--,,------,,-,--,--,,--------,,----,---,--,,------,,-,--,--,,--------,,----,---,--,,------,,-,--,--,,------------------------------,,---,,---,,--,,,---,,--------,----,---------,----,----,----,---------,----,--------------------------------------------------------------------------------------------------------------,,,----------,,---,---,,---,---------,----,----------,,---,---,,---,---------,----,----------,,---,---,,---,---------,----,----------,,---,---,,---,---------,----,----------,,---,---,,---,---------,----,---------,,,,,,-,,,,,,-,,,,-,,,-,,,,,-,,--,,,,---,,,,,,-,,,,,,-,,,,-,,,-,,,,,-,,--,,,,---,,,,,,-,,,,,,-,,,,-,,,-,,,,,-,,--,,,,---,,,,,,-,,,,,,-,,,,-,,,-,,,,,-,,--,,,,---,,,,,,-,,,,,,-,,,,-,,,-,,,,,-,,--,,,,---,,,,,,-,,,,,,-,,,,-,,,-,,,,,-,,--,,,,---,,,,,,-,,,,,,-,,,,-,,,-,,,,,-,,--,,,,---,,,,,,-,,,,,,-,---------------------------,,-------------,-----,-------,,,--,,,--------,---,,--------------,---,,,--,,,------------------------------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------,---------,,---,,-,------,----,,--------,---------,,---,,-,------,----,,--------,---------,,---,,-,------,----,,--------,---------,,---,,-,------,----,,--------,---------,,---,,-,------,----,,--------,---------,,---,,-,------,----,,--------,---------,,---,,-,------,----,,--------,---------------------------------------------------------------------------------------------,,-----------------------------------------------------------------------------------------------------------------------------------,,---,,---,-----,,--,,---,,----,---,,---,,---,,---,-----,,--,,---,,----,---,,---,,---,,---,-----,,--,,---,,----,---,,---,,---,,---,-----,,--,,---,,----,---,,---,,---,,---,-----,,--,,---,,----,---,,---,,---,,----------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,---------,----,------------------------,--,--------------,,----,------------------,--------------,,----,------------------,--------------,,----,------------------,--------------,,----,------------------,--------------,,----,------------------,--------------,,----,------------------,--------------,,----,------------------,-------------,,,--------------------------------------------------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------,---------,,--,,----,----,----,---------,---------,,--,,----,----,----,---------,---------,,--,,----,----,----,---------,---------,,--,,----,----,----,---------,---------,,--,,----,----,----,---------,--,,----,---------,--------------------,--,,----,---------,--------------------,--,,----,---------,--------------------,--,,----,---------,--------------------,--,,----,---------,--------------------,--,,----,---------,--------------------,--,,----,---------,--------------------,--,,----,----------------------------------------------------------------------------------------------------.------------------------------------,,----,,----,,--------------------------,,----,,----,,---------------------------------------,--------,------------------,,----------,--------,------------------,,----------,--------,------------------,,----------,--------,------------------,,----------,--------,------------------,,----------,----,,------------------,----,,--,,----,----,,------------------,----,,--,,----,----,,------------------,----,,--,,----,----,,------------------,----,,--,,----,----,,------------------,----,,--,,----,----,,------------------,----,,--,,----,----,,------------------,----,,--,,----,----,,----------------------------------------------------------------------------------------------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------..--------------------------------------..--------------------------------------..--------------------------------------..--------------------------------------..--------------------------------------..--------------------------------------..------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------,,-----------------------------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,------------------------,,-----------------------------------------------------------,----------------------------------------------------.---------------------------------------.---------------------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--.-,----------------------------------,--.-,----------------------------------,--.-,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------,,,--,,---------------------------------,,,--,,---------------------------------,,,--,,---------------------------------,,,--,,---------------------------------,,,--,,--------,---------------,---,,----,----,--------,---------------,---,,----,----,--------,---------------,---,,----,----,--------,---------------,---,,----,----,--------,---------------,---,,----,----,--------,---------------,---,,----,----,--------,---------------,---,,----,----,--------,---------------,---------------------------------------------------------------,------,--------,----,----,,---,------------------------,---,,---------,------------------------,---,,---------,------------------------,---,,---,,---,,------------------------,---,,---,,----,------------------------,---,,---,,----,------------------------,---,,---,,----,------------------------,---,,---,,----,------------------------,---,,---,,----,------------------------,-.--,---------,------------------------,-.--,---------,------------------------,-.--,---------,------------------------,-.--,---------,------------------------,-.--,---------,------------------------,-.--,---------,------------------------,-.--,---------,-------------------------------------------------------------------------------,-----------------------------,---------,--------------------------------,,,--,,,--------------------------------,,,--,,,--------------------------------,,--------,------------------,---------------,----,------------------,---------------,----,------------------,---------------,----,------------------,---------------,----,------------------,---------------,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,--,,,--,,,---,,-------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.----------.----------------------------.----------.----------------------------.----------.----------------------------.----------.----------------------------.----------.----------------------------.----------.----------------------------.----------.----------------------------.-----------------,,,,,,,,--,,--------------------------------,------,--------------------------------,------,---------------------------------------------------------------------------------------------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-------------.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----,--,---,-----,---,,,---,----------,-----,--,---,-----,---,,,---,----------,-----,--,---,-----,---,,,---,----------,-----,--,---,-----,---,,,---,----------,-----,--,---,-----,---,,,---,----------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,------------------------------,-----------------------------------------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,-----,,--,,----,,,,,,,,,,,,-,,,--,,,---,,,-,,,,--,,----,,,,,,,,,,,,-,,,--,,,---,,,-,,,,--,,----,,,,,,,,,,,,-,,,--,,,---,,,-,,,,--,,----,,,,,,,,,,,,-,,,--,,,---,,,-,,,,--,,----,,,,,,,,,,,,-,,,--,,,---,,,-,,,,--,,----,,,,,,,,,--,----------,--,,,,,,,,--------,,,,,,,,--,----------,--,,,,,,,,--------,,,,,,,,--,----------,--,,,,,,,,--------,,,,,,,,--,----------,--,,,,,,,,--------,,,,,,,,--,----------,--,,,,,,,,--------,,,,,,,,--,----------,--,,,,,,,,--------,,,,,,,,--,----------,--,,,,,,,,--------,,,,,,,,--,---------------------,,--,,,--,,,---,,,-,,,,,,,,,,-,,----,,------------------,---------,-----------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,---------,,,---,---,,---,,---,,---------,---,,,--,,,---,---,,---,,---,,---------,---,,,--,,,---,---,,---,,---,,---------,---,,,--,,,---,---,,---,,---,,---------,---,,,--,,,---,---,,---,,---,,---------,---,,,--,,,---,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,---,,---,-------------,----------,---,,---------,-------------,----,,---,------------------------,-.-------,,---,------------------------,-.-------,,---,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.--------------------------------------------------------------------------------------------------,------------------------------------------------,---------------------------------------,------------------------------------------------,,--,,---------,---,,--,,---,,,---------,,--,,---------,---,,--,,---,,,---------,,--,,---------,---,,--,,---,,,---------,,--,,---------,---,,--,,---,,,---------,,--,,---------,---,,--,,---,,,---------,,---,,---,,---,,---,,,-,,,---,,--,,,---,,---,,---,,---,,---,,,-,,,---,,--,,,---,,---,,---,,---,,---,,,-,,,---,,--,,,---,,---,,---,,---,,---,,,-,,,---,,--,,,---,,---,,---,,---,,---,,,-,,,---,,--,,,---,,---,,---,,---,,---,,,-,,,---,,--,,,---,,---,,---,,---,,---,,,-,,,---,,--,,,---,,---,,---,,-------------------------------------------------------------------------------------------------------------------------------------------,-----,,--------------------------------,-----,,------------------------------,,------------------,,---,,----,--,------,------------------,,---,,----,--,------,------------------,,---,,----,--,------,------------------,,---,,----,--,------,------------------,,---,,----,--,------,--------,,---,,----,----,----,---,,,---,----,---,,---,,----,----,----,---,,,---,----,---,,---,,----,----,----,---,,,---,----,---,,---,,----,----,----,---,,,---,----,---,,---,,----,----,----,---,,,---,----,---,,---,,----,----,----,---,,,---,----,---,,---,,----,----,----,---,,,---,----,---,,---,,----,------------,,,,,,,,,,,,,,,,-,,,--,,--,,,-----------,--,------------------------------------------------------------------------------------------------------------------------------------------------------------------,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--.-,-------.--------------------------,--.-,-------.--------------------------,--.-,-------.--------------------------,--.-,-------.--------------------------,--.-,-------.--------------------------,--.-,-------.--------------------------,--.-,-------.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------,,,--,,,--------,---,,,--,,----,--------,,,--,,,--------,---,,,--,,----,--------,,,--,,,--------,---,,,--,,----,--------,,,--,,,--------,---,,,--,,----,--------,,,--,,,--------,---,,,--,,----,--------,,---,,---,,---,,----,---,,,---,---,,---,,---,,---,,---,,----,---,,,---,---,,---,,---,,---,,---,,----,---,,,---,---,,---,,---,,---,,---,,----,---,,,---,---,,---,,---,,---,,---,,----,---,,,---,---,,---,,---,,---,,---,,----,---,,,---,---,,---,,---,,---,,---,,----,---,,,---,---,,---,,---,,---,,---,--------------------------------------------------------------------------------,----------,--------------------------------------------------------------------------------------------------------------------------,,--------,,,--,,,--------,,,,,,,,,,,---,,--------,,,--,,,--------,,,,,,,,,,,---,,--------,,,--,,,--------,,,,,,,,,,,---,,--------,,,--,,,--------,,,,,,,,,,,---,,--------,,,--,,,--------,,,,,,,,,,,---,,--------,,---,,----,----,----,,--,,,---,---,,---,,---,,----,----,----,,--,,,---,---,,---,,---,,----,----,----,,--,,,---,---,,---,,---,,----,----,----,,--,,,---,---,,---,,---,,----,----,----,,--,,,---,---,,---,,---,,----,----,----,,--,,,---,---,,---,,---,,----,----,----,,--,,,---,---,,---,,---,,----,------------------------------------,----------------------,----------,-------------,----,,---,,---,------------------------,---,,----,----,----,,------------------,---,,----,----,----,,------------------,---,,--------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------,------------,-----,----,,---,,---,,--,,--,,,,--,,,--,-----,------------------,----,----,,---,-----,------------------,----,----,,---,-----,------------------,----,------------------.------.,----,--------------------------.------.,----,--------------------------.------.,----,--------------------------.------.,----,--------------------------.------.,----,--------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--,,---,-------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,----------------------------------,---------,,---,------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------,---,,----,,---,---,,----------,--,,----,----,----,----,---,,----------,----------------------------------------------------------------------------------------------------------------------------------------,---,,----,-----------------------------,---,,----,-----------------------------,---,,----,-----------------------------,---,,----,-----------------------------,---,,----,-----------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,--------------------------------------------------------,---,,----,,---,---------------,--,,----,----,----,---------,----------,------------------------,---,,----------------------------------,---,,----------------------------------,----,,,---,-------------,,--,,----------,,,---,---,-------------,,--,,----------,,,---,---,-------------,,--,,----------,,,---,---,-------------,,--,,----------,,,---,---,-------------,,--,,----------,,,---,---,--------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------------------------------------------------------------------------,----,----,,----------,---,,------------------,,----,,--,,---,,---,,,--------,--------,,----,,--,,---,,---,,,--------,--------,,----,,--,,---,,-----,,--------,----,---,,--,,-----------,,---,--------,----,---,,--,,-----------,,---,--------,----,---,,--,,-----------,,---,--------,----,---,,--,,-----------,,---,--------,----,---,,--,,-----------,,---,-----------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------------------------------------------------------------------------,----,,----------,---,--------------------,----,---,----------,-------------------,----,---,----------,-------------------,----,---,----------------------------------------,---,-----------------------------------,---,-----------------------------------,---,-----------------------------------,---,-----------------------------------,---,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------------------------------------,---------------,----,---,----------,---,------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----------------------------------------------------,------------------------,---------,,-.-,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,-----,,,---------,---------,,--,,------------------------,---------,,--,,------------------------,---------,,--,,------------------------,---------,,--,,------------------------,---------,,--,,------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------------------------------------------------------------------------------------------,------------------,--,--,---,,---,,,--,,--,,---,----------,--,--,---,,---,,,--,,--,,---,----------,--,--,---,,--,--,,,---------,---------,,--,,------------------------,---------,,--,,------------------------,---------,,--,,------------------------,---------,,--,,------------------------,---------,,--,,------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------------------------,,-------------------,--------,---------,,-------,,----,,--,,---,,---,,,--,,,-,,,,--,,---,,----,,--,,---,,---,,,--,,,-,,,,--,,---,,----,,--,,---,,---,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,,---,,----,----,----,---,------,--,,---,,---,,----,----,----,---,------,--,,---,,---,,----,----,-.-,,--,---,,-----,----,,---,---,,----,,---,---,---,,-----,----,,---,---,,----,,---,---,---,,-----,----,,---,---,,----,,---,---,---,,-----,----,,---,---,,----,,---,---,---,,-----,----,,---,---,,----,,---,---,---,,----,,-----,--------,----,---,,---,---------,,-----,--------,----,---,,---,---------,,-----,--------,----,---,,---,---------,,-----,--------,----,---,,---,---------,,-----,--------,----,---,,---,---------,,-----,--------,----,---,,---,---------,,-----,--------,----,---,,---,---------,,-----,--------,-------------------------------------------------------,,--,,---------,---,,----,,---,---------,,--,,---,,---,,,--,,,--,,,--,,,---,,--,,,--,,,--,,---,,,--,,,--,,,--,,,---,,--,,,--,,,--,,---,,,--,,,--,,,--,,+,-,,..-------------------.-,-------------------------------------.-,-------------------------------------.-,-------------------------------------.-,-------------------------------------.-,-----------------------------,---------,------------------,----------,---------,------------------,----------,---------,------------------,----------,---------,------------------,----------,---------,------------------,----------,---------,------------------,----------,---------,------------------,----------,---------,----,--------------------------------------------------------------------------------------------------------------------------------------,------,--------------------------------,------,------------------------,--,---,----,,---,,,--,,---,,---,----,,---,,---,----,,---,,,--,,---,,---,----,,---,,---,----,,---,,,--,,---,,---,----,,---,,---,----,,---,,,--,,---,,---,----,,---,,---,----,,---,,,--,,---,,---,----,,---,,---,----,,---,,,-,,,---,,,--,,,--,,,--,,---,,----,---,,,-,,,---,,,--,,,--,,,--,,---,,----,---,,,-,,,---,,,--,,,--,,,--,,---,,----,---,,,-,,,---,,,--,,,--,,,--,,---,,----,---,,,-,,,---,,,--,,,--,,,--,,---,,----,---,,,-,,,---,,,--,,,--,,,--,,---,,----,---,,,-,,,---,,,--,,,--,,,--,,---,,----,---,,,-,,,---,,,---------------,,,--,,---,--------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,-----------------------------,+,,-,,,,-,,,,--,,--,,,,--,,--,,,--,,,,--,,,-,,,,-,,,,--,,--,,,,--,,--,,,--,,,,--,,,-,,,,-,,,,--,,--,,,,--,,--,,,--,,,,--,,,-,,,,-,,,,--,,--,,,,--,,--,,,--,,,,--,,,-,,,,-,,,,--,,--,,,,--,,--,,,--,,,,--,,,-,,,,--,,,--,,---,,,--,,,--,,,--,,---,---------,,,--,,---,,,--,,,--,,,--,,---,---------,,,--,,---,,,--,,,--,,,--,,---,---------,,,--,,---,,,--,,,--,,,--,,---,---------,,,--,,---,,,--,,,--,,,--,,---,---------,,,--,,---,,,--,,,--,,,--,,---,---------,,,--,,---,,,--,,,--,,,--,,---,---------,,,--,,---,,,---------------,,,--,,---,-,,,--,,,,--,,,-,,-,,,,,--,,,,--------------------------------------------------,-----------------------,---------------,-----------------------,---------------,-----------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------,----,,----,-------------,,-------------------,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------,---------,---,,---------,---,,---------,---------,---,,---------,---,,---------,---------,---,,---------,---,,---------,---------,---,,---------,---,,---------,---------,---,,---------,---,,---------,--,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------,----,---,,----,--------,,----,,--------,----,---,,----,--------,,----,,--------,----,---,,----,----,,-.-,,----,----,,-.,,-.-,,---,,----,---,,---,,----,----,,-.,,-.-,,---,,----,---,,---,,----,----,,-.,,-.-,,---,,----,---,,---,,----,----,,-.,,-.-,,---,,----,---,,---,,----,----,,-.,,-.-,,---,,----,---,,---,,----,------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------------------------------.---------------------------------------.------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------,,----,---,,--,,,,,,,,-,,,,,,,,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,,,,,,,,,,,,,,-,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,,--,,,-,,,,,,,,-,,---,,--,,,--------,,--,,,---,,--,,,-,-,,---,,--,,,--------,,--,,,---,,--,,,-,-,,---,,--,,,--------,,--,,,---,,--,,,-,-,,---,,--,,,--------,,--,,,---,,--,,,-,-,,---,,--,,,--------,,--,,,---,,--,,,-,-,,---,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,----------,,,--,,,--,,,-,,,--,,,--,,,,,,-,,-,,,-,,,--,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,-,,,-,,,,,,,,,,,,,,,,,,-,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,,-,---,,---,,---,,--,,,--------,,--,,,---,,---,----,,---,,--,,,--------,,--,,,---,,---,----,,---,,--,,,--------,,--,,,---,,---,----,,---,,--,,,--------,,--,,,---,,---,----,,---,,--,,,--------,,--,,,---,,---,----,,---,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------,---------------------------------------,---------------------------------------,---------------------,----------------------.----------------,----------------------.----------------,----------------------.----------------,----------------------.----------------,----------------------.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------------------------------------,,-----------------------------------------------------------------------------------------------------------------------------,--------------------,---,,-------------,--------------------,---,,-------------,--------------------,---,,-------------,--------------------,---,,-------------,--------------------,---,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------,-------------,---------------------------------------,------------------------------------------------------------------------------------------------------------------,,,--,,,--,,,--------,,--,,,---,,---,,--,,,--,,,--,,,--------,,--,,,---,,---,,--,,,--,,,--,,,--------,,--,,,---,,---,,--,,,--,,,--,,,--------,,--,,,---,,---,,--,,,--,,,--,,,--------,,--,,,---,,---,,--,,,--,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------,---------------------------------------------------------------------,---------------------------------------,---------------------------------------,------------------,,---,,---,,,--------,,--,,,---,--------,,---,,---,,,--------,,--,,,---,--------,,---,,---,,,--------,,--,,,---,--------,,---,,---,,,--------,,--,,,---,--------,,---,,---,,,--------,,--,,,---,--------,,---,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,,---,,---,,---,,---,----,----,,---,---------,,---,,------------------,---------------------------------------,---------------------------------------,----------------.-,-----,-------------------------------.-,-----,-------------------------------.-,-----,-------------------------------.-,-----,-------------------------------.-,-----,-------------------------------.-,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,,---,,---,,----,---,,---,,---,,,--,,---,,---,,---,,----,---,,---,,---,,,--,,---,,---,,---,,----,---,,---,,---,,,--,,---,,---,,---,,----,---,,---,,---,,,--,,---,,---,,---,,----,---,,---,,---,,,--,,---,,---,,------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,-----------------------------------------------------------------------------------------------------------------------------------,--------------,------------------------,--------------,------------------------,--------------,-----,------,,,--,,,--,,,--,,--,,,,--,,---,,,--,,---,,,--,,,--,,,--,,--,,,,--,,---,,,--,,---,,,--,,,--,,,--,,--,,,,--,,---,,,--,,---,,,--,,,--,,,--,,--,,,,--,,---,,,--,,---,,,--,,,--,,,--,,--,,,,--,,---,,,--,,---,,,--,,,-----------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,------.---------------------------------------------------------------------------------------------------,,-------------------,----,-------------,,-------------------,----,-------------,,---------------------------,----,----,----,----,---,,----,---,,,---,----,----,----,----,---,,----,---,,,---,----,----,----,----,---,,----,---,,,---,----,----,----,----,---,,----,---,,,---,----,----,----,----,---,,----,---,,,---,----,-----------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-----------------------------,-----------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------------------,,----,----,,---------------------------,,----,----,,---------------------------,,----,----,,---------------------------,,----,----,,---------------------------,,----,----,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-,,,,-----------,,----,---,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------,,--,,,--,,,----,-------------,---------,,--,,,--,,,----,-------------,---------,,--,,,--,,,----,-------------,---------,,--,,,--,,,----,-------------,---------,,--,,,--,,,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,----------------------------,---------,----,----------------------------------,----,-------------------,----,---,,----,----,-------------------,----,---,,----,----,-------------------,----,---,,----,----,------------------------,---,,---,,,----------------------------,---,,---,,,----------------------------,---,,---,,,----------------------------,---,,---,,,----------------------------,---,,---,,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----,---------,,---,--------,--------,,----,---,,-----------,---,,,-,------,-,,,--,,----------------,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---,-----,---,,----,,--,,,---,---,,---,----------,---,,----,,--,,,---,---,,---,----------,---,,----,,--,,,---,---,,---,----------,---,,----,,--,,,---,---,,---,----------,---,,----,,--,,,---,---,,---,----------,---,-----,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,---------------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------,,---,---------------------,------------,,---,---------------------,------------,,---,---------------------,------------,,---,---------------------,------------,,---,--------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,--------------------------------,-----,,----------------------------------,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,---------,,-----------------------,--,,,-------------,,----,----,----,------------------,----,----,,----,------------------------------------------------------------------------------------------------------------------,---,-----,----,----,,------------------,---,-----,----,----,,------------------,---,-----,----,----,,------------------,---,-----,----,----,,------------------,---,-----,----,----,,------------------,---,-----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,------------------.----------------------------------,--------------,----------------------------------,--------------------------------------------,---------------------------------------,---------------------------------------------,---,----,,---,,----,,--,,,--,,--,,,---,,---,----,,---,,----,,--,,,--,,--,,,---,,---,----,,---,,----,,--,,,--,,--,,,---,,---,----,,---,,----,,--,,,--,,--,,,---,,---,----,,---,,----,,--,,,--,,--,,,---,,---,----,,-----------------------,----,---------,,-----------------------,----,---------,,-----------------------,----,---------,,-----------------------,----,---------,,-----------------------,----,---------,,-----------------------,----,---------,,-----------------------,----,---------,,------------------------------------------------,----,,---,,---,,---------,-----------------------,,---,----------,------------------------------------------------------------------------------------------------------------------,---------,----,----,----,---,,---,-----,---------,----,----,----,---,,---,-----,---------,----,----,----,---,,---,-----,---------,----,----,----,---,,---,-----,---------,----,----,----,---,,---,-----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------,---,----------,,--------,---,,,--,,,---,------------,---,,--,------,-,---,,---------------------------------------------------------------------------------------------------------------------------------,-------------------,------..---.-------,-------------------,------..---.-------,-------------------,------..---.-------,-------------------,------..---.-------,-------------------,------..---.-------,--------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.--------------------------------------------------------------------------------------------------------------------------,----,--------,---,,--------------------,----,--------,---,,--------------------,----,----------,---,,,---,,---,,---,,--,,,,---,,--,,---,,---,,---,,---,,---,,--,,,,---,,--,,---,,---,,---,,---,,---,,--,,,,---,,--,,---,,---,,---,,---,,---,,--,,,,---,,--,,---,,---,,---,,---,,---,,--,,,,---,,--,,---,,---,,---,,-------,--------------------,----,-------------,--------------------,----,-------------,--------------------,----,-------------,--------------------,----,-------------,--------------------,----,-------------,--------------------,----,-------------,--------------------,----,-------------,-------------------------,--------------------------------------------------.-------------,----,----------------------------------------------------------------------------------------------------------------------------------,,,--,,,--,,,--,,---,,,---,,----,---,,--,,,--,,,--,,,--,,---,,,---,,----,---,,--,,,--,,,--,,,--,,---,,,---,,----,---,,--,,,--,,,--,,,--,,---,,,---,,----,---,,--,,,--,,,--,,,--,,---,,,---,,----,---,,--,,,--,,,--,,---,----------,--------,----,,--,,,---,,---,----------,--------,----,,--,,,---,,---,----------,--------,----,,--,,,---,,---,----------,--------,----,,--,,,---,,---,----------,--------,----,,--,,,---,,---,----------,--------,----,,--,,,---,,---,----------,--------,----,,--,,,---,,---,------------------,,---,--------------------------------------,,--------,---,,----,----,,----,--,,,,,,,,--------,----,----------------------------------,----,----------------------------------,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------,,,,--,,---,,----,---------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,---,,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---------,---------,-----,--------,----,---------,---------,-----,--------,----,---------,---------,-----,--------,----,---------,---------,-----,--------,----,---------,---------,-----,--------,----,-----------------------------,,----------,---------------------------,,----------,---------------------------,,----------,---------------------------,,----------,---------------------------,,----------,---------------------------,,----------,---------------------------,,----------,----------------------------------------------------------------,----------------------------,----,,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----------,---------------------------,,----------,---------------------------,,----------,---------------------------,,----------,---------------------------,,----------,---------------------------,,----------,---------------------------,,----------,----------------------------------------------------------------------------------,---------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,-------,----------------,---,-----,----,-------,----------------,---,-----,----,-------,----------------,---,-----,----,-------,----------------,---,-----,----,-------,----------------,---,-----,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.------,---------------------------------,,,---,,,--------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------,,,---,---,---,----------------,---,,---,,,---,---,---,----------------,---,,---,,,---,---,---,----------------,---,,---,,,---,---,---,----------------,---,,---,,,---,---,---,----------------,---,,---,,,---,--,,---,----------,---------,---,,----,,--,,---,----------,---------,---,,----,,--,,---,----------,---------,---,,----,,--,,---,----------,---------,---,,----,,--,,---,----------,---------,---,,----,,--,,---,----------,---------,---,,----,,--,,---,----------,---------,---,,----,,--,,---,---------------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,,,-,,,,--,,-,,,,,--,,,-,,,-,,,,,-,,,---,,,-,,,,--,,-,,,,,--,,,-,,,-,,,,,-,,,---,,,-,,,,--,,-,,,,,--,,,-,,,-,,,,,-,,,---,,,-,,,,--,,-,,,,,--,,,-,,,-,,,,,-,,,---,,,-,,,,--,,-,,,,,--,,,-,,,-,,,,,-,,,---,,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--,,---,,---,,--,-----,,--------,------,---------,,,,,,---------,,,,,,,,-----------------,,,,,,---------,,,,,,,,-----------------,,,,,,-----------------,----,--,,----,,--,,,,---,---,,---,,---,,----,--,,----,,--,,,,---,---,,---,,---,,----,--,,----,,--,,,,---,---,,---,,---,,----,--,,----,,--,,,,---,---,,---,,---,,----,--,,----,,--,,,,---,---,,---,,---,,----,----,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,--------,-------------------------------------------------------,,----,,----------------,----,----------,,----,,---------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.--------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,-----------------------------------------------------------------------------,----,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-----------------------------------------------------------------.--,-..-,--.----------------------------------,,,,,,,,--------,,,,,,,,----------------,,,,,,,,--------,,,,,,,,----------------,,,,,,,,----------------,----------,----,-----------------------,----------,----,-----------------------,----------,----,-----------------------,----------,----,-----------------------,----------,----,-----------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------,--,-----,,---,----,----,----,-----,---,---,-----,,---,----,----,----,-----,---,---,-----,,---,----,----,----,-----,---,---,-----,,---,----,----,----,-----,---,---,-----,,---,----,----,----,-----,---,---,-----,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----------------------------------,----,,---,--------,,----,,--,,---,,---,,---,,----,---,,---,,----,,----------------------------------------------------------------------------------------------------------------,,---,,,-,,,---,,---,,,--,,,--,,,---,,--,,---,,,-,,,---,,---,,,--,,,--,,,---,,--,,---,,,-,,,---,,---,,,--,,,--,,,---,,--,,---,,,-,,,---,,---,,,--,,,--,,,---,,--,,---,,,-,,,---,,---,,,--,,,--,,,---,,--,,---,,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,,-,--,,--,------------------------------------------,,---,---,,,--,,----,,--,,----,---,,----,,---,,---,,,--,,,---,---,,---,,--,,,,-,,,---,,---,,,--,,,---,---,,---,,--,,,,-,,,---,,---,,,--,,,---,---,,---,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----------------------------------------------------------------,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------,----------,----------------------------,----------,----------------------------,----------,----------------------------,----------,----------------------------,----------,----------------------------,----------,----------------------------,----------,--------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,---------------------------,----------,,---------------------------,----------,,---------------------------,----------,,---------------------------,----------,,---------------------------,----------,,---,,----,,--------,,----,,--,,---,,---,,--,,----,,--------,,----,,--,,---,,---,,--,,----,,--------,,----,,--,,---,,---,,--,,----,,--------,,----,,--,,---,,---,,--,,----,,--------,,----,,--,,---,,---,,--,,----,,--------,,----,,--,,---,,---,,--,,----,,--------,,----,,--,,---,,---,,--,,----,,----------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,,---,,----------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,----,--------,,-----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,--,,,--,----,,---,,,-----------------,,,--,,,--,----,,---,,,-----------------,,,--,,,--,----,,---,,,-----------------,,,--,,,--,----,,---,,,-----------------,,,--,,,--,----,,---,,,-----------------,,,--,,,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,-----------------,,----------------------------------------------------------------,,-------------------------------------,-----,---,,--,------,-------------,----,-----,---,,--,------,-------------,----,-----,---,,--,------,--------,,,,,,,,-,,,--,,,,--,,,--,,,--,,----,---,,,,,,,,-,,,--,,,,--,,,--,,,--,,----,---,,,,,,,,-,,,--,,,,--,,,--,,,--,,----,---,,,,,,,,-,,,--,,,,--,,,--,,,--,,----,---,,,,,,,,-,,,--,,,,--,,,--,,,--,,----,---,,,,,,,,-----------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-----------------------------,------,------------------------------------------,,---,---,,,--,,----,,--,,----,---,,----,,---,-------------------------------.---------------------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-----------------------,----,----,----,-------------,----------,----,--,,-----,-------------,---------------------------------------------------------------------------------------------------------------,--,,----,,--,,,-------------,,---,,---,,--,,----,,--,,,-------------,,---,,---,,--,,----,,--,,,-------------,,---,,---,,--,,----,,--,,,-------------,,---,,---,,--,,----,,--,,,-------------,,---,,---,,--,,----,,----------------------------------.----.----------------------------------.----.----------------------------------.----.----------------------------------.----.----------------------------------.----.----------------------------------.----.----------------------------------.----.-----------------------------------------------------,----,--------,,--,-----,,--,,,---,,----,--,,----,,---,,--------,,--,,--,,----------,,,,-,,-----------------,,--,,----------,,,,-,,-----------------,,--,,----------,,,,-,,-----,--,,----,,---,----,---,,,--,,,---,,---,,,-,,----,,---,----,---,,,--,,,---,,---,,,-,,----,,---,----,---,,,--,,,---,,---,,,-,,----,,---,----,---,,,--,,,---,,---,,,-,,----,,---,----,---,,,--,,,---,,---,,,-,,----,,---,---,--------------------,--------,-----,---,--------------------,--------,-----,---,--------------------,--------,-----,---,--------------------,--------,-----,---,--------------------,--------,-----,---,--------------------,--------,-----,---,--------------------,--------,-----,---,-------------,-------------------------------------------------,-,----,---,,---,--------,----,,----,,----,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------,----,----,--------------,--------------,----,----,--------------,--------------,----,----,--------------,--------------,----,----,--------------,--------------,----,----,--------------,--------------,----,----,--------------,--------------,----,----,--------------,-----------------,------------------------------------------------------------------------------,,---------------------------------------------------------------------------------------------------------------------------------.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,----,----,-------.-------,---,----,----,----,----,-------.-------,---,----,----,----,----,-------.-------,---,----,----,----,----,-------.-------,---,----,----,----,----,-------.-------,---,----,----,----,----,-------.-------,---,----,----,----,----,-------.-------,---,----,----,----------,,,-----------------------------------------,--,---------------------------------------,---------,,--,,----------,,,,-,,--------,----,---,,--,,----------,,,,-,,--------,----,---,,--,,----------,,,,-,,-,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-------------------,----,---,,----,---,,-------------------,----,---,,----,---,,-------------------,----,---,,----,---,,-------------------,----,---,,----,---,,-------------------,----,---,,----,---,,-------------------,----,---,,----,---,,-------------------,----,---,,----,---,,------------------------------------------------------------------,-------.-------------------------------,-------.-,,--,,---------,---,,,--------------,---,,--,,---------,---,,,--------------,---,,--,,---------,---,,,---,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,-------------------,--------------,----,------------------------------------------------,----,-------------,----,----------,----,--,,-----,---,----,----,----------------------------------------------------------------------------------------------------------.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------,----,--------,----,----,----,----,--,,,--,,,--,,,--,,,---,,,-,,,---,,--,,,---,,--,,,-----------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,-------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,-------------------,--------------------------,,---,------,---,,-------------------,,---,,-,,,,,,,,-,,,,-,,--,,---,----,,--,,,,,,,,,,,,,,,,,---------,----------,------------------,---------,----------,------------------,---------,----------,--------,,---,,,--,,,--,,,--,,,---,,--,,,--,,,--,,---,,,--,,,--,,,--,,,---,,--,,,--,,,--,,---,,,--,,,--,,,--,,,---,,--,,,--,,,--,,---,,,--,,,--,,,--,,,---,,--,,,--,,,--,,---,,,--,,,--,,,--,,,---,,--,,,--,,,--,,---,,,--,,---,,---,,---,,---,,,--,,,--,,---,,---,,---,,---,,---,,---,,,--,,,--,,---,,---,,---,,---,,---,,---,,,--,,,--,,---,,---,,---,,---,,---,,---,,,--,,,--,,---,,---,,---,,---,,---,,---,,,--,,,--,,---,,---,,---,,---,,---,,---,,,--,,,--,,---,,---,,---,,---,,---,,---,,,--,,,--,,---,,---,,---,,---,,---,----------------,,----,,---------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------,,---------,--------------,-------------,,---------,--------------,-------------,,---------,--------------,-------------,,---------,--------------,-------------,,---------,--------------,-------------,,---------,--------------,-------------,,---------,--------------,-------------,,------------------------------------------------------------,,,,,,,,--------------------------------,,,,,,,,---------------------------------------------------------------------------------------------------------------,---------,----,---------,----,----,--------------,----,---------,----,----,--------------,----,---------,----,----,--------------,----,---------,----,----,--------------,----,---------,----,----,------------------------,-------------------,----,--------------,-------------------,----,--------------,-------------------,----,--------------,-------------------,----,--------------,-------------------,----,--------------,-------------------,----,--------------,-------------------,----,--------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,,,-,,,--,,,-,,,,--,,,--,,,--,,,,-,,,--,,,,-,,,--,,,-,,,,--,,,--,,,--,,,,-,,,--,,,,-,,,--,,,-,,,,--,,,--,,,--,,,,-,,,--,,,,-,,,--,,,-,,,,--,,,--,,,--,,,,-,,,--,,,,-,,,--,,,-,,,,--,,,--,,,--,,,,-,,,--,,,,--,,---,,---,,--------,----,,---,,---,,---,,---,,---,,--------,----,,---,,---,,---,,---,,---,,--------,----,,---,,---,,---,,---,,---,,--------,----,,---,,---,,---,,---,,---,,--------,----,,---,,---,,---,,---,,---,,--------,----,,---,,---,,---,,---,,---,,--------,----,,---,,---,,---,,---,,---,,-----------,------,--------,------,--------,--------,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------,---,,--------------,-------------------,---,,--------------,-------------------,---,,--------------,-------------------,---,,--------------,-------------------,---,,--------------,-------------------,---,,--------------,-------------------,---,,--------------,-----------,------,----------------------------------,-----,,,,,,,,-------------------,------------,,,,,,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.----------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---,,---,---------------,----,---------,---,,---,---------------,----,---------,---,,---,---------------,----,---------,---,,---,---------------,----,---------,---,,---,---------------,----,---------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------,,----,---------------------------------------,--------------------,,-------,----,-----,---,,---,,---,,----,,-------,----,-----,---,,---,,---,,----,,-------,----,-----,---,,---------,---,,---,---------------,----,---------,---,,---,---------------,----,---------,---,,---,---------------,----,---------,---,,---,---------------,----,---------,---,,---,---------------,----,---------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------------,-----------------------------,---------,-----------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,---------,,---,,----,,--,----,----,,---,---------,,---,,----,,--,----,----,,---,---------,,---,,----,,--,----,----,,---,---------,,---,,----,,--,----,----,,---,---------,,---,,----,,--,----,----,,---,---------,,---,,----,,--,----,----,,---,---------,,---,,----,,--,----,----,,---,--------,----------------------------------------------------------.---.-----------------------------------.---.-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,------------------------------,-------------------,----,---,,---,,----,----,---,,---,,---,,---,,---,,---,,----------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,--------,,---,,---,,--------------,,---,--------,,---,,---,,--------------,,---,--------,,---,,---,,--------------,,---,--------,,---,,---,,--------------,,---,--------,,---,,---,,--------------,,---,--------,,---,,---,,--------------,,---,--------,,---,,---,,--------------,,---,--------------------------------------------------------------------------------,----,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------,----,----,----,----,----,----,---,,----,----,----,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,,---------------------------------,---,,,---------------------------------,---,,,---------------------------------,---,,,---------------------------------,---,,,---------------------------------,---,,,---------------------------------,---,,,--------------------------------------------,,---,---,,,--,,----,,--,,,--,,,--,,,---,,---,,--,,,--,,---,,,--,,,--,,,--,,,--,,---,,---,,,--,,,---,------------------,,---,,---,,,--,,,---,------------------,,---,,---,,,--,,,---,,----,--,,,,,,,,--------,,,,,,,,--,----,,,-,,,,-,,,,,,,,--------,,,,,,,,--,----,,,-,,,,-,,,,,,,,--------,,,,,,,,--,----,,,-,,,,-,,,,,,,,--------,,,,,,,,--,----,,,-,,,,-,,,,,,,,--------,,,,,,,,--,----,,,-,,,,-,,,,,,,,----------,,------,,-,------,---,,--,,,-----------,,------,,-,------,---,,--,,,-----------,,------,,-,------,---,,--,,,-----------,,------,,-,------,---,,--,,,-----------,,------,,-,------,---,,--,,,-----------,,------,,-,------,---,,--,,,-----------,,------,,-,------,---,,--,,,-----------,,-----------,-------------------,----,----,----,----,----,,---,----,,---,----,----,,--,,----,----,----,----,,--------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------,,,--,,-----,,,,---,,,-----------------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-----------------.----.----------------.-----------------.----.----------------.-----------------.----.----------------.-----------------.----.----------------.-----------------.----.----------------.-----------------.----.----------------.-----------------.----.----------------.------------------------------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--,,----,,------------------------,----,--,,----,,------------------------,----,--,,----,,------------------------,----,--,,----,,------------------------,----,--,,----,,-------------------------------,------------------------,---,,---------,------------------------,---,,---------,------------------------,---,,---------,------------------------,---,,---------,------------------------,---,,---------,------------------------,---,,---------,------------------------,---,,---------,----------------------------------------------------------------------------------------------------------------------------------------,---,,----,-----------------------------,---,,----,-----------------------------,---------------,----,--,------,------------------------,----,--,------,------------------------,----,--,------,------------------------,----,--,------,------------------------,----,--,------,--------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-----------------------,--,,----------------------,----,----,----,--------------------------------------------------------------------------------,---,,----,-----------------------------,---,,----,-----------------------------,---------------,----,-----------------------,----------,----,-----------------------,----------,----,-----------------------,----------,----,-----------------------,----------,----,-----------------------,------------------,------,--,,---,----------,----,--------,------,--,,---,----------,----,--------,------,--,,---,----------,----,--------,------,--,,---,----------,----,--------,------,--,,---,----------,----,--------,------,--,,---,----------,----,--------,------,--,,---,----------,----,--------,------,-------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--,------,--------,---,,,---------,----,--,------,--------,---,,,---------,----,--,------,--------,---,,,---------,----,--,------,--------,---,,,---------,----,--,------,--------,---,,,-------------,,--,,----,,------------------,,---,----,,--,,----,,------------------,,---,----,,--,,----,,------------------,,---,----,,--,,----,,------------------,,---,----,,--,,----,,------------------,,---,----,,--,,----,,------------------,,---,----,,--,,----,,------------------,,---,----,,--,,----,,------------------,,---,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,,--------,---,,------------------,,----,,--------,---,,------------------,,----,,--------,---,,------------------,,----,,--------,---,,------------------,,----,,--------,---,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------,,--,,,--,,,--,,---,-----------------------------------------------------------,,-----------------------------------------------------------------------------------------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,,--,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,-----------------,,-------------,------,--,----,-----------------------------,----,----,-----------------------------,----,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--,,---,,---,,----,--------,,---,------,--,----,-----------------------------,----,----,-----------------------------,----,----,-------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,-----------------------------,---------,---,,,--,,----,,--,,,,,,,,-------------,---,,,--,,----,,--,,,,,,,,-------------,---,,,--,,----,,--,,,,,,,,-------------,---,,,--,,----,,--,,,,,,,,-------------,---,,,--,,----,,--,,,,,,,,-------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------,----------------------------------------,,----,,------------------,-------------,,----,,------------------------------------------------------------------------------------------------------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------,,,--,,,-----------------,,--------,,---,,,--,,,-------------,----,----------------------------------,----,----------------------------------,----,-----------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----------,----------------------------------------------------------------.---------------------------,--------,----,----,--------------------,--------,----,----,--------------------,--------,----,----,----,-----,,---,--------,----,,---,----,----------,,---,--------,----,,---,----,----------,,---,--------,----,,---,----,----------,,---,--------,----,,---,----,----------,,---,--------,----,,---,----,----------,,---,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-------------------,-------------------------------------------,,,---,--------,,,,,,,,----------------------------------------------------------------------------------------------------------------------------------,,---,------------------------,----,----,,---,------------------------,----,----,,---,------------------------,----,----,,---,------------------------,----,----,,---,------------------------,----,----,,---,--,,---,-------------,--------------------,,---,-------------,--------------------,,---,-------------,--------------------,,---,-------------,--------------------,,---,-------------,--------------------,,---,-------------,--------------------,,---,-------------,--------------------,,---,--------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------,,,---,--------,,---,,-------------,,---,,,---,--------,,---,,-------------,,---,,,---,--------,,---,,-------------,,---,,,---,--------,,---,,-------------,,---,,,---,--------,,---,,-------------,,---,,,---,--------,,---,,-------------,,---,,,---,--------,,---,,-------------,,---,,,---,--------,-----------------------------------------------------------------------,,,,,,,,--------,---,,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------,--,,,,,-,,--,,---,,,,,,,,,--------,,--,,,-,,,,,-,,--------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------,----------------------------------------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,--------,----,----------------------------,----,,----,----------------------------,----,,----,----------------------------,----,,----,----------------------------,----,,----,----------------------------,----,,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,---,,----,,,--,,,---,,--,,--,,,,-,,,---,---,,----,,,--,,,---,,--,,--,,,,-,,,---,---,,----,,,--,,,---,,--,,--,,,,-,,,---,---,,----,,,--,,,---,,--,,--,,,,-,,,---,---,,----,,,--,,,---,,--,,--,,,,-,,,---,---,,----,,,--,,,---,,--,,--,,,,-,,,---,---,,----,,,--,,,---,,--,,--,,,,-,,,---,---,,-----,----,--------------------------------------------,---,,,--,,,---,,---,,----,,-,,,---,---,,---,,,--,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,-------------------,---,--,,,,--------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------,,---------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,,--,,,--,,,--,,,---,,,-,,,---,,--,,,--,,,--,,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,---------------------,,---,----,----,---------,-------------------,---------,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--,------------------,----,-------------------,-------------------,---------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,-------------------,--------------,----,----,----,,---,----,-------------------------------------------------------------------------------------------------------------------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,------------------------,---,,------------------,---,,----------,---,,------------------,---,,----------,---,,------------------,---,,----------,---,,------------------,---,,----------,---,,------------------,---,,----------,---,,------------------,---,,----------,---,,------------------,---,,----------,---,,--------------------------,,,,,,,,---,,---,,--,,,--,,,---,----,--------------,----,----,----,,---,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,-------------------,----,-,--,,--,----------,----,---------,----,----,------------------------,---,,,--,,,---,------------------------,---,,,--,,,---,--------------------,---,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,,---,---,,-------------------,----,---,,,--,----------------,--,,,--,,,--,,,--,,,--,----------------,--,,,--,,,--,,,--,,,--,----------------,,,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------,,---,----,----------,----,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------,,---,---,,----,----,-------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------------------------------------------..--------------------------------------..------,----,---,,----,,---,----,----,----,----,----,---,,----,,---,----,----,----,----,----,---,,----,,---,----,---,------,--,,----,---,,----,,---,--------,------,--,,----,---,,----,,---,--------,------,--,,----,---,,----,,---,--------,------,--,,----,---,,----,,---,--------,------,--,,----,---,,----,,---,--------,------,--,----,----------,,---,------------------,----,----------,,---,------------------,----,----------,,---,------------------,----,----------,,---,------------------,----,----------,,---,------------------,----,----------,,---,------------------,----,----------,,---,------------------,----,--------------------------,----,-----------------------------------------------------------------------------------,----,---,,----,,---,----,----,----,----,----,---,,----,,---,----,----,----,----,----,---,,----,,---,----,---,,----,,--,,---,,---,,,--,,,---,,---,,,-,,----,,--,,---,,---,,,--,,,---,,---,,,-,,----,,--,,---,,---,,,--,,,---,,---,,,-,,----,,--,,---,,---,,,--,,,---,,---,,,-,,----,,--,,---,,---,,,--,,,---,,---,,,-,,----,,--------,---,,,---,----,------------------------,---,,,---,----,------------------------,---,,,---,----,------------------------,---,,,---,----,------------------------,---,,,---,----,------------------------,---,,,---,----,------------------------,---,,,---,----,------------------------,---,,,----,,,--,,----------------------,---,,----,,---,------------------------,----,----,,---,----------------,,------,------,--,----,-----------,,---,,------,------,--,----,-----------,,---,,------,------,--,----,,-------,---,,----,,---,,---,,---,,---,,---,,---,---,,----,,---,,---,,---,,---,,---,,---,---,,----,,---,,---,,---,,---,,---,,---,---,,----,,---,,---,,---,,---,,---,,---,---,,----,,---,,---,,---,,---,,---,,---,---,,--.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.-------------------------------------------------------------------------------------------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------,--------------,,-----------------------,--------------,,-----------------------,--------------,,-----------------------,--------------,,-----------------------,--------------,,------------,,---,,---------,---,,---------,----,---,,---,,---------,---,,---------,----,---,,---,,---------,---,,---------,----,---,,---,,---------,---,,---------,----,---,,---,,---------,---,,---------,----,---,,---,,---------,---,,---------,----,---,,---,,---------,---,,---------,----,---,,---,,--------,,------------------------------,----,----,----,------------------------,----,----,-------------------------------------------------------------------------------------------------------------------------------------,----,----,----,---,,---,,---,,----,----,----,----,----,---,,---,,---,,----,----,----,----,----,---,,---,,---,,----,----,----,----,----,---,,---,,---,,----,----,----,----,----,---,,---,,---,,----,----,----,-----------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,----------------------------------,,------------------------------,----,----,----,------------------------,---,,------------------------------------------------------------------------------------------------------------------------------------------,----,----,----,---,,---,,---,,---,,----,----,----,----,---,,---,,---,,---,,----,----,----,----,---,,---,,---,,---,,----,----,----,----,---,,---,,---,,---,,----,----,----,----,---,,---,,---,,---,,----,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------,,--,,---,,----,,,--,,,---,,,-,,,--,,,--,,--,,---,,----,,,--,,,---,,,-,,,--,,,--,,--,,---,,----,,,--,,---------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,--------------------------------------------------------------------------------------------,----------------,----,--,,----,,-------,----------------,----,--,,----,,-------,----------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,-----------------------------,----,----,--------------,,------------,-----------------,,,--,,,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,----,,,,,,----,,---,,--,,,--,-----,--,,,----,,,,,,----,,---,,--,,,--,-----,--,,,----,,,,,,----,,---,,--,,,--,-----,--,,,----,,,,,,----,,---,,--,,,--,-----,--,,,----,,,,,,----,,---,,--,,,--,-----,--,,,----,,,,,,----,,---,,--,,,--,-----,--,,,----,,,,,,----,,---,,--,,,--,-----,--,,,----,,,,,,----------------,------------------------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,---,-,---,,---,----,------------,------,---,-,---,,---,----,------------,------,---,-,---,,---,----,------------,------,---,-,---,,---,----,------------,------,---,-,---,,---,----,------------,-----------.----------,,---------------------------.----------,,---------------------------.----------,,---------------------------.----------,,---------------------------.----------,,---------------------------.----------,,---------------------------.----------,,---------------------------.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,--,,,-,-,,---,-,---,,,-,------,--,,,---,--,,,-,-,,---,-,---,,,-,------,--,,,---,--,,,-,-,,---,-,---,,,-,------,--,,,---,--,,,-,-,,---,-,---,,,-,------,--,,,---,--,,,-,-,,---,-,---,,,-,------,--,,,---,,,,,,,,-,,,,,,,,--,,,--,,,,,,,,--------,,,,,,,,-,,,,,,,,--,,,--,,,,,,,,--------,,,,,,,,-,,,,,,,,--,,,--,,,,,,,,--------,,,,,,,,-,,,,,,,,--,,,--,,,,,,,,--------,,,,,,,,-,,,,,,,,--,,,--,,,,,,,,--------,,,,,,,,-,,,,,,,,--,,,--,,,,,,,,--------,,,,,,,,-,,,,,,,,--,,,--,,,,,,,,--------,,,,,,,,-,,,,,,,-----------------------------------------------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------,----,,---,,---,-----,-------------,-----,,--,,---,,---,-----,-------------,-----,,--,,---,,---,-----,-------------,-----,,--,,---,,---,-----,-------------,-----,,--,,---,,---,-----,-------------,-----,,--,,---,--------.-,---------,-------------,,------------.-,---------,-------------,,------------.-,---------,-------------,,------------.-,---------,-------------,,------------.-,---------,-------------,,------------.-,---------,-------------,,------------.-,---------,-------------,,------------.-,------------------------------------------,---------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------,----,,---,---------,,---,,--------,---------,,---,---------,,---,,--------,---------,,---,---------,,---,,--------,---------,,---,---------,,---,,--------,---------,,---,---------,,---,,--------,---------,,---,--..----.---..----------------------------..----.---..----------------------------..----.---..----------------------------..----.---..----------------------------..----.---..----------------------------..----.---..----------------------------..----.---..----------------------------..----.---..--,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,,--,,-----,-------,----,,----,----,----,,--,,-----,-------,----,,----,----,----,,--,,-----,-------,----,,----,----,----,,--,,-----,-------,----,,----,----,----,,--,,-----,-------,----,,----,----,----,,---,,,--,,---,,---------,,--,,---------,---,,,--,,---,,---------,,--,,---------,---,,,--,,---,,---------,,--,,---------,---,,,--,,---,,---------,,--,,---------,---,,,--,,---,,---------,,--,,---------,---,,,--,,---,,---------,,--,,---------,---,,,--,,---,,---------,,--,,---------,---,,,--,,---,,,-------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,--,,---,,,,,,,--,-----,---,,,--,,,---,,,--,,---,,,,,,,--,-----,---,,,--,,,---,,,--,,---,,,,,,,--,-----,---,,,--,,,---,,,--,,---,,,,,,,--,-----,---,,,--,,,---,,,--,,---,,,,,,,--,-----,---,,,--,,,---,,,--,,---,,--.----.----.-----,,-----------.----------.----.----.-----,,-----------.----------.----.----.-----,,-----------.----------.----.----.-----,,-----------.----------.----.----.-----,,-----------.----------.----.----.-----,,-----------.----------.----.----.-----,,-----------.----------.----.----.--------,--,,--,,----,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,,-,,,,--,,,-,,,--,,,,,,,,--,,,--,,,,-,,,,-,,,,--,,,-,,,--,,,,,,,,--,,,--,,,,-,,,,-,,,,--,,,-,,,--,,,,,,,,--,,,--,,,,-,,,,-,,,,--,,,-,,,--,,,,,,,,--,,,--,,,,-,,,,-,,,,--,,,-,,,--,,,,,,,,--,,,--,,,,-,,,,-,,,,--,,,,-,,,,-,,,--,,,--,,,--,,,--,,,-,,,,--,,,,-,,,,-,,,--,,,--,,,--,,,--,,,-,,,,--,,,,-,,,,-,,,--,,,--,,,--,,,--,,,-,,,,--,,,,-,,,,-,,,--,,,--,,,--,,,--,,,-,,,,--,,,,-,,,,-,,,--,,,--,,,--,,,--,,,-,,,,--,,,,-,,,,-,,,--,,,--,,,--,,,--,,,-,,,,--,,,,-,,,,-,,,--,,,--,,,--,,,--,,,-,,,,--,,,,-,,,,-,,,--,,,-------------------.---.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.----.----------------------------------.----.----------------------------------.----.----------------------------------.----.----------------------------------.----.----------------------------------.----.----------------------------------.----.------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-------------------------------------.-,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------------------------------,,--,,---------,---,,,--,,,---,---------,,--,,---,----,------------------------,----,----,----,------------------------,----,----,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------,,--,,,------------------------------------------------------,----,-----------------------,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------,---,,----,,---,---------,,--,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------,---,,,-----------------------------------------------------------------------------------,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,--------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---------,,--,,-------------------,----,---------,,--,,-------------------,----,---------,,--,,-------------------,----,---------,,--,,-------------------,----,---------,,--,,-------------------,----,---------,,--,,-------------------,----,---------,,--,,-------------------,----,--------,,----------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,--------,,,,,,,,,,,,,,,,--------,,,,,,,,--------,,,,,,,,,,,,,,,,--------,,,,,,,,--------,,,,,,,,,,,,,,,,--------,,,,,,,,--------,,,,,,,,,,,,,,,,--------,,,,,,,,--------,,,,,,,,,,,,,,,,--------,,,,,,,,--------,,,,,,,,,,,,,,,,--------,,,,,,,,--------,,,,,,,,,,,,,,,,--------,,,,,,,,-------.,---------,--------,,---,---,,----,,---,,---,,,,--,,----,,,,,,,,,,---,,,-,,,--,,,,,,,,,,--,,----,,--,,,--,,,--,,,---,,--,,,,,,,,--------,,--,,,--,,,--,,,---,,--,,,,,,,,--------,,--,,,--,,,--,,,---,,--,,-----.-----,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,----------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,------------------,,----,--------,----,,--------.,-----------------,,,--,,,-,,,,--,,,,-,,---,,,----,--------,,------------,,,---,---,------,---------------,---------------------------------------,---------------------------------------,---------------------,---,,----------,---,,-------------,,---,---,,----------,---,,-------------,,---,---,,----------,---,,-------------,,---,---,,----------,---,,-------------,,---,---,,----------,---,,-------------,,---,---,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,,--,,,--,,,--,,---,,--------------,-----------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------.-------------------------.-----------,--------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----------------------------------------------------------------,---,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------------------------.------------------------------.--------.------------------------------.--------.------------------------------.--------.------------------------------.--------.------------------------------.--------.------------------------------.--------.------------------------------.--------.-------,,------------------------------------------------------------------------------------------,--------------------------------------------------------------------------------------------------------------------------,----------,,---,---------,,--,,-,------,----------,,---,---------,,--,,-,------,----------,,---,---------,,--,,-,------,----------,,---,---------,,--,,-,------,----------,,---,---------,,--,,-,------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------,-------------------------,----,--------------,----,,--------,---,,,---------,--,,,---,----,,----------------------------------------------------------------------------------------------------------------,---,,---,,,---,,---,,---,,--,,----,,---,---,,---,,,---,,---,,---,,--,,----,,---,---,,---,,,---,,---,,---,,--,,----,,---,---,,---,,,---,,---,,---,,--,,----,,---,---,,---,,,---,,---,,---,,--,,----,,---,---,,----------,---------------,----,---------,--------,---------------,----,---------,--------,---------------,----,---------,--------,---------------,----,---------,--------,---------------,----,---------,--------,---------------,----,---------,--------,---------------,----,---------,--------,------------,----,,---------,-----,----,---,,----,,---,----,---,,,---,,---,,---,---------,----,--------,,,---,,---------------------------------------------------------------------------------------------------------------------,----,,---,-----,----,------------------,----,,---,-----,----,------------------,----,,---,-----,----,------------------,----,,---,-----,----,------------------,----,,---,-----,----,------------------,----------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,-------------------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--,,---,,,,,,,,,,,-,,,---,,,,,--,,,---,,,-,,---,,,,,,,,,,,-,,,---,,,,,--,,,---,,,-,,---,,,,,,,,,,,-,,,---,,,,,--,,,---,,,-,,---,,,,,,,,,,,-,,,---,,,,,--,,,---,,,-,,---,,,,,,,,,,,-,,,---,,,,,--,,,---,,,-,,---,,,--,----,------------------,,----,---,,----,----,------------------,,----,---,,----,----,------------------,,----,---,,----,----,------------------,,----,---,,----,----,------------------,,----,---,,----,----,------------------,,----,---,,----,----,------------------,,----,---,,----,----,---------,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------,,-------------------------------------------------------------------------------------------------------------,---,,----,----------,--,,----,,--------,---,,----,----------,--,,----,,--------,---,,----,---------,,,--,,,--,,--,,,,--,,,,--,,---,,,--,,,,,,,,-,,,--,,--,,,,--,,,,--,,---,,,--,,,,,,,,-,,,--,,--,,,,--,,,,--,,---,,,--,,,,,,,,-,,,--,,--,,,,--,,,,--,,---,,,--,,,,,,,,-,,,--,,--,,,,--,,,,--,,---,,,--,,,,,,,,-,,,--,,,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,---------------------------------,----,----------------,-----------------------------------------------------------------,-----,----,------------------,,----,,--,-----,----,------------------,,----,,--,-----,----,--------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,,-,,,---,,---,,,-,,,---,,---,,---,,--,,,,-,,,---,,---,,,-,,,---,,---,,---,,--,,,,-,,,---,,---,,,-,,,---,,---,,---,,--,,,,-,,,---,,---,,,-,,,---,,---,,---,,--,,,,-,,,---,,---,,,-,,,---,,---,,---,,--,,,,-,,,---,,---,,,-,,,---,,---,,---,,--,,,,-,,,---,,---,,,-,,,---,,---,,---,,--,,,,-,,,---,------------------------------------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------,,,,---,,--,,----,,---,,,--,----,,---------,---,,--,,----,,---,,,--,----,,---------,---,,--,,----,,---,,,--,----,,---------,---,,--,,----,,---,,,--,----,,---------,---,,--,,----,,---,,,--,----,,---------,---,,--,,---,,---,,---,,---,,--,,,---,,---,----,,---,,---,,---,,---,,--,,,---,,---,----,,---,,---,,---,,---,,--,,,---,,---,----,,---,,---,,---,,---,,--,,,---,,---,----,,---,,---,,---,,---,,--,,,---,,---,----,,---,,---,,---,,---,,--,,,---,,---,----,,---,,---,,---,,---,,--,,,---,,---,----,,---,,---,,---,-,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.----------------------------------.--,-.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----------------------,,----,---,,---,,----,------,,----------------------------------------------------------,------------------------,,-------------,------------------------,,-------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,---,,----,----,---,,,,,,,--,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,-,,---,,,--,,---,,---,,----,,---,---,,---,,---,,,--,,---,,---,,----,,---,---,,---,,---,,,--,,---,,---,,--,,,,---,--,----,--------,---------------,----,----,----,--------,---------------,----,----,----,--------,---------------,----,----,----,--------,---------------,----,----,----,--------,---------------,----,----,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,-,,,----------------------------------------------------------------------------------------------------------,-----------------------,---------------,-----------------------,---------------,------------,,-----------------------------,,---,,---------------------------------,,---,,---------------------------------,,---,,---------------------------------,,---,,---------------------------------,,---,,------------------,,----,----,----,--------,,---,---------,,----,----,----,--------,,---,---------,,----,----,----,--------,,---,---------,,----,----,----,--------,,---,---------,,----,----,----,--------,,---,---------,,----,----,----,--------,,---,---------,,----,----,----,--------,,---,---------,,----,----,--..-----------.--------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------,--------,,---,---------,----,----------,--------,,---,---------,----,----------,--------,,---,---------,----,----------,--------,,---,---------,----,----------,--------,,---,---------,----,----------,--------,,---,---------,----,----------,--------,,---,---------,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--------,---------------,---------,----,--------,---------------,---------,----,--------,---------------,---------,----,--------,---------------,---------,----,--------,---------------,---------,----,----------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-------------------------------------------,----,------------------------------------------------------------------,---,,-------------------,,,---,-----------------,,,---,---------,,,---,-----------------,,,---,---------,,,---,--------,---,,----,,---,--------,------------,--,---,-----,,---,--------,------------,--,---,-----,,---,--------,------------,--,---,-----,,---,--------,------------,--,---,-----,,---,--------,------------,--,---,-----,,---,--,,-------------,---,,-,--,,,--,---,,----,,-------------,---,,-,--,,,--,---,,----,,-------------,---,,-,--,,,--,---,,----,,-------------,---,,-,--,,,--,---,,----,,-------------,---,,-,--,,,--,---,,----,,-------------,---,,-,--,,,--,---,,----,,-------------,---,,-,--,,,--,---,,----,,------------------,,----,,--,---,,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,----,-------------,,--------,,----,----,----,-------------,,--------,,----,----,----,-------------,,--------,,----,----,----,-------------,,--------,,----,----,----,-------------,,--------,,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------..-,--.-,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----,,---,,,--,,,---,---,,,--,,,-,,,,--,,---,,---,,,--,,,---,---,,,--,,,-,,,,--,,---,,---,,,--,,,---,---,,,--,,,-,,,,--,,---,,---,,,--,,,---,---,,,--,,,-,,,,--,,---,,---,,,--,,,---,---,,,--,,,-,,,,--,,---,,---,,,-,--------------------,,----,---,----,,--,--------------------,,----,---,----,,--,--------------------,,----,---,----,,--,--------------------,,----,---,----,,--,--------------------,,----,---,----,,--,--------------------,,----,---,----,,--,--------------------,,----,---,----,,--,---------------,,--------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------------,.-,,----,---------,--------------------,.-,,----,---------,--------------------,.-,,----,---------,--------------------,.-,,----,---------,--------------------,.-,,----,---------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----,---,,---------,--,,----,---------,-----,---,,---------,--,,----,---------,-----,---,,---------,--,,----,---------,-----,---,,---------,--,,----,---------,-----,---,,---------,--,,----,---------,---------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------,-----------------------------------------------------------------------------------------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,--------,,,,,,,,,,--,,,-,,,,,,,,--,,--------,,--,,,,,,,,,,--,,,-,,,,,,,,--,,--------,,--,,,,,,,,,,--,,,-,,,,,,,,--,,--------,,--,,,,,,,,,,--,,,-,,,,,,,,--,,--------,,--,,,,,,,,,,--,,,-,,,,,,,,--,,--------,,--,,,,,,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,--------,----,----------,----,---------,---,,---,----,----------,----,---------,---,,---,----,----------,----,---------,---,,---,----,----------,----,---------,---,,---,----,----------,----,---------,---,,---,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--,,,---,----,,----,---,,,--,,--------,,--,,,---,----,,----,---,,,--,,--------,,--,,,---,----,,----,----------,---,,,---,----,--,,,---,---------------,---,,,---,----,--,,,---,---------------,---,,,---,----,--,,,---,---------------,---,,,---,----,--,,,---,---------------,---,,,---,----,--,,,---,---------------,---,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------,----,---,,,---,,---,,,--,,,--,,--,,,,------------------------------------------------------------,----,,----,----------------------------,----,,----,----------------------------,----,,----,--------------------,-------------,---,,---,,----,----------,-------------,---,,---,,----,----------,-------------,---,,---,,----,----------,-------------,---,,---,,----,----------,-------------,---,,---,,----,----------,,---,,---,,,-,---,,,---,----,----------,,---,,---,,,-,---,,,---,----,----------,,---,,---,,,-,---,,,---,----,----------,,---,,---,,,-,---,,,---,----,----------,,---,,---,,,-,---,,,---,----,----------,,---,,---,,,-,---,,,---,----,----------,,---,,---,,,-,---,,,---,----,----------,,---,,---,,,------------------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------,,--------------------------------------------,---------,----,----------------------------------,----,-------------------------------------------------------------------------------------------------------------,,--,,----,,--,----,------------------------,,----,,--,----,------------------------,,----,,--,----,------------------------,,----,,--,----,------------------------,,----,,--,----,------------------------,,----,,--,-----------------------------,,---,,,--,-----------------------------,,---,,,--,-----------------------------,,---,,,--,-----------------------------,,---,,,--,-----------------------------,,---,,,--,-----------------------------,,---,,,--,-----------------------------,,---,,,--,---------------,-------------------------------------------------------------------------------,-----------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,----,,,-,,,,,,,,-,,,--,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,-,,,--,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,-,,,--,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,-,,,--,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,-,,,--,,,,,,,,,,,,,,,,,,,,--,,,-,,,,,,,,--,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------,---------,-----------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------------------------------,,,---,,----,,,--,,,,,,,,,,--------,,--,,,----,,----,,,--,,,,,,,,,,--------,,--,,,----,,----,,,--,,,,,,,,,,--------,,--,,,----,,----,,,--,,,,,,,,,,--------,,--,,,----,,----,,,--,,,,,,,,,,--------,,--,,,----,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,--------------------------------------------------------------------------------------------------------------,,,---,,-----,----,---------------------------,,-----,----,---------------------------,,-----,----,---------------------------,,-----,----,---------------------------,,-----,----,---------------------------,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----,---------,,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------,----------------------------------,,-----------------------,------------------.----------------,----------------------.----------------,----------------------.---------------------,-------------------,.---,----------------------------------,.---,----------------------------------,.---,----------------------------------,.---,----------------------------------,.---,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,-------------------,-------------------,,-------------,,---,----,----,----,----,------------------------------------------------------------------------------------------------------------------------,--,,,---,,---,,----,-,,-,---,,----,---,,,-,,,---,,---,,----,-,,-,---,,----,---,,,-,,,---,,---,,----,-,,-,---,,----,---,,,-,,,---,,---,,----,-,,-,---,,----,---,,,-,,,---,,---,,----,-,,-,---,,----,---,,,-,,,---,,------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,---------------------------------------------------------------------,---------------------------------------------------.-,-----------------------------,-------.-,-----------------------------,-------.-,--------------------------,---------,---,,----,--,-,---------,----,---------,---,,----,--,-,---------,----,---------,---,,----,--,-,---------,----,---------,---,,----,--,-,---------,----,---------,---,,----,--,-,---------,----,---------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-----------------------------------------------------,----,----------------------------------,----,--------------------------------------------------------------------------------------------------------------,------..-----------,.---,---------,-.--,------..-----------,.---,---------,-.--,------..-----------,.---,---------,-.--,------..-----------,.---,---------,-.--,------..-----------,.---,---------,-.--,------..----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------,-,,,,,,,,,--,,--,------------------,,,--,,,,,,,,,-------------------------------------------------------------------------------------------------------------,---,,----,---------,----,---------,---,,,--,,----,---------,----,---------,---,,,--,,----,---------,----,---------,---,,,--,,----,---------,----,---------,---,,,--,,----,---------,----,---------,---,,,--,,----,------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,---------------------------------------------------------------------------,--,--,--,,--,----------------,--,,,----,--,--,----,----------------------------------,----,----------------------------------,----,-----------------------,--,,,,--,,---,,----,--,-,---,,----,,--,,,-,,,,--,,---,,----,--,-,---,,----,,--,,,-,,,,--,,---,,----,--,-,---,,----,,--,,,-,,,,--,,---,,----,--,-,---,,----,,--,,,-,,,,--,,---,,----,--,-,---,,----,,--,,,-,,,,--,,-------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,-------------------------------------------------,----------------------------------,,-----------------------,-----------,---------------------------------------,---------------------------------------,----------------------------,-------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,----------------------------,------------------,,,--,,,--,,,---,,---,---,,,--,,,---,,---,,--,,,--,,,--,----,----------------------------------,----,----------------------------------,----,---------------------,-------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-------------------,--------,,---,,---,,-----------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----,,,,--,,,-,,,,--,,--,,,,--,,-,,,,-,,,,,,,,,,--,,,-,,,,--,,--,,,,--,,-,,,,-,,,,,,,,,,--,,,-,,,,--,,--,,,,--,,-,,,,-,,,,,,,,,,--,,,-,,,,--,,--,,,,--,,-,,,,-,,,,,,,,,,--,,,-,,,,--,,--,,,,--,,-,,,,-,,,,,,,,,,--,,,-------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--,-----------------------------------------------------------------------------------------------------------,-----------------------,---------------,-----------------------,---------------,-------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--,,,,,,,,--------,,,,,,,,--------,----,--,,,,,,,,--------,,,,,,,,--------,----,--,,,,,,,,--------,,,,,,,,--------,----,--,,,,,,,,--------,,,,,,,,--------,----,--,,,,,,,,--------,,,,,,,,--------,----,--,,,,,,,,--------,,,,,,,,--------,----,--,,,,,,,,--------,,,,,,,,--------,----,--,-----------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,,---,,---,,---,,,--,----,,---,,---,,---,,,--,,---,,---,,,--,----,,---,,---,,---,,,--,,---,,---,,,--,----,,---,,---,,---,,,--,,---,,---,,,--,----,,---,,---,,---,,,--,,---,,---,,,--,----,,---,,---,,---,,,--,,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------,,---,----,---,,,---,---,,---,,,--,,,---,,---,----,---,,,---,---,,---,,,--,,,---,,---,----,---,,,---,----,,---,,,-,,,----,,--,,--,,,--,,,---,,---,,---,,,-,,,----,,--,,--,,,--,,,---,,---,,---,,,-,,,----,,--,,--,,,--,,,---,,---,,---,,,-,,,----,,--,,--,,,--,,,---,,---,,---,,,-,,,----,,--,,--,,,--,,,---,,---,,---,,,-,,,----------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----,----------------------------------------------------------------------------------------------------------,------------------------,--------------,------------------------,--------------,--------------------------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,--------------------,------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------------------------------------------------------------------------,,,--,--------,,--,,,-,-------,,,--,,,--,,,--,--------,,--,,,-,-------,,,--,,,--,,,--,--------,,--,,,-,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,----,,,,,-,,,--,,----------------------------------------.------------------------------.----------,,----,----,----,----,---,,,--,------,--,,----,----,----,----,---,,,--,------,--,,----,----,----,----,---,,,-,---------,,,---,-----,,-,,----,,-,,,---,---------,,,---,-----,,-,,----,,-,,,---,---------,,,---,-----,,-,,----,,-,,,---,---------,,,---,-----,,-,,----,,-,,,---,---------,,,---,-----,,-,,----,,-,,,---,----------,,,,--,---,,,-,,,--,,,-,,,---,--,----,--,,,,--,---,,,-,,,--,,,-,,,---,--,----,--,,,,--,---,,,-,,,--,,,-,,,---,--,----,--,,,,--,---,,,-,,,--,,,-,,,---,--,----,--,,,,--,---,,,-,,,--,,,-,,,---,--,----,--,,,,--,---,,,-,,,--,,,-,,,---,--,----,--,,,,--,---,,,-,,,--,,,-,,,---,--,----,--,,,,--,---,,,-------------------,----,----------------------------------------------------------------------------------,,---,,---,,,--,,,---,---,,,--,,----,,--,,---,,---,,,--,,,---,---,,,--,,----,,--,,---,,---,,,--,,,---,,---------,,---,---------,---,,-------------------,,---,---------,---,,-------------------,,---,---------,---,,-------------------,,---,---------,---,,-------------------,,---,---------,---,,-------------------,,---,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,----------,-------------,---,,----,----,----------,-------------,---,,----,----,----------,-------------,---,,----,----,----------,-------------,---,,----,----,----------,-------------,---,,----,----,------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,---------------------------,,,------------------------------------------------------------,------------------------------,----------------------------------------------------------------------------------------------------------------.----,,---,----------,----,--------,,---,---,,----,----------,----,--------,,---,---,,----,----------,----,--------,,---,---,,----,----------,----,--------,,---,---,,----,----------,----,--------,,---,---,,----,-----,,----,,-,,,---,---,,---,---,,,-,----,--,,----,,-,,,---,---,,---,---,,,-,----,--,,----,,-,,,---,---,,---,---,,,-,----,--,,----,,-,,,---,---,,---,---,,,-,----,--,,----,,-,,,---,---,,---,---,,,-,----,--,,----,,-,,,---,---,,---,---,,,-,----,--,,----,,-,,,---,---,,---,---,,,-,----,--,,----,,-,,,---,----------------------------------------------------------------,----,,------------------,,----,--------,---------,----------,---------,--------,---------,----------,---------,--------,---------,----------,---,,--,,---,,---,---------,,--------,,---,----,----,,---,---------,,--------,,---,----,----,,---,---------,,--------,,---,----,----,,---,---------,,--------,,---,----,----,,---,---------,,--------,,---,----,----,,---,----------,---------------,-----,----,------------,---------------,-----,----,------------,---------------,-----,----,------------,---------------,-----,----,------------,---------------,-----,----,------------,---------------,-----,----,------------,---------------,-----,----,------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,,,-,,---------,,,-,,,---,,---,,--,,,--,,,,-,,---------,,,-,,,---,,---,,--,,,--,,,,-,,---------,,,-,,,---,,---,,--,,,--,,,,-,,---------,,,-,,,---,,---,,--,,,--,,,,-,,---------,,,-,,,---,,---,,--,,,--,,,,-,,--------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,-,,,--,,--,,---,-,,--,,----,,---,,,,,,,,-,,,--,,--,,---,-,,--,,----,,---,,,,,,,,-,,,--,,--,,---,-,,--,,----,,---,,,,,,,,-,,,--,,--,,---,-,,--,,----,,---,,,,,,,,-,,,--,,--,,---,-,,--,,----,,---,,,,,,,,-,,,--,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,------------------------,---,,----,----,-----------------------------------------------,--------,,---,,---------,,---,,---,,---,--------,----------,----,,---,,--------------,----------,----------------------------,----------,----------------------------,----------,-------------------------.----..---------------------------------.----..---------------------------------.----..---------------------------------.----..---------------------------------.----..---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---------------------------------.--------------------------------------------------------------,-----,---,,---------,---,----,,--,,----,-----,---,,---------,---,----,,--,,----,-----,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-,,,---------------------------------.--------------------------------------------------------------,---------,---------,-------------------,---------,---------,-------------------,---------,---------,----,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,-----,--,,---,,,---,,---,,---,,---,,---,-----,--,,---,,,---,,---,,---,,---,,---,-----,--,,---,,,---,,---,,---,,---,,---,-----,--,,---,,,---,,---,,---,,---,,---,-----,--,,---,,,---,,---,,---,,---,,---,-----,--,,---,,,---,,---,,---,,---,,---,-----,--,,---,,,---,,---,,---,,---,,---,-----,-------,--------------------,,-------------,,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,----,---,,---,,---,,,---,,--,,,--,,,---,----,---,,---,,---,,,---,,--,,,--,,,---,----,---,,---,,---,,,---,,--,,,--,,,---,----,---,,---,,---,,,---,,--,,,--,,,---,----,---,,---,,---,,,---,,--,,,--,,,---,----,---,,---,,---,,,---,,--,,,--,,,---,----,---,,---,,---,,,---,,--,,,--,,,---,----,-----------------------------,----,--------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----,---,,----,-----------------------,-----,---,,----,-----------------------,-----,---,,----,-----------------------,-----,---,,----,-----------------------,-----,---,,----,-----------------------,-----,---,,----,-----------------------,-----,---,,----,---------------------------------,------------------------------------,------------------------,--------------,--------------,---------,----,,----,------,-----------,---------,----,,----,------,-----------,---------,----,,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-------------------------------------------------,,----,---,,---,,---,,----,----,----,----,----,----,----,----,---,,----,----,----,-----,---,,---------,---,----,,--,,----,-----,---,,---------,---,----,,--,,----,-----,---,,---------,----------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------,,,,--,,-,,,,,-,+,--,+----,---,,,-,,,,--,,,---,---,,---,,,--,,---,,,--,,,-,,,,-------------,------------.----.---------------------,------------.----.---------------------,--------------,---,---,,----,,---,,---,,,--,,----,---,,---,---,,----,,---,,---,,,--,,----,---,,---,---,,----,,---,,---,,,--,,----,---,,---,---,,----,,---,,---,,,--,,----,---,,---,---,,----,,---,,---,,,--,,----,---,,---,---,,----------,--------,-----,----,-------------------,--------,-----,----,-------------------,--------,-----,----,-------------------,--------,-----,----,-------------------,--------,-----,----,-------------------,--------,-----,----,-------------------,--------,-----,----,-------------------,----------------------------------------------------------------,,----,---,,-------------,----,---------,,----,--,,,--,----------,,---,,--,,,--,,,-,,,,--,,,--,----------,,---,,--,,,--,,,-,,,,--,,,--,----------,,---,----------,----,-------------,----------,------,--,----,-------------,----------,------,--,----,-------------,----------,------,--,----,-------------,----------,------,--,----,-------------,----------,------,--,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,----------,,---,--------,----,,---,,---,----------,,---,--------,----,,---,,---,----------,,---,------------------,,---,-----,--,,,,,,,,------------------,,---,-----,--,,,,,,,,------------------,,---,-----,--,,,,,,,,------------------,,---,-----,--,,,,,,,,------------------,,---,-----,--,,,,,,,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------------------------------------------------,----,--------------,-------------,,----,----,----,--------------,,---,-------------------,--------------,,---,-------------------,--------------,,---,---,,---,----,,---,,---,-----,------------------,----,,---,,---,-----,------------------,----,,---,,---,-----,------------------,----,,---,,---,-----,------------------,----,,---,,---,-----,------------------,----,,---------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,----------------,-------------------------------------------------------,,---,,----,,---,----,----,----,---,,---,,---,,---------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,---,,,---,,---,---,,,--------,,--,,,---,----,----,,---,---,,,--------,,--,,,---,----,----,,---,---,,,--------,,--,,,---,----,----,,---,---,,,--------,,--,,,---,----,----,,---,---,,,--------,,--,,,---,----,----,,---,---------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------------------------------------------------------------------------------------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,---,,,---,,,---,---,,,--,,---,,--,,,---,,---,,-,-,,,---,---,,,--,,---,,--,,,---,,---,,-,-,,,---,---,,,--,,---,,--,,,---,,---,,-,-,,,---,---,,,--,,---,,--,,,---,,---,,-,-,,,---,---,,,--,,---,,--,,,---,,---,,-,-,,,---,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----,,---,,,--,,,--,,,--,,---,,,--------,,--,,,,-,,,--,,,--,,,--,,---,,,--------,,--,,,,-,,,--,,,--,,,--,,---,,,--------,,--,,,,-,,,--,,,--,,,--,,---,,,--------,,--,,,,-,,,--,,,--,,,--,,---,,,--------,,--,,,,-,,,--,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------------------------------------------------,,-----------------------,-------------------------------------------------------------------------------------------------------------------,---,,---,,---,,--,,,--,,,--,,,-,,,,,,,,,---,,,--,,---,,--,,,--,,,--,,,-,,,,,,,,,---,,,--,,---,,--,,,--,,,--,,,-,,,,,,,,,---,,,--,,---,,--,,,--,,,--,,,-,,,,,,,,,---,,,--,,---,,--,,,--,,,--,,,-,,,,,,,,,---,,,--,,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-----,-------------------------------------------------,,---,,----------------------------,----,,---,,------------------------,--,,,---,,---,,------------------------,--,,,---,,---,,------------------------,---,---,,--,,,--,,,---,--,,,,,---------,---,,--,,--,,,--,,,---,--,,,,,---------,---,,--,,--,,,--,,,---,--,,,,,---------,---,,--,,--,,,--,,,---,--,,,,,---------,---,,--,,--,,,--,,,---,--,,,,,---------,---,,--,,--,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,-------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,,---,,----------------------------,----,,---,,----------------------------,----,,---,,----------------------------,----,,---,,----------------------------,----,,---,,----------------------------,----,,---,,----------------------------,----,,---,,----------------------------,----,,---,,--------------------------------------------------------------------------,---,,----,-------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,--,,---,------------------------,,,,,,,,--,,---,------------------------,,,,,,,,--,,---,------------------------,,,,,,,,--,,---,------------------------,,,,,,,,--,,---,------------------------,,,,,,,,--,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,--------------------------------------------------------------------------------,---,,----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,--------,,,,,,,,--------,,----,,--,,---,--------,,,,,,,,--------,,----,,--,,---,--------,,,,,,,,--------,,----,,--,,---,--------,,,,,,,,--------,,----,,--,,---,--------,,,,,,,,--------,,----,,--,,---,--------,,,,,,,,--------,,----,,--,,---,--------,,,,,,,,--------,,----,,--,,---,--------,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,--,,---,--------------------------,----,--,,---,--------------------------,----,--,,---,--------------------------,----,--,,---,--------------------------,----,--,,---,--------------------------,----,--,,---,--------------------------,----,--,,---,--------------------------,----,--,,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,--,,---------------------------------,,,--,,---------------------------------,,,--,,---------------------------------,,,--,,---------------------------------,,,--,,------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,-,,,---,----------------,---,,--,,,,,,,,-,,,---,----------------,---,,--,,,,,,,,-,,,---,----------------,---,,--,,,,,,,,-,,,---,----------------,---,,--,,,,,,,,-,,,---,----------------,---,,--,,,,,,,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,----------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,,---,,---,,--,,,,,,,,--------,,--,,,---,,---,,---,,--,,,,,,,,--------,,--,,,---,,---,,---,,--,,,,,,,,--------,,--,,,---,,---,,---,,--,,,,,,,,--------,,--,,,---,,---,,---,,--,,,,,,,,--------,,--,,,---,,---,,---,,--,,,,,,,,--------,,--,,,---,,---,,---,,--,,,,,,,,--------,,--,,,---,,---,,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,-,,,---,,---,,,-,,,,,-,,,,-,,,,,,,,,,,,,-,,,---,,---,,,-,,,,,-,,,,-,,,,,,,,,,,,,-,,,---,,---,,,-,,,,,-,,,,-,,,,,,,,,,,,,-,,,---,,---,,,-,,,,,-,,,,-,,,,,,,,,,,,,-,,,---,,---,,,-,,,,,-,,,,-,,,,,,,,,,,,,--,,---,,---,,--,,,,,,,,,,,,,,,,,,--,,,---,,---,,---,,--,,,,,,,,,,,,,,,,,,--,,,---,,---,,---,,--,,,,,,,,,,,,,,,,,,--,,,---,,---,,---,,--,,,,,,,,,,,,,,,,,,--,,,---,,---,,---,,--,,,,,,,,,,,,,,,,,,--,,,---,,---,,---,,--,,,,,,,,,,,,,,,,,,--,,,---,,---,,---,,--,,,,,,,,,,,,,,,,,,--,,,---,,---,,---,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,--,,,--,,----,---,,,--,,,---,,--,,,,,,,,--,,,--,,----,---,,,--,,,---,,--,,,,,,,,--,,,--,,----,---,,,--,,,---,,--,,,,,,,,--,,,--,,----,---,,,--,,,---,,--,,,,,,,,--,,,--,,----,---,,,--,,,---,,--,,,,,,,,--,,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,---------------,,,,,,,,,----,----,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,------------------,,----,---,,--,------,------------------,,----,---,,--,------,------------------,,----,---,,--,------,------------------,,----,---,,--,------,------------------,,----,---,,--,------,--------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------------------------------------------------.---------------------------------------.--------------------------------------------------------------------------------------------------------------------,------,-,,,---,----,,--,---,,,-,--,,--,,------,-,,,---,----,,--,---,,,-,--,,--,,------,-,,,---,----,,--,---,,,-,--,,--,,------,-,,,---,----,,--,---,,,-,--,,--,,------,-,,,---,----,,--,---,,,-,--,,--,,------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--,----,,----,,--------,---------,----,---,----,,-----------------------------------------------------------------------------------------------------------------,,----,,-,,,---,,--,,,,-,,---,,---,,---,,,----,,-,,,---,,--,,,,-,,---,,---,,---,,,----,,-,,,---,,--,,,,-,,---,,---,,---,,,----,,-,,,---,,--,,,,-,,---,,---,,---,,,----,,-,,,---,,--,,,,-,,---,,---,,---,,,----,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--------------------------------------------,,--,,,--,,,---,,----,---,,---,,----,---,,--,,,--,,,--------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,--------,------,--------,---,,-------------,---,,------,--------,---,,-------------,---,,------,--------,---,,-------------,---,,------,--------,---,,-------------,---,,------,--------,---,,-------------,---,,------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,,----,---,-----,---,,-.-------,---,,---,,----,--------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,----,,---,------------------------,---,,,---,,---,,---,-------------------,---,,,---,,---,,---,-------------------,---,,,---,,---,,---,-------------------,---,,,---,,---,,---,-------------------,---,,,---,,---,,---,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------------------------------------------,---,,----,-------------,----------,--------,,----,----------------------------------------------------------------------------------------------------------------,,----,,-,,,---,,,---,,,-,,,---,,---,,--,,----,,-,,,---,,,---,,,-,,,---,,---,,--,,----,,-,,,---,,,---,,,-,,,---,,---,,--,,----,,-,,,---,,,---,,,-,,,---,,---,,--,,----,,-,,,---,,,---,,,-,,,---,,---,,--,,----,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,----,--------,,,--,,,------------------,----,--------,,,--,,,----------------------------------------------------------------------------------------------------------------,,,,,,,,-,,,---,,---------,,,,--,--,,--,,,,,,,,,-,,,---,,---------,,,,--,--,,--,,,,,,,,,-,,,---,,---------,,,,--,--,,--,,,,,,,,,-,,,---,,---------,,,,--,--,,--,,,,,,,,,-,,,---,,---------,,,,--,--,,--,,,,,,,,,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,---------------------------------,----,---------,--------,,-----,--------,----,------------------------------------------------------------------------------------------------------------------------------------------,----,----,,---,------------------------,----,----,,---,------------------------,----,----,,---,------------------------,----,----,,---,------------------------,----,----,,---,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-..------,,----,,--,,,-------------------,,----,,--------------------------------------------------------------------------------------,---,,----------------------------------,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,--------,,----------------------------------------.----------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---------------------------,,-----,----,---------------------------,,-----,----,---------------------------,,-----,----,---------------------------,,-----,----,---------------------------,,-----,----,---------------------------,,-----,----,---------------------------,,-----,----,-------------------------,,,---,------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,-------------------------------,,----,----,----,-----,------------------,----,----,----,-----,------------------,----,----,----,-----,------------------,----,----,----,-----,------------------,----,----,----,-----,------------------,----,----,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------------------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,------------------------,,,--,,,--,,---,------------------------,,,--,,,--,,---,------------------------,,,--,,,--,,---,------------------------,,,--,,,--,,---,------------------------,,,--,,,--,,---,------------------------,,,--,,,--,,---,------------------------,,,--,,,--,,---,-----------,,---------------------,,,,------------,----,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------.------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,----------------,,-----------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-..-----------,-------------------------------.--------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,---,,---,,---,,---,,,--,,--------,---,,----,,---,,---,,---,,,--,,--------,---,,----,,---,,---,,---,,,--,,--------,---,,----,,---,,---,,---,,,--,,--------,---,,----,,---,,---,,---,,,--,,--------,---,,----,,---,,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------,---,,-----------------------,--,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---,-----,----------------------------,,---,-----,----------------------------,,---,-----,----------------------------,,---,-----,----------------------------,,---,-----,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------------------------------,------,--------,--------------,----------------------------------------------------------------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------------------------------------------------------------------------------------,---,,----------------------------------,---,,----------------------------------,---,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------,----,--------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------------------------,,---,,---,,----,----,----------------,-,,,,-,,,,,,,,,,,,,,,,,,--,,,,-,,,,,,,,,-,,,,-,,,,,,,,,,,,,,,,,,--,,,,-,,,,,,,,,-,,,,-,,,,,,,,,,,,,,,,,,,-,,-----------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,----------------------------------,,---,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.-----------,,--------------------------.-----------,,--------------------------.-----------,,--------------------------.-----------,,--------------------------.-----------,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----------------.-------,-------------,-----------------.-------,-------------,-----------------.-------,-------------,-----------------.-------,-------------,-----------------.-------,-------------,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------------------------------------------------------------------------------------------------------,,,--,,,--------------------------------,,,--,,,------------------------,,,,,--,-----,,--------,---,,,--,-----,,-------------,,--------,---,,,--,-----,,-------------,,--------,---,,,--,-----,,-------------,,--------,---,,,--,-----,,-------------,,--------,---,,,--,-----,,-------------,,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-------------------------,,---,,---,,-------------,,-----------,----,---,,,---,--,----,-------------------,,---,---,,----,,---,----,,-------------,,---,---,,----,,---,----,,-------------,,---,---,,----,,---,----------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,--------------------------------------,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,--,,,--,,---,,,--,,,,,,,,--,,,---,---,,,--,,,--,,---,,,--,,,,,,,,--,,,---,---,,,--,,,--,,---,,,--,,,,,,,,--,,,---,---,,,--,,,--,,---,,,--,,,,,,,,--,,,---,---,,,--,,,--,,---,,,--,,,,,,,,--,,,---,---,,,--,,,--,,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.------------------------,,,---,,---,,,-,,,,,,,,---,,-------------------,----,----------------------------------------------------------------------------------------------------------------------------------,-.-,,---,,----,----,,-.,-------.-,,----,---,,---,,----,----,,-.,-------.-,,----,---,,---,,----,----,,-.,-------.-,,----,---,,---,,----,----,,-.,-------.-,,----,---,,---,,----,----,,-.,-------.-,,----,---,,---,,----,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--------,,,,,,,,----------------,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,---------,,--,,--------,----------,----,---------,,--,,--------,----------,----,---------,,--,,--------,----------,----,---------,,--,,--------,----------,----,---------,,--,,--------,---------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,--------,---------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----,----,------------------------,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,-,,,---,--,,,,---,,--,,-,--,,,,,,,,,,,,,-,,,---,--,,,,---,,--,,-,--,,,,,,,,,,,,,-,,,---,--,,,,---,,--,,-,--,,,,,,,,,,,,,-,,,---,--,,,,---,,--,,-,--,,,,,,,,,,,,,-,,,---,--,,,,---,,--,,-,--,,,,,,,,,,,,,-------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,------------------,,-------------------------,----,----,---,,----,---------,,--,,---,----,,---,,----,,---,---,,----,,--,,---------------------------,----------,----------------------------,----------,----------------------------------,,,,,,,,---------,,,,,,---------,,-,,,,,,,,,,,,,---------,,,,,,---------,,-,,,,,,,,,,,,,---------,,,,,,---------,,-,,,,,,,,,,,,,---------,,,,,,---------,,-,,,,,,,,,,,,,---------,,,,,,---------,,-,,,,,,,,,,,,,---------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,-----------------------,---------------,--------------------------------------------,,----,---,,---,,----,------------------------,----,----,----,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,-----,----,---------,-----------------------------,----,----,---,,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,--,,---,----,----------,,---,---,,----,,--,,-------------------,----,,---,,,--,,,---,------------------,----,,---,,,--,,,---,------------------,----,,-------,----,----,----,---------,,--,,---------,----,----,----,---------,,--,,---------,----,----,----,---------,,--,,---------,----,----,----,---------,,--,,---------,----,----,----,---------,,--,,---------,----,----,,--------------,----,-----,------------,,--------------,----,-----,------------,,--------------,----,-----,------------,,--------------,----,-----,------------,,--------------,----,-----,------------,,--------------,----,-----,------------,,--------------,----,-----,------------,,-----------------------------------------.-,------------------------------------------------------------------------------------------------,----,----,----,------------------------,----,----,----,----------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.---------------------------------------.-------------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------,--------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---,,---,------,--,,---,,---,,----,--------,,---,------,--,,---,,---,,----,--------,,---,------,--,,---,,---,,----,--------,,---,------,--,,---,,---,,----,--------,,---,------,--,,---,,---,,----,--------,,---,---,,----,,---,,----,----,-------------,---,,----,,---,,----,----,-------------,---,,----,,---,,----,----,-------------,---,,----,,---,,----,----,-------------,---,,----,,---,,----,----,-------------,---,,----,,---,,----,----,-------------,---,,----,,---,,----,----,-------------,---,,----,,---,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------,--,----,,----,------------------,------,--,----,,----,------------------,------,--,----,,----,------------------,------,--,----,,----,------------------,------,--,----,,----,------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,----------------------------------,----,-------------------------------------------------------------------------------------,,----,,--,,----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,--------,,-,,,,,,-,,,,-,-,,--,,-,,,,,-,,--------,,,,,,,,----------------,,,,,,,,--------,,,,,,,,----------------,,,,,,,,--------,,,,,,,,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,---------------------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}}}}}~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~}~~~~}~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~}}}~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~}}||}~~~~~~~}}}}|||}}~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~}~~~~~~~~~}~}}}}}}}}}}}}}}}}}~~~~}}~~~}}}}}}}}~~~~~}}}}}~~~}|||}~~~~}}}}}|||||||}}~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~}}~~}}}}}}}}}}~~~~|||}}}}}|||||}~}}}||||||||||||}}~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}|||||||||}}~~~}}}}}}}}}}||}}}}||||||||}}|||||}}}|||||||||||{||||~~~~~~~~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}}}}~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~}||}||||}}}}}}}||||||||||||||}}~~~}|}}}}}}}}|||||||||||||||}||||||||||||||||||{{{|||~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}|}}~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}|}}~~~~~}}}}}~~~}}~~~}}}}}}}|}}}}}}}}}}}}}}}}~}}}|||||||}}}}}}}}}}}}}|||||||||||}}}~~}}|}}}}||||||||||||||||||||{|||||||||||||||{{{||~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~}}~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}~~}~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}|||||||||}}}}||||||||||||||||||||||}}}}||}}||||||||||||||||||||||||||||||||}}||||||||~~~~~~~~~~~~~}~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}|||||||||||||||||||||||||||||||||||||||}||||||||||||||||||||||||||||||||||||}}}||||||||~~~~~~~~~~~~~~}~~~~}}}}}~~~~}}}}}|}}}~~~~}}~~~~~~~~~~}}}}~}}|}}~~~~~~}}}~~}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}||||}}}}}|||||}}}}}|||||||||}|}}}|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{{{{~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||}}}}}}}}}}|||}}}}~}}}}}}}}~~~~~}}}}}|||}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}|||||}}|||||||||||||||{||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{|||{{{||{{{{||||||||||||||||||||||{{zzz{~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}}}|||||}}}}}}}}}||||}}}}|}}}}}}}~~}}}}}}}||||}}}~~~~~}}}||}}}}}}}}||||||||||}}}}||||||||||||||||}}}}}}}}||||||||||||||||||||||||{{||||||||||||||{|||||||||||||||||||||||||||||||||||||||||||||||||{||||{{{{{{{{{{{{{{|||||||||||||||||||{{{zzzzz~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~}}}~~~}}}|||||}}}}}}}}}||||||||||||||||||||||||||||||||}}}}}||||||}}~~~}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{{|||{{{{{{{{{{{{{{{||||||||||||||||||{{{zz{{{~~~~~~~~~~}~~~~}}}~}~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~}}}~~~~~~}}}}}~~~~}|}~~~}}}|||||}}}}}}}}}|||||||||||||||||||||||||||||||||||||||||||}}~~~}|||||||||||||||||||||||||||||||||||||||{|||}|||||||||||}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{{{||||{||||{{{{{{{{{{{{{{{|||||||||{||||||||{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~}}}|||}}||||||}}}~}}}||||||}}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{{|||||||||||||||||||||||||||||||||||||}}}|||{||||||||||||||||||||||||||||||||{{{||||||||||||{{|||||||||||||zzzz{|{|||||||||||{{{{{{{{{{{{zzz{{{||||||||{{{{{{{{{{~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}}}}~~~~~}}}}}}}}}}}}}}}~~}}|||||||||||||}}}}}|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{{|||||{{||||||||||||||||||||||||{z{{||{{{||||||{{{|||||||||||{zzzz{{{{{|||||{{{{{{{{{{{{{{{{zzz{{{{{||||{{{{{{{{{{{{~~~~~~~~~~~~~~~~~~~~}}}~}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~}}}}}}}~}}}}}}}}}}|||||||||||||||||||||||||||||||||||||{{||||||{{{{{||||||||||||||||||||||||||||||||||||||||||||{{{{{|||||||||||||||||||||||||||||||||||||||||{|{{{{{||||{{{|||||||||||||||||||{{{{zzz{{{{{{{||||{{{{{|{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{zzzzzzzzzzyzzz{{{{{{{{{{{zzzzzz{{{~~~~~~~~~~~~~~~~~~~~~~~~~}|}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|||}}}}}}}}||||||||||||||||||||||||||||||||||||||||zzz{{{{|{{{{{|||||||||||||||||||||||||||||||||||||||||||{{zzz{||||||||||||||||||||||||||||||||||||||{{{{{{{{{{{{|{zz{{|{||||||||{{{{{{{{zz{zyyzz{{{{{{{{{{{zzz{{zzzzzzzzzzzzzzyyzzzzzzzzzz{{zzzzzzzzzzzzyyzzzz{{zzzzzzzzzzzzzzzz~~}}}~~~~~~~~~~~}~~~~~~~~~~~~~~}}~~}|||}}}~~~~~~~~~}}}}}}}}}}|||||||||}}}}}}}}}}}}}|||||}||||||||||||{{{|||||||}|||{{{{{||||||||||||||||yyyzzzzzzzzz{{||||||||||||||||||||||||||||||||||||||||||{{zyzz{|{||||||||||||||||||||||||||{{{{|||||{{{zzzzzz{{{{zyyz{{{{{{{{{{{zzzzzzzzyzzzyyyzzzzzzzz{{zzzzzzzzzzzzzzzyyzzzzyxyyzzzzzzzzzzzzzzzzzzzzzzyyyzzzzzzzzzzzyyzzzzzzzz}}}}}}~~~~}}}}}}}}}~~~~~}}}}}}}}}}}}||||}}}~~~~~}}}}}|||||||||||||||||||}}}}}}}}||||||||||||||||||{{{{{{||||||||{{{{{{{{||||||||{||||{{{yyyzzzzzzzzzz{{{|{{{{{{{{{{{{|||||||||||||{{{{{{{{|||{{{{zzzzz{{{{{||||||||||||||||||||{{{{{{{{{||{{{zzzyzzzzzzz{zyyyzzzzzzzzzzzzzyyyyyyyyzyyxyyzyyyyzzzzzzyyyyyyyyyyyyyyyzzzyyxyyyyyyyyyyzzzyyyzzzzzzzzyyyzzzzzyyyyyyyyyyyyyyyy}}}}}}~~~~}}}}}}}}}}}}}}}}}}||||||}}|||}|}}}}}}}}}}|||||||||||||||||||||||||||||||||||||{{{{{{||{{{{zzzz{{{{{|||{{zzzzz{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzz{{{{{zzzzzzz{{{|||||||{{{{{{{{{{{z{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{zzzzzzzz{{zzzzzyyyyyzzzzzz{zyyyzzzyyyyzzzzzzzzyyyyyyyyxxyyyyyyyyyyyyyyyyyxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzyyyyyyyyyyyyyyyy}}}}}}~~~~~}}}}}}}}}}}}}||||||||||}||||}||||||||}}||||||||||||||||||||||||||||||||||{{{{zzzz{{{|{{{zzzzzzzzzz{{{{{zzzzz{zzzzzzz{{{{{{{{z{{{{{{{{zzzzzzzz{zzzzzzzyzzz{{||||||{{{{{{{{{zzzzzz{zzzyzz{{zzzyzzz{{{{{{{zzzzzzzzzzzzyyyyyyyzz{yyyyyyyyyyyzzzzzzzyxyzzyyyyyyyyyzzzzzzzzyyyyxxyyyyxxyyyyyyyyyxxxyyyyyyyyzyyyyyyyxyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzyyyyyyyyyyyyyyyy}}}||}~~~~}}}}}}}}}}}}}||||||||||||}}}}}}}}}||||}||||||||||||{{{{||||||||||||{{{z{{{{{{zzzyyz{{|{{{{zzzzzzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxyyzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxyyyyyxxyyyyyyxxxxxxxx||||||}}}}}}}}||||||||||||||||||||||}}}}}}|||||||||||{{{||||{{{{{{{||{{{{{{{{{zzz{{{{{{zzzzzzz{{{{{{zzzzzzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{zzzzzyzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxyyzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxyxxxxxxyxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyxxxxxyyyxxxxxxxx||||||||}}}|||||||||{{{{{{{{{{{{||||||||||||||||||{{{{{{|{{{{{{{{{{{{{{{zzzzzzzyzz{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzyyyyyzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyzzzzzzzyyyyzzzzyyyyyyyyyyyyyyyyyyyyyyyxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxyyyyyyyyxxxxxxxxxyyyyyyyyyyyyyxxxxxxxxxxxxxxxxyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwxxxxxxxxxxxxxxxxxxxxxxx||||||||}|||||||{{{{{{{{{{{{{{{{||||||||||||||||{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyyxxxxxxxxxxyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwxxxxxwwxxxxxxxxxxxxxx|||||||||||||{{{{{{{{{{{{{{{{{{{{|||||||||{{{{{{{{{{{{{{{{{{{zzzzzzzzzzyzzzzzzzzzzzzzzzzzzzzzyyxzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyzzyyzzzzzzzzzzzzzzyyyyyyyyxxxxxxxxxyyyyxxxxxyyyyyyxxyyyyyyyyyyyyyxxxyyyyxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxyyyyxxxxxxxxxxxxyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwxwwwwwwwwwwxxxxxxww|||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzyyzzz{{{{{zzzyyzzzzzzzyyyyzzzzzzzzyyyyyyyyzzyyyyyyzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxyyyyxxxxxxxyyyyyyyyyxxxxyyyyyxxxxxxxxxyyxxxxxxxxyxxxxyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwyyyyxxxxxxxxxxxxxxxxxxxxxxxwwxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwww{||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{zzz{{{zzzzzzzzzzzzzyyyzzzz{{{{zzyyyyzzzzyyyyyyzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxyyyyxxxxxxxyyyyyyyyxxxxxxxxxxxxxxxxxxyyyxxxxxxxxxxxxxxxyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwyxxxxxxxxwwwwwwxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvv{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{z{{zzzzz{zzzzzzzzzzzzzzzzzzzzzyyyyyzzzzzzzzyyyyzzzzyxxyyzzzzzyyyyyyyyyyyyyyyyyxxxyyyyyyyyxyyyyyyyyyyyyyyyyyyyyyyxyyyyxxxxxxxxxxxxxxxxxxxxyyyxxxxxxxxxyyyyyyyxxxxxwwwxxxxxxxxxxyyyxxxxxxxxxxxxxxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwxxxxxwwwwwwwwwwwwwwwwvvvvvvvvvvvwwvvvvvvwwwwwwwwwwwwwwwwvvvvvvvv{{{{zzzzzz{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyzzzzxxxyyyyzzzyyyyyyyyyyyyyyxxxxxxxxyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwxyyyxxxxxxxxxxxxxwwwwwwwwxxxyyxxxxxxxxxxxxxxxxxxxxxwwwwwwxxxxxxwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwvvvvvvvvwwwwwvvvvvuuuuvvwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvv{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyxxxyyyyyzzyyyyyyyyyyyxxxxxxxxxxxyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwxxyxxxxxxxxxxxxxxwwwwwwwwxxxyyxxxxxxxxxxxxxxxxxxxxwwwwwwwxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvvvvuuuuuuuvvvvvvvuuuuuuuvvvvvvvvvvvuuuuuuuuzzzzyyyyyyzzzzzzyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyxyyyyyyyyxxxxxxxxxxxxyyyyzzyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwxxxxxxxxxxxxxxxxxwwwwwwwwxxxxxxxxxxxxxxxxxxxwwxxxwwwwwwwwwwwwwwwwvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvwwwwwwwwwvvvvvvvuuuuuuuuuuuuuuuuuuuuuuvvvvvuuuuuuuuuuuuuvvuuuuuuuuuuuuuuyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzyyzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxyyyyyyyyyyyxxxxxxxxxxxxxxxxxxwxxxxxxxxxxxwwxxxxxxxxwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwxxxxxxxxxxxxxxxwwwwwwwwwwxxxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwvwvvvvvvvwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvuuvvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvuuuuuuuuuuuuuvvvuuuuuuuuuuuuuyyxxxxxxxxyyyyyyxxxxxxyyyyyyyyyyxxxxxxxxyyyyyyyyxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxyyyxxxxxxxxxxwwwwxxxxxxxxwwwwwxxxxxxxwwwwxxwwwwwwwwwwwwwxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxwwwwwwvvwwwwwvvvwwwwwvvvvvvvvvvvwwwwvvvvvvvvvvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvuuuuvvvvvvvuuuuuuuuuuuuuvvvvuuuuuuuuuuuuxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyxxxxxxxxxxxxyyyyxxxxxxxxxxyyyyyyyyxxxxxyyyyyyxxxxxxxxwxxxxxxxxxxxxxwwwwwwwxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvwwwwwwwwwwwwwwwwvwwwwwwwwwwwvvvwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwvvvvvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvuuuuuuuvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuxxxxxxxxxxxxxxxxxxxxxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyxxxxwxxxxxxxxxxxwwwwwwwwwwxxwwwwwwwwxxxxxxxxwwwwwwwwwwwwvwwwvwwwwwwwwwwwvvvvwwwwwwwwwwwvvvvvvvvwwwwwwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvwvvvvvvvvvvvvvvvwvvvvvvvvuvvvvvvvwvvvvvvuuuvvvvvvvvvvvvvuvvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttxxxxxxxxwxxxxxxxxxxxxxyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwxxxxxwwwwwvvwwwwwwwwwwwwwwwwxxxxxxxxwwwwwwwvwwwvvvvvvvvwwwwwwwwvvvvvwwwwwwwwwwvvvvvvvvvvvvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuuvvvvvvvvuuuuuuuuuuuuuuvvvvuvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttuuuuuuuuuuutsstttttttttttsssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyxxxxxwwwxxxxxxwwwwxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvwwvvwwxxwwwwwwvvvvvvvvvvwvvvuuuuvvvvvvvuwwwwwwwwvvvvvvvvvvvvvvvvvvvvvwwwvvvvvvvvvvvvvvvvvvvvvvvvuuuvvvvvuuvvvvvvvvvvvvvvuuuuuvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuwwvvuuuuuuuuuuuuvvvuuuuuuuuuuuuuvuuuuuuuuuuuuuuutttttuuuuuuuttttstttttttttttttttttttttttttttttttttttttttxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwxxxwwwwwvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvwwwwwvvvvuuvvvvvvvvvuuuuvuvvvvvuuvvvvvvvvvvvuuuuuuuuvvvvvvvvvvvvvuuuuuuuuuuvvuuuuuuuvvuuuuuuuuuuuuuvvvvvvvvvuuuuuuuuuvvvvvvuuuuuuuuuuuuuuuuuuuuuvuuuuuuuuvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttssssttttttttttttssstttttttttttttttttttttttttttttttttttttwwwwwwwwwwwwwwwwxxxxxxxxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvwwwwwwwwvwwxxwwwvvvvvvvvwwwwwvvvwvvvvvvvvvvuuuuuvvvvvvuuuuuuuuuvvvuuuuvvuvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvuuvvuuuuuuuuuvvvvvuuuuuuuuuuuuvvvvvvuuuuuuuuuuuuuuvuuuuuvvuuuuuuuuuuuuuuuuuuuuuuttsttttttttuuuuuuuttttssssssssssssrrrsssssssssssssssssssttsssssssssssssssssssssssssssssssswwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwvvvvvvvvvvvvvvvwvvvvuuuvvvvvvvvvwwxxwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttuuuuuuuutttsssssstttttttttttsssssssssssssssrrrrrrssssssssssssssssssssssssssssssssssssssssssssssssssswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvwwwvvvvvvvvvvvvvvvwwwwwvwwwvvvvvvvvvvvuuvvvvvvuuvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuvvvuuuuuuuvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttuuuuuuuuuutttttttuuuuttsssssssstttssssttttsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvwwwwwvvvvvvvvvvvvvvvvvvvvwwwwwwvvvuuuvuuuuuuuvvuuuuuvvvvuuuuuuuuuuuuuuuuuuuuuuuuuvvvuuuuuuvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttssssstttttttttsssssttttttttsssssssstttsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvwwvvvvvvvvvvvvvvvvvuuuvvwwwvvvvvvuuuuuuuuuuuuuuuuuuuuuvvuuuuuuuuuuuuuuuuuuuuuuuuuvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttttttuuuutttuuuuuttttttttuttttttttttttttttssssssstttsssttssssssttsstssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvuuuuvvvvvvvvvvvvvvvvvvvvuuuuvwvvvvvvuuuuuuuuuuuuuuuuuustuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuututtsssssttttttttttttttttsstttttttttttttttttttttttttttttttsssssssttssssssssssssssssssssssssssssrrsssssssssssssssssssssssrssssssssrrrssssssssssssssssssssssssssssssssssssssssssssswwwwwwwwxwwwwwwwwwwvvvvwvvvvvuuuuuuuuvvvvvvuuuuuuuuuuuuuuuuuuuuuvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutuuuuuuvuuuuuuuuttuuuuuuuuuuuuuuuuuttttttttttttttttttttuttttttttuttttsssssssssssttttttttsstttsssrrsssstttttttttttttttsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssvvvvvvvvwwvvvvvvvvvuuuvvuuvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttuuuuuuuutttttttttuuuuuuttttttuuttttttttttttttttttttttttttttttttttssssssssssssttttttttsstttsssssstttttstttttttttttssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssuuuuuuuuvvuuuuuuuuuuuuuuuuuuuuuutuuuuuuuuuuuuuutuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttttttttttttttsttttttttttttssttttttttttsssttttttttttttttttttttttttssssssssssssssssssssssstttsssttttttttsssttttttsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuuuuuuuuuuuuttuuuuuuuuuuuuuuuuuuutttuutttttttttttttttttttttttstttttttttttttssstttttssstttsssstttttttttrsssttttsssssstttttttttttttsssssssssssssssssssssssttttssttttttttssssssstssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttsssttttrrssttttsssssstttttttttttttssssssssssssssssssssssstttttstttsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttuuttttttttttttttttttttttuutttttttsssssttssssttttsssssttttttttttttttsssssssssssssssssssssssstttttsssssssrssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssttttssssssssssssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttsssssssssttttttttttttttttttttttttsssssssssssssssssssssssstttttsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssttttttsssssssssssuuuuuuuuuuuuuuuuuuutttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttsstttttttttttttsssstttttttttsstttttssssssttttttttttttttttttttttttttsssssssssssssssssssssssstttttssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssstttttttssssssssssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttsssssssssttssssssstssssssssrrssttttssttttssssssssttttttssssssssssssssssssstttttttttssssssssssssssssssttttttssstttttsssssssssssssssssssttttttsssssssssssssssssssssssssssssssssssssssssrrrrsssssssssssssssssssstttttstttttssssssssttutttttttttttttsssssssssssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttssssssssstttssssssssssssssssrrssttssssttttssssssssssttttssssssssssssssssssstttttttttssssssssssssssssssttttttssstttttsssssssssssssssssssttttttsssssssssssssssssssssssssssssssssssssssssrrrsssssssssssssssssssssttttttttttttssssssssttttttttttttttttttssssssssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttttttttttttttttttttttttttttttttstttttttttttttttttttttttssssssssssssttttssssssssssssssstsssssssssttttttsssssssssttttssssssssssssssssssttttttttttttssssssssssssttssttttttssstttttssssssssssssssssssstttttttssssssssssssssssssssssssssssssssssssssssssssstssssssssssssssssssttttttttttttttssssssttttttttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttttttttttttttttttttttttttttttttttssttttttssssssssssssssssssssssssssssssttttttsssssssssstttttsssssttttttttttttsssstttttsssttttttttttssttttttttttttttttstttttttttttstttttttssstttttttttttttssssssssssttttttttttssttttttttttssssssssttttttttttttttttsssssstttttttttttttttsssssttttttttttttttssssssttttttttttttttuuuuttttttttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttttttttssstttsssssssssssssssssssssssssssssssssstuuuuuttsssssttutttsssssttttttttttttssssttttttttttttttttttttttttttttttttttttttttttttttttttttttttssttttttttttttttttttttttsstttttttttttttttttttttttttttttttttttttttttttttttssssttttttttttttttttsssssttttttttttttttttsstttttttttttttttttuuuttttttttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutttttttttttttttttttttttttttttttttttttttttttttsssssssssssssssssssssssssssssssssssssssssssuuuuuuuuttssstuuutttssssttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttssttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttsstttutttttttttttttsssssttttttttttttssttssstttttttttttttttttttssssssssuuuuuuuuuuuuutttuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssssssssssstttttsssssttuuuuuuuuttttuuuuttssttsttttttsttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttssttttttttttttttttttttttttttttttttttttttttttttsstttttttttttttttuttttttttttsstttuuttttttttttttsssssttttttttttssssssssssssttttttttttssssssssssssssuuuuuuuuuuuuttttuuuuuuuuttttttttttttttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssssssssssstttuuttttttsttuuuuuuuutttuuuuttttttsttttttsssttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttsstttttttttttttttttttttttttttttttttttttttttttssssssssssstttttttuttttttttttssttuuuttttttttttttsssssttttttttttssrrrrrrrrrsttttttttssssssssrrrrrrrruuuuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttttuuttttttttttttttssssssssssssssssssssssssssssssssssssssssttuutstttttttuuutttsttuutttttttttttsstttuuuuuttttttttttttttttttttttttttttttssttttttsttuuuuuuuuuuuuuttttuttttttttttttttttttttttttstttttttttttttttttssssssssrrrsstuuuuuttsttttssssssstttssttttssssssssrrrrrrssttttttssrrrrrrrrrsssrrrrrrrrssssssrrrrrrrrrruuuuuuuuuutttttttttttttttttttttttttttttttttttttttttttttttttttsssssstttttssssssssssssssssssssssssssssssssssssssssttuttsstttttttttttssttuutttttttttttsssttuuuutttttttttttttttttttttttttttsttttttttttssstuuuuuuuuuuuuttttttttttttttsssstttttttttttsssstttttssssssssssssssssssrrrsstttuuuttsssssssrrsssssssstttsssssrrrrrrrqrrsstttttsssrrrrrrrrrsssrrrrrrrrrrrrrrrrrrrrrrrruuuuuttttttttsssttttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssssssssssssssssssssssssssssssssstttssssssstttttsssssttutttttttttttsssssttttttttttttttttttttttttssssssssssttttttttsssstttttttttttttssssttttttsssssssssssssssssssssssssssssssssssssssrrrrrrrrrrssssttttssssrrrrrrrrsssssstsssssssrrrrrrqqrrssstsssssrrrrrrrrrrsssrrrrrrrrqqqrrrrrrrrrrrrruuuuttttttttttttttttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssssssssssssssssssssssssssssssssssttsrsssssssssssssssttttttttttttttsssssssttttttttttttttttttttttssssssssrsttuutttsssrssssssssssstsssssssssssssrrrrrrssssssssssssrrrsssssrrrrrrrrrrrrrrrrrrrrrrrrrsssttssrrrrrrrrrrrrrssssssssrrrrrrsrrrqrrssssssrrrrrrrrrrrrrrssrrrrrrrrqqqqrrrrrrrrrrrsuuuttttttttttttuttttttttttttttttttttttttttttttttttttttttsssssssssssssssssssssssssssssssssssssssssssssssssssssssssstssrrsrrsssssssssssssttttttttttttssssrssstttttttttttttttttttssrrssssssrsstutttsssrrrrrssssssssssrrrrrrsssssrrrrrrrrrrrssssrrrrrrrrssssrrrrrrrrrrrrrrrrrrrrrrrrrrssssssrrrrrrrrrrrrrrrrssrrrrrrrsssssrrrrrssssrqrrrrrrrrrqrrrrrrrrrrrrrqqqrrrrrrrrrrrrsttttttttttttuuuutttttttttttttttttttttttttttsssssssssssssttttttttsstttttttsssssssssssssssssssssssssssssssssssssssrsssrrrrrrrrrrrrrsssssssssssssssssssssssssssssssssssssssssssssssrrrrrrrrrssttttssssrrrrrssssssssssrrrrrrrrrrrrrrrrrrrrssrrrrrrrrqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrqqqrrsssrrrrrrrrrrrqqqqqrrrrrrrrrrrrssssrqrrrrrrrrqqrrrrqqqqqqqqqrqqqqqqqqqqqqqqqqqqqrrrrrttttttttsstttuuutttttttttttttttttttttttttttsssssssssssssssssstttssssstttttssssssssssssssssssssssssssssssssssssssrsssrrrrrrrrrrrrrrsssssssssssssssssstsssssssssssssssssssssrrrrrrrrrrrrrrssssssssrsssssrrssssssssssrrrrrrqrrrrrrrrrssssssrrrrrrrrqqqrrrrrssssssssrrrrrrrrrrrrrrqqrrrssrrrqqqrrrrrqqqpqqrrrrrrrrqqqqrssrqqqrrrrrqqqrrrrrqqqqpppqqqqqqqqqqqqqppppppqqqqrrrrtttttuuusssstttuttttttttttttttttttttttttttsssssssssssssssssssssssssssssstttsssssssssssssssssssssssssssssssssssssrsssrrrrrrrrrrrrrrssssssrrssssrrrsstttssssssssrrssssssssrrrrrrqqrrrrrrrrsssrrsssrrrsssssssssssssssrrrrrrqqqrrrrrssssssssrrrrrrrrqqqrrrrrssssssssrrrrrrrrrrrrrrqqrrrrrrrqqqqqqqqqqqpppqqrrrrqqqqqpqqrrqppqqrrrrqqrrrrrrqppppppppqqqqqqqqqppppooooppqqqrrrtttttsssssssstttsssssssssssssssssstttttussssssssssssssssssssssssssssssssssssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrsrrrssrrrrsssssrrrrrrrssrrrrrrrqrrrrrrrrrrrrrrrrrrrqqrrrsrrrrrrqrrrrrrrrrrrrrrrrpppqqrrrqqrrrrrrrrrrrrrrqqqqqrrrrrrrrrrrrrrrrrrrrrqqqqqqrrrrrqqqopppppppqppoopppqqqpppppppqqqqpppqqqqpqqqqqqqqqpppppppppppppppppoooooooooppqqpppttttssssssssstttssssssssssssssssssssstttssssssssssssssssssssssssssssssssssssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrrrqqrrsssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrrrqrrrrrrrrrrrrrrrrpppqqqqqqqrrrrrrrrrqqqqqppppqqqqrqqqqqqqrrrrrrrqqqppppppqqqqqqqpppppppppppooopppqppppppoppqqqppopqqqppppppqqqqpppppppppppppppoooooonnnnooooppoootttsssssssssssttssssssssssssssssrsssssssssssssssssssssssrrsssssssssssssssssrrrrrrrrrrrrsrrrrrrrrrrrrrrqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqqqrrrqqrrrsrrrsrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqqrrrqrrrrrrrrrrrrrrrrppppppppqqrrrrrrqqqqppppoooopppppppppppppqqqqqqqppooooppppqqpppppppppoooooooooppppppooooooppppooppqqpoooooppppppoooppoooooooooooonnnnnnnnnnnnnnnssssssssssssssssssssssssssssssssssssssssssssssssssssssssrrrsssssrrrrrrrrrrrrrrrrrrrrrsssrrrrrrrrrrrrrrrrrrrrrrrrqrrrrrssrrrrrrrrrrrrrrrrrqqqrrrqrrrrsrrrssrrqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqqqqrrqqqqqqqqqqqqqqqqqqppppppooqqqrrrqqqqqppppopooooopppppppoooooopppppooooooopppppppppoooooonnnnnnnoppooooonnnnnoooonnoppponnnnnnoooooooooooonnnnnnnnnnnnnnnnnnnnnnnnnsssssrrrrrrrrsssrrssssssssssssssssssssssssssssssrrrrrrrrrrrrssssrrrrrrrrrrrrrrrrrrrrrsssrrrrrrrrrrrrrrrrrrrrrrrqqqqrrrrrrrqqqqrrrrrrqqqqrqqrrsrqrrrrrrrrrrrqqppppqqqrrrrrqqqqqqqqqqqqqqqqqqqqqqqqpppqqqpppooooppqqqqqqqqoopoooooppqqqqqqqqqpppppppppoppppooooooonnnoooooonnnooopopppppooooonnnnnnnnnnooponnnnnnnnnnnnnnnnooonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmnnnnnnnnrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssssssssssssssrrrrrrrrrrrrssssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrsssrrrrrrqqqqqqrrrrqqqppqqqqqqqqqqqqqqqrrrqqqqqqqrrqqqppooopppqqqqqqppppppppppoopppppppppoooonopppoonnnnnnoooooooooooooooonooppppppppppppppppppoooooooooooonnnnnnnnnnnnnnoonooooonnnnnnnnnnmmmnnnoonnnnnnnnnnnnnnnnnnonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmnnnnnnnnqqqqrrrrrqqqqrrrqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssrrrrrrrrrrrrrrrrrrrrrqqqqqqqqqqqpqqqrrrsrrrrqqqqqqqqqqqqqppooppqqqqpppppppppqqqppppppppppppooooooopppppppooooooooonnnnoonooooonnnnnnnoonnnnnnnnnnnnnnnnnooooooonnnooooooooooooppppoooooonnnnnnnnmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmnnnnnnnnnnnmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmmnmmmmmnnnmmmmmmmnqqqqqqqrqqqqqqqrqqqqqrrrrrrqqqqqqqqqqqqqqqqqqqqqrrrrrrrrrrrrssssrrrrrrrrrrrrrrrrrrrrqqqqppppppppooppqrrrqrrqqqqqqqqqqqqpppooooppppppppppooooppponnnnnooooooonnnnooooooooooonnnnnnnnnnnnnnnnonnnnnnnnnnnnonnnnnnonnnnnnnnnnoooooonnnooonnnnnnooooooonnnnnnnnnnnnnmmnnnnnnnmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnmmmmmmmmnnmnnnnnnnnnnnnnmmnnnnnmmmmmmmmmmmmmmmmnnnmlllllmmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrrrqqqqqqqqqqqqqqqppooppppppppoopppppqpppppppoooppppppooonoooppoonnnnnnnnnnnnonnnmmnnnnnnnnnnnnnnnnnnnnnnmmmmnnnnnnmmmmmmmmmmmllllmmnnnnnnnnmmmmmmmmmmnnnnnnnnmmnnnnnnnnnnnnnnnnnnnnnnmmnnnnmmmmmmmmmnmmmmmmllllllmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmllmmmmmmmmmmmmmmmmlmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmpqqqqqqqqqqqqqqqqqqqqppppppppppppppppppppppppppqqqqqqppprrrrrrrrrrrqqqqpppppqqqqppppppooppppppppooooooopoooooooonnoooooonnnnnooooonnnnnnnnnnnnnnnmmmmmnnnnnnnnnnnnnnnnnnnnnmmmmnnnnnmmmmmmmmmmlllllllmmnmnnnnmmmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnnnnnnnnnmmmmmmnnmmmllmmmmmmmmmmmmlllllllmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmlllmmmmmmmmlmmmmmmlllmmmmmmmmmmmmmmmmmlllllmmmmmmmmpppqqqqqqqqqqqqqppppppppoooooooooooooooopoooopppppppppppqqqqqqqqpppppppppppppppppppppoooppppppppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnonnnnnnnnmmmmmmmmmmlllmmmnmmmmmmnnnnnnnnnnmmmmmnnnmmmmmmmmmmmmlllllllllmmmmmnmmmmllllllllllllllllmmmmmnnnmmmmmmmmmmmmmlllmmmmmmmmlllllmmmmmmmmmllllllllllllllllllllllllllllllllllmmmmllllllmmmmlllllmmllllllllmmmmmmmmmmmllllllllllmmmmllppppppppppppppppooopppppooooooooooooooooooooooopppppppppnnoooooooooopooooooooooooooooooooopppooonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmmmmmmmmllmmmmmmmmmmmmmmmmmmmmmmmmmmnmmmmmmmmllllllllllllllllmmmmmmmllllllllllllllllllllllmmmmmmmmmmmmlllllllmmmmmmmmllllllllmmmmmmlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllloooppppppooooooonooooopppppooooooooooooooooooooooooooooonnnnnnnnnnooooooooonnnnnnnnnnnooooooooonnnnnnnnnnnnnnnnnnnnnnnnnmmmmmnnnnnmmmmmmmmmmmmmmmmmmmmmmmmllllmmlllllllllllmmmmmmmmmmlllllllllllllllklllmmmmlllllllllllllllllllllllllllmmmmmmmmmmmmlllllllmmmmllllllllllmmmmmlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllnnoooooooonnnnnnnnnnooopppppooooooooonnnoonnnooooooooooooooooooonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmnnnnmmmmmmmnmmmmmmmmmmmmmmmmmmmmmmmmllllllllllllllllllllmmmmllllllllllllllllllllllllmmllllllllllllllllllllllllllllllmmmmmmmmmmmmlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkllllllllllllllllkkllllkknnnnoooonnnnnnnnnnnnnooooooooooonnnnnnnnnnnnnnnnooooooooooooooooooonnnnnnnnnnnmmmmmmmnnnnnnnnnnmmmmmmmmnnmmmmmmmmmmmmmmmmllllmmmmmmmmmmmllllllllllmmmlllllllllllllllllllllllllllllllllllllllllllllllllmmmmllllllllllllllllllllllllllllllmllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkknnnnnnnnnnnnnnnnnnnnnoooooonnnnnnnnnnnnnnnmmnnnnoooooooonnnnnnnnoooonnnnnnnnmmmmmmlllmnnnnnnmmmmlllllmmmmmmmllllllllllllllllllmmmmmmmmmmllllllllllllllkklllllllllllllllllllllllkllllllllllllllllllllllmmmmlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmnnnnnmmmmmmmmmmmmmlllllllmllllllllllllllllmmmmmlllkklllllllmlllllllllllllllllllllllmllllllllllllllllkllmmlllllllllllllllmmmmmmmlllkkllllllllkkkllllllllllllllllllllllllkkkllllllllllllllllllkllllllkkkkkkkkklllllllllllllllllllllllllllllllkllllllllllllllllkkkkkkllllllllllkkkkkkkkkkkkkkkknnnnnnnnnnnnnnnnnnnnnnnnmnnnnnnnnnnnnmmmmmmmmmmmnnnnnnnnnnmmmmmmnnmmmmmmlmmmmmmmmmmlllmmmmmmmmlllllllllllkkkkkkkkkkkllllllllllkklkkkklllllllllllllllllllllllllllllllllllllllkkkkkkllllllkkkkkkkkkllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklkkkkkklkkkkklllllllllllkkllllkkkkkkkkkkkkkkkkkkllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkklllkkkkkkkkkkkkkkkkkkkkkknnnnnnnnnnnnnnnnmmmmmmmmmmmmnnnnnnnnmmmmmmmmmmmmmmmmmmmmmmmllllllllllllklllllllllllllllmmmmmllllklllllllkkkjjjjjjjjjkkkklkkkkkkkkkjjkkklllllllllkkkllllllllllkkkkkllllllkkkkkkkkkkklllllkkkkjjjjkkkkllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllllllkkkkllllkkkkkkkkkkkkkkkkkkkllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknnmmmmmmmmmmmmmnmmmmllllllmmnnnnnnnnmmmmmmmmmmmmmmmmmmmllllkkkkklkkkkkkkkkkkllkkkkkkklllllllllkkkkklllllkkjjjjiiiiiijjjjkkkkkkkkjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjjjjkkllllkkkkjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjkkkkkkkkkkkkkkkkkkkkkllkkkkkkkkkkkkkkkkkkkkkklllllllllllllkkklkkkkkkkkkkkkjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmmmllllllllmmmmmmlllllllmmnnnnnnnnmmmmmmmmmmmmlmmmmlllkkkkjjjjkkkkkkkkjjkkkkkjjjjjjkkklllkkkjjjjkkkkkkkkjjjjiiiiiiiijjjjjjjjjjiiiiijjkjjjjjjjjjjjjkkkkkkkjjjjjjjjkkkkkjjjjjjjjjjjkkkkkkkkkjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkjkkkkkkkkkkkllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmllllllllllllllllllkkkkllmmmmmmmmmmmmmmmlllllllllllllkkjjjjjiiijjjjjjjkjjjjjjjjjjiiijjjkkkjjjiijjjjjjjjjjjjjiiiiiiiiijjjjjjjjjjiiiiijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkjjjkkkkkkkkkkkllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklllllkkkkkkkkkkkkkkklkkkkkkkkkkkkkkkkllllllllkkkkkkkkkkjjjjjjkkllllllkkkkkkkkkkkkkkkkkkkkjjjjjjiiiiiiiiiijjjjiijjjiiiiiiiiiiijjjjiihhiiiiijiiiiiiiiiiiiiiiijjjjjjjiiiiiiiijjkiiiiiiiiiiiiiiiiiiiijjjjjjjjiiiijjjjjjjjjjjiiiiiiiiiiiiijjjjjjjjjjjjjjjjkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkjjjkkkkkkkkkkkllkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllllkkkkkkkkkkkkkkkkkllkkkkkkkkkkkkkllllllllkkkkkkkkjiiiiijjkkkkkkkkjjjjjjjjjjjiiiijiijiiiiijjiiiiiihhiiiiiiiiiiiiiiiiihhhiiiiiiihhhhhiiiiiihhhhhhhhiiiiijjjjjjjjiiiiiiiijjkiiiiiiiiiiiiiiiihiiijjjjjjjiiihhjjjjjjjjjjjiiiiihhhhhhhhjjjjjjjjjjjjjjjjkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkjjjkkkkkkkkkkllllkkkkkkkkkkjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkjjjjjjjjkkkkkkklkkkkkkkkjjjjkkkkllllkkkkkkkkkkkkjjjjjjjjjjiiiiiihhhhhiiiiiijjjjjiiiiiiijiiiiiiihiiiihhhhhhhhhggghhhiiiihhhhhhhhhhhhghhiiihhggggghhhhhhhgghhhiiiihhhhiiiiiiiiiiiihhhhiijjiiiiiiijiiiiiiiiiiiiiiiiiihhhhiiiiihhhhiiiiiiiiiiiiiiijjijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkjjjjkkkkkkkkkkkkkkkkkkkkjjjjkkkkkkkkkkjjiijjjkkkkkkjjjjjjjjjjjjjijjjjjkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiiiiiiiiiiiiihhhhhhhhhhiiiiiiiihhhiiihiiiihhhhhhhhhhhhhhgggggghhhhhhhhhhhhhhhhhggghhiihhggggghhhhhgggghhhihhhhhhhhhiiiiihhhiiiiiihiiihhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijiijjjjjjjjjjjjjjkjjjjjjjjjjjjjjjiiiiijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkjjjjjjjjkkkkkjjjjjjjjjjjjjjjjjjjjjjkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiiiiiiiiihhhhhhhggggggggghhhiihhhhhhhhhhhhhhhhhgggggggggggggggggggghhhhggggggggggggggghhhhhggggghhhgggggghhhhhhhhhhhhhhhiihhhhhhjiiihhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiijjjiiiiiiiiiiiiiiiihhhiiiiiijjjjjjjjiijjjkjjjiijjijjjjjiiiihhhiiiiiiiiiiiiiiiiiiijjjjjjjjiijjjjjkkkkkjjjjjjjjjjjjkkjjjjjjjjjjjjjjjjjjjjjjjjkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjhhhhhhhhhhgggggggggggggggggghhggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhggggggggggggggghhhgggggghhhhhhhhhhhhhiihhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiihhhhiiiiiiiiiiiiiiiiihhhhhhhiiiiiijjjjjiiiiijjkjjiiiiiiiiiiiiihhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjjjjjjjjjjjjjjjjjjjjggggggggggggggggggggggggggggggggggggggggggggggggggggffffgggggggggggggggggggggggggggggggghhggggggggggggggggggggggggggghhhhhhgggghgggghhhhhhhhhhhhhhhhhhiihhhhhhhhhggggghhhhhhhhhhhhiihhhhhhgghhiiiiiiiiiiiiiiiiijjjiiiiiihiiiiiihiiihiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkjjjjjjjkkkjjjjjkkkkkkkkjjjkkkkkgggggggggggggggggggfffffffgggggggggggggfggggggffffffffffffffffffffggggfffffffgggggggggggggggggggggggggggggggggggggggggghggggggggggggghhhhhhhhhhhhhhhhhhhhhhhgggggggggggggggggggghhhhhhhgggggghhihhhiiiiiiihhhiiiiihhhhhhhhhhihhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijijjjjjiijjjjjjjijjjjjjjjjjjjjjjjjjjjjjjjiiiijjjkjjjkkkkkkkkkkkkkkkjjjjjjkkkkjjkkkkkkkkkkkkkkkkkkgggggggggggfffffgfffffffffggggfffgggggfffffffffffffffffffffffffffffffffffffffffffggggggggggggggggggggffffggggggggggggggggggggggggggggggghgggggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhhhiiihhhhhhhihhggghhhhhhhhhhhihhhhiiihhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjiiiiiiiiiijjjjjjjjjjjjjiiiiiiiijjjjiiiijjkkkkkkkkkkkkkkkkkkkkjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkgggggggggggffffffffffffffffgggfffgggggfffffffffffffffffefffffffffffffffffffffffffgggggggggggggggggggffffffggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghgggggggggggggggggggggghhhhhhhhhhhhhhhhhhgggggghhhhhhhhhhhhhhhhhhghhhhiiiihhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjiijjjjjjiiiiiiiiiijjjiiiiijkkkkkkkkkkkkkkkkkkkkjjjjjjkkkkkkkkkkkkkkkkkkkklllleefffffffffffffeeeeeeeeeefffgffegggggfffffffffffffeeefffffffffffffffffffffffffffggggggggggffffggggggffffffgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhgggggggghhhhhhiiggggghhhhhhhhhhhhhhhhhhhhhhhhhhhihhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjiiiijjjjiiiiiiijjjiiiiijjjjjjjjkkkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjkkkkkkkkkkkeeeeeeeeffffffeeddddddeeeefffffeffggffffffffffffeeeeefffffffffffffffffffffffffffffffffffggffffgggggfffffffgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhgggggggghhhhhhiiggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjiiiijjjjiiiiiijjjjjjjjjjjjjjjjkkkkkkkkkkkkjjjjiiiijjjjjjjjjjjjjkkkkkkkkkkkeeeeeeeeeeefeeeeddddddddeeefffeeffffffffffffffffeeeeeffffffffffffffffffffffffffffffffffffffffgggffffffffffgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhggggggggghhhiiggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihiijjjjjjjiijjjjjjjjijjjjjjjjjjjjkkkjjkkkkkkkkkkkkkkkjjjjjjjkjjjjjjkjjjjkkkkkkkkkkkkeeeeeeeeeeeeeeeedddddddddeeeeeeefffffffffffffeeeeeeeefffffffffffffffffffffffffffggffffeefffffgggffffffffffggggggggggggggffffffggggggggggffggggggggggggfffgggggggggggggggggggggggggggggggggggghhhhhhggggggggghhiiggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhijjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkllllllllkkkkkkkkkkkkkkklllkkkkkkeeedddddddeeeeddeddddddddddeeeeeeefffffeffffeeeeeeeeeeffffffffffffffffffffffffffggggfffffffffgggfffffffffffgggggggggggggfffffffgggggffffffffggggfggggffffffgggggggggggggggggggggggggggggggggghhhhhhggggggggghhiihgggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhijjjjjjjjjkkkjjjjjjjkkkkkkkkkklkkkkkkkkkkkkkkkkkkklllllmmmkkkkkkkkkkkkkllllllllkkkddddddddddddddddeedddddddddddeeeeeeefeeefeeeeeeeeeeeeeefffffffffeeeeeeeeeeefffffggggfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffgfffffffffffffgggggggggggggggggggggggggggggggggggggggggggggggghhhhhggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiijjjiiiiiihhijkjjjjjkkkkkkkkkkkkkkkkkkkkllllkkkkkkkkkkkkkklllkkkkkkklllkkkkkkllllllllllllllllldddccccccdddddddddddddddddddddeeeeeeeeeeeeeeeeeeffeeeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffgggggggggggggggggggggggggggggggggghhhhggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiijjjjjiiiiihhijkkjjjkkkllkkkkkkkkkkkkkkkkllllkkkkkkkkkkkkkklllljkkkkklllllkkllllllllllllllllllldcccccccccddddddddccccccddddddeeeeeeeeeedddeeeeefffeeeeeeeeeeeeeeeeeeeeeeeeeffffeeeeefffffffffeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeefffffffffffffggggggggggggggggggggggggggggggggggghhggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhggghggghiijiiiiiiiiiijjjjjjiiiihhijkkjjjkklllkkkkkkkkkkkkkkkklllkkkkkkkkkkkkkkkllllllllmmmnllllllllllllllllllllllllddcccccccccccccccccccccccccdddddddddeefffeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeeeeeeeefffffeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffgggggggggggggggggggggggggggggggggggghhgggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiijjjjjjjjjjjiiijjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklllmmllllmmmmllllllllllllllllllllllllddccccccccccccccccccccccccccdddddddddeeeeeeddeeeeeeeeeeeeeeeeeeeeeeeeeeedeeeedeeeefffffeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggffgggggggggggggggggggggggggggggghhgggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiijjjjjjjjjjjjjiiijjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllllllllmmmllllllllllllllllllllllllddccccccccccccccccccccccccccccccdcccddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeedeeeedeeeeeffffeeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffgggffffggggggggggggggggggghgggggggghhggghhhhhhhhhhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhhhhiiiiiiiiiijjkkkkjjjjjjjjiiijjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllllllllllllllllllllllllllllccccccccccccccccccccccccccccccccccccccccccccddeeeeeeeeeeeeeeeeeeeeeeeeeedefeedeeeeefffeeeeefffffffeeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggfffgggggggggggggggggggghgggggggghhggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiijkkkkkjkkkkkjjijjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkjjjjkkkkkjjjjjjjkkkkkkkkkkkkkkkkllllllllllllkkkkcccccccccccccccccccccccccccccccccccccccccccccddeeeeeeeeeeeeeeeeeeeeeeeeeeeffedeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffffggggggggfffffffffffffffffffffffffffffffgggggggggffgggggggggggggggggggggghhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiijjkkkkjkkkkkkkjjjjkkkkkkjjjjjjjjjjjjjjkkkkkkkkjjjjjkkkjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjccbbbbbccccccccccccccccccccccccccccccccccccccddddddeeeeeeeefffeeeeeeeeeeefffeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffffggggggggffffffffffffffffffffffffffffffffggggggggffggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjjkkkjjjjjkkkkkjjjjjjjjjjjjjjjjjjjjjjkkjjjjjkkkjjjjjjkkkkkkkkjjkkkkkkkkkkkkkkkkkkkkkkjjbbbbbbbbcccccccccccccccccccccccccccccccdccccccdddddddeeeeefffffeeeeeeeeeefffeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggggggffgggggggggggggggggggggggggghggggggggggghhhhhhhhhhhhhhhhhhhhiiiihhiiiiiiiiiiiiiiiiijjjiijjjjjjjjjjjjjjjjjjjiiiiijjkkkkjjjjjjjjjkjjjjjkkkjjjkkkkllkkkkkjjkkkkkkkkkkkkkkkkkkkkkkkkbbbbbbbbcccccccccccbbccccccccccccccccdddcccccccdddddddeeeeffffffeeeeeeeeefffeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffgggggfffffgggggggggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhggghhhhhhhhhhhhhiiiiiiiiiiiiiiiiijjjjjjjiiiiiijjjjiiiiiikkkkkkkkjjjjjjjkjjjjkkkkkkkkkllllllkkkkjkkkkkkkkkkkkkkkkkkklllllbbbaaaaabbbbbbbbbbbabbbccccccccccccccccccccccddddddddcccddddddddddcccdddcdddeeeefeeeeeeeeeeeeeffeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiijjjiiiiijjjjjiiiiiiiijjjjjjjjjjjjjjjkjjjjjjjjjjjjjkkkkkkkjjjjjjkkkkkkkkkkkkkkkkkkkkkkbbaaaaabbbbbbbbbbbbbbbbccccccccccccccccccccccdddddddcccccccdddddcccccccdccdddeeeeeeddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffeeeffffffffffffffffffffffffffffffffffffffffffffffffffggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiijjjjiiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjjjjjjjjjkkjjjjjjjjkkkjkkkkkkkkkkkkkkkkkkaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccccccccccdddcccccccbccccccccccccccccccdddddddddddeeeeedddddeeeddeeeddeeeeeeeeeeeeeeeeeeeeeeeeeeeeddeeeeeeeeeeeefffffffffffffffffffgffffffffffffffffffgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhggggghhhhhhhhhhhhhhhhhhhiiiiihhiiiiiiiiiiiiiiiiiiiiiijjijjjjjjjjjjjjjjjjiiijjjjjjjiiiijkkkjjkkkkkkkkkjjjjjjjj`````aabbaaaaaaaaaaabbbbbbbccbbbbbbbbbbbccccccccccccccccbbccccccccccccccccccddddddccdddeeeddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeedddeeeeeeeeeeeeeeeeeeeeeefffffffffgffffffffffffffffeffgggffgggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhggggghhhhhhhhhhhhhgggghhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjjjjjjiiiiiiiiiiiiiiijkkjjjjjjjjjjjjjjjjjjjj``````aaaaaaaaaaaaaaabbbbbbbbbbbaaabbbbbbbbbbbccbbbbbbbbbbcccccccccccccdbcccccccccccccddddddccccdddddddddddddddddddeedddddeeeeeeeeeeedddeeeeeeeedeeeeeeeeeeeeeeeeeeeffffffffffffffffffffeffggfffgggggggggggggggggggggggggggggggggggggggggggggggggggggggghhgggggghhhhhhhhhhhhhggggghhhhhhhhhhiihhiiiiiiiiiiiiiiiiiiiiiiijiiiiiiiijiiiiiiihhiiiiiihijkjjijjjjjjjjjjjjjjjjj```````aa``````````aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbabbbccccccccccccbbcccccccccbccccddccccccccccccccccccccccddddddddddddddddddddddddeeeeeeeeddddddddddddddeeeeeeeeefffeeeeeeeeeeeeeeeeffffffffgggfffgggggggggggggggggggggggggggggggggggggggggggggggghggggggggggggggghhhggggggghhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiihiiiiiiiiiiiiiiiiiiiiiiiiiiiiihijkjiiiiiiiiiiijjjjjjjj`````````````````````a````````````````aaaaaaaaaaaaaaaaaa``aaabbbbbaaabbbbbcccccccccbbbbbccccccccccccccccccccbbbbccccccccccccccddcccdddddddddddddccdddddddddddddddddddeeeeeeeeeeeeeeeeeeeeefffffeffffffffggfffggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiihijjjiihiiiiiiiiiiiiiiii````````````````_```````````````````````aaaa```aaaaaaaaa`````aaaaa``aaaabbccccccccbbbbbbcccccccdccbbbbccbbbbbbbbccccccccbbccccccbbccccccccccccccccccccddccddddddcccddddeeeedddeeeeeeeeeeeeffffeeffffffffgfffffggggggggffggggggggggggggggggggggggggggggghgggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiijjiiiiiiihijjjihhiiiiiiiiiiiiiiii```___`````````````````````````````````````````````````a````````aaaaaaaabbbbbbbbbbaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccbbbbccbbbbbbbbccccccccccccccccccccccccddddddddeeeeeeeeeeeeefffeeffffeeffffffffgfffffffffffffffeefffgfffffgggggggggggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhiihhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiihhhiiiiiiiiiiiiiiiihhhiiiii```_____````````````````````````````````````````````````````````````````aaaaaaaaaaaaa``aaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccbbbbbccbbbbbbbbbbbcccccccccccccccccccccddddddddddddddddeeeeeeeeeeeffeeefffffffffffffffffeeeeeeeefffggfffffggggggggggggggggggggggggggggggggggggggggggggggggghhhhgggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiihhhhhhhhhhhiiiii`________`````````````````````__````````````````````````````````````````````````````````````````aaaaaaaaaaaaaabbbbbbbbbbbbaaaabbbbbaabbcbbbbbbbbbbbbbbbbbbbbbbccccccccccccddddddddddddddddddddddeeeeeeeeeeeeffffffeeeeeeeeddddeeeffggggfffffggggggffggggggfgggggggggggggggggggggggggggggggggggggggggggghhggggghhhhhhhhhhhhhhhhgghhhhhhgghhhhhhhhhhhhiiiihhhhhggghhhiiiii___________```__``````````````__``````````````__`````````````````````````````````````````````````````````````aaaaaaaabbbbba```abbaaaaabbaaaaaabbbbbbbbbbbbaabbbbccccccccccccccccddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeddddddddefffggfffffffffffffffffgggfffggffffggggggggggggggggggggggggggggffggggggggggggggghhhhhhhhggggggggggggggggggggghhhhhhhhhiiihhhhggghhhiiiih_^^^^^^^^_______````````````````______``````````________```````````````````````````````````````````````````````aaaaaaaaaba`````aaaa``aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbccbbcccccccccccccccccccddddddddddddddddeeeddddddddddddddeeeeffffffeeeeffffeeeeffffgfeeefffffffffffffffffggfffggggggggfffffffffggggggggggggggggggggggggggggggggggggggggggggggghhhhhiiihhhgghhhhhhhh^^^^]]^^^^^^^^^^___________________________`````________````````___``````````````````````````````````````````````````````````````````````````````````````````aaaaabbbbbbbbbbbbbbbbbbbbbbccccccccccccddcccccddddddddccddddddddddeeeeeeeeeeeeeeeeeeeeeeefffedddeeefffeeeeeeeeeefffffffffggffffffffffffgggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhhhgghhhhhhhh]]]]]]]]]]]]]]]]^^^^^^^^]]]^^^^^^^^^^^^^_____________________________``````````````````````````````````````````````````````````````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbcccccccccccccccccccccccccccddddddeeeddddddddddddddeeeefedcddedeeeeeeeeeeeeeeeeeeefffffffffffffffffgggggggggggggggggggggggggffffffggggggggggggggggggggggggggggggghhhhgg]]]]]]]]]]]]]]]]\\\\\]]]\\\\]]]^^^^^^^^^^^^^^^^^_____________________```````````````````````````````````````````````````__`````````````````````````````````````````aaaaaaaaaaaaaaaaaaaaa``````aabbbbccccbbbcccccccccccccccccccccdddddddddddddddddddddeeefecccdddeeeeeeeedddddeeeeeeeffffffffffgggfffggggggggggggggggggggggggffffffffgggggggggggggggggggggggggggggggggggg\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]]]]]]]^^]]]]]]^^^^]]]]]^^^^^^^^^___^^_`________^`^^`_^`^```````______________```````````````````````````````````````````````````````````````aaa```````````````````abbba``abbbbbbbbbbbbcbbbcccccccccccccccccccccddddeeeedddddddddddddddcddddddddecceeddgfeeeeeeedeeeffffgfffggffefffeeeeeeefffffgffeefghhgfefggggggggggggggggggggggggggg[[[[[[[[[[[[[[[[\\\\\\\\\\\\\\\\\]]]]]]]]]]]]]]]]]]]\\\]]]]^^^^^[]^^^]^^^^^^^^^^]_^]`_^`^_```_________________``__````````````````````````````````````````````````````````````aa````````````````aaaaaaa``abbbaaabbbbbbbbbbbbccccbbbbbbccbbccccccccccddddcccccdddddccccccccdddddcebbdeddeddddeeeeddeeefffgfedddddeeffeeeeeeeeeeeeddeeeeefeeeffffegggggggggggggggggggggggg[[[[[[[[[[[[[[[[[[[[\\\\[[\\\\\\\\\\\\\\\\\\\\]]]\\\\\\\]]]]]]]]]]]]\\^^]]^^^^^]]^^]_^]_^]^_```___________^^________________````````````___`````````````````````````````````````````````````````aaa`````aaaaaaaaaaaaabbbaabbbbbbaaaaabbbbbbbbbbbcbbbbbbbccccccccccccccccbbcccccbcaacdccdbccddddddddddeeefeedddeeeeefffffddddddddccdeeeedefffffggffggggffffffggggggggffffZZZZZZZZZZZZZZZZ[[[[[[[[[[[[[[[[\\[[[[[[[[[[[\\\\\\\\\\\\\\\\\\\]]]]]]]^\]]]]]]]]]]]]]]^_^^^``_^^^^^^^^_^^^^^^^_^^^^^^__^^^_________````^^______````````````````````````````````_```````````````_````````````a``````aaab`aaabbbbaaaaaaaaaaaaaabbbbbbbaaabbbbbbbccccbbbbbaabccbba`abbaabcabbccdcccccccdddcdeeeeffeccefeefdddddddddddefffeeefeddfgffffffffffffffffgfffffffYYZZZZZZZZZZZZZZZZZZZ[[[ZZ[[[[[[[[[[ZZZZZZZZZ[[\\\\\\\\\[[[[[[[[[[\\]\[Z\\\\\\\\\\\]\]]]_^]]]]\[]]]]]]]]]]]]^^^^]]^^^^^^]]^^^^__^^^_____^^^^___________`____________`````___````___`````________]_`a``__`___``````````aa```aaaaaaaaaaaaaaaaaaaaabbbbbaaaaabbbbbbbbbbbaaa`aabbbaa``aaaaaaaabbcccbcccbbcccbceeedeeecbdedceddddddddedcdefeeeefeedeeeeeefeeeeeefffffffffffffYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[[[[[[[[[\[YYYZ[[[[[[[[[[\[\][\]\Z[[\[[\]\\\\\\\]\\]]]]]]]]]]]]]]]]]]]]]]]]]^^^^^^^^^^^^^^^^^^^^_^^^^^^^^^^^___________``_________________`a``^^_`___``````````````````aaaaaaa```````````bbbaaaaaaaaaaaaaaaaaaa```aaaaaaaabaabcb`bbbbbbbbcbbbbbccbcccccefgcadecbdddcccddecccdffdcedccdeeeddeeeeeeeeeeefffffffffffXXXXYYYYYYYYYYYYXXYYYYYZYYYYYYYYYYYYYZZZZZZYYYZZZZZZZZZZ[ZZZZZZZ]\[[\\\[ZZ[[[[[[\Z\][\][[]^^\[]`\\\\\\\][[\\\\\\\\\\\\]]\\\\\\\\\\\]]]]^^^^^^]]]]]]]]]]^^^^^^^^^^^^^^^]]^^^^___`________________```_^_adca`````_````````_```````````````````````aaaaaaaa````aaaaaa``````aaaaaabbaegdbcccccbaaaaacbbaaabbbbbabglphdbefcbdccbbccdebcegiheabbegjjgcddddeeeddeeeefffeefffgggXXXXXXYYXXXXXXXXXXXXYYYYYYYYYYYYYYYYYZZZZZZYYYYYYYYYYYYYZZZZZZZZZ]`dea\XZZZ[[[[[\Z\]Z[][bdea]Z[]\\\\\\]][[\\\\\[\\\\\\\\\\\\\\\\[\\\\]]]^^^^^]]]\\\\\]]]]]]]]]]]^]]]]]]]]]]^^___^_________________^]]`fjeca```_^````````__````````````````````````````aa````````````````baa`aabc`gmha`dgedba``aacbaaaabbbaaadlu|jebefcbdbbaabcddbehmnlgabgpy}ynfcdddddddddeeefffeefffgggXXYXXXXXZWXXXXUZXXXYYXWWWYXXXYZXYYYYXXYYY[YXZYXZYYYYYYYY[ZXY][Y]_`gy{gYXXX\[X[[[ZZXXam]``pse^[Z]Z[[[ZZ[[ZX[X\\\\\\\\\\\\[]]^^[Z]\[[[[\]]\]]]\\\\[[[[\\]]\]]]]]\\[\]]]]]\]\\\\\]]]^^_]_]^^^]]]^^^[^]^]dozwsnkb`]^`]_^]_]`_____````````____```````_`````````````````^a`]\b^ae```_a`m|lfgfnobb`^_\a``_bac``aa``clonmgcjnga``_bcdehejlltnnfgknvuldbacedcdecceecdfedefdbdgXXXXXXXXWXWWVWYWWWXXXXXZXXXXXXXXXXXXXXXXXZXXYXXYXXXXXXXXWXXZYVYbgiq}h]^[Y\ZY\ZXX[\agsjjdnn_Y\YWY[ZZ[ZZ[[^ZX^_][\\\\\\\\\][Z[\[[[[[[\\\\\\\\\\\\\\\\\\\\]]\\\\\^\\\]]]\\\\[[[\\\]]\^\^\]]]]]]]]]^^[^\gv|wtuud^^`^]````\]^^____``_``_______``__````````````____^^a]\_`c^`^^]bhe``bxutujkiba``b_``a``_a``a_`cchoppkllmlfcfbb`eimglorzplirsy~tgc`addcbdbbdecceeccecflpVWWWWWWXUXWWWXYVWXWWWXYYXWWWXXWXWXXXWWXXXXXWXXWXXXXXXXXXXYXXXX]gtuzse`^XXXXZXWX[]ht}sljrtg_`[ZZYZZZZZZ`fa[Y[ZZ[[[[[[[[\ZYZZ[[Z[[[\\[[[[[[[[[[[\\\\[[[[\][[][Z_\\\\\\\\[[[Z[[[\\][][]\]\\\\\\\\\]\`Yfz{yuxpe]\^]_^^_]]^^^^^___^^^__^^^^___^^__`______`_____^^^`]^_fmb```^jsh``l~uqjmnlic___a`aaa]^_b`bbbgqz|zlluxuniebddimrpw|zuw|~}qib`bcbbbabddcccadfecemuUVWWVVWXVXXXYYXWXWVVWXXVXVVVWXVXWWXWWVWXXXWWWWWWXXXXXXXXWYYXX^cgx{~unaXVXXXWXXZ[j{vqy~uf_X[ZWYZXYYZgmf[WXXYZZZZZZZZ[XY[ZYYZZZ[[[[ZYZZZ[[ZZZ[[[[[[[[Y\[[][Y\\\[[Z[[[[[Z[[[[\\]Z][\\\\\\\\\\\^][\Yi|}}yszzpb\^^][[]^^]]]]]^^^]]]^^^^^^^__^^^_`_^^^^__^^____``]]]anuf`agmy}naes|pkwsfa_^`_```b`a``_a`ajqw|ig|ysmjggghiu}sid``ab``abcbbbacbbghinUVWWVVWWXVXWSX\XUUVWWWVVWVXWVXVXWWWWVVWWXWWWWWWWWXXXXXXXWXXXZcnr|vbZYXXXWXYY`lx~{x||jaXWYXXWXXX`npdZZXZZYYYYYYYYYYZZYYZ[YZZ[ZZYXYYYZZZZZYYZZ[[[[X\][[ZY[[[ZZZZZ[Z[[[[[[\[]Y][[]\\\\\\\[[[Y[^bsxx|{x~zrg][\\\\\]\\\\\]]]]\\]]]]]]^^_^^^^__^^]]]^^]^^^^^^_^^`juzn`ao}xkp~}obc`]^_`_]cgjc^^``cnsx|rt}|wsonkjjv}vnc_`a``aaaaa`a``afknoUUVVVVVVVUVXS`sfUTUWVTVXUX^YWXVXVWWWVVVWXVWWVVWVWWWWWWWWYVXajs|q]XXVVYXVX\o}|zdbc]WYXSYZZkzona[XXYXXXXXXXXY\ZXZ[Z[YYYYYYXXXXYYYYYYXXYYZZZZZ\^^[ZZ[ZZZYYYYZZZZ[[[[[Z]X][[\[[[\\\[[ZWY_dm||||v}}vk`\[Z]][\][[[\\\\]\\\\\\\\]^^^]]]^^^]]]]]]]]]\[[\^_^guuuodju}phkia]]`]_lolefkfciu|tjmszi```_`a``a``a^`bcnxyTUVVUUTUUVUVQ`sf]VRUVTTXU[d\WXUVUVVVUUUVWUVWUVWUVVVVVVVVWU_q}scYVTUXWW`hyzklkcVXXTX\`usujcXUXXXXXXXXXYZX[c_XXXXXXXXXXXXXXYYYYXXXYYYYX[Y`ga[YYXYYYYYYYYYYZZZZZX\X][Y[YZZ[[[ZZYZ^acgru~x}ug`][Z``Z\^[[[[\\\\\\\\\\[[\\]]\\\]]]]]]]\\\]]\[\`ab`lxsnihmz{vokd\`_]bpsnjnwkhs~|u|mbbb`aa````_b__clv{wSTUUTTSTRUWXZgtnhYPRWURSV^h_WXTTTUUUTTUUWTVWTUWTUUUUUUVVTWdt||uaXWWUTX`p}wxurf[WTXVV]h|}qlsXVWXXXXXXXXYWUamaRVXXXXXXXXXXXXXYYYXXXXXXXXYWbnh\XWXXXYYYXXXXYYYYYYW[W\[X[XYYZZZYYXW]cmsz~|mgeZZ[ef\[[Z[[[[\\\\\\\\[[[[[\\[[[\\]]]]\\\[\]]^`egoioz|vinuvhkj^`_`cmswrmnns|mcef`aa__``_`baguztoSTTUVSSSRTT_mw{vm]^UQTTWVankXVSRSWRWWTRTURTQQTTTWSVVSTTST]dlxnbYXUWXZl|lfg\SUVXV]u|~x\WWUVWWWWWXVTZhwhUUXYWWVWYVVVTVWXZVXXVXYXXUW_gqd\\ZXXXXWXXYWWXZWXXX]f`XTZ[XZWVXZ[ZYY_ejw|nfge\]ei`Z[YXXYZZ[\[^Y\Z]\XZ\Y[[XZ[Z]cd]YZZ\[Z\`bgnnoz|oluugdeff``^k|vwsklzuhgnd_````___`aly|xuQQRQSQQTSU[n~{xp_VRQQXbjum^XWSRYZTTRSXURSQRRWabWUUSTVWW`htxr^UTT[`fu}uj_\XWWU]~~g]\VTVWUUVWVVY`u}lXSWXWWVVXWWXYXXXXXYWWWXXWXYbnn]XV[XXXXWXXXXZYXWUX`lq`WVZWVXXXXXXXY_glpy|~}ussjabgkfa[Y[[ZZZZZX[Z\XZ]Z\YX\XX\YZ^gi`\[XY]`acdgnilyunu}~tmggh``enr}xw|x~zjelke_____^__`nuz~wXOSQQQSUWY`ss^WXTX`ry|sodXTT^g[TR_odYVYVQZrp]SQQVVTXet|pXUYW]gmywildWSV\a|qjf\VTVVTTUUTT^h|r]TUUWWVVUWUTWVWWXb`YXWXXUW\flog`[XWWWWWWWWXUVWWXaghynbVXXXWXXXWWWWX]`joinw~rdgqsgc^Z[YXYXVXXZX[XZ\ZYXXZXX]XZalmc\[XZenqqnnqru~||zyqgaajpvrhkoh`a`[_`_`cnqxfRSRTRSX\gr}uqodRR\iux|ri^WWSisbXZi{|lefWTa|v[ORSQRX`q|eX^`_fn}|gbXRW[ipuzuk[VUUUUTSSTSZjy|p]XTRUTVWSVXTVVTT[gf[UTWWVYfhovyt`UVVWWWWVUWUVXXV`pu}jcZXUWUXXXXXWVZgilsv}vhkuugdg`XVXXUUY[]WXX[ZXXXVXYY[[_gnnia\Y^n}|xy~vgediqumomedje\]^`]aplZX_i`V_qzzvfRTXgs}|qhc[aezynggn|zjVXj|s`UTTRSYh{u`cmgerybYVUSXnuiZUVSSVURRUSWkxyncZTSSRVXRUWUWZUVck`ZUXXWXZimtutk_WWWVVVVUTSWVVWXeu|njZWXUUXVUXXX[enr|y|y~|qnrrpimrdYVXYWWX`bXWXZXXZXW^`XX]dnqpph_[du}snknvwnlkgnrg`\X^_hvn_^nxn`gz}{zdW\jgslceey~{zonxiYZqnYQRQS_pwt{wjin[VXYgt|rd[URSUURRUU`u~|wqYWXVRUWSTSRZd[Wfnd_VTTXckopt~wa``YXVUUUUSSTTXV[gyreYVVUUXVTUUYcnu|tt|pmnspqrquuvug`YXXXXWfg]XWXWXZY_llZTZetyuog`co{rou}tnns}uc]\ZZ\h~tc`swuouuW[mslqw|vnuo`ey}hTRURXft~uhn{nd]bv|rbTQRSSRSTTTi}~tVZa\TSTTUV\in`[gqtk^URU]bmxxkdnm[XVTTUUTUWWe_UZ|o`XWUUVTTVSXevqtx{yywvtw|wt{pnbWWWX]mj`[UWXWX`fopaZ`l|xjdiqzx}unns{f[[^\Zc|ynj|~zzqldzyvy|syvbtpTMQT_p||runnwwjbq}y|ymWPOSTQQTURRhz~|fS]g`VRQTVWi{qcgryuh\QQWXYo|}|wrxe]YVSTUUTRUXlcZ[u|bYWVVTTSVYUVagdr||~~~ut}jZZXZisj`\UX[UXjhflgenz{jiu}}}xsmkout`YY[Yau~|vnw}~|{}|y_r}iWQMXm~sgeft|z}uuohkeYRPVRSRORUPTbryztdX]lgWRRQU`u||nvw{uj^VSV`j}|xm\TSTVTSTZhzwnjqs`VTRSQVTX`[Y_m}nu}||xe^\evmg]XWYZYhkrwory~qnw}s|kY\]_gpwt|yzrt~|eg{|uhZQP[l||vtus|ukr}m``]Z\\YQQSRSTPRVYga_l_blgXSSRVl|||u{sh^WV_ny|y|n_XWTTUVW`x}ybTTRSUUUZafhl~z}}xm``jvsmi`Xbgbjq|{w~wos{}tejy~ymlehr|rnw~s~u[X_`^SQSUXX`{|v{|zszzwwrutstsi[UWVUVSUVYgedtpmoh]WUTVo~~z~rdXUSYkzy{~qkcXQQU[l}cUXUVUS]`X^is||pfoxrbfsyogZ]utlq~y~||~tv{zy||x~y|uxpvnVOS`]WRVinhu}|x}|unpppqqqruzyw{ztnlllusqsoolg^XZ]jwg[VXe{wg_SWVXfj[[hpgelnwi]]m|v{|qlsxfcelv{xwuhlikpxj^\jzxqx||yojght|{tuxcYh|vc`[`nqb_p}|pi_VhmraZZiy|z}~xnnwznpryxqr|ytu|xvq|{|~xwzuv}xttqiny~th[[jtqggzslgaYgqp[STcsyxqu}sggqlmglxqgm}tqnqu~vw}m[S^pnjnn{zogrr[SWfsrngpzvsoe`j]fnwxsluzqq|zxw|uc`gsqv|ujkjqypg]dqttkYXeZo{tx{qz||}~|{}~~~|uu~{kgnv||yijjkkkkkjjjjjjjjkkjjjiiiiijjjjiiiiiiiijjjjjjjjiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhhhhiihhhhhhhhhhhhhhihhhhhhhghhhggggggggggggggggggggggghhhhhgggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhgggggggggghhhhhhhhggggghhhgggggggghhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjkkkjjiiiijjjjjjjjjjjjjjjjjjkllllkkkkkllllkkkkkkkkkkmmmlllllllllllllllllmmmmlllllllllllllllljjjjkkkkjjjjjjjjjjjjjiiiiijjjjiiiiiiiiiijjjjjjiiiiiiiiiiiiiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgggggggggggggggggggggggghhgggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhgggggggggggggggggggggggghhhhhhhgggghhhhhiihhhhhhhhhhhhhhhhhiiiiiiiiiiijjjjjjiiiiijjjjjjjjjjjjjjjjjjkklllkkkkkklllkkkkkkkkkkllllllllllllllllkllllllllllllllllllllllljjjjjjjjjjjjjjjjiiiiiiiiiijjjjjjjjiiiiiijjjjjiiiiiiiiiiiiiiiihhhiihhhhiiihhhhhhhgggggggggggggggghhhhhhhhhhhhhhhhgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhhhhhghhhhhhhgggggggggggggggghhhhiihhhhhiiiiiiiiiiiijjjjiiiijjjjjjjjjkkkkkkjjjkkkkkkkkkkkkkklllllllllllllllllkklllllllllllllllllllllljjjjjjjjjjjjjjjjiiiiiiiiiijjjjjjjjiiiiiijjjiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhggggggggggggggggggggghhgggggghhhhhhggggggggggggggggggggggggggggggggggggggggggffggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhggggggggghhhhhgggggggggggggggggghhhhhhgghhhhhhhhiiiiijjjiiiiiiiiiiiiiikkkkkjjjjjjkkkkkkkkkkkklllllllllllllllllkkkllllllllllllllllllllljjjjjjjijjjiiiiiiiiiiiiiiijjjjjjjiiihhhhiiiiihhhiiiihhhhhhhhhggghhgggghhhggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggfffffggggggggggggggggggffffgggggggggggffffgggggggfffffggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhgggggggghhhiiiiijjiiiiiiiiiiiiiijjjjjjjiijjjjkkkkkkkkkkkllllllllllllllllkkkllllllllllllllllllllljjjjjjjijjiiiiiiiiiiiiiiiijjjjjiiiihhhhhiiihhhhhhhhhhhhhhhggggggggggggggggggggggggggggggggggggggggggggggggggggffggggggggggggggggggggffffgggffffggggggfffffffffffffffffffffgggffffffggggggggfffffffggggfffffffffgggggggggffgggggggggggggggggggggggggggggggggggggggggggggggggggggggghhiiiijiiiiiiiiiiiiiiijjjjjiiiiiijjjkkkkkkkkkkllllllllllllllllkkkllllllllllllllllllllliijjjjjjjiiiiiiiiiiiiiiiiijjjiihhhhhhhhhiihhgghhhhhhhhhhgggggggggggggggggggggggggggggggggggggggggggggggggggggfffggffffffffggggffffffffffgffffffffggfffffffffffffffffffffffffffffffffgggggffffffefffgggffffffffffggggggggfffggggggggggggggggggggggggggggggggggggggggggggggggggggggghhiiiijjiiiiiiiiiiiiiiiijjiiiiiiiijjkkjjjjjjkkkkkkkkkkllllllllkkkllllllllllllllllllllliiijjjjjiiiiiiiijjiiiiiiiiijiihhhhhhhhhhihhgggghhhhgggggggggggggggggggggggggggggggggffffggggggggggffffffggggggffggffffffffffffffffffffffffffffffffffffffggffffffffffffffffffffffffffggggfffffeeeffffgfffffffffffffffffffffffggggggggggggggggggggggggggggggggggggggggggggggggggggggghiiiijjiiiiiiiiiiiiiiiiiiiiihiiiijjkkjjjjjjjkjjjjjkkkllllllllkkkllllllllllllllllllllliiiiiiiiiiiiiiiijiiiiiiihhhhhhhhhhhhhhhhhhhhghhhggggggggggggggggggggggggggggggggggggffffffffffffffffffffggggffffffffffffffffffffffffffffffffffeefffffeedeeeeeeeeeeefffffffffffffeffffffeffeeeeeeffffffffffffffffffffffffeeefffffffffffffgfffggggggggggggffgggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiijjiijjjjjjjjjjjjkkkkkkkkkkkkkklllklllllllllllllllliiiiiiiiiiiiiiiiiiiiiiiihhhhhhhhhhhhhggghhggggggggggggggggggggggggggggggggggggggggggffffffffffffffffffffffffffffffffffffffeeeeffeeeeeeeeffffeeeeeeffeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffeefeeeeeeeffffffffffffffffffffffffeeeffffffffffffffffffgggggggggggffgggggggggggggggggggggggggghhhhhhhhhhhhhhgggggghhhhhhhhiiiiiijjiiijjjjjjjjjjjjkkkkkkkkkkkkklllkkllllllllllllllkhhiiiiiiiiihhhhhiiihhhhhhhhhhhhhggggggggggggggggggggggggggggggggggggggffggffffgggggfffffffffffffffffffffffffffffffffffffeeeeeeeeeeeeeeeefffeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeddeeffffffffffffffffffffffeeeffffffffffffffffffffgggggggggfffgggggggggggggggggggggggggghhhhhhhhhhhgggggggghhhhhhhhhhhiiijjiiiiiiiijiiiijjjkkkkkkkkkkkklllkkkkllllllllllkkkhhhiiiiihhhhhhhhhhhhhhhhhhhhhhhhgggggggggggggggggggggggggffffffggfffffffgffffffggggfffffffffffffffffffffeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeedddddddeeeeeeeeeeeeeeeedddddddeeeeeeeeeeeeedeefeeddeeefffffffffeeffeeeeeeeeeeefffffefffffffffffffffggggggggfffgggggffggggggggggggggggggggggggggghhhgggggggghhhhhhgggghhiiiiiiiiiiiiiiiiiijjkkkkkkkkkkjkllkkjjkklllllllllkkkhhhhiiiihhhhhhhhhhhhghhhhhhhggggggggggggggggggggggggffffffffffffffffffffffffffffggffffffeeeeeeeeffffffffeeeeeeeeeeeeeeeeeeeeeeeeddddddddeeeeddddddddddeeddddeeeedddddddddddeeeeeddeeeeddddeeeedcddeefffffffeeeeeeeeeeeeeeeefffffeeefffffffffffffggggggggfffffgggfffgggggggggggggggggggggggggggggggggggggghhhhhggggghhhiiiiiiihhhiihhiijjjjkkkkkkkjjkklkkjjjkklllllllkkkjhhhhhhhhhhhggggghhggggghggggggggggggggggggggggggggfffffffffffffffffffeeeffffffffffffeeeeeeeeeeeeffffffffdddddddddddddddeeeeeeeeeddddddddddddddddddcccddeddddddddddddddddddddeeeedddddddddddddddcddeeeffffffeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffgggggfffffffffffffggggggggfffggggggggggggggggggggggggggghhhhgggggghhhhhhhhhhiiihhhiijjjjjjjjjjkjjjkkkjjjjjkkkkkkkkkkkkhhhhhhhhhgggggggggggggghgggggggggggggggggggggggggfffffffffffffffffffeeeefffffffffffeeeeeeeeeeeeeeeeeeeeeddddddddddddddddddddddddddddddddcccdddddddccccddcccddddddddddddcccccdddddddddddddddccddddddeeeeefffeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffffffffffffffffeefffggggggfffffggggggggffffffggggggggggggghhhhgggggggggghhhhiiiihhhiijjjjjjjjjjjjjjkkkjijjjjjjjkkkkkkkkhhhhhhhhggggggggggggggghgggggggggggggggggggggggggfffffffffffffffffffeeeeffffffffffeeeeeeeeeeeeeeddddddddcdddddddcccdddddccccccccddddddddccccddddddcccccdccccddddddddddccbbbcccdddddddddddcccccdddddeeeeefffeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffffffffffffffffeeefffgggggfffffggggggggffffffffggggggggggghhhhggggggggggghhhiiiihhiiijjijjjjjjjjjjjkkkjiijjjjjjjkkkkkkkhgggggggggggggggggggggggggggggggggggggffggggffffggfffffffffeeeeefffeeeddddeffeeeddeeedddddddcddddcccddcbccccccccccccccddccccccccccccccccbbbccddddccbbcddccccccccccccccccbbbbbccccdddcccccbbbbcccccddddeefffffeeeeeedddddeeefeeedddeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffffffffffgggggffefffffggggggggggggggghhgggggggggghhhhiiiiiiiijjjjkjjjjjjjjjijkkjjiiiiiijjjjjkkkkkggggggggggggggggggggggggfggggggggggggffffgggfffffffeeeeefffeeeeeeeeedddccddeeeddddddddddddddccdddcccddcbcccccccccbbbbccccccccccccccbbbccabbbccddccbbbccdcccccccbcccbbbbcbbbbbcccccccccccbbbbbbbbccddccdeeeddddddddddddddddeeeddddddeeeeeeeeeeeeeddddeeeeeeeeeeeeeeffffffffeeeeefffggffeeeeeefffgggggggggggggggggggggggggghhhhhhhhhhhiiiijjjiijjjiiiijjjiiiiiiiijjjjjkkkkggggggggggggggggfffffgggfffffffffffffffffffffffffeeeeeeeeeeeeeeedddddcccbccdddccdddddddddddccccdcccccccbbbbbbbbbbbbbbbbbcccbbbccccbbbbbbaabbbccccbbbbbccbccccbbbbbbbbbbbbbbbbbccbbbbbbbbaaaaaabbbccccccdccccccccddddddddcddddcccccddddddddddddddcddddeeeddeeeeeeeeeeffffeeeeeeeeffffffeeeeeeeeffggggggggggggggggggggggggggghhhhhgggghhhhiihhhiiihhhiijihiiiiiiiiiijjjkkkggggggggggggggggffffffffffffffffffffffffffffffffeeeeeeeeeeeeeeddddddddccbcccccccccddddddddccccccccbccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaabbbbbbbaaabbbbbbbbbbbbbbbaabbbbbbbbbbaabbbbbaaaaaaaaabcccbbbbbbbbbbbbccccddddcccdcccbbbcccddddddcccccccccdddddddeeeeddeeeeeeeeeeeeeeefffeeeeeeeeeeefffffffgggfggggggggggggggggggggggggggggghhhggggghhhhhhiiihhhhhiiiiiiijjjjjggggggggggggggggffffffffffffffffffffffffffffffeefeeeeeeeeedddddddddddddccccccccccccccccccccccccccbbbccbbaaaaaaaabbccccbbbbbbbbbbbbbbbbaaaaaaaabbaaaaaaaabbbbbbaabaaaaaaaaaaaabbbaaaaaaaaaabbbbbbbbcbaaabbbbbbbbbbbbcccddcccccccbabbbccccccccccbbbbcccddddddeeeeddddddeeeeeeeeeeeeeeeeeeeeeeeefffffffffggfffggggggggggggggggggggggggggghhgggggggghhhiiiihhhhhhhhhhhiiijjjggggggggggggffffffffffffffffffffffffffffeeeeeeeeeeeeeeeeddddddccddddddccccccccccbbcccccccccbbbbccbbbccbaaaaaaaaabbccccbbbbbaaaaaabbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``aaaaaaaabbbbbbabbbaaaabbbbbbbbabbbbcccccccccbbaabbbcccccccccbbbbbbccccddddddddcccdddddeedeeeeeedddddeeeeeeffffffffffffffffffffggfffggggggggggggggggggggggggggghhhhiihhghhhhhhghhhiiiiifffgfgggfffffffffffffffffffffffffffeeeddeeeeeeeeedddddddddccccccccccccccbbbbbbbbbbbccccccbbbbbbbbbbbbbbaaaaaaaaabbbbbbaabaaaaaaaaabbbbaaaaaaaaaaaaaaaa``aaaaaaaaaaaaaaaaaaa```aa```aaaaaaabbbbbaabbbaaabbbbbbbaaaaabbbbbbbbbbbaaaaabbcccbbbbccccbbbbbbbbbcccccccbbccccdddddddddddddddddeeeeeeeeffffeeeeefffeffffffffffggfggggggfgggggggggggggggggggghhgggghhhhggghhhiiiiffffffffffffffffffffffffffffffffeeeeddccddeeeeedddccccccccccccccbbbbbbbbbbbaabbbbbbbccccbbbbbbbbbbabbbbaaaaaaaaaaabbbaa`baaaaaaaaabbbbaaaaaaaaaaaaaaa```aaaaaaa`aaaaaaaaa``````````aaaaa``abbaaaaabbaaabaaaaaaaaaaaabbbbaaabaaa`aaabbcccbbbbccccbbbbbbbbabbbbbbbbbbccccdcccccccddddcdddeddddddeefffeeeeeffeeeeffffffffggffggggffgggggggggggggggggggggggggghhhhgggghhhiiifffffffffffffffffffeeeeeeeeeeeeeeeeeedddddddddddccccccbbccccccbbbbbbbbaaaaaaaabbbbbbbbbbaaabbbbbbbbbbbbbaa```aaa`````aaabaaaaaaaaaaaaaaa``````````````````aa``````````abba````````aaaaaa``aaaa``aaaaaaaaaaaaaaaa````aaaabbaaaaaaaabbbbbbbbbbbbbbbbbbbbccbbbbbbbbbbcccccccccccdddddccccccddddddeeffffffffeeeeeeffffffffffffffffffffgggggggggggggggggggggggggggggghhhhhhhhffffffffffffffffffeeeeeeddddddddeeeeddddddddddccccccbbbbbbbbbbbbabbaaaaaaaaaaabbbbbbbbaaaaaabbbbaaaaaaaaaa```aaa`````aaaaaaaaaaaaaaaaaaa``````````````````aa``````````aaaa````````aaaa````aaaa``````````````````````aaaaaaaaaaaaaabbbbbaaaaaabbbaaaabbbbbbbbbbbbbbbcccccccccccccdcccccccddddddeeeeeeeeeeeeeeeeeeffffffffffffffffffgggggggggggggggggggggggggggggghgggggggffffffffffffffffeeeeeedddddcccccdddddddcccccccccbbbbbbbaaaaaaaaaaaaaaaa`aaaaaaaaaaaaaaaaaaaaaaaa````````aa```aaa`````aaaaaa``aaaaaa````a````````````````````````````````a``````````````````aa`````````````````````````aa`````aaaaaabbaaa``aaaaaaaaaaaaaaaaaabbbbbbbbccccccccccccccccccccddcccdddddddddddddddeeeeeeeeffeefffffffffffffggggggfggggggggggggggggggggggggggggfffffffeeeeeeeeeeeddddddccccccccccdddcccbbcccbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`````aaa`````````````aaa```````a````````aa`````````````````````````````````````````````a`````````````````````````````aaa`````````````aaaaaaaaa``````aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbccccccccccccccccccccccddddddddeeeeeeeeefffffffffffffffffffffggggggggggggggggggggggggeeffeeeeeeeeeeeeddddddccdddcccccccccccccbbbbbbbaaaaaaaaaaaaaaaaaaaabaaaaa`````aa```aa`````````````````````````````````````````````````````````````__````_```__`````````````````a````````````````````````````aaaa```````````````a```````````aaaaaaaaaaaaa```aaaaaaaabbbbbbbbbaaaaabbbbccccccccccccccccccccccccdddddddddddeeeeefffeeeeeffffffffffffgggggggggggggggggggggggeeeeeeedddddddddccccccccdcccccccbbbbccbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``````````````````````````````````````````````````````````````````````````___``___`____``````````````````````````````````````````````aaa```````````````````````````aaaaaaaaaaaaa`````aaa`aaaabbabbaaaaaaaabbbbbbbbbccbbbccccccccbbcccccdccddddddeeeeeeefeeeeeeffffffefffffffffffggggggggggggggggeeeeedddddddddddcccccccccccbbbbbabbbbbbbaaaaaaaaaaaaaaaaaaaaaa```aaaaaa``````````````````````````````````````````````````````````````````````````_^^________^^_`_`````````___``````````__``````_```__`````````````````````````````````````````aa```````````````a``aaaaaaaaaaaaaaaabbbbaaaabbbbbbbbbbbbbbbbbbcccccccddddddddeeeeeeeeeeefffffeeeeffffffffffgggggggggggggggeeeeddddcccccccccccccccbbbbbaaaaaabbbbbbaaaaaaaaaaaaaaaaaaa``````````````````````````````````````````````````````````````````````````````````````_^^^______^^^_`__````````___`````````____````__________`````___``````````````````_````````````````````````````a```aaaaaaaaaaaaaabbbbbaaaabbbbbbbbbbbbbbbbbbccccccccddddddddeeeeeeedeefffffeeeeefffffffeffggggggfgggggggdddddddcdcccccccbbbbbaaabbaaaaaaaaaaaaaaaaaa```````aaaaa```````````````````````````````````__``````_``__`````````````___``___`````````````______^^^^^^^]^^^^^^^^___``````````````___``_^^__```___```_^^______`````````````````````````__``````````````ab``````````````bbaaa`````aaabaaaaaaaabbbcbbbbbbbbcbabcdbacccccccbccddeeefffffeefgeeeeeeeegfffffggfggggghhggggffggdddccccccccbbcccbbbbbaaabbaaaaaaaaaaaaaaa````````````aaa```````````````````````````````````___````__```___```````````___`_____`````____```______^^^^^^^]]]^^^^^^_____```__________^____^^__```___```_^^_______``````____````````_``````_____````_`````````````````aa``aaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbabccccabbccccccccdddeeddeddddeeeeeeeeeeeeeeeeegghhhhhigggfffffccccccccccbbbbbbbbbbbaaaaaaaaaaaaaaaaaaa````````````````````````a``````````````````````````_____`____``_________```____________`________``__^^^^^^^^^^]]]]]]^^^^________^^^^^____^^^__^^^^________`__^^___^^___````______________``````_^___````_````___`````````aaa```````aabbbcccccbbbbbbbbbbbbbbbbbbb`aaaabcdbbbbbbbbcccccdddccddccddeeedddddeeeeeeddgghhhhiigggfffffccccccbbcbbbbbbbaaaaaaaaaaa``````aaaaaaa````````````````````````````````````````________``_____^_^^^_``___________________^^^___________`__^^^^^^^^^^^]]]]]]]]^^__^^^^^^^^^^^___^^^^__^^^^^___^^__`_^^^^^^^^^^__``________________``````_____`````aa`__^``````````aaa``a```````accccbbbabbbccbbabbbbbbbbaceecbbccccbaa``bbcccccccdddddddedddddddeefffeedefgggghhggggggggbbbbbbbbbbbbbaaaaaaaaaaaaa````````````````````````````````````````````````````_______________^^^^^]^____^^^^^^______^^^^^^^^^^^___________^^^]]]]]^^^]]]]]]]]]^^^^^^^]]]^^^^^____^^^___^^^^^^^^^^___^^^^^^^]^^^^`__^^___^^^^^^^^___```````______``aa``__````___`_``aaaabbaaa````bbbbaaa`bbcccbbaaaaaaaaadgiigecccbbbaaaabbbbbbbbccddccccdddccddddeeeeedcdeggggggggggggggbbbbbbbbbbbbbaa``aaaaaaaa````````````````````````````````````````````````````___________^^__^^^^^]]]^__^^^^^^^^^^^^^^^^^^^]]]^^^________^^^]]]]]]]]]]]]]]]]]]^^^^^]]]]]]^^^^^^__^^^^___^^^^]]]]]^^__^]]^]]]]]]^^__^^^__`^^^^^^^^^^__```_```_____``aa``__```_____^_```abceddcbaaaaaaa````abccccbaaaaaaaaabdfgfdbaaaaabbccabbbbbbbbcccbbabdccccddeccccccccdeggggggghhhhgggabbbbbbbbbbbba`````aaaaa````````````````````````````````````````_____````````________^^^]^^^^^^^^]]]^^^^]]]^^^^^^^^^]]]]]]]]]]^^^^^^]^^^]]]]]]]]]]]]]]]]]]]]^^^^]]]]]]]]]]]]]]]^]]]]^^^^^^]]]]]]]^^^]]]]]]]]]]]]^^]]^_``^^^^^^^^^^______``______`````__```_______`````acedccbaaa`````````abcdcba```````````bcddcccbbbabbaaaabbbbdeeedcbbcccccdefddddddddfghhhgggggghhgggaaabbbbbbbbbba`````aaaaa````````````````````````````````````````^^____```````________^^^]]^^^^^^^]]]^^^]]]]]]]^^^^]]]]]]]]]]]]]^]]]]]]]]]]]]]]]]]]]]]]]]]]]]^^^^]]]]]]]]]]\\\\\\\\\]]^]]^]]]]]]]]^^^]]]]]]]\\]]]^^]]^_``^^^^^^^^^^^__________```__`____```______````_`abbbaa`````````````abcdcba````````b``adgiigfdca``_aaaabbbbggggfeeecccccdeffffeffggghijihhhggggggggaaaaaaabaaaa```````````````````````````````````````___________^^^^______^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^]]]]]]]]^^^^^^^^]]]]]]]]]]]]]]]]]]]]]]]]^]]]]]]]\\]]]\\\]]]]]\\\\\\]]]]]\\]^^^]]]]^]\[\]]]\\\\\\]^``^]]]^]]]_``_]]___]\Z]`aa`_`a`_^^_`ab``_^^__^^^_```^]^````__````````````_``aaabceeeedcba`````_accehihihgdb``_aabbaaabgghiihggffffghiiggghiihhhikkkigggggghhgga``aaaaaaaaa```````````````````````````````````____________^^^^^^^^_____^^^^^^^^^^^^^^^^^^^^^^^^]]]]]]]]]]]]]]]]^^]]]]]]]]]\\]]]]]]]]]]]]]]]]]]]]]\\\\\\[[\\\\]]]]]]]\\\\]]]]]]]\]_`````^^]\]^^^^^]]]]]]]^``_^]^]]\\\]^^^_```_^]_``aaaaa___``abcdba`````_```a``^`abba```__```````````abccdggggdcba``````aeggikljjigfdcbabccbbaabgghhhhhggffghiiiggghiiihijlmmlkjhhhhhggg`````aaaaaa`````````````````````````````````______________^^^^]]]^^^____^^^^]]]]]]^^^^]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\\\\\\\\\]\\]]]\\[\\\\\]]]\\\\\\\\[[Z[[\]^]]]]]\\\]]]^^^]]]^`abbaa^][\^`_^^^]]]]]]]^```___]^^]\[]_`````````__`cdc`_``abcddfdcaaa`````aaa`_abbba```^^__```````abcdefghiigeca``__`abdghijklkjjiggfffeeedcbbbgggghhhhgggghijjhggghiihhiklmmmmjkkjhggh````````````````````````````````````_``````__^^^^^^^^^^_^^^^]]]]]]]^^^__^^^]]]]]]]]]]]]]\]]]]]]]]]]]]]]]]]]]]]]]]]]\\\\[\\\\\\\\\\\\\\[[[[[[\\]]]]]]]]\\\[ZZZ[]]^]]]]]]]]]^^]]]]\^`aaa``\\^````_^]]\\]]^^_``````_``_]\_`ccba``````_`dedbabcdeeeeedb```__````aa`````````_^__```aaabbcefggiiiihgggdb````bcdefffghijjjiihhhggggedddhgggghhhhhgghiihhhggggggfggijlmmlmmkhggi````````````````````````````````_______````__^^^^^^^^^^^^^^]]]]]]]]^^^^^^^]]]\\\]]]]]\\\\\]]]]]]]]]]]]]]]]]]]]]]\\\\[[[[[[[[[[\\[[\\\\[[\[[[\]]^^^^^^^^]]\[ZZ[\\^^^]]]^^]]]]]]]]\]_``_^][_ceecba`_^^^_`````aba`````_]^`bedb```````abccddfffggffeecba```____``a``_``aaaaa`aabbcddeefgghijiiiiihhhgfdbabcddccaabehjjjjjiiiijihggggihhgghhhjihhhhhgihggggfeefggiklmlnnligik``````````````````````````______________``__^^^^^^^^^^^^]]]]]]]]]]]]]^^]]]]\\\\\\\\\\\\[[\]]]]]]\\\\\\\\\\\\]]]][[[[[[[[[[[[[[[[[[[[[\\\]\\\\]^_^_____^^]][[Z[[\^^^^^___^^^^^^^^]^___^]\^bgigfefbba``acdbbcccca`___^^_acfeca`````addcbdfhhggffeefedcccba````bccbbbcefggfeeeeffgggghhijkkghjkkjihihgfedddedba``eiiiijjiiijjjjiiiijiihhhhhjihhiihhiihhhggfgghijlmmlmlkiijl`````````````````````____________^^_________^^^^^^^^]]]]]]]]]]]]]]]]]]]]\\\\\\\\\\\\\[[[Z[\\]\\\[[[[[[[[[[[[[\\\[[[[[[[[ZZZZZ[[[[[[[[\]]^]]]]^__^______^]\\[[\\]^^^^_```______````````__`cgggeefdcbaacdefeeeedb``_^^_acegfdbaabbadffdcegihgeeeefgfeeffeecbcdegggggghjkjigggghhiiiiijjjkkhijkkkjiiiihggfeedddbadiiiiiiihhiijjjjkkkkjjihhhiiiijkkkiijklkjiijjklllmlkjijkll````````````````````__________^^^^^^________^^^^^^^^]]]]\\\]]]^^]]]]]]]\\\[[[\\\\\\\[[[[YZ[\\\[[ZZZZZZZZZZZZZZ[[ZZZ[[[[[ZZZZZ[[[\[ZZ[\]^_^^]]^_`^^_____^\\\\\]]^^^^__``a`__````abbbbaaaaabbcccddcba``bceggffedb`a`_`adgggfedccdddeggeefgigfdcdefffeffgfffefghijjiiikllkjjiiiiijjjjjjjjjjkkjjjjkkiijjihgfddefdadhijjjiihgghijjklmkkkkjihgihijkmnnijkmnnnmjkklllkkkihhjlmm```````````````````_____^_____^]^^^_____^^^^^^^_^^]]]]]\\\\]]]]^]]^^^^]][[[[[[\\]]]\[ZZ[ZZ[[\[[[ZZZZZ[[[\\[[[[[[XY[[[[[\\\]]]]^_```_^_``_____^^]````____^^^^^_``a```bdeecba```abadggfba`````abbaccb``acdgffeeca```abcdefffeeeffgffffggffjhgfeeffgfeefggigghiijjjijjkkkkjjjiiijkkjjiiijklkkjjjjjjjkkkkjihiihfddfhiiiihhhhhhhhikllnmmllkihikllmnnmllmnoonnllllllllkjiikmmm````````____`````___^^^^^^____^^^^^^^^^^^^]]]^^^^]]]]]]]\\\]]]]]\\\\\\\\\\\[[[\\[\\\[ZZZZ[[[[[[ZZ[[\\\\\]]\\\[[[YZ\\\\\\Z[\]]^``````_^_````````____````````aaaa`````ceffdca````aadggeba`aaaaaa``aaa``bdfffefedbabbcdeffgeeffgghhggggffedffeddeefffeefgijiijjkkkkjjjjjjjjjjjijjklkjjjjjklllkkkjjjjjjjiihhijjiggghjjjjjiiiiiiiijkknnnnmljijlmllnnmmmmnnnnnmmmmmmmmmlkkmnnn``````_____________^^]]]^^____^^]]]]]]]]]]]\\]]]]]]]]]]]]]\\\\\\[[[[\\\\]\\[[[[[[\]]]\\\\\\[[[[[[\]^^^^^^^]]\\\\[\]^^]]]\\]^^_``baa`___`abccccba_`````````bccba````bdfggedb```abceggebaaaaaaaaaabbbaabceeeefffedeeffggggefggijjkjihggfecbbbcdefffffgghjkkkkllllkkkjjjjjjjjjjjkklkkkjkkllmlllkkkkjjiihhhghjlmkjijjklllkjikkjjjjjknnnnnnljlnmkkmnmmmmmnnnnnnnnnnnnnnnnnnnn```________________^]]]]]^^___^^^^]]]\\\\\\\\\\\]]]]]]]]]]]\[[[[[[[\\]]^\\[[[[[[]_``````^^^]]\\\\]^__```__^]\\\\\^_`__^^_``____`ccba```abceffedcaabbbbaa```aa`````bdfgggfdcbabdefgggecbb`abcdddeeedcbbbceeeggggggggggggggghjkklllkjihgfebbcdfgggggghijklkklllkkklkjiiijjkjjjkkllllkkkllmmmllkkkkkkjiihhhhjlmmlkkklmnnmlkkkkkkkkknnnoonmknnmjjlnmnmmmnnnnnnnnnnnnooopponn______^^___________^^]]]]]^^^^^^^^^]]]]]\\\[[[[[\\\\]]]]^]\\[[[[[[[[[\]][[ZZ[[\\^``aaaaa````__^^]^^_`````_^]\\\\^_``````aaa`````cccbaabccdefffedddeeedcb```___``bcdffffffeddefghggggfeeecdfffffggggfddddfffghiihhhhhhhhhhijkllllllkjjjhgffgghhiijjkkkkllkkkkkjjjlkjjijjjkkkkkklllllllmmmmmlkkkklmlkkjjjjjklllllllmnnnnmlkkklllmmnnnnonmlnnmkjmnmnnmmnnnnnnnnnnnnnoppponn____^^^^__________^^^^^^]]]]^^^^^^^]]]]]]]\\[[[[\\\\\\\\^]\[[[[[ZYYYZZ[\[[[[[\\]]^``````aaaaaa``____``aa``_^]]]]_`````aaaaaaaabcccccbbcdccddeeddefgggfdcdcb``abbdefgfffffffgghjkihggfffggijigffffggggghhggghjjjjiiiiiiiikkkkllkkllkkllkjijjjjjkkllmmmllkkkkkjjiikkkjjjjjkkkkklllklllmmnnmmllkllmmmmmlllllllllllllmnoonmmkklmmnnnnnnnnnnmnnnmmnonnnnnnnnnnnnnnnnnnopqpnnn__^^^^^^^^^^^^^^^^]]]]]]]]]]]]]]^]]\\\]]]]]\\[[[[[[[[[[[]]\[[[\\[[ZZZ[\\^^]\\\\]\]^___``abccccba```_``bca``_^^^__`````bcbcccbbcccccbaabcbbbbbbbbefggggfegfeeddddefggffggggghijkkjhgfffggjklkhgfgghijjjkkhhijkkkkjjjjjjjjkkkkkkkllkkkllkklkkkkkkklmmnmmlkkkkkkkjjkkkkkkjjkkkkllllkkllmnnnnnmllmnnmnnnnnnmnnnnnmllmmnnnnnmllmnnnnnnnnnnnnnnnoooqrqnnnnnonnnnnnnnnonopqonnn^^^^^^]]]]]]]]]]]]\\]]]]]]]]]]]]]]\\\\\]^^]]\\[[[[[[[[[[]\\[[\\]^]]\]]^_``_^]]\\]^____```acdddbbaa```acdba``__````````bdeeedbabbdccb```aaa```aaadegghggfgggggfedefggffghgghijjjjjhfeefggijlkigghijlllkkkjijjkllkjkkkkkkkkkjjjklllkkkllkjlkkjjkklklmmmmlkllllllkkjjkkkkkjkkkklllljkllmnnnnnnmmnnomnnnnnnnnnoponmkmmnnnnnnmmnnnnnnnnnnnnonnoqqrttrnnnnooonnnnnnnoonoqqoooo__^^^]]]^]]\\\]^]]]]]]]]\\]]]]^__^][[\^`__^^^^]]]]\[[[\\[[[\\^_`_^^^^``aadeb^[\_]^```abbdccddcba`aaabcddbbaaaabbabcbabdgffedcba`bbbbbbbbbbccddddeeffffffggghihggggggffgghhijkkkjjihgggggkkkkkkkjjjjkkkllllllkjkkkkkllkkjkkkkllllkkkkkkkklkkklmmlmlllmnnnmmllllmmllllkkjjjjklmmmmmmmmlmnnnnnnmmnnnnnnnmnnnnnnnnnnnnnnoonnnnnnnnnnmnnnnnnopqrstssronnnnnnnonnnopooooppqqqq^^^]]]]]]]]]]]]]]]]]]]]\\]]]]^__`_^\[[\^^__```__]\\\]^^_]]\\]^``aa````aaacdb`_````aabbcdddcdddccbbbccdddccccccccbcdeefggggfdcbbbbcccdcccabcdeeeeeefffggghhhhhhggggggggggijjkkkkkkjjihhiikklllkkkkkjkkkkkkllkjjjjjkkkllllklllllllllllkkkkkkjklllklllllmnnmmmmmmmmlllkkkjjjklmnnnnnnnnnnopnnnnmmmnnooonnnooopppooonnnnnnnnnnonnnnooooonnnnpqrsssrronnnoooonnnnnoonnoopqqrr]]]]]\\\\]^^^^]\]]]]]\\\]]^]]]^____][ZZ[]^`aba``^^^^^_```_^]^_`aaaa`````aabbbbbcbcccccdeedddeeeedddddddeeeeeeeeedefghihhggedcbbbcdeeeeedabdeffffdeeffggghhhhhhggghiiihiikkllllkkllllkkkkklllllllkkkkkkkkkklkjjjjjjkklmnnlmmmmlllmmmllkjjkkkkllkkkkkllnnnnnnnnnnnmlllkkjjklmnnooonooooopqooonnmmnopqqqppqqqqrrrqqoonnnnnnnoonnnopqqqponnnpqqrrrqqonnnopppnnnnooonnnopqrrr]]]]]]\\\]]]]]]\]]]]\\\\\\]\\\]^^^^]\ZZY\^`bcca````_____a`_^^_`aaaaaa```aaabcddcdddcccdeeeddefggfeeeeeeeffggggfffeefhjjigfecbaaadefgggffcdefggffcddefggghhhhggghjklmllllllllllkkkllmmmmlkkkllllllkkkkkkkklmmlkjjkjjklnnpmmmmmmllmmmmllllllllmmlkkkllmnnonnnnnnnnnnmmllkkllmnooopnnnnnnopppponnnnoprssrrrqrrsssssqqponooooonnnnoprrrqpoopqqrrrrrqoonnoppooooopppoooppqqrr]]]]]]]]]]\\\\]]\\\\\\\\[[\[[[\]\\]]\[[[]^`bcba`````````ba`___``bbcdddccbaabcddcdddcbbcdeedefgggfffeeeeefggggggfgeccfhiihggeddddffggggggefggggfeccddefggghhgggghklmnmmmmlllllkkkkklmmmllkkkkkllllllkkkkkmnnnnllkkkkklnopnnnnmmmllmmmmnnnnnnnnnmmlmmnnoopoonnnnnnnnnnnmmllmmnnooonnoooopprrrqonnnoprsssrsqrrsttttssrqppqqponnnnoprrrrqqqrrrssssrrpponoonnpqqqqqqqqqqqqqqq]]]]]]]]]]\\\\]][[\\\\\\[[\[[[\]\\]]]]^^_``bba``___``bcdcba``````abcdeeedcccdddceeddcbcceddefgggffffffffgggggggggfcbdfhijiihgggggggggggggggggffedddeefggghihgghikllllkklllllllllkkllllllkkkkllmmmmmlllllnnoonnmmllllmnopnnnmmmmmllmmnnnooonnnnnnnnnnooppooonnnnnoooonnnnmmnnnnnnopqqqqqrsssrpooooprrrrssqrrsstssttssrrsspponnnnpqrrrrrstssssssrrrqpooonnqrssrrrrsrrqqqqq\\\\\\\\\]^__^]\[[[\\\\\\]]]]]^_^^^^^_`aaaaaa```^__`acefddcbaaaa``abceefffffffffeffedccddddeggggggggggggggggggggggfeefhijjjjihhgggggggggggggggggfffffggggijjihijlmmllklllllllmmmmmmmlllllllllmnnnnnmmmmmnopqonnmmmmmmnnommmmmmmmlmmnnnooqponnnnnnnoooooooonnnnnnoooonnnnnnnnnnnnoopqqqqrrssrpooopqrrrrstqrrsssssssttttttrrqponopqrrrrrstsssssrrrrqpppqppqsttsrrssrrqqqrr[[[\\\\\[]`aa`][ZZ[[\\]]]^^_^_`````__`bdcbba```_```abdefeedccbbabbcdefgggghhggggfgggfedddddegggfggggggghggggggggghhggghjhhiiihgggggfffgggggfgggggggggggggikljjjknnnnmmnnlllmmnnnnnnmmmmmmmmmmnnnnnnnnnnnnoqqpnnmmmmmnnnnmmmmmmmmmmnnnnoorponnnoooooooonnoonnnnnnnnnnnnnnonnnnnnnnnoooooprrrrponnqqrrrrstqrrsssssrsstttttssrqpoopqrrrrrstssssrrrqrrqqrrrrqsttsrrsrrqqqrss^^\[[[[[\]`bca_][[\\^_``a```ab````````abbbcdddcccccdddddefffedddddeffggggggggggggggfdddeeeeffggggggggggggggggggghiiiihggefgggggfggffggggggffgggggggggghijlmljjkmnnnnnnnnnnmmnnnnnnnnnnmmmmmmnnnnmnnnnnmmmnpqqonnmmnnoonnlmmnnmmmmmnnooopqqponnoonnnnoooonooooonnooooooooooonnnnmmnnnopppppponnooqqrrrssstsssrrrrsrstuutssssrrqqqssssssttttssrqqqqrrssrrqrssssrrrqqrsssss^]]\[[[[[\_`bb`____``aab````aaa```aaaaabbbccccccdccccddeffgfeededdefgggggggggggggggedddeffffggggggggggggggggggggiiiiihggffgggggggggggggggggggggghhgggijkklmmkklmnnnnnnnnnnnnnnnnmnnnnnnnnnnnnnnnmnnnnmlkmnpqpnnmmmnnooonmmmmmmlllmnnopppqqpooooooooooooooooooonnoooooooooooonnnnnnoopqqqppponnopqqrrrssssssrrrrrrrssttsrsssrrrrrssssssttttsssrrrqrrssrrrrssssrrrqqrsssss]]]]\\[[Z[\_`bbaabbccccca````aba`abcbbbbbbbbccccdcbaaceffgggfeeeddefggghggggggggfgfeddddggggggggggggggggggffggghjjjihggfggggggggggggggfffhjjhgghiihghiklklnnmlmnnnmmmmmmnnnnnnnmmmnnnnnnnnnnmnnnmnnmmlkjmnoponmmmmnnopoonnmlllkklmnoppppqppooopppooonnnnppooooooooooppppoooooonnnoopqrrrqqqpoopqrrrrrrrsssrrrrrrsrrssssrssssssssssssstuuttssssssqrrsssrrrssssrrrqrrsssss]^^^^]\\[[[]_abbabcdddddccbaabccbcdddcbbcbbbbccddb```bdffggfeddeddefgghhgggggggggggfedeegggggggggghhihggggggghijkjjigggfggggggggggggggfefimmjhhiihgggiklklnnnmnnnnnmlllmnnnnonnmlmmnnnnnnnnmmmmmmmmmmlkkmnoponnmmmmnooonnnmlkkkklmnoppppqppppppqpppoonnnpponnnoonnnoppppoppppppooopqrrssqrrqqqqrrrrrrrrrssrrrrsssrrrsssrssssstttsssttuuutttsssssrrrssssssssssrrrrrrsssss^__`__^]]\\]^`ab``abccccggfddcddcdeeedccccccccddcb```adeeffedddeeefggghhggggggggggggfeffffggggggfghijjiiggggghjjkjihgggfggggggggggggggfegjnnliijgggfggijkklmmnnnnnnnmlmmnnnnonnmmmmnnnnnnnmmllllmmmnnnnnnopponnnllmmnnnnonnmllkllmnopppppppppppqpppooonnponnnnnnnnnoooooopqqrqqqoopqrrrrrrrrrrrsssrrrrrrsssrsstutsrrsssrsssttuuuttttuuuuuutssrrqrrrrssssssssssssssssssss`````````_^^``ab```abccchhggedeedeffedddddddeeeecba`abdeeeeedddefffggggggggggggggggggffgfffgggfffggijjjjhggghhijiihgggggggggggggggggggffgilmkiijggfffgghjjjklmmnnnnnmlmnnnnnoonnnnnnnnnnnmmmllmmmmnnnnnnopqqponnmmmmnnnnonnnmmmmmnnooppppppppppppppoooooponnnnnnnnooooonopqrssrrpppqrrrrrrssrsstssssrrrrssrrstuuutsrsssssstuuuuuuuuuuuuuuuutsrqqrrrrssttttssssttssssssssaaaabaaaa```abccbbbbcddeghhgfeeeffffeddeeeffffffddccccdeeeeeddefggggggggggggggggfggggfffffggggggfgghhiihggggghhhgggggggghhiiiihhggggggggghijiiiigggggggghhhhjkmmmnnnmlmnnnnnnonnnnnnnnnnnnmmnnnnnnnnnnnnopppoonnnnmnnnnnnnnnnnnnnnnnoopppppppppppppppppppponnnnnopppponnoprsttssqqqrrrrrrrsssstttttssrrrrrqrsuuvuussstttstuuuuuuuuuuuuuuvuuutsssrrrrsttttttttttuttttttttbbbbbbccbbbbddedeedddefffgggfdeefgffeddeeffggggfeeeeeeeeeeeeeefggggggggfggggggggffggffffffggggggggggggggggggggggggfffgghiijkkjiigggggggggggghhhhgggggggghggghjlmmnnnmlmnnnnnnooonnnnnnnnnnnnnnoonnnnnnnnoppponnnnnnnnonnnooooonnnnnnnoppppppppoooooppqqqqpppoooopqqqqponpprsttttrrrrrrrrqrsssstuutttssrrqqqqrtuvvutsstttttuuuuuuuuuuuuuuvuuuuuuurrrrsttuuuttttuuuuttttttabbccdddcb``acddedddeeeffgfeggefgggfedeffggggghggffeeffgdeeeeeggggggggggggggggggggggggghiihggggggghggggggggghhgghggggghillmmnmkifffgggggggghhhijiiiiijkkjjiijklmnnnmmlmmmnnnooooooonnnnmnnnnpqqponnnnnnnoopppoononnnoonnoooooonnnmnnpqpopppppoonnnnoqrsssrqpooooprssrpoopqrsttssrssssrrqsstttuuuuutsssssstuuuvwwvuuttuuuuuuuuuuuuuuvvuuuuuuuuuuuttssssttuuuuuuuuuuutttttcccccccddcbccdeedddddeeeggeeggfgggggeefgfhhgghihgggfffggfffffffgggghhggfggffgggfggggghijlkjhgggggghhgggggggijkjiggggghijmmmmmljhggggghhighhiijlmlllmmmnnnnmmmmnnnnnmmmmmmnnnooppoooonnnnnnnopppponnnnnnnopppppoonnnnoponooppponnnnnopqpoppppppoonnoprsttrrqqpqqrqrttsrqqrrstuuttssttsssrstttuuuuuutssssttuuuuvvwuuutuuuuuuuuuuuuuuuuuuttuuuuuuuuuuttttuuuuuuuuuuvuuuuuuueddccccdeeeeffeedddddeeefgedggfggggggfgggiihgijiihggfgggggggggfffgijjhgfggffggfegghhijklnmkiggfffghihhhhhhjlmnmlhhhijjkknnmmmkihgghhijkkhijkklmnnnnnonnnponnnnnnnnnnnmmmnnnnoppqppoooooopoooppppoonnnoooppppppponnnoppppppqqppoooopqrrqpppqqppoooopqstutrrrrrsstrsuuttttttuuuuuuttttttttttuuuuuuuutsstuuuuvvuuuuuuuuuuuuuuuuuuuvuuuttsssttuuuvvvuuuuuuuuuuuuuuuuvvuuuuuueedccddefffgggeddddeeeeefgdcfgfggghhgggghjjhhijiihggffggggggggfeghkmmkhgfffggggghhijklnnnnkiggfffgijjjiijklnnonmjkkllmmmnnnmmlkjhhijkllmjkklllmnnnnoonnnonnnmnnnooonnnnnnnnoopqqpppppppppoopqqqqpoooppppppppppppnnoopqqrqqrrqqppqqrssrrqpppppppoooprtuutsrrrssttstuuuuuuuvvwwvvuuuttttuuuuuuuuuuutssstuvuvwvuuuuuuuuuuuuuuuuuuvvuuttssttuuuuuuvvuuuuuuuvuuuuuuuuvvuuuuuudddddefgfffgggedeeeffffffgdcfgfggghihhhhhjkihijiihgggggggggghhgfhjmnnnkiggghijjiijkklmnonmkhggggghjkkkkklmnnonnmmnnnnnmmnnmnnnmmiijklmmnllllkklmnnnnnnnnnnnnnnnnppppppppoooppqqqppppqqqqoooprssrqpppqqqqppppppppooppqrrsrrssrrqqrstttsrrppppppppppqstuutssssssststtuuuuvwwxxxwvvuutttuuuuuvvvvuuuttstuvwuvvvuttsuuvvuuuvvvuuuvvvuutttuuvuuuuuuuuuuuuuuuuuuuuuuuuvvuuuuuuccddefggffeefffefgggggggggfeggfggghhhhiijlljiiihhhhhhhhhggghjjihjkmnnnmlihhijlllkkkkklmnmljhggghijklllmmnnnnnnmlnnnnnnnmmmmmnnnnkkllmnnnmnnmllmmoooooooonnnoooppppqqqqqqppqqqqqqppppqqqqoopqrsssrrqrrsrrqqqqqqqqqqqqqrstssssssrqstuuutssqqqqqqqqqqrstuuttttttssssttttuuwwwxxxwvvuuuuuuuuvvwwwvuuuuuuuuvwuuvvuuttuvxxvuuvvvvvvvvvuuuuuuvwvvuuuuuuvvvvuuuuuuuuuuuuvvuuuuuubcdefggggedddfgggghhihhhhigghhgggghhhhijlnmkijjhijkkkkkjkjjkmmlkjjklmmnnlkjjkllmkkjiiijknljihhhikllllmnnnnnnnnmmnnnnnnnnmmlmnnnnmmnnnnnnnnnnnnnooonnnnoopppppqqqppqqqqqqqqrsrrqppppppqqqpppqsssstssssssrrrrrrsssrssrrrststtttsrrstuuutsssssssssssssstuuutuuuuuuuttttstuwvwwxwwvuuuuvvvvvwwwxwwvuuuuuuvvvuuwwvuuuuwyywuuvvvvvvvvvuuuuuuvvvvuuuvvwwwwvvvuuuuuuuuuuwwvuuuuucdefggffgeccdfghhhiijjiijkihjighggghhijkmnnljkjijkmnnnmmnmlmnnnmiiiijlmnnmkjjkllkkjhgghinmkihhiilmmmmmnnnnmmnnnnmmmmmnnnmlllmnnnnnnnoooonoooopqrnnmmmnnnqpppppppoppqqqqqqrstsrqppppppppprqqrrsrrttssttsrssssstttsttsrrsttttttssrstuvuttttttttttuutttuuuutuuuuuuuuuttstuwvvwwwvvuuvwwxxwwwwxxxwvuuuuvvvvvuvwwwvuuvxzywuuvvvvvvvvvuuuuuuuuuuuuvvwxxxwwwvuuuuuuuuuuxwwvvvvveeeefggggggfefggggggggjkkkkjhggggghhijlmnnnnnmlkmllllmnonnmmmmmlijkllmmmnnnmlllmmmlkiiijnnmnnnlkklmnnnnnnnnooooonnnnnnnnmnnnmmnnmmnoqqonooppqqppnnmmnopprrqpppqqqrrqoopruttuuusqppppppppnoprtuutuuuutstuuutttttutttttttttssrstuutttsssssrsssstuuvvuutttuuuuvvvuuvvvuuuuutuuvwwwvwwwwvvvvwwvvvvvwvvvvvvwwvvvvvvvvuvwwwwvuvuuvvvvvwwwvvvvuwvvvvwwwvvuuuuuuvuuuuvvvwwwwvvvvffffggggggggggghggggghjljkkihggghhhhiiklnnoonnnmmlllmnnnnnnmnnmmkkllmnnnnnnnmmmnnnnlkkklonnnnnnlklnnnnnnnnooppppponnnnnnooonnnnnnnnpqqonoppqqqpponnnopppqppooppqqrrqppqsuuuuvvtrqqqqqqppopqrtuutuuuuttuvvuuutttttttttttttsssstuuuuuuttttttttssuuvvuuttuuuuvwwwvvwvvvvuuuuuvwwwwwwwwwwwwwxwwvvvvwvvvvvwwwvvvvvvvvuvwwwwvuvvvvvvwwwwwwvvvvvvvvvwwwwwvvvvvvvvuuvvvvwwwwwwvvggggghhhhhhgggijhhhgghjlmmmlkiiiiiiiiijknnnonnnnlmmnnnnnnnnnnnnmnmmmnnnnnnnnnmnnnnnnmmmnnnnnoonnlmnooonnnoopqqqqqqponnnnqqqponnonoopqqpoppqqqqqpppoppqppoooooppqqrsrqqrtuuuvwwutssrrrrqqqqrsuuuttuuuuuuvwvuuutttttttttuuttsstuuvuuuuuuuuuuuutttuvvvuuuuvwwwxxxxwwwwwvvvuvvwwxxwwwwwxxxxxxwwvvvvwvvvvwwwwvvvvvvvvvvwwwwvvvvvvvwwwxxxwwwwwvvvvvwwxxxxxxxxxxwvvwwwwwwwwwwwwggghhhhhhihhhhjkjjjihijknnnmlkjkijkkjjklmmnnnnmmlmnnnnnnnnnnnnnmnnnmmmnnnnnnnnnnnnnnnnnnnnnnnnnnmnpqpooooopqrrrrrrqppooorrrqppppppppqqpoqqqqqqqqqqpqqqqpoooopqqrsttsrqrsuuuvwwvuttttsssrrrrsuuutttuuuuuuvvuuutttttttuuuuttsstuuvvvvvvvvvvvvuuuuuvvvvuuvwwxxxxxxxxxxxwwvvvwwwwwwwwwwxxxxxxxwwwwwwwwwwwwwwvvvvvvvvvwwxxwwvvvvwwwxxxxxxxwwwvvvvvwwxxxxxxyyyyxwwxxxwwwwwwxxxgghhgghhhhhhhikllllkjijjkllkjiiijklmmmmnmmnnnnnnmnnooonnnmmnnnnmnnmmmmmmmnnnmmnnnnnnnnnnmnnnnnnnnoqqqpooppqrrssrrrqqqqqqqqrqqqqrrqpqqqqqrrrrqqqqqqqqrrqppppqqrssuuutrqqrttuuvvuuuuuuuuttssstuuutuuuuuuttuuuuuuuuuuuuuuuvttsstuuvvvvvvvwwvvwvvvvwvwwwvvwwwxxxxxxxxxxxxwwwvwwwwwwwvwwwwxxxxxxwwwwwwwwwwwwwwwwwwwwwwwxxxxwwwwwwwxxxyyyxxxxwvvvvwwxxxxxxxyyyzyxxxyxxwwwwxxxxghiihgghhhhhhikmnnnmkjjkllmmlkklklnnnnnnnnoppooonnopppoonmmnnnnnmnnnnnnnmnnmmmmnnnnnnnnonnnnmmnnopqqqppppqqrsssrrrrrrrrrpqqqqqrsrqqqqrrrsssrrrrrrqqqrsrrrrrrssttuuutrqqrttuuuuuuuuuuuuuuuttuuuuuvvvvvutssttuuuuuuuuuvvvwuutttuuvvvvvvvwwvwwwwwxxwwxxwwwxwwwwwwwwxxxxxwwwwwwwwwwwwwwwwxxxxxxxxwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxyyyxxxxwwwwwwwxxwwxxxxyyzyxxyyyywwwxxxxxgijjhghiiiihijlnnnnnmlllnnoonnnolnnonnnnooppppoonoppqpponnnnoponnnnooonnnnnnmmmnnoooooopopponnnopqqqppppqqrrrrrrsssrrrqqqrrrqqrsrqpprsttttssrrrrrrqqstttsssttttttuutrqrsttuuuuuuuuvvvvvvuuuuvwwvwwwwxwutttuuuuuvuvvvvwwxvuuuuuvvwwwwwwwwwwxxwwxxwxxxxwxxxwwwwwwwwxxxwwwwwwwwxxxxwxxxxxxxyyyxxxwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxyyxxxxwwxxxwwwxxxxxxxxxxyyxxyyyyxxxxxxxxhjkkihhiiiiiikmnmmnnnmnnnnnonnopnnoonnnnnnoooonnooppqqppnnnopqponnpqqqppnnnnmmnnppqqppqqqrrponopqrrqpppqqqrrrrrrttssrqppssssrqrrrqpprstuuttsrrrrsrqrsuuuttttttttstttsrsttuuuuuuuuvvvwwwwwvvwxxxxxxxxyywuuuuuuvvvvvvwwwxxwwvuuvwwxxxwwwwwxxyxwwwwxxyyxwxxxxwwwwwwwwwwwwwwxxxxxyyyxxxxxyyyyyyyxxwwwwwwwwwwxxxxxxxyxxxxxxxxyyxxxxxxyxxxxwwwyyxxxxxxxxxxxxxyyxxxxyyyxxxxxwwwilnnnnnnkjhhjlnnmmmnnonnmnnoppoonnoonnnnnoonnnopnooopppqqqrrrqqpponprsqoponnnnnnqqqppqrrrsssrqqqqqqqqrrrttuuuutttsrrrqqprrsrqqqqqqrsstuutuuuuuuusrrssuuvuuuutttsttttuuuuuuuuuuuuuvvwxxyywxxxxxxxxxxxxxxwvvwwxxxxwwwwwwwxyyyyyyxxxxxxxxxxwxyxxwwwyxxxwwwwvwwwwwwxwwwwwwwxwxxyyyyyxxxxxxxxxyyyyxwvvvwwwwwwxxxxxxxxyyxxxwwwyyzzyxxxwwxxxxxxwxxxxxxxxwwvwwxyzzyyyxyyyyxxxxwwilnnnoonkjiikmnnmmnnooonnoopponnmnopoooonnnnnnoopppppqqqqrrrrrrqqpoqssrppooooopprrrrrrssssssrqqqppqrssttuuuuuuuuutrrrrqqrsttssssrrsstuuuuuuuuuuusssstuuuuuuuutttttuuuuuuvvvvvvvvvvwwxxyyxxxxxxxxxxxxxxxxwxxyyyyyyyxxxyyyyyyyxxxxxxxxxxxxxyyyxxxxxxxwwwwwwxxxwwxxxxxxxxxxxxyyyyyyxxxxxxxxxxyyyxxxwwxxxxxxxxxyyxxxyyxxxxxxyzzyxxxxxxyyyyxxxxxxxyyyyxxwwxyyzzzzyyyyzzyyyyyyjmoopqpnllkkmnnnnnnnopooppqqpnmklnopqppqnooppppqsrrrqqqqrrssssssrqqrstsqpppppqrrrrrsssssssssrrqqpqrstuuuuuuuuuuuutrrrrrrstuuuuuutttuuuuuuuuuuuuuuutttuuuuuuuuuuuuuuuvvvvwwwwwxxxwwwxxxxxyyyyyyxxxxxxxxxxyyzzzzzzyyyyyyyyxxxxxxxxxxxxxxyyyyzzyxxyxxwwwwwwxyyyxxxyyyxxxyyyyyyzzzzyxxxxxxxxxxxxxyyyxxyyzzyyyyyyyyyyyyyyyyyyzzzyxxxyzz{{zzzyyxxxyzz{zzyyyyyz{{{{zzzz{{{{{{{{imoopqpnmllmnnnnonnopqpppqrrpnmklmopppppopqrrrsssssrrrrrrrstttttrrqrsssrqqqqqrrrqrrrsssssrrssssrrrstuuuuuuuuuuuuutsrrssstuuvvuuuuuuuuuvvvvvvvvuuuuuuuuuuuuuuuuuuuuvvwwwwxxxxxxyywxxxxxxxyyyyyxxxxxxxxyyyyzzyyyyyxxxxxxxxxxxwwwwwxxxxxyyyyz{zzyyyxxxxxxxxyyyyxxyyyyyyyyyyyyyzzyyyxxxxxxxxxxxxxxxyxyyzzzzzyyyyyyyyyyzz{{{{{{zyxxyz|||||{{{zyyyz{|||{{zzzz{||||||{{{{{|||||ilnnooonnmmmnnnnoooppqqppqqrqonmlnnonnnnppqrrrssrrrrrrrrrrstttttrrrrssrrrrrrrrrsqqqrrrrrrqqrtuttttuuuuuuuuuuuuuuuutssttttuvvvuuuvvvvvvvvwwwwvvvvvvuuuuuuvvvuuvvvvvwwxxxxxxxxxxyyxxxxxxxxxxxxxxxxxxxxxyyyyyyxxxxxxxyyyyxxyxxwwwxxxxxxyyzzzz{{zyyzyyyyyyzzyzzyxxyzyyyyyyyyyyyyyyxxyxxxxxxxyyxxwxxxxyyzzzzzyyyyyyyyzz{{||||{{{yyyz|||}|||||{zzz{||}||||{{{{||||||||{{||||||jmnnnoonnnnnnnnnppoppqqpppqqqponnnnnnnnnopppppqqqrrrrrrrrrsstttsrrrrrrrrssstttttsrrqqqrrrrqstuutuuuvvuuuuuuuvvuuuuuuuuuuuuuuuuuvvvvvvvvvwwwwwvvvvvvvvvvvwwvvvvvwwwwxxxxxwwwwxxxyxxxxxxxxxxxxxxxxyyxxxyyyyxxxxxxxzz{{{{{{yyxxxxxyxxxyyyzzzz{{zyyzyyyzzz{{{{{zyyz{zzyyyyyyyyyyyxxxyyyyyyyyyyyyyyyyzzz{{{zzyyyyyyyyz{|||||||||{zz{|}}}}}||||{{{||}}||||||||||||||||||||||||lnonnppnponnnoooppoopqqpqqqqqpponooonopqqqqpoopqsssrrrrrqrrsssssrsssrrrrsstuuuvvuusrrrsttsrsuutsuuuvvvuuuuvwwwvuuuuuvvuuuuuuuuuvvvvvvvvvwwwwwwwvvvvvwwwwxxwvvvvwwxxxxxxxwwwxxxxyxxxxxxxxxxxyyyyyzyyxxxyyyyyyyyyyzz{|||||zzyyxyyzyyyyyzzzyz{zzyyyyyyzzz{{|||{zz{|{zzzzzyzyyzyyyxxzyyyyyyyyyz{{{{{||||||||zzzzzzzz{{||||||||||{{||||}}}||||||||}}}||||||||||||||||||||||||npqoopqpqponooppppoopqqprrqqqppppppooprsttsqpqrstttsrrrqqqrrssrrssssrrrsssuuvwxxwvutsstuutssuusqtuuvvvuuuuwxxxwvuuuvwwvuvvvuuuvwvvvvvvvvwwwwwwwwuvvwwwxxyxwvvvvwxxxxxxxxwxxxxxyyxxxxxxxxxxyyzzzzzzyxxxyyzzzzzzz{xyzz{{{{{zzyyyzzyyyyzzzzyzzzyyyyyyyyzz{{||||{{|||{{{zzzzzzzzzyyyzzzyyyyzxy{||}}}~~~~~}}|{{{{{{{{{|||}}|||||||||}|||}|||||||}}}}}||||||||||||||||||||||||ppppppppqqqppqqqpppppqqqrrrrqppoqqqrstuvuutsrsttuuutsrrrqqrrrrrsrrssttsstuuvvvvvvuuutuuvwvuutsrruuuvvwwwxwwwwwwwvvvvwvvvvvvvvvvvvvvvvvvvvvvuvvwwwwwwwwxxyyxwvwwwyyyxxwxyyyxyyzzzxxxxxxwvxyz{||zyyzzzxwwxyyyzzzzzzzzzz{{{yyz{|||||{zyyz{|{{|||{{{||{{{|||~~|||||||||{{{{zzyzz{|||||||{zzz{||}}~~~~}|}}||||||||||}}}|||||}}}|||||||}~~}}||||||}}}||||||||||||||||}}||||||pppppppppppppqqqpppqqqqrsrrrqqppqqqrstuuvuutttuuvutsrrrrssrrrrrrrrsttuttuuvvvvvvvuuuuuvvwvuutssruuuuvvwwwwwwwwwwvvwwxwwwwwwwwwwwwvvvvvvvwvvvvvwwxwwwxxxxyyxwvwwwyyyxwwxyzzyyzz{zyyyyyyyxyyyz{{zzzz{{zyyzzzzzzzzzzzzzzzzzyyz|||||||{zzz{||||}}|||||||||}}~~~}|||}||||{zzzzzz{{|||||||||{zz{||}}}~~}}|}}}|}||||||}}}}}}}}}}}}|||}}|}}}}}|||||||}}}}}}}}}|||}}~~~}}}}}}}}||qqqqqpppooppqqrrqqqqqrrrssrrqrrrrqqrrtuuvvuuuuuuuutsrrrsuttsrqqqrrstuuuuvvvwwwvvvvvvvvvwvvuuttssuuuuvvvvwwwwwwwwwwxxyyyywwwwwwwwwwwvvvvvwwwvvwwwxxxxxxxxyyxwwwwwxxxxwxxy{{{{{{{{zzzz{{{zzyyyz{{{z{||||||||||{{{z{{{{zzzzyz{|}~~~}||{{|||}~~~~~~~}}}}}}~~~~~}||}~~~}|{zyyzz{||}}}}}}}|||{{||}||}}~}}}}}}}}}}}}}}}~~}}}~~~}}}}}}}}}}}}}||||||||}}}~~}}}|}~~~~~~~~~~~~rrrrqqqpooopqqrrrrrrrrrrssrrrrssrrrrrstuvvvvuuvvuutsstuuvuutrrqqqrsuuuvvvvvwwvvvvvvwwwwwwvvuuuuuvvvvvvvvwwwwwwwvwwxxyyyyxxxxxxxxxxwwvvvwxxxwwwwxxxxxxxxxyyyxxwwwxxxxxxyz{|{{{z{{zzzz{{{{{zz{{|{{z{|||}}~}}||||{{{{{{{{{{|||}~~~}||||}}~~~~}}~~~}~~}}}~~}|zyyzz||}}}}}}}}}|||||}}||}}}}~}}}~~~~~~~~~~~~~~~~~}}}~~~~~}}|||||}}}}}}~~}}|}~~~~~~~~ssrrrrqqooppqrrsrrrrrrrrssrrrrstrrrrrsssuuuuvuuuttttuuvwwvutsrrrrrtuuvvvvvvvvvvvvvwwxwwwwwvvvvvvwxxwwwwvwwwwwwwvwwxxxyyyxxxxxxxxxxxwwwwwyyxxxxxxxxxxxxxxyzyyyyxxxyyxxxyz{{|{zz{|zyyyz{{zz{|}~}|{zz{|}~~~~~~}}|||{{||||}}}}~~~~~~~~~}}}}}~~~~~~~~~~~~~~}}~~}~~}|{{{z{|}~~}}}}}}}|||}}~}}}}}}~~~}~~~~~~~~~~~}}}}}}~~~~~~~}}}}}~~~}~~rrrrrrrrpppqqrrsrrrrrrrrsrrrrrssrrrrrrrrtuuuuuuusstuvwxxwwuuttttttuuvvvvvvvvvvvvvvwwwwwwwwwvvwwwxxxxxwwwwwwxxwwwwwwxxxxxxxxxxxxxxxxxwxxxyyyyyxxxxxxxxxxxzz{{{{zzyzzyyyzzz{|{zz{|{zyyz{{{{|}~|{zz{|}~~~~~~~~}}}|||}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~}|||||}~~~}}}}}}}}}}~~~~}~~~~~~~~~~~~~~~rrrrrrrrqqqqrrrrrrrrrrrrrrrrrrrrsrrrrrrrstuuuuutrsuuvwwwwvuuuuvvuvvwwwvvvvvvvwwwwwwvvvvvvvvvvwwwxxxxxwwwwwxxxxwwwxxxxxxxxxxxxxxxxxxxxxxyzzzzyyxxxxxxyyyzz{|||||{z{zzyyz{z|||{z|||{{{{|||||}~~}|{{{|}~~~~~~~~~~~}}~~~~~~~~~~~~~~}~~~~~}}}~~~~}~~~~~~~~~~}~~~~~~~~~rrrrrsrrrrrrrrrrrrrrrrrrqrrrrrrqssrrrrqqstuuvuutrsuuvvvvwvuuuvwxwxxxxwwvwwwwwwxxwwvvvvvvuuuvvvwwxxxxwwwwwwxxxxwwxxxxxxxxxxxxxxxxxxxxxxyyzzzzzyyxyyyyyzz{z{||||||{{{zzzz{{|||{{|}}|||||||}||}}~}||{{|~~~~~~~~~~~~~~~~~~~}~~}}~~~~~}}~~~~~~~rrrrrrssssrrrrrqrrrrrrrrrrrrsssttuuuuuuuuuvvvvuuuvvvwwwwwwwxxwwwwwwwwwwwwwwwwwwwwwwwwwxxwwwwwwxxwxxxyxxxvwwxyyyyxxxxxyyyyyxxwxxxxxxxxy{{{{{{zzxxyyz{{{{{{{||||||{{{{{||||||{{|}}}}}~~~~~~~~}}}z{|}}}~~~~~}~~~~~~~~~~}~~~~~~~ttsssttttssrrrrrsrrrrrrsssssttuuuuvvuuuuvvvwvvvvvvvwwwwwwwxxxxwwwwwwwwwwwwwwwwwwwwwwxxxxxwwwxxxxxxxxxxwwvwwxxyyyxxxxyyyzzyyxxxxxxxxxyz{{{{||{zzyxxyzzzzz{{||||||{{{{|||}||||||~~~~~~~~~~~~~~{|}~~~~~~~~~~~~~~~~uuuuuuuuutsrqrsstssrrrssttuuuuuvvwwwwvwwwwwwwwvvvvwwwwwxwxxxxxxwxxxxxxxxwwwwwwwwwxxxxxxxxxxxxxxxyyxxwwwwwwxxxyyyyyyyyzzzzzzyyyyyyyyzzz{{{||||{{zyyzz{{{{{{|||||||{{{||~~~}||}~~}}~~~~~~~~uuuuuuuvuusrqrtuuutsssttuuuuuvvwvwxwwwwwxxxxwwvvwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyxxwwwxxxyyyzzyyzzzzz{{{||{{{zzzzzz{{{{{{{|||||{{||||||||||||||{|{{{|}~~}|}~~~}}~uuuuuuuvvutrrsuuuuutttuuuuuuvvwwvvwvvvvwwwwwwvvvwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwxxxxxxwwwxz{z{{{{{{{{{{{{||||||||||{{{||||||{{{|||||||||}}|||||||||||{{{|}~}}}~~}}}uuuuuuuvvutsstuvvvvuuuvvvvvvvvwwvvvvuuvvwwwwwwvvxwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwxxxyyyyxwwxy{||||||||||||||||}~~~}}|||||||||||{{||||||{||||||||||||||||||||}~}}~~}~uuuuuuvvvuuttuvwvwwwwwwwwwwwwwwwvwwvvvvwwwwxwwwwxwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyz{{{yxwxz|}|}}}|||||||||}}~~~}}}}|||||||||||||||||||||||}}}}}}}}}}}}~~~uuuuuuvvvuuttuvwvwxxyyxxxxwwwwwwwxxwwwwxwwxxxxxwxwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyzz{|||{yxxz||}}}}}|||||||}}~~~~}~}|||||}||||||||||}}}}}}}}}~~~~}~~~~~uuvvvvvvvuuuuvwwxxxxxxxwwwwxxxxxwwwwwwwwxxxxxxwwwwwwwxxxwxyyyxxxxxxxxxxxyyyyyxxxxxxwwxxxyyyz||||||{zzz|||||}}||||||}}~~~~~~~~}}}|}}~~}}}~~~~}}~vvvvwwwwvuuuvwxwxxxxxxxwwwwxxxxxwwwwwwxxxxxxxxxxxxxxxxxxxxyyxwwxxxxxyyyyzzzzzyyyxxxxxxxyzzz{|||||||{{||||||}}}||||}}~~~~~~~}}~~~~~~wwwwwwwwwvvwxxxxxxxxxxxxwwxxxxxxwwwwxxyyyyyyyyxxxxxxxxxxxyyxwwwxxxyyzz{{{{{{{{zzyxxxxyyz{{||}}|||||||||}|||}}}|||}}~~~~wwwwwwwvwwwwxyxwxxxxxxxxwxxxxyyywwwxxyyzzzzzzzyyyyyyyyyyyyyxxxyzzzz{{{{{||||||{{yyyyzzz{|||}}}|{|||}}}}}||}~~~}}}}~wwwwwwwwwwwwxxxwxxxxxxxxxxxyyyyyxxxyyyzzz{{{{{zzzzzzzzzzyzzzzz|||||||{{{||||||||zz{{{{{||||}}}||||}~~~}}}}~~~}}~~~wwwwxxwwxwwwxxxxxxxxxxxxxxyyyyyyzzzyzzzz{{{{||||||||{{{{z{{||||}}||||||{|||||||||||||||||||}~~~}}}~~~~~~xxxyyyyyyxwwxyyyxxxxxxxxxyyyzzzz{{{zzzzzz{{|||||||||||||{||||||}||||||||||}}}}||||}}}||||||}xyyzzzzzzyxwxyyyxxxxxxxxyyyzzzzz||{{zzyyzz{|||||||||||||||}}||||||||||}}}}}}}}}}}}}}}}|||||}zzyxxxyzzzz{||{yyyzzyyyxyyyz{{||{|||{zz{||||||||||}}}|||||||||||}}||||||}}|~zzyyyyzz{{{{||{zyyzzzz{{z{{{|{{{|||||{||||||||||}}}}}}||~~~~~~~~~~~~~~~zzz{zzzz|||||||{yyzz{||||||||||{|||||||}||}||||}~~}}}}}}{{||||{{|||||||{yzz{|||||||}}|||||||||}~||}||||}~~}||}}~~|||||||{||||||||{{{{|||||||}}}}|||||||}}|}}}||}}~~}||}}~||}}}||||||||||||||||||}||}}}~~~}|||}}}|}}}}||}~~}}}}~}}}}}}}|||}}|||}}}||}}~~~~~~~~~~|}~~}}}~}}}}}}}}|}~~}|}}}}}~~~~~}~~~}}}~}}}}}}}|}}}}}}}}||}~~~}}}}}}}}}}}}}}}}||~}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}~~~}}}}}}}~~~~~~~}}}}}~~~~u~|vw||x~{}~ywzwxzuwuz{ywzzuz{v~}zyx}|wyuz||~|xvvwwuuvwvvv}xww|xzuww}|||{y}|yvxwsvvv~~uy||ux|y{vuyvwzuuuxwvwzyuwuz}}|wwzxxw}|}x{xyzwxxwuurxwz~{tuyzvww|vuyzwtxuuzyvwvxvuvuvvvwwxyywwwxvwx~y|yz~yw|y|uxwuxvtvwwwtwyxuvy{wuxwyyyxzwyx{xuuuuvuvvvtuwuxvvxw}uvuvwxyvuy|zuuzyy~|x|{y~}{vvwuvwwwwwuuuyvwwwwwvuuvwxuuvwwvuuvvvvvvvvvvvvvvvvvwx}{~|wzwuvwxxvuy}xu{xrvuyvtuv}|xvyuvwuvwwwwvvuuy~zutuuwvvvvvwwuvvwwvvuvvvvvvvvvvvvvvvvuyz{{x~{wuvuvvwxuuy}zx|ytww|uuu|v}x|x}}|xuuvuxwvvvvvvvvu~wxxwvvx{vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwuuuxztw|zzxtvuvvwxuuy}yrtuuuvuvxx}{~w}v||z{wt{v~ywuuwvwvvvvvvwwyyu{{uxzzywvvvvuuvvvvvvuvvvvvvvvvvvvvvvvvvvvvvwwuvuu||{|ywxv|z~vyurvxuvvwwuuy{xwutwxvvyxuuvz~wwvw}}yv{~yvwzvww{|}xutvzvuvvvvvvwwyzvvw}zvuzzwuuwyxwuvvwwvuuwvvvvvvwvvvvvvvvvvvvvvwwzwuu||~~uy{vyz~zsu}}uwxuxvuwvwwuuyuvzywvuvzuxvuv{{x||}z{||~ywy}xvvwuvyzuyxzvuwuvvvvvvvvvuvwyu|z{{uuwvvvvvvvvvvvwvvvuvvvvvvvvvvvvvvvvvvvvvwwwwwwwyzu|}{{uyxuu||y|yz{vxzyx|xuwxvwvwwuuyww}}uvuvxvuxuzusuy|yvw}{~wz|~~{~zwzutvuuvttwwquw|xuvuwvvvvvuuuuyyxx~zuywsvwvwwvuuuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwuvx{zxxx||{zxtxvyy}wvuy~}y|tuwu|vv}vxwvttvwvwwuuy||wzzwvuvxuvs{x|yyyux{yyx{wx}{{|z}zuzvswwwyuvuxuvuwuwzvtvvvvvuutx~}ww|zvzyvvz|zxxwuuuvxwwwvvvvvuvvvvvvuvvvvvvvvvvvvvwwwvx}y~|zy{wxwwwwwwwv}uwvz~|}yuwuu|{x||zvuvwxxvwuwytu||yxwxyyzvvux{qsy}~|}}v|~wv{~xx}vv}y{v~vvzxuxwwuxvw|yvvwwwwvvvvwwwwxxwyx~}z{|yuy|xwvvvvwxxwwwwwwvvvvvvvvvvvvvvvvvvvvvvwwwwxxxy{}{uwy{zuuwwwwwvvvy~vyuy|~}}|z|yyuwuu~|yvuuvvvvwwvx|}|yx{|{wuwzwvwv{}wxywx{~yxx{wvu|vy|~|~xvzyyuyxx|xx{sxvqtyyvvvvwwuwuvwwwwwvvvvvvvvvwuyz|{xwxvwvvvvwxxwwwwwvvvvvvvvvvvvvvvvvvvvvvvvwwwwvvuvvxxuutu|w~vwwvxwwvvvvvv{yvuwwu|{wz|||xuyu{|zyxwvuvyz}|~|wuy||wuvzxvxyz|xuwwuvz||{xvvvvwv|xuw~x|{~v}|{vuwu}{xuux~{wssxywwyxzuzzyuwwwwwwvvuuuuuuuuuwwz||uwwwxxvvvvvwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvwvvuuuuuvwxwuw{}}y||vuwwvuvvvvvvvvwvux{xvxuvxyy~xuvuz|yxwuuxuwz{vy|}xxuwyyxwwwxuw{yyyxvxwuuvvuuz{|~}zz~xvyurwz||ywwxuvwy{{{x~u{vywuu{x~~{yxz|y|||}wyyxvw}wx}x|ywwwwwwvvvvvvuuuuuuvuuuyzyywvuuuvuvvvvvvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwuuvvvvvwzzz{zwz~ywvvvwwuvvvvvvvvuwwuvwvxvtvux}vxxx|}}{xwvuuuvwwxvvvvuvuzzvutqrwxvuvwxxwwuuuvyyuwwvuvwutuvvwxvvywy{{zyyzvzzxyyxvwuuwzz{|z|{~ywvvxwwuxxxytruw{{wt}zxwy|xxyywvx}yv|||{wux~~vwwwwvvvvvvvvvvuuwwwuvywxtxyvuvvuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuvvwwwwwvvwwvuvvwwutuusuwvuwwvvvvvvvvvvwvuxwuuyuwwxxy~yvwx{{wz|{yuxzwuuuuvwxxuxwvvvuwwwuvywvyxwvuuvwxyvuuuwvuuvwwvvvwxvvvutuxwuuvvuuuuvwtuvtwvuuxyvuuvuvuwwtuyz{|~{uxvuvwsuwxszxutuv{uuuvu}vx{z}{wx|~wvu||w|}|~}||}yxxwvvvvvvvwwvvvvvvvvvuvwvvtvvuwwwxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuvvvvvvvwuuvvuvxvuxxvuvvwvvvvvvvvtwvuvvvvxuuutuvvyyyuxzxzyxyxtuvvvuutuuvuwwwvuuuuuwwvvuuvuuux{yvwwwwvuuvwxvvxywvwuvvuvwwvwvxzyvuuuuuwxwvvwvyxwvuwuuwxywvuvtxwuyyuuttuvvwyyzvtvutxwwvwtywsww{vwzyuz}|xx~zuwzz||xz}wvvwyzzxwwusvxvvvvvvvvvvvvvvvvuuuvwwywwwuuwuuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxwwvvvvvvvwvvuvvwwxxwzytuwvvwuuwvvvvvvvvyytuvuvxuwzuuyvuuvyuutvwvsxvvzuwvxxvxsvxwwxwvuuvwvvxxuuvvvuuwurtwwwwvvuutwxuuwxwwvvwvuuvwuuuwxxxwwwuuwwvvwuvvsuwuwwuuwvuywuwuvzvvuwwxwuvwxuuxxvxwxwuuz{vw|wusuytvwwz~|wuzxw}||t~yyuvuuww}z|~xvxwwwutuuxwx{tvvuuvvvwuvvvvvvvwvuxwuxuvxwvxvuwvvvvvvvuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuvwwvuuvwxwvwwwutwyuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwvvvvvvuuvvvvvvvwvvwwvvvwuuvvwwwxvvvvvvvvwwwwwwwwvvvvvvvvvvvvvvvwvvvvvvvvvvvvvvvvvvvvvvvvwwvvvvwwvvvvwwwwvvvvvvvvvvvvvvvvuuvwwwvuvuuuvwxxvvwxxwvvuuuuwz|}~|zwvuxwvvvwwwwxy{|}}}~|||w}uvxvxwvvvxyz||{{zzyywwvvvvwwwwvvvvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwvvvvvvvvvvvvvvvvvvwwvvvvvvvvvwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwvvvvvvvvvvvvvvvvuuvwwwvuvvvvvwwxvvwwwwvvwvvvvwxyvvvvvvvvwwvvvwwwuuuuuvvvxyywuuy||{xvuuuvuz{wuvvuwvvvvwxyxxxwwwvvvvvvvvvvwvvvvvvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwvvvvvvvvvvvvvvvvuvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuvvvvvvvvvvvvvwwvvvvvvvvwwvvuuuuuuuuuvvvwvvvvwwvxwwvvvvvwvvwxxwvuvvwwwwwuuuuwwvuvvvuvvvwvuuuuuuuvvvvvvvvwvvvvvvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuvvvvvuxxxwwvvuwvuuvvvvvvvvvwwwuuvwwvuuuuvwwvuuxwwxwvvxvvvvvvvuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwvvvvvvvvvvvuuvvvuuvvvvvvuvvvvvvvvvuvvvvvuuuuuvvwuvwwuuvwvvvvvvvvvwwvuuuvvvvwvvvuwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwvvvuuuuuvvvwvvuvvvvuwwwvvvvvvvuuuuvvwvuuuuvvuvvuuwwvvvvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwvvvvvuwwwwvvvvvvuvvwvuwvvvuuuuxwvvwxwwxxwwvvvvvvvvwxxvvvvvvvvvvvvuuuuuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwvvvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuvvvvvvvvvvwwvvvuuuuuvwwvvvvvvvuvvvvwwvuvvvvvvwwuuvvvuuuuuuvvvvuvvwwvuuuvvuuuvvvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv \ No newline at end of file diff --git a/app/src/main/java/com/zmy/yuv_convert/example/MainActivity.kt b/app/src/main/java/com/zmy/yuv_convert/example/MainActivity.kt new file mode 100644 index 0000000..3fb16ba --- /dev/null +++ b/app/src/main/java/com/zmy/yuv_convert/example/MainActivity.kt @@ -0,0 +1,64 @@ +package com.zmy.yuv_convert.example + +import android.graphics.Bitmap +import android.os.Bundle +import android.widget.ImageView +import androidx.appcompat.app.AppCompatActivity +import com.zmy.yuv_convert.Converter +import com.zmy.yuv_convert.Format +import com.zmy.yuv_convert.input.PackedByteBufferInput +import com.zmy.yuv_convert.output.PackedByteBufferOutput +import java.nio.ByteBuffer + +class MainActivity : AppCompatActivity() { + private val image1 by lazy { findViewById(R.id.image1) } + private val image2 by lazy { findViewById(R.id.image2) } + private val width = 720 + private val height = 1280 + private val yuv420Src: ByteBuffer by lazy { + val buffer = ByteBuffer.allocateDirect(width * height * 3 / 2) + assets.open("720_1280.yuv420").use { + val buf = ByteArray(1204) + while (true) { + val len = it.read(buf, 0, buf.size) + if (len < 0) { + break + } + buffer.put(buf, 0, len) + } + } + buffer + } + private val nv12Src: ByteBuffer by lazy { + val input = PackedByteBufferInput() + val output = PackedByteBufferOutput(Format.NV12) + input.provide(yuv420Src, Format.YUV420, width, height, intArrayOf(width, width / 2, width / 2)) + Converter(input).convert(output) + output.getOutput() + } + private val nv21Src: ByteBuffer by lazy { + val input = PackedByteBufferInput() + val output = PackedByteBufferOutput(Format.NV21) + input.provide(yuv420Src, Format.YUV420, width, height, intArrayOf(width, width / 2, width / 2)) + Converter(input).convert(output) + output.getOutput() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + val input = PackedByteBufferInput() + val output = PackedByteBufferOutput(Format.RGBA) + input.provide(nv12Src, Format.NV12, width, height, intArrayOf(width, width)) + Converter(input).convert(output) + val bmNV12 = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + image1.setImageBitmap(bmNV12) + bmNV12.copyPixelsFromBuffer(output.getOutput()) + val bmNV21 = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + input.provide(nv21Src, Format.NV21, width, height, intArrayOf(width, width)) + Converter(input).convert(output) + bmNV21.copyPixelsFromBuffer(output.getOutput()) + image2.setImageBitmap(bmNV21) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..60c71e5 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a571e60 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61da551 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c41dd28 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..db5080a Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..6dba46d Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..da31a87 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..15ac681 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b216f2d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..f25a419 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e96783c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..2432d11 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..9da6f8a --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + yuv_convert + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..1731efb --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/test/java/com/zmy/yuv_convert/example/ExampleUnitTest.kt b/app/src/test/java/com/zmy/yuv_convert/example/ExampleUnitTest.kt new file mode 100644 index 0000000..a6d2746 --- /dev/null +++ b/app/src/test/java/com/zmy/yuv_convert/example/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.zmy.yuv_convert.example + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c8e9956 --- /dev/null +++ b/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + ext.kotlin_version = "1.5.21" + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:7.0.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..98bed16 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f6b961f Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..6f3d795 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Feb 18 11:16:52 CST 2021 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/publish-maven.gradle b/publish-maven.gradle new file mode 100644 index 0000000..09c3227 --- /dev/null +++ b/publish-maven.gradle @@ -0,0 +1,105 @@ +apply plugin: 'maven-publish' +apply plugin: 'signing' + +task androidSourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.source +} + +ext["signing.keyId"] = '' +ext["signing.password"] = '' +ext["signing.secretKeyRingFile"] = '' +ext["ossrhUsername"] = '' +ext["ossrhPassword"] = '' + +File secretPropsFile = project.rootProject.file('local.properties') +if (secretPropsFile.exists()) { + println "Found secret props file, loading props" + Properties p = new Properties() + p.load(new FileInputStream(secretPropsFile)) + p.each { name, value -> + ext[name] = value + } +} else { + println "No props file, loading env vars" +} +publishing { + publications { + release(MavenPublication) { + // The coordinates of the library, being set from variables that + // we'll set up in a moment + groupId PUBLISH_GROUP_ID + artifactId PUBLISH_ARTIFACT_ID + version PUBLISH_VERSION + + // Two artifacts, the `aar` and the sources + artifact("$buildDir/outputs/aar/${project.getName()}-release.aar") + artifact androidSourcesJar + + // Self-explanatory metadata for the most part + pom { + name = PUBLISH_ARTIFACT_ID + description = 'yuv convert' + // If your project has a dedicated site, use its URL here + url = 'https://github.com/IAmCodingCoding/yuv_convert' + licenses { + license { + //协议类型 + name = 'MIT License' + url = 'https://opensource.org/licenses/MIT' + } + } + developers { + developer { + id = 'IAmCodingCoding' + name = 'mapyu zhang' + email = '616312897@qq.com' + } + } + // Version control info, if you're using GitHub, follow the format as seen here + scm { + //修改成你的Git地址: + connection = 'scm:git:github.com/IAmCodingCoding/yuv_convert.git' + developerConnection = 'scm:git:https://github.com/IAmCodingCoding/yuv_convert.git' + //分支地址: + url = 'https://github.com/IAmCodingCoding/yuv_convert/tree/master' + } + // A slightly hacky fix so that your POM will include any transitive dependencies + // that your library builds upon + withXml { + def dependenciesNode = asNode().appendNode('dependencies') + + project.configurations.implementation.allDependencies.each { + def dependencyNode = dependenciesNode.appendNode('dependency') + dependencyNode.appendNode('groupId', it.group) + dependencyNode.appendNode('artifactId', it.name) + dependencyNode.appendNode('version', it.version) + } + } + } + } + } + repositories { + // The repository to publish to, Sonatype/MavenCentral + maven { + // This is an arbitrary name, you may also use "mavencentral" or + // any other name that's descriptive for you + name = "yuv_convert" + + def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" + def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/" + // You only need this if you want to publish snapshots, otherwise just set the URL + // to the release repo directly + url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl + + // The username and password we've fetched earlier + credentials { + username ossrhUsername + password ossrhPassword + } + } + } +} +signing { + sign publishing.publications +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..aec846e --- /dev/null +++ b/settings.gradle @@ -0,0 +1,3 @@ +include ':yuv_convert' +include ':app' +rootProject.name = "yuv_convert" \ No newline at end of file diff --git a/yuv_convert/.gitignore b/yuv_convert/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/yuv_convert/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/yuv_convert/build.gradle b/yuv_convert/build.gradle new file mode 100644 index 0000000..3635642 --- /dev/null +++ b/yuv_convert/build.gradle @@ -0,0 +1,57 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' +} +ext { + PUBLISH_GROUP_ID = "io.github.IAmCodingCoding" //项目包名 + PUBLISH_ARTIFACT_ID = 'yuv_convert' //项目名 + PUBLISH_VERSION = 'v1.0.0' //版本号 +} +apply from: "${rootProject.projectDir}/publish-maven.gradle" + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 30 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + ndk{ + abiFilters 'armeabi-v7a','arm64-v8a' + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + externalNativeBuild { + cmake { + path "src/main/cpp/CMakeLists.txt" + version "3.10.2" + } + } +} + +dependencies { + + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} \ No newline at end of file diff --git a/yuv_convert/consumer-rules.pro b/yuv_convert/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/yuv_convert/proguard-rules.pro b/yuv_convert/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/yuv_convert/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/yuv_convert/src/androidTest/java/com/zmy/yuv_convert/ExampleInstrumentedTest.kt b/yuv_convert/src/androidTest/java/com/zmy/yuv_convert/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..9a70738 --- /dev/null +++ b/yuv_convert/src/androidTest/java/com/zmy/yuv_convert/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.zmy.yuv_convert + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.zmy.yuv_convert.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/AndroidManifest.xml b/yuv_convert/src/main/AndroidManifest.xml new file mode 100644 index 0000000..807ef34 --- /dev/null +++ b/yuv_convert/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/yuv_convert/src/main/cpp/CMakeLists.txt b/yuv_convert/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..610b9ad --- /dev/null +++ b/yuv_convert/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.4.1) +set(CMAKE_BUILD_TYPE Release) + +include_directories(yuv_convert/include) +link_directories(${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/) +add_library( + yuv_converter + SHARED + yuv_convert/jni_yuv_convert.cpp +) + +target_link_libraries(yuv_converter + log + yuv + ) diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv.h new file mode 100644 index 0000000..a06e123 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_H_ +#define INCLUDE_LIBYUV_H_ + +#include "libyuv/basic_types.h" +#include "libyuv/compare.h" +#include "libyuv/convert.h" +#include "libyuv/convert_argb.h" +#include "libyuv/convert_from.h" +#include "libyuv/convert_from_argb.h" +#include "libyuv/cpu_id.h" +#include "libyuv/mjpeg_decoder.h" +#include "libyuv/planar_functions.h" +#include "libyuv/rotate.h" +#include "libyuv/rotate_argb.h" +#include "libyuv/row.h" +#include "libyuv/scale.h" +#include "libyuv/scale_argb.h" +#include "libyuv/scale_row.h" +#include "libyuv/scale_uv.h" +#include "libyuv/version.h" +#include "libyuv/video_common.h" + +#endif // INCLUDE_LIBYUV_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/basic_types.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/basic_types.h new file mode 100644 index 0000000..1bea67f --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/basic_types.h @@ -0,0 +1,68 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_BASIC_TYPES_H_ +#define INCLUDE_LIBYUV_BASIC_TYPES_H_ + +#include // For size_t and NULL + +#if !defined(INT_TYPES_DEFINED) && !defined(GG_LONGLONG) +#define INT_TYPES_DEFINED + +#if defined(_MSC_VER) && (_MSC_VER < 1600) +#include // for uintptr_t on x86 +typedef unsigned __int64 uint64_t; +typedef __int64 int64_t; +typedef unsigned int uint32_t; +typedef int int32_t; +typedef unsigned short uint16_t; +typedef short int16_t; +typedef unsigned char uint8_t; +typedef signed char int8_t; +#else +#include // for uintptr_t and C99 types +#endif // defined(_MSC_VER) && (_MSC_VER < 1600) +// Types are deprecated. Enable this macro for legacy types. +#ifdef LIBYUV_LEGACY_TYPES +typedef uint64_t uint64; +typedef int64_t int64; +typedef uint32_t uint32; +typedef int32_t int32; +typedef uint16_t uint16; +typedef int16_t int16; +typedef uint8_t uint8; +typedef int8_t int8; +#endif // LIBYUV_LEGACY_TYPES +#endif // INT_TYPES_DEFINED + +#if !defined(LIBYUV_API) +#if defined(_WIN32) || defined(__CYGWIN__) +#if defined(LIBYUV_BUILDING_SHARED_LIBRARY) +#define LIBYUV_API __declspec(dllexport) +#elif defined(LIBYUV_USING_SHARED_LIBRARY) +#define LIBYUV_API __declspec(dllimport) +#else +#define LIBYUV_API +#endif // LIBYUV_BUILDING_SHARED_LIBRARY +#elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__APPLE__) && \ + (defined(LIBYUV_BUILDING_SHARED_LIBRARY) || \ + defined(LIBYUV_USING_SHARED_LIBRARY)) +#define LIBYUV_API __attribute__((visibility("default"))) +#else +#define LIBYUV_API +#endif // __GNUC__ +#endif // LIBYUV_API + +// TODO(fbarchard): Remove bool macros. +#define LIBYUV_BOOL int +#define LIBYUV_FALSE 0 +#define LIBYUV_TRUE 1 + +#endif // INCLUDE_LIBYUV_BASIC_TYPES_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/compare.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/compare.h new file mode 100644 index 0000000..3353ad7 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/compare.h @@ -0,0 +1,111 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_COMPARE_H_ +#define INCLUDE_LIBYUV_COMPARE_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Compute a hash for specified memory. Seed of 5381 recommended. +LIBYUV_API +uint32_t HashDjb2(const uint8_t* src, uint64_t count, uint32_t seed); + +// Hamming Distance +LIBYUV_API +uint64_t ComputeHammingDistance(const uint8_t* src_a, + const uint8_t* src_b, + int count); + +// Scan an opaque argb image and return fourcc based on alpha offset. +// Returns FOURCC_ARGB, FOURCC_BGRA, or 0 if unknown. +LIBYUV_API +uint32_t ARGBDetect(const uint8_t* argb, + int stride_argb, + int width, + int height); + +// Sum Square Error - used to compute Mean Square Error or PSNR. +LIBYUV_API +uint64_t ComputeSumSquareError(const uint8_t* src_a, + const uint8_t* src_b, + int count); + +LIBYUV_API +uint64_t ComputeSumSquareErrorPlane(const uint8_t* src_a, + int stride_a, + const uint8_t* src_b, + int stride_b, + int width, + int height); + +static const int kMaxPsnr = 128; + +LIBYUV_API +double SumSquareErrorToPsnr(uint64_t sse, uint64_t count); + +LIBYUV_API +double CalcFramePsnr(const uint8_t* src_a, + int stride_a, + const uint8_t* src_b, + int stride_b, + int width, + int height); + +LIBYUV_API +double I420Psnr(const uint8_t* src_y_a, + int stride_y_a, + const uint8_t* src_u_a, + int stride_u_a, + const uint8_t* src_v_a, + int stride_v_a, + const uint8_t* src_y_b, + int stride_y_b, + const uint8_t* src_u_b, + int stride_u_b, + const uint8_t* src_v_b, + int stride_v_b, + int width, + int height); + +LIBYUV_API +double CalcFrameSsim(const uint8_t* src_a, + int stride_a, + const uint8_t* src_b, + int stride_b, + int width, + int height); + +LIBYUV_API +double I420Ssim(const uint8_t* src_y_a, + int stride_y_a, + const uint8_t* src_u_a, + int stride_u_a, + const uint8_t* src_v_a, + int stride_v_a, + const uint8_t* src_y_b, + int stride_y_b, + const uint8_t* src_u_b, + int stride_u_b, + const uint8_t* src_v_b, + int stride_v_b, + int width, + int height); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_COMPARE_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/compare_row.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/compare_row.h new file mode 100644 index 0000000..e95b9d9 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/compare_row.h @@ -0,0 +1,141 @@ +/* + * Copyright 2013 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_COMPARE_ROW_H_ +#define INCLUDE_LIBYUV_COMPARE_ROW_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) +#define LIBYUV_DISABLE_X86 +#endif +#if defined(__native_client__) +#define LIBYUV_DISABLE_NEON +#endif +// MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#define LIBYUV_DISABLE_X86 +#endif +#endif +// Visual C 2012 required for AVX2. +#if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \ + _MSC_VER >= 1700 +#define VISUALC_HAS_AVX2 1 +#endif // VisualStudio >= 2012 + +// clang >= 3.4.0 required for AVX2. +#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) +#if (__clang_major__ > 3) || (__clang_major__ == 3 && (__clang_minor__ >= 4)) +#define CLANG_HAS_AVX2 1 +#endif // clang >= 3.4 +#endif // __clang__ + +// The following are available for Visual C and GCC: +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || defined(__i386__) || defined(_M_IX86)) +#define HAS_HASHDJB2_SSE41 +#define HAS_SUMSQUAREERROR_SSE2 +#define HAS_HAMMINGDISTANCE_SSE42 +#endif + +// The following are available for Visual C and clangcl 32 bit: +#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) && \ + (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2)) +#define HAS_HASHDJB2_AVX2 +#define HAS_SUMSQUAREERROR_AVX2 +#endif + +// The following are available for GCC and clangcl 64 bit: +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#define HAS_HAMMINGDISTANCE_SSSE3 +#endif + +// The following are available for GCC and clangcl 64 bit: +#if !defined(LIBYUV_DISABLE_X86) && defined(CLANG_HAS_AVX2) && \ + (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#define HAS_HAMMINGDISTANCE_AVX2 +#endif + +// The following are available for Neon: +#if !defined(LIBYUV_DISABLE_NEON) && \ + (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__)) +#define HAS_SUMSQUAREERROR_NEON +#define HAS_HAMMINGDISTANCE_NEON +#endif + +#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) +#define HAS_HAMMINGDISTANCE_MSA +#define HAS_SUMSQUAREERROR_MSA +#endif + +#if !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A) +#define HAS_HAMMINGDISTANCE_MMI +#define HAS_SUMSQUAREERROR_MMI +#endif + +uint32_t HammingDistance_C(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_SSE42(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_SSSE3(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_AVX2(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_NEON(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_MSA(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_MMI(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_C(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_SSE2(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_AVX2(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_NEON(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_MSA(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_MMI(const uint8_t* src_a, + const uint8_t* src_b, + int count); + +uint32_t HashDjb2_C(const uint8_t* src, int count, uint32_t seed); +uint32_t HashDjb2_SSE41(const uint8_t* src, int count, uint32_t seed); +uint32_t HashDjb2_AVX2(const uint8_t* src, int count, uint32_t seed); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_COMPARE_ROW_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert.h new file mode 100644 index 0000000..026b153 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert.h @@ -0,0 +1,526 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_CONVERT_H_ +#define INCLUDE_LIBYUV_CONVERT_H_ + +#include "libyuv/basic_types.h" + +#include "libyuv/rotate.h" // For enum RotationMode. + +// TODO(fbarchard): fix WebRTC source to include following libyuv headers: +#include "libyuv/convert_argb.h" // For WebRTC I420ToARGB. b/620 +#include "libyuv/convert_from.h" // For WebRTC ConvertFromI420. b/620 +#include "libyuv/planar_functions.h" // For WebRTC I420Rect, CopyPlane. b/618 + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Convert I444 to I420. +LIBYUV_API +int I444ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I444 to NV12. +LIBYUV_API +int I444ToNV12(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert I444 to NV21. +LIBYUV_API +int I444ToNV21(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +// Convert I422 to I420. +LIBYUV_API +int I422ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I422 to NV21. +LIBYUV_API +int I422ToNV21(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +// Copy I420 to I420. +#define I420ToI420 I420Copy +LIBYUV_API +int I420Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Copy I010 to I010 +#define I010ToI010 I010Copy +#define H010ToH010 I010Copy +LIBYUV_API +int I010Copy(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert 10 bit YUV to 8 bit +#define H010ToH420 I010ToI420 +LIBYUV_API +int I010ToI420(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I400 (grey) to I420. +LIBYUV_API +int I400ToI420(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I400 (grey) to NV21. +LIBYUV_API +int I400ToNV21(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +#define J400ToJ420 I400ToI420 + +// Convert NV12 to I420. +LIBYUV_API +int NV12ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert NV21 to I420. +LIBYUV_API +int NV21ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert YUY2 to I420. +LIBYUV_API +int YUY2ToI420(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert UYVY to I420. +LIBYUV_API +int UYVYToI420(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert AYUV to NV12. +LIBYUV_API +int AYUVToNV12(const uint8_t* src_ayuv, + int src_stride_ayuv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert AYUV to NV21. +LIBYUV_API +int AYUVToNV21(const uint8_t* src_ayuv, + int src_stride_ayuv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +// Convert Android420 to I420. +LIBYUV_API +int Android420ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// ARGB little endian (bgra in memory) to I420. +LIBYUV_API +int ARGBToI420(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// BGRA little endian (argb in memory) to I420. +LIBYUV_API +int BGRAToI420(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// ABGR little endian (rgba in memory) to I420. +LIBYUV_API +int ABGRToI420(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGBA little endian (abgr in memory) to I420. +LIBYUV_API +int RGBAToI420(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB little endian (bgr in memory) to I420. +LIBYUV_API +int RGB24ToI420(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB little endian (bgr in memory) to J420. +LIBYUV_API +int RGB24ToJ420(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB big endian (rgb in memory) to I420. +LIBYUV_API +int RAWToI420(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB16 (RGBP fourcc) little endian to I420. +LIBYUV_API +int RGB565ToI420(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB15 (RGBO fourcc) little endian to I420. +LIBYUV_API +int ARGB1555ToI420(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB12 (R444 fourcc) little endian to I420. +LIBYUV_API +int ARGB4444ToI420(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB little endian (bgr in memory) to J400. +LIBYUV_API +int RGB24ToJ400(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_yj, + int dst_stride_yj, + int width, + int height); + +// RGB big endian (rgb in memory) to J400. +LIBYUV_API +int RAWToJ400(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_yj, + int dst_stride_yj, + int width, + int height); + +// src_width/height provided by capture. +// dst_width/height for clipping determine final size. +LIBYUV_API +int MJPGToI420(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int src_width, + int src_height, + int dst_width, + int dst_height); + +// JPEG to NV21 +LIBYUV_API +int MJPGToNV21(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int src_width, + int src_height, + int dst_width, + int dst_height); + +// JPEG to NV12 +LIBYUV_API +int MJPGToNV12(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int src_width, + int src_height, + int dst_width, + int dst_height); + +// Query size of MJPG in pixels. +LIBYUV_API +int MJPGSize(const uint8_t* sample, + size_t sample_size, + int* width, + int* height); + +// Convert camera sample to I420 with cropping, rotation and vertical flip. +// "src_size" is needed to parse MJPG. +// "dst_stride_y" number of bytes in a row of the dst_y plane. +// Normally this would be the same as dst_width, with recommended alignment +// to 16 bytes for better efficiency. +// If rotation of 90 or 270 is used, stride is affected. The caller should +// allocate the I420 buffer according to rotation. +// "dst_stride_u" number of bytes in a row of the dst_u plane. +// Normally this would be the same as (dst_width + 1) / 2, with +// recommended alignment to 16 bytes for better efficiency. +// If rotation of 90 or 270 is used, stride is affected. +// "crop_x" and "crop_y" are starting position for cropping. +// To center, crop_x = (src_width - dst_width) / 2 +// crop_y = (src_height - dst_height) / 2 +// "src_width" / "src_height" is size of src_frame in pixels. +// "src_height" can be negative indicating a vertically flipped image source. +// "crop_width" / "crop_height" is the size to crop the src to. +// Must be less than or equal to src_width/src_height +// Cropping parameters are pre-rotation. +// "rotation" can be 0, 90, 180 or 270. +// "fourcc" is a fourcc. ie 'I420', 'YUY2' +// Returns 0 for successful; -1 for invalid parameter. Non-zero for failure. +LIBYUV_API +int ConvertToI420(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int crop_x, + int crop_y, + int src_width, + int src_height, + int crop_width, + int crop_height, + enum RotationMode rotation, + uint32_t fourcc); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_CONVERT_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_argb.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_argb.h new file mode 100644 index 0000000..715a3da --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_argb.h @@ -0,0 +1,1611 @@ +/* + * Copyright 2012 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_CONVERT_ARGB_H_ +#define INCLUDE_LIBYUV_CONVERT_ARGB_H_ + +#include "libyuv/basic_types.h" + +#include "libyuv/rotate.h" // For enum RotationMode. + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Conversion matrix for YUV to RGB +LIBYUV_API extern const struct YuvConstants kYuvI601Constants; // BT.601 +LIBYUV_API extern const struct YuvConstants kYuvJPEGConstants; // JPeg +LIBYUV_API extern const struct YuvConstants kYuvH709Constants; // BT.709 +LIBYUV_API extern const struct YuvConstants kYuv2020Constants; // BT.2020 + +// Conversion matrix for YVU to BGR +LIBYUV_API extern const struct YuvConstants kYvuI601Constants; // BT.601 +LIBYUV_API extern const struct YuvConstants kYvuJPEGConstants; // JPeg +LIBYUV_API extern const struct YuvConstants kYvuH709Constants; // BT.709 +LIBYUV_API extern const struct YuvConstants kYvu2020Constants; // BT.2020 + +// Macros for end swapped destination Matrix conversions. +// Swap UV and pass mirrored kYvuJPEGConstants matrix. +// TODO(fbarchard): Add macro for each Matrix function. +#define kYuvI601ConstantsVU kYvuI601Constants +#define kYuvJPEGConstantsVU kYvuJPEGConstants +#define kYuvH709ConstantsVU kYvuH709Constants +#define kYuv2020ConstantsVU kYvu2020Constants +#define NV12ToABGRMatrix(a, b, c, d, e, f, g, h, i) \ + NV21ToARGBMatrix(a, b, c, d, e, f, g##VU, h, i) +#define NV21ToABGRMatrix(a, b, c, d, e, f, g, h, i) \ + NV12ToARGBMatrix(a, b, c, d, e, f, g##VU, h, i) +#define NV12ToRAWMatrix(a, b, c, d, e, f, g, h, i) \ + NV21ToRGB24Matrix(a, b, c, d, e, f, g##VU, h, i) +#define NV21ToRAWMatrix(a, b, c, d, e, f, g, h, i) \ + NV12ToRGB24Matrix(a, b, c, d, e, f, g##VU, h, i) +#define I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I420AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) + +// Alias. +#define ARGBToARGB ARGBCopy + +// Copy ARGB to ARGB. +LIBYUV_API +int ARGBCopy(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I420 to ARGB. +LIBYUV_API +int I420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I420 to ABGR. +LIBYUV_API +int I420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert J420 to ARGB. +LIBYUV_API +int J420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert J420 to ABGR. +LIBYUV_API +int J420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H420 to ARGB. +LIBYUV_API +int H420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H420 to ABGR. +LIBYUV_API +int H420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U420 to ARGB. +LIBYUV_API +int U420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U420 to ABGR. +LIBYUV_API +int U420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I422 to ARGB. +LIBYUV_API +int I422ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I422 to ABGR. +LIBYUV_API +int I422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert J422 to ARGB. +LIBYUV_API +int J422ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert J422 to ABGR. +LIBYUV_API +int J422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H422 to ARGB. +LIBYUV_API +int H422ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H422 to ABGR. +LIBYUV_API +int H422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U422 to ARGB. +LIBYUV_API +int U422ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U422 to ABGR. +LIBYUV_API +int U422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I444 to ARGB. +LIBYUV_API +int I444ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I444 to ABGR. +LIBYUV_API +int I444ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert J444 to ARGB. +LIBYUV_API +int J444ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert J444 to ABGR. +LIBYUV_API +int J444ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H444 to ARGB. +LIBYUV_API +int H444ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H444 to ABGR. +LIBYUV_API +int H444ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U444 to ARGB. +LIBYUV_API +int U444ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U444 to ABGR. +LIBYUV_API +int U444ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I010 to ARGB. +LIBYUV_API +int I010ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I010 to ABGR. +LIBYUV_API +int I010ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H010 to ARGB. +LIBYUV_API +int H010ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H010 to ABGR. +LIBYUV_API +int H010ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U010 to ARGB. +LIBYUV_API +int U010ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U010 to ABGR. +LIBYUV_API +int U010ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I210 to ARGB. +LIBYUV_API +int I210ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I210 to ABGR. +LIBYUV_API +int I210ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H210 to ARGB. +LIBYUV_API +int H210ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H210 to ABGR. +LIBYUV_API +int H210ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U210 to ARGB. +LIBYUV_API +int U210ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U210 to ABGR. +LIBYUV_API +int U210ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I420 with Alpha to preattenuated ARGB. +LIBYUV_API +int I420AlphaToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int attenuate); + +// Convert I420 with Alpha to preattenuated ABGR. +LIBYUV_API +int I420AlphaToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height, + int attenuate); + +// Convert I400 (grey) to ARGB. Reverse of ARGBToI400. +LIBYUV_API +int I400ToARGB(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert J400 (jpeg grey) to ARGB. +LIBYUV_API +int J400ToARGB(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Alias. +#define YToARGB I400ToARGB + +// Convert NV12 to ARGB. +LIBYUV_API +int NV12ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert NV21 to ARGB. +LIBYUV_API +int NV21ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert NV12 to ABGR. +LIBYUV_API +int NV12ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert NV21 to ABGR. +LIBYUV_API +int NV21ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert NV12 to RGB24. +LIBYUV_API +int NV12ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +// Convert NV21 to RGB24. +LIBYUV_API +int NV21ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +// Convert NV21 to YUV24. +LIBYUV_API +int NV21ToYUV24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_yuv24, + int dst_stride_yuv24, + int width, + int height); + +// Convert NV12 to RAW. +LIBYUV_API +int NV12ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +// Convert NV21 to RAW. +LIBYUV_API +int NV21ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +// Convert YUY2 to ARGB. +LIBYUV_API +int YUY2ToARGB(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert UYVY to ARGB. +LIBYUV_API +int UYVYToARGB(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I010 to AR30. +LIBYUV_API +int I010ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert I010 to AB30. +LIBYUV_API +int I010ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert H010 to AR30. +LIBYUV_API +int H010ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert H010 to AB30. +LIBYUV_API +int H010ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert U010 to AR30. +LIBYUV_API +int U010ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert U010 to AB30. +LIBYUV_API +int U010ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert I210 to AR30. +LIBYUV_API +int I210ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert I210 to AB30. +LIBYUV_API +int I210ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert H210 to AR30. +LIBYUV_API +int H210ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert H210 to AB30. +LIBYUV_API +int H210ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert U210 to AR30. +LIBYUV_API +int U210ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert U210 to AB30. +LIBYUV_API +int U210ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// BGRA little endian (argb in memory) to ARGB. +LIBYUV_API +int BGRAToARGB(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// ABGR little endian (rgba in memory) to ARGB. +LIBYUV_API +int ABGRToARGB(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// RGBA little endian (abgr in memory) to ARGB. +LIBYUV_API +int RGBAToARGB(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Deprecated function name. +#define BG24ToARGB RGB24ToARGB + +// RGB little endian (bgr in memory) to ARGB. +LIBYUV_API +int RGB24ToARGB(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// RGB big endian (rgb in memory) to ARGB. +LIBYUV_API +int RAWToARGB(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// RGB big endian (rgb in memory) to RGBA. +LIBYUV_API +int RAWToRGBA(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_rgba, + int dst_stride_rgba, + int width, + int height); + +// RGB16 (RGBP fourcc) little endian to ARGB. +LIBYUV_API +int RGB565ToARGB(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// RGB15 (RGBO fourcc) little endian to ARGB. +LIBYUV_API +int ARGB1555ToARGB(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// RGB12 (R444 fourcc) little endian to ARGB. +LIBYUV_API +int ARGB4444ToARGB(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Aliases +#define AB30ToARGB AR30ToABGR +#define AB30ToABGR AR30ToARGB +#define AB30ToAR30 AR30ToAB30 + +// Convert AR30 To ARGB. +LIBYUV_API +int AR30ToARGB(const uint8_t* src_ar30, + int src_stride_ar30, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert AR30 To ABGR. +LIBYUV_API +int AR30ToABGR(const uint8_t* src_ar30, + int src_stride_ar30, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert AR30 To AB30. +LIBYUV_API +int AR30ToAB30(const uint8_t* src_ar30, + int src_stride_ar30, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// src_width/height provided by capture +// dst_width/height for clipping determine final size. +LIBYUV_API +int MJPGToARGB(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_argb, + int dst_stride_argb, + int src_width, + int src_height, + int dst_width, + int dst_height); + +// Convert Android420 to ARGB. +LIBYUV_API +int Android420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert Android420 to ABGR. +LIBYUV_API +int Android420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert NV12 to RGB565. +LIBYUV_API +int NV12ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +// Convert I422 to BGRA. +LIBYUV_API +int I422ToBGRA(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_bgra, + int dst_stride_bgra, + int width, + int height); + +// Convert I422 to ABGR. +LIBYUV_API +int I422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I422 to RGBA. +LIBYUV_API +int I422ToRGBA(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgba, + int dst_stride_rgba, + int width, + int height); + +LIBYUV_API +int I420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +LIBYUV_API +int I420ToBGRA(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_bgra, + int dst_stride_bgra, + int width, + int height); + +LIBYUV_API +int I420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +LIBYUV_API +int I420ToRGBA(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgba, + int dst_stride_rgba, + int width, + int height); + +LIBYUV_API +int I420ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +LIBYUV_API +int I420ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +LIBYUV_API +int H420ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +LIBYUV_API +int H420ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +LIBYUV_API +int J420ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +LIBYUV_API +int J420ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +LIBYUV_API +int I420ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +LIBYUV_API +int J420ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +LIBYUV_API +int H420ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +LIBYUV_API +int I422ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +// Convert I420 To RGB565 with 4x4 dither matrix (16 bytes). +// Values in dither matrix from 0 to 7 recommended. +// The order of the dither matrix is first byte is upper left. + +LIBYUV_API +int I420ToRGB565Dither(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + const uint8_t* dither4x4, + int width, + int height); + +LIBYUV_API +int I420ToARGB1555(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb1555, + int dst_stride_argb1555, + int width, + int height); + +LIBYUV_API +int I420ToARGB4444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb4444, + int dst_stride_argb4444, + int width, + int height); + +// Convert I420 to AR30. +LIBYUV_API +int I420ToAR30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert H420 to AR30. +LIBYUV_API +int H420ToAR30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert I420 to ARGB with matrix. +LIBYUV_API +int I420ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I422 to ARGB with matrix. +LIBYUV_API +int I422ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I444 to ARGB with matrix. +LIBYUV_API +int I444ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// multiply 10 bit yuv into high bits to allow any number of bits. +LIBYUV_API +int I010ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// multiply 10 bit yuv into high bits to allow any number of bits. +LIBYUV_API +int I210ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 10 bit YUV to ARGB with matrix. +LIBYUV_API +int I010ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 10 bit 422 YUV to ARGB with matrix. +LIBYUV_API +int I210ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I420AlphaToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert NV12 to ARGB with matrix. +LIBYUV_API +int NV12ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert NV21 to ARGB with matrix. +LIBYUV_API +int NV21ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert NV12 to RGB565 with matrix. +LIBYUV_API +int NV12ToRGB565Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert NV12 to RGB24 with matrix. +LIBYUV_API +int NV12ToRGB24Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert NV21 to RGB24 with matrix. +LIBYUV_API +int NV21ToRGB24Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert Android420 to ARGB with matrix. +LIBYUV_API +int Android420ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I422 to RGBA with matrix. +LIBYUV_API +int I422ToRGBAMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgba, + int dst_stride_rgba, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I422 to RGBA with matrix. +LIBYUV_API +int I420ToRGBAMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgba, + int dst_stride_rgba, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 to RGB24 with matrix. +LIBYUV_API +int I420ToRGB24Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 to RGB565 with specified color matrix. +LIBYUV_API +int I420ToRGB565Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 to AR30 with matrix. +LIBYUV_API +int I420ToAR30Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I400 (grey) to ARGB. Reverse of ARGBToI400. +LIBYUV_API +int I400ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert camera sample to ARGB with cropping, rotation and vertical flip. +// "sample_size" is needed to parse MJPG. +// "dst_stride_argb" number of bytes in a row of the dst_argb plane. +// Normally this would be the same as dst_width, with recommended alignment +// to 16 bytes for better efficiency. +// If rotation of 90 or 270 is used, stride is affected. The caller should +// allocate the I420 buffer according to rotation. +// "dst_stride_u" number of bytes in a row of the dst_u plane. +// Normally this would be the same as (dst_width + 1) / 2, with +// recommended alignment to 16 bytes for better efficiency. +// If rotation of 90 or 270 is used, stride is affected. +// "crop_x" and "crop_y" are starting position for cropping. +// To center, crop_x = (src_width - dst_width) / 2 +// crop_y = (src_height - dst_height) / 2 +// "src_width" / "src_height" is size of src_frame in pixels. +// "src_height" can be negative indicating a vertically flipped image source. +// "crop_width" / "crop_height" is the size to crop the src to. +// Must be less than or equal to src_width/src_height +// Cropping parameters are pre-rotation. +// "rotation" can be 0, 90, 180 or 270. +// "fourcc" is a fourcc. ie 'I420', 'YUY2' +// Returns 0 for successful; -1 for invalid parameter. Non-zero for failure. +LIBYUV_API +int ConvertToARGB(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_argb, + int dst_stride_argb, + int crop_x, + int crop_y, + int src_width, + int src_height, + int crop_width, + int crop_height, + enum RotationMode rotation, + uint32_t fourcc); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_CONVERT_ARGB_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_from.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_from.h new file mode 100644 index 0000000..5140ed4 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_from.h @@ -0,0 +1,185 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_CONVERT_FROM_H_ +#define INCLUDE_LIBYUV_CONVERT_FROM_H_ + +#include "libyuv/basic_types.h" +#include "libyuv/rotate.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// See Also convert.h for conversions from formats to I420. + +// Convert 8 bit YUV to 10 bit. +#define H420ToH010 I420ToI010 +LIBYUV_API +int I420ToI010(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +LIBYUV_API +int I420ToI422(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +LIBYUV_API +int I420ToI444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Copy to I400. Source can be I420, I422, I444, I400, NV12 or NV21. +LIBYUV_API +int I400Copy(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +LIBYUV_API +int I420ToNV12(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +LIBYUV_API +int I420ToNV21(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +LIBYUV_API +int I420ToYUY2(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_yuy2, + int dst_stride_yuy2, + int width, + int height); + +LIBYUV_API +int I420ToUYVY(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uyvy, + int dst_stride_uyvy, + int width, + int height); + +// The following are from convert_argb.h +// DEPRECATED: The prototypes will be removed in future. Use convert_argb.h + +// Convert I420 to ARGB. +LIBYUV_API +int I420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I420 to ABGR. +LIBYUV_API +int I420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I420 to specified format. +// "dst_sample_stride" is bytes in a row for the destination. Pass 0 if the +// buffer has contiguous rows. Can be negative. A multiple of 16 is optimal. +LIBYUV_API +int ConvertFromI420(const uint8_t* y, + int y_stride, + const uint8_t* u, + int u_stride, + const uint8_t* v, + int v_stride, + uint8_t* dst_sample, + int dst_sample_stride, + int width, + int height, + uint32_t fourcc); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_CONVERT_FROM_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_from_argb.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_from_argb.h new file mode 100644 index 0000000..d992363 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/convert_from_argb.h @@ -0,0 +1,311 @@ +/* + * Copyright 2012 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_CONVERT_FROM_ARGB_H_ +#define INCLUDE_LIBYUV_CONVERT_FROM_ARGB_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Copy ARGB to ARGB. +#define ARGBToARGB ARGBCopy +LIBYUV_API +int ARGBCopy(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert ARGB To BGRA. +LIBYUV_API +int ARGBToBGRA(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_bgra, + int dst_stride_bgra, + int width, + int height); + +// Convert ARGB To ABGR. +LIBYUV_API +int ARGBToABGR(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert ARGB To RGBA. +LIBYUV_API +int ARGBToRGBA(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_rgba, + int dst_stride_rgba, + int width, + int height); + +// Aliases +#define ARGBToAB30 ABGRToAR30 +#define ABGRToAB30 ARGBToAR30 + +// Convert ABGR To AR30. +LIBYUV_API +int ABGRToAR30(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert ARGB To AR30. +LIBYUV_API +int ARGBToAR30(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Aliases +#define ABGRToRGB24 ARGBToRAW +#define ABGRToRAW ARGBToRGB24 + +// Convert ARGB To RGB24. +LIBYUV_API +int ARGBToRGB24(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +// Convert ARGB To RAW. +LIBYUV_API +int ARGBToRAW(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +// Convert ARGB To RGB565. +LIBYUV_API +int ARGBToRGB565(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +// Convert ARGB To RGB565 with 4x4 dither matrix (16 bytes). +// Values in dither matrix from 0 to 7 recommended. +// The order of the dither matrix is first byte is upper left. +// TODO(fbarchard): Consider pointer to 2d array for dither4x4. +// const uint8_t(*dither)[4][4]; +LIBYUV_API +int ARGBToRGB565Dither(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + const uint8_t* dither4x4, + int width, + int height); + +// Convert ARGB To ARGB1555. +LIBYUV_API +int ARGBToARGB1555(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb1555, + int dst_stride_argb1555, + int width, + int height); + +// Convert ARGB To ARGB4444. +LIBYUV_API +int ARGBToARGB4444(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb4444, + int dst_stride_argb4444, + int width, + int height); + +// Convert ARGB To I444. +LIBYUV_API +int ARGBToI444(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert ARGB To I422. +LIBYUV_API +int ARGBToI422(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert ARGB To I420. (also in convert.h) +LIBYUV_API +int ARGBToI420(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert ARGB to J420. (JPeg full range I420). +LIBYUV_API +int ARGBToJ420(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_yj, + int dst_stride_yj, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert ARGB to J422. +LIBYUV_API +int ARGBToJ422(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_yj, + int dst_stride_yj, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert ARGB to J400. (JPeg full range). +LIBYUV_API +int ARGBToJ400(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_yj, + int dst_stride_yj, + int width, + int height); + +// Convert RGBA to J400. (JPeg full range). +LIBYUV_API +int RGBAToJ400(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_yj, + int dst_stride_yj, + int width, + int height); + +// Convert ARGB to I400. +LIBYUV_API +int ARGBToI400(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Convert ARGB to G. (Reverse of J400toARGB, which replicates G back to ARGB) +LIBYUV_API +int ARGBToG(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_g, + int dst_stride_g, + int width, + int height); + +// Convert ARGB To NV12. +LIBYUV_API +int ARGBToNV12(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert ARGB To NV21. +LIBYUV_API +int ARGBToNV21(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +// Convert ABGR To NV12. +LIBYUV_API +int ABGRToNV12(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert ABGR To NV21. +LIBYUV_API +int ABGRToNV21(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +// Convert ARGB To YUY2. +LIBYUV_API +int ARGBToYUY2(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_yuy2, + int dst_stride_yuy2, + int width, + int height); + +// Convert ARGB To UYVY. +LIBYUV_API +int ARGBToUYVY(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_uyvy, + int dst_stride_uyvy, + int width, + int height); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_CONVERT_FROM_ARGB_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/cpu_id.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/cpu_id.h new file mode 100644 index 0000000..3e27cc1 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/cpu_id.h @@ -0,0 +1,122 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_CPU_ID_H_ +#define INCLUDE_LIBYUV_CPU_ID_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Internal flag to indicate cpuid requires initialization. +static const int kCpuInitialized = 0x1; + +// These flags are only valid on ARM processors. +static const int kCpuHasARM = 0x2; +static const int kCpuHasNEON = 0x4; +// 0x8 reserved for future ARM flag. + +// These flags are only valid on x86 processors. +static const int kCpuHasX86 = 0x10; +static const int kCpuHasSSE2 = 0x20; +static const int kCpuHasSSSE3 = 0x40; +static const int kCpuHasSSE41 = 0x80; +static const int kCpuHasSSE42 = 0x100; // unused at this time. +static const int kCpuHasAVX = 0x200; +static const int kCpuHasAVX2 = 0x400; +static const int kCpuHasERMS = 0x800; +static const int kCpuHasFMA3 = 0x1000; +static const int kCpuHasF16C = 0x2000; +static const int kCpuHasGFNI = 0x4000; +static const int kCpuHasAVX512BW = 0x8000; +static const int kCpuHasAVX512VL = 0x10000; +static const int kCpuHasAVX512VBMI = 0x20000; +static const int kCpuHasAVX512VBMI2 = 0x40000; +static const int kCpuHasAVX512VBITALG = 0x80000; +static const int kCpuHasAVX512VPOPCNTDQ = 0x100000; + +// These flags are only valid on MIPS processors. +static const int kCpuHasMIPS = 0x200000; +static const int kCpuHasMSA = 0x400000; +static const int kCpuHasMMI = 0x800000; + +// Optional init function. TestCpuFlag does an auto-init. +// Returns cpu_info flags. +LIBYUV_API +int InitCpuFlags(void); + +// Detect CPU has SSE2 etc. +// Test_flag parameter should be one of kCpuHas constants above. +// Returns non-zero if instruction set is detected +static __inline int TestCpuFlag(int test_flag) { + LIBYUV_API extern int cpu_info_; +#ifdef __ATOMIC_RELAXED + int cpu_info = __atomic_load_n(&cpu_info_, __ATOMIC_RELAXED); +#else + int cpu_info = cpu_info_; +#endif + return (!cpu_info ? InitCpuFlags() : cpu_info) & test_flag; +} + +// Internal function for parsing /proc/cpuinfo. +LIBYUV_API +int ArmCpuCaps(const char* cpuinfo_name); +LIBYUV_API +int MipsCpuCaps(const char* cpuinfo_name); + +// For testing, allow CPU flags to be disabled. +// ie MaskCpuFlags(~kCpuHasSSSE3) to disable SSSE3. +// MaskCpuFlags(-1) to enable all cpu specific optimizations. +// MaskCpuFlags(1) to disable all cpu specific optimizations. +// MaskCpuFlags(0) to reset state so next call will auto init. +// Returns cpu_info flags. +LIBYUV_API +int MaskCpuFlags(int enable_flags); + +// Sets the CPU flags to |cpu_flags|, bypassing the detection code. |cpu_flags| +// should be a valid combination of the kCpuHas constants above and include +// kCpuInitialized. Use this method when running in a sandboxed process where +// the detection code might fail (as it might access /proc/cpuinfo). In such +// cases the cpu_info can be obtained from a non sandboxed process by calling +// InitCpuFlags() and passed to the sandboxed process (via command line +// parameters, IPC...) which can then call this method to initialize the CPU +// flags. +// Notes: +// - when specifying 0 for |cpu_flags|, the auto initialization is enabled +// again. +// - enabling CPU features that are not supported by the CPU will result in +// undefined behavior. +// TODO(fbarchard): consider writing a helper function that translates from +// other library CPU info to libyuv CPU info and add a .md doc that explains +// CPU detection. +static __inline void SetCpuFlags(int cpu_flags) { + LIBYUV_API extern int cpu_info_; +#ifdef __ATOMIC_RELAXED + __atomic_store_n(&cpu_info_, cpu_flags, __ATOMIC_RELAXED); +#else + cpu_info_ = cpu_flags; +#endif +} + +// Low level cpuid for X86. Returns zeros on other CPUs. +// eax is the info type that you want. +// ecx is typically the cpu number, and should normally be zero. +LIBYUV_API +void CpuId(int info_eax, int info_ecx, int* cpu_info); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_CPU_ID_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/macros_msa.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/macros_msa.h new file mode 100644 index 0000000..4e232b6 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/macros_msa.h @@ -0,0 +1,236 @@ +/* + * Copyright 2016 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_MACROS_MSA_H_ +#define INCLUDE_LIBYUV_MACROS_MSA_H_ + +#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) +#include +#include + +#if (__mips_isa_rev >= 6) +#define LW(psrc) \ + ({ \ + const uint8_t* psrc_lw_m = (const uint8_t*)(psrc); \ + uint32_t val_m; \ + asm volatile("lw %[val_m], %[psrc_lw_m] \n" \ + : [val_m] "=r"(val_m) \ + : [psrc_lw_m] "m"(*psrc_lw_m)); \ + val_m; \ + }) + +#if (__mips == 64) +#define LD(psrc) \ + ({ \ + const uint8_t* psrc_ld_m = (const uint8_t*)(psrc); \ + uint64_t val_m = 0; \ + asm volatile("ld %[val_m], %[psrc_ld_m] \n" \ + : [val_m] "=r"(val_m) \ + : [psrc_ld_m] "m"(*psrc_ld_m)); \ + val_m; \ + }) +#else // !(__mips == 64) +#define LD(psrc) \ + ({ \ + const uint8_t* psrc_ld_m = (const uint8_t*)(psrc); \ + uint32_t val0_m, val1_m; \ + uint64_t val_m = 0; \ + val0_m = LW(psrc_ld_m); \ + val1_m = LW(psrc_ld_m + 4); \ + val_m = (uint64_t)(val1_m); /* NOLINT */ \ + val_m = (uint64_t)((val_m << 32) & 0xFFFFFFFF00000000); /* NOLINT */ \ + val_m = (uint64_t)(val_m | (uint64_t)val0_m); /* NOLINT */ \ + val_m; \ + }) +#endif // (__mips == 64) + +#define SW(val, pdst) \ + ({ \ + uint8_t* pdst_sw_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint32_t val_m = (val); \ + asm volatile("sw %[val_m], %[pdst_sw_m] \n" \ + : [pdst_sw_m] "=m"(*pdst_sw_m) \ + : [val_m] "r"(val_m)); \ + }) + +#if (__mips == 64) +#define SD(val, pdst) \ + ({ \ + uint8_t* pdst_sd_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint64_t val_m = (val); \ + asm volatile("sd %[val_m], %[pdst_sd_m] \n" \ + : [pdst_sd_m] "=m"(*pdst_sd_m) \ + : [val_m] "r"(val_m)); \ + }) +#else // !(__mips == 64) +#define SD(val, pdst) \ + ({ \ + uint8_t* pdst_sd_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint32_t val0_m, val1_m; \ + val0_m = (uint32_t)((val)&0x00000000FFFFFFFF); \ + val1_m = (uint32_t)(((val) >> 32) & 0x00000000FFFFFFFF); \ + SW(val0_m, pdst_sd_m); \ + SW(val1_m, pdst_sd_m + 4); \ + }) +#endif // !(__mips == 64) +#else // !(__mips_isa_rev >= 6) +#define LW(psrc) \ + ({ \ + const uint8_t* psrc_lw_m = (const uint8_t*)(psrc); \ + uint32_t val_m; \ + asm volatile("ulw %[val_m], %[psrc_lw_m] \n" \ + : [val_m] "=r"(val_m) \ + : [psrc_lw_m] "m"(*psrc_lw_m)); \ + val_m; \ + }) + +#if (__mips == 64) +#define LD(psrc) \ + ({ \ + const uint8_t* psrc_ld_m = (const uint8_t*)(psrc); \ + uint64_t val_m = 0; \ + asm volatile("uld %[val_m], %[psrc_ld_m] \n" \ + : [val_m] "=r"(val_m) \ + : [psrc_ld_m] "m"(*psrc_ld_m)); \ + val_m; \ + }) +#else // !(__mips == 64) +#define LD(psrc) \ + ({ \ + const uint8_t* psrc_ld_m = (const uint8_t*)(psrc); \ + uint32_t val0_m, val1_m; \ + uint64_t val_m = 0; \ + val0_m = LW(psrc_ld_m); \ + val1_m = LW(psrc_ld_m + 4); \ + val_m = (uint64_t)(val1_m); /* NOLINT */ \ + val_m = (uint64_t)((val_m << 32) & 0xFFFFFFFF00000000); /* NOLINT */ \ + val_m = (uint64_t)(val_m | (uint64_t)val0_m); /* NOLINT */ \ + val_m; \ + }) +#endif // (__mips == 64) + +#define SW(val, pdst) \ + ({ \ + uint8_t* pdst_sw_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint32_t val_m = (val); \ + asm volatile("usw %[val_m], %[pdst_sw_m] \n" \ + : [pdst_sw_m] "=m"(*pdst_sw_m) \ + : [val_m] "r"(val_m)); \ + }) + +#define SD(val, pdst) \ + ({ \ + uint8_t* pdst_sd_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint32_t val0_m, val1_m; \ + val0_m = (uint32_t)((val)&0x00000000FFFFFFFF); \ + val1_m = (uint32_t)(((val) >> 32) & 0x00000000FFFFFFFF); \ + SW(val0_m, pdst_sd_m); \ + SW(val1_m, pdst_sd_m + 4); \ + }) +#endif // (__mips_isa_rev >= 6) + +// TODO(fbarchard): Consider removing __VAR_ARGS versions. +#define LD_B(RTYPE, psrc) *((RTYPE*)(psrc)) /* NOLINT */ +#define LD_UB(...) LD_B(const v16u8, __VA_ARGS__) + +#define LD_H(RTYPE, psrc) *((RTYPE*)(psrc)) /* NOLINT */ +#define LD_UH(...) LD_H(const v8u16, __VA_ARGS__) + +#define ST_B(RTYPE, in, pdst) *((RTYPE*)(pdst)) = (in) /* NOLINT */ +#define ST_UB(...) ST_B(v16u8, __VA_ARGS__) + +#define ST_H(RTYPE, in, pdst) *((RTYPE*)(pdst)) = (in) /* NOLINT */ +#define ST_UH(...) ST_H(v8u16, __VA_ARGS__) + +/* Description : Load two vectors with 16 'byte' sized elements + Arguments : Inputs - psrc, stride + Outputs - out0, out1 + Return Type - as per RTYPE + Details : Load 16 byte elements in 'out0' from (psrc) + Load 16 byte elements in 'out1' from (psrc + stride) +*/ +#define LD_B2(RTYPE, psrc, stride, out0, out1) \ + { \ + out0 = LD_B(RTYPE, (psrc)); \ + out1 = LD_B(RTYPE, (psrc) + stride); \ + } +#define LD_UB2(...) LD_B2(const v16u8, __VA_ARGS__) + +#define LD_B4(RTYPE, psrc, stride, out0, out1, out2, out3) \ + { \ + LD_B2(RTYPE, (psrc), stride, out0, out1); \ + LD_B2(RTYPE, (psrc) + 2 * stride, stride, out2, out3); \ + } +#define LD_UB4(...) LD_B4(const v16u8, __VA_ARGS__) + +/* Description : Store two vectors with stride each having 16 'byte' sized + elements + Arguments : Inputs - in0, in1, pdst, stride + Details : Store 16 byte elements from 'in0' to (pdst) + Store 16 byte elements from 'in1' to (pdst + stride) +*/ +#define ST_B2(RTYPE, in0, in1, pdst, stride) \ + { \ + ST_B(RTYPE, in0, (pdst)); \ + ST_B(RTYPE, in1, (pdst) + stride); \ + } +#define ST_UB2(...) ST_B2(v16u8, __VA_ARGS__) + +#define ST_B4(RTYPE, in0, in1, in2, in3, pdst, stride) \ + { \ + ST_B2(RTYPE, in0, in1, (pdst), stride); \ + ST_B2(RTYPE, in2, in3, (pdst) + 2 * stride, stride); \ + } +#define ST_UB4(...) ST_B4(v16u8, __VA_ARGS__) + +/* Description : Store vectors of 8 halfword elements with stride + Arguments : Inputs - in0, in1, pdst, stride + Details : Store 8 halfword elements from 'in0' to (pdst) + Store 8 halfword elements from 'in1' to (pdst + stride) +*/ +#define ST_H2(RTYPE, in0, in1, pdst, stride) \ + { \ + ST_H(RTYPE, in0, (pdst)); \ + ST_H(RTYPE, in1, (pdst) + stride); \ + } +#define ST_UH2(...) ST_H2(v8u16, __VA_ARGS__) + +// TODO(fbarchard): Consider using __msa_vshf_b and __msa_ilvr_b directly. +/* Description : Shuffle byte vector elements as per mask vector + Arguments : Inputs - in0, in1, in2, in3, mask0, mask1 + Outputs - out0, out1 + Return Type - as per RTYPE + Details : Byte elements from 'in0' & 'in1' are copied selectively to + 'out0' as per control vector 'mask0' +*/ +#define VSHF_B2(RTYPE, in0, in1, in2, in3, mask0, mask1, out0, out1) \ + { \ + out0 = (RTYPE)__msa_vshf_b((v16i8)mask0, (v16i8)in1, (v16i8)in0); \ + out1 = (RTYPE)__msa_vshf_b((v16i8)mask1, (v16i8)in3, (v16i8)in2); \ + } +#define VSHF_B2_UB(...) VSHF_B2(v16u8, __VA_ARGS__) + +/* Description : Interleave both left and right half of input vectors + Arguments : Inputs - in0, in1 + Outputs - out0, out1 + Return Type - as per RTYPE + Details : Right half of byte elements from 'in0' and 'in1' are + interleaved and written to 'out0' +*/ +#define ILVRL_B2(RTYPE, in0, in1, out0, out1) \ + { \ + out0 = (RTYPE)__msa_ilvr_b((v16i8)in0, (v16i8)in1); \ + out1 = (RTYPE)__msa_ilvl_b((v16i8)in0, (v16i8)in1); \ + } +#define ILVRL_B2_UB(...) ILVRL_B2(v16u8, __VA_ARGS__) + +#endif /* !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) */ + +#endif // INCLUDE_LIBYUV_MACROS_MSA_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/mjpeg_decoder.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/mjpeg_decoder.h new file mode 100644 index 0000000..275f8d4 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/mjpeg_decoder.h @@ -0,0 +1,195 @@ +/* + * Copyright 2012 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_MJPEG_DECODER_H_ +#define INCLUDE_LIBYUV_MJPEG_DECODER_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +// NOTE: For a simplified public API use convert.h MJPGToI420(). + +struct jpeg_common_struct; +struct jpeg_decompress_struct; +struct jpeg_source_mgr; + +namespace libyuv { + +#ifdef __cplusplus +extern "C" { +#endif + +LIBYUV_BOOL ValidateJpeg(const uint8_t* sample, size_t sample_size); + +#ifdef __cplusplus +} // extern "C" +#endif + +static const uint32_t kUnknownDataSize = 0xFFFFFFFF; + +enum JpegSubsamplingType { + kJpegYuv420, + kJpegYuv422, + kJpegYuv444, + kJpegYuv400, + kJpegUnknown +}; + +struct Buffer { + const uint8_t* data; + int len; +}; + +struct BufferVector { + Buffer* buffers; + int len; + int pos; +}; + +struct SetJmpErrorMgr; + +// MJPEG ("Motion JPEG") is a pseudo-standard video codec where the frames are +// simply independent JPEG images with a fixed huffman table (which is omitted). +// It is rarely used in video transmission, but is common as a camera capture +// format, especially in Logitech devices. This class implements a decoder for +// MJPEG frames. +// +// See http://tools.ietf.org/html/rfc2435 +class LIBYUV_API MJpegDecoder { + public: + typedef void (*CallbackFunction)(void* opaque, + const uint8_t* const* data, + const int* strides, + int rows); + + static const int kColorSpaceUnknown; + static const int kColorSpaceGrayscale; + static const int kColorSpaceRgb; + static const int kColorSpaceYCbCr; + static const int kColorSpaceCMYK; + static const int kColorSpaceYCCK; + + MJpegDecoder(); + ~MJpegDecoder(); + + // Loads a new frame, reads its headers, and determines the uncompressed + // image format. + // Returns LIBYUV_TRUE if image looks valid and format is supported. + // If return value is LIBYUV_TRUE, then the values for all the following + // getters are populated. + // src_len is the size of the compressed mjpeg frame in bytes. + LIBYUV_BOOL LoadFrame(const uint8_t* src, size_t src_len); + + // Returns width of the last loaded frame in pixels. + int GetWidth(); + + // Returns height of the last loaded frame in pixels. + int GetHeight(); + + // Returns format of the last loaded frame. The return value is one of the + // kColorSpace* constants. + int GetColorSpace(); + + // Number of color components in the color space. + int GetNumComponents(); + + // Sample factors of the n-th component. + int GetHorizSampFactor(int component); + + int GetVertSampFactor(int component); + + int GetHorizSubSampFactor(int component); + + int GetVertSubSampFactor(int component); + + // Public for testability. + int GetImageScanlinesPerImcuRow(); + + // Public for testability. + int GetComponentScanlinesPerImcuRow(int component); + + // Width of a component in bytes. + int GetComponentWidth(int component); + + // Height of a component. + int GetComponentHeight(int component); + + // Width of a component in bytes with padding for DCTSIZE. Public for testing. + int GetComponentStride(int component); + + // Size of a component in bytes. + int GetComponentSize(int component); + + // Call this after LoadFrame() if you decide you don't want to decode it + // after all. + LIBYUV_BOOL UnloadFrame(); + + // Decodes the entire image into a one-buffer-per-color-component format. + // dst_width must match exactly. dst_height must be <= to image height; if + // less, the image is cropped. "planes" must have size equal to at least + // GetNumComponents() and they must point to non-overlapping buffers of size + // at least GetComponentSize(i). The pointers in planes are incremented + // to point to after the end of the written data. + // TODO(fbarchard): Add dst_x, dst_y to allow specific rect to be decoded. + LIBYUV_BOOL DecodeToBuffers(uint8_t** planes, int dst_width, int dst_height); + + // Decodes the entire image and passes the data via repeated calls to a + // callback function. Each call will get the data for a whole number of + // image scanlines. + // TODO(fbarchard): Add dst_x, dst_y to allow specific rect to be decoded. + LIBYUV_BOOL DecodeToCallback(CallbackFunction fn, + void* opaque, + int dst_width, + int dst_height); + + // The helper function which recognizes the jpeg sub-sampling type. + static JpegSubsamplingType JpegSubsamplingTypeHelper( + int* subsample_x, + int* subsample_y, + int number_of_components); + + private: + void AllocOutputBuffers(int num_outbufs); + void DestroyOutputBuffers(); + + LIBYUV_BOOL StartDecode(); + LIBYUV_BOOL FinishDecode(); + + void SetScanlinePointers(uint8_t** data); + LIBYUV_BOOL DecodeImcuRow(); + + int GetComponentScanlinePadding(int component); + + // A buffer holding the input data for a frame. + Buffer buf_; + BufferVector buf_vec_; + + jpeg_decompress_struct* decompress_struct_; + jpeg_source_mgr* source_mgr_; + SetJmpErrorMgr* error_mgr_; + + // LIBYUV_TRUE iff at least one component has scanline padding. (i.e., + // GetComponentScanlinePadding() != 0.) + LIBYUV_BOOL has_scanline_padding_; + + // Temporaries used to point to scanline outputs. + int num_outbufs_; // Outermost size of all arrays below. + uint8_t*** scanlines_; + int* scanlines_sizes_; + // Temporary buffer used for decoding when we can't decode directly to the + // output buffers. Large enough for just one iMCU row. + uint8_t** databuf_; + int* databuf_strides_; +}; + +} // namespace libyuv + +#endif // __cplusplus +#endif // INCLUDE_LIBYUV_MJPEG_DECODER_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/planar_functions.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/planar_functions.h new file mode 100644 index 0000000..8d868b9 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/planar_functions.h @@ -0,0 +1,900 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_PLANAR_FUNCTIONS_H_ +#define INCLUDE_LIBYUV_PLANAR_FUNCTIONS_H_ + +#include "libyuv/basic_types.h" + +// TODO(fbarchard): Remove the following headers includes. +#include "libyuv/convert.h" +#include "libyuv/convert_argb.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// TODO(fbarchard): Move cpu macros to row.h +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) +#define LIBYUV_DISABLE_X86 +#endif +// MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#define LIBYUV_DISABLE_X86 +#endif +#endif +// The following are available on all x86 platforms: +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) +#define HAS_ARGBAFFINEROW_SSE2 +#endif + +// Copy a plane of data. +LIBYUV_API +void CopyPlane(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +LIBYUV_API +void CopyPlane_16(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int width, + int height); + +LIBYUV_API +void Convert16To8Plane(const uint16_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int scale, // 16384 for 10 bits + int width, + int height); + +LIBYUV_API +void Convert8To16Plane(const uint8_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int scale, // 1024 for 10 bits + int width, + int height); + +// Set a plane of data to a 32 bit value. +LIBYUV_API +void SetPlane(uint8_t* dst_y, + int dst_stride_y, + int width, + int height, + uint32_t value); + +// Split interleaved UV plane into separate U and V planes. +LIBYUV_API +void SplitUVPlane(const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Merge separate U and V planes into one interleaved UV plane. +LIBYUV_API +void MergeUVPlane(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Scale U and V to half width and height and merge into interleaved UV plane. +// width and height are source size, allowing odd sizes. +// Use for converting I444 or I422 to NV12. +LIBYUV_API +void HalfMergeUVPlane(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Swap U and V channels in interleaved UV plane. +LIBYUV_API +void SwapUVPlane(const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +// Split interleaved RGB plane into separate R, G and B planes. +LIBYUV_API +void SplitRGBPlane(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_r, + int dst_stride_r, + uint8_t* dst_g, + int dst_stride_g, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + +// Merge separate R, G and B planes into one interleaved RGB plane. +LIBYUV_API +void MergeRGBPlane(const uint8_t* src_r, + int src_stride_r, + const uint8_t* src_g, + int src_stride_g, + const uint8_t* src_b, + int src_stride_b, + uint8_t* dst_rgb, + int dst_stride_rgb, + int width, + int height); + +// Copy I400. Supports inverting. +LIBYUV_API +int I400ToI400(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +#define J400ToJ400 I400ToI400 + +// Copy I422 to I422. +#define I422ToI422 I422Copy +LIBYUV_API +int I422Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Copy I444 to I444. +#define I444ToI444 I444Copy +LIBYUV_API +int I444Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Copy NV12. Supports inverting. +int NV12Copy(const uint8_t* src_y, int src_stride_y, const uint8_t* src_uv, + int src_stride_uv, uint8_t* dst_y, int dst_stride_y, + uint8_t* dst_uv, int dst_stride_uv, int width, int height); + +// Copy NV21. Supports inverting. +int NV21Copy(const uint8_t* src_y, int src_stride_y, const uint8_t* src_vu, + int src_stride_vu, uint8_t* dst_y, int dst_stride_y, + uint8_t* dst_vu, int dst_stride_vu, int width, int height); + +// Convert YUY2 to I422. +LIBYUV_API +int YUY2ToI422(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert UYVY to I422. +LIBYUV_API +int UYVYToI422(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +LIBYUV_API +int YUY2ToNV12(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +LIBYUV_API +int UYVYToNV12(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert NV21 to NV12. +LIBYUV_API +int NV21ToNV12(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +LIBYUV_API +int YUY2ToY(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Convert I420 to I400. (calls CopyPlane ignoring u/v). +LIBYUV_API +int I420ToI400(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Alias +#define J420ToJ400 I420ToI400 +#define I420ToI420Mirror I420Mirror + +// I420 mirror. +LIBYUV_API +int I420Mirror(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Alias +#define I400ToI400Mirror I400Mirror + +// I400 mirror. A single plane is mirrored horizontally. +// Pass negative height to achieve 180 degree rotation. +LIBYUV_API +int I400Mirror(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Alias +#define NV12ToNV12Mirror NV12Mirror + +// NV12 mirror. +LIBYUV_API +int NV12Mirror(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Alias +#define ARGBToARGBMirror ARGBMirror + +// ARGB mirror. +LIBYUV_API +int ARGBMirror(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Alias +#define RGB24ToRGB24Mirror RGB24Mirror + +// RGB24 mirror. +LIBYUV_API +int RGB24Mirror(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +// Mirror a plane of data. +LIBYUV_API +void MirrorPlane(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Mirror a plane of UV data. +LIBYUV_API +void MirrorUVPlane(const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Alias +#define RGB24ToRAW RAWToRGB24 + +LIBYUV_API +int RAWToRGB24(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +// Draw a rectangle into I420. +LIBYUV_API +int I420Rect(uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int x, + int y, + int width, + int height, + int value_y, + int value_u, + int value_v); + +// Draw a rectangle into ARGB. +LIBYUV_API +int ARGBRect(uint8_t* dst_argb, + int dst_stride_argb, + int dst_x, + int dst_y, + int width, + int height, + uint32_t value); + +// Convert ARGB to gray scale ARGB. +LIBYUV_API +int ARGBGrayTo(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Make a rectangle of ARGB gray scale. +LIBYUV_API +int ARGBGray(uint8_t* dst_argb, + int dst_stride_argb, + int dst_x, + int dst_y, + int width, + int height); + +// Make a rectangle of ARGB Sepia tone. +LIBYUV_API +int ARGBSepia(uint8_t* dst_argb, + int dst_stride_argb, + int dst_x, + int dst_y, + int width, + int height); + +// Apply a matrix rotation to each ARGB pixel. +// matrix_argb is 4 signed ARGB values. -128 to 127 representing -2 to 2. +// The first 4 coefficients apply to B, G, R, A and produce B of the output. +// The next 4 coefficients apply to B, G, R, A and produce G of the output. +// The next 4 coefficients apply to B, G, R, A and produce R of the output. +// The last 4 coefficients apply to B, G, R, A and produce A of the output. +LIBYUV_API +int ARGBColorMatrix(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + const int8_t* matrix_argb, + int width, + int height); + +// Deprecated. Use ARGBColorMatrix instead. +// Apply a matrix rotation to each ARGB pixel. +// matrix_argb is 3 signed ARGB values. -128 to 127 representing -1 to 1. +// The first 4 coefficients apply to B, G, R, A and produce B of the output. +// The next 4 coefficients apply to B, G, R, A and produce G of the output. +// The last 4 coefficients apply to B, G, R, A and produce R of the output. +LIBYUV_API +int RGBColorMatrix(uint8_t* dst_argb, + int dst_stride_argb, + const int8_t* matrix_rgb, + int dst_x, + int dst_y, + int width, + int height); + +// Apply a color table each ARGB pixel. +// Table contains 256 ARGB values. +LIBYUV_API +int ARGBColorTable(uint8_t* dst_argb, + int dst_stride_argb, + const uint8_t* table_argb, + int dst_x, + int dst_y, + int width, + int height); + +// Apply a color table each ARGB pixel but preserve destination alpha. +// Table contains 256 ARGB values. +LIBYUV_API +int RGBColorTable(uint8_t* dst_argb, + int dst_stride_argb, + const uint8_t* table_argb, + int dst_x, + int dst_y, + int width, + int height); + +// Apply a luma/color table each ARGB pixel but preserve destination alpha. +// Table contains 32768 values indexed by [Y][C] where 7 it 7 bit luma from +// RGB (YJ style) and C is an 8 bit color component (R, G or B). +LIBYUV_API +int ARGBLumaColorTable(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + const uint8_t* luma, + int width, + int height); + +// Apply a 3 term polynomial to ARGB values. +// poly points to a 4x4 matrix. The first row is constants. The 2nd row is +// coefficients for b, g, r and a. The 3rd row is coefficients for b squared, +// g squared, r squared and a squared. The 4rd row is coefficients for b to +// the 3, g to the 3, r to the 3 and a to the 3. The values are summed and +// result clamped to 0 to 255. +// A polynomial approximation can be dirived using software such as 'R'. + +LIBYUV_API +int ARGBPolynomial(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + const float* poly, + int width, + int height); + +// Convert plane of 16 bit shorts to half floats. +// Source values are multiplied by scale before storing as half float. +LIBYUV_API +int HalfFloatPlane(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + float scale, + int width, + int height); + +// Convert a buffer of bytes to floats, scale the values and store as floats. +LIBYUV_API +int ByteToFloat(const uint8_t* src_y, float* dst_y, float scale, int width); + +// Quantize a rectangle of ARGB. Alpha unaffected. +// scale is a 16 bit fractional fixed point scaler between 0 and 65535. +// interval_size should be a value between 1 and 255. +// interval_offset should be a value between 0 and 255. +LIBYUV_API +int ARGBQuantize(uint8_t* dst_argb, + int dst_stride_argb, + int scale, + int interval_size, + int interval_offset, + int dst_x, + int dst_y, + int width, + int height); + +// Copy ARGB to ARGB. +LIBYUV_API +int ARGBCopy(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Copy Alpha channel of ARGB to alpha of ARGB. +LIBYUV_API +int ARGBCopyAlpha(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Extract the alpha channel from ARGB. +LIBYUV_API +int ARGBExtractAlpha(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_a, + int dst_stride_a, + int width, + int height); + +// Copy Y channel to Alpha of ARGB. +LIBYUV_API +int ARGBCopyYToAlpha(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +typedef void (*ARGBBlendRow)(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); + +// Get function to Alpha Blend ARGB pixels and store to destination. +LIBYUV_API +ARGBBlendRow GetARGBBlend(); + +// Alpha Blend ARGB images and store to destination. +// Source is pre-multiplied by alpha using ARGBAttenuate. +// Alpha of destination is set to 255. +LIBYUV_API +int ARGBBlend(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Alpha Blend plane and store to destination. +// Source is not pre-multiplied by alpha. +LIBYUV_API +int BlendPlane(const uint8_t* src_y0, + int src_stride_y0, + const uint8_t* src_y1, + int src_stride_y1, + const uint8_t* alpha, + int alpha_stride, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Alpha Blend YUV images and store to destination. +// Source is not pre-multiplied by alpha. +// Alpha is full width x height and subsampled to half size to apply to UV. +LIBYUV_API +int I420Blend(const uint8_t* src_y0, + int src_stride_y0, + const uint8_t* src_u0, + int src_stride_u0, + const uint8_t* src_v0, + int src_stride_v0, + const uint8_t* src_y1, + int src_stride_y1, + const uint8_t* src_u1, + int src_stride_u1, + const uint8_t* src_v1, + int src_stride_v1, + const uint8_t* alpha, + int alpha_stride, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Multiply ARGB image by ARGB image. Shifted down by 8. Saturates to 255. +LIBYUV_API +int ARGBMultiply(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Add ARGB image with ARGB image. Saturates to 255. +LIBYUV_API +int ARGBAdd(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Subtract ARGB image (argb1) from ARGB image (argb0). Saturates to 0. +LIBYUV_API +int ARGBSubtract(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I422 to YUY2. +LIBYUV_API +int I422ToYUY2(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_yuy2, + int dst_stride_yuy2, + int width, + int height); + +// Convert I422 to UYVY. +LIBYUV_API +int I422ToUYVY(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uyvy, + int dst_stride_uyvy, + int width, + int height); + +// Convert unattentuated ARGB to preattenuated ARGB. +LIBYUV_API +int ARGBAttenuate(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert preattentuated ARGB to unattenuated ARGB. +LIBYUV_API +int ARGBUnattenuate(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Internal function - do not call directly. +// Computes table of cumulative sum for image where the value is the sum +// of all values above and to the left of the entry. Used by ARGBBlur. +LIBYUV_API +int ARGBComputeCumulativeSum(const uint8_t* src_argb, + int src_stride_argb, + int32_t* dst_cumsum, + int dst_stride32_cumsum, + int width, + int height); + +// Blur ARGB image. +// dst_cumsum table of width * (height + 1) * 16 bytes aligned to +// 16 byte boundary. +// dst_stride32_cumsum is number of ints in a row (width * 4). +// radius is number of pixels around the center. e.g. 1 = 3x3. 2=5x5. +// Blur is optimized for radius of 5 (11x11) or less. +LIBYUV_API +int ARGBBlur(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int32_t* dst_cumsum, + int dst_stride32_cumsum, + int width, + int height, + int radius); + +// Gaussian 5x5 blur a float plane. +// Coefficients of 1, 4, 6, 4, 1. +// Each destination pixel is a blur of the 5x5 +// pixels from the source. +// Source edges are clamped. +LIBYUV_API +int GaussPlane_F32(const float* src, + int src_stride, + float* dst, + int dst_stride, + int width, + int height); + +// Multiply ARGB image by ARGB value. +LIBYUV_API +int ARGBShade(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + uint32_t value); + +// Interpolate between two images using specified amount of interpolation +// (0 to 255) and store to destination. +// 'interpolation' is specified as 8 bit fraction where 0 means 100% src0 +// and 255 means 1% src0 and 99% src1. +LIBYUV_API +int InterpolatePlane(const uint8_t* src0, + int src_stride0, + const uint8_t* src1, + int src_stride1, + uint8_t* dst, + int dst_stride, + int width, + int height, + int interpolation); + +// Interpolate between two ARGB images using specified amount of interpolation +// Internally calls InterpolatePlane with width * 4 (bpp). +LIBYUV_API +int ARGBInterpolate(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int interpolation); + +// Interpolate between two YUV images using specified amount of interpolation +// Internally calls InterpolatePlane on each plane where the U and V planes +// are half width and half height. +LIBYUV_API +int I420Interpolate(const uint8_t* src0_y, + int src0_stride_y, + const uint8_t* src0_u, + int src0_stride_u, + const uint8_t* src0_v, + int src0_stride_v, + const uint8_t* src1_y, + int src1_stride_y, + const uint8_t* src1_u, + int src1_stride_u, + const uint8_t* src1_v, + int src1_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + int interpolation); + +// Row function for copying pixels from a source with a slope to a row +// of destination. Useful for scaling, rotation, mirror, texture mapping. +LIBYUV_API +void ARGBAffineRow_C(const uint8_t* src_argb, + int src_argb_stride, + uint8_t* dst_argb, + const float* uv_dudv, + int width); +// TODO(fbarchard): Move ARGBAffineRow_SSE2 to row.h +LIBYUV_API +void ARGBAffineRow_SSE2(const uint8_t* src_argb, + int src_argb_stride, + uint8_t* dst_argb, + const float* uv_dudv, + int width); + +// Shuffle ARGB channel order. e.g. BGRA to ARGB. +// shuffler is 16 bytes and must be aligned. +LIBYUV_API +int ARGBShuffle(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_argb, + int dst_stride_argb, + const uint8_t* shuffler, + int width, + int height); + +// Sobel ARGB effect with planar output. +LIBYUV_API +int ARGBSobelToPlane(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Sobel ARGB effect. +LIBYUV_API +int ARGBSobel(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Sobel ARGB effect w/ Sobel X, Sobel, Sobel Y in ARGB. +LIBYUV_API +int ARGBSobelXY(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_PLANAR_FUNCTIONS_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate.h new file mode 100644 index 0000000..3088822 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate.h @@ -0,0 +1,182 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_ROTATE_H_ +#define INCLUDE_LIBYUV_ROTATE_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Supported rotation. +typedef enum RotationMode { + kRotate0 = 0, // No rotation. + kRotate90 = 90, // Rotate 90 degrees clockwise. + kRotate180 = 180, // Rotate 180 degrees. + kRotate270 = 270, // Rotate 270 degrees clockwise. + + // Deprecated. + kRotateNone = 0, + kRotateClockwise = 90, + kRotateCounterClockwise = 270, +} RotationModeEnum; + +// Rotate I420 frame. +LIBYUV_API +int I420Rotate(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode mode); + +// Rotate I444 frame. +LIBYUV_API +int I444Rotate(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode mode); + +// Rotate NV12 input and store in I420. +LIBYUV_API +int NV12ToI420Rotate(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode mode); + +// Rotate a plane by 0, 90, 180, or 270. +LIBYUV_API +int RotatePlane(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height, + enum RotationMode mode); + +// Rotate planes by 90, 180, 270. Deprecated. +LIBYUV_API +void RotatePlane90(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); + +LIBYUV_API +void RotatePlane180(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); + +LIBYUV_API +void RotatePlane270(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); + +// Rotations for when U and V are interleaved. +// These functions take one input pointer and +// split the data into two buffers while +// rotating them. Deprecated. +LIBYUV_API +void RotateUV90(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + +LIBYUV_API +void RotateUV180(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + +LIBYUV_API +void RotateUV270(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + +// The 90 and 270 functions are based on transposes. +// Doing a transpose with reversing the read/write +// order will result in a rotation by +- 90 degrees. +// Deprecated. +LIBYUV_API +void TransposePlane(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); + +LIBYUV_API +void TransposeUV(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_ROTATE_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate_argb.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate_argb.h new file mode 100644 index 0000000..2043294 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate_argb.h @@ -0,0 +1,37 @@ +/* + * Copyright 2012 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_ROTATE_ARGB_H_ +#define INCLUDE_LIBYUV_ROTATE_ARGB_H_ + +#include "libyuv/basic_types.h" +#include "libyuv/rotate.h" // For RotationMode. + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Rotate ARGB frame +LIBYUV_API +int ARGBRotate(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int src_width, + int src_height, + enum RotationMode mode); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_ROTATE_ARGB_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate_row.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate_row.h new file mode 100644 index 0000000..022293e --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/rotate_row.h @@ -0,0 +1,223 @@ +/* + * Copyright 2013 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_ROTATE_ROW_H_ +#define INCLUDE_LIBYUV_ROTATE_ROW_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) +#define LIBYUV_DISABLE_X86 +#endif +#if defined(__native_client__) +#define LIBYUV_DISABLE_NEON +#endif +// MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#define LIBYUV_DISABLE_X86 +#endif +#endif +// The following are available for Visual C and clangcl 32 bit: +#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) +#define HAS_TRANSPOSEWX8_SSSE3 +#define HAS_TRANSPOSEUVWX8_SSE2 +#endif + +// The following are available for GCC 32 or 64 bit: +#if !defined(LIBYUV_DISABLE_X86) && (defined(__i386__) || defined(__x86_64__)) +#define HAS_TRANSPOSEWX8_SSSE3 +#endif + +// The following are available for 64 bit GCC: +#if !defined(LIBYUV_DISABLE_X86) && defined(__x86_64__) +#define HAS_TRANSPOSEWX8_FAST_SSSE3 +#define HAS_TRANSPOSEUVWX8_SSE2 +#endif + +#if !defined(LIBYUV_DISABLE_NEON) && \ + (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__)) +#define HAS_TRANSPOSEWX8_NEON +#define HAS_TRANSPOSEUVWX8_NEON +#endif + +#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) +#define HAS_TRANSPOSEWX16_MSA +#define HAS_TRANSPOSEUVWX16_MSA +#endif + +#if !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A) +#define HAS_TRANSPOSEWX8_MMI +#define HAS_TRANSPOSEUVWX8_MMI +#endif + +void TransposeWxH_C(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); + +void TransposeWx8_C(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx16_C(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_NEON(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_SSSE3(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_MMI(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_Fast_SSSE3(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx16_MSA(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); + +void TransposeWx8_Any_NEON(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_Any_SSSE3(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_Any_MMI(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_Fast_Any_SSSE3(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx16_Any_MSA(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); + +void TransposeUVWxH_C(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + +void TransposeUVWx8_C(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx16_C(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx8_SSE2(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx8_NEON(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx8_MMI(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx16_MSA(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); + +void TransposeUVWx8_Any_SSE2(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx8_Any_NEON(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx8_Any_MMI(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx16_Any_MSA(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_ROTATE_ROW_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/row.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/row.h new file mode 100644 index 0000000..a27788c --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/row.h @@ -0,0 +1,4384 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_ROW_H_ +#define INCLUDE_LIBYUV_ROW_H_ + +#include // For malloc. + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) +#define LIBYUV_DISABLE_X86 +#endif +#if defined(__native_client__) +#define LIBYUV_DISABLE_NEON +#endif +// MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#define LIBYUV_DISABLE_X86 +#endif +#endif +// clang >= 3.5.0 required for Arm64. +#if defined(__clang__) && defined(__aarch64__) && !defined(LIBYUV_DISABLE_NEON) +#if (__clang_major__ < 3) || (__clang_major__ == 3 && (__clang_minor__ < 5)) +#define LIBYUV_DISABLE_NEON +#endif // clang >= 3.5 +#endif // __clang__ + +// GCC >= 4.7.0 required for AVX2. +#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) +#if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7)) +#define GCC_HAS_AVX2 1 +#endif // GNUC >= 4.7 +#endif // __GNUC__ + +// clang >= 3.4.0 required for AVX2. +#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) +#if (__clang_major__ > 3) || (__clang_major__ == 3 && (__clang_minor__ >= 4)) +#define CLANG_HAS_AVX2 1 +#endif // clang >= 3.4 +#endif // __clang__ + +// clang >= 6.0.0 required for AVX512. +#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) +// clang in xcode follows a different versioning scheme. +// TODO(fbarchard): fix xcode 9 ios b/789. +#if (__clang_major__ >= 7) && !defined(__APPLE__) +#define CLANG_HAS_AVX512 1 +#endif // clang >= 7 +#endif // __clang__ + +// Visual C 2012 required for AVX2. +#if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \ + _MSC_VER >= 1700 +#define VISUALC_HAS_AVX2 1 +#endif // VisualStudio >= 2012 + +// The following are available on all x86 platforms: +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) +// Conversions: +#define HAS_ABGRTOUVROW_SSSE3 +#define HAS_ABGRTOYROW_SSSE3 +#define HAS_ARGB1555TOARGBROW_SSE2 +#define HAS_ARGB4444TOARGBROW_SSE2 +#define HAS_ARGBEXTRACTALPHAROW_SSE2 +#define HAS_ARGBSETROW_X86 +#define HAS_ARGBSHUFFLEROW_SSSE3 +#define HAS_ARGBTOARGB1555ROW_SSE2 +#define HAS_ARGBTOARGB4444ROW_SSE2 +#define HAS_ARGBTORAWROW_SSSE3 +#define HAS_ARGBTORGB24ROW_SSSE3 +#define HAS_ARGBTORGB565DITHERROW_SSE2 +#define HAS_ARGBTORGB565ROW_SSE2 +#define HAS_ARGBTOUV444ROW_SSSE3 +#define HAS_ARGBTOUVJROW_SSSE3 +#define HAS_ARGBTOUVROW_SSSE3 +#define HAS_ARGBTOYJROW_SSSE3 +#define HAS_ARGBTOYROW_SSSE3 +#define HAS_BGRATOUVROW_SSSE3 +#define HAS_BGRATOYROW_SSSE3 +#define HAS_COPYROW_ERMS +#define HAS_COPYROW_SSE2 +#define HAS_H422TOARGBROW_SSSE3 +#define HAS_HALFFLOATROW_SSE2 +#define HAS_I422TOARGB1555ROW_SSSE3 +#define HAS_I422TOARGB4444ROW_SSSE3 +#define HAS_I422TOARGBROW_SSSE3 +#define HAS_I422TORGB24ROW_SSSE3 +#define HAS_I422TORGB565ROW_SSSE3 +#define HAS_I422TORGBAROW_SSSE3 +#define HAS_I422TOUYVYROW_SSE2 +#define HAS_I422TOYUY2ROW_SSE2 +#define HAS_I444TOARGBROW_SSSE3 +#define HAS_J400TOARGBROW_SSE2 +#define HAS_J422TOARGBROW_SSSE3 +#define HAS_MERGEUVROW_SSE2 +#define HAS_MIRRORROW_SSSE3 +#define HAS_MIRRORSPLITUVROW_SSSE3 +#define HAS_NV12TOARGBROW_SSSE3 +#define HAS_NV12TORGB24ROW_SSSE3 +#define HAS_NV12TORGB565ROW_SSSE3 +#define HAS_NV21TOARGBROW_SSSE3 +#define HAS_NV21TORGB24ROW_SSSE3 +#define HAS_RAWTOARGBROW_SSSE3 +#define HAS_RAWTORGB24ROW_SSSE3 +#define HAS_RAWTOYROW_SSSE3 +#define HAS_RGB24TOARGBROW_SSSE3 +#define HAS_RGB24TOYROW_SSSE3 +#define HAS_RGB24TOYJROW_SSSE3 +#define HAS_RAWTOYJROW_SSSE3 +#define HAS_RGB565TOARGBROW_SSE2 +#define HAS_RGBATOUVROW_SSSE3 +#define HAS_RGBATOYROW_SSSE3 +#define HAS_SETROW_ERMS +#define HAS_SETROW_X86 +#define HAS_SPLITUVROW_SSE2 +#define HAS_UYVYTOARGBROW_SSSE3 +#define HAS_UYVYTOUV422ROW_SSE2 +#define HAS_UYVYTOUVROW_SSE2 +#define HAS_UYVYTOYROW_SSE2 +#define HAS_YUY2TOARGBROW_SSSE3 +#define HAS_YUY2TOUV422ROW_SSE2 +#define HAS_YUY2TOUVROW_SSE2 +#define HAS_YUY2TOYROW_SSE2 + +// Effects: +#define HAS_ARGBADDROW_SSE2 +#define HAS_ARGBAFFINEROW_SSE2 +#define HAS_ARGBATTENUATEROW_SSSE3 +#define HAS_ARGBBLENDROW_SSSE3 +#define HAS_ARGBCOLORMATRIXROW_SSSE3 +#define HAS_ARGBCOLORTABLEROW_X86 +#define HAS_ARGBCOPYALPHAROW_SSE2 +#define HAS_ARGBCOPYYTOALPHAROW_SSE2 +#define HAS_ARGBGRAYROW_SSSE3 +#define HAS_ARGBLUMACOLORTABLEROW_SSSE3 +#define HAS_ARGBMIRRORROW_SSE2 +#define HAS_ARGBMULTIPLYROW_SSE2 +#define HAS_ARGBPOLYNOMIALROW_SSE2 +#define HAS_ARGBQUANTIZEROW_SSE2 +#define HAS_ARGBSEPIAROW_SSSE3 +#define HAS_ARGBSHADEROW_SSE2 +#define HAS_ARGBSUBTRACTROW_SSE2 +#define HAS_ARGBUNATTENUATEROW_SSE2 +#define HAS_BLENDPLANEROW_SSSE3 +#define HAS_COMPUTECUMULATIVESUMROW_SSE2 +#define HAS_CUMULATIVESUMTOAVERAGEROW_SSE2 +#define HAS_INTERPOLATEROW_SSSE3 +#define HAS_RGBCOLORTABLEROW_X86 +#define HAS_SOBELROW_SSE2 +#define HAS_SOBELTOPLANEROW_SSE2 +#define HAS_SOBELXROW_SSE2 +#define HAS_SOBELXYROW_SSE2 +#define HAS_SOBELYROW_SSE2 + +// The following functions fail on gcc/clang 32 bit with fpic and framepointer. +// caveat: clangcl uses row_win.cc which works. +#if defined(__x86_64__) || !defined(__pic__) || defined(__clang__) || \ + defined(_MSC_VER) +// TODO(fbarchard): fix build error on android_full_debug=1 +// https://code.google.com/p/libyuv/issues/detail?id=517 +#define HAS_I422ALPHATOARGBROW_SSSE3 +#endif +#endif + +// The following are available on all x86 platforms, but +// require VS2012, clang 3.4 or gcc 4.7. +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \ + defined(GCC_HAS_AVX2)) +#define HAS_ARGBCOPYALPHAROW_AVX2 +#define HAS_ARGBCOPYYTOALPHAROW_AVX2 +#define HAS_ARGBEXTRACTALPHAROW_AVX2 +#define HAS_ARGBMIRRORROW_AVX2 +#define HAS_ARGBPOLYNOMIALROW_AVX2 +#define HAS_ARGBSHUFFLEROW_AVX2 +#define HAS_ARGBTORGB565DITHERROW_AVX2 +#define HAS_ARGBTOUVJROW_AVX2 +#define HAS_ARGBTOUVROW_AVX2 +#define HAS_ARGBTOYJROW_AVX2 +#define HAS_ARGBTOYROW_AVX2 +#define HAS_RGB24TOYJROW_AVX2 +#define HAS_RAWTOYJROW_AVX2 +#define HAS_COPYROW_AVX +#define HAS_H422TOARGBROW_AVX2 +#define HAS_HALFFLOATROW_AVX2 +// #define HAS_HALFFLOATROW_F16C // Enable to test halffloat cast +#define HAS_I422TOARGB1555ROW_AVX2 +#define HAS_I422TOARGB4444ROW_AVX2 +#define HAS_I422TOARGBROW_AVX2 +#define HAS_I422TORGB24ROW_AVX2 +#define HAS_I422TORGB565ROW_AVX2 +#define HAS_I422TORGBAROW_AVX2 +#define HAS_I444TOARGBROW_AVX2 +#define HAS_INTERPOLATEROW_AVX2 +#define HAS_J422TOARGBROW_AVX2 +#define HAS_MERGEUVROW_AVX2 +#define HAS_MIRRORROW_AVX2 +#define HAS_NV12TOARGBROW_AVX2 +#define HAS_NV12TORGB24ROW_AVX2 +#define HAS_NV12TORGB565ROW_AVX2 +#define HAS_NV21TOARGBROW_AVX2 +#define HAS_NV21TORGB24ROW_AVX2 +#define HAS_SPLITUVROW_AVX2 +#define HAS_UYVYTOARGBROW_AVX2 +#define HAS_UYVYTOUV422ROW_AVX2 +#define HAS_UYVYTOUVROW_AVX2 +#define HAS_UYVYTOYROW_AVX2 +#define HAS_YUY2TOARGBROW_AVX2 +#define HAS_YUY2TOUV422ROW_AVX2 +#define HAS_YUY2TOUVROW_AVX2 +#define HAS_YUY2TOYROW_AVX2 + +// Effects: +#define HAS_ARGBADDROW_AVX2 +#define HAS_ARGBATTENUATEROW_AVX2 +#define HAS_ARGBMULTIPLYROW_AVX2 +#define HAS_ARGBSUBTRACTROW_AVX2 +#define HAS_ARGBUNATTENUATEROW_AVX2 +#define HAS_BLENDPLANEROW_AVX2 + +#if defined(__x86_64__) || !defined(__pic__) || defined(__clang__) || \ + defined(_MSC_VER) +// TODO(fbarchard): fix build error on android_full_debug=1 +// https://code.google.com/p/libyuv/issues/detail?id=517 +#define HAS_I422ALPHATOARGBROW_AVX2 +#endif +#endif + +// The following are available for AVX2 Visual C and clangcl 32 bit: +// TODO(fbarchard): Port to gcc. +#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) && \ + (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2)) +#define HAS_ARGB1555TOARGBROW_AVX2 +#define HAS_ARGB4444TOARGBROW_AVX2 +#define HAS_ARGBTOARGB1555ROW_AVX2 +#define HAS_ARGBTOARGB4444ROW_AVX2 +#define HAS_ARGBTORGB565ROW_AVX2 +#define HAS_J400TOARGBROW_AVX2 +#define HAS_RGB565TOARGBROW_AVX2 +#endif + +// The following are also available on x64 Visual C. +#if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && defined(_M_X64) && \ + (!defined(__clang__) || defined(__SSSE3__)) +#define HAS_I422ALPHATOARGBROW_SSSE3 +#define HAS_I422TOARGBROW_SSSE3 +#endif + +// The following are available for gcc/clang x86 platforms: +// TODO(fbarchard): Port to Visual C +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#define HAS_ABGRTOAR30ROW_SSSE3 +#define HAS_ARGBTOAR30ROW_SSSE3 +#define HAS_CONVERT16TO8ROW_SSSE3 +#define HAS_CONVERT8TO16ROW_SSE2 +#define HAS_HALFMERGEUVROW_SSSE3 +#define HAS_I210TOAR30ROW_SSSE3 +#define HAS_I210TOARGBROW_SSSE3 +#define HAS_I400TOARGBROW_SSE2 +#define HAS_I422TOAR30ROW_SSSE3 +#define HAS_MERGERGBROW_SSSE3 +#define HAS_MIRRORUVROW_AVX2 +#define HAS_MIRRORUVROW_SSSE3 +#define HAS_RAWTORGBAROW_SSSE3 +#define HAS_RGB24MIRRORROW_SSSE3 +#define HAS_RGBATOYJROW_SSSE3 +#define HAS_SPLITRGBROW_SSSE3 +#define HAS_SWAPUVROW_SSSE3 +#endif + +// The following are available for AVX2 gcc/clang x86 platforms: +// TODO(fbarchard): Port to Visual C +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) && \ + (defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) +#define HAS_ABGRTOAR30ROW_AVX2 +#define HAS_ABGRTOUVROW_AVX2 +#define HAS_ABGRTOYROW_AVX2 +#define HAS_ARGBTOAR30ROW_AVX2 +#define HAS_ARGBTORAWROW_AVX2 +#define HAS_ARGBTORGB24ROW_AVX2 +#define HAS_CONVERT16TO8ROW_AVX2 +#define HAS_CONVERT8TO16ROW_AVX2 +#define HAS_HALFMERGEUVROW_AVX2 +#define HAS_I210TOAR30ROW_AVX2 +#define HAS_I210TOARGBROW_AVX2 +#define HAS_I400TOARGBROW_AVX2 +#define HAS_I422TOAR30ROW_AVX2 +#define HAS_I422TOUYVYROW_AVX2 +#define HAS_I422TOYUY2ROW_AVX2 +#define HAS_MERGEUVROW_16_AVX2 +#define HAS_MULTIPLYROW_16_AVX2 +#define HAS_RGBATOYJROW_AVX2 +#define HAS_SWAPUVROW_AVX2 +// TODO(fbarchard): Fix AVX2 version of YUV24 +// #define HAS_NV21TOYUV24ROW_AVX2 +#endif + +// The following are available for AVX512 clang x86 platforms: +// TODO(fbarchard): Port to GCC and Visual C +// TODO(fbarchard): re-enable HAS_ARGBTORGB24ROW_AVX512VBMI. Issue libyuv:789 +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) && \ + (defined(CLANG_HAS_AVX512)) +#define HAS_ARGBTORGB24ROW_AVX512VBMI +#endif + +// The following are available on Neon platforms: +#if !defined(LIBYUV_DISABLE_NEON) && \ + (defined(__aarch64__) || defined(__ARM_NEON__) || defined(LIBYUV_NEON)) +#define HAS_ABGRTOUVROW_NEON +#define HAS_ABGRTOYROW_NEON +#define HAS_ARGB1555TOARGBROW_NEON +#define HAS_ARGB1555TOUVROW_NEON +#define HAS_ARGB1555TOYROW_NEON +#define HAS_ARGB4444TOARGBROW_NEON +#define HAS_ARGB4444TOUVROW_NEON +#define HAS_ARGB4444TOYROW_NEON +#define HAS_ARGBEXTRACTALPHAROW_NEON +#define HAS_ARGBSETROW_NEON +#define HAS_ARGBTOARGB1555ROW_NEON +#define HAS_ARGBTOARGB4444ROW_NEON +#define HAS_ARGBTORAWROW_NEON +#define HAS_ARGBTORGB24ROW_NEON +#define HAS_ARGBTORGB565DITHERROW_NEON +#define HAS_ARGBTORGB565ROW_NEON +#define HAS_ARGBTOUV444ROW_NEON +#define HAS_ARGBTOUVJROW_NEON +#define HAS_ARGBTOUVROW_NEON +#define HAS_ARGBTOYJROW_NEON +#define HAS_ARGBTOYROW_NEON +#define HAS_AYUVTOUVROW_NEON +#define HAS_AYUVTOVUROW_NEON +#define HAS_AYUVTOYROW_NEON +#define HAS_BGRATOUVROW_NEON +#define HAS_BGRATOYROW_NEON +#define HAS_BYTETOFLOATROW_NEON +#define HAS_COPYROW_NEON +#define HAS_HALFFLOATROW_NEON +#define HAS_HALFMERGEUVROW_NEON +#define HAS_I400TOARGBROW_NEON +#define HAS_I422ALPHATOARGBROW_NEON +#define HAS_I422TOARGB1555ROW_NEON +#define HAS_I422TOARGB4444ROW_NEON +#define HAS_I422TOARGBROW_NEON +#define HAS_I422TORGB24ROW_NEON +#define HAS_I422TORGB565ROW_NEON +#define HAS_I422TORGBAROW_NEON +#define HAS_I422TOUYVYROW_NEON +#define HAS_I422TOYUY2ROW_NEON +#define HAS_I444TOARGBROW_NEON +#define HAS_J400TOARGBROW_NEON +#define HAS_MERGEUVROW_NEON +#define HAS_MIRRORROW_NEON +#define HAS_MIRRORUVROW_NEON +#define HAS_MIRRORSPLITUVROW_NEON +#define HAS_NV12TOARGBROW_NEON +#define HAS_NV12TORGB24ROW_NEON +#define HAS_NV12TORGB565ROW_NEON +#define HAS_NV21TOARGBROW_NEON +#define HAS_NV21TORGB24ROW_NEON +#define HAS_NV21TOYUV24ROW_NEON +#define HAS_RAWTOARGBROW_NEON +#define HAS_RAWTORGB24ROW_NEON +#define HAS_RAWTORGBAROW_NEON +#define HAS_RAWTOUVROW_NEON +#define HAS_RAWTOYJROW_NEON +#define HAS_RAWTOYROW_NEON +#define HAS_RGB24TOARGBROW_NEON +#define HAS_RGB24TOUVROW_NEON +#define HAS_RGB24TOYJROW_NEON +#define HAS_RGB24TOYROW_NEON +#define HAS_RGB565TOARGBROW_NEON +#define HAS_RGB565TOUVROW_NEON +#define HAS_RGB565TOYROW_NEON +#define HAS_RGBATOUVROW_NEON +#define HAS_RGBATOYJROW_NEON +#define HAS_RGBATOYROW_NEON +#define HAS_SETROW_NEON +#define HAS_SPLITRGBROW_NEON +#define HAS_SPLITUVROW_NEON +#define HAS_SWAPUVROW_NEON +#define HAS_UYVYTOARGBROW_NEON +#define HAS_UYVYTOUV422ROW_NEON +#define HAS_UYVYTOUVROW_NEON +#define HAS_UYVYTOYROW_NEON +#define HAS_YUY2TOARGBROW_NEON +#define HAS_YUY2TOUV422ROW_NEON +#define HAS_YUY2TOUVROW_NEON +#define HAS_YUY2TOYROW_NEON + +// Effects: +#define HAS_ARGBADDROW_NEON +#define HAS_ARGBATTENUATEROW_NEON +#define HAS_ARGBBLENDROW_NEON +#define HAS_ARGBCOLORMATRIXROW_NEON +#define HAS_ARGBGRAYROW_NEON +#define HAS_ARGBMIRRORROW_NEON +#define HAS_RGB24MIRRORROW_NEON +#define HAS_ARGBMULTIPLYROW_NEON +#define HAS_ARGBQUANTIZEROW_NEON +#define HAS_ARGBSEPIAROW_NEON +#define HAS_ARGBSHADEROW_NEON +#define HAS_ARGBSHUFFLEROW_NEON +#define HAS_ARGBSUBTRACTROW_NEON +#define HAS_INTERPOLATEROW_NEON +#define HAS_SOBELROW_NEON +#define HAS_SOBELTOPLANEROW_NEON +#define HAS_SOBELXROW_NEON +#define HAS_SOBELXYROW_NEON +#define HAS_SOBELYROW_NEON +#endif + +// The following are available on AArch64 platforms: +#if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__) +#define HAS_SCALESUMSAMPLES_NEON +#define HAS_GAUSSROW_F32_NEON +#define HAS_GAUSSCOL_F32_NEON + +#endif +#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) +#define HAS_ABGRTOUVROW_MSA +#define HAS_ABGRTOYROW_MSA +#define HAS_ARGB1555TOARGBROW_MSA +#define HAS_ARGB1555TOUVROW_MSA +#define HAS_ARGB1555TOYROW_MSA +#define HAS_ARGB4444TOARGBROW_MSA +#define HAS_ARGBADDROW_MSA +#define HAS_ARGBATTENUATEROW_MSA +#define HAS_ARGBBLENDROW_MSA +#define HAS_ARGBCOLORMATRIXROW_MSA +#define HAS_ARGBEXTRACTALPHAROW_MSA +#define HAS_ARGBGRAYROW_MSA +#define HAS_ARGBMIRRORROW_MSA +#define HAS_ARGBMULTIPLYROW_MSA +#define HAS_ARGBQUANTIZEROW_MSA +#define HAS_ARGBSEPIAROW_MSA +#define HAS_ARGBSETROW_MSA +#define HAS_ARGBSHADEROW_MSA +#define HAS_ARGBSHUFFLEROW_MSA +#define HAS_ARGBSUBTRACTROW_MSA +#define HAS_ARGBTOARGB1555ROW_MSA +#define HAS_ARGBTOARGB4444ROW_MSA +#define HAS_ARGBTORAWROW_MSA +#define HAS_ARGBTORGB24ROW_MSA +#define HAS_ARGBTORGB565DITHERROW_MSA +#define HAS_ARGBTORGB565ROW_MSA +#define HAS_ARGBTOUV444ROW_MSA +#define HAS_ARGBTOUVJROW_MSA +#define HAS_ARGBTOUVROW_MSA +#define HAS_ARGBTOYJROW_MSA +#define HAS_ARGBTOYROW_MSA +#define HAS_BGRATOUVROW_MSA +#define HAS_BGRATOYROW_MSA +#define HAS_HALFFLOATROW_MSA +#define HAS_I400TOARGBROW_MSA +#define HAS_I422ALPHATOARGBROW_MSA +#define HAS_I422TOARGBROW_MSA +#define HAS_I422TORGB24ROW_MSA +#define HAS_I422TORGBAROW_MSA +#define HAS_I422TOUYVYROW_MSA +#define HAS_I422TOYUY2ROW_MSA +#define HAS_I444TOARGBROW_MSA +#define HAS_I422TOARGB1555ROW_MSA +#define HAS_I422TORGB565ROW_MSA +#define HAS_INTERPOLATEROW_MSA +#define HAS_J400TOARGBROW_MSA +#define HAS_MERGEUVROW_MSA +#define HAS_MIRRORROW_MSA +#define HAS_MIRRORUVROW_MSA +#define HAS_MIRRORSPLITUVROW_MSA +#define HAS_NV12TOARGBROW_MSA +#define HAS_NV12TORGB565ROW_MSA +#define HAS_NV21TOARGBROW_MSA +#define HAS_RAWTOARGBROW_MSA +#define HAS_RAWTORGB24ROW_MSA +#define HAS_RAWTOUVROW_MSA +#define HAS_RAWTOYROW_MSA +#define HAS_RGB24TOARGBROW_MSA +#define HAS_RGB24TOUVROW_MSA +#define HAS_RGB24TOYROW_MSA +#define HAS_RGB565TOARGBROW_MSA +#define HAS_RGB565TOUVROW_MSA +#define HAS_RGB565TOYROW_MSA +#define HAS_RGBATOUVROW_MSA +#define HAS_RGBATOYROW_MSA +#define HAS_SETROW_MSA +#define HAS_SOBELROW_MSA +#define HAS_SOBELTOPLANEROW_MSA +#define HAS_SOBELXROW_MSA +#define HAS_SOBELXYROW_MSA +#define HAS_SOBELYROW_MSA +#define HAS_SPLITUVROW_MSA +#define HAS_UYVYTOARGBROW_MSA +#define HAS_UYVYTOUVROW_MSA +#define HAS_UYVYTOYROW_MSA +#define HAS_YUY2TOARGBROW_MSA +#define HAS_YUY2TOUV422ROW_MSA +#define HAS_YUY2TOUVROW_MSA +#define HAS_YUY2TOYROW_MSA +#endif + +#if !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A) +#define HAS_ABGRTOUVROW_MMI +#define HAS_ABGRTOYROW_MMI +#define HAS_ARGB1555TOARGBROW_MMI +#define HAS_ARGB1555TOUVROW_MMI +#define HAS_ARGB1555TOYROW_MMI +#define HAS_ARGB4444TOARGBROW_MMI +#define HAS_ARGB4444TOUVROW_MMI +#define HAS_ARGB4444TOYROW_MMI +#define HAS_ARGBADDROW_MMI +#define HAS_ARGBATTENUATEROW_MMI +#define HAS_ARGBBLENDROW_MMI +#define HAS_ARGBCOLORMATRIXROW_MMI +#define HAS_ARGBCOPYALPHAROW_MMI +#define HAS_ARGBCOPYYTOALPHAROW_MMI +#define HAS_ARGBEXTRACTALPHAROW_MMI +#define HAS_ARGBGRAYROW_MMI +#define HAS_ARGBMIRRORROW_MMI +#define HAS_ARGBMULTIPLYROW_MMI +#define HAS_ARGBSEPIAROW_MMI +#define HAS_ARGBSETROW_MMI +#define HAS_ARGBSHADEROW_MMI +#define HAS_ARGBSHUFFLEROW_MMI +#define HAS_ARGBSUBTRACTROW_MMI +#define HAS_ARGBTOARGB1555ROW_MMI +#define HAS_ARGBTOARGB4444ROW_MMI +#define HAS_ARGBTORAWROW_MMI +#define HAS_ARGBTORGB24ROW_MMI +#define HAS_ARGBTORGB565DITHERROW_MMI +#define HAS_ARGBTORGB565ROW_MMI +#define HAS_ARGBTOUV444ROW_MMI +#define HAS_ARGBTOUVJROW_MMI +#define HAS_ARGBTOUVROW_MMI +#define HAS_ARGBTOYJROW_MMI +#define HAS_ARGBTOYROW_MMI +#define HAS_BGRATOUVROW_MMI +#define HAS_BGRATOYROW_MMI +#define HAS_BLENDPLANEROW_MMI +#define HAS_COMPUTECUMULATIVESUMROW_MMI +#define HAS_CUMULATIVESUMTOAVERAGEROW_MMI +#define HAS_HALFFLOATROW_MMI +#define HAS_I400TOARGBROW_MMI +#define HAS_I422TOUYVYROW_MMI +#define HAS_I422TOYUY2ROW_MMI +#define HAS_I422TOARGBROW_MMI +#define HAS_I444TOARGBROW_MMI +#define HAS_INTERPOLATEROW_MMI +#define HAS_J400TOARGBROW_MMI +#define HAS_MERGERGBROW_MMI +#define HAS_MERGEUVROW_MMI +#define HAS_MIRRORROW_MMI +#define HAS_MIRRORSPLITUVROW_MMI +#define HAS_RAWTOARGBROW_MMI +#define HAS_RAWTORGB24ROW_MMI +#define HAS_RAWTOUVROW_MMI +#define HAS_RAWTOYROW_MMI +#define HAS_RGB24TOARGBROW_MMI +#define HAS_RGB24TOUVROW_MMI +#define HAS_RGB24TOYROW_MMI +#define HAS_RGB565TOARGBROW_MMI +#define HAS_RGB565TOUVROW_MMI +#define HAS_RGB565TOYROW_MMI +#define HAS_RGBATOUVROW_MMI +#define HAS_RGBATOYROW_MMI +#define HAS_SOBELROW_MMI +#define HAS_SOBELTOPLANEROW_MMI +#define HAS_SOBELXROW_MMI +#define HAS_SOBELXYROW_MMI +#define HAS_SOBELYROW_MMI +#define HAS_SPLITRGBROW_MMI +#define HAS_SPLITUVROW_MMI +#define HAS_UYVYTOUVROW_MMI +#define HAS_UYVYTOYROW_MMI +#define HAS_YUY2TOUV422ROW_MMI +#define HAS_YUY2TOUVROW_MMI +#define HAS_YUY2TOYROW_MMI +#define HAS_I210TOARGBROW_MMI +#define HAS_I422TOARGB4444ROW_MMI +#define HAS_I422TOARGB1555ROW_MMI +#define HAS_I422TORGB565ROW_MMI +#define HAS_NV21TORGB24ROW_MMI +#define HAS_NV12TORGB24ROW_MMI +#define HAS_I422ALPHATOARGBROW_MMI +#define HAS_I422TORGB24ROW_MMI +#define HAS_NV12TOARGBROW_MMI +#define HAS_NV21TOARGBROW_MMI +#define HAS_NV12TORGB565ROW_MMI +#define HAS_YUY2TOARGBROW_MMI +#define HAS_UYVYTOARGBROW_MMI +#define HAS_I422TORGBAROW_MMI +#endif + +#if defined(_MSC_VER) && !defined(__CLR_VER) && !defined(__clang__) +#if defined(VISUALC_HAS_AVX2) +#define SIMD_ALIGNED(var) __declspec(align(32)) var +#else +#define SIMD_ALIGNED(var) __declspec(align(16)) var +#endif +typedef __declspec(align(16)) int16_t vec16[8]; +typedef __declspec(align(16)) int32_t vec32[4]; +typedef __declspec(align(16)) float vecf32[4]; +typedef __declspec(align(16)) int8_t vec8[16]; +typedef __declspec(align(16)) uint16_t uvec16[8]; +typedef __declspec(align(16)) uint32_t uvec32[4]; +typedef __declspec(align(16)) uint8_t uvec8[16]; +typedef __declspec(align(32)) int16_t lvec16[16]; +typedef __declspec(align(32)) int32_t lvec32[8]; +typedef __declspec(align(32)) int8_t lvec8[32]; +typedef __declspec(align(32)) uint16_t ulvec16[16]; +typedef __declspec(align(32)) uint32_t ulvec32[8]; +typedef __declspec(align(32)) uint8_t ulvec8[32]; +#elif !defined(__pnacl__) && (defined(__GNUC__) || defined(__clang__)) +// Caveat GCC 4.2 to 4.7 have a known issue using vectors with const. +#if defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2) +#define SIMD_ALIGNED(var) var __attribute__((aligned(32))) +#else +#define SIMD_ALIGNED(var) var __attribute__((aligned(16))) +#endif +typedef int16_t __attribute__((vector_size(16))) vec16; +typedef int32_t __attribute__((vector_size(16))) vec32; +typedef float __attribute__((vector_size(16))) vecf32; +typedef int8_t __attribute__((vector_size(16))) vec8; +typedef uint16_t __attribute__((vector_size(16))) uvec16; +typedef uint32_t __attribute__((vector_size(16))) uvec32; +typedef uint8_t __attribute__((vector_size(16))) uvec8; +typedef int16_t __attribute__((vector_size(32))) lvec16; +typedef int32_t __attribute__((vector_size(32))) lvec32; +typedef int8_t __attribute__((vector_size(32))) lvec8; +typedef uint16_t __attribute__((vector_size(32))) ulvec16; +typedef uint32_t __attribute__((vector_size(32))) ulvec32; +typedef uint8_t __attribute__((vector_size(32))) ulvec8; +#else +#define SIMD_ALIGNED(var) var +typedef int16_t vec16[8]; +typedef int32_t vec32[4]; +typedef float vecf32[4]; +typedef int8_t vec8[16]; +typedef uint16_t uvec16[8]; +typedef uint32_t uvec32[4]; +typedef uint8_t uvec8[16]; +typedef int16_t lvec16[16]; +typedef int32_t lvec32[8]; +typedef int8_t lvec8[32]; +typedef uint16_t ulvec16[16]; +typedef uint32_t ulvec32[8]; +typedef uint8_t ulvec8[32]; +#endif + +#if defined(__aarch64__) +// This struct is for Arm64 color conversion. +struct YuvConstants { + uvec16 kUVToRB; + uvec16 kUVToRB2; + uvec16 kUVToG; + uvec16 kUVToG2; + vec16 kUVBiasBGR; + vec32 kYToRgb; +}; +#elif defined(__arm__) +// This struct is for ArmV7 color conversion. +struct YuvConstants { + uvec8 kUVToRB; + uvec8 kUVToG; + vec16 kUVBiasBGR; + vec32 kYToRgb; +}; +#else +// This struct is for Intel color conversion. +struct YuvConstants { + int8_t kUVToB[32]; + int8_t kUVToG[32]; + int8_t kUVToR[32]; + int16_t kUVBiasB[16]; + int16_t kUVBiasG[16]; + int16_t kUVBiasR[16]; + int16_t kYToRgb[16]; + int16_t kYBiasToRgb[16]; +}; + +// Offsets into YuvConstants structure +#define KUVTOB 0 +#define KUVTOG 32 +#define KUVTOR 64 +#define KUVBIASB 96 +#define KUVBIASG 128 +#define KUVBIASR 160 +#define KYTORGB 192 +#define KYBIASTORGB 224 + +#endif + +#define IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a)-1))) + +#define align_buffer_64(var, size) \ + uint8_t* var##_mem = (uint8_t*)(malloc((size) + 63)); /* NOLINT */ \ + uint8_t* var = (uint8_t*)(((intptr_t)(var##_mem) + 63) & ~63) /* NOLINT */ + +#define free_aligned_buffer_64(var) \ + free(var##_mem); \ + var = 0 + +#if defined(__APPLE__) || defined(__x86_64__) || defined(__llvm__) +#define OMITFP +#else +#define OMITFP __attribute__((optimize("omit-frame-pointer"))) +#endif + +// NaCL macros for GCC x86 and x64. +#if defined(__native_client__) +#define LABELALIGN ".p2align 5\n" +#else +#define LABELALIGN +#endif + +// Intel Code Analizer markers. Insert IACA_START IACA_END around code to be +// measured and then run with iaca -64 libyuv_unittest. +// IACA_ASM_START amd IACA_ASM_END are equivalents that can be used within +// inline assembly blocks. +// example of iaca: +// ~/iaca-lin64/bin/iaca.sh -64 -analysis LATENCY out/Release/libyuv_unittest + +#if defined(__x86_64__) || defined(__i386__) + +#define IACA_ASM_START \ + ".byte 0x0F, 0x0B\n" \ + " movl $111, %%ebx\n" \ + ".byte 0x64, 0x67, 0x90\n" + +#define IACA_ASM_END \ + " movl $222, %%ebx\n" \ + ".byte 0x64, 0x67, 0x90\n" \ + ".byte 0x0F, 0x0B\n" + +#define IACA_SSC_MARK(MARK_ID) \ + __asm__ __volatile__("\n\t movl $" #MARK_ID \ + ", %%ebx" \ + "\n\t .byte 0x64, 0x67, 0x90" \ + : \ + : \ + : "memory"); + +#define IACA_UD_BYTES __asm__ __volatile__("\n\t .byte 0x0F, 0x0B"); + +#else /* Visual C */ +#define IACA_UD_BYTES \ + { __asm _emit 0x0F __asm _emit 0x0B } + +#define IACA_SSC_MARK(x) \ + { __asm mov ebx, x __asm _emit 0x64 __asm _emit 0x67 __asm _emit 0x90 } + +#define IACA_VC64_START __writegsbyte(111, 111); +#define IACA_VC64_END __writegsbyte(222, 222); +#endif + +#define IACA_START \ + { \ + IACA_UD_BYTES \ + IACA_SSC_MARK(111) \ + } +#define IACA_END \ + { \ + IACA_SSC_MARK(222) \ + IACA_UD_BYTES \ + } + +void I444ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgba, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_NEON(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_NEON(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_NEON(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_NEON(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void YUY2ToARGBRow_NEON(const uint8_t* src_yuy2, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_NEON(const uint8_t* src_uyvy, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); + +void I422ToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_MSA(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_MSA(const uint8_t* src_yuy2, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_MSA(const uint8_t* src_uyvy, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); + +void ARGBToYRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_AVX2(const uint8_t* src_abgr, uint8_t* dst_y, int width); +void ABGRToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYJRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYJRow_AVX2(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void RGBAToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYJRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void BGRAToYRow_SSSE3(const uint8_t* src_bgra, uint8_t* dst_y, int width); +void ABGRToYRow_SSSE3(const uint8_t* src_abgr, uint8_t* dst_y, int width); +void RGBAToYRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void RGB24ToYRow_SSSE3(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RGB24ToYJRow_SSSE3(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RAWToYRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_y, int width); +void RAWToYJRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_y, int width); +void RGB24ToYJRow_AVX2(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RAWToYJRow_AVX2(const uint8_t* src_raw, uint8_t* dst_y, int width); +void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYJRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void ARGBToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToYJRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToYJRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToUV444Row_NEON(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_NEON(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_MSA(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_MSA(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_MMI(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_MMI(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_NEON(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_NEON(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_NEON(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_NEON(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_NEON(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_NEON(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_NEON(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_NEON(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB4444ToUVRow_NEON(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_MSA(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_MSA(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_MMI(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_MMI(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_MMI(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_MMI(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_MMI(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_MMI(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_MMI(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_MMI(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB4444ToUVRow_MMI(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToYRow_NEON(const uint8_t* src_bgra, uint8_t* dst_y, int width); +void ABGRToYRow_NEON(const uint8_t* src_abgr, uint8_t* dst_y, int width); +void RGBAToYRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void RGB24ToYRow_NEON(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RGB24ToYJRow_NEON(const uint8_t* src_rgb24, uint8_t* dst_yj, int width); +void RAWToYRow_NEON(const uint8_t* src_raw, uint8_t* dst_y, int width); +void RAWToYJRow_NEON(const uint8_t* src_raw, uint8_t* dst_yj, int width); +void RGB565ToYRow_NEON(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void ARGB1555ToYRow_NEON(const uint8_t* src_argb1555, + uint8_t* dst_y, + int width); +void ARGB4444ToYRow_NEON(const uint8_t* src_argb4444, + uint8_t* dst_y, + int width); +void BGRAToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ABGRToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGB24ToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RAWToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGB565ToYRow_MSA(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void ARGB1555ToYRow_MSA(const uint8_t* src_argb1555, uint8_t* dst_y, int width); +void BGRAToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ABGRToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGB24ToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RAWToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGB565ToYRow_MMI(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void ARGB1555ToYRow_MMI(const uint8_t* src_argb1555, uint8_t* dst_y, int width); +void ARGB4444ToYRow_MMI(const uint8_t* src_argb4444, uint8_t* dst_y, int width); + +void ARGBToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYJRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYJRow_C(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void BGRAToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ABGRToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGB24ToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGB24ToYJRow_C(const uint8_t* src_argb, uint8_t* dst_yj, int width); +void RAWToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RAWToYJRow_C(const uint8_t* src_argb, uint8_t* dst_yj, int width); +void RGB565ToYRow_C(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void ARGB1555ToYRow_C(const uint8_t* src_argb1555, uint8_t* dst_y, int width); +void ARGB4444ToYRow_C(const uint8_t* src_argb4444, uint8_t* dst_y, int width); +void ARGBToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void BGRAToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYJRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void BGRAToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB565ToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGB1555ToYRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToYRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void BGRAToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB565ToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGB1555ToYRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void BGRAToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB565ToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGB1555ToYRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToYRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBToUVRow_AVX2(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_AVX2(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_AVX2(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_SSSE3(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_SSSE3(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_SSSE3(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_SSSE3(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_SSSE3(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB4444ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB4444ToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_C(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_C(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB4444ToUVRow_C(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void ARGBToUV444Row_SSSE3(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void ARGBToUV444Row_C(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void MirrorRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_NEON(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_MSA(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_MMI(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_C(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorRow_Any_SSE2(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_AVX2(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_SSSE3(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_MSA(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_C(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); + +void MirrorSplitUVRow_SSSE3(const uint8_t* src, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MirrorSplitUVRow_NEON(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MirrorSplitUVRow_MSA(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MirrorSplitUVRow_MMI(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MirrorSplitUVRow_C(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void ARGBMirrorRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_NEON(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_MSA(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_MMI(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_C(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBMirrorRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBMirrorRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBMirrorRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBMirrorRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); + +void RGB24MirrorRow_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void RGB24MirrorRow_NEON(const uint8_t* src, uint8_t* dst, int width); +void RGB24MirrorRow_C(const uint8_t* src, uint8_t* dst, int width); +void RGB24MirrorRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB24MirrorRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void SplitUVRow_C(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_SSE2(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_AVX2(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_NEON(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_MSA(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_MMI(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void MergeUVRow_C(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_SSE2(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_AVX2(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_NEON(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_MSA(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_MMI(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void MergeUVRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void MergeUVRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void MergeUVRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void MergeUVRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +void HalfMergeUVRow_C(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int width); + +void HalfMergeUVRow_NEON(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int width); + +void HalfMergeUVRow_SSSE3(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int width); + +void HalfMergeUVRow_AVX2(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int width); + +void SplitRGBRow_C(const uint8_t* src_rgb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_SSSE3(const uint8_t* src_rgb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_NEON(const uint8_t* src_rgb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_MMI(const uint8_t* src_rgb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); + +void MergeRGBRow_C(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeRGBRow_SSSE3(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeRGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeRGBRow_MMI(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeRGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void MergeRGBRow_Any_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeRGBRow_Any_MMI(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); + +void MergeUVRow_16_C(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int scale, /* 64 for 10 bit */ + int width); +void MergeUVRow_16_AVX2(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int scale, + int width); + +void MultiplyRow_16_AVX2(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void MultiplyRow_16_C(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); + +void Convert8To16Row_C(const uint8_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void Convert8To16Row_SSE2(const uint8_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void Convert8To16Row_AVX2(const uint8_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void Convert8To16Row_Any_SSE2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); +void Convert8To16Row_Any_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); + +void Convert16To8Row_C(const uint16_t* src_y, + uint8_t* dst_y, + int scale, + int width); +void Convert16To8Row_SSSE3(const uint16_t* src_y, + uint8_t* dst_y, + int scale, + int width); +void Convert16To8Row_AVX2(const uint16_t* src_y, + uint8_t* dst_y, + int scale, + int width); +void Convert16To8Row_Any_SSSE3(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int scale, + int width); +void Convert16To8Row_Any_AVX2(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int scale, + int width); + +void CopyRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void CopyRow_AVX(const uint8_t* src, uint8_t* dst, int width); +void CopyRow_ERMS(const uint8_t* src, uint8_t* dst, int width); +void CopyRow_NEON(const uint8_t* src, uint8_t* dst, int width); +void CopyRow_MIPS(const uint8_t* src, uint8_t* dst, int count); +void CopyRow_C(const uint8_t* src, uint8_t* dst, int count); +void CopyRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void CopyRow_Any_AVX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void CopyRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); + +void CopyRow_16_C(const uint16_t* src, uint16_t* dst, int count); + +void ARGBCopyAlphaRow_C(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyAlphaRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyAlphaRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyAlphaRow_MMI(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyAlphaRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBCopyAlphaRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBCopyAlphaRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBExtractAlphaRow_C(const uint8_t* src_argb, uint8_t* dst_a, int width); +void ARGBExtractAlphaRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_NEON(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_MSA(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_MMI(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBExtractAlphaRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBExtractAlphaRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBExtractAlphaRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBExtractAlphaRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBCopyYToAlphaRow_C(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyYToAlphaRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyYToAlphaRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyYToAlphaRow_MMI(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyYToAlphaRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBCopyYToAlphaRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBCopyYToAlphaRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void SetRow_C(uint8_t* dst, uint8_t v8, int width); +void SetRow_MSA(uint8_t* dst, uint8_t v8, int width); +void SetRow_X86(uint8_t* dst, uint8_t v8, int width); +void SetRow_ERMS(uint8_t* dst, uint8_t v8, int width); +void SetRow_NEON(uint8_t* dst, uint8_t v8, int width); +void SetRow_Any_X86(uint8_t* dst_ptr, uint8_t v32, int width); +void SetRow_Any_NEON(uint8_t* dst_ptr, uint8_t v32, int width); + +void ARGBSetRow_C(uint8_t* dst_argb, uint32_t v32, int width); +void ARGBSetRow_X86(uint8_t* dst_argb, uint32_t v32, int width); +void ARGBSetRow_NEON(uint8_t* dst, uint32_t v32, int width); +void ARGBSetRow_Any_NEON(uint8_t* dst_ptr, uint32_t v32, int width); +void ARGBSetRow_MSA(uint8_t* dst_argb, uint32_t v32, int width); +void ARGBSetRow_Any_MSA(uint8_t* dst_ptr, uint32_t v32, int width); +void ARGBSetRow_MMI(uint8_t* dst_argb, uint32_t v32, int width); +void ARGBSetRow_Any_MMI(uint8_t* dst_ptr, uint32_t v32, int width); + +// ARGBShufflers for BGRAToARGB etc. +void ARGBShuffleRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_NEON(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_MSA(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_MMI(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); +void ARGBShuffleRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); +void ARGBShuffleRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); +void ARGBShuffleRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); +void ARGBShuffleRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); + +void RGB24ToARGBRow_SSSE3(const uint8_t* src_rgb24, + uint8_t* dst_argb, + int width); +void RAWToARGBRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToRGBARow_SSSE3(const uint8_t* src_raw, uint8_t* dst_rgba, int width); +void RAWToRGB24Row_SSSE3(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RGB565ToARGBRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGB1555ToARGBRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGB4444ToARGBRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void RGB565ToARGBRow_AVX2(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_AVX2(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_AVX2(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); + +void RGB24ToARGBRow_NEON(const uint8_t* src_rgb24, + uint8_t* dst_argb, + int width); +void RGB24ToARGBRow_MSA(const uint8_t* src_rgb24, uint8_t* dst_argb, int width); +void RGB24ToARGBRow_MMI(const uint8_t* src_rgb24, uint8_t* dst_argb, int width); +void RAWToARGBRow_NEON(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToRGBARow_NEON(const uint8_t* src_raw, uint8_t* dst_rgba, int width); +void RAWToARGBRow_MSA(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToARGBRow_MMI(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToRGB24Row_NEON(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RAWToRGB24Row_MSA(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RAWToRGB24Row_MMI(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RGB565ToARGBRow_NEON(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void RGB565ToARGBRow_MSA(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void RGB565ToARGBRow_MMI(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_NEON(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_MSA(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_MMI(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_NEON(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_MSA(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_MMI(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void RGB24ToARGBRow_C(const uint8_t* src_rgb24, uint8_t* dst_argb, int width); +void RAWToARGBRow_C(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToRGBARow_C(const uint8_t* src_raw, uint8_t* dst_rgba, int width); +void RAWToRGB24Row_C(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RGB565ToARGBRow_C(const uint8_t* src_rgb565, uint8_t* dst_argb, int width); +void ARGB1555ToARGBRow_C(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_C(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void AR30ToARGBRow_C(const uint8_t* src_ar30, uint8_t* dst_argb, int width); +void AR30ToABGRRow_C(const uint8_t* src_ar30, uint8_t* dst_abgr, int width); +void ARGBToAR30Row_C(const uint8_t* src_argb, uint8_t* dst_ar30, int width); +void AR30ToAB30Row_C(const uint8_t* src_ar30, uint8_t* dst_ab30, int width); + +void RGB24ToARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToRGBARow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToRGB24Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void RGB565ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB565ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void RGB24ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB24ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB24ToARGBRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToARGBRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToRGBARow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToARGBRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToARGBRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToRGB24Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToRGB24Row_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToRGB24Row_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB565ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB565ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB565ToARGBRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGB4444ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBToRGB24Row_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void ARGBToRAWRow_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void ARGBToRGB565Row_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBToARGB1555Row_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBToARGB4444Row_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ABGRToAR30Row_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void ARGBToAR30Row_SSSE3(const uint8_t* src, uint8_t* dst, int width); + +void ARGBToRAWRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBToRGB24Row_AVX2(const uint8_t* src, uint8_t* dst, int width); + +void ARGBToRGB24Row_AVX512VBMI(const uint8_t* src, uint8_t* dst, int width); + +void ARGBToRGB565DitherRow_C(const uint8_t* src_argb, + uint8_t* dst_rgb, + const uint32_t dither4, + int width); +void ARGBToRGB565DitherRow_SSE2(const uint8_t* src, + uint8_t* dst, + const uint32_t dither4, + int width); +void ARGBToRGB565DitherRow_AVX2(const uint8_t* src, + uint8_t* dst, + const uint32_t dither4, + int width); + +void ARGBToRGB565Row_AVX2(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB1555Row_AVX2(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToARGB4444Row_AVX2(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ABGRToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width); + +void ARGBToRGB24Row_NEON(const uint8_t* src_argb, + uint8_t* dst_rgb24, + int width); +void ARGBToRAWRow_NEON(const uint8_t* src_argb, uint8_t* dst_raw, int width); +void ARGBToRGB565Row_NEON(const uint8_t* src_argb, + uint8_t* dst_rgb565, + int width); +void ARGBToARGB1555Row_NEON(const uint8_t* src_argb, + uint8_t* dst_argb1555, + int width); +void ARGBToARGB4444Row_NEON(const uint8_t* src_argb, + uint8_t* dst_argb4444, + int width); +void ARGBToRGB565DitherRow_NEON(const uint8_t* src_argb, + uint8_t* dst_rgb, + const uint32_t dither4, + int width); +void ARGBToRGB24Row_MSA(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRAWRow_MSA(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRGB565Row_MSA(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB1555Row_MSA(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToARGB4444Row_MSA(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToRGB565DitherRow_MSA(const uint8_t* src_argb, + uint8_t* dst_rgb, + const uint32_t dither4, + int width); + +void ARGBToRGB24Row_MMI(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRAWRow_MMI(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRGB565Row_MMI(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB1555Row_MMI(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToARGB4444Row_MMI(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToRGB565DitherRow_MMI(const uint8_t* src_argb, + uint8_t* dst_rgb, + const uint32_t dither4, + int width); + +void ARGBToRGBARow_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRGB24Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRAWRow_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRGB565Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB1555Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB4444Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ABGRToAR30Row_C(const uint8_t* src_abgr, uint8_t* dst_ar30, int width); +void ARGBToAR30Row_C(const uint8_t* src_argb, uint8_t* dst_ar30, int width); + +void J400ToARGBRow_SSE2(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_AVX2(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_MSA(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_MMI(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_C(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void J400ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void J400ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void J400ToARGBRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void J400ToARGBRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); + +void I444ToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToAR30Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_C(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_C(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_C(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_C(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void YUY2ToARGBRow_C(const uint8_t* src_yuy2, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_C(const uint8_t* src_uyvy, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); + +void I422ToAR30Row_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToAR30Row_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_AVX2(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_AVX2(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_AVX2(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void NV12ToRGB565Row_AVX2(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* vu_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* vu_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_SSSE3(const uint8_t* yuy2_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_SSSE3(const uint8_t* uyvy_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_AVX2(const uint8_t* yuy2_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_AVX2(const uint8_t* uyvy_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_rgba, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToAR30Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToAR30Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_Any_AVX2(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void NV12ToRGB565Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); + +void I400ToARGBRow_C(const uint8_t* src_y, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_SSE2(const uint8_t* y_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_AVX2(const uint8_t* y_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_NEON(const uint8_t* src_y, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_MSA(const uint8_t* src_y, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_MMI(const uint8_t* src_y, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); + +// ARGB preattenuated alpha blend. +void ARGBBlendRow_SSSE3(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBBlendRow_NEON(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBBlendRow_MSA(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBBlendRow_MMI(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBBlendRow_C(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); + +// Unattenuated planar alpha blend. +void BlendPlaneRow_SSSE3(const uint8_t* src0, + const uint8_t* src1, + const uint8_t* alpha, + uint8_t* dst, + int width); +void BlendPlaneRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void BlendPlaneRow_AVX2(const uint8_t* src0, + const uint8_t* src1, + const uint8_t* alpha, + uint8_t* dst, + int width); +void BlendPlaneRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void BlendPlaneRow_MMI(const uint8_t* src0, + const uint8_t* src1, + const uint8_t* alpha, + uint8_t* dst, + int width); +void BlendPlaneRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void BlendPlaneRow_C(const uint8_t* src0, + const uint8_t* src1, + const uint8_t* alpha, + uint8_t* dst, + int width); + +// ARGB multiply images. Same API as Blend, but these require +// pointer and width alignment for SSE2. +void ARGBMultiplyRow_C(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_SSE2(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBMultiplyRow_AVX2(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBMultiplyRow_MSA(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBMultiplyRow_MMI(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +// ARGB add images. +void ARGBAddRow_C(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_SSE2(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBAddRow_AVX2(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBAddRow_NEON(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBAddRow_MSA(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBAddRow_MMI(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +// ARGB subtract images. Same API as Blend, but these require +// pointer and width alignment for SSE2. +void ARGBSubtractRow_C(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_SSE2(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBSubtractRow_AVX2(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBSubtractRow_NEON(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBSubtractRow_MSA(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBSubtractRow_MMI(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +void ARGBToRGB24Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB565Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB4444Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ABGRToAR30Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToAR30Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToRGB24Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB24Row_Any_AVX512VBMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB565DitherRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); +void ARGBToRGB565DitherRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); + +void ARGBToRGB565Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB4444Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ABGRToAR30Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToAR30Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBToRGB24Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToRGB565Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB4444Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB565DitherRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); +void ARGBToRGB24Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToRGB565Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB4444Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB565DitherRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); + +void ARGBToRGB24Row_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToRGB565Row_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB4444Row_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB565DitherRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); + +void I444ToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_Any_NEON(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void NV12ToRGB565Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); + +void YUY2ToYRow_AVX2(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_AVX2(const uint8_t* src_yuy2, + int stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_AVX2(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_SSE2(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_SSE2(const uint8_t* src_yuy2, + int stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_SSE2(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_NEON(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_NEON(const uint8_t* src_yuy2, + int stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_NEON(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_MSA(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToYRow_MMI(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_MSA(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUVRow_MMI(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_MSA(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_MMI(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_C(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_C(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_C(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToUVRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToUVRow_Any_SSE2(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_AVX2(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_AVX2(const uint8_t* src_uyvy, + int stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_AVX2(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_SSE2(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_SSE2(const uint8_t* src_uyvy, + int stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_SSE2(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_AVX2(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_AVX2(const uint8_t* src_uyvy, + int stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_AVX2(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_NEON(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_NEON(const uint8_t* src_uyvy, + int stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_NEON(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_MSA(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToYRow_MMI(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_MSA(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUVRow_MMI(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_MSA(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_MMI(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void UYVYToYRow_C(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_C(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_C(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToUVRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToUVRow_Any_SSE2(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToYRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUVRow_Any_MMI(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SwapUVRow_C(const uint8_t* src_uv, uint8_t* dst_vu, int width); +void SwapUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_vu, int width); +void SwapUVRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void SwapUVRow_SSSE3(const uint8_t* src_uv, uint8_t* dst_vu, int width); +void SwapUVRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void SwapUVRow_AVX2(const uint8_t* src_uv, uint8_t* dst_vu, int width); +void SwapUVRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void AYUVToYRow_C(const uint8_t* src_ayuv, uint8_t* dst_y, int width); +void AYUVToUVRow_C(const uint8_t* src_ayuv, + int stride_ayuv, + uint8_t* dst_uv, + int width); +void AYUVToVURow_C(const uint8_t* src_ayuv, + int stride_ayuv, + uint8_t* dst_vu, + int width); +void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width); +void AYUVToUVRow_NEON(const uint8_t* src_ayuv, + int stride_ayuv, + uint8_t* dst_uv, + int width); +void AYUVToVURow_NEON(const uint8_t* src_ayuv, + int stride_ayuv, + uint8_t* dst_vu, + int width); +void AYUVToYRow_Any_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width); +void AYUVToUVRow_Any_NEON(const uint8_t* src_ayuv, + int stride_ayuv, + uint8_t* dst_uv, + int width); +void AYUVToVURow_Any_NEON(const uint8_t* src_ayuv, + int stride_ayuv, + uint8_t* dst_vu, + int width); + +void I422ToYUY2Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_frame, + int width); +void I422ToUYVYRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_frame, + int width); +void I422ToYUY2Row_SSE2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToUYVYRow_SSE2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToYUY2Row_Any_SSE2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToYUY2Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToUYVYRow_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToYUY2Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToYUY2Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToUYVYRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToYUY2Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToYUY2Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToYUY2Row_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToUYVYRow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToUYVYRow_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToYUY2Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToYUY2Row_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); + +// Effects related row functions. +void ARGBAttenuateRow_C(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBAttenuateRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_NEON(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_MSA(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_MMI(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBAttenuateRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBAttenuateRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBAttenuateRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBAttenuateRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +// Inverse table for unattenuate, shared by C and SSE2. +extern const uint32_t fixed_invtbl8[256]; +void ARGBUnattenuateRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBUnattenuateRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBUnattenuateRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBUnattenuateRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBUnattenuateRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBGrayRow_C(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBGrayRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBGrayRow_NEON(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBGrayRow_MSA(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBGrayRow_MMI(const uint8_t* src_argb, uint8_t* dst_argb, int width); + +void ARGBSepiaRow_C(uint8_t* dst_argb, int width); +void ARGBSepiaRow_SSSE3(uint8_t* dst_argb, int width); +void ARGBSepiaRow_NEON(uint8_t* dst_argb, int width); +void ARGBSepiaRow_MSA(uint8_t* dst_argb, int width); +void ARGBSepiaRow_MMI(uint8_t* dst_argb, int width); + +void ARGBColorMatrixRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); +void ARGBColorMatrixRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); +void ARGBColorMatrixRow_NEON(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); +void ARGBColorMatrixRow_MSA(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); +void ARGBColorMatrixRow_MMI(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); + +void ARGBColorTableRow_C(uint8_t* dst_argb, + const uint8_t* table_argb, + int width); +void ARGBColorTableRow_X86(uint8_t* dst_argb, + const uint8_t* table_argb, + int width); + +void RGBColorTableRow_C(uint8_t* dst_argb, + const uint8_t* table_argb, + int width); +void RGBColorTableRow_X86(uint8_t* dst_argb, + const uint8_t* table_argb, + int width); + +void ARGBQuantizeRow_C(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); +void ARGBQuantizeRow_SSE2(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); +void ARGBQuantizeRow_NEON(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); +void ARGBQuantizeRow_MSA(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); + +void ARGBShadeRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); +void ARGBShadeRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); +void ARGBShadeRow_NEON(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); +void ARGBShadeRow_MSA(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); +void ARGBShadeRow_MMI(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); + +// Used for blur. +void CumulativeSumToAverageRow_SSE2(const int32_t* topleft, + const int32_t* botleft, + int width, + int area, + uint8_t* dst, + int count); +void ComputeCumulativeSumRow_SSE2(const uint8_t* row, + int32_t* cumsum, + const int32_t* previous_cumsum, + int width); + +void ComputeCumulativeSumRow_MMI(const uint8_t* row, + int32_t* cumsum, + const int32_t* previous_cumsum, + int width); + +void CumulativeSumToAverageRow_C(const int32_t* tl, + const int32_t* bl, + int w, + int area, + uint8_t* dst, + int count); +void ComputeCumulativeSumRow_C(const uint8_t* row, + int32_t* cumsum, + const int32_t* previous_cumsum, + int width); + +LIBYUV_API +void ARGBAffineRow_C(const uint8_t* src_argb, + int src_argb_stride, + uint8_t* dst_argb, + const float* uv_dudv, + int width); +LIBYUV_API +void ARGBAffineRow_SSE2(const uint8_t* src_argb, + int src_argb_stride, + uint8_t* dst_argb, + const float* src_dudv, + int width); + +// Used for I420Scale, ARGBScale, and ARGBInterpolate. +void InterpolateRow_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int width, + int source_y_fraction); +void InterpolateRow_SSSE3(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int dst_width, + int source_y_fraction); +void InterpolateRow_AVX2(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int dst_width, + int source_y_fraction); +void InterpolateRow_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int dst_width, + int source_y_fraction); +void InterpolateRow_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int width, + int source_y_fraction); +void InterpolateRow_MMI(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int width, + int source_y_fraction); +void InterpolateRow_Any_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, + int source_y_fraction); +void InterpolateRow_Any_SSSE3(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, + int source_y_fraction); +void InterpolateRow_Any_AVX2(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, + int source_y_fraction); +void InterpolateRow_Any_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, + int source_y_fraction); +void InterpolateRow_Any_MMI(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, + int source_y_fraction); + +void InterpolateRow_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + ptrdiff_t src_stride, + int width, + int source_y_fraction); + +// Sobel images. +void SobelXRow_C(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelXRow_SSE2(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelXRow_NEON(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelXRow_MSA(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelXRow_MMI(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelYRow_C(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelYRow_SSE2(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelYRow_NEON(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelYRow_MSA(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelYRow_MMI(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelRow_C(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_SSE2(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_NEON(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_MSA(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_MMI(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelToPlaneRow_C(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelToPlaneRow_SSE2(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelToPlaneRow_NEON(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelToPlaneRow_MSA(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelToPlaneRow_MMI(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelXYRow_C(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelXYRow_SSE2(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelXYRow_NEON(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelXYRow_MSA(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelXYRow_MMI(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelToPlaneRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelToPlaneRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelToPlaneRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelToPlaneRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelXYRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelXYRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelXYRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelXYRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +void ARGBPolynomialRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + const float* poly, + int width); +void ARGBPolynomialRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_argb, + const float* poly, + int width); +void ARGBPolynomialRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_argb, + const float* poly, + int width); + +// Scale and convert to half float. +void HalfFloatRow_C(const uint16_t* src, uint16_t* dst, float scale, int width); +void HalfFloatRow_SSE2(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void HalfFloatRow_AVX2(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void HalfFloatRow_F16C(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_F16C(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloat1Row_F16C(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloat1Row_Any_F16C(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_NEON(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void HalfFloat1Row_NEON(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloat1Row_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void HalfFloatRow_MSA(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_MSA(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void ByteToFloatRow_C(const uint8_t* src, float* dst, float scale, int width); +void ByteToFloatRow_NEON(const uint8_t* src, + float* dst, + float scale, + int width); +void ByteToFloatRow_Any_NEON(const uint8_t* src_ptr, + float* dst_ptr, + float param, + int width); + +void ARGBLumaColorTableRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + const uint8_t* luma, + uint32_t lumacoeff); +void ARGBLumaColorTableRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + const uint8_t* luma, + uint32_t lumacoeff); + +float ScaleMaxSamples_C(const float* src, float* dst, float scale, int width); +float ScaleMaxSamples_NEON(const float* src, + float* dst, + float scale, + int width); +float ScaleSumSamples_C(const float* src, float* dst, float scale, int width); +float ScaleSumSamples_NEON(const float* src, + float* dst, + float scale, + int width); +void ScaleSamples_C(const float* src, float* dst, float scale, int width); +void ScaleSamples_NEON(const float* src, float* dst, float scale, int width); + +void I210ToARGBRow_MMI(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_MMI(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_MMI(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_MMI(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_MMI(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_MMI(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_MMI(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_MMI(const uint8_t* src_yuy2, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_MMI(const uint8_t* src_uyvy, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_Any_MMI(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_Any_MMI(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_Any_MMI(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_MMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); + +void GaussRow_F32_NEON(const float* src, float* dst, int width); +void GaussRow_F32_C(const float* src, float* dst, int width); + +void GaussCol_F32_NEON(const float* src0, + const float* src1, + const float* src2, + const float* src3, + const float* src4, + float* dst, + int width); + +void GaussCol_F32_C(const float* src0, + const float* src1, + const float* src2, + const float* src3, + const float* src4, + float* dst, + int width); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_ROW_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale.h new file mode 100644 index 0000000..add5a9e --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale.h @@ -0,0 +1,204 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_SCALE_H_ +#define INCLUDE_LIBYUV_SCALE_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Supported filtering. +typedef enum FilterMode { + kFilterNone = 0, // Point sample; Fastest. + kFilterLinear = 1, // Filter horizontally only. + kFilterBilinear = 2, // Faster than box, but lower quality scaling down. + kFilterBox = 3 // Highest quality. +} FilterModeEnum; + +// Scale a YUV plane. +LIBYUV_API +void ScalePlane(const uint8_t* src, + int src_stride, + int src_width, + int src_height, + uint8_t* dst, + int dst_stride, + int dst_width, + int dst_height, + enum FilterMode filtering); + +LIBYUV_API +void ScalePlane_16(const uint16_t* src, + int src_stride, + int src_width, + int src_height, + uint16_t* dst, + int dst_stride, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Scales a YUV 4:2:0 image from the src width and height to the +// dst width and height. +// If filtering is kFilterNone, a simple nearest-neighbor algorithm is +// used. This produces basic (blocky) quality at the fastest speed. +// If filtering is kFilterBilinear, interpolation is used to produce a better +// quality image, at the expense of speed. +// If filtering is kFilterBox, averaging is used to produce ever better +// quality image, at further expense of speed. +// Returns 0 if successful. + +LIBYUV_API +int I420Scale(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +LIBYUV_API +int I420Scale_16(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Scales a YUV 4:4:4 image from the src width and height to the +// dst width and height. +// If filtering is kFilterNone, a simple nearest-neighbor algorithm is +// used. This produces basic (blocky) quality at the fastest speed. +// If filtering is kFilterBilinear, interpolation is used to produce a better +// quality image, at the expense of speed. +// If filtering is kFilterBox, averaging is used to produce ever better +// quality image, at further expense of speed. +// Returns 0 if successful. + +LIBYUV_API +int I444Scale(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +LIBYUV_API +int I444Scale_16(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Scales an NV12 image from the src width and height to the +// dst width and height. +// If filtering is kFilterNone, a simple nearest-neighbor algorithm is +// used. This produces basic (blocky) quality at the fastest speed. +// If filtering is kFilterBilinear, interpolation is used to produce a better +// quality image, at the expense of speed. +// kFilterBox is not supported for the UV channel and will be treated as +// bilinear. +// Returns 0 if successful. + +LIBYUV_API +int NV12Scale(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + int src_width, + int src_height, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int dst_width, + int dst_height, + enum FilterMode filtering); + +#ifdef __cplusplus +// Legacy API. Deprecated. +LIBYUV_API +int Scale(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + int src_stride_y, + int src_stride_u, + int src_stride_v, + int src_width, + int src_height, + uint8_t* dst_y, + uint8_t* dst_u, + uint8_t* dst_v, + int dst_stride_y, + int dst_stride_u, + int dst_stride_v, + int dst_width, + int dst_height, + LIBYUV_BOOL interpolate); + +// For testing, allow disabling of specialized scalers. +LIBYUV_API +void SetUseReferenceImpl(LIBYUV_BOOL use); +#endif // __cplusplus + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_SCALE_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_argb.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_argb.h new file mode 100644 index 0000000..7641f18 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_argb.h @@ -0,0 +1,76 @@ +/* + * Copyright 2012 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_SCALE_ARGB_H_ +#define INCLUDE_LIBYUV_SCALE_ARGB_H_ + +#include "libyuv/basic_types.h" +#include "libyuv/scale.h" // For FilterMode + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +LIBYUV_API +int ARGBScale(const uint8_t* src_argb, + int src_stride_argb, + int src_width, + int src_height, + uint8_t* dst_argb, + int dst_stride_argb, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Clipped scale takes destination rectangle coordinates for clip values. +LIBYUV_API +int ARGBScaleClip(const uint8_t* src_argb, + int src_stride_argb, + int src_width, + int src_height, + uint8_t* dst_argb, + int dst_stride_argb, + int dst_width, + int dst_height, + int clip_x, + int clip_y, + int clip_width, + int clip_height, + enum FilterMode filtering); + +// Scale with YUV conversion to ARGB and clipping. +LIBYUV_API +int YUVToARGBScaleClip(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint32_t src_fourcc, + int src_width, + int src_height, + uint8_t* dst_argb, + int dst_stride_argb, + uint32_t dst_fourcc, + int dst_width, + int dst_height, + int clip_x, + int clip_y, + int clip_width, + int clip_height, + enum FilterMode filtering); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_SCALE_ARGB_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_row.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_row.h new file mode 100644 index 0000000..a386d49 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_row.h @@ -0,0 +1,1367 @@ +/* + * Copyright 2013 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_SCALE_ROW_H_ +#define INCLUDE_LIBYUV_SCALE_ROW_H_ + +#include "libyuv/basic_types.h" +#include "libyuv/scale.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) +#define LIBYUV_DISABLE_X86 +#endif +#if defined(__native_client__) +#define LIBYUV_DISABLE_NEON +#endif +// MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#define LIBYUV_DISABLE_X86 +#endif +#endif +// GCC >= 4.7.0 required for AVX2. +#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) +#if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7)) +#define GCC_HAS_AVX2 1 +#endif // GNUC >= 4.7 +#endif // __GNUC__ + +// clang >= 3.4.0 required for AVX2. +#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) +#if (__clang_major__ > 3) || (__clang_major__ == 3 && (__clang_minor__ >= 4)) +#define CLANG_HAS_AVX2 1 +#endif // clang >= 3.4 +#endif // __clang__ + +// Visual C 2012 required for AVX2. +#if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \ + _MSC_VER >= 1700 +#define VISUALC_HAS_AVX2 1 +#endif // VisualStudio >= 2012 + +// The following are available on all x86 platforms: +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) +#define HAS_FIXEDDIV1_X86 +#define HAS_FIXEDDIV_X86 +#define HAS_SCALEADDROW_SSE2 +#define HAS_SCALEARGBCOLS_SSE2 +#define HAS_SCALEARGBCOLSUP2_SSE2 +#define HAS_SCALEARGBFILTERCOLS_SSSE3 +#define HAS_SCALEARGBROWDOWN2_SSE2 +#define HAS_SCALEARGBROWDOWNEVEN_SSE2 +#define HAS_SCALECOLSUP2_SSE2 +#define HAS_SCALEFILTERCOLS_SSSE3 +#define HAS_SCALEROWDOWN2_SSSE3 +#define HAS_SCALEROWDOWN34_SSSE3 +#define HAS_SCALEROWDOWN38_SSSE3 +#define HAS_SCALEROWDOWN4_SSSE3 +#endif + +// The following are available for gcc/clang x86 platforms: +// TODO(fbarchard): Port to Visual C +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#define HAS_SCALEUVROWDOWN2BOX_SSSE3 +#endif + +// The following are available for gcc/clang x86 platforms, but +// require clang 3.4 or gcc 4.7. +// TODO(fbarchard): Port to Visual C +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || defined(__i386__)) && !defined(_MSC_VER) && \ + (defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) +#define HAS_SCALEUVROWDOWN2BOX_AVX2 +#endif + +// The following are available on all x86 platforms, but +// require VS2012, clang 3.4 or gcc 4.7. +// The code supports NaCL but requires a new compiler and validator. +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \ + defined(GCC_HAS_AVX2)) +#define HAS_SCALEADDROW_AVX2 +#define HAS_SCALEROWDOWN2_AVX2 +#define HAS_SCALEROWDOWN4_AVX2 +#endif + +// The following are available on Neon platforms: +#if !defined(LIBYUV_DISABLE_NEON) && \ + (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__)) +#define HAS_SCALEADDROW_NEON +#define HAS_SCALEARGBCOLS_NEON +#define HAS_SCALEARGBFILTERCOLS_NEON +#define HAS_SCALEARGBROWDOWN2_NEON +#define HAS_SCALEARGBROWDOWNEVEN_NEON +#define HAS_SCALEFILTERCOLS_NEON +#define HAS_SCALEROWDOWN2_NEON +#define HAS_SCALEROWDOWN34_NEON +#define HAS_SCALEROWDOWN38_NEON +#define HAS_SCALEROWDOWN4_NEON +#define HAS_SCALEUVROWDOWN2BOX_NEON +#define HAS_SCALEUVROWDOWNEVEN_NEON +#endif + +#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) +#define HAS_SCALEADDROW_MSA +#define HAS_SCALEARGBCOLS_MSA +#define HAS_SCALEARGBFILTERCOLS_MSA +#define HAS_SCALEARGBROWDOWN2_MSA +#define HAS_SCALEARGBROWDOWNEVEN_MSA +#define HAS_SCALEFILTERCOLS_MSA +#define HAS_SCALEROWDOWN2_MSA +#define HAS_SCALEROWDOWN34_MSA +#define HAS_SCALEROWDOWN38_MSA +#define HAS_SCALEROWDOWN4_MSA +#endif + +#if !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A) +#define HAS_FIXEDDIV1_MIPS +#define HAS_FIXEDDIV_MIPS +#define HAS_SCALEADDROW_16_MMI +#define HAS_SCALEADDROW_MMI +#define HAS_SCALEARGBCOLS_MMI +#define HAS_SCALEARGBCOLSUP2_MMI +#define HAS_SCALEARGBROWDOWN2_MMI +#define HAS_SCALEARGBROWDOWNEVEN_MMI +#define HAS_SCALECOLS_16_MMI +#define HAS_SCALECOLS_MMI +#define HAS_SCALEROWDOWN2_16_MMI +#define HAS_SCALEROWDOWN2_MMI +#define HAS_SCALEROWDOWN4_16_MMI +#define HAS_SCALEROWDOWN4_MMI +#define HAS_SCALEROWDOWN34_MMI +#endif + +// Scale ARGB vertically with bilinear interpolation. +void ScalePlaneVertical(int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint8_t* src_argb, + uint8_t* dst_argb, + int x, + int y, + int dy, + int bpp, + enum FilterMode filtering); + +void ScalePlaneVertical_16(int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint16_t* src_argb, + uint16_t* dst_argb, + int x, + int y, + int dy, + int wpp, + enum FilterMode filtering); + +// Simplify the filtering based on scale factors. +enum FilterMode ScaleFilterReduce(int src_width, + int src_height, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Divide num by div and return as 16.16 fixed point result. +int FixedDiv_C(int num, int div); +int FixedDiv_X86(int num, int div); +int FixedDiv_MIPS(int num, int div); +// Divide num - 1 by div - 1 and return as 16.16 fixed point result. +int FixedDiv1_C(int num, int div); +int FixedDiv1_X86(int num, int div); +int FixedDiv1_MIPS(int num, int div); +#ifdef HAS_FIXEDDIV_X86 +#define FixedDiv FixedDiv_X86 +#define FixedDiv1 FixedDiv1_X86 +#elif defined HAS_FIXEDDIV_MIPS +#define FixedDiv FixedDiv_MIPS +#define FixedDiv1 FixedDiv1_MIPS +#else +#define FixedDiv FixedDiv_C +#define FixedDiv1 FixedDiv1_C +#endif + +// Compute slope values for stepping. +void ScaleSlope(int src_width, + int src_height, + int dst_width, + int dst_height, + enum FilterMode filtering, + int* x, + int* y, + int* dx, + int* dy); + +void ScaleRowDown2_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown2Linear_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Linear_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown2Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_Odd_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown4_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown4Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown34_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown34_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown34_0_Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); +void ScaleRowDown34_0_Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* d, + int dst_width); +void ScaleRowDown34_1_Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); +void ScaleRowDown34_1_Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* d, + int dst_width); +void ScaleCols_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleCols_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleColsUp2_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int, + int); +void ScaleColsUp2_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int, + int); +void ScaleFilterCols_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleFilterCols_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleFilterCols64_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x32, + int dx); +void ScaleFilterCols64_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int x32, + int dx); +void ScaleRowDown38_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown38_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown38_3_Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + int dst_width); +void ScaleAddRow_C(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_16_C(const uint16_t* src_ptr, + uint32_t* dst_ptr, + int src_width); +void ScaleARGBRowDown2_C(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Linear_C(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_C(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_C(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_C(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBCols_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBCols64_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x32, + int dx); +void ScaleARGBColsUp2_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int, + int); +void ScaleARGBFilterCols_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols64_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x32, + int dx); +void ScaleUVRowDown2_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Linear_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVCols_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int x, + int dx); +void ScaleUVCols64_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int x32, + int dx); +void ScaleUVColsUp2_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int, + int); +void ScaleUVFilterCols_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int x, + int dx); +void ScaleUVFilterCols64_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int x32, + int dx); + +// Specialized scalers for x86. +void ScaleRowDown2_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowDown34_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Odd_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Odd_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowDown34_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleAddRow_SSE2(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_AVX2(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_Any_SSE2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); +void ScaleAddRow_Any_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); + +void ScaleFilterCols_SSSE3(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleColsUp2_SSE2(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); + +// ARGB Column functions +void ScaleARGBCols_SSE2(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_SSSE3(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBColsUp2_SSE2(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_NEON(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBCols_NEON(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_Any_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBCols_Any_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_MSA(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBCols_MSA(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_Any_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBCols_Any_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBCols_MMI(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBCols_Any_MMI(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); + +// ARGB Row functions +void ScaleARGBRowDown2_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Linear_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleARGBRowDown2Linear_NEON(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleARGBRowDown2_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Linear_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2_MMI(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Linear_MMI(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_MMI(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Linear_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Box_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Linear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Linear_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Linear_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Box_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEven_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_NEON(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_NEON(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_MMI(const uint8_t* src_argb, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_MMI(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEvenBox_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEven_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEvenBox_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEven_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEvenBox_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEven_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEvenBox_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); + +// UV Row functions +void ScaleUVRowDown2_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Linear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleUVRowDown2Linear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleUVRowDown2_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Linear_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Linear_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Linear_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Linear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Linear_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Linear_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEven_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEvenBox_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEven_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEvenBox_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEven_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEvenBox_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEven_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEvenBox_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); + +// ScaleRowDown2Box also used by planar functions +// NEON downscalers with interpolation. + +// Note - not static due to reuse in convert for 444 to 420. +void ScaleRowDown2_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Linear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); + +void ScaleRowDown4_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +// Down scale from 4 to 3 pixels. Use the neon multilane read/write +// to load up the every 4th pixel into a 4 different registers. +// Point samples 32 pixels to 24 pixels. +void ScaleRowDown34_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +// 32 -> 12 +void ScaleRowDown38_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +// 32x3 -> 12x1 +void ScaleRowDown38_3_Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +// 32x2 -> 12x1 +void ScaleRowDown38_2_Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowDown2_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Odd_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +// 32 -> 12 +void ScaleRowDown38_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +// 32x3 -> 12x1 +void ScaleRowDown38_3_Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +// 32x2 -> 12x1 +void ScaleRowDown38_2_Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleAddRow_NEON(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_Any_NEON(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); + +void ScaleFilterCols_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); + +void ScaleFilterCols_Any_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); + +void ScaleRowDown2_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Linear_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown38_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown38_2_Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleAddRow_MSA(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleFilterCols_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleRowDown34_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown34_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown34_0_Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); +void ScaleRowDown34_1_Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); + +void ScaleRowDown2_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleAddRow_Any_MSA(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); +void ScaleFilterCols_Any_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleRowDown34_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowDown2_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2_16_MMI(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown2Linear_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Linear_16_MMI(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown2Box_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_16_MMI(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown2Box_Odd_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4_16_MMI(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown4Box_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4Box_16_MMI(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleAddRow_MMI(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_16_MMI(const uint16_t* src_ptr, + uint32_t* dst_ptr, + int src_width); +void ScaleColsUp2_MMI(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleColsUp2_16_MMI(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBColsUp2_MMI(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); + +void ScaleRowDown2_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_MMI(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleAddRow_Any_MMI(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_SCALE_ROW_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_uv.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_uv.h new file mode 100644 index 0000000..1b6327a --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/scale_uv.h @@ -0,0 +1,38 @@ +/* + * Copyright 2020 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_SCALE_UV_H_ +#define INCLUDE_LIBYUV_SCALE_UV_H_ + +#include "libyuv/basic_types.h" +#include "libyuv/scale.h" // For FilterMode + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +LIBYUV_API +int UVScale(const uint8_t* src_uv, + int src_stride_uv, + int src_width, + int src_height, + uint8_t* dst_uv, + int dst_stride_uv, + int dst_width, + int dst_height, + enum FilterMode filtering); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_SCALE_UV_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/version.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/version.h new file mode 100644 index 0000000..efaac73 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/version.h @@ -0,0 +1,16 @@ +/* + * Copyright 2012 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_VERSION_H_ +#define INCLUDE_LIBYUV_VERSION_H_ + +#define LIBYUV_VERSION 1768 + +#endif // INCLUDE_LIBYUV_VERSION_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/video_common.h b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/video_common.h new file mode 100644 index 0000000..b9823d7 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/include/libyuv/video_common.h @@ -0,0 +1,206 @@ +/* + * Copyright 2011 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// Common definitions for video, including fourcc and VideoFormat. + +#ifndef INCLUDE_LIBYUV_VIDEO_COMMON_H_ +#define INCLUDE_LIBYUV_VIDEO_COMMON_H_ + +#include "libyuv/basic_types.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +////////////////////////////////////////////////////////////////////////////// +// Definition of FourCC codes +////////////////////////////////////////////////////////////////////////////// + +// Convert four characters to a FourCC code. +// Needs to be a macro otherwise the OS X compiler complains when the kFormat* +// constants are used in a switch. +#ifdef __cplusplus +#define FOURCC(a, b, c, d) \ + ((static_cast(a)) | (static_cast(b) << 8) | \ + (static_cast(c) << 16) | /* NOLINT */ \ + (static_cast(d) << 24)) /* NOLINT */ +#else +#define FOURCC(a, b, c, d) \ + (((uint32_t)(a)) | ((uint32_t)(b) << 8) | /* NOLINT */ \ + ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24)) /* NOLINT */ +#endif + +// Some pages discussing FourCC codes: +// http://www.fourcc.org/yuv.php +// http://v4l2spec.bytesex.org/spec/book1.htm +// http://developer.apple.com/quicktime/icefloe/dispatch020.html +// http://msdn.microsoft.com/library/windows/desktop/dd206750.aspx#nv12 +// http://people.xiph.org/~xiphmont/containers/nut/nut4cc.txt + +// FourCC codes grouped according to implementation efficiency. +// Primary formats should convert in 1 efficient step. +// Secondary formats are converted in 2 steps. +// Auxilliary formats call primary converters. +enum FourCC { + // 10 Primary YUV formats: 5 planar, 2 biplanar, 2 packed. + FOURCC_I420 = FOURCC('I', '4', '2', '0'), + FOURCC_I422 = FOURCC('I', '4', '2', '2'), + FOURCC_I444 = FOURCC('I', '4', '4', '4'), + FOURCC_I400 = FOURCC('I', '4', '0', '0'), + FOURCC_NV21 = FOURCC('N', 'V', '2', '1'), + FOURCC_NV12 = FOURCC('N', 'V', '1', '2'), + FOURCC_YUY2 = FOURCC('Y', 'U', 'Y', '2'), + FOURCC_UYVY = FOURCC('U', 'Y', 'V', 'Y'), + FOURCC_I010 = FOURCC('I', '0', '1', '0'), // bt.601 10 bit 420 + FOURCC_I210 = FOURCC('I', '0', '1', '0'), // bt.601 10 bit 422 + + // 1 Secondary YUV format: row biplanar. deprecated. + FOURCC_M420 = FOURCC('M', '4', '2', '0'), + + // 11 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp, 1 10 bpc + FOURCC_ARGB = FOURCC('A', 'R', 'G', 'B'), + FOURCC_BGRA = FOURCC('B', 'G', 'R', 'A'), + FOURCC_ABGR = FOURCC('A', 'B', 'G', 'R'), + FOURCC_AR30 = FOURCC('A', 'R', '3', '0'), // 10 bit per channel. 2101010. + FOURCC_AB30 = FOURCC('A', 'B', '3', '0'), // ABGR version of 10 bit + FOURCC_24BG = FOURCC('2', '4', 'B', 'G'), + FOURCC_RAW = FOURCC('r', 'a', 'w', ' '), + FOURCC_RGBA = FOURCC('R', 'G', 'B', 'A'), + FOURCC_RGBP = FOURCC('R', 'G', 'B', 'P'), // rgb565 LE. + FOURCC_RGBO = FOURCC('R', 'G', 'B', 'O'), // argb1555 LE. + FOURCC_R444 = FOURCC('R', '4', '4', '4'), // argb4444 LE. + + // 1 Primary Compressed YUV format. + FOURCC_MJPG = FOURCC('M', 'J', 'P', 'G'), + + // 14 Auxiliary YUV variations: 3 with U and V planes are swapped, 1 Alias. + FOURCC_YV12 = FOURCC('Y', 'V', '1', '2'), + FOURCC_YV16 = FOURCC('Y', 'V', '1', '6'), + FOURCC_YV24 = FOURCC('Y', 'V', '2', '4'), + FOURCC_YU12 = FOURCC('Y', 'U', '1', '2'), // Linux version of I420. + FOURCC_J420 = + FOURCC('J', '4', '2', '0'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_J422 = + FOURCC('J', '4', '2', '2'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_J444 = + FOURCC('J', '4', '4', '4'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_J400 = + FOURCC('J', '4', '0', '0'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_H420 = FOURCC('H', '4', '2', '0'), // bt.709, unofficial fourcc + FOURCC_H422 = FOURCC('H', '4', '2', '2'), // bt.709, unofficial fourcc + FOURCC_H444 = FOURCC('H', '4', '4', '4'), // bt.709, unofficial fourcc + FOURCC_U420 = FOURCC('U', '4', '2', '0'), // bt.2020, unofficial fourcc + FOURCC_U422 = FOURCC('U', '4', '2', '2'), // bt.2020, unofficial fourcc + FOURCC_U444 = FOURCC('U', '4', '4', '4'), // bt.2020, unofficial fourcc + FOURCC_H010 = FOURCC('H', '0', '1', '0'), // bt.709 10 bit 420 + FOURCC_U010 = FOURCC('U', '0', '1', '0'), // bt.2020 10 bit 420 + FOURCC_H210 = FOURCC('H', '0', '1', '0'), // bt.709 10 bit 422 + FOURCC_U210 = FOURCC('U', '0', '1', '0'), // bt.2020 10 bit 422 + + // 14 Auxiliary aliases. CanonicalFourCC() maps these to canonical fourcc. + FOURCC_IYUV = FOURCC('I', 'Y', 'U', 'V'), // Alias for I420. + FOURCC_YU16 = FOURCC('Y', 'U', '1', '6'), // Alias for I422. + FOURCC_YU24 = FOURCC('Y', 'U', '2', '4'), // Alias for I444. + FOURCC_YUYV = FOURCC('Y', 'U', 'Y', 'V'), // Alias for YUY2. + FOURCC_YUVS = FOURCC('y', 'u', 'v', 's'), // Alias for YUY2 on Mac. + FOURCC_HDYC = FOURCC('H', 'D', 'Y', 'C'), // Alias for UYVY. + FOURCC_2VUY = FOURCC('2', 'v', 'u', 'y'), // Alias for UYVY on Mac. + FOURCC_JPEG = FOURCC('J', 'P', 'E', 'G'), // Alias for MJPG. + FOURCC_DMB1 = FOURCC('d', 'm', 'b', '1'), // Alias for MJPG on Mac. + FOURCC_BA81 = FOURCC('B', 'A', '8', '1'), // Alias for BGGR. + FOURCC_RGB3 = FOURCC('R', 'G', 'B', '3'), // Alias for RAW. + FOURCC_BGR3 = FOURCC('B', 'G', 'R', '3'), // Alias for 24BG. + FOURCC_CM32 = FOURCC(0, 0, 0, 32), // Alias for BGRA kCMPixelFormat_32ARGB + FOURCC_CM24 = FOURCC(0, 0, 0, 24), // Alias for RAW kCMPixelFormat_24RGB + FOURCC_L555 = FOURCC('L', '5', '5', '5'), // Alias for RGBO. + FOURCC_L565 = FOURCC('L', '5', '6', '5'), // Alias for RGBP. + FOURCC_5551 = FOURCC('5', '5', '5', '1'), // Alias for RGBO. + + // deprecated formats. Not supported, but defined for backward compatibility. + FOURCC_I411 = FOURCC('I', '4', '1', '1'), + FOURCC_Q420 = FOURCC('Q', '4', '2', '0'), + FOURCC_RGGB = FOURCC('R', 'G', 'G', 'B'), + FOURCC_BGGR = FOURCC('B', 'G', 'G', 'R'), + FOURCC_GRBG = FOURCC('G', 'R', 'B', 'G'), + FOURCC_GBRG = FOURCC('G', 'B', 'R', 'G'), + FOURCC_H264 = FOURCC('H', '2', '6', '4'), + + // Match any fourcc. + FOURCC_ANY = -1, +}; + +enum FourCCBpp { + // Canonical fourcc codes used in our code. + FOURCC_BPP_I420 = 12, + FOURCC_BPP_I422 = 16, + FOURCC_BPP_I444 = 24, + FOURCC_BPP_I411 = 12, + FOURCC_BPP_I400 = 8, + FOURCC_BPP_NV21 = 12, + FOURCC_BPP_NV12 = 12, + FOURCC_BPP_YUY2 = 16, + FOURCC_BPP_UYVY = 16, + FOURCC_BPP_M420 = 12, // deprecated + FOURCC_BPP_Q420 = 12, + FOURCC_BPP_ARGB = 32, + FOURCC_BPP_BGRA = 32, + FOURCC_BPP_ABGR = 32, + FOURCC_BPP_RGBA = 32, + FOURCC_BPP_AR30 = 32, + FOURCC_BPP_AB30 = 32, + FOURCC_BPP_24BG = 24, + FOURCC_BPP_RAW = 24, + FOURCC_BPP_RGBP = 16, + FOURCC_BPP_RGBO = 16, + FOURCC_BPP_R444 = 16, + FOURCC_BPP_RGGB = 8, + FOURCC_BPP_BGGR = 8, + FOURCC_BPP_GRBG = 8, + FOURCC_BPP_GBRG = 8, + FOURCC_BPP_YV12 = 12, + FOURCC_BPP_YV16 = 16, + FOURCC_BPP_YV24 = 24, + FOURCC_BPP_YU12 = 12, + FOURCC_BPP_J420 = 12, + FOURCC_BPP_J400 = 8, + FOURCC_BPP_H420 = 12, + FOURCC_BPP_H422 = 16, + FOURCC_BPP_H010 = 24, + FOURCC_BPP_MJPG = 0, // 0 means unknown. + FOURCC_BPP_H264 = 0, + FOURCC_BPP_IYUV = 12, + FOURCC_BPP_YU16 = 16, + FOURCC_BPP_YU24 = 24, + FOURCC_BPP_YUYV = 16, + FOURCC_BPP_YUVS = 16, + FOURCC_BPP_HDYC = 16, + FOURCC_BPP_2VUY = 16, + FOURCC_BPP_JPEG = 1, + FOURCC_BPP_DMB1 = 1, + FOURCC_BPP_BA81 = 8, + FOURCC_BPP_RGB3 = 24, + FOURCC_BPP_BGR3 = 24, + FOURCC_BPP_CM32 = 32, + FOURCC_BPP_CM24 = 24, + + // Match any fourcc. + FOURCC_BPP_ANY = 0, // 0 means unknown. +}; + +// Converts fourcc aliases into canonical ones. +LIBYUV_API uint32_t CanonicalFourCC(uint32_t fourcc); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_VIDEO_COMMON_H_ diff --git a/yuv_convert/src/main/cpp/yuv_convert/jni_yuv_convert.cpp b/yuv_convert/src/main/cpp/yuv_convert/jni_yuv_convert.cpp new file mode 100644 index 0000000..fff15d8 --- /dev/null +++ b/yuv_convert/src/main/cpp/yuv_convert/jni_yuv_convert.cpp @@ -0,0 +1,200 @@ +// +// Created by zmy on 21-1-11. +// + +#include "jni.h" +#include "android/log.h" +#include "libyuv.h" + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_I420Format(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_u, + jint stride_v, jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_u = src_y + height * stride_y; + auto src_v = src_u + height / 2 * stride_u; + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_u = dst_y + height * width; + auto dst_v = dst_u + height / 2 * width / 2; + return libyuv::I420Copy(src_y, stride_y, src_u, stride_u, src_v, stride_v, dst_y, width, dst_u, + width / 2, dst_v, width / 2, width, height); +} + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_I420ToNV21(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_u, + jint stride_v, jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_u = src_y + height * stride_y; + auto src_v = src_u + height / 2 * stride_u; + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_uv = dst_y + height * width; + return libyuv::I420ToNV21(src_y, stride_y, src_u, stride_u, src_v, stride_v, dst_y, width, + dst_uv, width, width, height); +} + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_I420ToNV12(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_u, + jint stride_v, jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_u = src_y + height * stride_y; + auto src_v = src_u + height / 2 * stride_u; + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_uv = dst_y + height * width; + return libyuv::I420ToNV12(src_y, stride_y, src_u, stride_u, src_v, stride_v, dst_y, width, + dst_uv, width, width, height); +} + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_I420ToRGBA(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_u, + jint stride_v, jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_u = src_y + height * stride_y; + auto src_v = src_u + height / 2 * stride_u; + + auto dst_rgba = (uint8_t *) env->GetDirectBufferAddress(out); + return libyuv::I420ToABGR(src_y, stride_y, src_u, stride_u, src_v, stride_v, dst_rgba, + width * 4, width, height); +} + + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_NV12Format(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_uv, + jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_uv = src_y + height * stride_y; + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_uv = dst_y + height * width; + return libyuv::NV12Copy(src_y, stride_y, src_uv, stride_uv, dst_y, width, dst_uv, width, width, + height); +} +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_NV12ToI420(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_uv, + jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_uv = src_y + height * stride_y; + + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_u = dst_y + height * width; + auto dst_v = dst_u + height * width / 4; + + return libyuv::NV12ToI420(src_y, stride_y, src_uv, stride_uv, dst_y, width, dst_u, width / 2, + dst_v, width / 2, width, height); +} + + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_NV12ToRGBA(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_uv, + jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_uv = src_y + height * stride_y; + + auto dst_rgba = (uint8_t *) env->GetDirectBufferAddress(out); + + return libyuv::NV12ToABGR(src_y, stride_y, src_uv, stride_uv, dst_rgba, width * 4, width, + height); +} + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_NV21Format(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_uv, + jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_uv = src_y + height * stride_y; + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_uv = dst_y + height * width; + return libyuv::NV21Copy(src_y, stride_y, src_uv, stride_uv, dst_y, width, dst_uv, width, width, + height); +} + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_NV21ToI420(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_uv, + jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_uv = src_y + height * stride_y; + + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_u = dst_y + height * width; + auto dst_v = dst_u + height / 2 * width / 2; + + return libyuv::NV21ToI420(src_y, stride_y, src_uv, stride_uv, dst_y, width, dst_u, width / 2, + dst_v, width / 2, width, height); + +} + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_NV21ToRGBA(JNIEnv *env, jclass clazz, jint width, jint height, + jobject yuv, jint stride_y, jint stride_uv, + jobject out) { + auto src_y = (uint8_t *) env->GetDirectBufferAddress(yuv); + auto src_uv = src_y + height * stride_y; + + auto dst_rgba = (uint8_t *) env->GetDirectBufferAddress(out); + return libyuv::NV21ToABGR(src_y, stride_y, src_uv, stride_uv, dst_rgba, width * 4, width, + height); +} + + +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_RGBAFormat(JNIEnv *env, jclass clazz, jint width, jint height, + jobject rgba, jint stride, jobject out) { + auto src_rgba = (uint8_t *) env->GetDirectBufferAddress(rgba); + auto dst_rgba = (uint8_t *) env->GetDirectBufferAddress(out); + return libyuv::ARGBCopy(src_rgba, stride, dst_rgba, width * 4, width, height); +} +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_RGBAToI420(JNIEnv *env, jclass clazz, jint width, jint height, + jobject rgba, jint stride, jobject out) { + auto src_rgba = (uint8_t *) env->GetDirectBufferAddress(rgba); + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_u = dst_y + height * width; + auto dst_v = dst_u + height / 2 * width / 2; + return libyuv::ABGRToI420(src_rgba, stride, dst_y, width, dst_u, width / 2, dst_v, width / 2, + width, height); +} +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_RGBAToNV12(JNIEnv *env, jclass clazz, jint width, jint height, + jobject rgba, jint stride, jobject out) { + auto src_rgba = (uint8_t *) env->GetDirectBufferAddress(rgba); + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_uv = dst_y + height * width; + return libyuv::ABGRToNV12(src_rgba, stride, dst_y, width, dst_uv, width, width, height); +} +extern "C" +JNIEXPORT jint JNICALL +Java_com_zmy_yuv_1convert_YUVConvert_RGBAToNV21(JNIEnv *env, jclass clazz, jint width, jint height, + jobject rgba, jint stride, jobject out) { + auto src_rgba = (uint8_t *) env->GetDirectBufferAddress(rgba); + + auto dst_y = (uint8_t *) env->GetDirectBufferAddress(out); + auto dst_uv = dst_y + height * width; + return libyuv::ABGRToNV21(src_rgba, stride, dst_y, width, dst_uv, width, width, height); +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/Converter.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/Converter.kt new file mode 100644 index 0000000..fa57b23 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/Converter.kt @@ -0,0 +1,58 @@ +package com.zmy.yuv_convert + +import com.zmy.yuv_convert.Format.* +import com.zmy.yuv_convert.input.Input +import com.zmy.yuv_convert.output.Output +import com.zmy.yuv_convert.output.PackedByteBufferOutput + +class Converter(private val input: Input) { + private val tempOutput by lazy { PackedByteBufferOutput(Format.YUV420) } + fun convert(output: Output) { + input.getInputData()?.let { inputData -> + output.update(inputData.width, inputData.height) + val container = output.getDataContainer() + when (inputData.format) { + YUV420 -> { + when (output.format) { + YUV420 -> YUVConvert.I420Format(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], inputData.strides[2], container) + RGBA -> YUVConvert.I420ToRGBA(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], inputData.strides[2], container) + NV12 -> YUVConvert.I420ToNV12(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], inputData.strides[2], container) + NV21 -> YUVConvert.I420ToNV21(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], inputData.strides[2], container) + } + } + NV12 -> { + when (output.format) { + NV12 -> YUVConvert.NV12Format(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], container) + YUV420 -> YUVConvert.NV12ToI420(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], container) + RGBA -> YUVConvert.NV12ToRGBA(inputData.width, inputData.height, input.getInputData()!!.data, inputData.strides[0], inputData.strides[1], container) + NV21 -> { + tempOutput.update(inputData.width, inputData.height) + YUVConvert.NV12ToI420(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], tempOutput.getDataContainer()) + YUVConvert.I420ToNV21(inputData.width, inputData.height, tempOutput.getOutput(), inputData.width, inputData.width / 2, inputData.width / 2, container) + } + } + } + NV21 -> { + when (output.format) { + NV21 -> YUVConvert.NV21Format(inputData.width, inputData.height, input.getInputData()!!.data, inputData.strides[0], inputData.strides[1], container) + YUV420 -> YUVConvert.NV21ToI420(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], container) + RGBA -> YUVConvert.NV21ToRGBA(inputData.width, inputData.height, input.getInputData()!!.data, inputData.strides[0], inputData.strides[1], container) + NV12 -> { + tempOutput.update(inputData.width, inputData.height) + YUVConvert.NV21ToI420(inputData.width, inputData.height, inputData.data, inputData.strides[0], inputData.strides[1], tempOutput.getDataContainer()) + YUVConvert.I420ToNV12(inputData.width, inputData.height, tempOutput.getOutput(), inputData.width, inputData.width / 2, inputData.width / 2, container) + } + } + } + RGBA -> { + when (output.format) { + RGBA -> YUVConvert.RGBAFormat(inputData.width, inputData.height, inputData.data, inputData.strides[0], container) + NV21 -> YUVConvert.RGBAToNV21(inputData.width, inputData.height, inputData.data, inputData.strides[0], container) + NV12 -> YUVConvert.RGBAToNV12(inputData.width, inputData.height, inputData.data, inputData.strides[0], container) + YUV420 -> YUVConvert.RGBAToI420(inputData.width, inputData.height, inputData.data, inputData.strides[0], container) + } + } + } + } + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/Format.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/Format.kt new file mode 100644 index 0000000..d798221 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/Format.kt @@ -0,0 +1,55 @@ +package com.zmy.yuv_convert + +enum class Format { + RGBA { + override fun getComponentCapacity(component: Int, width: Int, height: Int): Int { + return width * height * 4 + } + override fun getComponentCount() = 1 + override fun getStandardStride(width: Int, height: Int) = intArrayOf(width * 4) + }, + YUV420 { + override fun getComponentCapacity(component: Int, width: Int, height: Int): Int { + return if (component == 0) { + width * height + } else { + width * height / 4 + } + } + override fun getComponentCount() = 3 + override fun getStandardStride(width: Int, height: Int) = intArrayOf(width, width / 2, width / 2) + }, + NV12 { + override fun getComponentCapacity(component: Int, width: Int, height: Int): Int { + return if (component == 0) { + width * height + } else { + width * height / 2 + } + } + override fun getComponentCount() = 2 + override fun getStandardStride(width: Int, height: Int) = intArrayOf(width, width) + }, + NV21 { + override fun getComponentCapacity(component: Int, width: Int, height: Int): Int { + return if (component == 0) { + width * height + } else { + width * height / 2 + } + } + override fun getComponentCount() = 2 + override fun getStandardStride(width: Int, height: Int) = intArrayOf(width, width) + }; + + abstract fun getComponentCapacity(component: Int, width: Int, height: Int): Int + abstract fun getComponentCount(): Int + abstract fun getStandardStride(width: Int, height: Int): IntArray + fun getMinFrameSize(width: Int, height: Int): Int { + var size = 0 + for (i in 0 until this.getComponentCount()) { + size += getComponentCapacity(i, width, height) + } + return size + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/YUVConvert.java b/yuv_convert/src/main/java/com/zmy/yuv_convert/YUVConvert.java new file mode 100644 index 0000000..1fa6a22 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/YUVConvert.java @@ -0,0 +1,45 @@ +package com.zmy.yuv_convert; + +import java.nio.ByteBuffer; + +public class YUVConvert { + static { + System.loadLibrary("yuv_converter"); + } + + //yuv420 to other format + static native int I420Format(int width, int height, ByteBuffer yuv, int strideY, int strideU, int strideV, ByteBuffer out); + + static native int I420ToNV21(int width, int height, ByteBuffer yuv, int strideY, int strideU, int strideV, ByteBuffer out); + + static native int I420ToNV12(int width, int height, ByteBuffer yuv, int strideY, int strideU, int strideV, ByteBuffer out); + + static native int I420ToRGBA(int width, int height, ByteBuffer yuv, int strideY, int strideU, int strideV, ByteBuffer out); + + //nv12 to other format + static native int NV12Format(int width, int height, ByteBuffer yuv, int strideY, int strideUV, ByteBuffer out); + + static native int NV12ToI420(int width, int height, ByteBuffer yuv, int strideY, int strideUV, ByteBuffer out); + + static native int NV12ToRGBA(int width, int height, ByteBuffer yuv, int strideY, int strideUV, ByteBuffer out); + + //nv21 to other format + static native int NV21Format(int width, int height, ByteBuffer yuv, int strideY, int strideUV, ByteBuffer out); + + static native int NV21ToI420(int width, int height, ByteBuffer yuv, int strideY, int strideUV, ByteBuffer out); + + + static native int NV21ToRGBA(int width, int height, ByteBuffer yuv, int strideY, int strideUV, ByteBuffer out); + + + //rgba to other format + static native int RGBAFormat(int width, int height, ByteBuffer rgba, int stride, ByteBuffer out); + + static native int RGBAToI420(int width, int height, ByteBuffer rgba, int stride, ByteBuffer out); + + static native int RGBAToNV12(int width, int height, ByteBuffer rgba, int stride, ByteBuffer out); + + static native int RGBAToNV21(int width, int height, ByteBuffer rgba, int stride, ByteBuffer out); + + +} diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/input/ByteArrayInput.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/ByteArrayInput.kt new file mode 100644 index 0000000..7c330b5 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/ByteArrayInput.kt @@ -0,0 +1,26 @@ +package com.zmy.yuv_convert.input + +import com.zmy.yuv_convert.Format +import java.nio.ByteBuffer +import kotlin.math.max + +class ByteArrayInput : Input>() { + + private var buffer: ByteBuffer? = null + + override fun provide(data: Array, format: Format, width: Int, height: Int, stride: IntArray) { + val totalCapacity = max(data.map { it.size }.reduce { s, t -> s + t }, format.getMinFrameSize(width, height)) + if (buffer?.capacity() ?: -1 < totalCapacity) { + buffer = ByteBuffer.allocateDirect(totalCapacity) + } + var start = 0 + data.forEachIndexed { component, inputData -> + buffer?.position(start) + buffer?.limit(start + inputData.size) + buffer?.put(inputData) + buffer?.position(0) + start += max(inputData.size, format.getComponentCapacity(component, width, height)) + } + inputData = InputData(buffer!!, format, width, height, stride) + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/input/ByteBufferInput.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/ByteBufferInput.kt new file mode 100644 index 0000000..6aac082 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/ByteBufferInput.kt @@ -0,0 +1,26 @@ +package com.zmy.yuv_convert.input + +import com.zmy.yuv_convert.Format +import java.nio.ByteBuffer +import kotlin.math.max + +class ByteBufferInput : Input>() { + private var buffer: ByteBuffer? = null + override fun provide(data: Array, format: Format, width: Int, height: Int, stride: IntArray) { + val totalCapacity = max(data.map { it.capacity() }.reduce { s, t -> s + t }, format.getMinFrameSize(width, height)) + if ((buffer?.capacity() ?: -1) < totalCapacity) { + buffer = ByteBuffer.allocateDirect(totalCapacity) + } + var start = 0 + data.forEachIndexed { component, it -> + it.position(0) + it.limit(it.capacity()) + buffer?.position(start) + buffer?.limit(start + it.capacity()) + buffer?.put(it) + buffer?.position(0) + start += max(it.capacity(), format.getComponentCapacity(component, width, height)) + } + inputData = InputData(buffer!!, format, width, height, stride) + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/input/Input.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/Input.kt new file mode 100644 index 0000000..880d346 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/Input.kt @@ -0,0 +1,12 @@ +package com.zmy.yuv_convert.input + +import com.zmy.yuv_convert.Format + +abstract class Input { + protected var inputData: InputData? = null + @Synchronized set + @Synchronized get + + abstract fun provide(data: T, format: Format, width: Int, height: Int, stride: IntArray) + internal fun getInputData() = inputData +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/input/InputData.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/InputData.kt new file mode 100644 index 0000000..819cb17 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/InputData.kt @@ -0,0 +1,10 @@ +package com.zmy.yuv_convert.input + +import com.zmy.yuv_convert.Format +import java.nio.ByteBuffer + +data class InputData(val data: ByteBuffer, val format: Format, val width: Int, val height: Int, val strides: IntArray) { + init { + data.position(0) + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/input/PackedByteArrayInput.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/PackedByteArrayInput.kt new file mode 100644 index 0000000..ac97ef7 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/PackedByteArrayInput.kt @@ -0,0 +1,19 @@ +package com.zmy.yuv_convert.input + +import com.zmy.yuv_convert.Format +import java.nio.ByteBuffer +import kotlin.math.max + +class PackedByteArrayInput : Input() { + private var buffer: ByteBuffer? = null + override fun provide(data: ByteArray, format: Format, width: Int, height: Int, stride: IntArray) { + val targetCapacity = max(format.getMinFrameSize(width, height), data.size) + if ((buffer?.capacity() ?: -1) < targetCapacity) { + buffer = ByteBuffer.allocateDirect(targetCapacity) + } + buffer?.position(0) + buffer?.put(data, 0, data.size) + buffer?.position(0) + inputData = InputData(buffer!!, format, width, height, stride) + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/input/PackedByteBufferInput.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/PackedByteBufferInput.kt new file mode 100644 index 0000000..c6efc2b --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/input/PackedByteBufferInput.kt @@ -0,0 +1,20 @@ +package com.zmy.yuv_convert.input + +import com.zmy.yuv_convert.Format +import java.nio.ByteBuffer +import kotlin.math.max + +class PackedByteBufferInput : Input() { + private var buffer: ByteBuffer? = null + override fun provide(data: ByteBuffer, format: Format, width: Int, height: Int, stride: IntArray) { + val targetCapacity = max(format.getMinFrameSize(width, height), data.capacity()) + if ((buffer?.capacity() ?: -1) < targetCapacity) { + buffer = ByteBuffer.allocateDirect(max(format.getMinFrameSize(width, height), data.capacity())) + } + buffer?.position(0) + data.position(0) + buffer?.put(data) + buffer?.position(0) + inputData = InputData(buffer!!, format, width, height, stride) + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/output/ByteArrayOutput.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/ByteArrayOutput.kt new file mode 100644 index 0000000..122ac81 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/ByteArrayOutput.kt @@ -0,0 +1,27 @@ +package com.zmy.yuv_convert.output + +import com.zmy.yuv_convert.Format + +class ByteArrayOutput(format: Format) : Output>(format) { + private var ret = mutableListOf() + override fun getOutput(): Array { + for (i in 0 until format.getComponentCount()) { + if (i >= ret.size) { + ret.add(ByteArray(format.getComponentCapacity(i, width, height))) + } else { + if (ret[i].size < format.getComponentCapacity(i, width, height)) { + ret[i] = ByteArray(format.getComponentCapacity(i, width, height)) + } + } + } + var start = 0 + ret.forEachIndexed { component, buffer -> + container?.position(start) + val size = format.getComponentCapacity(component, width, height) + container?.limit(start + size) + start += format.getComponentCapacity(component, width, height) + container?.get(buffer) + } + return ret.toTypedArray() + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/output/ByteBufferOutput.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/ByteBufferOutput.kt new file mode 100644 index 0000000..b2f31df --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/ByteBufferOutput.kt @@ -0,0 +1,18 @@ +package com.zmy.yuv_convert.output + +import com.zmy.yuv_convert.Format +import java.nio.ByteBuffer + +class ByteBufferOutput(format: Format) : Output>(format) { + private var ret: Array? = null + override fun getOutput(): Array { + var start = 0 + ret = Array(format.getComponentCount()) { + container?.position(start) + container?.limit(start + format.getComponentCapacity(it, width, height)) + start += format.getComponentCapacity(it, width, height) + container!!.slice() + } + return ret!! + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/output/Output.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/Output.kt new file mode 100644 index 0000000..1df7c90 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/Output.kt @@ -0,0 +1,23 @@ +package com.zmy.yuv_convert.output + +import com.zmy.yuv_convert.Format +import java.nio.ByteBuffer + +abstract class Output(val format: Format) { + protected var container: ByteBuffer? = null + protected var width = 0 + protected var height = 0 + internal fun getDataContainer(): ByteBuffer { + val size = format.getMinFrameSize(width,height) + if ((container?.capacity() ?: -1) < size) { + container = ByteBuffer.allocateDirect(size) + } + return container!! + } + + abstract fun getOutput(): T + fun update(width: Int, height: Int) { + this.width = width + this.height = height + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/output/PackedByteArrayOutput.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/PackedByteArrayOutput.kt new file mode 100644 index 0000000..7eb1248 --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/PackedByteArrayOutput.kt @@ -0,0 +1,16 @@ +package com.zmy.yuv_convert.output + +import com.zmy.yuv_convert.Format + +class PackedByteArrayOutput(format: Format) : Output(format) { + var array: ByteArray? = null + override fun getOutput(): ByteArray { + if ((array?.size ?: -1) < format.getMinFrameSize(width, height)) { + array = ByteArray(format.getMinFrameSize(width, height)) + } + container?.position(0) + container?.let { it.limit(it.capacity()) } + container?.get(array!!) + return array!! + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/java/com/zmy/yuv_convert/output/PackedByteBufferOutput.kt b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/PackedByteBufferOutput.kt new file mode 100644 index 0000000..383764b --- /dev/null +++ b/yuv_convert/src/main/java/com/zmy/yuv_convert/output/PackedByteBufferOutput.kt @@ -0,0 +1,11 @@ +package com.zmy.yuv_convert.output + +import com.zmy.yuv_convert.Format +import java.nio.ByteBuffer + +class PackedByteBufferOutput(format: Format) : Output(format) { + override fun getOutput(): ByteBuffer { + container!!.position(0) + return container!! + } +} \ No newline at end of file diff --git a/yuv_convert/src/main/jniLibs/arm64-v8a/libyuv.so b/yuv_convert/src/main/jniLibs/arm64-v8a/libyuv.so new file mode 100644 index 0000000..e69f69c Binary files /dev/null and b/yuv_convert/src/main/jniLibs/arm64-v8a/libyuv.so differ diff --git a/yuv_convert/src/main/jniLibs/armeabi-v7a/libyuv.so b/yuv_convert/src/main/jniLibs/armeabi-v7a/libyuv.so new file mode 100644 index 0000000..3a011c7 Binary files /dev/null and b/yuv_convert/src/main/jniLibs/armeabi-v7a/libyuv.so differ diff --git a/yuv_convert/src/test/java/com/zmy/yuv_convert/ExampleUnitTest.kt b/yuv_convert/src/test/java/com/zmy/yuv_convert/ExampleUnitTest.kt new file mode 100644 index 0000000..9a8a2b6 --- /dev/null +++ b/yuv_convert/src/test/java/com/zmy/yuv_convert/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.zmy.yuv_convert + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file