diff --git a/._.git b/._.git deleted file mode 100755 index ce17c252..00000000 Binary files a/._.git and /dev/null differ diff --git a/._.idea b/._.idea deleted file mode 100755 index ce17c252..00000000 Binary files a/._.idea and /dev/null differ diff --git "a/._OpenCV-Python-Toturial-\344\270\255\346\226\207\347\211\210.pdf" "b/._OpenCV-Python-Toturial-\344\270\255\346\226\207\347\211\210.pdf" deleted file mode 100755 index 49646c16..00000000 Binary files "a/._OpenCV-Python-Toturial-\344\270\255\346\226\207\347\211\210.pdf" and /dev/null differ diff --git a/.idea/._.name b/.idea/._.name deleted file mode 100755 index ce17c252..00000000 Binary files a/.idea/._.name and /dev/null differ diff --git a/.idea/.name b/.idea/.name deleted file mode 100755 index 0103422f..00000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -OpenCV-Python-Toturial \ No newline at end of file diff --git a/.idea/OpenCV-Python-Toturial.iml b/.idea/OpenCV-Python-Toturial.iml deleted file mode 100755 index 01f09723..00000000 --- a/.idea/OpenCV-Python-Toturial.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100755 index b4d6dda5..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100755 index 03d133e5..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100755 index 94a25f7f..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100755 index e4e383b5..00000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,1054 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - project - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1445085492534 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - file://$PROJECT_DIR$/ch25/HoughLines.py - 18 - - - file://$PROJECT_DIR$/ch25/HoughLines.py - 14 - - - file://$PROJECT_DIR$/ch25/HoughLines.py - 20 - - - file://$PROJECT_DIR$/48.2_OpenCV中的K值聚类/48.2.2_仅有一个特征的数据.py - 22 - - - file://$PROJECT_DIR$/48.2_OpenCV中的K值聚类/48.2.2_仅有一个特征的数据.py - 37 - - - file://$PROJECT_DIR$/48.2_OpenCV中的K值聚类/含有多个特征的数据.py - 22 - - - file://$PROJECT_DIR$/48.2_OpenCV中的K值聚类/含有多个特征的数据.py - 29 - - - file://$PROJECT_DIR$/48.2_OpenCV中的K值聚类/48.2.3_颜色量化.py - 33 - - - file://$PROJECT_DIR$/48.2_OpenCV中的K值聚类/48.2.3_颜色量化.py - 25 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..5e47d2ca --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 makelove + +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/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/README.md" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/README.md" new file mode 100644 index 00000000..a9a312f7 --- /dev/null +++ "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/README.md" @@ -0,0 +1,5 @@ +# deep-learning-opencv深度学习 +http://www.pyimagesearch.com/2017/08/21/deep-learning-with-opencv/ + +#要安装OpenCV3.3 +- pip install opencv-contrib-python diff --git "a/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/bvlc_googlenet.caffemodel" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/bvlc_googlenet.caffemodel" new file mode 100644 index 00000000..a21694f3 Binary files /dev/null and "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/bvlc_googlenet.caffemodel" differ diff --git "a/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/bvlc_googlenet.prototxt" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/bvlc_googlenet.prototxt" new file mode 100644 index 00000000..1834d4d4 --- /dev/null +++ "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/bvlc_googlenet.prototxt" @@ -0,0 +1,2157 @@ +name: "GoogleNet" +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 224 +input_dim: 224 + +layer { + name: "conv1/7x7_s2" + type: "Convolution" + bottom: "data" + top: "conv1/7x7_s2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv1/relu_7x7" + type: "ReLU" + bottom: "conv1/7x7_s2" + top: "conv1/7x7_s2" +} +layer { + name: "pool1/3x3_s2" + type: "Pooling" + bottom: "conv1/7x7_s2" + top: "pool1/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "pool1/norm1" + type: "LRN" + bottom: "pool1/3x3_s2" + top: "pool1/norm1" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layer { + name: "conv2/3x3_reduce" + type: "Convolution" + bottom: "pool1/norm1" + top: "conv2/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv2/relu_3x3_reduce" + type: "ReLU" + bottom: "conv2/3x3_reduce" + top: "conv2/3x3_reduce" +} +layer { + name: "conv2/3x3" + type: "Convolution" + bottom: "conv2/3x3_reduce" + top: "conv2/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv2/relu_3x3" + type: "ReLU" + bottom: "conv2/3x3" + top: "conv2/3x3" +} +layer { + name: "conv2/norm2" + type: "LRN" + bottom: "conv2/3x3" + top: "conv2/norm2" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layer { + name: "pool2/3x3_s2" + type: "Pooling" + bottom: "conv2/norm2" + top: "pool2/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_3a/1x1" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_1x1" + type: "ReLU" + bottom: "inception_3a/1x1" + top: "inception_3a/1x1" +} +layer { + name: "inception_3a/3x3_reduce" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3_reduce" +} +layer { + name: "inception_3a/3x3" + type: "Convolution" + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_3x3" + type: "ReLU" + bottom: "inception_3a/3x3" + top: "inception_3a/3x3" +} +layer { + name: "inception_3a/5x5_reduce" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5_reduce" +} +layer { + name: "inception_3a/5x5" + type: "Convolution" + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_5x5" + type: "ReLU" + bottom: "inception_3a/5x5" + top: "inception_3a/5x5" +} +layer { + name: "inception_3a/pool" + type: "Pooling" + bottom: "pool2/3x3_s2" + top: "inception_3a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_3a/pool_proj" + type: "Convolution" + bottom: "inception_3a/pool" + top: "inception_3a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_pool_proj" + type: "ReLU" + bottom: "inception_3a/pool_proj" + top: "inception_3a/pool_proj" +} +layer { + name: "inception_3a/output" + type: "Concat" + bottom: "inception_3a/1x1" + bottom: "inception_3a/3x3" + bottom: "inception_3a/5x5" + bottom: "inception_3a/pool_proj" + top: "inception_3a/output" +} +layer { + name: "inception_3b/1x1" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_1x1" + type: "ReLU" + bottom: "inception_3b/1x1" + top: "inception_3b/1x1" +} +layer { + name: "inception_3b/3x3_reduce" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3_reduce" +} +layer { + name: "inception_3b/3x3" + type: "Convolution" + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_3x3" + type: "ReLU" + bottom: "inception_3b/3x3" + top: "inception_3b/3x3" +} +layer { + name: "inception_3b/5x5_reduce" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5_reduce" +} +layer { + name: "inception_3b/5x5" + type: "Convolution" + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_5x5" + type: "ReLU" + bottom: "inception_3b/5x5" + top: "inception_3b/5x5" +} +layer { + name: "inception_3b/pool" + type: "Pooling" + bottom: "inception_3a/output" + top: "inception_3b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_3b/pool_proj" + type: "Convolution" + bottom: "inception_3b/pool" + top: "inception_3b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_pool_proj" + type: "ReLU" + bottom: "inception_3b/pool_proj" + top: "inception_3b/pool_proj" +} +layer { + name: "inception_3b/output" + type: "Concat" + bottom: "inception_3b/1x1" + bottom: "inception_3b/3x3" + bottom: "inception_3b/5x5" + bottom: "inception_3b/pool_proj" + top: "inception_3b/output" +} +layer { + name: "pool3/3x3_s2" + type: "Pooling" + bottom: "inception_3b/output" + top: "pool3/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_4a/1x1" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_1x1" + type: "ReLU" + bottom: "inception_4a/1x1" + top: "inception_4a/1x1" +} +layer { + name: "inception_4a/3x3_reduce" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3_reduce" +} +layer { + name: "inception_4a/3x3" + type: "Convolution" + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 208 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_3x3" + type: "ReLU" + bottom: "inception_4a/3x3" + top: "inception_4a/3x3" +} +layer { + name: "inception_4a/5x5_reduce" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5_reduce" +} +layer { + name: "inception_4a/5x5" + type: "Convolution" + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 48 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_5x5" + type: "ReLU" + bottom: "inception_4a/5x5" + top: "inception_4a/5x5" +} +layer { + name: "inception_4a/pool" + type: "Pooling" + bottom: "pool3/3x3_s2" + top: "inception_4a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4a/pool_proj" + type: "Convolution" + bottom: "inception_4a/pool" + top: "inception_4a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_pool_proj" + type: "ReLU" + bottom: "inception_4a/pool_proj" + top: "inception_4a/pool_proj" +} +layer { + name: "inception_4a/output" + type: "Concat" + bottom: "inception_4a/1x1" + bottom: "inception_4a/3x3" + bottom: "inception_4a/5x5" + bottom: "inception_4a/pool_proj" + top: "inception_4a/output" +} +layer { + name: "inception_4b/1x1" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_1x1" + type: "ReLU" + bottom: "inception_4b/1x1" + top: "inception_4b/1x1" +} +layer { + name: "inception_4b/3x3_reduce" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3_reduce" +} +layer { + name: "inception_4b/3x3" + type: "Convolution" + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 224 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_3x3" + type: "ReLU" + bottom: "inception_4b/3x3" + top: "inception_4b/3x3" +} +layer { + name: "inception_4b/5x5_reduce" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5_reduce" +} +layer { + name: "inception_4b/5x5" + type: "Convolution" + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_5x5" + type: "ReLU" + bottom: "inception_4b/5x5" + top: "inception_4b/5x5" +} +layer { + name: "inception_4b/pool" + type: "Pooling" + bottom: "inception_4a/output" + top: "inception_4b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4b/pool_proj" + type: "Convolution" + bottom: "inception_4b/pool" + top: "inception_4b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_pool_proj" + type: "ReLU" + bottom: "inception_4b/pool_proj" + top: "inception_4b/pool_proj" +} +layer { + name: "inception_4b/output" + type: "Concat" + bottom: "inception_4b/1x1" + bottom: "inception_4b/3x3" + bottom: "inception_4b/5x5" + bottom: "inception_4b/pool_proj" + top: "inception_4b/output" +} +layer { + name: "inception_4c/1x1" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_1x1" + type: "ReLU" + bottom: "inception_4c/1x1" + top: "inception_4c/1x1" +} +layer { + name: "inception_4c/3x3_reduce" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3_reduce" +} +layer { + name: "inception_4c/3x3" + type: "Convolution" + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_3x3" + type: "ReLU" + bottom: "inception_4c/3x3" + top: "inception_4c/3x3" +} +layer { + name: "inception_4c/5x5_reduce" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5_reduce" +} +layer { + name: "inception_4c/5x5" + type: "Convolution" + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_5x5" + type: "ReLU" + bottom: "inception_4c/5x5" + top: "inception_4c/5x5" +} +layer { + name: "inception_4c/pool" + type: "Pooling" + bottom: "inception_4b/output" + top: "inception_4c/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4c/pool_proj" + type: "Convolution" + bottom: "inception_4c/pool" + top: "inception_4c/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_pool_proj" + type: "ReLU" + bottom: "inception_4c/pool_proj" + top: "inception_4c/pool_proj" +} +layer { + name: "inception_4c/output" + type: "Concat" + bottom: "inception_4c/1x1" + bottom: "inception_4c/3x3" + bottom: "inception_4c/5x5" + bottom: "inception_4c/pool_proj" + top: "inception_4c/output" +} +layer { + name: "inception_4d/1x1" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_1x1" + type: "ReLU" + bottom: "inception_4d/1x1" + top: "inception_4d/1x1" +} +layer { + name: "inception_4d/3x3_reduce" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 144 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3_reduce" +} +layer { + name: "inception_4d/3x3" + type: "Convolution" + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 288 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_3x3" + type: "ReLU" + bottom: "inception_4d/3x3" + top: "inception_4d/3x3" +} +layer { + name: "inception_4d/5x5_reduce" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5_reduce" +} +layer { + name: "inception_4d/5x5" + type: "Convolution" + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_5x5" + type: "ReLU" + bottom: "inception_4d/5x5" + top: "inception_4d/5x5" +} +layer { + name: "inception_4d/pool" + type: "Pooling" + bottom: "inception_4c/output" + top: "inception_4d/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4d/pool_proj" + type: "Convolution" + bottom: "inception_4d/pool" + top: "inception_4d/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_pool_proj" + type: "ReLU" + bottom: "inception_4d/pool_proj" + top: "inception_4d/pool_proj" +} +layer { + name: "inception_4d/output" + type: "Concat" + bottom: "inception_4d/1x1" + bottom: "inception_4d/3x3" + bottom: "inception_4d/5x5" + bottom: "inception_4d/pool_proj" + top: "inception_4d/output" +} +layer { + name: "inception_4e/1x1" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_1x1" + type: "ReLU" + bottom: "inception_4e/1x1" + top: "inception_4e/1x1" +} +layer { + name: "inception_4e/3x3_reduce" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3_reduce" +} +layer { + name: "inception_4e/3x3" + type: "Convolution" + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_3x3" + type: "ReLU" + bottom: "inception_4e/3x3" + top: "inception_4e/3x3" +} +layer { + name: "inception_4e/5x5_reduce" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5_reduce" +} +layer { + name: "inception_4e/5x5" + type: "Convolution" + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_5x5" + type: "ReLU" + bottom: "inception_4e/5x5" + top: "inception_4e/5x5" +} +layer { + name: "inception_4e/pool" + type: "Pooling" + bottom: "inception_4d/output" + top: "inception_4e/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4e/pool_proj" + type: "Convolution" + bottom: "inception_4e/pool" + top: "inception_4e/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_pool_proj" + type: "ReLU" + bottom: "inception_4e/pool_proj" + top: "inception_4e/pool_proj" +} +layer { + name: "inception_4e/output" + type: "Concat" + bottom: "inception_4e/1x1" + bottom: "inception_4e/3x3" + bottom: "inception_4e/5x5" + bottom: "inception_4e/pool_proj" + top: "inception_4e/output" +} +layer { + name: "pool4/3x3_s2" + type: "Pooling" + bottom: "inception_4e/output" + top: "pool4/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_5a/1x1" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_1x1" + type: "ReLU" + bottom: "inception_5a/1x1" + top: "inception_5a/1x1" +} +layer { + name: "inception_5a/3x3_reduce" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3_reduce" +} +layer { + name: "inception_5a/3x3" + type: "Convolution" + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_3x3" + type: "ReLU" + bottom: "inception_5a/3x3" + top: "inception_5a/3x3" +} +layer { + name: "inception_5a/5x5_reduce" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5_reduce" +} +layer { + name: "inception_5a/5x5" + type: "Convolution" + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_5x5" + type: "ReLU" + bottom: "inception_5a/5x5" + top: "inception_5a/5x5" +} +layer { + name: "inception_5a/pool" + type: "Pooling" + bottom: "pool4/3x3_s2" + top: "inception_5a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_5a/pool_proj" + type: "Convolution" + bottom: "inception_5a/pool" + top: "inception_5a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_pool_proj" + type: "ReLU" + bottom: "inception_5a/pool_proj" + top: "inception_5a/pool_proj" +} +layer { + name: "inception_5a/output" + type: "Concat" + bottom: "inception_5a/1x1" + bottom: "inception_5a/3x3" + bottom: "inception_5a/5x5" + bottom: "inception_5a/pool_proj" + top: "inception_5a/output" +} +layer { + name: "inception_5b/1x1" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 384 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_1x1" + type: "ReLU" + bottom: "inception_5b/1x1" + top: "inception_5b/1x1" +} +layer { + name: "inception_5b/3x3_reduce" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3_reduce" +} +layer { + name: "inception_5b/3x3" + type: "Convolution" + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_3x3" + type: "ReLU" + bottom: "inception_5b/3x3" + top: "inception_5b/3x3" +} +layer { + name: "inception_5b/5x5_reduce" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 48 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5_reduce" +} +layer { + name: "inception_5b/5x5" + type: "Convolution" + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_5x5" + type: "ReLU" + bottom: "inception_5b/5x5" + top: "inception_5b/5x5" +} +layer { + name: "inception_5b/pool" + type: "Pooling" + bottom: "inception_5a/output" + top: "inception_5b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_5b/pool_proj" + type: "Convolution" + bottom: "inception_5b/pool" + top: "inception_5b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_pool_proj" + type: "ReLU" + bottom: "inception_5b/pool_proj" + top: "inception_5b/pool_proj" +} +layer { + name: "inception_5b/output" + type: "Concat" + bottom: "inception_5b/1x1" + bottom: "inception_5b/3x3" + bottom: "inception_5b/5x5" + bottom: "inception_5b/pool_proj" + top: "inception_5b/output" +} +layer { + name: "pool5/7x7_s1" + type: "Pooling" + bottom: "inception_5b/output" + top: "pool5/7x7_s1" + pooling_param { + pool: AVE + kernel_size: 7 + stride: 1 + } +} +layer { + name: "pool5/drop_7x7_s1" + type: "Dropout" + bottom: "pool5/7x7_s1" + top: "pool5/7x7_s1" + dropout_param { + dropout_ratio: 0.4 + } +} +layer { + name: "loss3/classifier" + type: "InnerProduct" + bottom: "pool5/7x7_s1" + top: "loss3/classifier" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "prob" + type: "Softmax" + bottom: "loss3/classifier" + top: "prob" +} diff --git "a/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/deep_learning_with_opencv.py" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/deep_learning_with_opencv.py" new file mode 100644 index 00000000..40eec72b --- /dev/null +++ "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/deep_learning_with_opencv.py" @@ -0,0 +1,78 @@ +# USAGE +''' +python deep_learning_with_opencv.py --image images/jemma.png \ + --prototxt bvlc_googlenet.prototxt \ + --model bvlc_googlenet.caffemodel --labels synset_words.txt + +python deep_learning_with_opencv.py --image images/traffic_light.png \ + --prototxt bvlc_googlenet.prototxt \ + --model bvlc_googlenet.caffemodel --labels synset_words.txt + + +python deep_learning_with_opencv.py --image images/eagle.png \ + --prototxt bvlc_googlenet.prototxt \ + --model bvlc_googlenet.caffemodel --labels synset_words.txt +''' + +# import the necessary packages +import numpy as np +import argparse +import time +import cv2 + +# construct the argument parse and parse the arguments +ap = argparse.ArgumentParser() +ap.add_argument("-i", "--image", required=True, + help="path to input image") +ap.add_argument("-p", "--prototxt", required=True, + help="path to Caffe 'deploy' prototxt file") +ap.add_argument("-m", "--model", required=True, + help="path to Caffe pre-trained model") +ap.add_argument("-l", "--labels", required=True, + help="path to ImageNet labels (i.e., syn-sets)") +args = vars(ap.parse_args()) + +# load the input image from disk +image = cv2.imread(args["image"]) + +# load the class labels from disk +rows = open(args["labels"]).read().strip().split("\n") +classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows] + +# our CNN requires fixed spatial dimensions for our input image(s) +# so we need to ensure it is resized to 224x224 pixels while +# performing mean subtraction (104, 117, 123) to normalize the input; +# after executing this command our "blob" now has the shape: +# (1, 3, 224, 224) +blob = cv2.dnn.blobFromImage(image, 1, (224, 224), (104, 117, 123)) + +# load our serialized model from disk +print("[INFO] loading model...") +net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"]) + +# set the blob as input to the network and perform a forward-pass to +# obtain our output classification +net.setInput(blob) +start = time.time() +preds = net.forward() +end = time.time() +print("[INFO] classification took {:.5} seconds".format(end - start)) + +# sort the indexes of the probabilities in descending order (higher +# probabilitiy first) and grab the top-5 predictions +idxs = np.argsort(preds[0])[::-1][:5] + +# loop over the top-5 predictions and display them +for (i, idx) in enumerate(idxs): + # draw the top prediction on the input image + if i == 0: + text = "Label: {}, {:.2f}%".format(classes[idx], preds[0][idx] * 100) + cv2.putText(image, text, (5, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) + + # display the predicted label + associated probability to the + # console + print("[INFO] {}. label: {}, probability: {:.5}".format(i + 1, classes[idx], preds[0][idx])) + +# display the output image +cv2.imshow("Image", image) +cv2.waitKey(0) diff --git "a/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/eagle.png" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/eagle.png" new file mode 100644 index 00000000..18798bdf Binary files /dev/null and "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/eagle.png" differ diff --git "a/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/jemma.png" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/jemma.png" new file mode 100644 index 00000000..ae26cd84 Binary files /dev/null and "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/jemma.png" differ diff --git "a/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/traffic_light.png" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/traffic_light.png" new file mode 100644 index 00000000..73b97b52 Binary files /dev/null and "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/traffic_light.png" differ diff --git "a/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/vending_machine.png" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/vending_machine.png" new file mode 100644 index 00000000..8d5c392f Binary files /dev/null and "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/images/vending_machine.png" differ diff --git "a/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/synset_words.txt" "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/synset_words.txt" new file mode 100644 index 00000000..a9e8c7f5 --- /dev/null +++ "b/Notebook/Blog/deep-learning-opencv\346\267\261\345\272\246\345\255\246\344\271\240dnn/synset_words.txt" @@ -0,0 +1,1000 @@ +n01440764 tench, Tinca tinca +n01443537 goldfish, Carassius auratus +n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias +n01491361 tiger shark, Galeocerdo cuvieri +n01494475 hammerhead, hammerhead shark +n01496331 electric ray, crampfish, numbfish, torpedo +n01498041 stingray +n01514668 cock +n01514859 hen +n01518878 ostrich, Struthio camelus +n01530575 brambling, Fringilla montifringilla +n01531178 goldfinch, Carduelis carduelis +n01532829 house finch, linnet, Carpodacus mexicanus +n01534433 junco, snowbird +n01537544 indigo bunting, indigo finch, indigo bird, Passerina cyanea +n01558993 robin, American robin, Turdus migratorius +n01560419 bulbul +n01580077 jay +n01582220 magpie +n01592084 chickadee +n01601694 water ouzel, dipper +n01608432 kite +n01614925 bald eagle, American eagle, Haliaeetus leucocephalus +n01616318 vulture +n01622779 great grey owl, great gray owl, Strix nebulosa +n01629819 European fire salamander, Salamandra salamandra +n01630670 common newt, Triturus vulgaris +n01631663 eft +n01632458 spotted salamander, Ambystoma maculatum +n01632777 axolotl, mud puppy, Ambystoma mexicanum +n01641577 bullfrog, Rana catesbeiana +n01644373 tree frog, tree-frog +n01644900 tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui +n01664065 loggerhead, loggerhead turtle, Caretta caretta +n01665541 leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea +n01667114 mud turtle +n01667778 terrapin +n01669191 box turtle, box tortoise +n01675722 banded gecko +n01677366 common iguana, iguana, Iguana iguana +n01682714 American chameleon, anole, Anolis carolinensis +n01685808 whiptail, whiptail lizard +n01687978 agama +n01688243 frilled lizard, Chlamydosaurus kingi +n01689811 alligator lizard +n01692333 Gila monster, Heloderma suspectum +n01693334 green lizard, Lacerta viridis +n01694178 African chameleon, Chamaeleo chamaeleon +n01695060 Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis +n01697457 African crocodile, Nile crocodile, Crocodylus niloticus +n01698640 American alligator, Alligator mississipiensis +n01704323 triceratops +n01728572 thunder snake, worm snake, Carphophis amoenus +n01728920 ringneck snake, ring-necked snake, ring snake +n01729322 hognose snake, puff adder, sand viper +n01729977 green snake, grass snake +n01734418 king snake, kingsnake +n01735189 garter snake, grass snake +n01737021 water snake +n01739381 vine snake +n01740131 night snake, Hypsiglena torquata +n01742172 boa constrictor, Constrictor constrictor +n01744401 rock python, rock snake, Python sebae +n01748264 Indian cobra, Naja naja +n01749939 green mamba +n01751748 sea snake +n01753488 horned viper, cerastes, sand viper, horned asp, Cerastes cornutus +n01755581 diamondback, diamondback rattlesnake, Crotalus adamanteus +n01756291 sidewinder, horned rattlesnake, Crotalus cerastes +n01768244 trilobite +n01770081 harvestman, daddy longlegs, Phalangium opilio +n01770393 scorpion +n01773157 black and gold garden spider, Argiope aurantia +n01773549 barn spider, Araneus cavaticus +n01773797 garden spider, Aranea diademata +n01774384 black widow, Latrodectus mactans +n01774750 tarantula +n01775062 wolf spider, hunting spider +n01776313 tick +n01784675 centipede +n01795545 black grouse +n01796340 ptarmigan +n01797886 ruffed grouse, partridge, Bonasa umbellus +n01798484 prairie chicken, prairie grouse, prairie fowl +n01806143 peacock +n01806567 quail +n01807496 partridge +n01817953 African grey, African gray, Psittacus erithacus +n01818515 macaw +n01819313 sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita +n01820546 lorikeet +n01824575 coucal +n01828970 bee eater +n01829413 hornbill +n01833805 hummingbird +n01843065 jacamar +n01843383 toucan +n01847000 drake +n01855032 red-breasted merganser, Mergus serrator +n01855672 goose +n01860187 black swan, Cygnus atratus +n01871265 tusker +n01872401 echidna, spiny anteater, anteater +n01873310 platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus +n01877812 wallaby, brush kangaroo +n01882714 koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus +n01883070 wombat +n01910747 jellyfish +n01914609 sea anemone, anemone +n01917289 brain coral +n01924916 flatworm, platyhelminth +n01930112 nematode, nematode worm, roundworm +n01943899 conch +n01944390 snail +n01945685 slug +n01950731 sea slug, nudibranch +n01955084 chiton, coat-of-mail shell, sea cradle, polyplacophore +n01968897 chambered nautilus, pearly nautilus, nautilus +n01978287 Dungeness crab, Cancer magister +n01978455 rock crab, Cancer irroratus +n01980166 fiddler crab +n01981276 king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica +n01983481 American lobster, Northern lobster, Maine lobster, Homarus americanus +n01984695 spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish +n01985128 crayfish, crawfish, crawdad, crawdaddy +n01986214 hermit crab +n01990800 isopod +n02002556 white stork, Ciconia ciconia +n02002724 black stork, Ciconia nigra +n02006656 spoonbill +n02007558 flamingo +n02009229 little blue heron, Egretta caerulea +n02009912 American egret, great white heron, Egretta albus +n02011460 bittern +n02012849 crane +n02013706 limpkin, Aramus pictus +n02017213 European gallinule, Porphyrio porphyrio +n02018207 American coot, marsh hen, mud hen, water hen, Fulica americana +n02018795 bustard +n02025239 ruddy turnstone, Arenaria interpres +n02027492 red-backed sandpiper, dunlin, Erolia alpina +n02028035 redshank, Tringa totanus +n02033041 dowitcher +n02037110 oystercatcher, oyster catcher +n02051845 pelican +n02056570 king penguin, Aptenodytes patagonica +n02058221 albatross, mollymawk +n02066245 grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus +n02071294 killer whale, killer, orca, grampus, sea wolf, Orcinus orca +n02074367 dugong, Dugong dugon +n02077923 sea lion +n02085620 Chihuahua +n02085782 Japanese spaniel +n02085936 Maltese dog, Maltese terrier, Maltese +n02086079 Pekinese, Pekingese, Peke +n02086240 Shih-Tzu +n02086646 Blenheim spaniel +n02086910 papillon +n02087046 toy terrier +n02087394 Rhodesian ridgeback +n02088094 Afghan hound, Afghan +n02088238 basset, basset hound +n02088364 beagle +n02088466 bloodhound, sleuthhound +n02088632 bluetick +n02089078 black-and-tan coonhound +n02089867 Walker hound, Walker foxhound +n02089973 English foxhound +n02090379 redbone +n02090622 borzoi, Russian wolfhound +n02090721 Irish wolfhound +n02091032 Italian greyhound +n02091134 whippet +n02091244 Ibizan hound, Ibizan Podenco +n02091467 Norwegian elkhound, elkhound +n02091635 otterhound, otter hound +n02091831 Saluki, gazelle hound +n02092002 Scottish deerhound, deerhound +n02092339 Weimaraner +n02093256 Staffordshire bullterrier, Staffordshire bull terrier +n02093428 American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier +n02093647 Bedlington terrier +n02093754 Border terrier +n02093859 Kerry blue terrier +n02093991 Irish terrier +n02094114 Norfolk terrier +n02094258 Norwich terrier +n02094433 Yorkshire terrier +n02095314 wire-haired fox terrier +n02095570 Lakeland terrier +n02095889 Sealyham terrier, Sealyham +n02096051 Airedale, Airedale terrier +n02096177 cairn, cairn terrier +n02096294 Australian terrier +n02096437 Dandie Dinmont, Dandie Dinmont terrier +n02096585 Boston bull, Boston terrier +n02097047 miniature schnauzer +n02097130 giant schnauzer +n02097209 standard schnauzer +n02097298 Scotch terrier, Scottish terrier, Scottie +n02097474 Tibetan terrier, chrysanthemum dog +n02097658 silky terrier, Sydney silky +n02098105 soft-coated wheaten terrier +n02098286 West Highland white terrier +n02098413 Lhasa, Lhasa apso +n02099267 flat-coated retriever +n02099429 curly-coated retriever +n02099601 golden retriever +n02099712 Labrador retriever +n02099849 Chesapeake Bay retriever +n02100236 German short-haired pointer +n02100583 vizsla, Hungarian pointer +n02100735 English setter +n02100877 Irish setter, red setter +n02101006 Gordon setter +n02101388 Brittany spaniel +n02101556 clumber, clumber spaniel +n02102040 English springer, English springer spaniel +n02102177 Welsh springer spaniel +n02102318 cocker spaniel, English cocker spaniel, cocker +n02102480 Sussex spaniel +n02102973 Irish water spaniel +n02104029 kuvasz +n02104365 schipperke +n02105056 groenendael +n02105162 malinois +n02105251 briard +n02105412 kelpie +n02105505 komondor +n02105641 Old English sheepdog, bobtail +n02105855 Shetland sheepdog, Shetland sheep dog, Shetland +n02106030 collie +n02106166 Border collie +n02106382 Bouvier des Flandres, Bouviers des Flandres +n02106550 Rottweiler +n02106662 German shepherd, German shepherd dog, German police dog, alsatian +n02107142 Doberman, Doberman pinscher +n02107312 miniature pinscher +n02107574 Greater Swiss Mountain dog +n02107683 Bernese mountain dog +n02107908 Appenzeller +n02108000 EntleBucher +n02108089 boxer +n02108422 bull mastiff +n02108551 Tibetan mastiff +n02108915 French bulldog +n02109047 Great Dane +n02109525 Saint Bernard, St Bernard +n02109961 Eskimo dog, husky +n02110063 malamute, malemute, Alaskan malamute +n02110185 Siberian husky +n02110341 dalmatian, coach dog, carriage dog +n02110627 affenpinscher, monkey pinscher, monkey dog +n02110806 basenji +n02110958 pug, pug-dog +n02111129 Leonberg +n02111277 Newfoundland, Newfoundland dog +n02111500 Great Pyrenees +n02111889 Samoyed, Samoyede +n02112018 Pomeranian +n02112137 chow, chow chow +n02112350 keeshond +n02112706 Brabancon griffon +n02113023 Pembroke, Pembroke Welsh corgi +n02113186 Cardigan, Cardigan Welsh corgi +n02113624 toy poodle +n02113712 miniature poodle +n02113799 standard poodle +n02113978 Mexican hairless +n02114367 timber wolf, grey wolf, gray wolf, Canis lupus +n02114548 white wolf, Arctic wolf, Canis lupus tundrarum +n02114712 red wolf, maned wolf, Canis rufus, Canis niger +n02114855 coyote, prairie wolf, brush wolf, Canis latrans +n02115641 dingo, warrigal, warragal, Canis dingo +n02115913 dhole, Cuon alpinus +n02116738 African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus +n02117135 hyena, hyaena +n02119022 red fox, Vulpes vulpes +n02119789 kit fox, Vulpes macrotis +n02120079 Arctic fox, white fox, Alopex lagopus +n02120505 grey fox, gray fox, Urocyon cinereoargenteus +n02123045 tabby, tabby cat +n02123159 tiger cat +n02123394 Persian cat +n02123597 Siamese cat, Siamese +n02124075 Egyptian cat +n02125311 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor +n02127052 lynx, catamount +n02128385 leopard, Panthera pardus +n02128757 snow leopard, ounce, Panthera uncia +n02128925 jaguar, panther, Panthera onca, Felis onca +n02129165 lion, king of beasts, Panthera leo +n02129604 tiger, Panthera tigris +n02130308 cheetah, chetah, Acinonyx jubatus +n02132136 brown bear, bruin, Ursus arctos +n02133161 American black bear, black bear, Ursus americanus, Euarctos americanus +n02134084 ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus +n02134418 sloth bear, Melursus ursinus, Ursus ursinus +n02137549 mongoose +n02138441 meerkat, mierkat +n02165105 tiger beetle +n02165456 ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle +n02167151 ground beetle, carabid beetle +n02168699 long-horned beetle, longicorn, longicorn beetle +n02169497 leaf beetle, chrysomelid +n02172182 dung beetle +n02174001 rhinoceros beetle +n02177972 weevil +n02190166 fly +n02206856 bee +n02219486 ant, emmet, pismire +n02226429 grasshopper, hopper +n02229544 cricket +n02231487 walking stick, walkingstick, stick insect +n02233338 cockroach, roach +n02236044 mantis, mantid +n02256656 cicada, cicala +n02259212 leafhopper +n02264363 lacewing, lacewing fly +n02268443 dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk +n02268853 damselfly +n02276258 admiral +n02277742 ringlet, ringlet butterfly +n02279972 monarch, monarch butterfly, milkweed butterfly, Danaus plexippus +n02280649 cabbage butterfly +n02281406 sulphur butterfly, sulfur butterfly +n02281787 lycaenid, lycaenid butterfly +n02317335 starfish, sea star +n02319095 sea urchin +n02321529 sea cucumber, holothurian +n02325366 wood rabbit, cottontail, cottontail rabbit +n02326432 hare +n02328150 Angora, Angora rabbit +n02342885 hamster +n02346627 porcupine, hedgehog +n02356798 fox squirrel, eastern fox squirrel, Sciurus niger +n02361337 marmot +n02363005 beaver +n02364673 guinea pig, Cavia cobaya +n02389026 sorrel +n02391049 zebra +n02395406 hog, pig, grunter, squealer, Sus scrofa +n02396427 wild boar, boar, Sus scrofa +n02397096 warthog +n02398521 hippopotamus, hippo, river horse, Hippopotamus amphibius +n02403003 ox +n02408429 water buffalo, water ox, Asiatic buffalo, Bubalus bubalis +n02410509 bison +n02412080 ram, tup +n02415577 bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis +n02417914 ibex, Capra ibex +n02422106 hartebeest +n02422699 impala, Aepyceros melampus +n02423022 gazelle +n02437312 Arabian camel, dromedary, Camelus dromedarius +n02437616 llama +n02441942 weasel +n02442845 mink +n02443114 polecat, fitch, foulmart, foumart, Mustela putorius +n02443484 black-footed ferret, ferret, Mustela nigripes +n02444819 otter +n02445715 skunk, polecat, wood pussy +n02447366 badger +n02454379 armadillo +n02457408 three-toed sloth, ai, Bradypus tridactylus +n02480495 orangutan, orang, orangutang, Pongo pygmaeus +n02480855 gorilla, Gorilla gorilla +n02481823 chimpanzee, chimp, Pan troglodytes +n02483362 gibbon, Hylobates lar +n02483708 siamang, Hylobates syndactylus, Symphalangus syndactylus +n02484975 guenon, guenon monkey +n02486261 patas, hussar monkey, Erythrocebus patas +n02486410 baboon +n02487347 macaque +n02488291 langur +n02488702 colobus, colobus monkey +n02489166 proboscis monkey, Nasalis larvatus +n02490219 marmoset +n02492035 capuchin, ringtail, Cebus capucinus +n02492660 howler monkey, howler +n02493509 titi, titi monkey +n02493793 spider monkey, Ateles geoffroyi +n02494079 squirrel monkey, Saimiri sciureus +n02497673 Madagascar cat, ring-tailed lemur, Lemur catta +n02500267 indri, indris, Indri indri, Indri brevicaudatus +n02504013 Indian elephant, Elephas maximus +n02504458 African elephant, Loxodonta africana +n02509815 lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens +n02510455 giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca +n02514041 barracouta, snoek +n02526121 eel +n02536864 coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch +n02606052 rock beauty, Holocanthus tricolor +n02607072 anemone fish +n02640242 sturgeon +n02641379 gar, garfish, garpike, billfish, Lepisosteus osseus +n02643566 lionfish +n02655020 puffer, pufferfish, blowfish, globefish +n02666196 abacus +n02667093 abaya +n02669723 academic gown, academic robe, judge's robe +n02672831 accordion, piano accordion, squeeze box +n02676566 acoustic guitar +n02687172 aircraft carrier, carrier, flattop, attack aircraft carrier +n02690373 airliner +n02692877 airship, dirigible +n02699494 altar +n02701002 ambulance +n02704792 amphibian, amphibious vehicle +n02708093 analog clock +n02727426 apiary, bee house +n02730930 apron +n02747177 ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin +n02749479 assault rifle, assault gun +n02769748 backpack, back pack, knapsack, packsack, rucksack, haversack +n02776631 bakery, bakeshop, bakehouse +n02777292 balance beam, beam +n02782093 balloon +n02783161 ballpoint, ballpoint pen, ballpen, Biro +n02786058 Band Aid +n02787622 banjo +n02788148 bannister, banister, balustrade, balusters, handrail +n02790996 barbell +n02791124 barber chair +n02791270 barbershop +n02793495 barn +n02794156 barometer +n02795169 barrel, cask +n02797295 barrow, garden cart, lawn cart, wheelbarrow +n02799071 baseball +n02802426 basketball +n02804414 bassinet +n02804610 bassoon +n02807133 bathing cap, swimming cap +n02808304 bath towel +n02808440 bathtub, bathing tub, bath, tub +n02814533 beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon +n02814860 beacon, lighthouse, beacon light, pharos +n02815834 beaker +n02817516 bearskin, busby, shako +n02823428 beer bottle +n02823750 beer glass +n02825657 bell cote, bell cot +n02834397 bib +n02835271 bicycle-built-for-two, tandem bicycle, tandem +n02837789 bikini, two-piece +n02840245 binder, ring-binder +n02841315 binoculars, field glasses, opera glasses +n02843684 birdhouse +n02859443 boathouse +n02860847 bobsled, bobsleigh, bob +n02865351 bolo tie, bolo, bola tie, bola +n02869837 bonnet, poke bonnet +n02870880 bookcase +n02871525 bookshop, bookstore, bookstall +n02877765 bottlecap +n02879718 bow +n02883205 bow tie, bow-tie, bowtie +n02892201 brass, memorial tablet, plaque +n02892767 brassiere, bra, bandeau +n02894605 breakwater, groin, groyne, mole, bulwark, seawall, jetty +n02895154 breastplate, aegis, egis +n02906734 broom +n02909870 bucket, pail +n02910353 buckle +n02916936 bulletproof vest +n02917067 bullet train, bullet +n02927161 butcher shop, meat market +n02930766 cab, hack, taxi, taxicab +n02939185 caldron, cauldron +n02948072 candle, taper, wax light +n02950826 cannon +n02951358 canoe +n02951585 can opener, tin opener +n02963159 cardigan +n02965783 car mirror +n02966193 carousel, carrousel, merry-go-round, roundabout, whirligig +n02966687 carpenter's kit, tool kit +n02971356 carton +n02974003 car wheel +n02977058 cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM +n02978881 cassette +n02979186 cassette player +n02980441 castle +n02981792 catamaran +n02988304 CD player +n02992211 cello, violoncello +n02992529 cellular telephone, cellular phone, cellphone, cell, mobile phone +n02999410 chain +n03000134 chainlink fence +n03000247 chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour +n03000684 chain saw, chainsaw +n03014705 chest +n03016953 chiffonier, commode +n03017168 chime, bell, gong +n03018349 china cabinet, china closet +n03026506 Christmas stocking +n03028079 church, church building +n03032252 cinema, movie theater, movie theatre, movie house, picture palace +n03041632 cleaver, meat cleaver, chopper +n03042490 cliff dwelling +n03045698 cloak +n03047690 clog, geta, patten, sabot +n03062245 cocktail shaker +n03063599 coffee mug +n03063689 coffeepot +n03065424 coil, spiral, volute, whorl, helix +n03075370 combination lock +n03085013 computer keyboard, keypad +n03089624 confectionery, confectionary, candy store +n03095699 container ship, containership, container vessel +n03100240 convertible +n03109150 corkscrew, bottle screw +n03110669 cornet, horn, trumpet, trump +n03124043 cowboy boot +n03124170 cowboy hat, ten-gallon hat +n03125729 cradle +n03126707 crane +n03127747 crash helmet +n03127925 crate +n03131574 crib, cot +n03133878 Crock Pot +n03134739 croquet ball +n03141823 crutch +n03146219 cuirass +n03160309 dam, dike, dyke +n03179701 desk +n03180011 desktop computer +n03187595 dial telephone, dial phone +n03188531 diaper, nappy, napkin +n03196217 digital clock +n03197337 digital watch +n03201208 dining table, board +n03207743 dishrag, dishcloth +n03207941 dishwasher, dish washer, dishwashing machine +n03208938 disk brake, disc brake +n03216828 dock, dockage, docking facility +n03218198 dogsled, dog sled, dog sleigh +n03220513 dome +n03223299 doormat, welcome mat +n03240683 drilling platform, offshore rig +n03249569 drum, membranophone, tympan +n03250847 drumstick +n03255030 dumbbell +n03259280 Dutch oven +n03271574 electric fan, blower +n03272010 electric guitar +n03272562 electric locomotive +n03290653 entertainment center +n03291819 envelope +n03297495 espresso maker +n03314780 face powder +n03325584 feather boa, boa +n03337140 file, file cabinet, filing cabinet +n03344393 fireboat +n03345487 fire engine, fire truck +n03347037 fire screen, fireguard +n03355925 flagpole, flagstaff +n03372029 flute, transverse flute +n03376595 folding chair +n03379051 football helmet +n03384352 forklift +n03388043 fountain +n03388183 fountain pen +n03388549 four-poster +n03393912 freight car +n03394916 French horn, horn +n03400231 frying pan, frypan, skillet +n03404251 fur coat +n03417042 garbage truck, dustcart +n03424325 gasmask, respirator, gas helmet +n03425413 gas pump, gasoline pump, petrol pump, island dispenser +n03443371 goblet +n03444034 go-kart +n03445777 golf ball +n03445924 golfcart, golf cart +n03447447 gondola +n03447721 gong, tam-tam +n03450230 gown +n03452741 grand piano, grand +n03457902 greenhouse, nursery, glasshouse +n03459775 grille, radiator grille +n03461385 grocery store, grocery, food market, market +n03467068 guillotine +n03476684 hair slide +n03476991 hair spray +n03478589 half track +n03481172 hammer +n03482405 hamper +n03483316 hand blower, blow dryer, blow drier, hair dryer, hair drier +n03485407 hand-held computer, hand-held microcomputer +n03485794 handkerchief, hankie, hanky, hankey +n03492542 hard disc, hard disk, fixed disk +n03494278 harmonica, mouth organ, harp, mouth harp +n03495258 harp +n03496892 harvester, reaper +n03498962 hatchet +n03527444 holster +n03529860 home theater, home theatre +n03530642 honeycomb +n03532672 hook, claw +n03534580 hoopskirt, crinoline +n03535780 horizontal bar, high bar +n03538406 horse cart, horse-cart +n03544143 hourglass +n03584254 iPod +n03584829 iron, smoothing iron +n03590841 jack-o'-lantern +n03594734 jean, blue jean, denim +n03594945 jeep, landrover +n03595614 jersey, T-shirt, tee shirt +n03598930 jigsaw puzzle +n03599486 jinrikisha, ricksha, rickshaw +n03602883 joystick +n03617480 kimono +n03623198 knee pad +n03627232 knot +n03630383 lab coat, laboratory coat +n03633091 ladle +n03637318 lampshade, lamp shade +n03642806 laptop, laptop computer +n03649909 lawn mower, mower +n03657121 lens cap, lens cover +n03658185 letter opener, paper knife, paperknife +n03661043 library +n03662601 lifeboat +n03666591 lighter, light, igniter, ignitor +n03670208 limousine, limo +n03673027 liner, ocean liner +n03676483 lipstick, lip rouge +n03680355 Loafer +n03690938 lotion +n03691459 loudspeaker, speaker, speaker unit, loudspeaker system, speaker system +n03692522 loupe, jeweler's loupe +n03697007 lumbermill, sawmill +n03706229 magnetic compass +n03709823 mailbag, postbag +n03710193 mailbox, letter box +n03710637 maillot +n03710721 maillot, tank suit +n03717622 manhole cover +n03720891 maraca +n03721384 marimba, xylophone +n03724870 mask +n03729826 matchstick +n03733131 maypole +n03733281 maze, labyrinth +n03733805 measuring cup +n03742115 medicine chest, medicine cabinet +n03743016 megalith, megalithic structure +n03759954 microphone, mike +n03761084 microwave, microwave oven +n03763968 military uniform +n03764736 milk can +n03769881 minibus +n03770439 miniskirt, mini +n03770679 minivan +n03773504 missile +n03775071 mitten +n03775546 mixing bowl +n03776460 mobile home, manufactured home +n03777568 Model T +n03777754 modem +n03781244 monastery +n03782006 monitor +n03785016 moped +n03786901 mortar +n03787032 mortarboard +n03788195 mosque +n03788365 mosquito net +n03791053 motor scooter, scooter +n03792782 mountain bike, all-terrain bike, off-roader +n03792972 mountain tent +n03793489 mouse, computer mouse +n03794056 mousetrap +n03796401 moving van +n03803284 muzzle +n03804744 nail +n03814639 neck brace +n03814906 necklace +n03825788 nipple +n03832673 notebook, notebook computer +n03837869 obelisk +n03838899 oboe, hautboy, hautbois +n03840681 ocarina, sweet potato +n03841143 odometer, hodometer, mileometer, milometer +n03843555 oil filter +n03854065 organ, pipe organ +n03857828 oscilloscope, scope, cathode-ray oscilloscope, CRO +n03866082 overskirt +n03868242 oxcart +n03868863 oxygen mask +n03871628 packet +n03873416 paddle, boat paddle +n03874293 paddlewheel, paddle wheel +n03874599 padlock +n03876231 paintbrush +n03877472 pajama, pyjama, pj's, jammies +n03877845 palace +n03884397 panpipe, pandean pipe, syrinx +n03887697 paper towel +n03888257 parachute, chute +n03888605 parallel bars, bars +n03891251 park bench +n03891332 parking meter +n03895866 passenger car, coach, carriage +n03899768 patio, terrace +n03902125 pay-phone, pay-station +n03903868 pedestal, plinth, footstall +n03908618 pencil box, pencil case +n03908714 pencil sharpener +n03916031 perfume, essence +n03920288 Petri dish +n03924679 photocopier +n03929660 pick, plectrum, plectron +n03929855 pickelhaube +n03930313 picket fence, paling +n03930630 pickup, pickup truck +n03933933 pier +n03935335 piggy bank, penny bank +n03937543 pill bottle +n03938244 pillow +n03942813 ping-pong ball +n03944341 pinwheel +n03947888 pirate, pirate ship +n03950228 pitcher, ewer +n03954731 plane, carpenter's plane, woodworking plane +n03956157 planetarium +n03958227 plastic bag +n03961711 plate rack +n03967562 plow, plough +n03970156 plunger, plumber's helper +n03976467 Polaroid camera, Polaroid Land camera +n03976657 pole +n03977966 police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria +n03980874 poncho +n03982430 pool table, billiard table, snooker table +n03983396 pop bottle, soda bottle +n03991062 pot, flowerpot +n03992509 potter's wheel +n03995372 power drill +n03998194 prayer rug, prayer mat +n04004767 printer +n04005630 prison, prison house +n04008634 projectile, missile +n04009552 projector +n04019541 puck, hockey puck +n04023962 punching bag, punch bag, punching ball, punchball +n04026417 purse +n04033901 quill, quill pen +n04033995 quilt, comforter, comfort, puff +n04037443 racer, race car, racing car +n04039381 racket, racquet +n04040759 radiator +n04041544 radio, wireless +n04044716 radio telescope, radio reflector +n04049303 rain barrel +n04065272 recreational vehicle, RV, R.V. +n04067472 reel +n04069434 reflex camera +n04070727 refrigerator, icebox +n04074963 remote control, remote +n04081281 restaurant, eating house, eating place, eatery +n04086273 revolver, six-gun, six-shooter +n04090263 rifle +n04099969 rocking chair, rocker +n04111531 rotisserie +n04116512 rubber eraser, rubber, pencil eraser +n04118538 rugby ball +n04118776 rule, ruler +n04120489 running shoe +n04125021 safe +n04127249 safety pin +n04131690 saltshaker, salt shaker +n04133789 sandal +n04136333 sarong +n04141076 sax, saxophone +n04141327 scabbard +n04141975 scale, weighing machine +n04146614 school bus +n04147183 schooner +n04149813 scoreboard +n04152593 screen, CRT screen +n04153751 screw +n04154565 screwdriver +n04162706 seat belt, seatbelt +n04179913 sewing machine +n04192698 shield, buckler +n04200800 shoe shop, shoe-shop, shoe store +n04201297 shoji +n04204238 shopping basket +n04204347 shopping cart +n04208210 shovel +n04209133 shower cap +n04209239 shower curtain +n04228054 ski +n04229816 ski mask +n04235860 sleeping bag +n04238763 slide rule, slipstick +n04239074 sliding door +n04243546 slot, one-armed bandit +n04251144 snorkel +n04252077 snowmobile +n04252225 snowplow, snowplough +n04254120 soap dispenser +n04254680 soccer ball +n04254777 sock +n04258138 solar dish, solar collector, solar furnace +n04259630 sombrero +n04263257 soup bowl +n04264628 space bar +n04265275 space heater +n04266014 space shuttle +n04270147 spatula +n04273569 speedboat +n04275548 spider web, spider's web +n04277352 spindle +n04285008 sports car, sport car +n04286575 spotlight, spot +n04296562 stage +n04310018 steam locomotive +n04311004 steel arch bridge +n04311174 steel drum +n04317175 stethoscope +n04325704 stole +n04326547 stone wall +n04328186 stopwatch, stop watch +n04330267 stove +n04332243 strainer +n04335435 streetcar, tram, tramcar, trolley, trolley car +n04336792 stretcher +n04344873 studio couch, day bed +n04346328 stupa, tope +n04347754 submarine, pigboat, sub, U-boat +n04350905 suit, suit of clothes +n04355338 sundial +n04355933 sunglass +n04356056 sunglasses, dark glasses, shades +n04357314 sunscreen, sunblock, sun blocker +n04366367 suspension bridge +n04367480 swab, swob, mop +n04370456 sweatshirt +n04371430 swimming trunks, bathing trunks +n04371774 swing +n04372370 switch, electric switch, electrical switch +n04376876 syringe +n04380533 table lamp +n04389033 tank, army tank, armored combat vehicle, armoured combat vehicle +n04392985 tape player +n04398044 teapot +n04399382 teddy, teddy bear +n04404412 television, television system +n04409515 tennis ball +n04417672 thatch, thatched roof +n04418357 theater curtain, theatre curtain +n04423845 thimble +n04428191 thresher, thrasher, threshing machine +n04429376 throne +n04435653 tile roof +n04442312 toaster +n04443257 tobacco shop, tobacconist shop, tobacconist +n04447861 toilet seat +n04456115 torch +n04458633 totem pole +n04461696 tow truck, tow car, wrecker +n04462240 toyshop +n04465501 tractor +n04467665 trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi +n04476259 tray +n04479046 trench coat +n04482393 tricycle, trike, velocipede +n04483307 trimaran +n04485082 tripod +n04486054 triumphal arch +n04487081 trolleybus, trolley coach, trackless trolley +n04487394 trombone +n04493381 tub, vat +n04501370 turnstile +n04505470 typewriter keyboard +n04507155 umbrella +n04509417 unicycle, monocycle +n04515003 upright, upright piano +n04517823 vacuum, vacuum cleaner +n04522168 vase +n04523525 vault +n04525038 velvet +n04525305 vending machine +n04532106 vestment +n04532670 viaduct +n04536866 violin, fiddle +n04540053 volleyball +n04542943 waffle iron +n04548280 wall clock +n04548362 wallet, billfold, notecase, pocketbook +n04550184 wardrobe, closet, press +n04552348 warplane, military plane +n04553703 washbasin, handbasin, washbowl, lavabo, wash-hand basin +n04554684 washer, automatic washer, washing machine +n04557648 water bottle +n04560804 water jug +n04562935 water tower +n04579145 whiskey jug +n04579432 whistle +n04584207 wig +n04589890 window screen +n04590129 window shade +n04591157 Windsor tie +n04591713 wine bottle +n04592741 wing +n04596742 wok +n04597913 wooden spoon +n04599235 wool, woolen, woollen +n04604644 worm fence, snake fence, snake-rail fence, Virginia fence +n04606251 wreck +n04612504 yawl +n04613696 yurt +n06359193 web site, website, internet site, site +n06596364 comic book +n06785654 crossword puzzle, crossword +n06794110 street sign +n06874185 traffic light, traffic signal, stoplight +n07248320 book jacket, dust cover, dust jacket, dust wrapper +n07565083 menu +n07579787 plate +n07583066 guacamole +n07584110 consomme +n07590611 hot pot, hotpot +n07613480 trifle +n07614500 ice cream, icecream +n07615774 ice lolly, lolly, lollipop, popsicle +n07684084 French loaf +n07693725 bagel, beigel +n07695742 pretzel +n07697313 cheeseburger +n07697537 hotdog, hot dog, red hot +n07711569 mashed potato +n07714571 head cabbage +n07714990 broccoli +n07715103 cauliflower +n07716358 zucchini, courgette +n07716906 spaghetti squash +n07717410 acorn squash +n07717556 butternut squash +n07718472 cucumber, cuke +n07718747 artichoke, globe artichoke +n07720875 bell pepper +n07730033 cardoon +n07734744 mushroom +n07742313 Granny Smith +n07745940 strawberry +n07747607 orange +n07749582 lemon +n07753113 fig +n07753275 pineapple, ananas +n07753592 banana +n07754684 jackfruit, jak, jack +n07760859 custard apple +n07768694 pomegranate +n07802026 hay +n07831146 carbonara +n07836838 chocolate sauce, chocolate syrup +n07860988 dough +n07871810 meat loaf, meatloaf +n07873807 pizza, pizza pie +n07875152 potpie +n07880968 burrito +n07892512 red wine +n07920052 espresso +n07930864 cup +n07932039 eggnog +n09193705 alp +n09229709 bubble +n09246464 cliff, drop, drop-off +n09256479 coral reef +n09288635 geyser +n09332890 lakeside, lakeshore +n09399592 promontory, headland, head, foreland +n09421951 sandbar, sand bar +n09428293 seashore, coast, seacoast, sea-coast +n09468604 valley, vale +n09472597 volcano +n09835506 ballplayer, baseball player +n10148035 groom, bridegroom +n10565667 scuba diver +n11879895 rapeseed +n11939491 daisy +n12057211 yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum +n12144580 corn +n12267677 acorn +n12620546 hip, rose hip, rosehip +n12768682 buckeye, horse chestnut, conker +n12985857 coral fungus +n12998815 agaric +n13037406 gyromitra +n13040303 stinkhorn, carrion fungus +n13044778 earthstar +n13052670 hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa +n13054560 bolete +n13133613 ear, spike, capitulum +n15075141 toilet tissue, toilet paper, bathroom tissue diff --git "a/OpenCV-Python-Toturial-\344\270\255\346\226\207\347\211\210.pdf" "b/OpenCV-Python-Tutorial-\344\270\255\346\226\207\347\211\210.pdf" similarity index 95% rename from "OpenCV-Python-Toturial-\344\270\255\346\226\207\347\211\210.pdf" rename to "OpenCV-Python-Tutorial-\344\270\255\346\226\207\347\211\210.pdf" index 26c4d7bc..c6e9de22 100755 Binary files "a/OpenCV-Python-Toturial-\344\270\255\346\226\207\347\211\210.pdf" and "b/OpenCV-Python-Tutorial-\344\270\255\346\226\207\347\211\210.pdf" differ diff --git a/README.md b/README.md index 275deb8a..97aff671 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,110 @@ -# OpenCV-Python-Toturial +- 我在B站做视频博客VLoger,欢迎大家来捧场。不只是OpenCV + - 程序员赚钱指南 https://space.bilibili.com/180948619 -##http://www.opencv.org.cn/forum.php?mod=viewthread&tid=32525 -这个repo是这本书的所有源代码。opencv2.4+python 3.0(我之前是使用python2.7) +# [OpenCV-Python-Tutorial](https://github.com/makelove/OpenCV-Python-Tutorial) +- 有朋友反映说下载repo慢,因为data有一些视频sample + - 现在2020-8-15把repo压缩,上传到百度云盘 + - 链接: https://pan.baidu.com/s/1jpjpfum5EMpNrZoEHGvn1g 提取码: 8cab + +## [OpenCV-Python-Tutorial-中文版.pdf](OpenCV-Python-Tutorial-中文版.pdf) +- 这个repo是这本书PDF的所有源代码,几乎都被测试过,能正常运行。程序使用的图片和视频,都在data文件内。 + +### 平时会添加一些有趣的代码,实现某种功能。 +- 官网 https://opencv.org/ +- 官方文档api https://docs.opencv.org/4.0.0/ +- 官方英文教程 http://docs.opencv.org/3.2.0/d6/d00/tutorial_py_root.html + +## 运行:官方samples/demo.py 会有很多有趣的例子,介绍你去了解OpenCV的功能。 + + +~~python 2.7 分支被废弃了,不再更新~~ + +~~# 添加了 Python3.6分支, +该分支是使用 opencv3.2+Python3.6~~ + +## 把原来的master分支改为python2.7分支,python3.6分支改为master分支 +* git clone https://github.com/makelove/OpenCV-Python-Tutorial.git +* ~~git checkout python3.6~~ + +##### 建议使用PyCharm来编写/调试Python代码 + +## 开发环境 +* macOS Mojave 10.14 +* Python 3.6.1 +* OpenCV 3.2.0 +* PyCharm 2018.3 + + +### VMware 虚拟机 +如果安装OpenCV有问题,可以使用VMware 虚拟机安装Ubuntu系统,本人可以帮你们安装一个,再共享到百度云 + +### 树莓派3b +本人有一块【树莓派3b】开发板,也安装了OpenCV3,很好用,建议你们也买一块来玩一玩。 + +### 摄像头 +* MacBook pro自带 +* 淘宝,[130W像素高清摄像头模组 720P 1280x720 USB2.0免驱 微距模块](https://s.click.taobao.com/gOB3ACw) +* 淘宝,[树莓派3代B Raspberry Pi USB摄像头,免驱动](https://s.click.taobao.com/kTu2ACw) 不好用,可视角度太小! +* Kinect for Xbox360 Slim, AUX接口不能直接插入电脑,需要购买电源适配器 [淘宝](https://s.click.taobao.com/t?e=m%3D2%26s%3DuOhQTZaHKEQcQipKwQzePOeEDrYVVa64LKpWJ%2Bin0XLjf2vlNIV67rEUhWAGPPKrYFMBzHxYoCOlldgrEKAMDfvtTsPa%2Bvw8FDXjhIkoffd7RTQd3LKg2nJi6DFpZGNc%2Bht3wBcxEogkdIkZMKiRbrUG0ypJDuSgXlTpbZcV4j5YC7K2OdchcA%3D%3D&scm=null&pvid=null&app_pvid=59590_11.9.33.73_524_1585572680125&ptl=floorId%3A17741&originalFloorId%3A17741&app_pvid%3A59590_11.9.33.73_524_1585572680125&union_lens=lensId%3APUB%401585572666%400b1a25a5_48ac_1712b7ede03_179a%40023mXY9mmpUNuNySUoJofoOt) + +## 教程资源 +- http://www.learnopencv.com/ +- http://www.pyimagesearch.com/ +- [YouTube上sentex的OpenCV视频教程](https://www.youtube.com/playlist?list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) +- B站 [OpenCV YouTube](https://search.bilibili.com/all?keyword=OpenCV%20YouTube) +- [官方教程](https://opencv.org/courses/) + +## 新闻News https://opencv.org/news.html +- 中文论坛 http://www.opencv.org.cn/ +- [OpenCV 3.3发布了](http://opencv.org/opencv-3-3.html) + 1. 主要消息是我们将DNN模块从opencv_contrib推广到主存储库,改进和加速了很多。不再需要外部BLAS实现。对于GPU,使用Halide(http://halide-lang.org)进行实验性DNN加速。有关该模块的详细信息可以在我们的wiki中找到:[OpenCV中的深度学习](https://github.com/opencv/opencv/wiki/Deep-Learning-in-OpenCV)。 + 2. OpenCV现在可以使用标志ENABLE_CXX11构建为C ++ 11库。添加了C ++ 11程序员的一些很酷的功能。 + 3. 由于“动态调度”功能,我们还在OpenCV的默认版本中启用了不少AVX / AVX2和SSE4.x优化。DNN模块还具有一些AVX / AVX2优化。 +Intel Media SDK现在可以被我们的videoio模块用来进行硬件加速的视频编码/解码。支持MPEG1 / 2,以及H.264。 + 4. 嵌入OpenCV Intel IPP子集已从2015.12升级到2017.2版本,从而在我们的核心和imgproc perf测试中提高了15%的速度。 + 5. 716拉请求已经合并,588我们的错误跟踪器中的问题已经关闭,因为OpenCV 3.2。另外,我们通过一些严格的静态分析仪工具运行OpenCV,并修复了检测到的问题。所以OpenCV 3.3应该是非常稳定和可靠的释放。 + 6. 有关OpenCV 3.3的更改和新功能的更多详细信息,请访问https://github.com/opencv/opencv/wiki/ChangeLog。 + 7. [下载OpenCV 3.3](https://github.com/opencv/opencv/releases/tag/3.3.0) + 8. [安装OpenCV 3.3](http://www.linuxfromscratch.org/blfs/view/cvs/general/opencv.html) +- OpenCV 4.0发布了 https://opencv.org/opencv-4-0-0.html + +## 怎样翻墙?使用Google搜索引擎,观看YouTube视频教程 +- shadowsocks + - 方便,随地随时翻墙 + - 手机使用4G信号上网,也可以。 + - 强烈推荐! + - 购物国外服务器,搭建也很容易 + - 参考 https://isweic.com/build-shadowsocks-python-server/ + - pip install shadowsocks + - 运行 + - shell窗口运行 + - ssserver -p 8388 -k password -m aes-256-cfb + - 8388是端口号,password是密码,aes-256-cfb是加密类型,通过Ctrl+C结束 + - 后台运行 + - ssserver -p 8388 -k password -m aes-256-cfb --user nobody -d start + - 结束后台运行 + - ssserver -d stop + - 检查运行日志 + - less /var/log/shadowsocks.log +- [Lantern蓝灯](https://github.com/getlantern/lantern/releases/tag/latest) + - 本人不使用蓝灯了。 + 1. 可以免费使用,但用完800m流量后会限速,还能正常使用,就是有点慢 + 2. 专业版不贵,2年336元,每天0.46元。[Lantern蓝灯专业版购买流程](https://github.com/getlantern/forum/issues/3863) + 3. 邀请好友来获得更多的专业版使用时间。我的邀请码:GW2362 + +## 更新 +- [破解验证码](my06-验证码识别/solving_captchas_code_examples/README.md) + +## 捐赠打赏 +- OpenCV问答群1,QQ群号:187436093 +- 微信 + - wechat_donate + + +- 支付宝 + - alipay_donate + +- 福利 + - 免费国内服务器,但需要交押金,随时全额原路退还 + - 有需要的朋友请加入QQ群,发【手机号】给群主 + - ![free_server](data/free_server.jpeg) \ No newline at end of file diff --git a/README.md~ b/README.md~ deleted file mode 100755 index f6d19c52..00000000 --- a/README.md~ +++ /dev/null @@ -1,4 +0,0 @@ -# OpenCV-Python-Toturial - -##http://www.opencv.org.cn/forum.php?mod=viewthread&tid=32525 -这个repo是这本书的所有源代码。opencv2.4+python 2.7 diff --git "a/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/README.md" "b/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/README.md" new file mode 100644 index 00000000..bb79dbe6 --- /dev/null +++ "b/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/README.md" @@ -0,0 +1,5 @@ +# OpenCV_Window_Management OpenCV窗口管理 + +平时使用cv2.imshow()的时候,如果窗口数2个以上,便会重叠在一起。 + +这个包,会合理管理窗口的大小和位置,使之不重叠。 \ No newline at end of file diff --git "a/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/opencv_windows_management.py" "b/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/opencv_windows_management.py" new file mode 100644 index 00000000..80a05fe0 --- /dev/null +++ "b/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/opencv_windows_management.py" @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/18 下午10:34 +# @Author : play4fun +# @File : opencv_windows_management.py +# @Software: PyCharm + +""" +opencv_windows_management.py: +""" + +import cv2, math +import tkinter as tk + + +class Window: + def __init__(self, name, image, weight=1): + self.name = name + self.image = image.copy() + self.weight = weight + self.shape = self.image.shape + self.hight_x = self.shape[0] + self.lenght_y = self.shape[1] + + +class opencv_windows_management: + def __init__(self): + self.windows = dict() + + root = tk.Tk() + screen_width = root.winfo_screenwidth() + screen_height = root.winfo_screenheight() + self.screen_size = (screen_width, screen_height) # (1280, 800) + root.quit() + + def add(self, name, image, weight=1): + ''' + 权重,越高,图片显示越大 + :return: + ''' + cv2.namedWindow(name, flags=cv2.WINDOW_AUTOSIZE) + window = Window(name, image, weight) + self.windows[name] = window + # self.windows[name] = image + + def show(self): + lenw = len(self.windows) + w_l = int(self.screen_size[0] / lenw) + + max_num_line = math.ceil(math.sqrt(lenw)) # 取平方根 + # TODO 权重 + + for i, name in enumerate(self.windows): + # if (i+1) >max_num_line: + # #TODO 换行 + # cv2.moveWindow(name, w_l * i, h_x*j) + # pass + + win = self.windows[name] + image = win.image + # image = self.windows[name] + # h_x = int(image.shape[1] / w_l * image.shape[0]) #保持比例 + h_x = int(w_l / win.lenght_y * win.hight_x) # 保持比例 + # print((w_l,h_x)) + img2 = cv2.resize(image, (w_l, h_x)) + cv2.moveWindow(name, w_l * i, 0) + cv2.imshow(name, img2) diff --git "a/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/test_cvwm_images.py" "b/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/test_cvwm_images.py" new file mode 100644 index 00000000..6034f9ea --- /dev/null +++ "b/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/test_cvwm_images.py" @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/18 下午12:42 +# @Author : play4fun +# @File : test_cvwm_images.py +# @Software: PyCharm + +""" +test_cvwm_images.py: +# show 多张相片 +""" + +import cv2 +import numpy as np +import os +import errno +from opencv_windows_management import opencv_windows_management + +cvwm = opencv_windows_management() + +path = '../../data/messi5.jpg' +if not os.path.exists(path): + raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), path) + +img = cv2.imread(path, cv2.IMREAD_UNCHANGED) # 包括图像的 alpha 通道 +print(img.shape) +# cv2.imshow('src', img) +cvwm.add('src', img) + +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + +# cv2.imshow('gray', gray) +cvwm.add('gray', gray) + +ret, thresh1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) +cvwm.add('thresh1', thresh1) + +cvwm.show() + +cv2.waitKey(0) diff --git "a/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/test_cvwm_videos.py" "b/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/test_cvwm_videos.py" new file mode 100644 index 00000000..5f022202 --- /dev/null +++ "b/Tools\345\267\245\345\205\267\345\214\205/OpenCV_Window_Management/test_cvwm_videos.py" @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/18 下午12:43 +# @Author : play4fun +# @File : test_cvwm_videos.py +# @Software: PyCharm + +""" +test_cvwm_videos.py: +""" + +import cv2 +from opencv_windows_management import opencv_windows_management + +cvwm = opencv_windows_management() + +cap = cv2.VideoCapture(0) +ret = cap.set(3, 640) +ret = cap.set(4, 480) + +# +face_cascade = cv2.CascadeClassifier('/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml') + +while cap.isOpened(): + ret, frame = cap.read() + + frame = cv2.flip(frame, flipCode=1) + cvwm.add('frame', frame) + + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + # cv2.imshow('frame', gray) + cvwm.add('gray', gray) + + #人脸识别 + faces = face_cascade.detectMultiScale(gray, 1.3, 5) + print("Detected ", len(faces), " face") + for (x, y, w, h) in faces: + face = gray[y:y + h, x:x + w] + cvwm.add('face', face) + + cvwm.show() + + key = cv2.waitKey(delay=1) + if key == ord("q"): + break + +# When everything done, release the capture +cap.release() +cv2.destroyAllWindows() diff --git a/__init__.py b/__init__.py deleted file mode 100755 index c3e116a5..00000000 --- a/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'play' diff --git "a/ch01-\345\205\263\344\272\216OpenCV/OpenCV-Python\346\225\231\347\250\213\347\256\200\344\273\213.md" "b/ch01-\345\205\263\344\272\216OpenCV/OpenCV-Python\346\225\231\347\250\213\347\256\200\344\273\213.md" new file mode 100644 index 00000000..b6d34a07 --- /dev/null +++ "b/ch01-\345\205\263\344\272\216OpenCV/OpenCV-Python\346\225\231\347\250\213\347\256\200\344\273\213.md" @@ -0,0 +1,49 @@ +# 关于OpenCV + +OpenCV于1999年由Gary Bradsky在英特尔启动,2000年第一个版本发布。Vadim Pisarevsky加入了Gary Bradsky,负责管理英特尔的俄罗斯软件OpenCV团队。 + +2005年,OpenCV被用于赢得[2005年DARPA大挑战赛](https://en.wikipedia.org/wiki/DARPA_Grand_Challenge_(2005))的车辆。后来,它的积极发展继续在Willow Garage的支持下与Gary Bradsky和Vadim Pisarevsky领导该项目。OpenCV现在支持与计算机视觉和机器学习相关的许多算法,并且日益扩大。 + +OpenCV支持各种各样的编程语言,如C ++,Python,Java等,并且可以在包括Windows,Linux,OS X,Android和iOS在内的不同平台上使用。基于CUDA和OpenCL的高速GPU操作接口也在积极的发展。 + +OpenCV-Python是OpenCV的Python API,结合了OpenCV C ++ API的最佳特性和Python语言。 + +## OpenCV中的Python + +OpenCV-Python是一个用于解决计算机视觉问题的Python绑定库。 + +Python是由Guido van Rossum开始的通用编程语言,它非常流行,主要是因为它的简单性和代码可读性。它使程序员能够在更少的代码行中表达想法,而不会降低可读性。 + +与C / C ++等语言相比,Python速度较慢。也就是说,Python可以通过C / C ++轻松扩展,这使得我们可以在C / C ++中编写计算密集型代码,并创建可用作Python模块的Python包装。这给了我们两个优点:第一,代码与原始C / C ++代码一样快(因为它是实际的C ++代码在后台工作),其次,它比Python C / C ++更容易编码。OpenCV-Python是原始OpenCV C ++实现的Python包装器。 + +OpenCV-Python使用Numpy,它是一个高度优化的库,用于使用MATLAB风格的语法进行数值运算。所有OpenCV阵列结构都转换成Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)更容易集成。 + +## OpenCV-Python教程 + +OpenCV引入了一套新的教程,它将引导您了解OpenCV-Python中可用的各种功能。本指南主要集中在OpenCV 3.x版本(尽管大多数教程也将与OpenCV 2.x一起使用)。 + +推荐使用Python和Numpy的以前的知识,因为本指南将不会介绍。熟练使用Numpy是必须的,以便使用OpenCV-Python编写优化的代码。 + +本教程最初由Abid Rahman K.开始,是Alexander Mordvintsev指导下的“Google Summer Code”计划的一部分。 + +## OpenCV需要你! + +由于OpenCV是一个开源计划,欢迎所有人对图书馆,文档和教程做出贡献。如果您在本教程中发现任何错误(从小的拼写错误到代码或概念中的严重错误),请通过在GitHub中克隆OpenCV 并提交引用请求来随意更正。OpenCV开发人员将检查您的拉动请求,给您重要的反馈意见(一旦通过审核人员的批准),它将被合并到OpenCV中。然后,您将成为一个开源的贡献者 :-) + +随着新模块被添加到OpenCV-Python,本教程将不得不进行扩展。如果您熟悉一个特定的算法,并且可以编写一个教程,包括算法的基本原理和示例使用的代码,请执行此操作。 + +记住,我们一起可以使这个项目取得圆满成功! + +## 贡献者 + +以下是向OpenCV-Python提交教程的贡献者列表。 + +* Alexander Mordvintsev(GSoC-2013导师) +* Abid Rahman K.(GSoC-2013实习生) + +## 其他资源 +* Python的快速指南 - Python的[一个字节](http://swaroopch.com/notes/python/) +* [基本的Numpy教程](http://wiki.scipy.org/Tentative_NumPy_Tutorial) +* [Numpy示例列表](http://wiki.scipy.org/Numpy_Example_List) +* [OpenCV文档](http://docs.opencv.org/) +* [OpenCV论坛](http://answers.opencv.org/questions/) \ No newline at end of file diff --git "a/ch01-\345\205\263\344\272\216OpenCV/OpenCV-axis-basics.png" "b/ch01-\345\205\263\344\272\216OpenCV/OpenCV-axis-basics.png" new file mode 100644 index 00000000..9faf8c64 Binary files /dev/null and "b/ch01-\345\205\263\344\272\216OpenCV/OpenCV-axis-basics.png" differ diff --git "a/ch01-\345\205\263\344\272\216OpenCV/OpenCV\345\233\276\345\203\217\345\235\220\346\240\207\347\263\273.md" "b/ch01-\345\205\263\344\272\216OpenCV/OpenCV\345\233\276\345\203\217\345\235\220\346\240\207\347\263\273.md" new file mode 100644 index 00000000..94c64e61 --- /dev/null +++ "b/ch01-\345\205\263\344\272\216OpenCV/OpenCV\345\233\276\345\203\217\345\235\220\346\240\207\347\263\273.md" @@ -0,0 +1,25 @@ +![basics](OpenCV-axis-basics.png "basics") + + +关于图像坐标系与行列宽高的对应关系大致如下: +- row == height == Point.y +- col == width == Point.x + +![axis](axis.png "axis") + +因为在计算机中,图像是以矩阵的形式保存的。 + +一张宽度640像素、长度480像素的灰度图保存在一个480 * 640的矩阵中。 + +## 先行后列 + +而我们习惯的坐标表示是先X横坐标,再Y纵坐标。 +在OpenCV中需要对矩阵进行计算,先行再列。 + +## 补充(详细解释) + +坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。~~(虽然网上有学着说opencv中有些数据结构的坐标原点是在图片的左下角,但是我暂时还没碰到过)。~~ + +在使用image.at(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标,而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at(Point(x2, x1))效果相同。 + +如果所画图像是多通道的,比如说image图像的通道数时n,则使用Mat::at(x, y)时,其x的范围依旧是0到image的height,而y的取值范围则是0到image的width乘以n,因为这个时候是有n个通道,所以每个像素需要占有n列。但是如果在同样的情况下,使用Mat::at(point)来访问的话,则这时候可以不用考虑通道的个数,因为你要赋值给获取Mat::at(point)的值时,都不是一个数字,而是一个对应的n维向量。 \ No newline at end of file diff --git "a/ch01-\345\205\263\344\272\216OpenCV/OpenCV\345\233\276\345\203\217\345\235\220\346\240\207\347\263\273_test.py" "b/ch01-\345\205\263\344\272\216OpenCV/OpenCV\345\233\276\345\203\217\345\235\220\346\240\207\347\263\273_test.py" new file mode 100644 index 00000000..b4450309 --- /dev/null +++ "b/ch01-\345\205\263\344\272\216OpenCV/OpenCV\345\233\276\345\203\217\345\235\220\346\240\207\347\263\273_test.py" @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/28 23:13 +# @Author : play4fun +# @File : OpenCV图像坐标系_test.py +# @Software: PyCharm + +""" +OpenCV图像坐标系_test.py: +""" + +# TODO + + +import numpy as np +import cv2 + +img = cv2.imread('../data/Lenna.png', cv2.IMREAD_UNCHANGED) +print('img.shape:', img.shape) +logo = cv2.imread('../data/opencv_logo.png', cv2.IMREAD_UNCHANGED) +logo = cv2.resize(logo, (20, 20)) +print('logo.shape:', logo.shape) +butterfly= cv2.imread('../data/butterfly.jpg', cv2.IMREAD_UNCHANGED) +butterfly = cv2.resize(butterfly, (20, 20)) +print('butterfly.shape:', butterfly.shape) + + +cv2.imshow('src', img) +cv2.moveWindow('src', 0, 0) + +# read color values at position y, x +y = 100 +x = 50 +(b, g, r) = img[y, x] +# print color values to screen +print('bgr:',b,g,r) + +#先行后列 +#img[y:y+height,x:width] +img[100:100 + logo.shape[0], 300:300 + logo.shape[1]] = logo[:, :, 0:3]# 两张图片的shape不一样 +# img[10:10+logo.shape[0],30:30+logo.shape[1],:]=logo[:,:,0:3] +img[300:300 + logo.shape[1], 100:100 + logo.shape[0]] = butterfly[:, :, 0:3] + + +font = cv2.FONT_HERSHEY_SIMPLEX +cv2.putText(img, text='col=width=X0,row=height-Y0', org=(0, 0), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2,bottomLeftOrigin=True) # text, +cv2.putText(img, text='col=width=X10,row=height-Y30', org=(10, 30), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2) # text, +cv2.putText(img, text='col=width=X100,row=height-Y300', org=(100, 300), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2) # text, +cv2.putText(img, text='col=width-X300,row=height-Y100', org=(300, 100), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2) # text, + +cv2.imshow('img+logo', img) +cv2.imwrite('img_logo.jpg',img) +cv2.moveWindow('img+logo', x=img.shape[0], y=0) +cv2.waitKey(0) diff --git "a/ch01-\345\205\263\344\272\216OpenCV/axis.png" "b/ch01-\345\205\263\344\272\216OpenCV/axis.png" new file mode 100644 index 00000000..261540ff Binary files /dev/null and "b/ch01-\345\205\263\344\272\216OpenCV/axis.png" differ diff --git "a/ch01-\345\205\263\344\272\216OpenCV/img_logo.jpg" "b/ch01-\345\205\263\344\272\216OpenCV/img_logo.jpg" new file mode 100644 index 00000000..0f9fe07d Binary files /dev/null and "b/ch01-\345\205\263\344\272\216OpenCV/img_logo.jpg" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/macOS-\344\275\277\347\224\250conda\345\256\211\350\243\205opencv3.md" "b/ch02-\345\256\211\350\243\205OpenCV/macOS-\344\275\277\347\224\250conda\345\256\211\350\243\205opencv3.md" new file mode 100644 index 00000000..2ce73419 --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/macOS-\344\275\277\347\224\250conda\345\256\211\350\243\205opencv3.md" @@ -0,0 +1,70 @@ +https://solarianprogrammer.com/2016/11/29/install-opencv-3-with-python-3-on-macos/ + + +在本文中,我将向您展示如何在MacOS Sierra上使用Python 3安装OpenCV 3。我在网上发现的大多数教程,包括OpenCV文档,似乎只涉及到Python 2.7。 + +默认情况下,MacOS默认使用Python 2.7,在这一点上,它仅接收错误修复,到2020年将是EOL。Python 3.x是未来,它受到所有主要Python库的支持。在本教程中,我们将使用最新的稳定的Python 3版本,Python 3.5.2。 + +在MacOS上安装Python 3有多种方法。根据我的经验,初学者最简单的方法是使用像Miniconda这样的软件包管理器。从Miniconda下载页面中选择3.5 bash安装程序。下载完成后,打开终端并启动安装程序: + +cd Downloads/ +bash Miniconda3-latest-MacOSX-x86_64.sh + +在大多数情况下,您可以使用安装程序建议的默认值。如果您希望Miniconda加入您的PATH,请小心。如果您选择了yes,Miniconda Python将影响系统Python,因此当您在终端中编写python时,您将启动Python 3.5而不是默认的2.7。我的建议是将Miniconda添加到您的PATH中。如果在某个时候你想要恢复到2.7,那么就像你的.bash_profile文件中的Miniconda行一样简单。 + +安装完成后,假设您保留安装程序默认值,则需要启用新的PATH设置。这可以通过关闭并重新打开您的终端来实现,也可以通过写入: + +* cd ~ + +* . .bash_profile + +现在,你应该在你的PATH中提供conda命令。快速测试是运行conda info命令。这是我在我的情况下看到的 + + 1 ~ $ conda info + 2 Current conda install: + 3 + 4 platform : osx-64 + 5 conda version : 4.1.11 + 6 conda-env version : 2.5.2 + 7 conda-build version : not installed + 8 python version : 3.5.2.final.0 + 9 requests version : 2.10.0 +10 root environment : /Users/sol/miniconda3 (writable) +11 default environment : /Users/sol/miniconda3 +12 envs directories : /Users/sol/miniconda3/envs +13 package cache : /Users/sol/miniconda3/pkgs +14 channel URLs : https://repo.continuum.io/pkgs/free/osx-64/ +15 https://repo.continuum.io/pkgs/free/noarch/ +16 https://repo.continuum.io/pkgs/pro/osx-64/ +17 https://repo.continuum.io/pkgs/pro/noarch/ +18 config file : None +19 offline mode : False +20 is foreign system : False +21 +22 ~ $ +让我们遵循最佳做法并创建一个新的Python环境: + +1 conda create -n myenv python = 3.5 +2 source activate myenv +此时,您的提示应该表明您正在使用myenv环境。环境允许您在同一台机器上具有不同版本的Python和库。举个例子,你可以有一个myenv环境,你已经安装了SciPy和一个播放环境,你已经安装了PyGame。环境是完全独立的。如果您想要实验Python或其他库的开发版本,同时保持稳定的版本分开,这是非常有用的。 + +一旦环境被激活,所有的安装命令将仅适用于当前的环境。默认情况下,如果关闭终端,则环境将被禁用。如果您想要使用它,请使用source activate myenv命令。 + +OpenCV取决于NumPy,可以安装: + +1 conda install numpy +OpenCV并没有直接提供在Miniconda主存储库中,而是由第三方提供给主Anaconda仓库。我们需要安装anaconda-client命令实用程序才能搜索OpenCV二进制文件: + +1 conda install anaconda-client +现在,使用下一个命令搜索OpenCV 3: + +1 anaconda search -t conda opencv3 +您应该看到有可用的OpenCV 3发行版的列表,如下图所示: + +Anaconda OpenCV 3可用二进制文件列表 + +从上面的列表中,我将选择名为menpo / opencv3的包,因为它为所有主要操作系统提供二进制文件,最重要的是为osx-64提供二进制文件。您可以安装menpo / opencv3软件包: + +conda install --channel https://conda.anaconda.org/menpo opencv3 + +在这一点上,您应该在Mac上安装OpenCV 3和Python。我们可以编写一个打印OpenCV版本的小型测试程序,从磁盘加载图像,将图像转换为灰色并显示结果。首先下载下一张图片: \ No newline at end of file diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\344\275\277\347\224\250Docker+OpenCV.md" "b/ch02-\345\256\211\350\243\205OpenCV/\344\275\277\347\224\250Docker+OpenCV.md" new file mode 100644 index 00000000..a8c66228 --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\344\275\277\347\224\250Docker+OpenCV.md" @@ -0,0 +1,5 @@ +## 使用Docker+OpenCV + +- https://hub.docker.com/search/?isAutomated=0&isOfficial=0&page=1&pullCount=0&q=opencv&starCount=0 + - docker run -it jjanzic/docker-python3-opencv python + - import cv2 \ No newline at end of file diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/1.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/1.png" new file mode 100644 index 00000000..543e2fa1 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/1.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/10\345\256\211\350\243\205OpenCV.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/10\345\256\211\350\243\205OpenCV.png" new file mode 100644 index 00000000..8fff3086 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/10\345\256\211\350\243\205OpenCV.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/11\345\274\225\347\224\250OpenCV.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/11\345\274\225\347\224\250OpenCV.png" new file mode 100644 index 00000000..a5121c20 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/11\345\274\225\347\224\250OpenCV.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/12OpenCV\347\232\204\347\274\226\350\257\221\344\277\241\346\201\257.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/12OpenCV\347\232\204\347\274\226\350\257\221\344\277\241\346\201\257.png" new file mode 100644 index 00000000..4bcc2177 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/12OpenCV\347\232\204\347\274\226\350\257\221\344\277\241\346\201\257.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/2\346\267\273\345\212\240\345\210\260path.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/2\346\267\273\345\212\240\345\210\260path.png" new file mode 100644 index 00000000..88e6b455 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/2\346\267\273\345\212\240\345\210\260path.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/3pip\346\211\223\351\222\251.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/3pip\346\211\223\351\222\251.png" new file mode 100644 index 00000000..20bba166 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/3pip\346\211\223\351\222\251.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/4\345\256\211\350\243\205.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/4\345\256\211\350\243\205.png" new file mode 100644 index 00000000..e1f59ae8 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/4\345\256\211\350\243\205.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/5\346\255\243\345\234\250\345\256\211\350\243\205.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/5\346\255\243\345\234\250\345\256\211\350\243\205.png" new file mode 100644 index 00000000..3df3dc40 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/5\346\255\243\345\234\250\345\256\211\350\243\205.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/6\345\256\211\350\243\205\345\256\214\346\210\220.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/6\345\256\211\350\243\205\345\256\214\346\210\220.png" new file mode 100644 index 00000000..0c2bc093 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/6\345\256\211\350\243\205\345\256\214\346\210\220.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/7\350\277\220\350\241\214Python\345\221\275\344\273\244\350\241\214.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/7\350\277\220\350\241\214Python\345\221\275\344\273\244\350\241\214.png" new file mode 100644 index 00000000..6c87d7b0 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/7\350\277\220\350\241\214Python\345\221\275\344\273\244\350\241\214.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/8hello.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/8hello.png" new file mode 100644 index 00000000..e945fbc0 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/8hello.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/9pip.png" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/9pip.png" new file mode 100644 index 00000000..b3ad84f9 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/9pip.png" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/README.md" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/README.md" new file mode 100644 index 00000000..e2838b29 --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250Windows\345\256\211\350\243\205Python3.6+pip/README.md" @@ -0,0 +1,27 @@ +# 在Windows安装Python3.6+pip + +- 视频: https://www.bilibili.com/video/av51647039/ + +- 首先下载Python https://www.python.org/downloads/windows/ +- 以管理员运行 +- ![](1.png) +- 添加到path +- ![](2添加到path.png) +- pip打钩 +- ![](3pip打钩.png) +- ![](4安装.png) +- 正在安装 +- ![](5正在安装.png) +- 安装完成 +- ![](6安装完成.png) +- 在命令行运行Python +- ![](7运行Python命令行.png) +- ![](8hello.png) +- 检查pip +- ![](9pip.png) +- pip install opencv-contrib-python + - ![](10安装OpenCV.png) +- 引用OpenCV +- ![](11引用OpenCV.png) +- OpenCV的编译信息 +- ![](12OpenCV的编译信息.png) \ No newline at end of file diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\234\250macOS\345\256\211\350\243\205OpenCV_Python.txt" "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250macOS\345\256\211\350\243\205OpenCV_Python.txt" new file mode 100644 index 00000000..3f2181d6 --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\345\234\250macOS\345\256\211\350\243\205OpenCV_Python.txt" @@ -0,0 +1,37 @@ +opencv3.2 +python3.6 + +# +安装python3 +brew install python3 + +安装pip +wget https://bootstrap.pypa.io/get-pip.py +python get-pip.py + +创建虚拟环境 +pip install --upgrade virtualenv +virtualenv -p python3 .py3 + +pip3 install -U numpy scipy matplotlib scikit-learn scikit-image + + + +brew tap homebrew/science + +#有时会出错 +brew install opencv3 --HEAD --with-python3 --without-python --with-contrib --with-ffmpeg --with-tbb --with-gstreamer + +#最简单的 +brew install opencv3 --without-python --with-python3 + +链接cv2.so到虚拟环境里 +ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so ~/.py3/lib/python3.6/site-packages/cv2.so + + +测试 + ~/.py3/bin/python3.6 + +import cv2 +print(cv2.__version__) +#3.2.0 \ No newline at end of file diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\345\256\211\350\243\205OpenCV\345\220\216\351\252\214\350\257\201.md" "b/ch02-\345\256\211\350\243\205OpenCV/\345\256\211\350\243\205OpenCV\345\220\216\351\252\214\350\257\201.md" new file mode 100644 index 00000000..4eeb9469 --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\345\256\211\350\243\205OpenCV\345\220\216\351\252\214\350\257\201.md" @@ -0,0 +1,164 @@ +##安装OpenCV后验证 + +- pkg-config +```bash +pkg-config --modversion opencv +3.3.0 +# +pkg-config --cflags opencv +-I/usr/include/opencv +# +pkg-config --libs opencv +-lopencv_cudabgsegm -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_dnn -lopencv_ml -lopencv_shape -lopencv_stitching -lopencv_cudafeatures2d -lopencv_superres -lopencv_cudacodec -lopencv_videostab -lopencv_cudaoptflow -lopencv_cudalegacy -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_photo -lopencv_imgcodecs -lopencv_cudawarping -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_video -lopencv_objdetect -lopencv_imgproc -lopencv_flann -lopencv_cudaarithm -lopencv_core -lopencv_cudev +``` + +```python +import cv2 +print(cv2.getBuildInformation()) +# +''' +General configuration for OpenCV 3.3.0 ===================================== + Version control: 3.3.0 + + Platform: + Timestamp: 2017-11-26T11:05:49Z + Host: Linux 4.4.38-tegra aarch64 + CMake: 3.5.1 + CMake generator: Unix Makefiles + CMake build tool: /usr/bin/make + Configuration: Release + + CPU/HW features: + Baseline: NEON FP16 + required: NEON + disabled: VFPV3 + + C/C++: + Built as dynamic libs?: YES + C++ Compiler: /usr/bin/c++ (ver 5.4.0) + C++ flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG + C++ flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG + C Compiler: /usr/bin/cc + C flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG + C flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG + Linker flags (Release): + Linker flags (Debug): + ccache: NO + Precompiled headers: NO + Extra dependencies: gtk-x11-2.0 gdk-x11-2.0 pangocairo-1.0 atk-1.0 cairo gdk_pixbuf-2.0 gio-2.0 pangoft2-1.0 pango-1.0 fontconfig freetype gthread-2.0 /usr/lib/aarch64-linux-gnu/libwebp.so /usr/lib/aarch64-linux-gnu/libpng.so /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/aarch64-linux-gnu/libtiff.so /usr/lib/aarch64-linux-gnu/libjasper.so /usr/lib/aarch64-linux-gnu/libjpeg.so gstbase-1.0 gstreamer-1.0 gobject-2.0 glib-2.0 gstvideo-1.0 gstapp-1.0 gstriff-1.0 gstpbutils-1.0 avcodec-ffmpeg avformat-ffmpeg avutil-ffmpeg swscale-ffmpeg dl m pthread rt /usr/lib/aarch64-linux-gnu/libtbb.so cudart nppc nppi npps cufft -L/usr/local/cuda-8.0/lib64 + 3rdparty dependencies: + + OpenCV modules: + To be built: cudev core cudaarithm flann imgproc ml objdetect video cudabgsegm cudafilters cudaimgproc cudawarping dnn imgcodecs photo shape videoio cudacodec highgui ts features2d calib3d cudafeatures2d cudalegacy cudaobjdetect cudaoptflow cudastereo stitching superres videostab python2 python3 + Disabled: world + Disabled by dependency: - + Unavailable: java viz + + GUI: + QT: NO + GTK+ 2.x: YES (ver 2.24.30) + GThread : YES (ver 2.48.1) + GtkGlExt: NO + OpenGL support: NO + VTK support: NO + + Media I/O: + ZLib: /usr/lib/aarch64-linux-gnu/libz.so (ver 1.2.8) + JPEG: /usr/lib/aarch64-linux-gnu/libjpeg.so (ver ) + WEBP: /usr/lib/aarch64-linux-gnu/libwebp.so (ver encoder: 0x0202) + PNG: /usr/lib/aarch64-linux-gnu/libpng.so (ver 1.2.54) + TIFF: /usr/lib/aarch64-linux-gnu/libtiff.so (ver 42 - 4.0.6) + JPEG 2000: /usr/lib/aarch64-linux-gnu/libjasper.so (ver 1.900.1) + OpenEXR: NO + GDAL: NO + GDCM: NO + + Video I/O: + DC1394 1.x: NO + DC1394 2.x: NO + FFMPEG: YES + avcodec: YES (ver 56.60.100) + avformat: YES (ver 56.40.101) + avutil: YES (ver 54.31.100) + swscale: YES (ver 3.1.101) + avresample: NO + GStreamer: + base: YES (ver 1.8.3) + video: YES (ver 1.8.3) + app: YES (ver 1.8.3) + riff: YES (ver 1.8.3) + pbutils: YES (ver 1.8.3) + OpenNI: NO + OpenNI PrimeSensor Modules: NO + OpenNI2: NO + PvAPI: NO + GigEVisionSDK: NO + Aravis SDK: NO + UniCap: NO + UniCap ucil: NO + V4L/V4L2: NO/YES + XIMEA: NO + Xine: NO + Intel Media SDK: NO + gPhoto2: NO + + Parallel framework: TBB (ver 4.4 interface 9002) + + Trace: YES () + + Other third-party libraries: + Use Intel IPP: NO + Use Intel IPP IW: NO + Use VA: NO + Use Intel VA-API/OpenCL: NO + Use Lapack: NO + Use Eigen: YES (ver 3.2.92) + Use Cuda: YES (ver 8.0) + Use OpenCL: NO + Use OpenVX: NO + Use custom HAL: YES (carotene (ver 0.0.1)) + + NVIDIA CUDA + Use CUFFT: YES + Use CUBLAS: NO + USE NVCUVID: NO + NVIDIA GPU arch: 62 + NVIDIA PTX archs: + Use fast math: NO + + Python 2: + Interpreter: /usr/bin/python2.7 (ver 2.7.12) + Libraries: /usr/lib/aarch64-linux-gnu/libpython2.7.so (ver 2.7.12) + numpy: /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.11.0) + packages path: lib/python2.7/dist-packages + + Python 3: + Interpreter: /usr/bin/python3 (ver 3.5.2) + Libraries: /usr/lib/aarch64-linux-gnu/libpython3.5m.so (ver 3.5.2) + numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.11.0) + packages path: lib/python3.5/dist-packages + + Python (for build): /usr/bin/python2.7 + + Java: + ant: NO + JNI: NO + Java wrappers: NO + Java tests: NO + + Matlab: Matlab not found or implicitly disabled + + Documentation: + Doxygen: NO + + Tests and samples: + Tests: YES + Performance tests: YES + C/C++ Examples: YES + + Install path: /usr + + cvconfig.h is in: /home/nvidia/opencv/build +----------------------------------------------------------------- +''' +``` \ No newline at end of file diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/README.md" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/README.md" new file mode 100644 index 00000000..9ed65a9d --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/README.md" @@ -0,0 +1,64 @@ +- 网址: + - https://github.com/skvark/opencv-python + - https://pypi.python.org/pypi/opencv-python + +## 最快 +- 安装好pip和virtualenv +- pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements_cv.txt + +## 安装 opencv-python +- virtualenv -p python3 .cv2 +- source .cv2/bin/activate +- pip install opencv-python +- pip install matplotlib +- 验证 + - python -c "import cv2;print(cv2.\_\_version__,cv2.\_\_doc__,cv2.\_\_file__)" + + +## 安装 opencv-contrib-python +强烈建议先卸载opencv-python +- pip uninstall opencv-python +- pip install opencv-contrib-python +- 验证 + - python -c "import cv2;print(cv2.\_\_version__,cv2.\_\_doc__,cv2.\_\_file__)" + - python -c "import cv2;print(help(cv2.CascadeClassifier))" + +- 运行,2个特性 + - 鼠标指向某个像素,提示栏会显示当前坐标和RGB数据 + - 工具栏有很多实用的功能,可惜不能显示图标 + - ![opencv-contrib-python](opencv-contrib-python.jpeg) +## +软件包包含预编译的OpenCV二进制文件和Python绑定。 +这可以为Python提供超快速(通常<10秒)OpenCV安装。 + +如果您只需要OpenCV Python绑定,则不需要单独的OpenCV安装。 + +**重要提示** + +MacOS和Linux的轮子目前有一些局限性: + +- 不支持视频相关的功能(不用FFmpeg编译),但支持摄像头。可以使用scikit-learn-videos去读取 +- 例如``cv2.imshow()``将不起作用(没有使用GTK + 2编译) x或碳支持) #可以使用matplotlib来显示 + +## 常见问题 +**问:我还需要单独安装OpenCV吗?** + +A:不,包是特殊的轮二进制包,它们已经包含静态构建的OpenCV二进制文件。 + +**问:pip没有找到包``opencv-python``?** + +A:轮包格式和manylinux构建是非常新的东西。最可能的问题是与旧的点相关联,可以通过运行``pip install -upgrade pip``和``pip install wheel``来修复。 + +**问:我需要contrib模块? + +A:请安装`opencv-contrib-python _ _ 然而, 注意,一些国家的商业用途可能受到限制,因为contrib模块包含一些非免费/专利算法。 + +** Q:导入在Windows上导致某些DLL加载错误? + +A:如果导入在Windows上失败,请确保您具有“Visual C ++可再发行2015”(https:www.microsoft.com =“”en-us =“ “download =”“details.aspx?id =”48145“>`__ installed。如果您使用的Windows版本低于Windows 10,并且没有安装最新的系统更新,则通用C运行时版本 + +** Q:为什么我不能在gnu/linux发行版X或macOS上打开视频文件? + +A:OpenCV视频i/o很大程度上依赖于FFmpeg。许多linux和macOS OpenCV二进制文件都不是针对它编译的。 +这些包的目的是为OpenCV Python绑定提供尽可能简单的安装体验,并且它们应该直接工作。 +如果没有一个“通用的”FFmpeg构建(例如在Windows车轮上的LGPL许可构建),将FFmpeg添加为额外的依赖项,那么实现这个目标就困难得多了。这种情况在未来可能会发生变化。 \ No newline at end of file diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/face_recognize.jpg" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/face_recognize.jpg" new file mode 100644 index 00000000..75bb7606 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/face_recognize.jpg" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/messi5-gray.jpg" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/messi5-gray.jpg" new file mode 100644 index 00000000..b1c23a1e Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/messi5-gray.jpg" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/messi5-thresh.jpg" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/messi5-thresh.jpg" new file mode 100644 index 00000000..f7e021b0 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/messi5-thresh.jpg" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/opencv-contrib-python.jpeg" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/opencv-contrib-python.jpeg" new file mode 100644 index 00000000..a4669b67 Binary files /dev/null and "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/opencv-contrib-python.jpeg" differ diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/requirements_cv.txt" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/requirements_cv.txt" new file mode 100644 index 00000000..0bf0b8ee --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/requirements_cv.txt" @@ -0,0 +1,8 @@ +cycler==0.10.0 +kiwisolver==1.1.0 +matplotlib==3.1.1 +numpy==1.17.4 +opencv-python==4.1.1.26 +pyparsing==2.4.5 +python-dateutil==2.8.1 +six==1.13.0 diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test-opencv-python.py" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test-opencv-python.py" new file mode 100644 index 00000000..b0c0cb16 --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test-opencv-python.py" @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/2 10:06 +# @Author : play4fun +# @File : test1-opencv-python.py +# @Software: PyCharm + +""" +test-opencv-python.py: +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +print(cv2.__version__, cv2.__doc__) + +img = cv2.imread('../../data/messi5.jpg', cv2.IMREAD_UNCHANGED) # 包括图像的 alpha 通道 +rows, cols, ch = img.shape +print('行/高:', rows, '列/宽:', cols, '通道:', ch) + +img = cv2.resize(img, (640, 480)) + +rows, cols, ch = img.shape +print('行/高:', rows, '列/宽:', cols, '通道:', ch) + +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) +# +# cv2.imshow('thresh', thresh) #不支持 +# cv2.waitKey(0) +''' +cv2.error: /Users/travis/build/skvark/opencv-python/opencv/modules/highgui/src/window.cpp:583: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvShowImage +''' + +#使用matplotlib来显示 +plt.imshow(thresh,cmap='gray') +plt.show() + + +#可以把结果写入jpg文件 +# cv2.imwrite('messi5-gray.jpg', gray) +# cv2.imwrite('messi5-thresh.jpg', thresh) diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_camera.py" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_camera.py" new file mode 100644 index 00000000..58a5b45d --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_camera.py" @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/2 10:53 +# @Author : play4fun +# @File : test_camera.py +# @Software: PyCharm + +""" +test_camera.py: +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +cap = cv2.VideoCapture(0) # 支持读取摄像头 +ret = cap.set(3, 640) +ret = cap.set(4, 480) + +plt.ion() +while cap.isOpened(): + ret, frame = cap.read() + plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) + plt.show() + # plt.show(block=False)#可选 + plt.pause(0.1) +# plt.show() diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_opencv_contrib_python.py" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_opencv_contrib_python.py" new file mode 100644 index 00000000..27143efc --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_opencv_contrib_python.py" @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/2 10:23 +# @Author : play4fun +# @File : test_opencv_contrib_python.py +# @Software: PyCharm + +""" +test_opencv_contrib_python.py: +""" + + +import numpy as np +import cv2 +from matplotlib import pyplot as plt +from time import sleep + +# 运行之前,检查cascade文件路径是否在你的电脑上 +face_cascade = cv2.CascadeClassifier('/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml') +eye_cascade = cv2.CascadeClassifier('/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml') + +# img = cv2.imread('../../data/sachin.jpg') +# img = cv2.imread('../../data/kongjie_hezhao.jpg') +img = cv2.imread('../../data/airline-stewardess-bikini.jpg') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +# cv2.imshow('gray', gray) + + +# faces = face_cascade.detectMultiScale(gray, 1.3, 5) +faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE) +print("Detected ", len(faces), " face") + +plt.ion() +for (x, y, w, h) in faces: + img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) + roi_gray = gray[y:y + h, x:x + w] + roi_color = img[y:y + h, x:x + w] + + eyes = eye_cascade.detectMultiScale(roi_gray) + for (ex, ey, ew, eh) in eyes: + cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) + plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) + plt.show() + # cv2.waitKey(500) + plt.pause(1) + # sleep(2) + # sleep(2) + # cv2.waitKey(500) + plt.pause(1) + +# plt.show() +plt.show(block=True) +# cv2.imshow('img', img) +# cv2.waitKey(0) +# cv2.destroyAllWindows() + +# cv2.imwrite('face_recognize.jpg', img) \ No newline at end of file diff --git "a/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_video.py" "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_video.py" new file mode 100644 index 00000000..bb302d96 --- /dev/null +++ "b/ch02-\345\256\211\350\243\205OpenCV/\346\234\200\347\256\200\345\215\225-\344\275\277\347\224\250pip\345\256\211\350\243\205opencv-python\345\222\214opencv-contrib-python/test_video.py" @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/2 10:46 +# @Author : play4fun +# @File : test_video.py +# @Software: PyCharm + +""" +test_video.py: +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +cap = cv2.VideoCapture('../../data/vtest.avi')#不支持读取视频 +# cap = cv2.VideoCapture('output.avi') +# cap = cv2.VideoCapture('Minions_banana.mp4') + + +# 帧率 +fps = cap.get(cv2.CAP_PROP_FPS) # 25.0 +print("Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps)) +# 总共有多少帧 +num_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) +print('共有', num_frames, '帧') +# +frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) +frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) +print('高:', frame_height, '宽:', frame_width) + +FRAME_NOW = cap.get(cv2.CAP_PROP_POS_FRAMES) # 第0帧 +print('当前帧数', FRAME_NOW) # 当前帧数 0.0 + +# 读取指定帧,对视频文件才有效,对摄像头无效?? +# frame_no = 121 +# cap.set(1, frame_no) # Where frame_no is the frame you want +ret, frame = cap.read() # Read the frame +print(ret, frame) +# cv2.imshow('frame_no'+str(frame_no), frame) + +FRAME_NOW = cap.get(cv2.CAP_PROP_POS_FRAMES) +print('当前帧数', FRAME_NOW) # 当前帧数 122.0 + +if frame is not None:#出错 + plt.imshow(frame) + # plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) + plt.show() \ No newline at end of file diff --git "a/ch03-\347\233\270\345\205\263\346\225\231\347\250\213\345\217\212\350\247\206\351\242\221/README.md" "b/ch03-\347\233\270\345\205\263\346\225\231\347\250\213\345\217\212\350\247\206\351\242\221/README.md" new file mode 100644 index 00000000..87d7d4e8 --- /dev/null +++ "b/ch03-\347\233\270\345\205\263\346\225\231\347\250\213\345\217\212\350\247\206\351\242\221/README.md" @@ -0,0 +1,36 @@ +# 教程 + +- 《OpenCV-Python教程》,感觉很好 + - http://blog.csdn.net/sunny2038/article/category/904451 + + + +# 视频 +- B站视频 + - [python+opencv3.3视频教学 基础入门](https://www.bilibili.com/video/av24998616) + - [OpenCV基础课程](https://www.bilibili.com/video/av29600072) + - [基于OpenCV的图像和视频分析(Python语言)外国YouTube高手sentex,推荐](https://www.bilibili.com/video/av13924091) + +- YouTube +* [sentex的OpenCV视频教程](https://www.youtube.com/playlist?list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 1. [Intro and loading Images - OpenCV with Python for Image and Video Analysis 1](https://www.youtube.com/watch?v=Z78zbnLlPUA&index=1&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 2. [Loading Video Source - OpenCV with Python for Image and Video Analysis 2](https://www.youtube.com/watch?v=Jvf5y21ZqtQ&index=2&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 3. [Drawing and Writing on Image - OpenCV with Python for Image and Video Analysis 3](https://www.youtube.com/watch?v=U6uIrq2eh_o&index=3&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 4. [Image Operations - OpenCV with Python for Image and Video Analysis 4](https://www.youtube.com/watch?v=1pzk_DIL_wo&index=4&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 5. [Image arithmetics and Logic - OpenCV with Python for Image and Video Analysis 5](https://www.youtube.com/watch?v=_gfNpJmWIug&index=5&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 6. [Thresholding - OpenCV with Python for Image and Video Analysis 6](https://www.youtube.com/watch?v=jXzkxsT9gxM&index=6&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 7. [Color Filtering - OpenCV with Python for Image and Video Analysis 7](https://www.youtube.com/watch?v=CCOXg75HkvM&index=7&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 8. [Blurring and Smoothing - OpenCV with Python for Image and Video Analysis 8](https://www.youtube.com/watch?v=sARklx6sgDk&index=8&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 9. [Morphological Transformations - OpenCV with Python for Image and Video Analysis 9](https://www.youtube.com/watch?v=YA5u2PI3hF0&index=9&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 10. [Edge Detection and Gradients - OpenCV with Python for Image and Video Analysis 10](https://www.youtube.com/watch?v=CJMCoAsK-h0&index=10&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 11. [Template Matching - OpenCV with Python for Image and Video Analysis 11](https://www.youtube.com/watch?v=2CZltXv-Gpk&index=11&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 12. [GrabCut Foreground Extraction - OpenCV with Python for Image and Video Analysis 12](https://www.youtube.com/watch?v=qxfP13BMhq0&index=12&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 13. [Corner Detection - OpenCV with Python for Image and Video Analysis 13](https://www.youtube.com/watch?v=6e6NbNegChU&index=13&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 14. [Feature Matching (Homography) Brute Force - OpenCV with Python for Image and Video Analysis 14](https://www.youtube.com/watch?v=UquTAf_9dVA&index=14&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 15. [MOG Background Reduction - OpenCV with Python for Image and Video Analysis 15](https://www.youtube.com/watch?v=8-3vl71TjDs&index=15&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 16. [Haar Cascade Object Detection Face & Eye - OpenCV with Python for Image and Video Analysis 16](https://www.youtube.com/watch?v=88HdqNDQsEk&index=16&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 17. [Making your own Haar Cascade Intro - OpenCV with Python for Image and Video Analysis 17](https://www.youtube.com/watch?v=jG3bu0tjFbk&index=17&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 18. [Gathering Images for Haar Cascade - OpenCV with Python for Image and Video Analysis 18](https://www.youtube.com/watch?v=z_6fPS5tDNU&index=18&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 19. [Cleaning images and creating description files - OpenCV with Python for Image and Video Analysis 19](https://www.youtube.com/watch?v=t0HOVLK30xQ&index=19&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 20. [Training Haar cascade object detection - OpenCV with Python for Image and Video Analysis 20](https://www.youtube.com/watch?v=eay7CgPlCyo&index=20&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) + 21. [Haar Cascade for image & video object classification - OpenCV w/ Python for Image Video Analysis 21](https://www.youtube.com/watch?v=-Mhy-5YNcG4&index=21&list=PLQVvvaa0QuDdttJXlLtAJxJetJcqmqlQq) \ No newline at end of file diff --git "a/ch04-\345\233\276\347\211\207/4.1_imread_imshow.py" "b/ch04-\345\233\276\347\211\207/4.1_imread_imshow.py" new file mode 100755 index 00000000..b876bce3 --- /dev/null +++ "b/ch04-\345\233\276\347\211\207/4.1_imread_imshow.py" @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +import numpy as np +import cv2 + +print(cv2.__version__) + + +# img = cv2.imread('messi5.jpg',cv2.IMREAD_COLOR)#读入一副彩色图像。图像的透明度会被忽略 默认参数。 +# img = cv2.imread('messi5.jpg', cv2.IMREAD_GRAYSCALE)# Load an color image in grayscale 灰度 +img = cv2.imread('messi5.jpg',cv2.IMREAD_UNCHANGED)#包括图像的 alpha 通道 + +img = cv2.resize(img, (640, 480)) + +# img.I +# AttributeError: 'numpy.ndarray' object has no attribute 'I' + +# +rows,cols,ch=img.shape +print('行/高:',rows,'列/宽:',cols,'通道:',ch) +#图像的宽对应的是列数, 高对应的是行数。 + +cv2.namedWindow('image', cv2.WINDOW_NORMAL)#可以调整窗口大小 +# cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE)#自动调整 +# cv2.namedWindow('image', cv2.WINDOW_KEEPRATIO)#保持图片比例 + +# cv2.resizeWindow('image', 200, 200) # 不起作用? + +cv2.imshow('image', img)#窗口会自动调整为图像大小 +# 在窗口上按任意键退出 +cv2.waitKey(delay=0)#返回按键的 ASCII 码值 + +cv2.destroyAllWindows() + +# +# cv2.imwrite('messigray.png', img) diff --git "a/ch04-\345\233\276\347\211\207/4.imread_imshow_imwrite.py" "b/ch04-\345\233\276\347\211\207/4.imread_imshow_imwrite.py" new file mode 100755 index 00000000..a769d77e --- /dev/null +++ "b/ch04-\345\233\276\347\211\207/4.imread_imshow_imwrite.py" @@ -0,0 +1,12 @@ +import numpy as np +import cv2 + +img = cv2.imread('messi5.jpg', 0) +cv2.imshow('image', img) + +k = cv2.waitKey(0) +if k == 27: # wait for ESC key to exit + cv2.destroyAllWindows() +elif k == ord('s'): # wait for 's' key to save and exit + cv2.imwrite('messigray.png', img) + cv2.destroyAllWindows() diff --git "a/ch04-\345\233\276\347\211\207/4.matplotlib.py" "b/ch04-\345\233\276\347\211\207/4.matplotlib.py" new file mode 100755 index 00000000..e1191b15 --- /dev/null +++ "b/ch04-\345\233\276\347\211\207/4.matplotlib.py" @@ -0,0 +1,10 @@ +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('messi5.jpg', 0) +plt.imshow(img, cmap='gray', interpolation='bicubic') +# 彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotlib 是 RGB 模式。所以彩色图像如果已经被OpenCV 读取, 它将不会被 Matplotlib 正 确显示。 + +plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis +plt.show() diff --git "a/ch04-\345\233\276\347\211\207/black.jpg" "b/ch04-\345\233\276\347\211\207/black.jpg" new file mode 100644 index 00000000..c5860da6 Binary files /dev/null and "b/ch04-\345\233\276\347\211\207/black.jpg" differ diff --git "a/ch04-\345\233\276\347\211\207/cv2_imread_path_not_found.py" "b/ch04-\345\233\276\347\211\207/cv2_imread_path_not_found.py" new file mode 100644 index 00000000..9aaf9b16 --- /dev/null +++ "b/ch04-\345\233\276\347\211\207/cv2_imread_path_not_found.py" @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/19 上午10:52 +# @Author : play4fun +# @File : cv2_imread_path_not_found.py +# @Software: PyCharm + +""" +cv2_imread_path_not_found.py: +""" + +import cv2 +import numpy as np +import os +import errno + +path = 'messi6.jpg'#不正确的路径,文件不存在 +# path = '../data/messi5.jpg' +if not os.path.exists(path): + raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), path) + +img = cv2.imread(path, cv2.IMREAD_UNCHANGED) + +cv2.imshow('src', img) +cv2.waitKey(0) diff --git a/ch4/messi5.jpg "b/ch04-\345\233\276\347\211\207/messi5.jpg" similarity index 100% rename from ch4/messi5.jpg rename to "ch04-\345\233\276\347\211\207/messi5.jpg" diff --git a/ch4/messigray.png "b/ch04-\345\233\276\347\211\207/messigray.png" similarity index 100% rename from ch4/messigray.png rename to "ch04-\345\233\276\347\211\207/messigray.png" diff --git "a/ch04-\345\233\276\347\211\207/show_image.py" "b/ch04-\345\233\276\347\211\207/show_image.py" new file mode 100644 index 00000000..343882df --- /dev/null +++ "b/ch04-\345\233\276\347\211\207/show_image.py" @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/1/19 20:39 +# @Author : play4fun +# @File : show_image.py +# @Software: PyCharm + +""" +show_image.py: +制作有用的工具,日常使用 +在环境变量中设置: +alias show='/Users/play/.py3/bin/python3.6 /Users/play/github/OpenCV-Python-Tutorial/ch04-图片/show_image.py ' + +""" + +import numpy as np +import cv2, sys + +if len(sys.argv) < 2: + print('show_image.py image_path') + sys.exit(0) + +image_path = sys.argv[1] +try: + f = open(image_path) +except Exception as e: + print(e) + sys.exit(-1) + +img = cv2.imread(image_path, cv2.IMREAD_UNCHANGED) # 包括图像的 alpha 通道 +temp = img.copy() + +title = image_path.split('/')[-1] + f' {img.shape}' + +gray = False +while True: + cv2.imshow(title, temp) + + k = cv2.waitKey(10) + if k == 27 or k == ord('q'): + break + #TODO 分辨率太大,需要缩放 + if k == ord('g'): + # t = temp == img + # if t.all(): + # if t.any(): + # if temp == img: + if gray is False: + temp = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + gray = True + else: + temp = img.copy() + gray = False + +cv2.destroyAllWindows() diff --git "a/ch04-\345\233\276\347\211\207/white.jpg" "b/ch04-\345\233\276\347\211\207/white.jpg" new file mode 100644 index 00000000..2d029275 Binary files /dev/null and "b/ch04-\345\233\276\347\211\207/white.jpg" differ diff --git "a/ch04-\345\233\276\347\211\207/\345\210\233\345\273\272\351\273\221\347\231\275\345\233\276\347\211\2071.py" "b/ch04-\345\233\276\347\211\207/\345\210\233\345\273\272\351\273\221\347\231\275\345\233\276\347\211\2071.py" new file mode 100644 index 00000000..d3e15b45 --- /dev/null +++ "b/ch04-\345\233\276\347\211\207/\345\210\233\345\273\272\351\273\221\347\231\275\345\233\276\347\211\2071.py" @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/3/27 19:19 +# @Author : play4fun +# @File : 创建图片1.py +# @Software: PyCharm + +""" +创建图片1.py: +""" + +import numpy as np +import cv2 + +size = (2560, 1600) +# 全黑.可以用在屏保 +black = np.zeros(size) +print(black[34][56]) +cv2.imwrite('black.jpg',black) + +#white 全白 +black[:]=255 +print(black[34][56]) +cv2.imwrite('white.jpg',black) \ No newline at end of file diff --git "a/ch04-\345\233\276\347\211\207/\351\242\234\350\211\262\350\275\254\346\215\242.py" "b/ch04-\345\233\276\347\211\207/\351\242\234\350\211\262\350\275\254\346\215\242.py" new file mode 100644 index 00000000..854e82aa --- /dev/null +++ "b/ch04-\345\233\276\347\211\207/\351\242\234\350\211\262\350\275\254\346\215\242.py" @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/1/20 17:15 +# @Author : play4fun +# @File : 颜色转换.py +# @Software: PyCharm + +""" +颜色转换.py: +""" +import cv2 + + +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + + +temp = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)#灰色转RGB \ No newline at end of file diff --git "a/ch05-\350\247\206\351\242\221/5.VideoCapture.py" "b/ch05-\350\247\206\351\242\221/5.VideoCapture.py" new file mode 100755 index 00000000..0be5f3af --- /dev/null +++ "b/ch05-\350\247\206\351\242\221/5.VideoCapture.py" @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Jan 3 21:06:22 2014 + +@author: duan + """ +''' + 注意 当你的程序报错时 你 先检查的是你的摄像头是否能够在其他程 序中正常工作 比如 linux 下的 Cheese 。 +''' + +import numpy as np +import cv2 + +cap = cv2.VideoCapture(0) # 一般的笔 本电脑 有内置摄像头。所以参数就是 0。你可以 设置成 1 或 者其他的来 择别的摄像头 + +''' +你可以使用函数 cap.get(propId) 来获得 的一些参数信息。 +propId 可以是 0 到 18 之 的任何整数。 + +其中的一些值可以使用 cap.set(propId,value) 来修改 value 就是 你想 置成的新值。 +例如 我可以使用 cap.get(3) cv2.CAP_PROP_FRAME_WIDTH和 cap.get(4) cv2.CAP_PROP_FRAME_HEIGHT来查看每一帧的宽和高。 +默认情况下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320) 和 ret=cap.set(4,240) 来把宽和高改成 320X240。 +''' +# ret=cap.set(3,320) +# ret=cap.set(4,240) + +# ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480)#避免计算量过大 +# ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 270)# +#等比缩放 +frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)#4 ,720 +frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)#3 ,1280 +frame_height=int(480/frame_width*frame_height)#270 +ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)#高 +ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) + + + +# while (True): +while cap.isOpened(): # 检查是否成功初始化,否则就 使用函数 cap.open() + # Capture frame-by-frame + ret, frame = cap.read() # ret 返回一个布尔值 True/False + # print('frame shape:',frame.shape)#(720, 1280, 3) + + frame = cv2.flip(frame, flipCode=1) # 左右翻转,使用笔记本电脑摄像头才有用。 + # flipCode:翻转方向:1:水平翻转;0:垂直翻转;-1:水平垂直翻转 + + # Our operations on the frame come here + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # Display the resulting frame + cv2.imshow('frame', gray) + cv2.setWindowTitle('frame', 'COLOR_BGR2GRAY') + + # Property=cv2.getWindowProperty('frame',0)#无用 + + # if cv2.waitKey(1) & 0xFF == ord('q'):#不行 + # break + key = cv2.waitKey(delay=10) + if key == ord("q"): + break + +# When everything done, release the capture +cap.release() +cv2.destroyAllWindows() diff --git "a/ch05-\350\247\206\351\242\221/5.VideoPlay.py" "b/ch05-\350\247\206\351\242\221/5.VideoPlay.py" new file mode 100755 index 00000000..53885f03 --- /dev/null +++ "b/ch05-\350\247\206\351\242\221/5.VideoPlay.py" @@ -0,0 +1,45 @@ +import numpy as np +import cv2 + +cap = cv2.VideoCapture('../data/vtest.avi') +# cap = cv2.VideoCapture('output.avi') +# cap = cv2.VideoCapture('Minions_banana.mp4') + + +# 帧率 +fps = cap.get(cv2.CAP_PROP_FPS) # 25.0 +print("Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps)) +# 总共有多少帧 +num_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) +print('共有', num_frames, '帧') +# +frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) +frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) +print('高:', frame_height, '宽:', frame_width) + +FRAME_NOW = cap.get(cv2.CAP_PROP_POS_FRAMES) # 第0帧 +print('当前帧数', FRAME_NOW) # 当前帧数 0.0 + +# 读取指定帧,对视频文件才有效,对摄像头无效?? +frame_no = 121 +cap.set(1, frame_no) # Where frame_no is the frame you want +ret, frame = cap.read() # Read the frame +cv2.imshow('frame_no'+str(frame_no), frame) + +FRAME_NOW = cap.get(cv2.CAP_PROP_POS_FRAMES) +print('当前帧数', FRAME_NOW) # 当前帧数 122.0 + +while cap.isOpened(): + ret, frame = cap.read() + FRAME_NOW = cap.get(cv2.CAP_PROP_POS_FRAMES) # 当前帧数 + print('当前帧数', FRAME_NOW) + + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + cv2.imshow('frame', gray) + key = cv2.waitKey(1) + if key == ord("q"): + break + +cap.release() +cv2.destroyAllWindows() diff --git "a/ch05-\350\247\206\351\242\221/5.VideoWriter.py" "b/ch05-\350\247\206\351\242\221/5.VideoWriter.py" new file mode 100755 index 00000000..b2791ed9 --- /dev/null +++ "b/ch05-\350\247\206\351\242\221/5.VideoWriter.py" @@ -0,0 +1,40 @@ +import numpy as np +import cv2 + +cap = cv2.VideoCapture(0) +width = 640 +ret = cap.set(3, width) +height = 480 +ret = cap.set(4, height) + +# Define the codec and create VideoWriter object +fourcc = cv2.VideoWriter_fourcc(*'XVID') # opencv 3.0 +# Error: 'module' object has no attribute 'VideoWriter_fourcc' +# fourcc=cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') +#jpeg,h263,'m', 'p', '4', 'v' + +# +out = cv2.VideoWriter('output.avi', fourcc, 20.0, (width, height)) + +while cap.isOpened(): + ret, frame = cap.read() + if ret is True: + + frame = cv2.resize(frame, (640, 480)) + + # write the flipped frame + out.write(frame) + + cv2.imshow('frame', frame) + + else: + break + + key = cv2.waitKey(1) + if key == ord("q"): + break + +# Release everything if job is finished +cap.release() +out.release() +cv2.destroyAllWindows() diff --git "a/ch05-\350\247\206\351\242\221/Minions_banana.mp4" "b/ch05-\350\247\206\351\242\221/Minions_banana.mp4" new file mode 100644 index 00000000..33e9679b Binary files /dev/null and "b/ch05-\350\247\206\351\242\221/Minions_banana.mp4" differ diff --git "a/ch05-\350\247\206\351\242\221/VideoCaptureOnePicture.py" "b/ch05-\350\247\206\351\242\221/VideoCaptureOnePicture.py" new file mode 100644 index 00000000..1a7b3bc9 --- /dev/null +++ "b/ch05-\350\247\206\351\242\221/VideoCaptureOnePicture.py" @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/9 下午7:24 +# @Author : play4fun +# @File : VideoCaptureOnePicture.py +# @Software: PyCharm + +""" +VideoCaptureOnePicture.py: +""" + +import numpy as np +import cv2 +import string, random + + +def id_generator(size=6, chars=string.ascii_uppercase + string.digits): + return ''.join(random.choice(chars) for _ in range(size)) + + +cap = cv2.VideoCapture(0) + +while cap.isOpened(): + ret, frame = cap.read() + print('frame.shape:', frame.shape) # (720, 1280, 3) + + cv2.imshow('frame',frame) + + key = cv2.waitKey(delay=1) + if key == ord("q"): + break + elif key == ord("s"): + cv2.imwrite(id_generator() + '.jpg', frame) + +cap.release() +cv2.destroyAllWindows() diff --git "a/ch05-\350\247\206\351\242\221/output.avi" "b/ch05-\350\247\206\351\242\221/output.avi" new file mode 100644 index 00000000..e69de29b diff --git "a/ch05-\350\247\206\351\242\221/two_camera.py" "b/ch05-\350\247\206\351\242\221/two_camera.py" new file mode 100644 index 00000000..1e1e983b --- /dev/null +++ "b/ch05-\350\247\206\351\242\221/two_camera.py" @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/15 00:19 +# @Author : play4fun +# @File : two_camera.py +# @Software: PyCharm + +""" +two_camera.py: +""" + +import cv2 +import numpy as np + +cap0 = cv2.VideoCapture(0) +cap1 = cv2.VideoCapture(1) +ret = cap0.set(3, 320) +ret = cap0.set(4, 240) +ret = cap1.set(3, 320) +ret = cap1.set(4, 240) + +while cap0.isOpened() and cap1.isOpened(): + ret0, frame0 = cap0.read() + ret1, frame1 = cap1.read() + + if ret0: + cv2.imshow('frame0', frame0) + cv2.setWindowTitle('frame0','On Top') + if ret1: + cv2.imshow('frame1', frame1) + # cv2.moveWindow('frame1', x=frame0.shape[1], y=0) + cv2.moveWindow('frame1', x=320, y=40) + + key = cv2.waitKey(delay=2) + if key == ord("q"): + break + +# When everything done, release the capture +cap0.release() +cap1.release() +cv2.destroyAllWindows() diff --git "a/ch05-\350\247\206\351\242\221/\347\233\270\346\234\272_\347\233\270\347\211\207\347\233\270\344\274\274\345\272\246/camera_compare1.py" "b/ch05-\350\247\206\351\242\221/\347\233\270\346\234\272_\347\233\270\347\211\207\347\233\270\344\274\274\345\272\246/camera_compare1.py" new file mode 100644 index 00000000..566b2ecb --- /dev/null +++ "b/ch05-\350\247\206\351\242\221/\347\233\270\346\234\272_\347\233\270\347\211\207\347\233\270\344\274\274\345\272\246/camera_compare1.py" @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/25 23:39 +# @Author : play4fun +# @File : camera_compare1.py +# @Software: PyCharm + +""" +camera_compare1.py: +参考 +http://www.pyimagesearch.com/2014/09/15/python-compare-two-images/ + +均方误差(MSE)或结构相似性指数(SSIM) + +""" + +from skimage.measure import compare_ssim as ssim +from skimage.measure import compare_mse as mse +import matplotlib.pyplot as plt +import numpy as np +import cv2 +# from utils import mse + +cap = cv2.VideoCapture(0) + +# frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 4 ,720 +# frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # 3 ,1280 +# frame_height = int(480 / frame_width * frame_height) # 270 +# +# ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height) # 高 +# ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) + +ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 640) +ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) + + + +title='camera compare' +plt.ion() + +# cap.read() +# cap.read() +# cap.read() +# cap.read() +ret, frame = cap.read() +temp = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) +#TODO 前10帧 +while cap.isOpened(): + ret, frame = cap.read() + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # + m = mse(temp, gray) + s = ssim(temp, gray) + print("MSE: %.2f, SSIM: %.2f" % (m, s)) + # + temp = gray.copy() + continue + + # # setup the figure + # fig = plt.figure(title) + # plt.suptitle("MSE: %.2f, SSIM: %.2f" % (m, s)) + # + # # show first image + # ax = fig.add_subplot(1, 2, 1) + # plt.imshow(temp, cmap=plt.cm.gray) + # plt.axis("off") + # + # # show the second image + # ax = fig.add_subplot(1, 2, 2) + # plt.imshow(gray, cmap=plt.cm.gray) + # plt.axis("off") + # + # # show the images + # plt.show() + + diff --git "a/ch05-\350\247\206\351\242\221/\347\233\270\346\234\272_\347\233\270\347\211\207\347\233\270\344\274\274\345\272\246/utils.py" "b/ch05-\350\247\206\351\242\221/\347\233\270\346\234\272_\347\233\270\347\211\207\347\233\270\344\274\274\345\272\246/utils.py" new file mode 100644 index 00000000..ccf14b04 --- /dev/null +++ "b/ch05-\350\247\206\351\242\221/\347\233\270\346\234\272_\347\233\270\347\211\207\347\233\270\344\274\274\345\272\246/utils.py" @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/25 23:37 +# @Author : play4fun +# @File : utils.py +# @Software: PyCharm + +""" +utils.py: +""" +import numpy as np + +def mse(imageA, imageB): + # the 'Mean Squared Error' between the two images is the + # sum of the squared difference between the two images; + # NOTE: the two images must have the same dimension + err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2) + err /= float(imageA.shape[0] * imageA.shape[1]) + + # return the MSE, the lower the error, the more "similar" + # the two images are + return err \ No newline at end of file diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/6.draw.py" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/6.draw.py" new file mode 100755 index 00000000..63e5eb01 --- /dev/null +++ "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/6.draw.py" @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +import numpy as np +import cv2 + +''' +• img: 你想 绘制图形的 幅图像。 +• color: 形状的颜色。以RGB为例 需要传入一个元组BGR 例如 255,0,0 + 代表蓝色,第一个是蓝色通道,第二个是绿色通道,第三个是红色通道。对于灰度图只需要传入灰度值。 +• thickness 线条的粗细。如果给一个闭合图形 置为 -1 那么这个图形 +就会被填充。 默认值是 1. +• linetype 线条的类型, 8 连接,抗锯齿等。 默认情况是8 连接。cv2.LINE_AA + 为抗锯齿 这样看起来会非常平滑。 + +''' + +# Create a black image +img = np.zeros((512, 512, 3), np.uint8) + +# Draw a diagonal blue line with thickness of 5 px +cv2.line(img, pt1=(0, 0), pt2=(511, 511), color=(255, 0, 0), thickness=5) # pt1, pt2, color, thickness= +# cv2.polylines() 可以 用来画很多条线。只需要把想 画的线放在一 个列表中, 将 列表传给函数就可以了。每条线 会被独立绘制。 这会比用 cv2.line() 一条一条的绘制 要快一些。 +# cv2.polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None) +cv2.arrowedLine(img,pt1=(21, 13), pt2=(151, 401), color=(255, 0, 0), thickness=5) + +cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3) + +cv2.circle(img, center=(447, 63), radius=63, color=(0, 0, 255), thickness=-1) # center, radius, color, thickness=None + +# 一个参数是中心点的位置坐标。 下一个参数是长轴和短轴的长度。椭圆沿逆时针方向旋转的角度。 +# 椭圆弧演顺时针方向起始的角度和结束角度 如果是 0 很 360 就是整个椭圆 +cv2.ellipse(img, center=(256, 256), axes=(100, 50), angle=0, startAngle=0, endAngle=180, color=255, + thickness=-1) # center, axes, angle, startAngle, endAngle, color, thickness= + +pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32) +pts = pts.reshape((-1, 1, 2)) +# 这里 reshape 的第一个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。 +# 注意 如果第三个参数是 False 我们得到的多边形是不闭合的 ,首 尾不相 连 。 + +font = cv2.FONT_HERSHEY_SIMPLEX +#org :Bottom-left corner of the text string in the image.左下角 +#或使用 bottomLeftOrigin=True,文字会上下颠倒 +cv2.putText(img, text='bottomLeftOrigin', org=(10, 400), fontFace=font, fontScale=1, color=(255, 255, 255), thickness=1,bottomLeftOrigin=True)#text, org, fontFace, fontScale, color, thickness= +cv2.putText(img, text='OpenCV', org=(10, 500), fontFace=font, fontScale=4, color=(255, 255, 255), thickness=2)#text, org, fontFace, fontScale, color, thickness= + +# 所有的绘图函数的返回值都是 None ,所以不能使用 img = cv2.line(img,(0,0),(5 + +winname = 'example' +cv2.namedWindow(winname, 0) +cv2.imshow(winname, img) + +cv2.imwrite("example.png", img) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/Drawing_UTF-8_strings.py" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/Drawing_UTF-8_strings.py" new file mode 100644 index 00000000..eb2f1efe --- /dev/null +++ "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/Drawing_UTF-8_strings.py" @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/23 下午9:11 +# @Author : play4fun +# @File : Drawing_UTF-8_strings.py +# @Software: PyCharm + +""" +Drawing_UTF-8_strings.py: + +https://fireant.github.io/misc/2017/01/28/ttf-opencv.html +""" + +import cv2 +import numpy as np + +img = np.zeros((100, 300, 3), dtype=np.uint8) + +ft = cv2.freetype.createFreeType2() # 需要安装freetype模块 cv2' has no attribute 'freetype' +# ft.loadFontData(fontFileName='Ubuntu-R.ttf',id=0) +# ft.loadFontData(fontFileName='/usr/share/fonts/truetype/freefont/FreeSans.ttf',id=0)#不支持中文 +# ft.loadFontData(fontFileName='/usr/share/fonts-droid/truetype/DroidSansFallback.ttf',id=0)#树莓派,搞定 + +# sudo apt-get install ttf-wqy-zenhei #安装字体 +# ft.loadFontData(fontFileName='/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc', id=0) # 文泉驿的开源中文字体 + +# macOS 直接加载当前文件夹的ttc字体文件 +ft.loadFontData(fontFileName='wqy-zenhei.ttc', id=0) + +ft.putText(img=img, + # text='Quick Fox', + text='你好中文', + org=(15, 70), # text 左上角 坐标 + fontHeight=60, # 字体高度 + color=(255, 255, 255), # 字体为白色 + thickness=-1, # 厚度 + line_type=cv2.LINE_AA, + bottomLeftOrigin=True) + +# cv2.imwrite('freetype.png', img) +cv2.imshow('freetype', img) +cv2.waitKey(0) diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/DroidSansFallback.png" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/DroidSansFallback.png" new file mode 100644 index 00000000..1aa58d36 Binary files /dev/null and "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/DroidSansFallback.png" differ diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/DroidSansFallback.ttf" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/DroidSansFallback.ttf" new file mode 100644 index 00000000..2b751139 Binary files /dev/null and "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/DroidSansFallback.ttf" differ diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/draw_opencv_logo.py" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/draw_opencv_logo.py" new file mode 100644 index 00000000..24142824 --- /dev/null +++ "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/draw_opencv_logo.py" @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/11 下午7:07 +# @Author : play4fun +# @File : draw_opencv_logo.py +# @Software: PyCharm + +""" +draw_opencv_logo.py:Try to create the logo of OpenCV using drawing functions available in OpenCV. +""" + +import numpy as np +import cv2 # 3.0.0-dev +import math + +r1 = 70 +r2 = 30 + +ang = 60 + +d = 170 +h = int(d / 2 * math.sqrt(3)) + +dot_red = (256, 128) +dot_green = (int(dot_red[0] - d / 2), dot_red[1] + h) +dot_blue = (int(dot_red[0] + d / 2), dot_red[1] + h) + +# tan = float(dot_red[0]-dot_green[0])/(dot_green[1]-dot_red[0]) +# ang = math.atan(tan)/math.pi*180 + +red = (0, 0, 255) +green = (0, 255, 0) +blue = (255, 0, 0) +black = (0, 0, 0) + +full = -1 + +img = np.zeros((512, 512, 3), np.uint8) +# img = np.ones((512, 512, 3), np.uint8) + +cv2.circle(img, dot_red, r1, red, full) +cv2.circle(img, dot_green, r1, green, full) +cv2.circle(img, dot_blue, r1, blue, full) +cv2.circle(img, dot_red, r2, black, full) +cv2.circle(img, dot_green, r2, black, full) +cv2.circle(img, dot_blue, r2, black, full) + +cv2.ellipse(img, dot_red, (r1, r1), ang, 0, ang, black, full) +cv2.ellipse(img, dot_green, (r1, r1), 360 - ang, 0, ang, black, full) +cv2.ellipse(img, dot_blue, (r1, r1), 360 - 2 * ang, ang, 0, black, full) + +font = cv2.FONT_HERSHEY_SIMPLEX +cv2.putText(img, text='OpenCV', org=(15, 450), fontFace=font, fontScale=4, color=(255, 255, 255), thickness=10)#text, + +cv2.imwrite("opencv_logo.png", img) +# cv2.imwrite("opencv_logo2.png", img) diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/example.png" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/example.png" new file mode 100644 index 00000000..ff9b20f0 Binary files /dev/null and "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/example.png" differ diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/freetype.png" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/freetype.png" new file mode 100644 index 00000000..6696d97a Binary files /dev/null and "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/freetype.png" differ diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/opencv_logo.png" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/opencv_logo.png" new file mode 100644 index 00000000..3f1c4a22 Binary files /dev/null and "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/opencv_logo.png" differ diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/opencv_logo2.png" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/opencv_logo2.png" new file mode 100644 index 00000000..e2d272e6 Binary files /dev/null and "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/opencv_logo2.png" differ diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/random-circles2.jpg" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/random-circles2.jpg" new file mode 100644 index 00000000..b94ba37e Binary files /dev/null and "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/random-circles2.jpg" differ diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/wqy-zenhei.ttc" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/wqy-zenhei.ttc" new file mode 100644 index 00000000..a89ec00c Binary files /dev/null and "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/wqy-zenhei.ttc" differ diff --git "a/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/\347\224\273\345\234\206\345\234\210.py" "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/\347\224\273\345\234\206\345\234\210.py" new file mode 100644 index 00000000..fb6a53c6 --- /dev/null +++ "b/ch06-\347\273\230\345\233\276\345\207\275\346\225\260/\347\224\273\345\234\206\345\234\210.py" @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/17 下午12:03 +# @Author : play4fun +# @File : 画圆圈.py +# @Software: PyCharm + +""" +画圆圈.py:随机覆盖,不同颜色, +""" +from time import sleep +import cv2 +import numpy as np + + +def click_event(event, x, y, flags, param): + ''' + 用左键点击屏幕,打印坐标 + :param event: + :param x: + :param y: + :param flags: + :param param: + :return: + ''' + if event == cv2.EVENT_LBUTTONDOWN: + print(x, y, flags, param) + + +cv2.namedWindow('Canvas', cv2.WINDOW_GUI_EXPANDED) +cv2.setMouseCallback("Canvas", click_event) + +canvas = np.zeros((300, 300, 3), dtype="uint8") +while True: + try: + for i in range(0, 25): + radius = np.random.randint(5, high=200) + color = np.random.randint(0, high=256, size=(3,)).tolist() + pt = np.random.randint(0, high=300, size=(2,)) + cv2.circle(canvas, tuple(pt), radius, color, -1) + + cv2.imshow("Canvas", canvas) + + key = cv2.waitKey(1000) # 等待1秒 + if key == ord('q'): + break + else: + # sleep(1) + continue + except KeyboardInterrupt as e: + print('KeyboardInterrupt', e) + finally: + cv2.imwrite('random-circles2.jpg', canvas) diff --git a/ch7/7.MouseCallback.py "b/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/7.MouseCallback.py" similarity index 58% rename from ch7/7.MouseCallback.py rename to "ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/7.MouseCallback.py" index a62cf399..25df0a56 100755 --- a/ch7/7.MouseCallback.py +++ "b/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/7.MouseCallback.py" @@ -6,17 +6,22 @@ # mouse callback function -def draw_circle(event, x, y, flags, param): +def draw_circle(event, x, y, flags, param): # 只用做一件事:在双击过的地方绘 制一个圆圈。 if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img, (x, y), 100, (255, 0, 0), -1) # 创建图像与窗口并将窗口与回调函数绑定 img = np.zeros((512, 512, 3), np.uint8) -cv2.namedWindow('image',0) +cv2.namedWindow('image', cv2.WINDOW_NORMAL) + cv2.setMouseCallback('image', draw_circle) -while (1): + +while True: cv2.imshow('image', img) - if cv2.waitKey(20) & 0xFF == 27: + # if cv2.waitKey(20) & 0xFF == 27: + # break + key = cv2.waitKey(1) + if key == ord("q"): break cv2.destroyAllWindows() diff --git a/ch7/7.draw_circle_rectangle.py "b/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/7.draw_circle_rectangle.py" similarity index 80% rename from ch7/7.draw_circle_rectangle.py rename to "ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/7.draw_circle_rectangle.py" index b6603daf..d19d2dab 100755 --- a/ch7/7.draw_circle_rectangle.py +++ "b/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/7.draw_circle_rectangle.py" @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- import cv2 import numpy as np + # 当鼠标按下时变为 True drawing = False # 如果 mode 为 true 绘制矩形。按下'm' 变成绘制曲线。 mode=True ix, iy = -1, -1 -# 创建回调函数 +# 创建回调函数 #回调函数包含两部分 一部分画矩形 一部分画圆圈 def draw_circle(event, x, y, flags, param): global ix, iy, drawing, mode # 当按下左键是返回起始位置坐标 @@ -16,8 +17,8 @@ def draw_circle(event, x, y, flags, param): ix, iy = x, y # 当鼠标左键按下并移动是绘制图形。event 可以查看移动,flag 查看是否按下 elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON: - if drawing == True: - if mode == True: + if drawing is True: + if mode is True: cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1) else: # 绘制圆圈,小圆点连在一起就成了线,3 代表了笔画的粗细 @@ -25,9 +26,9 @@ def draw_circle(event, x, y, flags, param): # 下面注释掉的代码是起始点为圆心,起点到终点为半径的 # r = int(np.sqrt((x - ix) ** 2 + (y - iy) ** 2)) # cv2.circle(img, (x, y), r, (0, 0, 255), -1) - # 当鼠标松开停止绘画。 - elif event == cv2.EVENT_LBUTTONUP: - drawing == False + + elif event == cv2.EVENT_LBUTTONUP: # 当鼠标松开停止绘画。 + drawing = False # if mode == True: # cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1) # else: @@ -36,14 +37,16 @@ def draw_circle(event, x, y, flags, param): # img = np.zeros((512, 512, 3), np.uint8) -mode=False +mode = False cv2.namedWindow('image', 0) cv2.setMouseCallback('image', draw_circle) -while (1): +while True: cv2.imshow('image', img) - k = cv2.waitKey(1) & 0xFF + k = cv2.waitKey(1) # & 0xFF if k == ord('m'): mode = not mode - elif k == 27: + elif k == ord("q"): break + +cv2.destroyAllWindows() diff --git "a/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/putText.jpg" "b/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/putText.jpg" new file mode 100644 index 00000000..140814da Binary files /dev/null and "b/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/putText.jpg" differ diff --git "a/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/\351\274\240\346\240\207\345\267\246\345\217\263\351\224\256\345\233\236\350\260\203\345\207\275\346\225\260.py" "b/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/\351\274\240\346\240\207\345\267\246\345\217\263\351\224\256\345\233\236\350\260\203\345\207\275\346\225\260.py" new file mode 100644 index 00000000..4c90a249 --- /dev/null +++ "b/ch07-\346\212\212\351\274\240\346\240\207\345\275\223\347\224\273\347\254\224/\351\274\240\346\240\207\345\267\246\345\217\263\351\224\256\345\233\236\350\260\203\345\207\275\346\225\260.py" @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/17 下午6:19 +# @Author : play4fun +# @File : 鼠标左右键回调函数.py +# @Software: PyCharm + +""" +鼠标左右键回调函数.py: +""" + +import cv2 + + +def click_event(event, x, y, flags, param): + if event == cv2.EVENT_LBUTTONDOWN: + print(x, y) + + if event == cv2.EVENT_RBUTTONDOWN: + red = img[y, x, 2] + blue = img[y, x, 0] + green = img[y, x, 1] + print(red, green, blue) + + strRGB = str(red) + "," + str(green) + "," + str(blue) + font = cv2.FONT_HERSHEY_SIMPLEX + cv2.putText(img, strRGB, (x, y), font, 1, (255, 255, 255), 2) + cv2.imshow('original', img) + + +img = cv2.imread('../data/messi5.jpg') +cv2.imshow('original', img) + +cv2.setMouseCallback("original", click_event) +cv2.waitKey(0) +cv2.imwrite('putText.jpg',img) + +cv2.destroyAllWindows() diff --git a/ch8/8.Trackbar_draw.py "b/ch08-\347\224\250\346\273\221\345\212\250\346\235\241\345\201\232\350\260\203\350\211\262\346\235\277/8.Trackbar_draw.py" similarity index 76% rename from ch8/8.Trackbar_draw.py rename to "ch08-\347\224\250\346\273\221\345\212\250\346\235\241\345\201\232\350\260\203\350\211\262\346\235\277/8.Trackbar_draw.py" index 02ad8d42..e511d2e1 100755 --- a/ch8/8.Trackbar_draw.py +++ "b/ch08-\347\224\250\346\273\221\345\212\250\346\235\241\345\201\232\350\260\203\350\211\262\346\235\277/8.Trackbar_draw.py" @@ -12,6 +12,15 @@ def nothing(x): # 如果 mode 为 true 绘制矩形。按下'm' 变成绘制曲线。 mode=True ix, iy = -1, -1 +''' +cv2.getTrackbarPos() 函数的第一个参数是滑动条的名字 +第二个参数 是滑动条被放置窗口的名字 +第三个参数是滑动条的默认位置。 +第四个参数是滑动条的最大值 +第五个函数是回调函数, 每次滑动条的滑动都会调用回调函 数。 +回调函数通常都会含有一个默认参数 就是滑动条的位置 +''' + # 创建回调函数 def draw_circle(event, x, y, flags, param): @@ -27,8 +36,8 @@ def draw_circle(event, x, y, flags, param): ix, iy = x, y # 当鼠标左键按下并移动是绘制图形。event 可以查看移动,flag 查看是否按下 elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON: - if drawing == True: - if mode == True: + if drawing is True: + if mode is True: cv2.rectangle(img, (ix, iy), (x, y), color, -1) else: # 绘制圆圈,小圆点连在一起就成了线,3 代表了笔画的粗细 @@ -39,7 +48,7 @@ def draw_circle(event, x, y, flags, param): # 当鼠标松开停止绘画。 elif event == cv2.EVENT_LBUTTONUP: - drawing == False + drawing = False # if mode==True: # cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) # else: @@ -47,17 +56,18 @@ def draw_circle(event, x, y, flags, param): img = np.zeros((512, 512, 3), np.uint8) -mode=False +mode = False cv2.namedWindow('image') cv2.createTrackbar('R', 'image', 0, 255, nothing) cv2.createTrackbar('G', 'image', 0, 255, nothing) cv2.createTrackbar('B', 'image', 0, 255, nothing) cv2.setMouseCallback('image', draw_circle) -while (1): + +while True: cv2.imshow('image', img) - k = cv2.waitKey(1) & 0xFF + k = cv2.waitKey(1) # & 0xFF if k == ord('m'): mode = not mode - elif k == 27: + elif k == ord("q"): break diff --git "a/ch08-\347\224\250\346\273\221\345\212\250\346\235\241\345\201\232\350\260\203\350\211\262\346\235\277/8.createTrackbar.py" "b/ch08-\347\224\250\346\273\221\345\212\250\346\235\241\345\201\232\350\260\203\350\211\262\346\235\277/8.createTrackbar.py" new file mode 100755 index 00000000..5edfcd40 --- /dev/null +++ "b/ch08-\347\224\250\346\273\221\345\212\250\346\235\241\345\201\232\350\260\203\350\211\262\346\235\277/8.createTrackbar.py" @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +import cv2 +import numpy as np + + +def nothing(x): + pass + + +# Create a black image, a window +img = np.zeros((300, 512, 3), np.uint8) +cv2.namedWindow('image', cv2.WINDOW_NORMAL) + +# create trackbars for color change +cv2.createTrackbar('R', 'image', 0, 255, nothing) +cv2.createTrackbar('G', 'image', 0, 255, nothing) +cv2.createTrackbar('B', 'image', 0, 255, nothing) + +# create switch for ON/OFF functionality +switch = '0 : OFF \n1 : ON' +cv2.createTrackbar(switch, 'image', 0, 1, nothing) +# 只有当 转换按钮 指向 ON 时 滑动条的滑动才有用,否则窗户 都是黑的。 + +while True: + + # get current positions of four trackbars + r = cv2.getTrackbarPos('R', 'image') + g = cv2.getTrackbarPos('G', 'image') + b = cv2.getTrackbarPos('B', 'image') + s = cv2.getTrackbarPos(switch, 'image') # 另外一个重要应用就是用作转换按钮 + + if s == 0: + img[:] = 0 + else: + img[:] = [b, g, r] + + cv2.imshow('image', img) + k = cv2.waitKey(1) # & 0xFF + if k == ord("q"): + break + +cv2.destroyAllWindows() diff --git "a/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.MakeBorder.py" "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.MakeBorder.py" new file mode 100755 index 00000000..7d512bf7 --- /dev/null +++ "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.MakeBorder.py" @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +# 为图像扩边,填充 +#如果你想在图像周围创建一个边框,就像相框一样 +# 经常在卷积运算或 0 填充时被用到。 + +BLUE = [255, 0, 0] + +img1 = cv2.imread('../data/opencv_logo.png') + +replicate = cv2.copyMakeBorder(img1, top=10, bottom=10, left=10, right=10, borderType=cv2.BORDER_REPLICATE) + +reflect = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_REFLECT) +reflect101 = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_REFLECT_101) +wrap = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_WRAP) + +constant = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=BLUE) # value 边界颜色 + +plt.subplot(231), plt.imshow(img1, 'gray'), plt.title('ORIGINAL') +plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE') +plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT') +plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101') +plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP') +plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT') + +plt.show() diff --git "a/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.img_roi.py" "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.img_roi.py" new file mode 100755 index 00000000..7c2c7782 --- /dev/null +++ "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.img_roi.py" @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np + +''' +例如我们 检测一副图像中 眼睛的位置 我们 先应该在图像中找到脸 再在脸的区域中找眼睛 +而不是 直接在一幅图像中搜索。这样会提高程序的准确性和性能。 +''' + +img=cv2.imread('../data/messi5.jpg') + +ball=img[280:340,330:390] +img[273:333,100:160]=ball #修改像素值 + + + +cv2.namedWindow("messi",0) +cv2.imshow("messi",img) +cv2.waitKey(0) diff --git "a/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.itemset.py" "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.itemset.py" new file mode 100755 index 00000000..fc2a4807 --- /dev/null +++ "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.itemset.py" @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np + +img = cv2.imread('../data/messi5.jpg') + +# +px = img[100, 100] +print(px) +blue = img[100, 100, 0] +print(blue) + +# +img[100, 100] = [255, 255, 255] +print(img[100, 100]) + +# 获取像素值及修改的更好方法。 +print(img.item(10, 10, 2)) +img.itemset((10, 10, 2), 100) +print(img.item(10, 10, 2)) diff --git "a/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.shape.py" "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.shape.py" new file mode 100755 index 00000000..63172f8b --- /dev/null +++ "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.shape.py" @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np + +img = cv2.imread('../data/messi5.jpg', 0) # gray +print(img.shape) + +img = cv2.imread('../data/messi5.jpg') +# print(img.shape) +rows, cols, ch = img.shape +print('行/高:', rows, '列/宽:', cols, '通道:', ch) + +print(img.size) +print(img.dtype)#uint8 +#注意 在 debug 时 img.dtype非常重要。因为在 OpenCV- Python 代码中经常出现数据类型的不一致。 diff --git a/ch9/9.split_color.py "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.split_color.py" similarity index 56% rename from ch9/9.split_color.py rename to "ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.split_color.py" index 1f4b0928..8a041eb8 100755 --- a/ch9/9.split_color.py +++ "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/9.split_color.py" @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- import cv2 import numpy as np +#拆分及合并图像通道 img=cv2.imread('../data/messi5.jpg') # -b,g,r=cv2.split(img) -img=cv2.merge(b,g,r) - +b,g,r=cv2.split(img)#比较耗时的操作,请使用numpy 索引 +img=cv2.merge((b,g,r)) # b=img[:,:,0] @@ -15,6 +15,9 @@ # 你可以 直接使用 Numpy 索引,这会更快。 img[:,:,2]=0 +#保存到文件,看下效果 +cv2.imwrite(filename='split_color2.jpg',img=img) + diff --git "a/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/split_color2.jpg" "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/split_color2.jpg" new file mode 100644 index 00000000..2e45583b Binary files /dev/null and "b/ch09-\345\233\276\345\203\217\347\232\204\345\237\272\347\241\200\346\223\215\344\275\234/split_color2.jpg" differ diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/10.addWeighted.py" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/10.addWeighted.py" new file mode 100755 index 00000000..acdaf74e --- /dev/null +++ "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/10.addWeighted.py" @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np + +# 学习图像上的算术运算 加法 减法 位运算等 + +# 你可以使用函数 cv2.add() 将两幅图像进行加法运算 当然也可以直接使 用 numpy , +# res=img1+img +# 两幅图像的大小 类型必须一致 ,或者第二个 图像可以使一个简单的标量值。 + + +x = np.uint8([250]) +y = np.uint8([10]) +print(cv2.add(x, y)) # 250+10 = 260 => 255 +# [[255]] +print(x + y) # 250+10=260%256=4 +# [4] + + +# 图像混合 +img1 = cv2.imread('../data/ml.png') +img2 = cv2.imread('../data/opencv_logo.jpg') + +dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0) # 第一幅图的权重是 0.7 第二幅图的权重是 0.3 + +cv2.imshow('dst', dst) +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/10.bitwise_and.py" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/10.bitwise_and.py" new file mode 100755 index 00000000..6dccdf76 --- /dev/null +++ "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/10.bitwise_and.py" @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +import cv2 +import numpy as np + +# 按位运算 + +# Load two images +img1 = cv2.imread('../data/messi5.jpg') +img2 = cv2.imread('../data/opencv_logo.png') + +# I want to put logo on top-left corner, So I create a ROI +rows, cols, channels = img2.shape +roi = img1[0:rows, 0:cols] + +# Now create a mask of logo and create its inverse mask also +img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) +ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) +mask_inv = cv2.bitwise_not(mask) + +# Now black-out the area of logo in ROI +img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv) # opencv 3.0 +#TODO error + +# Take only region of logo from logo image. +img2_fg = cv2.bitwise_and(img2, img2, mask=mask) + +# Put logo in ROI and modify the main image +dst = cv2.add(img1_bg, img2_fg) +img1[0:rows, 0:cols] = dst + +cv2.imshow('res', img1) +cv2.waitKey(0) +cv2.destroyAllWindows() + +# 左 的图像是我们创建的掩码。右 的是最终结果。 +# 为了帮助大 家理解,我把上面程序的中间结果也显示了出来 +# 特别是 img1_bg 和 img2_fg。 diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/crop0.jpg" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/crop0.jpg" new file mode 100644 index 00000000..58e0cc27 Binary files /dev/null and "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/crop0.jpg" differ diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/crop1.jpg" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/crop1.jpg" new file mode 100644 index 00000000..cfd3073a Binary files /dev/null and "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/crop1.jpg" differ diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/desk_bgimg.jpg" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/desk_bgimg.jpg" new file mode 100644 index 00000000..e2496986 Binary files /dev/null and "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/desk_bgimg.jpg" differ diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/poker-threshold.jpg" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/poker-threshold.jpg" new file mode 100644 index 00000000..315372ee Binary files /dev/null and "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/poker-threshold.jpg" differ diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/subtract1.jpg" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/subtract1.jpg" new file mode 100644 index 00000000..b9c60125 Binary files /dev/null and "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/subtract1.jpg" differ diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/subtract2.jpg" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/subtract2.jpg" new file mode 100644 index 00000000..986b6049 Binary files /dev/null and "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/subtract2.jpg" differ diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2171.py" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2171.py" new file mode 100644 index 00000000..be2781d9 --- /dev/null +++ "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2171.py" @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/21 上午10:48 +# @Author : play4fun +# @File : 图像相减1.py +# @Software: PyCharm + +""" +图像相减1.py: +""" + +import cv2 +import numpy as np + +# img1=cv2.imread('subtract1.jpg') +img1=cv2.imread('subtract1.jpg',0)#灰度图 +# img2=cv2.imread('subtract2.jpg') +img2=cv2.imread('subtract2.jpg',0) + +cv2.imshow('subtract1',img1) +cv2.imshow('subtract2',img2) + +# +st=img2-img1 +# st=img1-img2#相反 +cv2.imshow('after subtract',st) + +#效果好一点 +# ret,threshold=cv2.threshold(st,0, 127, cv2.THRESH_BINARY) +ret,threshold=cv2.threshold(st, 50,255, cv2.THRESH_BINARY) +cv2.imshow('after threshold', threshold) + + +cv2.waitKey(0) \ No newline at end of file diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2172.py" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2172.py" new file mode 100644 index 00000000..0fee7194 --- /dev/null +++ "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2172.py" @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/21 上午10:48 +# @Author : play4fun +# @File : 图像相减2.py +# @Software: PyCharm + +""" +图像相减2.py: +""" + +import cv2 +import numpy as np +import matplotlib.pyplot as plt + +# img1=cv2.imread('subtract1.jpg') +img1 = cv2.imread('subtract1.jpg', 0) # 灰度图 +# img2=cv2.imread('subtract2.jpg') +# img2 = cv2.imread('subtract2.jpg', 0) +img22 = cv2.imread('subtract2.jpg') +img2 = cv2.cvtColor(img22, cv2.COLOR_BGR2GRAY) + +# cv2.imshow('subtract1', img1) +# cv2.imshow('subtract2', img2) + +# +st = cv2.subtract(img2, img1) +# st = cv2.subtract(img1, img2)#相反 +st[st <= 5] = 0 # 把小于20的像素点设为0 + +# cv2.imshow('after subtract', st) + +''' +# 直方图,看看大部分像素集中在哪个区域 +# plt.plot(st) +pxs = st.ravel() +pxs=[x for x in pxs if x>5]#20,10 +plt.hist(pxs, 256, [0, 256]) +plt.show() +''' + +# 效果好一点 +# ret,threshold=cv2.threshold(st,0, 127, cv2.THRESH_BINARY) +ret, threshold = cv2.threshold(st, 50, 255, cv2.THRESH_BINARY) +# cv2.imshow('after threshold', threshold) + +image, contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + +areas = list() +for i, cnt in enumerate(contours): + + areas.append((i, cv2.contourArea(cnt))) + +# +a2 = sorted(areas, key=lambda d: d[1], reverse=True) + +''' +for i,are in a2: + if are <100: + continue + cv2.drawContours(img22, contours, i, (0, 0, 255), 3) + print(i,are) + + cv2.imshow('drawContours',img22) + cv2.waitKey(0) +# cv2.destroyAllWindows() +''' + +# TODO 截取原图,把长方形纠正 +cnt = contours[0] +print(cnt) +hull = cv2.convexHull(cnt) +epsilon = 0.001 * cv2.arcLength(hull, True) +simplified_cnt = cv2.approxPolyDP(hull, epsilon, True) + +epsilon = 0.1 * cv2.arcLength(cnt, True) +approx = cv2.approxPolyDP(cnt, epsilon, True) +print(approx) +cv2.drawContours(img22, [approx], 0, (255, 0, 0), 3) +cv2.imshow('approxPolyDP', img22) +cv2.waitKey(0) +exit(3) + +# findHomography(srcPoints, dstPoints, method=None, ransacReprojThreshold=None, mask=None, maxIters=None, confidence=None) +# H = cv2.findHomography(srcPoints=cnt.astype('single'), dstPoints=np.array([[[0., 0.]], [[2150., 0.]], [[2150., 2800.]], [[0., 2800.]]])) +# M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) + + +# now that we have our screen contour, we need to determine +# the top-left, top-right, bottom-right, and bottom-left +# points so that we can later warp the image -- we'll start +# by reshaping our contour to be our finals and initializing +# our output rectangle in top-left, top-right, bottom-right, +# and bottom-left order +pts = approx.reshape(4, 2) +rect = np.zeros((4, 2), dtype="float32") + +# the top-left point has the smallest sum whereas the +# bottom-right has the largest sum +s = pts.sum(axis=1) +rect[0] = pts[np.argmin(s)] +rect[2] = pts[np.argmax(s)] + +# compute the difference between the points -- the top-right +# will have the minumum difference and the bottom-left will +# have the maximum difference +diff = np.diff(pts, axis=1) +rect[1] = pts[np.argmin(diff)] +rect[3] = pts[np.argmax(diff)] + +# multiply the rectangle by the original ratio +ratio = image.shape[0] / 300.0 +rect *= ratio + + +# now that we have our rectangle of points, let's compute +# the width of our new image +(tl, tr, br, bl) = rect +widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2)) +widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2)) + +# ...and now for the height of our new image +heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2)) +heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2)) + +# take the maximum of the width and height values to reach +# our final dimensions +maxWidth = max(int(widthA), int(widthB)) +maxHeight = max(int(heightA), int(heightB)) + +# construct our destination points which will be used to +# map the screen to a top-down, "birds eye" view +dst = np.array([ + [0, 0], + [maxWidth - 1, 0], + [maxWidth - 1, maxHeight - 1], + [0, maxHeight - 1]], dtype="float32") + +# calculate the perspective transform matrix and warp +# the perspective to grab the screen +M = cv2.getPerspectiveTransform(rect, dst) +warp = cv2.warpPerspective(img22, M, (maxWidth, maxHeight)) + +# final_image = cv2.warpPerspective(img22, H, (2150, 2800)) + +cv2.imshow('final_image', warp) +cv2.waitKey(0) diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2173.py" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2173.py" new file mode 100644 index 00000000..cfede937 --- /dev/null +++ "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\2173.py" @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/21 上午10:57 +# @Author : play4fun +# @File : 图像相减3.py +# @Software: PyCharm + +""" +图像相减3.py: + +3张图片 + +""" +import cv2 + +def diff(img, img1): # returns just the difference of the two images + return cv2.absdiff(img, img1) + + +def diff_remove_bg(img0, img, img1): # removes the background but requires three images + d1 = diff(img0, img) + d2 = diff(img, img1) + return cv2.bitwise_and(d1, d2) + + +# img1=cv2.imread('subtract1.jpg') +img1 = cv2.imread('subtract1.jpg', 0) # 灰度图 +# img2=cv2.imread('subtract2.jpg') +img2 = cv2.imread('subtract2.jpg', 0) + +cv2.imshow('subtract1', img1) +cv2.imshow('subtract2', img2) + +# +st = diff_remove_bg(img2, img1,img2) + +cv2.imshow('after subtract', st) + +cv2.waitKey(0) \ No newline at end of file diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\217_camera.py" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\217_camera.py" new file mode 100644 index 00000000..432dbf4e --- /dev/null +++ "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\345\233\276\345\203\217\347\233\270\345\207\217_camera.py" @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/24 下午5:20 +# @Author : play4fun +# @File : 图像相减_camera.py +# @Software: PyCharm + +""" +图像相减_camera.py: +""" + +import cv2 +import numpy as np + +cap = cv2.VideoCapture(0) +ret = cap.set(3, 640) +ret = cap.set(4, 480) + +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +cap.read() +''' +cal=[cap.read()[1] for x in range(20)] + +#mean 直接的加减是不行的 +# bgimg0=np.mean(np.sum(cal)) +# bgimg0=np.average(cal) +# bgimg0=np.mean(cal) +nps1=sum(cal) +mean1=nps1/len(cal) +# mean1[mean1<0]=0 +# mean1[mean1>255]=255 +cv2.imshow('bgimg', mean1) +cv2.waitKey(0) +exit(3) +''' + +frame_no = 100 +# cap.set(1, frame_no)#第10帧 +ret, bgimg0 = cap.read() # 背景 +bgimg = cv2.cvtColor(bgimg0, cv2.COLOR_BGR2GRAY) +cv2.imshow('bgimg' + str(frame_no), bgimg0) +# cv2.imwrite('desk_bgimg.jpg',bgimg) + +while cap.isOpened(): + ret, frame = cap.read() # TODO 图像稳定 + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # + st = cv2.subtract(gray, bgimg) + # st = cv2.subtract(img1, img2)#相反 + # st[st <= 5] = 0 # 把小于20的像素点设为0 + + ret, threshold = cv2.threshold(st, 50, 255, cv2.THRESH_BINARY) + image, contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + print("contours size: ", len(contours)) + + # img = cv2.drawContours(st, contours, -1, (0, 0, 0), 13) + img = cv2.drawContours(st, contours, -1, (255, 255, 255), 3) + # + for cnt in contours: + area = cv2.contourArea(cnt) + if area < 200: + continue + + peri = cv2.arcLength(cnt, True) + approx = cv2.approxPolyDP(cnt, 0.04 * peri, True) + if len(approx) == 4: + (x, y, w, h) = cv2.boundingRect(approx) + cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2) + + # TODO 对比前几/十几帧,新放一张扑克,知道是那张 + # 等待图像稳定,不放牌后,再计算 + + + cv2.imshow("frame", frame) + cv2.imshow("subtract", img) + cv2.moveWindow("subtract", y=bgimg.shape[0], x=0) + cv2.imshow('threshold', threshold) + cv2.moveWindow("threshold", x=bgimg.shape[1], y=0) + + key = cv2.waitKey(delay=1) + if key == ord("q"): + break + elif key == ord("s"): + cv2.imwrite('poker-threshold.jpg', threshold) + +cv2.destroyAllWindows() diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\351\225\277\346\226\271\345\275\2421.py" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\351\225\277\346\226\271\345\275\2421.py" new file mode 100644 index 00000000..ee50d1bf --- /dev/null +++ "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\351\225\277\346\226\271\345\275\2421.py" @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/21 下午6:12 +# @Author : play4fun +# @File : 长方形1.py +# @Software: PyCharm + +""" +长方形1.py: +[[[183 199]] + [[ 69 214]] + [[ 97 390]] + [[210 373]]] + +""" +import cv2 +import numpy as np + +img22 = cv2.imread('subtract2.jpg') + +# src_pts = np.array([[8, 136], [415, 52], [420, 152], [14, 244]], dtype=np.float32) + +src_pts = np.array([[[97, 390], [210, 373], [183, 199], [69, 214]]], dtype=np.float32) + +dst_pts = np.array([[0, 0], [50, 0], [50, 100], [0, 100]], dtype=np.float32) + +M = cv2.getPerspectiveTransform(src_pts, dst_pts) +warp = cv2.warpPerspective(img22, M, (50, 100)) + +cv2.imshow('src', img22) +cv2.imshow('warp', warp) +cv2.waitKey(0) diff --git "a/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\351\225\277\346\226\271\345\275\2422.py" "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\351\225\277\346\226\271\345\275\2422.py" new file mode 100644 index 00000000..4fa6a4e6 --- /dev/null +++ "b/ch10-\345\233\276\345\203\217\344\270\212\347\232\204\347\256\227\346\234\257\350\277\220\347\256\227/\351\225\277\346\226\271\345\275\2422.py" @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/21 下午6:12 +# @Author : play4fun +# @File : 长方形1.py +# @Software: PyCharm + +""" +长方形1.py: + +https://stackoverflow.com/questions/42262198/4-point-persective-transform-failure +透视变换矩阵 + +[[[183 199]] + [[ 69 214]] + [[ 97 390]] + [[210 373]]] + +""" +import cv2 +import numpy as np + + +def get_euler_distance(pt1, pt2): + return ((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2) ** 0.5 + + +img22 = cv2.imread('subtract2.jpg') + +# src_pts = np.array([[8, 136], [415, 52], [420, 152], [14, 244]], dtype=np.float32) + +src_pts = np.array([[[97, 390], [210, 373], [183, 199], [69, 214]]], dtype=np.float32) +# src_pts = np.array([[ [210, 373], [183, 199], [69, 214],[97, 390]]], dtype=np.float32) + +width = get_euler_distance(src_pts[0][0], src_pts[0][1]) +height = get_euler_distance(src_pts[0][0], src_pts[0][3]) + +dst_pts = np.array([[0, 0], [width, 0], [width, height], [0, height]], dtype=np.float32) + +M = cv2.getPerspectiveTransform(src_pts, dst_pts) +warp = cv2.warpPerspective(img22, M, (int(width), int(height))) + +warp=cv2.flip(warp,flipCode=1) + +cv2.imshow('src', img22) +cv2.imshow('warp', warp) +# cv2.imwrite('crop0.jpg',warp) +cv2.waitKey(0) diff --git a/ch10/10.addWeighted.py b/ch10/10.addWeighted.py deleted file mode 100755 index 25eb2aa7..00000000 --- a/ch10/10.addWeighted.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np - -img1 = cv2.imread('../data/ml.png') -img2 = cv2.imread('../data/opencv_logo.jpg') - -dst = cv2.addWeighted(img1,0.7,img2,0.3,0)#opencv 3.0 - -cv2.imshow('dst',dst) -cv2.waitKey(0) -cv2.destroyAllWindows() \ No newline at end of file diff --git a/ch10/10.bitwise_and.py b/ch10/10.bitwise_and.py deleted file mode 100755 index 1acf0ce4..00000000 --- a/ch10/10.bitwise_and.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np - -# Load two images -img1 = cv2.imread('../data/messi5.jpg') -img2 = cv2.imread('../data/opencv_logo.png') - -# I want to put logo on top-left corner, So I create a ROI -rows,cols,channels = img2.shape -roi = img1[0:rows, 0:cols ] - -# Now create a mask of logo and create its inverse mask also -img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) -ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) -mask_inv = cv2.bitwise_not(mask) - -# Now black-out the area of logo in ROI -img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)#opencv 3.0 - -# Take only region of logo from logo image. -img2_fg = cv2.bitwise_and(img2,img2,mask = mask) - -# Put logo in ROI and modify the main image -dst = cv2.add(img1_bg,img2_fg) -img1[0:rows, 0:cols ] = dst - -cv2.imshow('res',img1) -cv2.waitKey(0) -cv2.destroyAllWindows() \ No newline at end of file diff --git a/ch100_Main_modules/README.md b/ch100_Main_modules/README.md new file mode 100644 index 00000000..d3ccbe70 --- /dev/null +++ b/ch100_Main_modules/README.md @@ -0,0 +1,30 @@ +Main modules: +- core. [Core functionality](http://docs.opencv.org/3.2.0/d0/de1/group__core.html) +- imgproc. [Image processing](http://docs.opencv.org/3.2.0/d7/dbd/group__imgproc.html) +- imgcodecs. [Image file reading and writing](http://docs.opencv.org/3.2.0/d4/da8/group__imgcodecs.html) +- videoio. [Video I/O](http://docs.opencv.org/3.2.0/dd/de7/group__videoio.html) +- highgui. [High-level GUI](http://docs.opencv.org/3.2.0/d7/dfc/group__highgui.html) +- video. [Video Analysis](http://docs.opencv.org/3.2.0/d7/de9/group__video.html) +- calib3d. [Camera Calibration and 3D Reconstruction](http://docs.opencv.org/3.2.0/d9/d0c/group__calib3d.html) +- features2d. [2D Features Framework](http://docs.opencv.org/3.2.0/da/d9b/group__features2d.html) +- objdetect. [Object Detection](http://docs.opencv.org/3.2.0/d5/d54/group__objdetect.html) +- ml. [Machine Learning](http://docs.opencv.org/3.2.0/dd/ded/group__ml.html) +- flann. [Clustering and Search in Multi-Dimensional Spaces](http://docs.opencv.org/3.2.0/dc/de5/group__flann.html) +- photo. [Computational Photography](http://docs.opencv.org/3.2.0/d1/d0d/group__photo.html) +- stitching. [Images stitching](http://docs.opencv.org/3.2.0/d1/d46/group__stitching.html) +- cudaarithm. [Operations on Matrices](http://docs.opencv.org/3.2.0/d5/d8e/group__cudaarithm.html) +- cudabgsegm. [Background Segmentation](http://docs.opencv.org/3.2.0/d6/d17/group__cudabgsegm.html) +- cudacodec. [Video Encoding/Decoding](http://docs.opencv.org/3.2.0/d0/d61/group__cudacodec.html) +- cudafeatures2d. [Feature Detection and Description](http://docs.opencv.org/3.2.0/d6/d1d/group__cudafeatures2d.html) +- cudafilters. [Image Filtering](http://docs.opencv.org/3.2.0/dc/d66/group__cudafilters.html) +- cudaimgproc. [Image Processing](http://docs.opencv.org/3.2.0/d0/d05/group__cudaimgproc.html) +- cudalegacy. [Legacy support](http://docs.opencv.org/3.2.0/d5/dc3/group__cudalegacy.html) +- cudaobjdetect. [Object Detection](http://docs.opencv.org/3.2.0/d9/d3f/group__cudaobjdetect.html) +- cudaoptflow. [Optical Flow](http://docs.opencv.org/3.2.0/d7/d3f/group__cudaoptflow.html) +- cudastereo. [Stereo Correspondence](http://docs.opencv.org/3.2.0/dd/d47/group__cudastereo.html) +- cudawarping. [Image Warping](http://docs.opencv.org/3.2.0/db/d29/group__cudawarping.html) +- cudev. [Device layer](http://docs.opencv.org/3.2.0/df/dfc/group__cudev.html) +- shape. [Shape Distance and Matching](http://docs.opencv.org/3.2.0/d1/d85/group__shape.html) +- superres. [Super Resolution](http://docs.opencv.org/3.2.0/d7/d0a/group__superres.html) +- videostab. [Video Stabilization](http://docs.opencv.org/3.2.0/d5/d50/group__videostab.html) +- viz. [3D Visualizer](http://docs.opencv.org/3.2.0/d1/d19/group__viz.html) \ No newline at end of file diff --git "a/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.getTickCount.py" "b/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.getTickCount.py" new file mode 100755 index 00000000..d4dde66f --- /dev/null +++ "b/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.getTickCount.py" @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np + +''' +使用 OpenCV 检测程序效率 +''' +img1 = cv2.imread('../data/ml.jpg') + +e1 = cv2.getTickCount() + +for i in range(5, 49, 2): + img1 = cv2.medianBlur(img1, i) + +e2 = cv2.getTickCount() +t = (e2 - e1) / cv2.getTickFrequency() # 时钟频率 或者 每秒钟的时钟数 +print(t) # 0.034773332 + +# Result I got is 0.521107655 seconds diff --git "a/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.ipython.py" "b/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.ipython.py" new file mode 100644 index 00000000..fa57c3f5 --- /dev/null +++ "b/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.ipython.py" @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 上午11:16 +# @Author : play4fun +# @File : 11.ipython.py +# @Software: PyCharm + +""" +11.ipython.py: +""" + +import cv2 +import numpy as np +''' + +In [10]: x = 5 +In [11]: %timeit y=x**2 +10000000 loops, best of 3: 73 ns per loop +In [12]: %timeit y=x*x +10000000 loops, best of 3: 58.3 ns per loop +In [15]: z = np.uint8([5]) +In [17]: %timeit y=z*z +1000000 loops, best of 3: 1.25 us per loop +In [19]: %timeit y=np.square(z) +1000000 loops, best of 3: 1.16 us per loop +#Python 的标量运算比 Nump 的标量运算 快。 +#对于仅包含一两个 元素的操作 Python 标量比 Numpy 的数组 快。 +#但是当数组稍微大一点时 Numpy 就会胜出了 +''' + +''' +In [35]: %timeit z = cv2.countNonZero(img) +100000 loops, best of 3: 15.8 us per loop +In [36]: %timeit z = np.count_nonzero(img) +1000 loops, best of 3: 370 us per loop +#OpenCV 的函数是 Numpy 函数的 25 倍 + +#一般情况下 OpenCV 的函数 比 Numpy 函数快。所以对于相同的操 +作最好使用 OpenCV 的函数。当然也有例外 尤其是当使用 Numpy 对 图 而 复制 操作时 +''' + +''' +有些技术和编程方法可以 我们最大的发挥 Python 和 Numpy 的威力。 +我们 仅仅提一下相关的,你可以超链接查找更多 细信息。 +我们 要说的最重要的一点是: + 先用简单的方式实现你的算法(结果正确最重要) + 当结果正确后 再使用上面的提到的方法找到程序的瓶 来优化它。 +1. 尽量避免使用循环 尤其双层三层循环 它们天生就是 常慢的。 +2. 算法中尽量使用向量操作 因为 Numpy 和 OpenCV 对向量操作了优化。 +3. 利用高速缓存一致性。 +4. 没有必要的话就不要复制数组。使用视图来代替复制。数组复制是非常浪费资源的。 +''' \ No newline at end of file diff --git "a/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.useOptimized.py" "b/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.useOptimized.py" new file mode 100755 index 00000000..921d8d17 --- /dev/null +++ "b/ch11-\347\250\213\345\272\217\346\200\247\350\203\275\346\243\200\346\265\213\345\217\212\344\274\230\345\214\226/11.useOptimized.py" @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np + +''' +OpenCV 中的默认优化 +在编译时 优化是 默认开启的。因此 OpenCV 的就是优化后的代码 +如果你把优化 关闭的 就只能执行低效的代码了。 +你可以使用函数 cv2.useOptimized() 来查看优化是否 开启了 +使用函数 cv2.setUseOptimized() 来开启优化 +''' +# check if optimization is enabled +""" +In [5]: cv2.useOptimized() +Out[5]: True +In [6]: %timeit res = cv2.medianBlur(img,49) +10 loops, best of 3: 34.9 ms per loop +# Disable it +In [7]: cv2.setUseOptimized(False) +In [8]: cv2.useOptimized() +Out[8]: False +In [9]: %timeit res = cv2.medianBlur(img,49) +#优化后中值滤波的速度是原来的两倍 +""" +print(cv2.useOptimized()) +cv2.setUseOptimized(False) +print(cv2.useOptimized()) \ No newline at end of file diff --git a/ch11/11.getTickCount.py b/ch11/11.getTickCount.py deleted file mode 100755 index 605ccbc0..00000000 --- a/ch11/11.getTickCount.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np - -img1 = cv2.imread('../data/ml.jpg') - -e1 = cv2.getTickCount() -for i in xrange(5,49,2): - img1 = cv2.medianBlur(img1,i) -e2 = cv2.getTickCount() -t = (e2 - e1)/cv2.getTickFrequency() -print t -# Result I got is 0.521107655 seconds \ No newline at end of file diff --git a/ch11/11.useOptimized.py b/ch11/11.useOptimized.py deleted file mode 100755 index 1e4788d0..00000000 --- a/ch11/11.useOptimized.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np -# check if optimization is enabled -""" -In [5]: cv2.useOptimized() -Out[5]: True -In [6]: %timeit res = cv2.medianBlur(img,49) -10 loops, best of 3: 34.9 ms per loop -# Disable it -In [7]: cv2.setUseOptimized(False) -In [8]: cv2.useOptimized() -Out[8]: False -In [9]: %timeit res = cv2.medianBlur(img,49) -""" \ No newline at end of file diff --git "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/1.cvtColor_flag.py" "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/1.cvtColor_flag.py" new file mode 100755 index 00000000..67198e9d --- /dev/null +++ "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/1.cvtColor_flag.py" @@ -0,0 +1,278 @@ +# -*- coding: utf-8 -*- +''' +在 OpenCV 中有超过150 种进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种 BGR↔Gray 和 BGR↔HSV。 +我们 用到的函数是 cv2.cvtColor(input_image flag) 其中 flag 就是转换类型。 +对于 BGR↔Gray 的转换, 我们 使用的 flag 就是 cv2.COLOR_BGR2GRAY。 同样对于 BGR↔HSV 的转换 我们用的 flag 就是 cv2.COLOR_BGR2HSV +''' + +import cv2 +from pprint import pprint + +flags = [i for i in dir(cv2) if i.startswith('COLOR_')] +pprint(flags) +#在 OpenCV 的 HSV 格式中 H 色彩/色度 的取值范围是 [0 179] +# S 饱和度 的取值范围 [0 255] +# V 亮度 的取值范围 [0 255]。 +# 但是不 同的 件使用的值可能不同。 +# 所以当你 拿 OpenCV 的 HSV 值与其他 件的 HSV 值 对比时 ,一定记得得归一化。 + +''' +['COLOR_BAYER_BG2BGR', + 'COLOR_BAYER_BG2BGR_EA', + 'COLOR_BAYER_BG2BGR_VNG', + 'COLOR_BAYER_BG2GRAY', + 'COLOR_BAYER_BG2RGB', + 'COLOR_BAYER_BG2RGB_EA', + 'COLOR_BAYER_BG2RGB_VNG', + 'COLOR_BAYER_GB2BGR', + 'COLOR_BAYER_GB2BGR_EA', + 'COLOR_BAYER_GB2BGR_VNG', + 'COLOR_BAYER_GB2GRAY', + 'COLOR_BAYER_GB2RGB', + 'COLOR_BAYER_GB2RGB_EA', + 'COLOR_BAYER_GB2RGB_VNG', + 'COLOR_BAYER_GR2BGR', + 'COLOR_BAYER_GR2BGR_EA', + 'COLOR_BAYER_GR2BGR_VNG', + 'COLOR_BAYER_GR2GRAY', + 'COLOR_BAYER_GR2RGB', + 'COLOR_BAYER_GR2RGB_EA', + 'COLOR_BAYER_GR2RGB_VNG', + 'COLOR_BAYER_RG2BGR', + 'COLOR_BAYER_RG2BGR_EA', + 'COLOR_BAYER_RG2BGR_VNG', + 'COLOR_BAYER_RG2GRAY', + 'COLOR_BAYER_RG2RGB', + 'COLOR_BAYER_RG2RGB_EA', + 'COLOR_BAYER_RG2RGB_VNG', + 'COLOR_BGR2BGR555', + 'COLOR_BGR2BGR565', + 'COLOR_BGR2BGRA', + 'COLOR_BGR2GRAY', + 'COLOR_BGR2HLS', + 'COLOR_BGR2HLS_FULL', + 'COLOR_BGR2HSV', + 'COLOR_BGR2HSV_FULL', + 'COLOR_BGR2LAB', + 'COLOR_BGR2LUV', + 'COLOR_BGR2Lab', + 'COLOR_BGR2Luv', + 'COLOR_BGR2RGB', + 'COLOR_BGR2RGBA', + 'COLOR_BGR2XYZ', + 'COLOR_BGR2YCR_CB', + 'COLOR_BGR2YCrCb', + 'COLOR_BGR2YUV', + 'COLOR_BGR2YUV_I420', + 'COLOR_BGR2YUV_IYUV', + 'COLOR_BGR2YUV_YV12', + 'COLOR_BGR5552BGR', + 'COLOR_BGR5552BGRA', + 'COLOR_BGR5552GRAY', + 'COLOR_BGR5552RGB', + 'COLOR_BGR5552RGBA', + 'COLOR_BGR5652BGR', + 'COLOR_BGR5652BGRA', + 'COLOR_BGR5652GRAY', + 'COLOR_BGR5652RGB', + 'COLOR_BGR5652RGBA', + 'COLOR_BGRA2BGR', + 'COLOR_BGRA2BGR555', + 'COLOR_BGRA2BGR565', + 'COLOR_BGRA2GRAY', + 'COLOR_BGRA2RGB', + 'COLOR_BGRA2RGBA', + 'COLOR_BGRA2YUV_I420', + 'COLOR_BGRA2YUV_IYUV', + 'COLOR_BGRA2YUV_YV12', + 'COLOR_BayerBG2BGR', + 'COLOR_BayerBG2BGR_EA', + 'COLOR_BayerBG2BGR_VNG', + 'COLOR_BayerBG2GRAY', + 'COLOR_BayerBG2RGB', + 'COLOR_BayerBG2RGB_EA', + 'COLOR_BayerBG2RGB_VNG', + 'COLOR_BayerGB2BGR', + 'COLOR_BayerGB2BGR_EA', + 'COLOR_BayerGB2BGR_VNG', + 'COLOR_BayerGB2GRAY', + 'COLOR_BayerGB2RGB', + 'COLOR_BayerGB2RGB_EA', + 'COLOR_BayerGB2RGB_VNG', + 'COLOR_BayerGR2BGR', + 'COLOR_BayerGR2BGR_EA', + 'COLOR_BayerGR2BGR_VNG', + 'COLOR_BayerGR2GRAY', + 'COLOR_BayerGR2RGB', + 'COLOR_BayerGR2RGB_EA', + 'COLOR_BayerGR2RGB_VNG', + 'COLOR_BayerRG2BGR', + 'COLOR_BayerRG2BGR_EA', + 'COLOR_BayerRG2BGR_VNG', + 'COLOR_BayerRG2GRAY', + 'COLOR_BayerRG2RGB', + 'COLOR_BayerRG2RGB_EA', + 'COLOR_BayerRG2RGB_VNG', + 'COLOR_COLORCVT_MAX', + 'COLOR_GRAY2BGR', + 'COLOR_GRAY2BGR555', + 'COLOR_GRAY2BGR565', + 'COLOR_GRAY2BGRA', + 'COLOR_GRAY2RGB', + 'COLOR_GRAY2RGBA', + 'COLOR_HLS2BGR', + 'COLOR_HLS2BGR_FULL', + 'COLOR_HLS2RGB', + 'COLOR_HLS2RGB_FULL', + 'COLOR_HSV2BGR', + 'COLOR_HSV2BGR_FULL', + 'COLOR_HSV2RGB', + 'COLOR_HSV2RGB_FULL', + 'COLOR_LAB2BGR', + 'COLOR_LAB2LBGR', + 'COLOR_LAB2LRGB', + 'COLOR_LAB2RGB', + 'COLOR_LBGR2LAB', + 'COLOR_LBGR2LUV', + 'COLOR_LBGR2Lab', + 'COLOR_LBGR2Luv', + 'COLOR_LRGB2LAB', + 'COLOR_LRGB2LUV', + 'COLOR_LRGB2Lab', + 'COLOR_LRGB2Luv', + 'COLOR_LUV2BGR', + 'COLOR_LUV2LBGR', + 'COLOR_LUV2LRGB', + 'COLOR_LUV2RGB', + 'COLOR_Lab2BGR', + 'COLOR_Lab2LBGR', + 'COLOR_Lab2LRGB', + 'COLOR_Lab2RGB', + 'COLOR_Luv2BGR', + 'COLOR_Luv2LBGR', + 'COLOR_Luv2LRGB', + 'COLOR_Luv2RGB', + 'COLOR_M_RGBA2RGBA', + 'COLOR_RGB2BGR', + 'COLOR_RGB2BGR555', + 'COLOR_RGB2BGR565', + 'COLOR_RGB2BGRA', + 'COLOR_RGB2GRAY', + 'COLOR_RGB2HLS', + 'COLOR_RGB2HLS_FULL', + 'COLOR_RGB2HSV', + 'COLOR_RGB2HSV_FULL', + 'COLOR_RGB2LAB', + 'COLOR_RGB2LUV', + 'COLOR_RGB2Lab', + 'COLOR_RGB2Luv', + 'COLOR_RGB2RGBA', + 'COLOR_RGB2XYZ', + 'COLOR_RGB2YCR_CB', + 'COLOR_RGB2YCrCb', + 'COLOR_RGB2YUV', + 'COLOR_RGB2YUV_I420', + 'COLOR_RGB2YUV_IYUV', + 'COLOR_RGB2YUV_YV12', + 'COLOR_RGBA2BGR', + 'COLOR_RGBA2BGR555', + 'COLOR_RGBA2BGR565', + 'COLOR_RGBA2BGRA', + 'COLOR_RGBA2GRAY', + 'COLOR_RGBA2M_RGBA', + 'COLOR_RGBA2RGB', + 'COLOR_RGBA2YUV_I420', + 'COLOR_RGBA2YUV_IYUV', + 'COLOR_RGBA2YUV_YV12', + 'COLOR_RGBA2mRGBA', + 'COLOR_XYZ2BGR', + 'COLOR_XYZ2RGB', + 'COLOR_YCR_CB2BGR', + 'COLOR_YCR_CB2RGB', + 'COLOR_YCrCb2BGR', + 'COLOR_YCrCb2RGB', + 'COLOR_YUV2BGR', + 'COLOR_YUV2BGRA_I420', + 'COLOR_YUV2BGRA_IYUV', + 'COLOR_YUV2BGRA_NV12', + 'COLOR_YUV2BGRA_NV21', + 'COLOR_YUV2BGRA_UYNV', + 'COLOR_YUV2BGRA_UYVY', + 'COLOR_YUV2BGRA_Y422', + 'COLOR_YUV2BGRA_YUNV', + 'COLOR_YUV2BGRA_YUY2', + 'COLOR_YUV2BGRA_YUYV', + 'COLOR_YUV2BGRA_YV12', + 'COLOR_YUV2BGRA_YVYU', + 'COLOR_YUV2BGR_I420', + 'COLOR_YUV2BGR_IYUV', + 'COLOR_YUV2BGR_NV12', + 'COLOR_YUV2BGR_NV21', + 'COLOR_YUV2BGR_UYNV', + 'COLOR_YUV2BGR_UYVY', + 'COLOR_YUV2BGR_Y422', + 'COLOR_YUV2BGR_YUNV', + 'COLOR_YUV2BGR_YUY2', + 'COLOR_YUV2BGR_YUYV', + 'COLOR_YUV2BGR_YV12', + 'COLOR_YUV2BGR_YVYU', + 'COLOR_YUV2GRAY_420', + 'COLOR_YUV2GRAY_I420', + 'COLOR_YUV2GRAY_IYUV', + 'COLOR_YUV2GRAY_NV12', + 'COLOR_YUV2GRAY_NV21', + 'COLOR_YUV2GRAY_UYNV', + 'COLOR_YUV2GRAY_UYVY', + 'COLOR_YUV2GRAY_Y422', + 'COLOR_YUV2GRAY_YUNV', + 'COLOR_YUV2GRAY_YUY2', + 'COLOR_YUV2GRAY_YUYV', + 'COLOR_YUV2GRAY_YV12', + 'COLOR_YUV2GRAY_YVYU', + 'COLOR_YUV2RGB', + 'COLOR_YUV2RGBA_I420', + 'COLOR_YUV2RGBA_IYUV', + 'COLOR_YUV2RGBA_NV12', + 'COLOR_YUV2RGBA_NV21', + 'COLOR_YUV2RGBA_UYNV', + 'COLOR_YUV2RGBA_UYVY', + 'COLOR_YUV2RGBA_Y422', + 'COLOR_YUV2RGBA_YUNV', + 'COLOR_YUV2RGBA_YUY2', + 'COLOR_YUV2RGBA_YUYV', + 'COLOR_YUV2RGBA_YV12', + 'COLOR_YUV2RGBA_YVYU', + 'COLOR_YUV2RGB_I420', + 'COLOR_YUV2RGB_IYUV', + 'COLOR_YUV2RGB_NV12', + 'COLOR_YUV2RGB_NV21', + 'COLOR_YUV2RGB_UYNV', + 'COLOR_YUV2RGB_UYVY', + 'COLOR_YUV2RGB_Y422', + 'COLOR_YUV2RGB_YUNV', + 'COLOR_YUV2RGB_YUY2', + 'COLOR_YUV2RGB_YUYV', + 'COLOR_YUV2RGB_YV12', + 'COLOR_YUV2RGB_YVYU', + 'COLOR_YUV420P2BGR', + 'COLOR_YUV420P2BGRA', + 'COLOR_YUV420P2GRAY', + 'COLOR_YUV420P2RGB', + 'COLOR_YUV420P2RGBA', + 'COLOR_YUV420SP2BGR', + 'COLOR_YUV420SP2BGRA', + 'COLOR_YUV420SP2GRAY', + 'COLOR_YUV420SP2RGB', + 'COLOR_YUV420SP2RGBA', + 'COLOR_YUV420p2BGR', + 'COLOR_YUV420p2BGRA', + 'COLOR_YUV420p2GRAY', + 'COLOR_YUV420p2RGB', + 'COLOR_YUV420p2RGBA', + 'COLOR_YUV420sp2BGR', + 'COLOR_YUV420sp2BGRA', + 'COLOR_YUV420sp2GRAY', + 'COLOR_YUV420sp2RGB', + 'COLOR_YUV420sp2RGBA', + 'COLOR_mRGBA2RGBA'] +''' diff --git "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.VideoCapture_blue_object.py" "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.VideoCapture_blue_object.py" deleted file mode 100755 index 428fe17e..00000000 --- "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.VideoCapture_blue_object.py" +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np - -cap = cv2.VideoCapture(0) -while (1): - # 获取每一帧 - ret, frame = cap.read() - # 换到 HSV - hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) - # 定蓝色的 值 - # lower_blue = np.array([110, 50, 50]) - # upper_blue = np.array([130, 255, 255]) - - #黑色 - lower_black = np.array([0, 0, 0]) - upper_black = np.array([180, 255, 30]) - - # 根据 值构建掩模 - # mask = cv2.inRange(hsv, lower_blue, upper_blue) - mask = cv2.inRange(hsv, lower_black, upper_black) - # 对原图像和掩模位 算 - res = cv2.bitwise_and(frame, frame, mask=mask) - # 显示图像 - cv2.imshow('frame', frame) - cv2.imshow('mask', mask) - cv2.imshow('res', res) - k = cv2.waitKey(5) & 0xFF - if k == 27: - break -# 关闭窗口 -cv2.destroyAllWindows() diff --git "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.cvtColor_flag.py" "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.cvtColor_flag.py" deleted file mode 100755 index 39eec385..00000000 --- "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.cvtColor_flag.py" +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 - -# flags=[i for in dir(cv2) if i startswith('COLOR_')] -# print flags \ No newline at end of file diff --git "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.find_object_hsv.py" "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.find_object_hsv.py" index 5f2aeb3d..1b85cb21 100755 --- "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.find_object_hsv.py" +++ "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/13.find_object_hsv.py" @@ -2,26 +2,28 @@ import cv2 import numpy as np -#wrong +# wrong # green=np.uint8([0,255,0]) # print green # hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV) # print hsv_green -#scn (the number of channels of the source), -#i.e. self.img.channels(), is neither 3 nor 4. +# scn (the number of channels of the source), +# i.e. self.img.channels(), is neither 3 nor 4. # -#depth (of the source), -#i.e. self.img.depth(), is neither CV_8U nor CV_32F. +# depth (of the source), +# i.e. self.img.depth(), is neither CV_8U nor CV_32F. # 所以不能用 [0,255,0] 而 用 [[[0,255,0]]] -#的三层括号应 分别对应于 cvArray cvMat IplImage -green=np.uint8([[[0,255,0]]]) -hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV) -print hsv_green -#[[[60 255 255]]] +# 的三层括号应 分别对应于 cvArray cvMat IplImage -black=np.uint8([[[0,0,0]]]) -hsv_black=cv2.cvtColor(black,cv2.COLOR_BGR2HSV) -print hsv_black -#[[[0 0 0]]] \ No newline at end of file + +green = np.uint8([[[0, 255, 0]]]) +hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV) +print(hsv_green) +# [[[60 255 255]]] + +black = np.uint8([[[0, 0, 0]]]) +hsv_black = cv2.cvtColor(black, cv2.COLOR_BGR2HSV) +print(hsv_black) +# [[[0 0 0]]] diff --git "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/2.\347\211\251\344\275\223\350\267\237\350\270\252_blue_object.py" "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/2.\347\211\251\344\275\223\350\267\237\350\270\252_blue_object.py" new file mode 100755 index 00000000..46f0a12c --- /dev/null +++ "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/2.\347\211\251\344\275\223\350\267\237\350\270\252_blue_object.py" @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np + +''' +物体跟踪 + +• 从视频中获取每一帧图像 +• 将图像转换到 HSV 空间 +• 设置 HSV 阈值到蓝色范围。 +• 获取蓝色物体 当然我们 可以做其他任何我们想做的事 +比如 在蓝色 物体周围画一个圈。 + + +当你学习了【轮廓】之后 你就会学到更多 相关知识 +那是你就可以找到物体的重心 并根据重心来跟踪物体 +仅仅在摄像头前挥挥手就可以画出同的图形,或者其他更有趣的事。 +''' + +cap = cv2.VideoCapture(0) +ret = cap.set(3, 640) +ret = cap.set(4, 480) + +# 定蓝色的阈值 +# lower = np.array([110, 50, 50]) +# upper = np.array([130, 255, 255]) + +#黄色-乒乓球 +lower = np.array([20, 100, 100]) +upper = np.array([30, 255, 255]) + +# 黑色 +# lower_black = np.array([0, 0, 0]) +# upper_black = np.array([180, 255, 30]) + +while True: + # 获取每一帧 + ret, frame = cap.read() + # 换到 HSV + hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) + + # 根据阈值构建掩模 + mask = cv2.inRange(hsv, lower, upper) + # mask = cv2.inRange(hsv, lower_black, upper_black) + # 对原图像和掩模位运算 + res = cv2.bitwise_and(frame, frame, mask=mask) + + # 显示图像 + cv2.imshow('frame', frame) + cv2.moveWindow('frame', x=0, y=0) # 原地 + cv2.imshow('mask', mask) + cv2.moveWindow('mask', x=frame.shape[1], y=0)#右边 + cv2.imshow('res', res) + cv2.moveWindow('res', y=frame.shape[0], x=0)#下边 + + k = cv2.waitKey(1) # & 0xFF + if k == ord('q'): + break +# 关闭窗口 +cap.release() +cv2.destroyAllWindows() diff --git "a/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/\344\271\222\344\271\223\347\220\203.JPG" "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/\344\271\222\344\271\223\347\220\203.JPG" new file mode 100644 index 00000000..354da4a9 Binary files /dev/null and "b/ch13-\351\242\234\350\211\262\347\251\272\351\227\264\350\275\254\346\215\242/\344\271\222\344\271\223\347\220\203.JPG" differ diff --git "a/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.1.\346\211\251\345\261\225\347\274\251\346\224\276resize.py" "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.1.\346\211\251\345\261\225\347\274\251\346\224\276resize.py" new file mode 100755 index 00000000..de646ea4 --- /dev/null +++ "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.1.\346\211\251\345\261\225\347\274\251\346\224\276resize.py" @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +''' +扩展缩放 + +在缩放时我们推荐使用 cv2.INTER_AREA +在扩展时我们推荐使用 v2.INTER_CUBIC 慢) 和 v2.INTER_LINEAR。 +默认情况下所有改变图像尺寸大小的操作使用的插值方法 是 cv2.INTER_LINEAR。 + +Resize(src, dst, interpolation=CV_INTER_LINEAR) +''' + +import cv2 +import numpy as np + +img = cv2.imread('../data/messi5.jpg') +# 下面的 None 本应 是 出图像的尺寸 但是因为后边我们设置了缩放因子 +# 因此这里为 None +res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) + +# OR +# 我们直接设置输出图像的尺寸 所以不用设置缩放因子 +# height, width = img.shape[:2] +# res = cv2.resize(img, (2 * width, 2 * height), interpolation=cv2.INTER_CUBIC) + +cv2.imshow('resize', res) +cv2.imshow('src img', img) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.2\345\271\263\347\247\273-2.py" "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.2\345\271\263\347\247\273-2.py" new file mode 100644 index 00000000..fb3b5227 --- /dev/null +++ "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.2\345\271\263\347\247\273-2.py" @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午12:31 +# @Author : play4fun +# @File : 14.2平移-2.py +# @Software: PyCharm + +""" +14.2平移-2.py: +http://docs.opencv.org/3.2.0/da/d6e/tutorial_py_geometric_transformations.html +函数 cv2.warpAffine() 的第三个参数的是 出图像的大小 ,它的格式 应 是图像的(宽,高) 。 +图像的宽对应的是列数, 高对应的是行数。 +""" + +import cv2 +import numpy as np + +img = cv2.imread('../data/messi5.jpg', 0) +rows, cols = img.shape + +M = np.float32([[1, 0, 100], [0, 1, 50]]) +dst = cv2.warpAffine(img, M, (cols, rows)) + +cv2.imshow('img', dst) +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.2\345\271\263\347\247\273.py" "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.2\345\271\263\347\247\273.py" new file mode 100644 index 00000000..68ee18ca --- /dev/null +++ "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.2\345\271\263\347\247\273.py" @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午12:21 +# @Author : play4fun +# @File : 平移.py +# @Software: PyCharm + +""" +平移.py:平移就是将对 换一个位置。如果你 沿 (x, y) 方向移动 +移动的距离 是 (tx,ty) +""" + +import cv2 +import numpy as np + +cap = cv2.VideoCapture(0) +ret = cap.set(3, 640) +ret = cap.set(4, 480) +while True: + # 获取每一帧 + ret, frame = cap.read() + + # 换到 HSV + hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) + # 定蓝色的阈值 + lower_blue = np.array([110, 50, 50]) + upper_blue = np.array([130, 255, 255]) + # 根据阈值构建掩模 + mask = cv2.inRange(hsv, lower_blue, upper_blue) + # 对原图像和掩模 进行位运算 + res = cv2.bitwise_and(frame, frame, mask=mask) + + # 显示图像 + cv2.imshow('frame', frame) + cv2.imshow('mask', mask) + cv2.imshow('res', res) + + k = cv2.waitKey(1) # & 0xFF + if k == ord('q'): + break +# 关 窗口 +cv2.destroyAllWindows() diff --git a/ch14/14.wrapAffine.py "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.wrapAffine.py" similarity index 89% rename from ch14/14.wrapAffine.py rename to "ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.wrapAffine.py" index ed65b195..82c49478 100755 --- a/ch14/14.wrapAffine.py +++ "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.wrapAffine.py" @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- import cv2 import numpy as np -#移动了100,50 个像素。 + +# 移动了100,50 个像素。 img = cv2.imread('../data/messi5.jpg', 0) rows, cols = img.shape + M = np.float32([[1, 0, 100], [0, 1, 50]]) dst = cv2.warpAffine(img, M, (cols, rows)) diff --git "a/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\344\273\277\345\260\204\345\217\230\346\215\242getAffineTransform.py" "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\344\273\277\345\260\204\345\217\230\346\215\242getAffineTransform.py" new file mode 100755 index 00000000..0225b3c4 --- /dev/null +++ "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\344\273\277\345\260\204\345\217\230\346\215\242getAffineTransform.py" @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +''' +仿射变换 +在仿射变换中 原图中所有的平行线在结果图像中同样平行。 +为了创建 这个矩阵,我们需要从原图像中找到三个点以及他们在 出图像中的位置。 +然后 cv2.getAffineTransform 会创建一个 2x3 的矩 最后 个矩 会 传给 函数 cv2.warpAffine。 +''' + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('drawing.png') +rows, cols, ch = img.shape +print(img.shape) + +pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) +pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) + +M = cv2.getAffineTransform(pts1, pts2) +dst = cv2.warpAffine(img, M, (cols, rows)) + +# plt.subplot(121, plt.imshow(img), plt.title('Input')) +# plt.subplot(122, plt.imshow(dst), plt.title('Output')) + +plt.figure(figsize=(8, 7), dpi=98) +p1 = plt.subplot(211) +p1.show(img) +p1.set_title('Input') + +p2 = plt.subplot(212) +p2.show(dst) +p2.set_title('Output') + +plt.show() diff --git "a/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\346\227\213\350\275\254getRotationMatrix2D.py" "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\346\227\213\350\275\254getRotationMatrix2D.py" new file mode 100755 index 00000000..9dda1825 --- /dev/null +++ "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\346\227\213\350\275\254getRotationMatrix2D.py" @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +# 旋转 +import cv2 +import numpy as np + +img = cv2.imread('../data/messi5.jpg', 0) +rows, cols = img.shape + +# 的第一个参数为旋转中心 第二个为旋转角度 +# 第三个为旋转后的缩放因子 +# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题 +M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.6) + +# 第三个参数是输出图像的尺寸中心 +dst = cv2.warpAffine(img, M, (2 * cols, 2 * rows)) + +cv2.imshow('img', dst) + +cv2.waitKey(0) # & 0xFF +cv2.destroyAllWindows() diff --git "a/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\351\200\217\350\247\206\345\217\230\346\215\242getPerspectiveTransform.py" "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\351\200\217\350\247\206\345\217\230\346\215\242getPerspectiveTransform.py" new file mode 100755 index 00000000..93756527 --- /dev/null +++ "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/14.\351\200\217\350\247\206\345\217\230\346\215\242getPerspectiveTransform.py" @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +''' +透视变换 +对于透视变换 ,我们需要一个 3x3 变换矩 。 +在变换前后直线 是直线。 +构建 个变换矩 你需要在输入图像上找 4 个点, 以及他们在输出图 像上对应的位置。 +四个点中的任意三个都不能共线。这个变换矩阵可以用函数 cv2.getPerspectiveTransform() 构建。 +然后把这个矩阵传给函数 cv2.warpPerspective。 + +''' + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/sudoku.jpg') +rows, cols, ch = img.shape + +pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) +pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) + +M = cv2.getPerspectiveTransform(pts1, pts2) +dst = cv2.warpPerspective(img, M, (300, 300)) + +plt.figure(figsize=(8, 7), dpi=98) +p1 = plt.subplot(211) +p1.show(img) +p1.set_title('Input') + +p2 = plt.subplot(212) +p2.show(dst) +p2.set_title('Output') + +plt.show() diff --git "a/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/drawing.png" "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/drawing.png" new file mode 100644 index 00000000..7a4af56e Binary files /dev/null and "b/ch14-\345\207\240\344\275\225\345\217\230\346\215\242/drawing.png" differ diff --git a/ch14/14.getAffineTransform.py b/ch14/14.getAffineTransform.py deleted file mode 100755 index 8baebe50..00000000 --- a/ch14/14.getAffineTransform.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -from matplotlib import pyplot as plt -img=cv2.imread('drawing.png') -rows,cols,ch=img.shape -pts1=np.float32([[50,50],[200,50],[50,200]]) -pts2=np.float32([[10,100],[200,50],[100,250]]) -M=cv2.getAffineTransform(pts1,pts2) -dst=cv2.warpAffine(img,M,(cols,rows)) -plt.subplot(121,plt.imshow(img),plt.title('Input')) -plt.subplot(121,plt.imshow(img),plt.title('Output')) -plt.show() \ No newline at end of file diff --git a/ch14/14.getPerspectiveTransform.py b/ch14/14.getPerspectiveTransform.py deleted file mode 100755 index 9403071e..00000000 --- a/ch14/14.getPerspectiveTransform.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -from matplotlib import pyplot as plt -img=cv2.imread('sudokusmall.png') -rows,cols,ch=img.shape - -pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) -pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]]) -M=cv2.getPerspectiveTransform(pts1,pts2) -dst=cv2.warpPerspective(img,M,(300,300)) - -plt.subplot(121,plt.imshow(img),plt.title('Input')) -plt.subplot(121,plt.imshow(img),plt.title('Output')) -plt.show() \ No newline at end of file diff --git a/ch14/14.getRotationMatrix2D.py b/ch14/14.getRotationMatrix2D.py deleted file mode 100755 index c8e24486..00000000 --- a/ch14/14.getRotationMatrix2D.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np - -img=cv2.imread('../data/messi5.jpg',0) -rows,cols=img.shape -#的第一个参数为旋 中心 第二个为旋 度 第三个为旋 后的缩放因子 -# 可以 置旋 中心 缩放因子 以及窗口大小来 止旋 后 出 界的 -M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6) -# 第三个参数是 出图像的尺寸中心 -dst=cv2.warpAffine(img,M,(2*cols,2*rows)) -while(1): - cv2.imshow('img',dst) - if cv2.waitKey(1)&0xFF==27: - break -cv2.destroyAllWindows() \ No newline at end of file diff --git a/ch14/14.resize.py b/ch14/14.resize.py deleted file mode 100755 index 636a14a2..00000000 --- a/ch14/14.resize.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- - - -import cv2 -import numpy as np -img=cv2.imread('../data/messi5.jpg') -# 下mian的 None 本应 是 出图像的尺寸 但是因为后 我们 置了缩放因子 -# 因此 为 None -res=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC) -#OR -# 呢 我们直接 置 出图像的尺寸 所以不用 置缩放因子 -height,width=img.shape[:2] -res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC) - -while(1): - cv2.imshow('resize',res) - cv2.imshow('src img',img) - if cv2.waitKey(1) & 0xFF == 27: - break -cv2.destroyAllWindows() \ No newline at end of file diff --git "a/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15-How-OTSU-work.py" "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15-How-OTSU-work.py" new file mode 100644 index 00000000..2b1988e2 --- /dev/null +++ "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15-How-OTSU-work.py" @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午1:27 +# @Author : play4fun +# @File : 15-How-OTSU-work.py +# @Software: PyCharm + +""" +15-How-OTSU-work.py: +""" + +import cv2 +import numpy as np + +img = cv2.imread('noisy2.png', 0) +blur = cv2.GaussianBlur(img, (5, 5), 0) +# find normalized_histogram, and its cumulative distribution function +# 算归一化直方图 +# CalcHist(image, accumulate=0, mask=NULL) + +hist = cv2.calcHist([blur], [0], None, [256], [0, 256]) +hist_norm = hist.ravel() / hist.max() +Q = hist_norm.cumsum() + +bins = np.arange(256) +fn_min = np.inf +thresh = -1 + +for i in range(1, 256): + p1, p2 = np.hsplit(hist_norm, [i]) # probabilities + q1, q2 = Q[i], Q[255] - Q[i] # cum sum of classes + b1, b2 = np.hsplit(bins, [i]) # weights + + # finding means and variances + m1, m2 = np.sum(p1 * b1) / q1, np.sum(p2 * b2) / q2 + v1, v2 = np.sum(((b1 - m1) ** 2) * p1) / q1, np.sum(((b2 - m2) ** 2) * p2) / q2 + + # calculates the minimization function + fn = v1 * q1 + v2 * q2 + if fn < fn_min: + fn_min = fn + thresh = i + +# find otsu's threshold value with OpenCV function +ret, otsu = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) + +print(thresh, ret) diff --git "a/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.THRESH_OTSU.py" "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.THRESH_OTSU.py" new file mode 100755 index 00000000..1761e882 --- /dev/null +++ "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.THRESH_OTSU.py" @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +''' +Otsu's 二值化 + +在第一 分中我们提到 retVal 当我们使用 Otsu 二值化时会用到它。 么它到底是什么呢 +在使用全局 值时 我们就是 便给了一个数来做 值 我们怎么知 我们 取的 个数的好坏呢? + 答案就是不停的尝 。 + 如果是一副双峰图像 ,简 单来 双峰图像是指图像直方图中存在两个峰 呢 ? + 我们岂不是应 在两个峰 之 的峰 一个值作为阈值 。 + 就是 Otsu 二值化 做的。 + 简单来说,就是对一副双峰图像自动根据其直方图计算出一个阈值。 + 对于非双峰图像 这 种方法 得到的结果可能会不理想 。 + + 这里 用到的函数 是 cv2.threshold() 但是 需要多传入一个参数 flag cv2.THRESH_OTSU。 + 这时 把 值 为 0。然后算法会找到最 优阈值 ,这 个最优 值就是 回值 retVal。 + 如果不使用 Otsu 二值化 返回的retVal 值与 设定的 阈值相等。 + +下 的例子中 输入图像是一副带有噪声的图像。 +第一种方法 我们 设127 为全局 阈值。 +第二种方法 我们直接使用 Otsu 二值化。 +第三种方法 我 们 先使用一个 5x5 的 高斯核 去噪 然后再使用 Otsu 二值化。 +看看噪音 去除对结果的影响有多大吧。 +''' + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('noisy2.png', 0) +# global thresholding +ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) +# Otsu's thresholding +ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) + +# Otsu's thresholding after Gaussian filtering +# 5,5 为 斯核的大小 0 为标准差 +blur = cv2.GaussianBlur(img, (5, 5), 0) +# 阀值一定为 0 +ret3, th3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) + +# plot all the images and their histograms +images = [img, 0, th1, + img, 0, th2, + blur, 0, th3] +titles = ['Original Noisy Image', 'Histogram', 'Global Thresholding (v=127)', + 'Original Noisy Image', 'Histogram', "Otsu's Thresholding", + 'Gaussian filtered Image', 'Histogram', "Otsu's Thresholding"] +# 使用了 pyplot 中画直方图的方法 plt.hist, +# 注意的是它的参数是一维数组 +# 所以使用了 numpy ravel 方法 将多维数组 换成一维 也可以使用 flatten 方法 +# ndarray.flat 1-D iterator over an array. +# ndarray.flatten 1-D array copy of the elements of an array in row-major order. + +for i in range(3): + plt.subplot(3, 3, i * 3 + 1), plt.imshow(images[i * 3], 'gray') + plt.title(titles[i * 3]), plt.xticks([]), plt.yticks([]) + plt.subplot(3, 3, i * 3 + 2), plt.hist(images[i * 3].ravel(), 256) + plt.title(titles[i * 3 + 1]), plt.xticks([]), plt.yticks([]) + plt.subplot(3, 3, i * 3 + 3), plt.imshow(images[i * 3 + 2], 'gray') + plt.title(titles[i * 3 + 2]), plt.xticks([]), plt.yticks([]) +plt.show() diff --git "a/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.adaptiveThreshold.py" "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.adaptiveThreshold.py" new file mode 100755 index 00000000..33eade58 --- /dev/null +++ "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.adaptiveThreshold.py" @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +''' +自适应阈值 + +Adaptive Method- 指定 算阈值的方法。 +– cv2.ADPTIVE_THRESH_MEAN_C 值取自相邻区域的平均值 +– cv2.ADPTIVE_THRESH_GAUSSIAN_C 值取值相邻区域 的加权和 ,权重为一个高斯窗口 +''' + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +# img = cv2.imread('dave.jpg', 0) +img = cv2.imread('../data/sudoku.jpg', 0) +# 中值滤波 +img = cv2.medianBlur(img, 5) +ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) + +# 11 为 Block size 邻域大小 用来计算阈值的区域大小 , +# 2 为 C值,常数, 阈值就等于的平均值或者加权平均值减去这个常数。 +th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2) +th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) + +titles = ['Original Image', 'Global Thresholding (v = 127)', + 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding'] +images = [img, th1, th2, th3] + +for i in range(4): + plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray') + plt.title(titles[i]) + plt.xticks([]), plt.yticks([]) + +plt.show() diff --git "a/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.\347\256\200\345\215\225\351\230\210\345\200\274threshold.py" "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.\347\256\200\345\215\225\351\230\210\345\200\274threshold.py" new file mode 100755 index 00000000..0652ce6c --- /dev/null +++ "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/15.\347\256\200\345\215\225\351\230\210\345\200\274threshold.py" @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +''' +简单阈值 +像素值高于阈值时 我们给这个像素 赋予一个新值, 可能是白色 , + 否则我们给它赋予另外一种颜色, 或是黑色 。 + 这个函数就是 cv2.threshhold()。 + 这个函数的第一个参数就是原图像 + 原图像应 是灰度图。 + 第二个参数就是用来对像素值进行分类的阈值。 + 第三个参数 就是当像素值高于, 有时是小于 阈值时应该被赋予的新的像素值。 + OpenCV 提供了多种不同的阈值方法 , 是由第四个参数来决定的。 + 些方法包括 +• cv2.THRESH_BINARY +• cv2.THRESH_BINARY_INV • cv2.THRESH_TRUNC +• cv2.THRESH_TOZERO +• cv2.THRESH_TOZERO_INV +''' + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('grey-gradient.jpg', 0) + +ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) +ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) +ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC) +ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO) +ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV) + +titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV'] +images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] + +for i in range(6): + plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray') + plt.title(titles[i]) + plt.xticks([]), plt.yticks([]) +plt.show() diff --git "a/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/grey-gradient.jpg" "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/grey-gradient.jpg" new file mode 100644 index 00000000..2275a110 Binary files /dev/null and "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/grey-gradient.jpg" differ diff --git "a/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/noisy2.png" "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/noisy2.png" new file mode 100644 index 00000000..e3d26595 Binary files /dev/null and "b/ch15-\345\233\276\345\203\217\351\230\210\345\200\274/noisy2.png" differ diff --git a/ch15/15.THRESH_OTSU.py b/ch15/15.THRESH_OTSU.py deleted file mode 100755 index ed90bb24..00000000 --- a/ch15/15.THRESH_OTSU.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img = cv2.imread('noisy2.png',0) -# global thresholding -ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) -# Otsu's thresholding -ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) -# Otsu's thresholding after Gaussian filtering -# 5,5 为 斯核的大小 0 为标准差 -blur = cv2.GaussianBlur(img,(5,5),0) -#阀值一定为 0 -ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) -# plot all the images and their histograms -images = [img, 0, th1, -img, 0, th2, -blur, 0, th3] -titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', -'Original Noisy Image','Histogram',"Otsu's Thresholding", -'Gaussian filtered Image','Histogram',"Otsu's Thresholding"] -#使用了 pyplot 中画直方图的方法 plt.hist, -#注意的是它的参数是一维数组 -# 所以使用了 numpy ravel 方法 将多维数组 换成一维 也可以使用 flatten 方法 -#ndarray.flat 1-D iterator over an array. -#ndarray.flatten 1-D array copy of the elements of an array in row-major order. -for i in xrange(3): - plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray') - plt.title(titles[i*3]), plt.xticks([]), plt.yticks([]) - plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256) - plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([]) - plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray') - plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([]) -plt.show() \ No newline at end of file diff --git a/ch15/15.adaptiveThreshold.py b/ch15/15.adaptiveThreshold.py deleted file mode 100755 index 851be1ac..00000000 --- a/ch15/15.adaptiveThreshold.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img = cv2.imread('dave.jpg',0) -# 中值滤波 -img = cv2.medianBlur(img,5) -ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) -#11 为 Block size, 2 为 C 值 -th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\ -cv2.THRESH_BINARY,11,2) -th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ -cv2.THRESH_BINARY,11,2) -titles = ['Original Image', 'Global Thresholding (v = 127)', -'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding'] -images = [img, th1, th2, th3] -for i in xrange(4): -plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') -plt.title(titles[i]) -plt.xticks([]),plt.yticks([]) -plt.show() \ No newline at end of file diff --git a/ch15/15.threshold.py b/ch15/15.threshold.py deleted file mode 100755 index dd1d30c0..00000000 --- a/ch15/15.threshold.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img=cv2.imread('gradient.png',0) -ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY) -ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) -ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC) -ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO) -ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) - -titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV'] -images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] - -for i in xrange(6): - plt.subplot(2,3,i+1),plt.imshow(images[i],'gray') - plt.title(titles[i]) - plt.xticks([]),plt.yticks([]) -plt.show() \ No newline at end of file diff --git a/ch15/__init__.py b/ch15/__init__.py deleted file mode 100755 index 40a96afc..00000000 --- a/ch15/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git "a/ch16-\345\233\276\345\203\217\345\271\263\350\241\241/16.filter2D.py" "b/ch16-\345\233\276\345\203\217\345\271\263\350\241\241/16.filter2D.py" new file mode 100755 index 00000000..b3d3a7c6 --- /dev/null +++ "b/ch16-\345\233\276\345\203\217\345\271\263\350\241\241/16.filter2D.py" @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +''' +2D 卷积 +OpenCV 提供的函数 cv.filter2D() 可以 我们对一幅图像 卷积操 +作。 +操作如下 将核放在图像的一个像素 A 上 求与核对应的图像上 25 5x5 个像素的和 在取平均数 用 个平均数替代像素 A 的值。 复以上操作直到 将图像的每一个像素值 更新一 。 +''' + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/opencv_logo.png') +kernel = np.ones((5, 5), np.float32) / 25 +# cv.Filter2D(src, dst, kernel, anchor=(-1, -1)) +# ddepth –desired depth of the destination image; +# if it is negative, it will be the same as src.depth(); +# the following combinations of src.depth() and ddepth are supported: +# src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F +# src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F +# src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F +# src.depth() = CV_64F, ddepth = -1/CV_64F +# when ddepth=-1, the output image will have the same depth as the source. + +dst = cv2.filter2D(img, -1, kernel) + +plt.subplot(121), plt.imshow(img), plt.title('Original') +plt.xticks([]), plt.yticks([]) +plt.subplot(122), plt.imshow(dst), plt.title('Averaging') +plt.xticks([]), plt.yticks([]) + +plt.show() diff --git "a/ch16-\345\233\276\345\203\217\345\271\263\350\241\241/\345\233\276\345\203\217\346\250\241\347\263\212-\345\271\263\345\235\207.py" "b/ch16-\345\233\276\345\203\217\345\271\263\350\241\241/\345\233\276\345\203\217\346\250\241\347\263\212-\345\271\263\345\235\207.py" new file mode 100644 index 00000000..7224e7c1 --- /dev/null +++ "b/ch16-\345\233\276\345\203\217\345\271\263\350\241\241/\345\233\276\345\203\217\346\250\241\347\263\212-\345\271\263\345\235\207.py" @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午1:35 +# @Author : play4fun +# @File : 图像模糊-平均.py +# @Software: PyCharm + +""" +图像模糊-平均.py: + 是由一个归一化卷积框完成的。他只是用卷积框 盖区域所有像素的平 均值来代替中心元素。可以使用函数 cv2.blur() 和 cv2.boxFilter() 来完 个任务。 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/opencv_logo.png') +# blur = cv2.blur(img, (5, 5)) + +''' +现在把卷积核换成 斯核 简单来 方框不变 将原来每个方框的值是 相等的 现在 的值是符合 斯分布的 方框中心的值最大 其余方框根据 离中心元素的 离 减 构成一个 斯小山包。原来的求平均数现在变成求 加权平均数 全就是方框 的值 。 +''' +# 0 是指根据窗口大小 (5,5) 来计算高斯函数标准差 +blur = cv2.GaussianBlur(img, (5, 5), 0) # 高斯模糊 + +''' + 名思义就是用与卷积框对应像素的中值来替代中心像素的值。 个滤波 器经常用来去 椒盐噪声。前 的滤波器 是用 算得到的一个新值来取代中 心像素的值 而中值滤波是用中心像素周围 也可以使他本 的值来取代他。 他能有效的去 噪声。卷积核的大小也应 是一个奇数。 +''' +median = cv2.medianBlur(img, 5) # 中值模糊 + +''' +函数 cv2.bilateralFilter() 能在保持边界清晰的情况下有效的去 噪 。 +但是 种操作与其他滤波器相比会比 慢。 +我们已经知 高斯滤波器是求 中心点 邻近区域像素的高斯加权平均值。 + 种 斯滤波器只考虑像素之间的空间关系 + 而不会考虑像素值之间的关系 ,像素的相似度 。 + 所以 种方法不会考 虑 一个像素是否位于边界。 + 因此边界也会被模糊掉 而 这正不是我们想要。 + +双边滤波在同时使用空 高斯权重和灰度值相似性 斯权 。 +空 高斯函数确保只有邻近区域的像素对中心点有影响 + 灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。 + 所以 种方法会确保边界不会被模糊掉 + 因为边界处的灰度值变化比较大。 +''' + +#16.4 双边滤波 +# cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace) +# d – Diameter of each pixel neighborhood that is used during filtering. # If it is non-positive, it is computed from sigmaSpace +# 9 域直径 两个 75 分别是空 斯函数标准差 灰度值相似性 斯函数标准差 +# blur = cv2.bilateralFilter(img, 9, 75, 75) + +plt.subplot(121), plt.imshow(img), plt.title('Original') +plt.xticks([]), plt.yticks([]) +plt.subplot(122), plt.imshow(blur), plt.title('Blurred') +plt.xticks([]), plt.yticks([]) +plt.show() diff --git a/ch16/16.filter2D.py b/ch16/16.filter2D.py deleted file mode 100755 index 25cde08a..00000000 --- a/ch16/16.filter2D.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -from matplotlib import pyplot as plt -img = cv2.imread('opencv_logo.png') -kernel = np.ones((5,5),np.float32)/25 -#cv.Filter2D(src, dst, kernel, anchor=(-1, -1)) -#ddepth –desired depth of the destination image; -#if it is negative, it will be the same as src.depth(); -#the following combinations of src.depth() and ddepth are supported: -#src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F -#src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F -#src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F -#src.depth() = CV_64F, ddepth = -1/CV_64F -#when ddepth=-1, the output image will have the same depth as the source. - -dst = cv2.filter2D(img,-1,kernel) -plt.subplot(121),plt.imshow(img),plt.title('Original') -plt.xticks([]), plt.yticks([]) -plt.subplot(122),plt.imshow(dst),plt.title('Averaging') -plt.xticks([]), plt.yticks([]) - -plt.show() \ No newline at end of file diff --git "a/ch17-\345\275\242\346\200\201\345\255\246zhuan\346\215\242/17.erode.py" "b/ch17-\345\275\242\346\200\201\345\255\246zhuan\346\215\242/17.erode.py" deleted file mode 100755 index f1a6bacf..00000000 --- "a/ch17-\345\275\242\346\200\201\345\255\246zhuan\346\215\242/17.erode.py" +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -img = cv2.imread('j.png',0) -kernel = np.ones((5,5),np.uint8) -erosion = cv2.erode(img,kernel,iterations = 1) diff --git "a/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.dilate.py" "b/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.dilate.py" new file mode 100755 index 00000000..d720c6ab --- /dev/null +++ "b/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.dilate.py" @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +''' +与腐 相反 与卷积核对应的原图像的像素值中只 有一个是 1 中心元 素的像素值就是 1。所以 个操作会增加图像中的白色区域 前景 。一般在去 噪声时先用腐 再用膨胀。因为腐 在去掉白噪声的同时 也会使前景对 变 小。所以我们再对他 膨胀。 时噪声已经 去 了 不会再回来了 但是 前景 在并会增加。膨胀也可以用来 接两个分开的物体。 +''' + +import cv2 +import numpy as np + +img = cv2.imread('j.png', 0) +cv2.imshow('j.png', img) +print(img.shape) + +kernel = np.ones((5, 5), np.uint8) +dilation = cv2.dilate(img, kernel, iterations=1) + +cv2.imshow('dilation', dilation) +cv2.moveWindow('dilation', x=img.shape[1], y=0) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.erode.py" "b/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.erode.py" new file mode 100755 index 00000000..f0337c14 --- /dev/null +++ "b/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.erode.py" @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +''' +两个基本的形态学操作是腐 和膨胀。他们 的变体构成了开运算 ,闭运算, 梯度等。 + +根据卷积核的大小 前景的所有像素 会 腐 掉 变为 0 ,所以前景物体会变小 整幅图像的白色区域会减少。 +对于去除白噪声很有用 也可以用来断开两个 在一块的物体等。 +''' + +import cv2 +import numpy as np + +img = cv2.imread('j.png', 0) +cv2.imshow('j.png', img) +print(img.shape) + +#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。 +kernel = np.ones((5, 5), np.uint8) +erosion = cv2.erode(img, kernel, iterations=1) + +cv2.imshow('erode', erosion) +cv2.moveWindow('erode', x=img.shape[1], y=0) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.\345\205\266\344\273\226.py" "b/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.\345\205\266\344\273\226.py" new file mode 100755 index 00000000..35183f63 --- /dev/null +++ "b/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/17.\345\205\266\344\273\226.py" @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + + +import cv2 +import numpy as np + +img = cv2.imread('j.png', 0) +cv2.imshow('j.png', img) +print(img.shape) + +#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。 +kernel = np.ones((5, 5), np.uint8) + +# 开运算:先腐蚀再膨胀就叫做开运算。就像我们上 介绍的 样, 它 用来,去噪声。 +opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) + +cv2.imshow('opening', opening) +cv2.moveWindow('opening', x=img.shape[1], y=0) + +# 闭运算 +# 先膨胀再腐 。它经常 用来填充前景物体中的小洞 或者前景物体上的小黑点。 +closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) +cv2.imshow('closing', closing) +cv2.moveWindow('closing', x=img.shape[1] * 2, y=0) + +# 形态学梯度 +# 其实就是一幅图像膨胀与腐 的差别。 +# 结果看上去就像前景物体的 廓。 +gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) +cv2.imshow('gradient', gradient) +cv2.moveWindow('gradient', x=img.shape[1] * 3, y=0) + +# 礼帽 +# 原始图像与 开运算之后得到的图像的差。 +tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) +cv2.imshow('tophat', tophat) +cv2.moveWindow('tophat', x=img.shape[1] * 4, y=0) + +# 黑帽 进行闭运算之后得到的图像与原始图像的差 +blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) +cv2.imshow('blackhat', blackhat) +cv2.moveWindow('blackhat', x=img.shape[1] * 5, y=0) + +cv2.waitKey(0) +cv2.destroyAllWindows() + +''' +结构化元素 +在前 的例子中我们使用 Numpy 构建了结构化元素 它是正方形的。 +但 有时我们 需要 构建一个椭圆形/圆形的核。 +为了实现 这种需求 ,提供了 OpenCV 函数 cv2.getStructuringElement()。 +你只 告诉 他 你需要的核的形状和大小。 +# Rectangular Kernel +>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) +array([[1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1]], dtype=uint8) +# Elliptical Kernel +>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) +array([[0, 0, 1, 0, 0], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [0, 0, 1, 0, 0]], dtype=uint8) +# Cross-shaped Kernel +>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) +array([[0, 0, 1, 0, 0], + [0, 0, 1, 0, 0], + [1, 1, 1, 1, 1], + [0, 0, 1, 0, 0], + [0, 0, 1, 0, 0]], dtype=uint8) +''' diff --git "a/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/j.png" "b/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/j.png" new file mode 100644 index 00000000..969294c7 Binary files /dev/null and "b/ch17-\345\275\242\346\200\201\345\255\246\350\275\254\346\215\242/j.png" differ diff --git "a/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/18.Sobel.py" "b/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/18.Sobel.py" new file mode 100755 index 00000000..d75b801e --- /dev/null +++ "b/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/18.Sobel.py" @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +''' +原理 +梯度简单来说就是求导。 +OpenCV 提供了三种不同的梯度滤波器 或者说是高通滤波器:Sobel, Scharr 和 Laplacian。我们会意义介绍他们。 +Sobel Scharr 其实就是求一阶或二阶导数。 +Scharr 是对 Sobel (使用小的卷积核求解 梯度角度时 )的优化。 +Laplacian 是求二阶导数。 + + +Sobel 算子是高斯平滑与微分操作的结合体 所以它的抗噪声能力很好。 + 你可以设定求导的方向 xorder 或 yorder 。 + 可以设定使用的卷积核的大 小 ksize 。 + 如果 ksize=-1 会使用 3x3 的 Scharr 滤波器 + 它的的效果 比 3x3 的 Sobel 滤波器好 而且 度相同 所以在使用 3x3 滤波器时应 尽 量 使用 Scharr 滤波器 。 + +Laplacian 算子 +拉普拉斯算子可以使用二阶导数的形式定义 ,可假设其离散实现类似于二阶Sobel 导数 +事实上 OpenCV 在 算拉普拉斯算子时直接 用 Sobel 算 子 +''' + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/sudoku.jpg', 0) +# cv2.CV_64F 出图像的深度 数据类型 可以使用 -1, 与原图像保持一致 np.uint8 +laplacian = cv2.Laplacian(img, cv2.CV_64F) +# 参数 1,0 为只在 x 方向求一 导数 最大可以求 2 导数。 +sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5) +# 参数 0,1 为只在 y 方向求一 导数 最大可以求 2 导数。 +sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5) + +plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray') +plt.title('Original'), plt.xticks([]), plt.yticks([]) + +plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap='gray') +plt.title('Laplacian'), plt.xticks([]), plt.yticks([]) + +plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap='gray') +plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) + +plt.subplot(2, 2, 4), plt.imshow(sobely, cmap='gray') +plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) + +plt.show() diff --git "a/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/19.Sobel.py" "b/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/19.Sobel.py" deleted file mode 100755 index f73aa51e..00000000 --- "a/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/19.Sobel.py" +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -from matplotlib import pyplot as plt -img=cv2.imread('dave.jpg',0) -#cv2.CV_64F 出图像的深度 数据类型 可以使用 -1, 与原图像保持一致 np.uint8 -laplacian=cv2.Laplacian(img,cv2.CV_64F) -# 参数 1,0 为只在 x 方向求一 导数 最大可以求 2 导数。 -sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5) -# 参数 0,1 为只在 y 方向求一 导数 最大可以求 2 导数。 -sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5) - - -plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray') -plt.title('Original'), plt.xticks([]), plt.yticks([]) - -plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray') -plt.title('Laplacian'), plt.xticks([]), plt.yticks([]) - -plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray') -plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) - -plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray') -plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) - -plt.show() \ No newline at end of file diff --git "a/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/\344\270\200\344\270\252\351\207\215\350\246\201\347\232\204\344\272\213.py" "b/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/\344\270\200\344\270\252\351\207\215\350\246\201\347\232\204\344\272\213.py" new file mode 100644 index 00000000..5e534cfc --- /dev/null +++ "b/ch18-\345\233\276\345\203\217\346\242\257\345\272\246/\344\270\200\344\270\252\351\207\215\350\246\201\347\232\204\344\272\213.py" @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午2:23 +# @Author : play4fun +# @File : 一个重要的事.py +# @Software: PyCharm + +""" +一个重要的事.py: +当我们可以 参 数 -1 来 定 出图像的深度 数据类型 与原图像保持一致 +但是我们在代 码中使用的却是 cv2.CV_64F。 是为什么呢 ? +想象一下一个从黑到白的边界的导数是整数,而一个从白到黑的边界点导数却是负数。 +如果原图像的深度是 np.int8 时 所有的负值 会 截断变成 0 + 换句话就是把边界丢失掉。 +所以如果 两种边界你 想检测到 +最好的的办法就是将输出的数据类型 设置的更高 + 比如 cv2.CV_16S cv2.CV_64F 等。 + 取绝对值然后再把它 回 到 cv2.CV_8U。 + 下 的示例演示了输出图片的深度不同造成的不同效果。 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/box.jpg', 0) + +# Output dtype = cv2.CV_8U +sobelx8u = cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize=5) +# Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8U +sobelx64f = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5) + +abs_sobel64f = np.absolute(sobelx64f) +sobel_8u = np.uint8(abs_sobel64f) + +plt.subplot(1, 3, 1), plt.imshow(img, cmap='gray') +plt.title('Original'), plt.xticks([]), plt.yticks([]) +plt.subplot(1, 3, 2), plt.imshow(sobelx8u, cmap='gray') +plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([]) +plt.subplot(1, 3, 3), plt.imshow(sobel_8u, cmap='gray') +plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([]) + +plt.show() diff --git "a/ch19-Canny-\350\276\271\347\274\230\346\243\200\346\265\213/19.Canny.py" "b/ch19-Canny-\350\276\271\347\274\230\346\243\200\346\265\213/19.Canny.py" deleted file mode 100755 index cc2cd86e..00000000 --- "a/ch19-Canny-\350\276\271\347\274\230\346\243\200\346\265\213/19.Canny.py" +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img = cv2.imread('../data/messi5.jpg',0) -edges = cv2.Canny(img,100,200) - -plt.subplot(121),plt.imshow(img,cmap = 'gray') -plt.title('Original Image'), plt.xticks([]), plt.yticks([]) - -plt.subplot(122),plt.imshow(edges,cmap = 'gray') -plt.title('Edge Image'), plt.xticks([]), plt.yticks([]) - -plt.show() \ No newline at end of file diff --git "a/ch19-Canny\350\276\271\347\274\230\346\243\200\346\265\213/19.Canny.py" "b/ch19-Canny\350\276\271\347\274\230\346\243\200\346\265\213/19.Canny.py" new file mode 100755 index 00000000..34d67482 --- /dev/null +++ "b/ch19-Canny\350\276\271\347\274\230\346\243\200\346\265\213/19.Canny.py" @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +''' +Canny 边缘检测是一种 常流 的 缘检测算法 是 John F.Canny 在 +1986 年提出的。它是一个有很多步构成的算法 +由于 缘检测很容易受到噪声影响 所以第一步是使用 5x5 的 斯滤波器 去 噪声 +对平滑后的图像使用 Sobel 算子 算水平方向和竖直方向的一 导数 图 像梯度 Gx 和 Gy +梯度的方向一般总是与边界垂直。 +梯度方向 归为四类: 垂直 水平 和 两个对角线。 +非极大值抑制 + +滞后阈值 +现在 确定 些 界才是真正的边界。 时我们 置两个阈值 minVal 和 maxVal。 +当图像的灰度梯度 于 maxVal 时 为是真的边界 +那些低于 minVal 的 界会 抛弃。 +如果介于两者之间的 就 看这个点是否与某个被确定为真正的边界点相连 +如果是就认为它也是边界点 如果不是 就抛弃。 + +OpenCV 中的 Canny 边界检测 +在 OpenCV 中只 需要 一个函数 cv2.Canny() 就可以完成以上几步。 + 我们看如何使用这个函数。 +第一个参数是输入图像。 +第二和第三 个分别是 minVal 和 maxVal。 +第三个参数 置用来计算图像梯度的 Sobel卷积核的大小 默认值为 3。 +最后一个参数是 L2gradient 它可以用来 设定 求梯度大小的方程。 +如果 为 True 就会使用我们上 提到 的方程 否则 使用方程 Edge−Gradient (G) = |G2x| + |G2y| 代替, 默认值为 False。 +''' +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/messi5.jpg',0) +edges = cv2.Canny(img, 100, 200) + +cv2.imshow('Edges',edges) +cv2.waitKey(0) + +# plt.subplot(121), plt.imshow(img, cmap='gray') +# plt.title('Original Image'), plt.xticks([]), plt.yticks([]) +# plt.subplot(122), plt.imshow(edges, cmap='gray') +# plt.title('Edge Image'), plt.xticks([]), plt.yticks([]) +# plt.show() diff --git "a/ch20-\345\233\276\345\203\217jin\345\255\227\345\241\224/20.Apple_orange.py" "b/ch20-\345\233\276\345\203\217jin\345\255\227\345\241\224/20.Apple_orange.py" deleted file mode 100755 index 6c110c70..00000000 --- "a/ch20-\345\233\276\345\203\217jin\345\255\227\345\241\224/20.Apple_orange.py" +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np,sys -A = cv2.imread('apple.jpg') -B = cv2.imread('orange.jpg') -# generate Gaussian pyramid for A -G = A.copy() -gpA = [G] -for i in xrange(6): - G = cv2.pyrDown(G) - gpA.append(G) -# generate Gaussian pyramid for B -G = B.copy() -gpB = [G] -for i in xrange(6): - G = cv2.pyrDown(G) - gpB.append(G) -# generate Laplacian Pyramid for A -lpA = [gpA[5]] -for i in xrange(5,0,-1): - GE = cv2.pyrUp(gpA[i]) - L = cv2.subtract(gpA[i-1],GE) - lpA.append(L) - -# generate Laplacian Pyramid for B -lpB = [gpB[5]] -for i in xrange(5,0,-1): - GE = cv2.pyrUp(gpB[i]) - L = cv2.subtract(gpB[i-1],GE) - lpB.append(L) -# Now add left and right halves of images in each level -#numpy.hstack(tup) -#Take a sequence of arrays and stack them horizontally -#to make a single array. -LS = [] -for la,lb in zip(lpA,lpB): - rows,cols,dpt = la.shape - ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:])) - LS.append(ls) -# now reconstruct -ls_ = LS[0] -for i in xrange(1,6): - ls_ = cv2.pyrUp(ls_) - ls_ = cv2.add(ls_, LS[i]) - -# image with direct connecting each half -real = np.hstack((A[:,:cols/2],B[:,cols/2:])) - -cv2.imwrite('Pyramid_blending2.jpg',ls_) -cv2.imwrite('Direct_blending.jpg',real) \ No newline at end of file diff --git "a/ch20-\345\233\276\345\203\217jin\345\255\227\345\241\224/__init__.py" "b/ch20-\345\233\276\345\203\217jin\345\255\227\345\241\224/__init__.py" deleted file mode 100755 index 40a96afc..00000000 --- "a/ch20-\345\233\276\345\203\217jin\345\255\227\345\241\224/__init__.py" +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git "a/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/20.Apple_orange.py" "b/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/20.Apple_orange.py" new file mode 100755 index 00000000..05b693fc --- /dev/null +++ "b/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/20.Apple_orange.py" @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +''' +图像 字塔的一个应用是图像 合。例如 在图像缝合中 你 将两幅 图叠在一 但是由于 接区域图像像素的不 续性 整幅图的效果看 来会 很差。 时图像 字塔就可以排上用场了 他可以帮你实现无缝 接。 的 一个经典案例就是将两个水果 合成一个 看看下图也 你就明白我在 什么 了。 + + +实现上 效果的步 如下 +1. 入两幅图像 苹果和句子 +2. 构建苹果和橘子的 斯 字塔 6 层 +3. 根据 斯 字塔 算拉普拉斯 字塔 +4. 在拉普拉斯的每一层 图像 合 苹果的左 与橘子的右 合 5. 根据 合后的图像 字塔 建原始图像。 +''' + +import cv2 +import numpy as np, sys + +A = cv2.imread('apple.jpg') +B = cv2.imread('orange.jpg') + +# generate Gaussian pyramid for A +G = A.copy() +gpA = [G] +for i in range(6): + G = cv2.pyrDown(G) + gpA.append(G) + +# generate Gaussian pyramid for B +G = B.copy() +gpB = [G] +for i in range(6): + G = cv2.pyrDown(G) + gpB.append(G) + +# generate Laplacian Pyramid for A +lpA = [gpA[5]] +for i in range(5, 0, -1): + GE = cv2.pyrUp(gpA[i]) + L = cv2.subtract(gpA[i - 1], GE)#TODO error + lpA.append(L) + #cv2.error: /Users/play/Temp/opencv/modules/core/src/arithm.cpp:659: error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function arithm_op + + +# generate Laplacian Pyramid for B +lpB = [gpB[5]] +for i in range(5, 0, -1): + GE = cv2.pyrUp(gpB[i]) + L = cv2.subtract(gpB[i - 1], GE) + lpB.append(L) + +# Now add left and right halves of images in each level +# numpy.hstack(tup) +# Take a sequence of arrays and stack them horizontally +# to make a single array. +LS = [] +for la, lb in zip(lpA, lpB): + rows, cols, dpt = la.shape + ls = np.hstack((la[:, 0:cols / 2], lb[:, cols / 2:])) + LS.append(ls) + +# now reconstruct +ls_ = LS[0] +for i in range(1, 6): + ls_ = cv2.pyrUp(ls_) + ls_ = cv2.add(ls_, LS[i]) + +# image with direct connecting each half +real = np.hstack((A[:, :cols / 2], B[:, cols / 2:])) + +cv2.imwrite('Pyramid_blending2.jpg', ls_) +cv2.imwrite('Direct_blending.jpg', real) diff --git "a/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/apple.jpg" "b/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/apple.jpg" new file mode 100644 index 00000000..cb73a398 Binary files /dev/null and "b/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/apple.jpg" differ diff --git "a/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/orange.jpg" "b/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/orange.jpg" new file mode 100644 index 00000000..5714df6d Binary files /dev/null and "b/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/orange.jpg" differ diff --git "a/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224.py" "b/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224.py" new file mode 100644 index 00000000..d6f07cc7 --- /dev/null +++ "b/ch20-\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224/\345\233\276\345\203\217\351\207\221\345\255\227\345\241\224.py" @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午3:06 +# @Author : play4fun +# @File : 图像金字塔.py +# @Software: PyCharm + +""" +图像金字塔.py: +一般情况下 我们 处理是一副具有固定分辨率的图像。 +但是有些情况下 我们 对同一图像的不同分 率的子图像 处理。 +比如 我们 在一幅图 像中查找某个目标 比如脸 我们不知 目标在图像中的尺寸大小。 + 这种情况下 ,我们 创建创建一组图像 , 这些图像是具有不同分 率的原始图像。 + 我们把这组图像叫做图像金字塔 + 简单来说 就是同一图像的不同分辨率的子图集合 。 + + 如果我们把最大的图像放在底部,最小的放在顶部 +看起来像一座金字塔, 故而得名:图像金字塔。 + 有两类图像金字塔: 高斯金字塔和拉普拉斯金字塔。 + +高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。 +图像中的每个像素值等于下一层图像中 5 个像素的 斯加权平均值。 +这样 操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。 +所以 这幅图像 的面积就变为原来图像面积的四分之一。 这称为 Octave。 +连续进行这样 的操作我们就会得到一个分辨率不断下降的图像金字塔。 +我们可以使用函数 cv2.pyrDown() 和 cv2.pyrUp() 构建图像金字塔。 + + +""" + +import cv2 +import numpy as np + +higher_reso = cv2.imread('../data/messi5.jpg') +# 函数 cv2.pyrDown() 从一个 分辨率大尺寸的图像向上构建一个金子塔 +# 尺寸变小 分辨率降低 。 +lower_reso = cv2.pyrDown(higher_reso) +cv2.imshow('lower_reso', lower_reso) + +# 从一个低分 率小尺寸的图像向下构建一个 子塔 尺 寸变大 但分 率不会增加 +higher_reso2 = cv2.pyrUp(lower_reso) +cv2.imshow('higher_reso2', higher_reso2) + +# 你 住的是是 higher_reso2 和 higher_reso 是不同的。因为一旦使 用 cv2.pyrDown() 图像的分辨率就会 低 ,信息就会 丢失 + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git a/ch200_Extra_modules/README.md b/ch200_Extra_modules/README.md new file mode 100644 index 00000000..27a6d80b --- /dev/null +++ b/ch200_Extra_modules/README.md @@ -0,0 +1,32 @@ +Extra modules: +- aruco. [ArUco Marker Detection](http://docs.opencv.org/3.2.0/d9/d6a/group__aruco.html) +- bgsegm. [Improved Background-Foreground Segmentation Methods](http://docs.opencv.org/3.2.0/d2/d55/group__bgsegm.html) +- bioinspired. [Biologically inspired vision models and derivated tools](http://docs.opencv.org/3.2.0/dd/deb/group__bioinspired.html) +- ccalib. [Custom Calibration Pattern for 3D reconstruction](http://docs.opencv.org/3.2.0/d3/ddc/group__ccalib.html) +- cnn_3dobj. [3D object recognition and pose estimation API](http://docs.opencv.org/3.2.0/d9/d02/group__cnn__3dobj.html) +- cvv. [GUI for Interactive Visual Debugging of Computer Vision Programs](http://docs.opencv.org/3.2.0/df/dff/group__cvv.html) +- datasets. [Framework for working with different datasets](http://docs.opencv.org/3.2.0/d8/d00/group__datasets.html) +- dnn. [Deep Neural Network module](http://docs.opencv.org/3.2.0/d6/d0f/group__dnn.html) +- dpm. [Deformable Part-based Models](http://docs.opencv.org/3.2.0/d9/d12/group__dpm.html) +- face. [Face Recognition](http://docs.opencv.org/3.2.0/db/d7c/group__face.html) +- freetype. [Drawing UTF-8 strings with freetype/harfbuzz](http://docs.opencv.org/3.2.0/d4/dfc/group__freetype.html) +- fuzzy. [Image processing based on fuzzy mathematics](http://docs.opencv.org/3.2.0/df/d5b/group__fuzzy.html) +- hdf. [Hierarchical Data Format I/O routines](http://docs.opencv.org/3.2.0/db/d77/group__hdf.html) +- line_descriptor. [Binary descriptors for lines extracted from an image](http://docs.opencv.org/3.2.0/dc/ddd/group__line__descriptor.html) +- matlab. [MATLAB Bridge](http://docs.opencv.org/3.2.0/df/d5d/group__matlab.html) +- optflow. [Optical Flow Algorithms](http://docs.opencv.org/3.2.0/d2/d84/group__optflow.html) +- phase_unwrapping. [Phase Unwrapping API](http://docs.opencv.org/3.2.0/df/d3a/group__phase__unwrapping.html) +- plot. [Plot function for Mat data](http://docs.opencv.org/3.2.0/db/dfe/group__plot.html) +- reg. [Image Registration](http://docs.opencv.org/3.2.0/db/d61/group__reg.html) +- rgbd. [RGB-Depth Processing](http://docs.opencv.org/3.2.0/d2/d3a/group__rgbd.html) +- saliency. [Saliency API](http://docs.opencv.org/3.2.0/d8/d65/group__saliency.html) +- sfm. [Structure From Motion](http://docs.opencv.org/3.2.0/d8/d8c/group__sfm.html) +- stereo. [Stereo Correspondance Algorithms](http://docs.opencv.org/3.2.0/dd/d86/group__stereo.html) +- structured_light. [Structured Light API](http://docs.opencv.org/3.2.0/d1/d90/group__structured__light.html) +- surface_matching. [Surface Matching](http://docs.opencv.org/3.2.0/d9/d25/group__surface__matching.html) +- text. [Scene Text Detection and Recognition](http://docs.opencv.org/3.2.0/d4/d61/group__text.html) +- tracking. [Tracking API](http://docs.opencv.org/3.2.0/d9/df8/group__tracking.html) +- xfeatures2d. [Extra 2D Features Framework](http://docs.opencv.org/3.2.0/d1/db4/group__xfeatures2d.html) +- ximgproc. [Extended Image Processing](http://docs.opencv.org/3.2.0/df/d2d/group__ximgproc.html) +- xobjdetect. [Extended object detection](http://docs.opencv.org/3.2.0/d4/d54/group__xobjdetect.html) +- xphoto. [Additional photo processing algorithms](http://docs.opencv.org/3.2.0/de/daa/group__xphoto.html) \ No newline at end of file diff --git a/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/acruco_write_print_img.py b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/acruco_write_print_img.py new file mode 100644 index 00000000..fe297ece --- /dev/null +++ b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/acruco_write_print_img.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/27 15:39 +# @Author : play4fun +# @File : acruco_write_print_img.py +# @Software: PyCharm + +""" +acruco_write_print_img.py: +""" + +import cv2 +import numpy as np + +num = 5 + +dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50) +# board = cv2.aruco.CharucoBoard_create(9, 9, .025, .0125, dictionary) +board = cv2.aruco.CharucoBoard_create(num, num, .025, .0125, dictionary) +# img = board.draw((200 * 9, 200 * 9)) +img = board.draw((200 * num, 200 * num)) + +# Dump the calibration board to a file +cv2.imwrite(f'charuco_{num}x{num}.png', img) +# 用打印机打印出来 +# 或放在平板电脑里 diff --git a/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/aruco_test1.py b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/aruco_test1.py new file mode 100644 index 00000000..90ede87e --- /dev/null +++ b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/aruco_test1.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/27 15:38 +# @Author : play4fun +# @File : aruco11.py +# @Software: PyCharm + +""" +aruco11.py: +""" + +import time, cv2 +# import cv2.aruco as A +import numpy as np + +dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50) +board = cv2.aruco.CharucoBoard_create(9, 9, .025, .0125, dictionary) +img = board.draw((200 * 9, 200 * 9)) +# cv2.imshow('board',img) +# cv2.waitKey(0) + +# Dump the calibration board to a file +# cv2.imwrite('charuco.png', img) +#用打印机打印出来 + +# Start capturing images for calibration +cap = cv2.VideoCapture(0) + +allCorners = [] +allIds = [] +decimator = 0 +for i in range(200): + + ret, frame = cap.read() + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + res = cv2.aruco.detectMarkers(gray, dictionary) + + if len(res[0]) > 0: + print('len(res[0]):',len(res[0])) + + res2 = cv2.aruco.interpolateCornersCharuco(res[0], res[1], gray, board) + if res2[1] is not None and res2[2] is not None and len(res2[1]) > 3 and decimator % 3 == 0: + allCorners.append(res2[1]) + allIds.append(res2[2]) + + cv2.aruco.drawDetectedMarkers(gray, res[0], res[1]) + + cv2.imshow('frame', gray) + key = cv2.waitKey(1) + if key == ord('q'): + break + decimator += 1 + +imsize = gray.shape + +# Calibration fails for lots of reasons. Release the video if we do +try: + cal = cv2.aruco.calibrateCameraCharuco(allCorners, allIds, board, imsize, None, None)#return retval, cameraMatrix, distCoeffs, rvecs, tvecs + print(cal) + retval, cameraMatrix, distCoeffs, rvecs, tvecs = cal#TODO 然后怎么办? + #TODO saveCameraParams + np.savez('calib.npz',mtx=cameraMatrix,dist=distCoeffs,rvecs=rvecs,tvecs=tvecs)#保存下载,下次不用校准了。 + # np.savez(outfile, x=x, y=y) +except: + cap.release() + +cap.release() +cv2.destroyAllWindows() + + +''' +retval, cameraMatrix, distCoeffs, rvecs, tvecs + +(40.66987516955983, array([[ 1.51699257e+03, 0.00000000e+00, 8.53629301e+02], + [ 0.00000000e+00, 4.50213990e+02, 7.76441549e+02], + [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]), array([[-0.11643503, -0.05270646, -0.02284758, 0.00088231, 0.01165172]]), [array([[ 0.6077912 ], + [-1.42834429], + [ 0.30243197]]), array([[ 0.6201644 ], + [-1.43661477], + [ 0.27205568]]), array([[ 0.62042201], + [-1.42419143], + [ 0.30919894]]), array([[ 0.6249636 ], + [-1.42055174], + [ 0.31823623]]), array([[ 0.51973251], + [-1.46121409], + [ 0.15266338]]), array([[ 0.62205772], + [-1.42727173], + [ 0.31075834]]), array([[ 2.02157844], + [-1.75270325], + [ 0.40542169]]), array([[ 2.01139176], + [-1.75092153], + [ 0.39164267]]), array([[ 2.02392487], + [-1.74645837], + [ 0.40174685]]), array([[ 2.01210339], + [-1.74882078], + [ 0.39050991]]), array([[ 0.87226228], + [-1.50949168], + [ 0.44230903]]), array([[ 0.87536626], + [-1.51319442], + [ 0.44075465]]), array([[ 0.88520206], + [-1.52335331], + [ 0.37352831]]), array([[ 0.07658779], + [ 0.58155207], + [ 1.24758432]])], [array([[ 0.10636704], + [-0.25196328], + [ 0.14970101]]), array([[ 0.10401605], + [-0.24774933], + [ 0.13947949]]), array([[ 0.10785286], + [-0.24809633], + [ 0.1447296 ]]), array([[ 0.10974635], + [-0.25258058], + [ 0.1578239 ]]), array([[ 0.07912493], + [-0.24214649], + [ 0.09198621]]), array([[ 0.10862882], + [-0.24818928], + [ 0.14389561]]), array([[ 0.1889342 ], + [-0.4414372 ], + [ 0.18697331]]), array([[ 0.18888891], + [-0.44753235], + [ 0.18719762]]), array([[ 0.18888745], + [-0.45388025], + [ 0.192372 ]]), array([[ 0.18836521], + [-0.43764759], + [ 0.18195927]]), array([[ 0.09873032], + [-0.44646521], + [ 0.09927093]]), array([[ 0.0997728 ], + [-0.43749325], + [ 0.09494866]]), array([[ 0.09320065], + [-0.44113935], + [ 0.08896787]]), array([[ 0.10408231], + [-0.5532671 ], + [ 0.17006767]])]) +''' \ No newline at end of file diff --git a/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/calib.npz b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/calib.npz new file mode 100644 index 00000000..3737fd35 Binary files /dev/null and b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/calib.npz differ diff --git a/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/calibrateCamera2.py b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/calibrateCamera2.py new file mode 100644 index 00000000..1f5a020c --- /dev/null +++ b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/calibrateCamera2.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/27 18:04 +# @Author : play4fun +# @File : calibrateCamera2.py +# @Software: PyCharm + +""" +calibrateCamera2.py: +""" + +import cv2 +import numpy as np + + +def draw_axis(img, charuco_corners, charuco_ids, board): + vecs = np.load("./calib.npz") # I already calibrated the camera + mtx, dist, _, _ = [vecs[i] for i in ('mtx', 'dist', 'rvecs', 'tvecs')] + ret, rvec, tvec = cv2.aruco.estimatePoseCharucoBoard( + charuco_corners, charuco_ids, board, mtx, dist) + if ret is not None and ret is True: + cv2.aruco.drawAxis(img, mtx, dist, rvec, tvec, 0.1) + + +def get_image(camera): + ret, img = camera.read() + return img + + +def make_grayscale(img): + ret = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + return ret + + +def main(): + camera = cv2.VideoCapture(0) + img = get_image(camera) + while True: + cv2.imshow('calibration', img) + cv2.waitKey(10) + img = get_image(camera) + gray = make_grayscale(img) + corners, ids, rejected = cv2.aruco.detectMarkers(gray, aruco_dict, + corners, ids) + cv2.aruco.drawDetectedMarkers(img, corners, ids) + if ids is not None and corners is not None \ + and len(ids) > 0 and len(ids) == len(corners): + diamond_corners, diamond_ids = \ + cv2.aruco.detectCharucoDiamond(img, corners, ids, + 0.05 / 0.03, cameraMatrix=mtx, + distCoeffs=dist) + cv2.aruco.drawDetectedDiamonds(img, diamond_corners, diamond_ids) + '''if diamond_ids is not None and len(diamond_ids) >= 4: + break''' + board = cv2.aruco.CharucoBoard_create(9, 6, 0.05, 0.03, + aruco_dict) + if diamond_corners is not None and diamond_ids is not None \ + and len(diamond_corners) == len(diamond_ids): + count, char_corners, char_ids = \ + cv2.aruco.interpolateCornersCharuco(diamond_corners, + diamond_ids, gray, + board) + if count >= 3: + draw_axis(img, char_corners, char_ids, board) + + +if __name__ == '__main__': + main() diff --git a/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco.png b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco.png new file mode 100644 index 00000000..51c47198 Binary files /dev/null and b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco.png differ diff --git a/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_3x3.png b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_3x3.png new file mode 100644 index 00000000..51c47198 Binary files /dev/null and b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_3x3.png differ diff --git a/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_5x5.png b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_5x5.png new file mode 100644 index 00000000..1b1149e0 Binary files /dev/null and b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_5x5.png differ diff --git a/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_9x9.png b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_9x9.png new file mode 100644 index 00000000..f3a2578e Binary files /dev/null and b/ch200_Extra_modules/aruco/Camera Calibration using ChArUco and Python/charuco_9x9.png differ diff --git a/ch200_Extra_modules/aruco/README.md b/ch200_Extra_modules/aruco/README.md new file mode 100644 index 00000000..cb073367 --- /dev/null +++ b/ch200_Extra_modules/aruco/README.md @@ -0,0 +1,19 @@ +http://docs.opencv.org/3.2.0/d9/d6d/tutorial_table_of_content_aruco.html + +ArUco标记是可用于相机姿态估计的二进制正方形基准标记。它们的主要优点在于它们的检测是稳健,快速和简单的。 + +aruco模块包括这些类型的标记的检测和用于姿势估计和相机校准的工具。 + +此外,ChArUco功能将ArUco标记与传统棋盘结合在一起,可以方便多用的角落检测。该模块还包括检测ChArUco角落的功能,并将其用于姿态估计和相机校准。 + +- [检测ArUco标记](http://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html) _兼容性:_ > OpenCV 3.0 _作者:_ Sergio Garrido 单个ArUco标记的基本检测和姿态估计。 +- [检测ArUco板](http://docs.opencv.org/3.2.0/db/da9/tutorial_aruco_board_detection.html) _兼容性:_ > OpenCV 3.0 _作者:_ Sergio Garrido 使用标记板进行检测和姿态估计 +- [检测ChArUco角](http://docs.opencv.org/3.2.0/df/d4a/tutorial_charuco_detection.html) _兼容性:_ > OpenCV 3.0 _作者:_ Sergio Garrido 基本检测使用ChArUco角 +- [钻石标记检测](http://docs.opencv.org/3.2.0/d5/d07/tutorial_charuco_diamond_detection.html) _兼容性:_ > OpenCV 3.0 _作者:_ Sergio Garrido 使用ChArUco标记进行检测和姿态估计 +- [使用ArUco和ChArUco进行校准](http://docs.opencv.org/3.2.0/da/d13/tutorial_aruco_calibration.html) _兼容性:_ > OpenCV 3.0 _作者:_ Sergio Garrido 使用ArUco和ChArUco板进行相机校准 +- [Aruco模块常见问题](http://docs.opencv.org/3.2.0/d1/dcb/tutorial_aruco_faq.html) _兼容性:_ > OpenCV 3.0 _作者:_ Sergio Garrido 关于aruco模块的一般和有用的问题 + + + + +http://docs.opencv.org/3.2.0/da/d13/tutorial_aruco_calibration.html \ No newline at end of file diff --git a/ch21-Contours/21-findContour.py b/ch21-Contours/21-findContour.py deleted file mode 100755 index afb9f8b8..00000000 --- a/ch21-Contours/21-findContour.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- - -import numpy as np -import cv2 - -# im = cv2.imread('test.jpg')# -# im = cv2.imread('../data/black-white-rect.png')#contour.jpg # -im = cv2.imread('../data/chessboard.jpeg') -imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) - -ret,thresh = cv2.threshold(imgray,0,25,0) -image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) -print "contours size: ", len(contours) -#img = cv2.drawContour(img, contours, -1, (0,255,0), 3) - -img = cv2.drawContours(image, contours, 3, (255,0,0), 3) - -cv2.namedWindow("contour.jpg",0) -cv2.imshow("contour.jpg",img) -cv2.waitKey(0) \ No newline at end of file diff --git a/ch21-Contours/21-moments.py b/ch21-Contours/21-moments.py deleted file mode 100755 index d06182a2..00000000 --- a/ch21-Contours/21-moments.py +++ /dev/null @@ -1,17 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-23 下午12:56 -""" - -import cv2 -import numpy as np -img = cv2.imread('../data/star.png',0) -ret,thresh = cv2.threshold(img,127,255,0) -# ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) -# contours,hierarchy = cv2.findContours(thresh, 1, 2) -image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) -# contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) -cnt = contours[0] -M = cv2.moments(cnt) -print M \ No newline at end of file diff --git "a/ch21-\350\275\256\345\273\223Contours/21-findContour.py" "b/ch21-\350\275\256\345\273\223Contours/21-findContour.py" new file mode 100755 index 00000000..a09f885f --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/21-findContour.py" @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +import numpy as np +import cv2 + +# im = cv2.imread('test.jpg')# +# im = cv2.imread('poker5hearts.jpg')# +# im = cv2.imread('../data/black-white-rect.png')#contour.jpg # +im = cv2.imread('../data/chessboard.jpeg') +imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) + +cv2.imshow("imgray", imgray) + +#需要注意的是cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图) +# 所以读取的图像要先转成灰度的,再转成二值图 +# ret, thresh = cv2.threshold(imgray, 0, 25, 0) +# ret, thresh = cv2.threshold(imgray, 0, 100, 0) +ret, thresh = cv2.threshold(src=imgray, thresh=127, maxval=255, type=cv2.THRESH_BINARY)#src, thresh, maxval, type + +cv2.imshow("thresh", thresh) +#轮廓提取模式 Contour_Retrieval_Mode +image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +print("contours size: ", len(contours)) + +img = cv2.drawContours(im, contours, -1, (0,255,0), 3) +# img = cv2.drawContours(im, contours, 3, (255, 0, 0), 3) + +cv2.namedWindow("contour.jpg", 0) +cv2.imshow("contour.jpg", img) +cv2.waitKey(0) diff --git "a/ch21-\350\275\256\345\273\223Contours/21-moments.py" "b/ch21-\350\275\256\345\273\223Contours/21-moments.py" new file mode 100755 index 00000000..89fb8d26 --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/21-moments.py" @@ -0,0 +1,61 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-23 下午12:56 +图像的矩可以帮助我们计算图像的质心, 面积等。 +""" + +import cv2 +import numpy as np + +from pprint import pprint + +img = cv2.imread('../data/star.png', 0) +# img = cv2.imread('../data/box.png', 0) + +ret, thresh = cv2.threshold(img, 127, 255, 0) +# ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) +# contours,hierarchy = cv2.findContours(thresh, 1, 2) +image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +# contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) + +print('contours len:', len(contours)) + +cnt = contours[0] # 第一个 +M = cv2.moments(cnt) + +# print(M) +pprint(M) # 好看一点 + +# 根据 这些矩的值 我们可以 计算出对象的重心 +cx = int(M['m10'] / M['m00']) +cy = int(M['m01'] / M['m00']) +print('重心:', cx, cy) + +# +area = cv2.contourArea(cnt) +print('面积:', area) + +# 第二参数可以用来指定对象的形状是闭合的 True 是打开的FALSE 一条曲线 。 +perimeter = cv2.arcLength(cnt, True) +print('周长:', perimeter) + +''' +将轮廓形状近似到另外一种由更少点组成的 廓形状 新 廓的点的数目 由我们 定的准确度来决定。 +使用的Douglas-Peucker算法 +为了帮助理解,假设我们 在一幅图像中查找一个矩形 +但是由于图像的 种种原因,我们不能得到一个完美的矩形 而是一个 坏形状 如下图所示 。 + +现在你就可以使用这个函数来近似 个形状 了。 + 这个函数的第二个参数叫 epsilon 它是从原始 廓到近似轮廓的最大距离。它是一个准确度参数。 + 选择一个好的 epsilon 对于得到满意结果非常重要 +''' +epsilon = 0.1*cv2.arcLength(cnt,True) +print('epsilon:',epsilon) + +approx = cv2.approxPolyDP(cnt,epsilon,True) +cv2.drawContours(image,[approx],0,(255,0,0),3) +cv2.imshow('approxPolyDP',image) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch21-\350\275\256\345\273\223Contours/21.1.2 \346\200\216\346\240\267\347\273\230\345\210\266\350\275\256\345\273\223.py" "b/ch21-\350\275\256\345\273\223Contours/21.1.2 \346\200\216\346\240\267\347\273\230\345\210\266\350\275\256\345\273\223.py" new file mode 100644 index 00000000..9dbb5560 --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/21.1.2 \346\200\216\346\240\267\347\273\230\345\210\266\350\275\256\345\273\223.py" @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午7:49 +# @Author : play4fun +# @File : 21.1.2 怎样绘制轮轮廓.py +# @Software: PyCharm + +""" +21.1.2 怎样绘制轮轮廓.py: +函数 cv2.drawContours() 可以 用来绘制 轮廓。它可以根据你提供 的 界点绘制任何形状。 +第一个参数是原始图像 +第二个参数是 轮廓 一 个 Python 列表。 +第三个参数是 轮廓的索引 +在绘制独立 轮廓是很有用 当 设置为 -1 时绘制所有轮廓 。 +接下来的参数是 轮廓的颜色和厚度等。 +""" + +import numpy as np +import cv2 + +im = cv2.imread('../data/cards.png') +imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) +cv2.imshow('imgray', imgray) + +ret, thresh = cv2.threshold(imgray, 244, 255, 0) + +img, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +print('len(contours', len(contours)) +contours2=[cnt for cnt in contours if cv2.contourArea(cnt)>200]#过滤太小的contour +print('过滤太小的contour', len(contours2)) + +# cv2.drawContours(imgray, contours, -1, (0, 0,255), 3) +cv2.drawContours(im, contours, -1, (255, 0, 0), 3) + +if len(contours) > 4: + # To gdraw an individual contour, say 4th contour: + # 绘制独立 轮廓 如第四个 轮廓 + cv2.drawContours(image=im, contours=contours, contourIdx=3, color=(0, 0, 255), thickness=3) + # drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None) + + # But most of the time, below method will be useful: + # 但是大多数时候 下 的方法更有用 + cnt = contours[4] + cv2.drawContours(im, [cnt], 0, (0, 255, 0), 3) + +# 第一个contour +print('contours[0]:', contours[0]) +cv2.drawContours(imgray, contours[0], 0, (0, 0, 255), 3) + +''' + 这个参数如果 设置为 cv2.CHAIN_APPROX_NONE + 所有的边界点 都 会被存储。但是我们真的需要那么多点吗 ? + 例如 当我们找的边界是一条直线时。你需要直线上所有的点来表示直线吗 ? + 不是的 我们只需要1 条直线 的两个端点而已。 + 就是 cv2.CHAIN_APPROX_SIMPLE 做的。它会 +将 轮廓上的冗余点 去掉, 压缩 轮廓 ,从而节省内存开支。 +''' + +cv2.imshow('drawContours', im) +cv2.imshow('drawContours-', imgray) +cv2.waitKey(0) diff --git "a/ch21-\350\275\256\345\273\223Contours/21.4 \350\275\256\345\273\223-\346\233\264\345\244\232\345\207\275\346\225\260.py" "b/ch21-\350\275\256\345\273\223Contours/21.4 \350\275\256\345\273\223-\346\233\264\345\244\232\345\207\275\346\225\260.py" new file mode 100644 index 00000000..c849404a --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/21.4 \350\275\256\345\273\223-\346\233\264\345\244\232\345\207\275\346\225\260.py" @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午8:47 +# @Author : play4fun +# @File : 21.4 轮廓-更多函数.py +# @Software: PyCharm + +""" +21.4 轮廓-更多函数.py: +""" + +import cv2 +import numpy as np + +''' +Point Polygon Test +求 图像中的一个点到一个对 廓的最短 离。如果点在 廓的外 回值为 。如果在 廓上 回值为 0。如果在 廓内 回值为正。 +下 我们以点 50 50 为例 + +dist = cv2.pointPolygonTest(cnt,(50,50),True) + +此函数的第三个参数是 measureDist。如果 置为 True 就会 算最 短 离。如果是 False 只会判断 个点与 廓之 的位置关系 回值为 +1 -1 0 + + 注意 如果你不 知 具体 离 建 你将第三个参数 为 False 这样速度会提 2 到 3 倍。 +''' diff --git "a/ch21-\350\275\256\345\273\223Contours/21.4.3-\345\275\242\347\212\266\345\214\271\351\205\215.py" "b/ch21-\350\275\256\345\273\223Contours/21.4.3-\345\275\242\347\212\266\345\214\271\351\205\215.py" new file mode 100644 index 00000000..0c9fb676 --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/21.4.3-\345\275\242\347\212\266\345\214\271\351\205\215.py" @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午9:30 +# @Author : play4fun +# @File : 21.4.3-形状匹配.py +# @Software: PyCharm + +""" +21.4.3-形状匹配.py: +函数 cv2.matchShape() 可以帮我们比 两个形状或 廓的相似度。 +如果返回值越小, 匹配越好。它是根据 Hu 矩来计算的。文档中对不同的方法有解释。 + +""" + +import cv2 +import numpy as np + +img1 = cv2.imread('star.jpg', 0) +img2 = cv2.imread('star2.jpg', 0) + +ret, thresh = cv2.threshold(img1, 127, 255, 0) +ret, thresh2 = cv2.threshold(img2, 127, 255, 0) + +image,contours, hierarchy = cv2.findContours(thresh, 2, 1) +cnt1 = contours[0] +image,contours, hierarchy = cv2.findContours(thresh2, 2, 1) +cnt2 = contours[0] + +ret = cv2.matchShapes(cnt1, cnt2, 1, 0.0) +print(ret) + +#Hu 矩是归一化中心矩的线性组合 +# 之所以 样做是为了能够获取 代表图像的某个特征的矩函数 +# 这些矩函数对某些变化如缩放 旋转, 镜像映射 ( 除了 h1) 具有不变形。 \ No newline at end of file diff --git "a/ch21-\350\275\256\345\273\223Contours/contour.jpg" "b/ch21-\350\275\256\345\273\223Contours/contour.jpg" new file mode 100644 index 00000000..20254d7a Binary files /dev/null and "b/ch21-\350\275\256\345\273\223Contours/contour.jpg" differ diff --git "a/ch21-\350\275\256\345\273\223Contours/draw\346\234\200\345\244\247\347\232\204\350\275\256\345\273\223.py" "b/ch21-\350\275\256\345\273\223Contours/draw\346\234\200\345\244\247\347\232\204\350\275\256\345\273\223.py" new file mode 100644 index 00000000..8c2503e9 --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/draw\346\234\200\345\244\247\347\232\204\350\275\256\345\273\223.py" @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/21 下午4:11 +# @Author : play4fun +# @File : draw最大的轮廓.py +# @Software: PyCharm + +""" +draw最大的轮廓.py: +""" + +import cv2 +import numpy as np + +org = cv2.imread('../data/cards.png') + +imgray = cv2.cvtColor(org, cv2.COLOR_BGR2GRAY) +cv2.imshow('imgray', imgray) + +# 白色背景 +ret, threshold = cv2.threshold(imgray, 244, 255, cv2.THRESH_BINARY_INV) # 把黑白颜色反转 +cv2.imshow('after threshold', threshold) + +image, contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + +areas = list() +for i, cnt in enumerate(contours): + areas.append((i, cv2.contourArea(cnt)))#面积大小 + +# +a2 = sorted(areas, key=lambda d: d[1], reverse=True)#按面积大小,从大到小排序 + +cv2.waitKey(0)#要先按一下键盘 +for i, are in a2: + if are < 150: + continue + img22 = org.copy()#逐个contour 显示 + cv2.drawContours(img22, contours, i, (0, 0, 255), 3) + print(i, are) + + cv2.imshow('drawContours', img22) + cv2.moveWindow('drawContours', x=img22.shape[1], y=0) # 右边 + k = cv2.waitKey(500) + if k == ord('q'): + break + +# 获取最大或某个contour,剪切 +idx = a2[1][0] +mask = np.zeros_like(org) # Create mask where white is what we want, black otherwise +cv2.drawContours(mask, contours, idx, (0, 255, 0), -1) # Draw filled contour in mask +out = np.zeros_like(org) # Extract out the object and place into output image +out[mask == 255] = org[mask == 255] +cv2.imwrite('out_contour.jpg', out) + +# roi方法 +idx = a2[4][0] +x, y, w, h = cv2.boundingRect(contours[idx]) +roi = org[y:y + h, x:x + w] +cv2.imwrite('out_contour-roi4.jpg', roi) + +cv2.destroyAllWindows() diff --git "a/ch21-\350\275\256\345\273\223Contours/findContours2.py" "b/ch21-\350\275\256\345\273\223Contours/findContours2.py" new file mode 100644 index 00000000..4701e4fa --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/findContours2.py" @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/5 下午5:33 +# @Author : play4fun +# @File : findContours2.py +# @Software: PyCharm + +""" +findContours2.py: +http://blog.csdn.net/sunny2038/article/details/12889059 +""" + +import cv2 + +img = cv2.imread('contour.jpg') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) + +cv2.imshow("thresh", binary) + +# contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +image, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +print("contours size: ", len(contours)) + +cv2.drawContours(img, contours, -1, (0, 0, 255), 3) + +cv2.imshow("img", img) +cv2.waitKey(0) diff --git "a/ch21-\350\275\256\345\273\223Contours/minAreaRect-\346\227\213\350\275\254\347\237\251\345\275\242.py" "b/ch21-\350\275\256\345\273\223Contours/minAreaRect-\346\227\213\350\275\254\347\237\251\345\275\242.py" new file mode 100644 index 00000000..23704f5d --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/minAreaRect-\346\227\213\350\275\254\347\237\251\345\275\242.py" @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/27 12:33 +# @Author : play4fun +# @File : minAreaRect-旋转矩形.py +# @Software: PyCharm + +""" +minAreaRect-旋转矩形.py: +""" + +import cv2 +import numpy as np + +img = cv2.imread('../data/lightning.png') +imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + +image, contours, hierarchy = cv2.findContours(imgray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 100] +print('len(contours)', len(contours)) +cnt = contours[0] + +#方向是物体定向的角度 +(x, y), (MA, ma), angle = cv2.fitEllipse(cnt) +print((x, y), (MA, ma), angle) + +rect = cv2.minAreaRect(cnt) +box = cv2.boxPoints(rect) +box = np.int0(box) +img = cv2.drawContours(img, [box], 0, (0, 0, 255), 2) + +cv2.imshow('fd', img) +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch21-\350\275\256\345\273\223Contours/out_contour-roi.jpg" "b/ch21-\350\275\256\345\273\223Contours/out_contour-roi.jpg" new file mode 100644 index 00000000..c6680bcb Binary files /dev/null and "b/ch21-\350\275\256\345\273\223Contours/out_contour-roi.jpg" differ diff --git "a/ch21-\350\275\256\345\273\223Contours/out_contour-roi0.jpg" "b/ch21-\350\275\256\345\273\223Contours/out_contour-roi0.jpg" new file mode 100644 index 00000000..1048a401 Binary files /dev/null and "b/ch21-\350\275\256\345\273\223Contours/out_contour-roi0.jpg" differ diff --git "a/ch21-\350\275\256\345\273\223Contours/out_contour-roi4.jpg" "b/ch21-\350\275\256\345\273\223Contours/out_contour-roi4.jpg" new file mode 100644 index 00000000..4044451f Binary files /dev/null and "b/ch21-\350\275\256\345\273\223Contours/out_contour-roi4.jpg" differ diff --git "a/ch21-\350\275\256\345\273\223Contours/out_contour.jpg" "b/ch21-\350\275\256\345\273\223Contours/out_contour.jpg" new file mode 100644 index 00000000..7b75c272 Binary files /dev/null and "b/ch21-\350\275\256\345\273\223Contours/out_contour.jpg" differ diff --git "a/ch21-\350\275\256\345\273\223Contours/poker5hearts.jpg" "b/ch21-\350\275\256\345\273\223Contours/poker5hearts.jpg" new file mode 100644 index 00000000..2a538efc Binary files /dev/null and "b/ch21-\350\275\256\345\273\223Contours/poker5hearts.jpg" differ diff --git "a/ch21-\350\275\256\345\273\223Contours/star.jpg" "b/ch21-\350\275\256\345\273\223Contours/star.jpg" new file mode 100644 index 00000000..3a5a98b9 Binary files /dev/null and "b/ch21-\350\275\256\345\273\223Contours/star.jpg" differ diff --git "a/ch21-\350\275\256\345\273\223Contours/star2.jpg" "b/ch21-\350\275\256\345\273\223Contours/star2.jpg" new file mode 100644 index 00000000..72b6f76c Binary files /dev/null and "b/ch21-\350\275\256\345\273\223Contours/star2.jpg" differ diff --git "a/ch21-\350\275\256\345\273\223Contours/\344\273\200\344\271\210\346\230\257\350\275\256\345\273\223.txt" "b/ch21-\350\275\256\345\273\223Contours/\344\273\200\344\271\210\346\230\257\350\275\256\345\273\223.txt" new file mode 100644 index 00000000..476f3829 --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/\344\273\200\344\271\210\346\230\257\350\275\256\345\273\223.txt" @@ -0,0 +1,24 @@ +什么是轮廓 + + 轮廓可以简单 为成将连续的点 着 界 在一 的曲线 具有相同 +的 色或者灰度。 轮廓在形状分析和物体的检测和 别中很有用。 +• 为了更加准确 使用二值化图像。在寻找 轮廓之前 ,要进行阈值化处理 +或者 Canny 边界检测。 +• 查找 轮廓的函数会修改原始图像。如果你在找到 轮廓之后 想使用原始图 + 像的 你应 将原始图像存储到其他变 中。 +• 在 OpenCV 中 查找 轮廓就像在黑色背景中超白色物体。你应该记住 找的物体应 是白色而背景应该是黑色。 + + 我们看看如何在一个二值图像中查找 轮廓 +函数 cv2.findContours() 有三个参数 +第一个是 入图像 +第二个是轮廓检索模式 +第三个是 轮廓近似方法。 + +返回值有三个 +第一个是图像 +第二个 是 轮廓 +第三个是 轮廓的 层析结构。 + +轮廓 第二个 回值 是一个 Python 列表 + 其中存储 图像中的所有 轮廓。 + 每一个 轮廓 是一个 Numpy 数组 包含对 边界点 x y 的坐标。 \ No newline at end of file diff --git "a/ch21-\350\275\256\345\273\223Contours/\345\207\270\345\214\205-\345\207\270\346\200\247\346\243\200\346\265\213-\350\276\271\347\225\214\347\237\251\345\275\242-\346\234\200\345\260\217\345\244\226\346\216\245\345\234\206-\346\213\237\345\220\210.py" "b/ch21-\350\275\256\345\273\223Contours/\345\207\270\345\214\205-\345\207\270\346\200\247\346\243\200\346\265\213-\350\276\271\347\225\214\347\237\251\345\275\242-\346\234\200\345\260\217\345\244\226\346\216\245\345\234\206-\346\213\237\345\220\210.py" new file mode 100644 index 00000000..e8ecb338 --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/\345\207\270\345\214\205-\345\207\270\346\200\247\346\243\200\346\265\213-\350\276\271\347\225\214\347\237\251\345\275\242-\346\234\200\345\260\217\345\244\226\346\216\245\345\234\206-\346\213\237\345\220\210.py" @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午8:28 +# @Author : play4fun +# @File : 凸包-凸性检测-边界矩形-最小外接圆-拟合.py +# @Software: PyCharm + +""" +凸包-凸性检测-边界矩形-最小外接圆-拟合.py: +""" +import cv2 +import numpy as np + +img=cv2.imread('../data/lightning.png',0) + +image, contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + +cnt=contours[0] +''' +函数 cv2.convexHull() 可以用来检测一个曲线是否具有凸性缺 并能纠 正缺 。一般来 凸性曲线总是凸出来的 至少是平的。如果有地方凹 去 了就 叫做凸性缺 +例如下图中的手。红色曲线显示了手的凸包 凸性缺 双箭头标出来了。 +''' +# convexHull(points, hull=None, clockwise=None, returnPoints=None) +hull = cv2.convexHull(points, hull, clockwise, returnPoints) + +''' +points 我们 传入的 廓 +• hull 输出 通常不需要 +• clockwise 方向标志。如果 置为 True 出的凸包是顺时针 方向的。 否则为逆时针 方向。 +• returnPoints 值为 True。它会 回凸包上点的坐标。如果 置 为 False 就会 回与凸包点对应的 廓上的点。 +''' +hull = cv2.convexHull(cnt) + +# 凸性检测 +# 函数 cv2.isContourConvex() 可以可以用来检测一个曲线是不是凸的。它只能 回 True 或 False。没什么大不了的。 +k = cv2.isContourConvex(cnt) + +# 边界矩形 +''' +直边界矩形 一个直矩形 就是没有旋转的矩形 。它不会考虑对象是否旋转。 所以边界矩形的 积不是最小的。可以使用函数 cv2.boundingRect() 查 找得到。 + x y 为矩形左上角的坐标 w h 是矩形的宽和 。 +''' +x, y, w, h = cv2.boundingRect(cnt) +img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) + +''' +旋转矩形 +这里,以最小面积绘制边界矩形,因此也考虑旋转。使用的功能是cv2.minAreaRect()。它返回一个Box2D结构,其中包含以下条件 - (中心(x,y),(宽度,高度),旋转角度)。但是要绘制这个矩形,我们需要矩形的四个角。它是通过函数cv2.boxPoints() +''' +rect = cv2.minAreaRect(cnt) +box = cv2.boxPoints(rect) +box = np.int0(box) +cv2.drawContours(img,[box],0,(0,0,255),2) + +# 最小外接圆 +# 函数 cv2.minEnclosingCircle() 可以帮我们找到一个对 的外切圆。它是所有能够包括对 的圆中 积最小的一个。 +(x, y), radius = cv2.minEnclosingCircle(cnt) +center = (int(x), int(y)) +radius = int(radius) +img = cv2.circle(img, center, radius, (0, 255, 0), 2) + +# 椭圆拟合 +# 使用的函数为 cv2.ellipse() 回值其实就是旋 界矩形的内切圆 +ellipse = cv2.fitEllipse(cnt) +#((135.34278869628906, 134.22764587402344),(57.018402099609375, 166.91265869140625),136.8311767578125) +angle=ellipse[2] +im = cv2.ellipse(img, ellipse, (0, 255, 0), 2) + +# 直线拟合 +# 我们可以根据一组点拟合出一条直线 同样我们也可以为图像中的白色点 拟合出一条直线。 +rows, cols = img.shape[:2] +[vx, vy, x, y] = cv2.fitLine(cnt, cv2.DIST_L2, 0, 0.01, 0.01) +lefty = int((-x * vy / vx) + y) +righty = int(((cols - x) * vy / vx) + y) +cv2.line(img, (cols - 1, righty), (0, lefty), (0, 255, 0), 2) diff --git "a/ch21-\350\275\256\345\273\223Contours/\345\207\270\347\274\272\351\231\267.py" "b/ch21-\350\275\256\345\273\223Contours/\345\207\270\347\274\272\351\231\267.py" new file mode 100644 index 00000000..9deb26fe --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/\345\207\270\347\274\272\351\231\267.py" @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午9:25 +# @Author : play4fun +# @File : 凸缺陷.py +# @Software: PyCharm + +""" +凸缺陷.py: +""" + +# 凸缺陷 +# 前 我们已经学习了 廓的凸包 对 上的任何凹 成为凸缺 。 +# OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺 + + +# hull = cv2.convexHull(cnt, returnPoints=False) +# defects = cv2.convexityDefects(cnt, hull) + + +# 注意 如果 查找凸缺 在使用函数 cv2.convexHull 找凸包时 参数 returnPoints 一定 是 False +''' +它会 回一个数组 其中每一 包含的值是 [ 点 终点 最 的点 到最 点的 似 离]。我们可以在一张图上显示它。我们将 点和终点用一条绿线 接 在最 点画一个圆圈 住的是 回结果的前三个值是 廓点的索引。 所以我们 到 廓点中去找它们。 +''' +import cv2 +import numpy as np + +img = cv2.imread('star.jpg') +img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + +ret, thresh = cv2.threshold(img_gray, 127, 255, 0) +contours, hierarchy = cv2.findContours(thresh, 2, 1) + +cnt = contours[0] +hull = cv2.convexHull(cnt, returnPoints=False) +defects = cv2.convexityDefects(cnt, hull) + +for i in range(defects.shape[0]): + s, e, f, d = defects[i, 0] + start = tuple(cnt[s][0]) + end = tuple(cnt[e][0]) + far = tuple(cnt[f][0]) + cv2.line(img, start, end, [0, 255, 0], 2) + cv2.circle(img, far, 5, [0, 0, 255], -1) +cv2.imshow('img', img) +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch21-\350\275\256\345\273\223Contours/\350\275\256\345\273\223\347\232\204\345\261\202\346\254\241\347\273\223\346\236\204.txt" "b/ch21-\350\275\256\345\273\223Contours/\350\275\256\345\273\223\347\232\204\345\261\202\346\254\241\347\273\223\346\236\204.txt" new file mode 100644 index 00000000..2c8ced77 --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/\350\275\256\345\273\223\347\232\204\345\261\202\346\254\241\347\273\223\346\236\204.txt" @@ -0,0 +1,54 @@ + + +在前 的内容中我们使用函数 cv2.findContours 来查找 廓 我们 传入一个参数 廓提取模式 Contour_Retrieval_Mode 。我们总是 把它 置为 cv2.RETR_LIST 或者是 cv2.RETR_TREE 效果 可以 + + 常我们使用函数 cv2.findContours 在图片中查找一个对 。有时对 可能位于不同的位置。 有些情况 一个形状在另外一个形状的内 。 种 情况下我们称外 的形状为父 内 的形状为子。按照 种方式分类 一幅图 像中的所有 廓之 就建立父子关系。 样我们就可以确定一个 廓与其他 廓是怎样 接的 比如它是不是某个 廓的子 廓 或者是父 廓。 种关系 就成为组织结构 + + 每一个 廓 包含自己的信息 是父 是子等。OpenCV 使用一个含有四个元素的数组 示。 + + [Next Previous First_Child Parent]。 + + 如果没有父或子 就为 -1。 + + 21.5.3 廓检索模式 + RETR_LIST 从 的 度来看 中应是最简单的。它只是提取所有的 廓 而不去创建任何父子关系。换句 就是 人人平等 它们属于同一级组 织 廓。 +>>> hierarchy +array([[[ 1, -1, -1, -1], + [2, 0,-1,-1], + [3, 1,-1,-1], + [4, 2,-1,-1], + [5, 3,-1,-1], + [6, 4,-1,-1], + [7, 5,-1,-1], + [-1, 6, -1, -1]]]) + +RETR_EXTERNAL 如果你 择 种模式的 只会 回最外 的的 廓 所有的子 廓 会 忽略掉。 +>>> hierarchy +array([[[ 1, -1, -1, -1], + [ 2, 0, -1, -1], + [-1, 1, -1, -1]]]) + +RETR_CCOMP 在 种模式下会 回所有的 廓并将 廓分为两级组织结 构。例如 一个对 的外 廓为第 1 级组织结构。而对 内 中空洞的 廓为 第 2 级组织结构 空洞中的任何对 的 廓又是第 1 级组织结构。空洞的组织 结构为第 2 级。 +>>> hierarchy +array([[[ 3, -1, 1, -1], + [ 2, -1, -1, 0], + [-1, 1, -1, 0], + [ 5, 0, 4, -1], + [-1, -1, -1, 3], + [ 7, 3, 6, -1], + [-1, -1, -1, 5], + [ 8, 5, -1, -1], + [-1, 7, -1, -1]]]) + +RETR_TREE 终于到最后一个了 也是最完美的一个。 种模式下会 回 所有 廓 并且创建一个完整的组织结构列 。它甚至会告 你 是爷爷 爸 爸 儿子 孙子等。 +>>> hierarchy +array([[[ 7, -1, 1, -1], + [-1, -1, 2, 0], + [-1, -1, 3, 1], + [-1, -1, 4, 2], + [-1, -1, 5, 3], + [ 6, -1, -1, 4], + [-1, 5, -1, 4], + [ 8, 0, -1, -1], + [-1, 7, -1, -1]]]) + diff --git "a/ch21-\350\275\256\345\273\223Contours/\350\275\256\345\273\223\347\232\204\346\200\247\350\264\250.py" "b/ch21-\350\275\256\345\273\223Contours/\350\275\256\345\273\223\347\232\204\346\200\247\350\264\250.py" new file mode 100644 index 00000000..6a8c8ddb --- /dev/null +++ "b/ch21-\350\275\256\345\273\223Contours/\350\275\256\345\273\223\347\232\204\346\200\247\350\264\250.py" @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午8:38 +# @Author : play4fun +# @File : 轮廓的性质.py +# @Software: PyCharm + +""" +轮廓的性质.py: +""" +import cv2 +import numpy as np + +# 边界矩形的宽高比 +x, y, w, h = cv2.boundingRect(cnt) +aspect_ratio = float(w) / h + +# Extent轮廓面积与边界矩形面积的比。 +area = cv2.contourArea(cnt) +x, y, w, h = cv2.boundingRect(cnt) +rect_area = w * h +extent = float(area) / rect_area + +# Solidity轮廓面积与凸包面积的比。 +area = cv2.contourArea(cnt) +hull = cv2.convexHull(cnt) +hull_area = cv2.contourArea(hull) +solidity = float(area) / hull_area + +# Equivalent Diameter与轮廓面积相等的圆形的直径 +area = cv2.contourArea(cnt) +equi_diameter = np.sqrt(4 * area / np.pi) + +# Orientation对象的方向 下 的方法 会返回 长轴和短轴的长度 +(x, y), (MA, ma), angle = cv2.fitEllipse(cnt) + +# Mask and Pixel Points掩模和像素点 +mask = np.zeros(imgray.shape, np.uint8) +cv2.drawContours(mask, [cnt], 0, 255, -1) +pixelpoints = np.transpose(np.nonzero(mask)) +# pixelpoints = cv2.findNonZero(mask) +# 第一种方法使用了 Numpy 函数 +# 第二种使用 了 OpenCV 函数。 +# 结果相同 但还是有点不同。Numpy 给出的坐标是 (row ,colum) +# 而 OpenCV 给出的格式是 (x y )形式的。所以 两个结果基 本是可以互换的。row=x ,colunm=y。 + +# 最大值和最小值及它们的位置 +min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray, mask=mask) + +# 平均 色及平均灰度 我们也可以使用相同的掩模求一个对 的平均 色或平均灰度 +mean_val = cv2.mean(im, mask=mask) + +# 极点 一个对象最上面 最下面 最左 最右 的点。 +leftmost = tuple(cnt[cnt[:, :, 0].argmin()][0]) +rightmost = tuple(cnt[cnt[:, :, 0].argmax()][0]) +topmost = tuple(cnt[cnt[:, :, 1].argmin()][0]) +bottommost = tuple(cnt[cnt[:, :, 1].argmax()][0]) diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/22.1.2-\347\273\230\345\210\266\347\233\264\346\226\271\345\233\276-matplotlib.py" "b/ch22-\347\233\264\346\226\271\345\233\276/22.1.2-\347\273\230\345\210\266\347\233\264\346\226\271\345\233\276-matplotlib.py" new file mode 100755 index 00000000..70eebeb3 --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/22.1.2-\347\273\230\345\210\266\347\233\264\346\226\271\345\233\276-matplotlib.py" @@ -0,0 +1,14 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-24 下午5:17 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/home.jpg', 0) +# img.ravel() 将图像转成一维数组 没有中括号 +plt.hist(img.ravel(), 256, [0, 256]) +plt.show() diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/22.2.2-CLAHE\346\234\211\351\231\220\345\257\271\346\257\224\351\200\202\345\272\224\346\200\247\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226.py" "b/ch22-\347\233\264\346\226\271\345\233\276/22.2.2-CLAHE\346\234\211\351\231\220\345\257\271\346\257\224\351\200\202\345\272\224\346\200\247\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226.py" new file mode 100644 index 00000000..d2de2c56 --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/22.2.2-CLAHE\346\234\211\351\231\220\345\257\271\346\257\224\351\200\202\345\272\224\346\200\247\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226.py" @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午10:18 +# @Author : play4fun +# @File : 22.2.2-CLAHE有限对比适应性直方图均衡化.py +# @Software: PyCharm + +""" +22.2.2-CLAHE有限对比适应性直方图均衡化.py: + +自 应的直方图均 化。 种情况下 整幅图像会 分成很多小块 些小块 称为 tiles +在 OpenCV 中 tiles 的 大小 是 8x8 +然后再对每一个小块分别 直方图均 化 前 类似 。 所以在每一个的区域中 直方图会 中在某一个小的区域中 有噪声干 扰 。 + +如果有噪声的 噪声会 放大。为了 免 种情况的出现 使用对比度 制。对于每个小块来 如果直方图中的 bin 对比度的上 的 就把 其中的像素点均匀分散到其他 bins 中 然后在 直方图均 化。 + +最后 为了 去 每一个小块之 人 的 由于算法 成 界 再使用双线性差值 对 小块 缝合。 + +""" + +import numpy as np +import cv2 + +img = cv2.imread('tsukuba_l.png', 0) +# create a CLAHE object (Arguments are optional). +clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) +cl1 = clahe.apply(img) +cv2.imwrite('clahe_2.jpg', cl1) diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/22.3-2D\347\233\264\346\226\271\345\233\276.py" "b/ch22-\347\233\264\346\226\271\345\233\276/22.3-2D\347\233\264\346\226\271\345\233\276.py" new file mode 100644 index 00000000..17faba8a --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/22.3-2D\347\233\264\346\226\271\345\233\276.py" @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午10:32 +# @Author : play4fun +# @File : 22.3-2D直方图.py +# @Software: PyCharm + +""" +22.3-2D直方图.py: +一维 是因为 我们只考 了图像的一个特征:灰度值。 +但是在 2D 直方图中我们就 考虑 两个图像特征。 + +对于彩色图像的直方图通常情况下我们 考 每个的颜色 + Hue 和 饱和度 Saturation 。 + 根据 两个特征绘制 2D 直方图。 + + 使用函数 cv2.calcHist() 来 算直方图既简单又方便。如果 绘制颜色直方图的话, 我们 先 将图像的颜色空间从 BGR 换到 HSV 计算 2D 直方图 + 记住 计算一维直方图 从 BGR 换到 HSV 。 + 函数的参数 做如下修改 +• channels=[0 1] 因为我们 同时处理 H 和 S 两个 。 +• bins=[180 256]H 为 180 S 为 256。 +• range=[0 180 0 256]H 的取值范围在 0 到 180 S 的取值范围 在 0 到 256。 + +""" + +import cv2 +import numpy as np + +img = cv2.imread('../data/home.jpg') +hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) + +hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256]) + +# Numpy 同样提供了绘制 2D 直方图的函数 np.histogram2d()。 +# 绘制 1D 直方图时我们使用的是 np.histogram() 。 + +h, s, v = cv2.split(hsv) + +hist, xbins, ybins = np.histogram2d(h.ravel(), s.ravel(), [180, 256], [[0, 180], [0, 256]]) + +pass diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/22.3.4.hsv_hist-\347\273\230\345\210\2662D\347\233\264\346\226\271\345\233\276.py" "b/ch22-\347\233\264\346\226\271\345\233\276/22.3.4.hsv_hist-\347\273\230\345\210\2662D\347\233\264\346\226\271\345\233\276.py" new file mode 100755 index 00000000..f11004b8 --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/22.3.4.hsv_hist-\347\273\230\345\210\2662D\347\233\264\346\226\271\345\233\276.py" @@ -0,0 +1,19 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-11-8 下午4:44 +绘制2D直方图 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/home.jpg') +# cv2.imshow("src", img) + +hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) +hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256]) + +plt.imshow(hist, interpolation='nearest') +plt.show() diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/22.3.4.hsv_hist.py" "b/ch22-\347\233\264\346\226\271\345\233\276/22.3.4.hsv_hist.py" deleted file mode 100755 index c55fada2..00000000 --- "a/ch22-\347\233\264\346\226\271\345\233\276/22.3.4.hsv_hist.py" +++ /dev/null @@ -1,17 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-11-8 下午4:44 -""" - - - -import cv2 -import numpy as np -from matplotlib import pyplot as plt -img = cv2.imread('../data/home.jpg') -cv2.imshow("src",img) -hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) -hist = cv2.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] ) -plt.imshow(hist,interpolation = 'nearest') -plt.show() \ No newline at end of file diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/22.4-OpenCV\344\270\255\347\232\204\345\217\215\345\220\221\346\212\225\345\275\261.py" "b/ch22-\347\233\264\346\226\271\345\233\276/22.4-OpenCV\344\270\255\347\232\204\345\217\215\345\220\221\346\212\225\345\275\261.py" new file mode 100644 index 00000000..146f5260 --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/22.4-OpenCV\344\270\255\347\232\204\345\217\215\345\220\221\346\212\225\345\275\261.py" @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午11:06 +# @Author : play4fun +# @File : 22.4-OpenCV中的反向投影.py +# @Software: PyCharm + +""" +22.4-OpenCV中的反向投影.py: +OpenCV 提供的函数 cv2.calcBackProject() 可以用来做直方图反向 投影。 +它的参数与函数 cv2.calcHist 的参数基本相同。 +其中的一个参数是我 们 查找目标的直方图。 +同样再使用目标的直方图做反向投影之前 +我们应 先 对其做归一化处理。 + 返回的结果是一个概率图像 我们再使用一个圆盘形卷积 核对其做卷操作 最后使用 值 二值化 +""" + +import cv2 +import numpy as np + +roi = cv2.imread('tar.jpg') +hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) +target = cv2.imread('roi.jpg') +hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV) +# calculating object histogram +roihist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256]) + +# normalize histogram and apply backprojection +# 归一化 原始图像 结果图像 映射到结果图像中的最小值 最大值 归一化类型 +# cv2.NORM_MINMAX 对数组的所有值进行转化 使它们线性映射到最小值和最大值之 间 +# 归一化之后的直方图便于显示 归一化之后就成了 0 到 255 之 的数了。 +cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX) +dst = cv2.calcBackProject([hsvt], [0, 1], roihist, [0, 180, 0, 256], 1) + +# Now convolute with circular disc +# 此处卷积可以把分散的点连在一起 +disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) +dst = cv2.filter2D(dst, -1, disc) +# threshold and binary AND +ret, thresh = cv2.threshold(dst, 50, 255, 0) + +# 别忘了是三 图像 因此 使用 merge 变成 3 +thresh = cv2.merge((thresh, thresh, thresh)) + +# 按位操作 +res = cv2.bitwise_and(target, thresh) +res = np.hstack((target, thresh, res)) +cv2.imwrite('res.jpg', res) + +# 显示图像 +cv2.imshow('1', res) +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/22.4-\347\233\264\346\226\271\345\233\276\345\217\215\345\220\221\346\212\225\345\275\261.py" "b/ch22-\347\233\264\346\226\271\345\233\276/22.4-\347\233\264\346\226\271\345\233\276\345\217\215\345\220\221\346\212\225\345\275\261.py" new file mode 100644 index 00000000..75659000 --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/22.4-\347\233\264\346\226\271\345\233\276\345\217\215\345\220\221\346\212\225\345\275\261.py" @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午11:01 +# @Author : play4fun +# @File : 22.4-直方图反向投影.py +# @Software: PyCharm + +""" +22.4-直方图反向投影.py: + +直方图反向投影是由 Michael J. Swain 和 Dana H. Ballard 在他们的 文章 Indexing via color histograms 中提出。 + + 它到底是什么呢 它可以用来做图像分割 或者在图像中找寻我们感兴 的 分。 + 简单来 它会 出与 入图像 待搜索 同样大小的图像 其中 的每一个像素值代 了 入图像上对应点属于目标对 的概率。 + 用更简单的 来 输出图像中像素值越高(越白) 的点就 可能代表我们 搜索的目标 + 在输入图像所在的位置 。 + 这是一个直观的解释 。 + + 直方图投影经常与 camshift 算法等一 使用。 + + + +""" +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +# Numpy 中的算法 + +# roi is the object or region of object we need to find +roi = cv2.imread('rose_red.png') +hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) +# target is the image we search in +target = cv2.imread('rose.png') + +hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV) +# Find the histograms using calcHist. Can be done with np.histogram2d also +M = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256]) +I = cv2.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256]) + +h, s, v = cv2.split(hsvt) +B = R[h.ravel(), s.ravel()] +B = np.minimum(B, 1) +B = B.reshape(hsvt.shape[:2]) + +disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) +B = cv2.filter2D(B, -1, disc) +B = np.uint8(B) +cv2.normalize(B, B, 0, 255, cv2.NORM_MINMAX) + +ret,thresh = cv2.threshold(B,50,255,0) + + diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/clahe_2.jpg" "b/ch22-\347\233\264\346\226\271\345\233\276/clahe_2.jpg" new file mode 100644 index 00000000..e496aafc Binary files /dev/null and "b/ch22-\347\233\264\346\226\271\345\233\276/clahe_2.jpg" differ diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/hist-1.py" "b/ch22-\347\233\264\346\226\271\345\233\276/hist-1.py" deleted file mode 100755 index 334c3adb..00000000 --- "a/ch22-\347\233\264\346\226\271\345\233\276/hist-1.py" +++ /dev/null @@ -1,12 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-24 下午5:17 -""" - -import cv2 -import numpy as np -from matplotlib import pyplot as plt -img = cv2.imread('../data/home.jpg',0) -plt.hist(img.ravel(),256,[0,256]); -plt.show() \ No newline at end of file diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/hist-bgr.py" "b/ch22-\347\233\264\346\226\271\345\233\276/hist-bgr\345\244\232\351\200\232\351\201\223.py" similarity index 55% rename from "ch22-\347\233\264\346\226\271\345\233\276/hist-bgr.py" rename to "ch22-\347\233\264\346\226\271\345\233\276/hist-bgr\345\244\232\351\200\232\351\201\223.py" index d2673db8..ba3eeaec 100755 --- "a/ch22-\347\233\264\346\226\271\345\233\276/hist-bgr.py" +++ "b/ch22-\347\233\264\346\226\271\345\233\276/hist-bgr\345\244\232\351\200\232\351\201\223.py" @@ -1,20 +1,22 @@ -#-*-coding:utf8-*-# +# -*-coding:utf8-*-# __author__ = 'play4fun' """ create time:15-10-24 下午5:19 +同时绘制多通道 BGR """ import cv2 import numpy as np from matplotlib import pyplot as plt + img = cv2.imread('../data/home.jpg') -color = ('b','g','r') +color = ('b', 'g', 'r') # 对一个列表或数组既要遍历索引又要遍历元素时 # 使用内置 enumerrate 函数会有更加直接 优美的做法 -#enumerate 会将数组或列表组成一个索引序列。 +# enumerate 会将数组或列表组成一个索引序列。 # 使我们再获取索引和索引内容的时候更加方便 -for i,col in enumerate(color): - histr = cv2.calcHist([img],[i],None,[256],[0,256]) - plt.plot(histr,color = col) - plt.xlim([0,256]) -plt.show() \ No newline at end of file +for i, col in enumerate(color): + histr = cv2.calcHist([img], [i], None, [256], [0, 256]) + plt.plot(histr, color=col) + plt.xlim([0, 256]) +plt.show() diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-2.py" "b/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-2.py" deleted file mode 100755 index 6ad36128..00000000 --- "a/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-2.py" +++ /dev/null @@ -1,38 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-24 下午5:26 -""" - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img = cv2.imread('../data/contrast75.png',0) -#flatten() 将数组变成一维 -hist,bins = np.histogram(img.flatten(),256,[0,256]) -#计算累积分布图 -cdf = hist.cumsum() - -## -# 构建 Numpy 掩模数组 cdf 为原数组 当数组元素为 0 时 掩盖(计算时被忽略 -cdf_m = np.ma.masked_equal(cdf,0) -cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min()) -# 对被掩盖的元素赋值,赋值为 0 -cdf = np.ma.filled(cdf_m,0).astype('uint8') -img2 = cdf[img] -# cv2.imshow("img2",img2) -# cv2.waitKey(0) - -## -#flatten() 将数组变成一维 -hist,bins = np.histogram(img2.flatten(),256,[0,256]) -#计算累积分布图 -cdf = hist.cumsum() -cdf_normalized = cdf * hist.max()/ cdf.max() - -plt.plot(cdf_normalized, color = 'b') -plt.hist(img.flatten(),256,[0,256], color = 'r') -plt.xlim([0,256]) -plt.legend(('cdf','histogram'), loc = 'upper left') -plt.show() \ No newline at end of file diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-numpy-2.py" "b/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-numpy-2.py" new file mode 100755 index 00000000..1d9fbe46 --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-numpy-2.py" @@ -0,0 +1,42 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-24 下午5:26 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/contrast75.png', 0) +# flatten() 将数组变成一维 +hist, bins = np.histogram(img.flatten(), 256, [0, 256]) +# 计算累积分布图 +cdf = hist.cumsum() + +## +# 构建 Numpy 掩模数组 cdf 为原数组 当数组元素为 0 时 掩盖(计算时被忽略 +cdf_m = np.ma.masked_equal(cdf, 0) +cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min()) +# 对被掩盖的元素赋值,赋值为 0 +cdf = np.ma.filled(cdf_m, 0).astype('uint8') +img2 = cdf[img] +# cv2.imshow("img2",img2) +# cv2.waitKey(0) + +## +# flatten() 将数组变成一维 +hist, bins = np.histogram(img2.flatten(), 256, [0, 256]) +# 计算累积分布图 +cdf = hist.cumsum() +cdf_normalized = cdf * hist.max() / cdf.max() + +plt.plot(cdf_normalized, color='b') +plt.hist(img.flatten(), 256, [0, 256], color='r') +plt.xlim([0, 256]) +plt.legend(('cdf', 'histogram'), loc='upper left') +plt.show() + +''' +直方图均 化经常用来使所有的图片具有相同的亮度条件的参考 工具。 在很多情况下 很有用。例如 脸 别 在 练分类器前 练 的所有图片 先 直方图均 化从而使它们 到相同的亮度条件。 +''' \ No newline at end of file diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-numpy.py" "b/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-numpy.py" new file mode 100755 index 00000000..f177d506 --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized-numpy.py" @@ -0,0 +1,26 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-24 下午5:26 +直方图均衡化 + +想 一下如果一副图像中的大多是像素点的像素值 中在一个像素值范 围之内会怎样呢 例如 如果一幅图片整体很亮 所有的像素值应 会很 。但是一副 的图像的像素值分布应 很广泛。所以你应 把它的直方 图做一个横向拉伸 如下图 就是直方图均 化 做的事情。 常情况下 种操作会改善图像的对比度。 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +#怎样使用 Numpy 来进行直方图均衡化 +img = cv2.imread('../data/contrast75.png', 0) +# flatten() 将数组变成一维 +hist, bins = np.histogram(img.flatten(), 256, [0, 256]) +# 计算累积分布图 +cdf = hist.cumsum() +cdf_normalized = cdf * hist.max() / cdf.max() + +plt.plot(cdf_normalized, color='b') +plt.hist(img.flatten(), 256, [0, 256], color='r') +plt.xlim([0, 256]) +plt.legend(('cdf', 'histogram'), loc='upper left') +plt.show() diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized.py" "b/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized.py" deleted file mode 100755 index fdd2c196..00000000 --- "a/ch22-\347\233\264\346\226\271\345\233\276/hist-normalized.py" +++ /dev/null @@ -1,22 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-24 下午5:26 -""" - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img = cv2.imread('../data/contrast75.png',0) -#flatten() 将数组变成一维 -hist,bins = np.histogram(img.flatten(),256,[0,256]) -#计算累积分布图 -cdf = hist.cumsum() -cdf_normalized = cdf * hist.max()/ cdf.max() - -plt.plot(cdf_normalized, color = 'b') -plt.hist(img.flatten(),256,[0,256], color = 'r') -plt.xlim([0,256]) -plt.legend(('cdf','histogram'), loc = 'upper left') -plt.show() \ No newline at end of file diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/hist.py" "b/ch22-\347\233\264\346\226\271\345\233\276/hist.py" index 84c0efee..5e326c6a 100755 --- "a/ch22-\347\233\264\346\226\271\345\233\276/hist.py" +++ "b/ch22-\347\233\264\346\226\271\345\233\276/hist.py" @@ -18,34 +18,36 @@ import cv2 import numpy as np -bins = np.arange(256).reshape(256,1) +bins = np.arange(256).reshape(256, 1) + def hist_curve(im): - h = np.zeros((300,256,3)) + h = np.zeros((300, 256, 3)) if len(im.shape) == 2: - color = [(255,255,255)] + color = [(255, 255, 255)] elif im.shape[2] == 3: - color = [ (255,0,0),(0,255,0),(0,0,255) ] + color = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] for ch, col in enumerate(color): - hist_item = cv2.calcHist([im],[ch],None,[256],[0,256]) - cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX) - hist=np.int32(np.around(hist_item)) - pts = np.int32(np.column_stack((bins,hist))) - cv2.polylines(h,[pts],False,col) - y=np.flipud(h) + hist_item = cv2.calcHist([im], [ch], None, [256], [0, 256]) + cv2.normalize(hist_item, hist_item, 0, 255, cv2.NORM_MINMAX) + hist = np.int32(np.around(hist_item)) + pts = np.int32(np.column_stack((bins, hist))) + cv2.polylines(h, [pts], False, col) + y = np.flipud(h) return y + def hist_lines(im): - h = np.zeros((300,256,3)) - if len(im.shape)!=2: - print "hist_lines applicable only for grayscale images" - #print "so converting image to grayscale for representation" - im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) - hist_item = cv2.calcHist([im],[0],None,[256],[0,256]) - cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX) - hist=np.int32(np.around(hist_item)) - for x,y in enumerate(hist): - cv2.line(h,(x,0),(x,y),(255,255,255)) + h = np.zeros((300, 256, 3)) + if len(im.shape) != 2: + print("hist_lines applicable only for grayscale images") + # print "so converting image to grayscale for representation" + im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) + hist_item = cv2.calcHist([im], [0], None, [256], [0, 256]) + cv2.normalize(hist_item, hist_item, 0, 255, cv2.NORM_MINMAX) + hist = np.int32(np.around(hist_item)) + for x, y in enumerate(hist): + cv2.line(h, (x, 0), (x, y), (255, 255, 255)) y = np.flipud(h) return y @@ -54,22 +56,21 @@ def hist_lines(im): import sys - if len(sys.argv)>1: + if len(sys.argv) > 1: fname = sys.argv[1] - else : + else: fname = '../data/lena.jpg' - print "usage : python hist.py " + print("usage : python hist.py ") im = cv2.imread(fname) if im is None: - print 'Failed to load image file:', fname + print('Failed to load image file:', fname) sys.exit(1) - gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) - + gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) - print ''' Histogram plotting \n + print(''' Histogram plotting \n Keymap :\n a - show histogram for color image in curve mode \n b - show histogram in bin mode \n @@ -77,42 +78,45 @@ def hist_lines(im): d - show histogram for color image in curve mode \n e - show histogram for a normalized image in curve mode \n Esc - exit \n - ''' + ''') - cv2.imshow('image',im) + cv2.imshow('image', im) while True: - k = cv2.waitKey(0)&0xFF + k = cv2.waitKey(0) & 0xFF if k == ord('a'): curve = hist_curve(im) - cv2.imshow('histogram',curve) - cv2.imshow('image',im) - print 'a' + cv2.imshow('histogram', curve) + cv2.imshow('image', im) + print('a') elif k == ord('b'): - print 'b' + print('b') lines = hist_lines(im) - cv2.imshow('histogram',lines) - cv2.imshow('image',gray) + cv2.imshow('histogram', lines) + cv2.imshow('image', gray) elif k == ord('c'): - print 'c' + print('c') equ = cv2.equalizeHist(gray) lines = hist_lines(equ) - cv2.imshow('histogram',lines) - cv2.imshow('image',equ) + cv2.imshow('histogram', lines) + cv2.imshow('image', equ) elif k == ord('d'): - print 'd' + print('d') + curve = hist_curve(gray) - cv2.imshow('histogram',curve) - cv2.imshow('image',gray) + cv2.imshow('histogram', curve) + cv2.imshow('image', gray) elif k == ord('e'): - print 'e' - norm=np.ndarray((2,2)) - norm = cv2.normalize(gray,norm,alpha = 0,beta = 255,norm_type = cv2.NORM_MINMAX) + print('e') + + norm = np.ndarray((2, 2)) + norm = cv2.normalize(gray, norm, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX) lines = hist_lines(norm) - cv2.imshow('histogram',lines) - cv2.imshow('image',norm) + cv2.imshow('histogram', lines) + cv2.imshow('image', norm) elif k == 27: - print 'ESC' + print('ESC') + cv2.destroyAllWindows() break cv2.destroyAllWindows() diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/mask.py" "b/ch22-\347\233\264\346\226\271\345\233\276/mask.py" index 87707b78..633027b3 100755 --- "a/ch22-\347\233\264\346\226\271\345\233\276/mask.py" +++ "b/ch22-\347\233\264\346\226\271\345\233\276/mask.py" @@ -1,30 +1,33 @@ -#-*-coding:utf8-*-# +# -*-coding:utf8-*-# __author__ = 'play4fun' """ create time:15-10-24 下午5:22 + + 统计图像某个局部区域的直方图只需要构建一副掩模图像。 + 将要统计的 部分设置成白色 其余 分为黑色 就构成了一副掩模图像。 + 然后把这个掩模 图像传给函数就可以了。 + """ import cv2 import numpy as np from matplotlib import pyplot as plt +img = cv2.imread('../data/home.jpg', 0) -img = cv2.imread('../data/home.jpg',0) # create a mask mask = np.zeros(img.shape[:2], np.uint8) mask[100:300, 100:400] = 255 -masked_img = cv2.bitwise_and(img,img,mask = mask) +masked_img = cv2.bitwise_and(img, img, mask=mask) + # Calculate histogram with mask and without mask # Check third argument for mask -hist_full = cv2.calcHist([img],[0],None,[256],[0,256]) -hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256]) +hist_full = cv2.calcHist([img], [0], None, [256], [0, 256]) +hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256]) -plt.subplot(221), -plt.subplot(222), -plt.subplot(223), -plt.subplot(224), -plt.xlim([0,256]) -plt.imshow(img, 'gray') -plt.imshow(mask,'gray') -plt.imshow(masked_img, 'gray') -plt.plot(hist_full), plt.plot(hist_mask) -plt.show() \ No newline at end of file +plt.subplot(221), plt.imshow(img, 'gray') +plt.subplot(222), plt.imshow(mask, 'gray') +plt.subplot(223), plt.imshow(masked_img, 'gray') +plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask) +plt.xlim([0, 256]) +plt.show() +# 蓝线是整幅图像的直方图 绿线是进行掩模之后的直方图 diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/tsukuba_l.png" "b/ch22-\347\233\264\346\226\271\345\233\276/tsukuba_l.png" new file mode 100644 index 00000000..1816160d Binary files /dev/null and "b/ch22-\347\233\264\346\226\271\345\233\276/tsukuba_l.png" differ diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/\344\275\277\347\224\250OpenCV\350\277\233\350\241\214\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226.py" "b/ch22-\347\233\264\346\226\271\345\233\276/\344\275\277\347\224\250OpenCV\350\277\233\350\241\214\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226.py" new file mode 100644 index 00000000..b03f9e08 --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/\344\275\277\347\224\250OpenCV\350\277\233\350\241\214\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226.py" @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/12 下午10:16 +# @Author : play4fun +# @File : 使用OpenCV进行直方图均衡化.py +# @Software: PyCharm + +""" +使用OpenCV进行直方图均衡化.py: +""" +import cv2 +import numpy as np + +img = cv2.imread('wiki.jpg', 0) +equ = cv2.equalizeHist(img) +res = np.hstack((img, equ)) # stacking images side-by-side +cv2.imwrite('res.png', res) + +''' +当直方图中的数据 中在某一个灰度值范围内时 直方图均 化很有用。 但是如果像素的变化很大 而且占据的灰度范围 常广时 例如 既有很亮的 像素点又有很暗的像素点时 +''' \ No newline at end of file diff --git "a/ch22-\347\233\264\346\226\271\345\233\276/\347\233\264\346\226\271\345\233\276\347\232\204\350\256\241\347\256\227 \347\273\230\345\210\266\344\270\216\345\210\206\346\236\220.txt" "b/ch22-\347\233\264\346\226\271\345\233\276/\347\233\264\346\226\271\345\233\276\347\232\204\350\256\241\347\256\227 \347\273\230\345\210\266\344\270\216\345\210\206\346\236\220.txt" new file mode 100644 index 00000000..15ef7c5b --- /dev/null +++ "b/ch22-\347\233\264\346\226\271\345\233\276/\347\233\264\346\226\271\345\233\276\347\232\204\350\256\241\347\256\227 \347\273\230\345\210\266\344\270\216\345\210\206\346\236\220.txt" @@ -0,0 +1,26 @@ + + +直方图的 x 轴是灰度值 0 到 255 +y 轴是图片中具有同一个灰度值的 点的数目。 +直方图其实就是对图像的另一种 解释 。 直方图我们可以 对图像的对比度 亮度 灰度分布等有一个直观的认识。 + +直方图是根据灰度图像绘制的 而不是彩色图像 + +BINS 上 的直方图显示了每个灰度值对应的像素数。如果像素值为 0 到 255 你就 256 个数来显示上 的直方图。 + +DIMS 示我们收 数据的参数数目。在本例中 我们对收 到的数据 只考 一件事 灰度值。所以 就是 1。 +RANGE 就是 统 的灰度值范围 一般来 为 [0 256] 也就是 所 有的灰度值 + +cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) +1. images: 原图像 图像格式为 uint8 或 float32 。当传入函数时应 +用中括号 [] 括 来 例如 [img]。 +2. channels: 同样 用中括号括 来 它会告 函数我们 统 幅图 像的直方图。如果 入图像是灰度图 它的值就是 [0] 如果是彩色图像 的 传入的参数可以是 [0] [1] [2] 它们分别对应着 B G R。 +3. mask: 掩模图像。 统 整幅图像的直方图就把它 为 None。但是如 果你想统 图像某一 分的直方图的 你就 制作一个掩模图像 并 使用它。 后 有例子 +4. histSize:BIN 的数目。也应 用中括号括 来 例如 [256]。 +5. ranges: 像素值范围 常为 [0 256] + + +使用 Numpy 统 直方图 Numpy 中的函数 np.histogram() 也可以帮 我们统 直方图。你也可以尝 一下下 的代码 +hist 与上 算的一样。但是 的 bins 是 257 因为 Numpy 算 bins 的方式为 0-0.99,1-1.99,2-2.99 等。所以最后一个范围是 255-255.99。 为了 示它 所以在 bins 的结尾加上了 256。但是我们不 256 到 255 就够了。 +#img.ravel() 将图像 成一维数组 没有中括号。 +hist,bins = np.histogram(img.ravel(),256,[0,256]) \ No newline at end of file diff --git "a/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/23.1.3 DFT \347\232\204\346\200\247\350\203\275\344\274\230\345\214\226.py" "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/23.1.3 DFT \347\232\204\346\200\247\350\203\275\344\274\230\345\214\226.py" new file mode 100644 index 00000000..e8db80a5 --- /dev/null +++ "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/23.1.3 DFT \347\232\204\346\200\247\350\203\275\344\274\230\345\214\226.py" @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 上午11:12 +# @Author : play4fun +# @File : 23.1.3 DFT 的性能优化.py +# @Software: PyCharm + +""" +23.1.3 DFT 的性能优化.py: +""" +import numpy as np + +# In [16]: img = cv2.imread('messi5.jpg',0) +# In [17]: rows,cols = img.shape +# In [18]: print rows,cols +# 342 548 +# In [19]: nrows = cv2.getOptimalDFTSize(rows) +# In [20]: ncols = cv2.getOptimalDFTSize(cols) +# In [21]: print nrows, ncols +# 360 57 + +nimg = np.zeros((nrows,ncols)) +nimg[:rows,:cols] = img + +#或者 +right = ncols - cols +bottom = nrows - rows +#just to avoid line breakup in PDF file +bordertype = cv2.BORDER_CONSTANT +nimg = cv2.copyMakeBorder(img,0,bottom,0,right,bordertype, value = 0) + +#现在我们看看 Numpy 的 现 + +In [22]: %timeit fft1 = np.fft.fft2(img) +10 loops, best of 3: 40.9 ms per loop +In [23]: %timeit fft2 = np.fft.fft2(img,[nrows,ncols]) +100 loops, best of 3: 10.4 ms per loop + +# 度提 了 4 倍。我们再看看 OpenCV 的 现 +In [24]: %timeit dft1= cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT) +100 loops, best of 3: 13.5 ms per loop + +In [27]: %timeit dft2= cv2.dft(np.float32(nimg),flags=cv2.DFT_COMPLEX_OUTPUT) +100 loops, best of 3: 3.11 ms per loop diff --git "a/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/23.1.4 \344\270\272\344\273\200\344\271\210\346\213\211\346\231\256\346\213\211\346\226\257\347\256\227\345\255\220\346\230\257\351\253\230\351\200\232\346\273\244\346\263\242\345\231\250.py" "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/23.1.4 \344\270\272\344\273\200\344\271\210\346\213\211\346\231\256\346\213\211\346\226\257\347\256\227\345\255\220\346\230\257\351\253\230\351\200\232\346\273\244\346\263\242\345\231\250.py" new file mode 100644 index 00000000..66d51cde --- /dev/null +++ "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/23.1.4 \344\270\272\344\273\200\344\271\210\346\213\211\346\231\256\346\213\211\346\226\257\347\256\227\345\255\220\346\230\257\351\253\230\351\200\232\346\273\244\346\263\242\345\231\250.py" @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 上午11:18 +# @Author : play4fun +# @File : 23.1.4 为什么拉普拉斯算子是高通滤波器.py +# @Software: PyCharm + +""" +23.1.4 为什么拉普拉斯算子是高通滤波器.py: +从图像中我们就可以看出每一个算子允 些信号。从 些信息中我 们就可以知 些是 HPF 是 LPF +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +# simple averaging filter without scaling parameter +mean_filter = np.ones((3, 3)) +# creating a guassian filter +x = cv2.getGaussianKernel(5, 10) + +gaussian = x * x.T +# different edge detecting filters +# scharr in x-direction +scharr = np.array([[-3, 0, 3], + [-10, 0, 10], + [-3, 0, 3]]) +# sobel in x direction +sobel_x = np.array([[-1, 0, 1], + [-2, 0, 2], + [-1, 0, 1]]) +# sobel in y direction +sobel_y = np.array([[-1, -2, -1], + [0, 0, 0], + [1, 2, 1]]) +# laplacian +laplacian = np.array([[0, 1, 0], + [1, -4, 1], + [0, 1, 0]]) +filters = [mean_filter, gaussian, laplacian, sobel_x, sobel_y, scharr] +filter_name = ['mean_filter', 'gaussian', 'laplacian', 'sobel_x', 'sobel_y', 'scharr_x'] + +fft_filters = [np.fft.fft2(x) for x in filters] +fft_shift = [np.fft.fftshift(y) for y in fft_filters] +mag_spectrum = [np.log(np.abs(z) + 1) for z in fft_shift] + +for i in range(6): + plt.subplot(2, 3, i + 1), plt.imshow(mag_spectrum[i], cmap='gray') + plt.title(filter_name[i]), plt.xticks([]), plt.yticks([]) +plt.show() diff --git "a/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/OpenCV\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242-DFT.py" "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/OpenCV\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242-DFT.py" new file mode 100644 index 00000000..65f1210c --- /dev/null +++ "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/OpenCV\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242-DFT.py" @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 上午10:59 +# @Author : play4fun +# @File : OpenCV中的傅里叶变换-DFT.py +# @Software: PyCharm + +""" +OpenCV中的傅里叶变换-DFT.py: +OpenCV 中相应的函数是 cv2.dft() 和 cv2.idft()。和前 出的结果 一样 但是是双通道的。 +第一个通道是结果的实数部 分 +第二个通道是结果的虚数部分。 +输入图像 先 换成 np.float32 格式 + +使用函数 cv2.cartToPolar() 它会同时返回幅度和相位。 + +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('../data/messi5.jpg', 0) + +dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) + +dft_shift = np.fft.fftshift(dft) +magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) + +plt.subplot(121), plt.imshow(img, cmap='gray') +plt.title('Input Image'), plt.xticks([]), plt.yticks([]) +plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray') +plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) +plt.show() diff --git "a/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/OpenCV\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242-\351\200\206DFT.py" "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/OpenCV\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242-\351\200\206DFT.py" new file mode 100644 index 00000000..81d602c6 --- /dev/null +++ "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/OpenCV\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242-\351\200\206DFT.py" @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 上午11:03 +# @Author : play4fun +# @File : OpenCV中的傅里叶变换-逆DFT.py +# @Software: PyCharm + +""" +OpenCV中的傅里叶变换-逆DFT.py: +在前 的 分我们实现了一个 HPF 高通滤波 现在我们来做 LPF 低通滤波 将高频分去除。其实就是对图像进行模糊操作。 + 首先我们 构建一个掩模 与低 区域对应的地方 置为 1, 与 区域 对应的地方 置为 0。 +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('../data/messi5.jpg', 0) + +dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) + +dft_shift = np.fft.fftshift(dft) + +rows, cols = img.shape +crow, ccol = int(rows / 2), int(cols / 2) + +# create a mask first, center square is 1, remaining all zeros +mask = np.zeros((rows, cols, 2), np.uint8) +mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1 + +# apply mask and inverse DFT +fshift = dft_shift * mask +f_ishift = np.fft.ifftshift(fshift) +img_back = cv2.idft(f_ishift) +img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1]) + +plt.subplot(121), plt.imshow(img, cmap='gray') +plt.title('Input Image'), plt.xticks([]), plt.yticks([]) +plt.subplot(122), plt.imshow(img_back, cmap='gray') +plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) +plt.show() diff --git "a/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/fftshift-Numpy\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242.py" "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/fftshift-Numpy\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242.py" new file mode 100755 index 00000000..12ee7710 --- /dev/null +++ "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/fftshift-Numpy\344\270\255\347\232\204\345\202\205\351\207\214\345\217\266\345\217\230\346\215\242.py" @@ -0,0 +1,27 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-24 下午5:42 + +函数 np.fft.fft2() 可以对信号 率 换 出结果是一个复杂的数组。 +第一个参数是 入图像 求是灰 度格式。 +第二个参数是可 的, 决定 出数组的大小。 + 输出数组的大小和输入图像大小一样。如果输出结果比输入图像大 + 输入图像就需要在进行 FFT 前补0。如果输出结果比输入图像小的话 输入图像就会被切割。 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/messi5.jpg', 0) +f = np.fft.fft2(img) +fshift = np.fft.fftshift(f) +# 这里构建振幅图的公式没学过 +magnitude_spectrum = 20 * np.log(np.abs(fshift)) + +plt.subplot(121), plt.imshow(img, cmap='gray') +plt.title('Input Image'), plt.xticks([]), plt.yticks([]) +plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray') +plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) +plt.show() diff --git "a/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/fftshift-abs-Numpy.py" "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/fftshift-abs-Numpy.py" new file mode 100755 index 00000000..8f252286 --- /dev/null +++ "b/ch23-\345\233\276\345\203\217\345\217\230\346\215\242/fftshift-abs-Numpy.py" @@ -0,0 +1,38 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-24 下午5:42 + +现在我们可以 域变换了 我们就可以在 域对图像 一些操 作了 例如 滤波和 建图像 DFT 的 变换 。比如我们可以使用一个 60x60 的矩形窗口对图像 掩模操作从而去 低 分 。然后再使用函数 np.fft.ifftshift() 平移操作 所以现在直流分 又回到左上 了 左 后使用函数 np.ifft2() FFT 变换。同样又得到一堆复杂的数字 我们 可以对他们取绝对值 + +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/messi5.jpg', 0) +f = np.fft.fft2(img) +fshift = np.fft.fftshift(f) + +rows, cols = img.shape +crow, ccol = int(rows / 2), int(cols / 2) +fshift[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0 +f_ishift = np.fft.ifftshift(fshift) +img_back = np.fft.ifft2(f_ishift) +# 取绝对值 +img_back = np.abs(img_back) + +plt.subplot(131), plt.imshow(img, cmap='gray') +plt.title('Input Image'), plt.xticks([]), plt.yticks([]) +plt.subplot(132), plt.imshow(img_back, cmap='gray') +plt.title('Image after HPF'), plt.xticks([]), plt.yticks([]) +plt.subplot(133), plt.imshow(img_back) +plt.title('Result in JET'), plt.xticks([]), plt.yticks([]) +plt.show() + +''' +如果你 察仔细的 尤其是最后一章 JET 色的图像 你会看到一些不 自然的东 如我用红色箭头标出的区域 。看上图 有些条带 的结构 成为振铃效应。 + 这是由于我们使用矩形窗口做掩模 成的。 个掩模 换 成正弦形状时就会出现 个 。所以一般我们不 用矩形窗口滤波。最好的 择是高斯窗口。 + +''' diff --git a/ch23/fftshift-abs.py b/ch23/fftshift-abs.py deleted file mode 100755 index 9b3be0c4..00000000 --- a/ch23/fftshift-abs.py +++ /dev/null @@ -1,30 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-24 下午5:42 -""" - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img = cv2.imread('../data/messi5.jpg',0) -f = np.fft.fft2(img) -fshift = np.fft.fftshift(f) - - -rows, cols = img.shape -crow,ccol = rows/2 , cols/2 -fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 -f_ishift = np.fft.ifftshift(fshift) -img_back = np.fft.ifft2(f_ishift) -# 取绝对值 -img_back = np.abs(img_back) - -plt.subplot(131),plt.imshow(img, cmap = 'gray') -plt.title('Input Image'), plt.xticks([]), plt.yticks([]) -plt.subplot(132),plt.imshow(img_back, cmap = 'gray') -plt.title('Image after HPF'), plt.xticks([]), plt.yticks([]) -plt.subplot(133),plt.imshow(img_back) -plt.title('Result in JET'), plt.xticks([]), plt.yticks([]) -plt.show() \ No newline at end of file diff --git a/ch23/fftshift.py b/ch23/fftshift.py deleted file mode 100755 index 228fc856..00000000 --- a/ch23/fftshift.py +++ /dev/null @@ -1,21 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-24 下午5:42 -""" - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img = cv2.imread('../data/messi5.jpg',0) -f = np.fft.fft2(img) -fshift = np.fft.fftshift(f) -#这里构建振幅图的公式没学过 -magnitude_spectrum = 20*np.log(np.abs(fshift)) - -plt.subplot(121),plt.imshow(img, cmap = 'gray') -plt.title('Input Image'), plt.xticks([]), plt.yticks([]) -plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray') -plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) -plt.show() \ No newline at end of file diff --git "a/ch24-\346\250\241\346\235\277\345\214\271\351\205\215/24.1-OpenCV\344\270\255\347\232\204\346\250\241\346\235\277\345\214\271\351\205\215-matchTemplate.py" "b/ch24-\346\250\241\346\235\277\345\214\271\351\205\215/24.1-OpenCV\344\270\255\347\232\204\346\250\241\346\235\277\345\214\271\351\205\215-matchTemplate.py" new file mode 100755 index 00000000..7ea2e7ad --- /dev/null +++ "b/ch24-\346\250\241\346\235\277\345\214\271\351\205\215/24.1-OpenCV\344\270\255\347\232\204\346\250\241\346\235\277\345\214\271\351\205\215-matchTemplate.py" @@ -0,0 +1,57 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-24 下午5:46 +原理 +模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。OpenCV 为 我们提供了函数 cv2.matchTemplate()。 +和 2D 卷积一样 它也是用模板图像在输入图像 大图 上滑动 并在每一个位置对模板图像和与其对应的 输入图像的子区域 比较。 +OpenCV 提供了几种不同的比较方法 细节 看 文档 。 +返回的结果是一个灰度图像 每一个像素值 示了此区域与模板的匹配 程度。 +如果输入图像的大小是 WxH +模板的大小是 wxh 输出的结果 的大小就是 W-w+1 H-h+1 。 +当你得到这幅图之后 就可以使用函数 cv2.minMaxLoc() 来找到其中的最小值和最大值的位置了。 +第一个值为矩形左上角的点 位置 +w h 为 moban 模板矩形的宽和 。 +这个矩形就是 找到的模板区域了。 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + +img = cv2.imread('../data/messi5.jpg', 0) +img2 = img.copy() +template = cv2.imread('../data/messi_face.jpg', 0) + +w, h = template.shape[::-1] +# All the 6 methods for comparison in a list +methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', + 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'] + +for meth in methods: + img = img2.copy() + + # exec 语句用来执行储存在字符串或文件中的 Python 语句。 + # 例如,我们可以在运行时生成一个包含 Python 代码的字符串, + # 然后使用 exec 语句执行这些语句。 + # eval 语句用来计算存储在字符串中的有效 Python 表达式 + method = eval(meth) + # Apply template Matching + res = cv2.matchTemplate(img, template, method) + min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) + # 使用不同的比较方法,对结果的解释不同 + # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum + if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]: + top_left = min_loc + else: + top_left = max_loc + + bottom_right = (top_left[0] + w, top_left[1] + h) + cv2.rectangle(img, top_left, bottom_right, 255, 2) + + plt.subplot(121), plt.imshow(res, cmap='gray') + plt.title('Matching Result'), plt.xticks([]), plt.yticks([]) + plt.subplot(122), plt.imshow(img, cmap='gray') + plt.title('Detected Point'), plt.xticks([]), plt.yticks([]) + plt.suptitle('method: ' + meth) + plt.show() diff --git "a/ch24-\346\250\241\346\235\277\345\214\271\351\205\215/24.2-\345\244\232\345\257\271\350\261\241\347\232\204\346\250\241\346\235\277\345\214\271\351\205\215-Multiple-Objects.py" "b/ch24-\346\250\241\346\235\277\345\214\271\351\205\215/24.2-\345\244\232\345\257\271\350\261\241\347\232\204\346\250\241\346\235\277\345\214\271\351\205\215-Multiple-Objects.py" new file mode 100755 index 00000000..e62efbfa --- /dev/null +++ "b/ch24-\346\250\241\346\235\277\345\214\271\351\205\215/24.2-\345\244\232\345\257\271\350\261\241\347\232\204\346\250\241\346\235\277\345\214\271\351\205\215-Multiple-Objects.py" @@ -0,0 +1,29 @@ +''' +假如你的目标对 只在图像中出现了很多次怎么办呢 +函数 cv.imMaxLoc() 只会给出最大值和最小值。此时 我们就 使用阈值了。 +在下 的例子中我们 经典游戏 Mario 的一张截屏图片中找到其中的硬币 + +''' + +import cv2 +import numpy as np + +# from matplotlib import pyplot as plt + +img_rgb = cv2.imread('../data/mario.png') +img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) +template = cv2.imread('../data/mario_coin.png', 0) +w, h = template.shape[::-1] + +res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) +threshold = 0.8 +loc = np.where(res >= threshold) +print(len(loc)) + +for pt in zip(*loc[::-1]): + cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2) + print("rectangle 1") + +# cv2.imwrite('res.png',img_rgb) +cv2.imshow("result", img_rgb) +cv2.waitKey(0) diff --git a/ch24/Multiple-Objects.py b/ch24/Multiple-Objects.py deleted file mode 100755 index 4812aa4c..00000000 --- a/ch24/Multiple-Objects.py +++ /dev/null @@ -1,20 +0,0 @@ -import cv2 -import numpy as np -# from matplotlib import pyplot as plt - -img_rgb = cv2.imread('../data/mario.png') -img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) -template = cv2.imread('../data/mario_coin.png',0) -w, h = template.shape[::-1] - -res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) -threshold = 0.8 -loc = np.where( res >= threshold) -print len(loc) -for pt in zip(*loc[::-1]): - cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,0), 2) - print "rectangle 1" - -# cv2.imwrite('res.png',img_rgb) -cv2.imshow("result",img_rgb) -cv2.waitKey(0) \ No newline at end of file diff --git a/ch24/matchTemplate.py b/ch24/matchTemplate.py deleted file mode 100755 index d59f9c2e..00000000 --- a/ch24/matchTemplate.py +++ /dev/null @@ -1,44 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-24 下午5:46 -""" - - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -img = cv2.imread('../data/messi5.jpg',0) -img2 = img.copy() -template = cv2.imread('../data/messi_face.jpg',0) - -w, h = template.shape[::-1] -# All the 6 methods for comparison in a list -methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', - 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'] -for meth in methods: - img = img2.copy() - -#exec 语句用来执行储存在字符串或文件中的 Python 语句。 -# 例如,我们可以在运行时生成一个包含 Python 代码的字符串, -# 然后使用 exec 语句执行这些语句。 -# eval 语句用来计算存储在字符串中的有效 Python 表达式 - method = eval(meth) - # Apply template Matching - res = cv2.matchTemplate(img,template,method) - min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) - # 使用不同的比较方法,对结果的解释不同 - # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum - if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]: - top_left = min_loc - else: - top_left = max_loc - bottom_right = (top_left[0] + w, top_left[1] + h) - cv2.rectangle(img,top_left, bottom_right, 255, 2) - plt.subplot(121),plt.imshow(res,cmap = 'gray') - plt.title('Matching Result'), plt.xticks([]), plt.yticks([]) - plt.subplot(122),plt.imshow(img,cmap = 'gray') - plt.title('Detected Point'), plt.xticks([]), plt.yticks([]) - plt.suptitle(meth) - plt.show() \ No newline at end of file diff --git "a/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/25.1-OpenCV\344\270\255\347\232\204\351\234\215\345\244\253\345\217\230\346\215\242-HoughLines.py" "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/25.1-OpenCV\344\270\255\347\232\204\351\234\215\345\244\253\345\217\230\346\215\242-HoughLines.py" new file mode 100755 index 00000000..b825a956 --- /dev/null +++ "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/25.1-OpenCV\344\270\255\347\232\204\351\234\215\345\244\253\345\217\230\346\215\242-HoughLines.py" @@ -0,0 +1,45 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-25 上午11:42 + +cv2.HoughLines()。 返回值就是 ρ, θ 。 +ρ 的单位是像素 θ 的单位是弧度。 +第一个参数是一个二值化图像 所以在进行霍夫变换之前 先进行 二值化 或者 +Canny 缘检测。 +第二和第三个值分别代 ρ 和 θ 的精确度。 +第四个参数是阈值, 只有累加其中的值高于阈值时才被认为是一条直线 +也可以把它看成能检测到的直线的最短长度 以像素点为单位 。 +""" + +import cv2 +import numpy as np + +img = cv2.imread('../data/sudoku.jpg') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +# edges = cv2.Canny(gray,50,150,apertureSize = 3) +edges = cv2.Canny(gray, 10, 50, apertureSize=3) +cv2.imshow("edges", edges) + +lines = cv2.HoughLines(edges, 1, np.pi / 180, 200) +print("Len of lines:", len(lines)) +# print lines + +for line in lines: + rho, theta = line[0] + a = np.cos(theta) + b = np.sin(theta) + x0 = a * rho + y0 = b * rho + x1 = int(x0 + 1000 * (-b)) + y1 = int(y0 + 1000 * (a)) + x2 = int(x0 - 1000 * (-b)) + y2 = int(y0 - 1000 * (a)) + cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) + + # cv2.imwrite('houghlines3.jpg',img) + cv2.imshow("houghlines3.jpg", img) + cv2.waitKey(1000) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/25.2-Probabilistic-Hough-Transform-HoughLinesP.py" "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/25.2-Probabilistic-Hough-Transform-HoughLinesP.py" new file mode 100755 index 00000000..5a3116c4 --- /dev/null +++ "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/25.2-Probabilistic-Hough-Transform-HoughLinesP.py" @@ -0,0 +1,27 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-25 上午11:53 +""" + +import cv2 +import numpy as np + +img = cv2.imread('../data/sudoku.jpg') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +edges = cv2.Canny(gray, 50, 150, apertureSize=3) + +minLineLength = 100 +maxLineGap = 10 + +lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength, maxLineGap) +print("Len of lines:", len(lines)) +print(lines) + +for line in lines: + x1, y1, x2, y2 = line[0] + cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2) + +# cv2.imwrite('houghlines5.jpg',img) +cv2.imshow("houghlines3.jpg", img) +cv2.waitKey(0) diff --git "a/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/HoughLinesP_camera.py" "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/HoughLinesP_camera.py" new file mode 100644 index 00000000..248f8522 --- /dev/null +++ "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/HoughLinesP_camera.py" @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/9 下午12:01 +# @Author : play4fun +# @File : HoughLinesP_camera.py +# @Software: PyCharm + +""" +HoughLinesP_camera.py: +""" + +import cv2 +import numpy as np + +cap = cv2.VideoCapture(0) +# ret = cap.set(3, 640) +# ret = cap.set(4, 480) + +# while (True): +while cap.isOpened(): + # Capture frame-by-frame + ret, frame = cap.read() + # img = cv2.imread('../data/sudoku.jpg') + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + edges = cv2.Canny(gray, 50, 150, apertureSize=3) + + minLineLength = 100 + maxLineGap = 10 + lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength, maxLineGap) + if lines is None: + continue + print("Len of lines:", len(lines)) + print(lines) + + for line in lines: + x1, y1, x2, y2 = line[0] + cv2.line(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) + + # cv2.imwrite('houghlines5.jpg',img) + cv2.imshow("houghlines3.jpg", frame) + + key = cv2.waitKey(1) + if key == ord("q"): + break + +# When everything done, release the capture +cap.release() +cv2.destroyAllWindows() diff --git "a/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/LineSegmentDetector1.py" "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/LineSegmentDetector1.py" new file mode 100644 index 00000000..5bb9fe78 --- /dev/null +++ "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/LineSegmentDetector1.py" @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/26 23:42 +# @Author : play4fun +# @File : LineSegmentDetector1.py +# @Software: PyCharm + +""" +LineSegmentDetector1.py: +""" +import cv2 +import numpy as np + +# Read gray image +img0 = cv2.imread("pokerQ.jpg") +img = cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY) +cv2.imshow('pokerQ',img0) + +# Create default parametrization LSD +lsd = cv2.createLineSegmentDetector(0) + +# Detect lines in the image +dlines = lsd.detect(img)#TODO 返回什么? +lines = lsd.detect(img)[0] # Position 0 of the returned tuple are the detected lines + +# Draw detected lines in the image +# drawn_img = lsd.drawSegments(img, lines) + +# +cv2.waitKey(0) +for dline in dlines[0]: + x0 = int(round(dline[0][0])) + y0 = int(round(dline[0][1])) + x1 = int(round(dline[0][2])) + y1 = int(round(dline[0][3])) + cv2.line(img0, (x0, y0), (x1,y1), (0,255,0), 1, cv2.LINE_AA) + cv2.imshow("LSD", img0) + cv2.waitKey(200) + +#TODO 最长的直线? + +# Show image +# cv2.imshow("LSD", drawn_img) +# cv2.imshow("LSD", img0) +# cv2.waitKey(0) +cv2.destroyAllWindows() \ No newline at end of file diff --git "a/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/pokerQ.jpg" "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/pokerQ.jpg" new file mode 100644 index 00000000..e6b08b31 Binary files /dev/null and "b/ch25-Hough\347\233\264\347\272\277\345\217\230\346\215\242/pokerQ.jpg" differ diff --git "a/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob.jpg" "b/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob.jpg" new file mode 100644 index 00000000..a1f76c3d Binary files /dev/null and "b/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob.jpg" differ diff --git "a/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob.py" "b/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob.py" new file mode 100755 index 00000000..fda0aca2 --- /dev/null +++ "b/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob.py" @@ -0,0 +1,51 @@ +#!/usr/bin/python + +# Standard imports +import cv2 +import numpy as np; + +# Read image +im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE) + +# Setup SimpleBlobDetector parameters. +params = cv2.SimpleBlobDetector_Params() + +# Change thresholds +params.minThreshold = 10 +params.maxThreshold = 200 + +# Filter by Area. +params.filterByArea = True +params.minArea = 1500 + +# Filter by Circularity +params.filterByCircularity = True +params.minCircularity = 0.1 + +# Filter by Convexity +params.filterByConvexity = True +params.minConvexity = 0.87 + +# Filter by Inertia +params.filterByInertia = True +params.minInertiaRatio = 0.01 + +# Create a detector with the parameters +ver = (cv2.__version__).split('.') +if int(ver[0]) < 3: + detector = cv2.SimpleBlobDetector(params) +else: + detector = cv2.SimpleBlobDetector_create(params) + +# Detect blobs. +keypoints = detector.detect(im) + +# Draw detected blobs as red circles. +# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures +# the size of the circle corresponds to the size of blob + +im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) + +# Show blobs +cv2.imshow("Keypoints", im_with_keypoints) +cv2.waitKey(0) diff --git "a/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob_camera.py" "b/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob_camera.py" new file mode 100644 index 00000000..b6bb330a --- /dev/null +++ "b/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/blob_camera.py" @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/24 下午5:03 +# @Author : play4fun +# @File : blob_camera.py +# @Software: PyCharm + +""" +blob_camera.py: +""" + +import cv2 +import numpy as np + +# Read image +# im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE) +# Set up the detector with default parameters. +detector = cv2.SimpleBlobDetector_create() + +cap = cv2.VideoCapture(0) +while cap.isOpened(): # 检查是否成功初始化,否则就 使用函数 cap.open() + # Capture frame-by-frame + ret, frame = cap.read() + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # Detect blobs. + keypoints = detector.detect(gray) + # Draw detected blobs as red circles. + # cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob + im_with_keypoints = cv2.drawKeypoints(frame, keypoints, np.array([]), (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) + + # Show keypoints + cv2.imshow("Keypoints", im_with_keypoints) + + key = cv2.waitKey(delay=1) + if key == ord("q"): + break + +cv2.destroyAllWindows() diff --git "a/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/\346\226\221\347\202\271\346\243\200\346\265\213SimpleBlobDetector.py" "b/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/\346\226\221\347\202\271\346\243\200\346\265\213SimpleBlobDetector.py" new file mode 100644 index 00000000..573ccfb5 --- /dev/null +++ "b/ch25-\346\226\221\347\202\271\346\243\200\346\265\213/\346\226\221\347\202\271\346\243\200\346\265\213SimpleBlobDetector.py" @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/24 下午4:51 +# @Author : play4fun +# @File : 斑点检测SimpleBlobDetector.py +# @Software: PyCharm + +""" +斑点检测SimpleBlobDetector.py: +https://www.learnopencv.com/blob-detection-using-opencv-python-c/ + +特别要注意,默认检测黑色点,如果要检测白色的点请设置bycolor为true,并且color数值是255. + + +斑点通常是指与周围有着颜色和灰度差别的区域。在实际地图中,往往存在着大量这样的斑点,如一颗树是一个斑点,一块草地是一个斑点,一栋房子也可以是一个斑点。由于斑点代表的是一个区域,相比单纯的角点,它的稳定性要好,抗噪声能力要强,所以它在图像配准上扮演了很重要的角色。 + +同时有时图像中的斑点也是我们关心的区域,比如在医学与生物领域,我们需要从一些X光照片或细胞显微照片中提取一些具有特殊意义的斑点的位置或数量。 + +比如下图中天空的飞机、向日葵的花盘、X线断层图像中的两个斑点。 + +""" + +# Standard imports +import cv2 +import numpy as np + +# Read image +im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE) +# Set up the detector with default parameters. +detector = cv2.SimpleBlobDetector_create() +# Detect blobs. +keypoints = detector.detect(im) +# Draw detected blobs as red circles. +# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob +im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) +# Show keypoints +cv2.imshow("Keypoints", im_with_keypoints) +cv2.waitKey(0) diff --git a/ch25/HoughLines.py b/ch25/HoughLines.py deleted file mode 100755 index 4f397151..00000000 --- a/ch25/HoughLines.py +++ /dev/null @@ -1,33 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-25 上午11:42 -""" - -import cv2 -import numpy as np - -img = cv2.imread('../data/sudoku.jpg') -gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) -# edges = cv2.Canny(gray,50,150,apertureSize = 3) -edges = cv2.Canny(gray,10,50,apertureSize = 3) -cv2.imshow("edges",edges) -lines = cv2.HoughLines(edges,1,np.pi/180,200) -print "Len of lines:",len(lines) -# print lines - -for line in lines: - rho,theta=line[0] - a = np.cos(theta) - b = np.sin(theta) - x0 = a*rho - y0 = b*rho - x1 = int(x0 + 1000*(-b)) - y1 = int(y0 + 1000*(a)) - x2 = int(x0 - 1000*(-b)) - y2 = int(y0 - 1000*(a)) - cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) - -# cv2.imwrite('houghlines3.jpg',img) -cv2.imshow("houghlines3.jpg",img) -cv2.waitKey(0) \ No newline at end of file diff --git a/ch25/HoughLinesP.py b/ch25/HoughLinesP.py deleted file mode 100755 index f3bb41ab..00000000 --- a/ch25/HoughLinesP.py +++ /dev/null @@ -1,27 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-25 上午11:53 -""" - -import cv2 -import numpy as np - - -img = cv2.imread('../data/sudoku.jpg') -gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) -edges = cv2.Canny(gray,50,150,apertureSize = 3) - -minLineLength = 100 -maxLineGap = 10 -lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap) -print "Len of lines:",len(lines) -print lines - - -for line in lines: - x1,y1,x2,y2=line[0] - cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) -# cv2.imwrite('houghlines5.jpg',img) -cv2.imshow("houghlines3.jpg",img) -cv2.waitKey(0) \ No newline at end of file diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/4HDL7T.jpg" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/4HDL7T.jpg" new file mode 100644 index 00000000..6e6ec742 Binary files /dev/null and "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/4HDL7T.jpg" differ diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles.py" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles.py" index 4c837b2a..8cd8d14a 100755 --- "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles.py" +++ "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles.py" @@ -2,6 +2,18 @@ __author__ = 'play4fun' """ create time:15-10-25 下午12:02 +一个圆环 需要 3 个参数来确定。所以进行圆环 夫变换的累加器必须是 3 维的 + 这样的 效率 就会很低。所以 OpenCV 用来一个比 巧妙的办法 霍夫梯度法 它可以使 用边界的梯度信息。 + +参数: +image: 8位,单通道图像。如果使用彩色图像,请先转换为灰度。 +method:定义检测图像中的圆的方法。目前,唯一实现的方法是cv2.HOUGH_GRADIENT对应于Yuen等。纸。 +dp:该参数是累加器分辨率与图像分辨率的反比(详见Yuen等人)。实质上,dp获取越大,累加器数组越小。 +minDist:检测到的圆的中心(x,y)坐标之间的最小距离。如果minDist太小,则可能(错误地)检测到与原始相邻的多个圆。如果minDist太大,那么一些圈子根本就不会被检测到。 +param1: Yuen等人用于处理边缘检测的梯度值 方法。 +param2:该cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小,检测到的圈子越多(包括虚假圈子)。阈值越大,可能会返回的圈数越多。 +minRadius:半径的最小大小(以像素为单位)。 +maxRadius:半径的最大大小(以像素为单位)。 """ import cv2 @@ -11,15 +23,18 @@ img = cv2.medianBlur(img, 5) cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) +#HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None) circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) + circles = np.uint16(np.around(circles)) -print circles +print(circles) for i in circles[0, :]: # draw the outer circle cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2) # draw the center of the circle cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3) + cv2.imshow('detected circles', cimg) cv2.waitKey(0) cv2.destroyAllWindows() diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_camera.py" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_camera.py" new file mode 100644 index 00000000..a5dfe1b1 --- /dev/null +++ "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_camera.py" @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/27 13:47 +# @Author : play4fun +# @File : HoughCircles_camera.py +# @Software: PyCharm + +""" +HoughCircles_camera.py: + +用围棋-棋子来测试 +""" + +import cv2 +import numpy as np +from skimage.measure import compare_mse as mse +import string, random + + +def id_generator(size=6, chars=string.ascii_uppercase + string.digits): + return ''.join(random.choice(chars) for _ in range(size)) + + +cap = cv2.VideoCapture(0) + +# ret = cap.set(3, 640) +# ret = cap.set(4, 480) + +# margin = 60 +margin = 30 + + +def draw_line_rectangle(frame, margin): + rows, cols, ch = frame.shape # (720, 1280, 3) + half = int(cols / 2) + # 中间 + cv2.line(frame, (half, 0), (half, rows), (0, 0, 255), 2) + + # margin = 40 + # 左边 + up_left1 = (margin, margin) # 左上点 + down_right1 = (cols - margin, rows - margin) # 右下点 + # print(up_left, down_right) + cv2.rectangle(frame, up_left1, down_right1, (0, 255, 0), 3) + + +ret, temp = cap.read() +tm = 0 +while cap.isOpened(): + key = cv2.waitKey(1) + if key == ord("q"): + break + if key == ord('s'): + cv2.imwrite(id_generator() + '.jpg', frame2) + + # Capture frame-by-frame + ret, frame = cap.read() + m = mse(cv2.cvtColor(temp, cv2.COLOR_BGR2GRAY), cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)) + print('mse', m, '----\n') + if abs(m - tm) < 2: # 静止画面,不用重复计算 + continue + else: + temp = frame.copy() + tm = m + # + # print(margin,frame.shape[0] - margin, margin,frame.shape[1] - margin)#40 680 40 1240 + frame2 = frame[margin:frame.shape[0] - margin, margin:frame.shape[1] - margin] # .copy() + # cv2.imshow('frame2', frame2) + + gray = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) + # edges = cv2.Canny(gray, 50, 150, apertureSize=3) + + # HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None) + # circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) + circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=100, param2=30, minRadius=10, maxRadius=40) + + # circles = circles1[0, :, :] # 提取为二维 + # circles = np.uint16(np.around(circles1)) + print(circles) + + cimg = frame2 + if circles is not None: + for i in circles[0, :]: + # for i in circles[:]: + # draw the outer circle + cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2) + # draw the center of the circle + cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3) + + # cv2.imshow('detected circles', cimg) + + draw_line_rectangle(frame, margin) + cv2.imshow("houghlines", frame) + # cv2.imwrite('frame3.jpg', frame[margin:frame.shape[0] - margin, margin:frame.shape[1] - margin]) + +# When everything done, release the capture +cap.release() +cv2.destroyAllWindows() diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_chess.py" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_chess.py" new file mode 100644 index 00000000..e5b0bb23 --- /dev/null +++ "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_chess.py" @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/28 11:05 +# @Author : play4fun +# @File : HoughCircles_chess.py +# @Software: PyCharm + +""" +HoughCircles_chess.py: +围棋 +""" + +import cv2 +import numpy as np +from collections import Counter + + +def detect_weiqi(img): # 检测棋子的颜色 + txt = 'black' + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + ret, threshold = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY) + + c = Counter(list(threshold.flatten())) + print(c.most_common()) + if c.most_common()[0][0] != 0: + txt = 'white' + return txt, threshold + + +img = cv2.imread('../data/weiqi.png') + +img = cv2.medianBlur(img, 5) +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +# ret, threshold = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)#不行 +cv2.imshow('gray', gray) +# cv2.imshow('threshold', threshold) +# cv2.waitKey(0) + +# HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None) +# circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=10, maxRadius=40)#有一些没有检测到 +circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=100, param2=30, minRadius=10, maxRadius=50) + +if circles is None: + exit(-1) + +circles = np.uint16(np.around(circles)) +print(circles) + +cv2.waitKey(0) +font = cv2.FONT_HERSHEY_SIMPLEX +for i in circles[0, :]: + # draw the outer circle + cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2) + # draw the center of the circle + cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3) + + x, y, r = i + crop_img = img[y - r:y + r, x - r:x + r] + # 检测围棋 + txt, threshold = detect_weiqi(crop_img) + print('颜色:', '黑色' if txt == 'black' else '白色') + + cv2.putText(threshold, text=txt, org=(0, 0), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2) + cv2.imshow('threshold', threshold) + + cv2.imshow('crop_img', crop_img) + cv2.moveWindow('crop_img', x=0, y=img.shape[0]) + + cv2.imshow('detected chess', img) + cv2.moveWindow('detected chess', y=0, x=img.shape[1]) + + cv2.waitKey(1500) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_eyes.py" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_eyes.py" new file mode 100644 index 00000000..7a315a43 --- /dev/null +++ "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/HoughCircles_eyes.py" @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/27 10:57 +# @Author : play4fun +# @File : HoughCircles_eyes.py +# @Software: PyCharm + +""" +HoughCircles_eyes.py: + +http://blog.csdn.net/on2way/article/details/47028969 + +""" + +import cv2 +import numpy as np +import matplotlib.pyplot as plt + +img = cv2.imread('eye-color-blue-z-c-660x440.jpg') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像 + +plt.subplot(121), plt.imshow(gray, 'gray') +plt.xticks([]), plt.yticks([]) +# hough transform #规定检测的圆的最大最小半径,不能盲目的检测,否侧浪费时间空间。 +# circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1,100, param1=100, param2=30, minRadius=200, maxRadius=300) +circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=100, maxRadius=200) # 把半径范围调小点,检测内圆,瞳孔 +circles = circles1[0, :, :] # 提取为二维 +circles = np.uint16(np.around(circles)) # 四舍五入,取整 +for i in circles[:]: + cv2.circle(img, (i[0], i[1]), i[2], (255, 0, 0), 5) # 画圆 + cv2.circle(img, (i[0], i[1]), 2, (255, 0, 255), 10) # 画圆心 + +plt.subplot(122), plt.imshow(img) +plt.xticks([]), plt.yticks([]) +plt.show() diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/QJ84BL.jpg" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/QJ84BL.jpg" new file mode 100644 index 00000000..8d7828dc Binary files /dev/null and "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/QJ84BL.jpg" differ diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/TLFOLV.jpg" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/TLFOLV.jpg" new file mode 100644 index 00000000..d1a5698e Binary files /dev/null and "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/TLFOLV.jpg" differ diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/X8IWYE.jpg" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/X8IWYE.jpg" new file mode 100644 index 00000000..323ed1e7 Binary files /dev/null and "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/X8IWYE.jpg" differ diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/__init__.py" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/__init__.py" deleted file mode 100755 index 44336f85..00000000 --- "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/__init__.py" +++ /dev/null @@ -1,7 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-25 下午12:08 -""" - - diff --git "a/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/eye-color-blue-z-c-660x440.jpg" "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/eye-color-blue-z-c-660x440.jpg" new file mode 100644 index 00000000..28b37892 Binary files /dev/null and "b/ch26-Hough\345\234\206\347\216\257\345\217\230\346\215\242/eye-color-blue-z-c-660x440.jpg" differ diff --git "a/ch27-\345\210\206\346\260\264\345\262\255\347\256\227\346\263\225\345\233\276\345\203\217\345\210\206\345\211\262/threshold.py" "b/ch27-\345\210\206\346\260\264\345\262\255\347\256\227\346\263\225\345\233\276\345\203\217\345\210\206\345\211\262/threshold.py" deleted file mode 100755 index f8e7235c..00000000 --- "a/ch27-\345\210\206\346\260\264\345\262\255\347\256\227\346\263\225\345\233\276\345\203\217\345\210\206\345\211\262/threshold.py" +++ /dev/null @@ -1,36 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-25 下午12:09 -""" - - -import numpy as np -import cv2 -from matplotlib import pyplot as plt - - -img = cv2.imread('../data/water_coins.jpg') -gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) -ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) - -# noise removal -kernel = np.ones((3,3),np.uint8) -opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2) - -# sure background area -sure_bg = cv2.dilate(opening,kernel,iterations=3) -# Finding sure foreground area -#距离变换的基本含义是计算一个图像中非像素点到最近的零像素点的距离 -# 也就是到零像素点的最短距离 -# 个最常见的距离变换算法就是通过连续的腐蚀操作来实现, -# 腐蚀操作的停止条件是所有前景像素都被完全腐蚀。 -# 这样根据腐蚀的先后顺序,我们就得到各个前景像素点到前景中心骨架像素点的距离 -# 根据各个像素点的距离值,设置为不同的灰度值。这样就完成了二值图像的距离变换 -#cv2.distanceTransform(src, distanceType, maskSize) -# 第二个参数 0,1,2 分别 示 CV_DIST_L1, CV_DIST_L2 , CV_DIST_C -dist_transform = cv2.distanceTransform(opening,1,5) -ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0) -# Finding unknown region -sure_fg = np.uint8(sure_fg) -unknown = cv2.subtract(sure_bg,sure_fg) \ No newline at end of file diff --git "a/ch27-\345\210\206\346\260\264\345\262\255\347\256\227\346\263\225\345\233\276\345\203\217\345\210\206\345\211\262/watershed.py" "b/ch27-\345\210\206\346\260\264\345\262\255\347\256\227\346\263\225\345\233\276\345\203\217\345\210\206\345\211\262/watershed.py" new file mode 100755 index 00000000..cd44b572 --- /dev/null +++ "b/ch27-\345\210\206\346\260\264\345\262\255\347\256\227\346\263\225\345\233\276\345\203\217\345\210\206\345\211\262/watershed.py" @@ -0,0 +1,70 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-25 下午12:09 + +任何一副灰度图像 可以 看成拓扑平面 +灰度值 的区域可以 看成是 山峰 +灰度值低的区域可以 看成是山谷。 +我们向每一个山谷中灌不同颜色的水。随着水的位的升 不同山谷的水就会相遇汇合 +为了防止不同山 的水 汇合 我们需要在水汇合的地方构建 堤坝。不停的灌水 不停的构建堤坝 +直到所有的山峰都被水淹没。 +我们构建好的堤坝就是对图像的分割。 +这就是分水岭算法的背后哲理。 + +每一次灌水 我们的标签就会 更新 当两个不同 色的标签相 时就构建堤 坝 直到将所有山峰淹没 最后我们得到的 界对 堤坝 的值为 -1 + +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('../data/water_coins.jpg') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) +cv2.imshow('thresh', thresh) + +# noise removal +kernel = np.ones((3, 3), np.uint8) +opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2) + +# sure background area +sure_bg = cv2.dilate(opening, kernel, iterations=3) +# Finding sure foreground area +# 距离变换的基本含义是计算一个图像中非像素点到最近的零像素点的距离 +# 也就是到零像素点的最短距离 +# 个最常见的距离变换算法就是通过连续的腐蚀操作来实现, +# 腐蚀操作的停止条件是所有前景像素都被完全腐蚀。 +# 这样根据腐蚀的先后顺序,我们就得到各个前景像素点到前景中心骨架像素点的距离 +# 根据各个像素点的距离值,设置为不同的灰度值。这样就完成了二值图像的距离变换 +# cv2.distanceTransform(src, distanceType, maskSize) +# 第二个参数 0,1,2 分别 示 CV_DIST_L1, CV_DIST_L2 , CV_DIST_C +dist_transform = cv2.distanceTransform(opening, 1, 5) +ret, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0) +# Finding unknown region +sure_fg = np.uint8(sure_fg) +unknown = cv2.subtract(sure_bg, sure_fg)#图像相减 +cv2.imshow('unknown', unknown) +# 边界 + +# 腐蚀 + + +# Marker labelling创建标签 +ret, markers1 = cv2.connectedComponents(sure_fg) +# Add one to all labels so that sure background is not 0, but 1 +# 把将背景标 为 0 其他的对 使用从 1 开始的正整数标 +markers = markers1 + 1 +# Now, mark the region of unknown with zero +markers[unknown == 255] = 0 + +# cv2.imshow('markers', markers1) + +# 到最后一步 实施分水岭算法了。标签图像将会 修 改 界区域的标 将变为 -1 +markers3 = cv2.watershed(img, markers) +img[markers3 == -1] = [255, 0, 0] + +cv2.imshow('watershed', img) +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch28-\344\275\277\347\224\250GrabCut\347\256\227\346\263\225\350\277\233\350\241\214\344\272\244\344\272\222\345\274\217\345\211\215\346\231\257\346\217\220\345\217\226/grabCut.py" "b/ch28-\344\275\277\347\224\250GrabCut\347\256\227\346\263\225\350\277\233\350\241\214\344\272\244\344\272\222\345\274\217\345\211\215\346\231\257\346\217\220\345\217\226/grabCut.py" index 8e4b39e7..ac630ac0 100755 --- "a/ch28-\344\275\277\347\224\250GrabCut\347\256\227\346\263\225\350\277\233\350\241\214\344\272\244\344\272\222\345\274\217\345\211\215\346\231\257\346\217\220\345\217\226/grabCut.py" +++ "b/ch28-\344\275\277\347\224\250GrabCut\347\256\227\346\263\225\350\277\233\350\241\214\344\272\244\344\272\222\345\274\217\345\211\215\346\231\257\346\217\220\345\217\226/grabCut.py" @@ -2,6 +2,16 @@ __author__ = 'play4fun' """ create time:15-10-25 下午12:20 + + +img - 输入图像 +• mask-掩模图像 用来确定 些区域是背景 前景 可能是前景/背景等。 可以 置为 cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD 或者直接 入 0,1,2,3 也 。 +• rect - 包含前景的矩形 格式为 (x,y,w,h) +• bdgModel, fgdModel - 算法内 使用的数组. 你只 创建两个大 +小为 (1,65) 数据类型为 np.float64 的数组。 +• iterCount - 算法的迭代次数 +• mode可以 置为cv2.GC_INIT_WITH_RECT或cv2.GC_INIT_WITH_MASK 也可以联合使用。 是用来确定我们 修改的方式 矩形模式或者掩模 +模式。 """ import numpy as np @@ -9,12 +19,17 @@ from matplotlib import pyplot as plt img = cv2.imread('../data/messi5.jpg') + mask = np.zeros(img.shape[:2], np.uint8) bgdModel = np.zeros((1, 65), np.float64) fgdModel = np.zeros((1, 65), np.float64) rect = (50, 50, 450, 290) + # 函数的返回值是更新的 mask, bgdModel, fgdModel -cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT) +cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount=5, mode=cv2.GC_INIT_WITH_RECT) +#迭代 5 次 + mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8') img = img * mask2[:, :, np.newaxis] + plt.imshow(img), plt.colorbar(), plt.show() diff --git "a/ch28-\344\275\277\347\224\250GrabCut\347\256\227\346\263\225\350\277\233\350\241\214\344\272\244\344\272\222\345\274\217\345\211\215\346\231\257\346\217\220\345\217\226/grabCut2.py" "b/ch28-\344\275\277\347\224\250GrabCut\347\256\227\346\263\225\350\277\233\350\241\214\344\272\244\344\272\222\345\274\217\345\211\215\346\231\257\346\217\220\345\217\226/grabCut2.py" index f1f11a60..05f354dd 100755 --- "a/ch28-\344\275\277\347\224\250GrabCut\347\256\227\346\263\225\350\277\233\350\241\214\344\272\244\344\272\222\345\274\217\345\211\215\346\231\257\346\217\220\345\217\226/grabCut2.py" +++ "b/ch28-\344\275\277\347\224\250GrabCut\347\256\227\346\263\225\350\277\233\350\241\214\344\272\244\344\272\222\345\274\217\345\211\215\346\231\257\346\217\220\345\217\226/grabCut2.py" @@ -2,6 +2,12 @@ __author__ = 'play4fun' """ create time:15-10-25 下午12:20 +实 上我是怎么做的呢 我们使用图像编 件打开 入图像 +添加一个 图层 +使用笔刷工具在 的地方使用白色绘制 比如头发 子 球等 + 使 用 色笔刷在不 的地方绘制 比如 logo 草地等 。 + 然后将其他地方用灰 色填充 保存成新的掩码图像。 + 在 OpenCV 中导入 个掩模图像 根据新的 掩码图像对原来的掩模图像 编 。 """ import numpy as np @@ -20,12 +26,12 @@ plt.imshow(img), plt.colorbar(), plt.show() # newmask is the mask image I manually labelled -newmask = cv2.imread('../data/newmask.jpg',0) +newmask = cv2.imread('../data/newmask.jpg', 0) # whereever it is marked white (sure foreground), change mask=1 # whereever it is marked black (sure background), change mask=0 mask[newmask == 0] = 0 mask[newmask == 255] = 1 -mask, bgdModel, fgdModel = cv2.grabCut(img,mask,None,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_MASK) -mask = np.where((mask==2)|(mask==0),0,1).astype('uint8') -img = img*mask[:,:,np.newaxis] -plt.imshow(img),plt.colorbar(),plt.show() +mask, bgdModel, fgdModel = cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK) +mask = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8') +img = img * mask[:, :, np.newaxis] +plt.imshow(img), plt.colorbar(), plt.show() diff --git "a/ch29-\347\220\206\350\247\243\345\233\276\345\203\217\347\211\271\345\276\201/note.txt" "b/ch29-\347\220\206\350\247\243\345\233\276\345\203\217\347\211\271\345\276\201/note.txt" new file mode 100644 index 00000000..d574be6b --- /dev/null +++ "b/ch29-\347\220\206\350\247\243\345\233\276\345\203\217\347\211\271\345\276\201/note.txt" @@ -0,0 +1,9 @@ + +找到图像特征的技术被称为特征检测。 + +描述特征 + +计算机也要对特征周围的区域进行描述,这样它才能 在其他图像中找到相同的特征。 +我们把这种描述称为特征描述 + +角点的一个特性:向任何方向移动变化都很大 diff --git "a/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/30.1-OpenCV-Harris\350\247\222\347\202\271\346\243\200\346\265\213-cornerHarris.py" "b/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/30.1-OpenCV-Harris\350\247\222\347\202\271\346\243\200\346\265\213-cornerHarris.py" new file mode 100755 index 00000000..778e6808 --- /dev/null +++ "b/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/30.1-OpenCV-Harris\350\247\222\347\202\271\346\243\200\346\265\213-cornerHarris.py" @@ -0,0 +1,35 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-28 下午7:27 + +cv2.cornerHarris() 参数如下 +• img - 数据类型为 float32 的 入图像。 +• blockSize - 点检测中 考 的 域大小。 +• ksize - Sobel 求导中使用的窗口大小 +• k - Harris 点检测方程中的自由参数 取值参数为 [0,04 0.06]. +""" + +import cv2 +import numpy as np + +filename = '../data/chessboard.png' +# filename = '../data/chessboard-3.png' +# filename = '../data/corner-detection.jpg' + +img = cv2.imread(filename) +img = cv2.resize(img, (640, 480)) +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +gray = np.float32(gray) + +# 输入图像必 是 float32 最后一个参数在 0.04 到 0.05 之间 +dst = cv2.cornerHarris(gray, 2, 3, 0.04) +# result is dilated for marking the corners, not important +dst = cv2.dilate(dst, None) +# Threshold for an optimal value, it may vary depending on the image. +img[dst > 0.01 * dst.max()] = [0, 0, 255] + +cv2.namedWindow('dst', cv2.WINDOW_NORMAL) +cv2.imshow('dst', img) +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/cornerSubPix.py" "b/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/30.2-\344\272\232\345\203\217\347\264\240\347\272\247\347\262\276\347\241\256\345\272\246\347\232\204\350\247\222\347\202\271-cornerSubPix.py" similarity index 77% rename from "ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/cornerSubPix.py" rename to "ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/30.2-\344\272\232\345\203\217\347\264\240\347\272\247\347\262\276\347\241\256\345\272\246\347\232\204\350\247\222\347\202\271-cornerSubPix.py" index aaf6fe1d..6e8c8965 100755 --- "a/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/cornerSubPix.py" +++ "b/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/30.2-\344\272\232\345\203\217\347\264\240\347\272\247\347\262\276\347\241\256\345\272\246\347\232\204\350\247\222\347\202\271-cornerSubPix.py" @@ -2,6 +2,16 @@ __author__ = 'play4fun' """ create time:15-10-29 上午7:47 + +最大精度的角点检测 + +首先我们 找到 Harris 角点 + 然后将角点的重心传给这个函数进行修正。 + Harris 角点用红色像素标出 + 绿色像素是修正后的像素。 + 在使用 个函数是我们 定义一个爹代停止条件。 + 当 代次数 到或者精度条件满 后 代就会停止。 + 我们同样需要定义进行角点搜索的邻域大小。 """ import cv2 @@ -33,7 +43,7 @@ corners = cv2.cornerSubPix(gray, np.float32(centroids), (5, 5), (-1, -1), criteria) # Now draw them res = np.hstack((centroids, corners)) -# np.int0 可以用来省略小数点后 的数字,非四舍五入 +# np.int0 可以用来省略小数点后的数字,非四舍五入 res = np.int0(res) img[res[:, 1], res[:, 0]] = [0, 0, 255] img[res[:, 3], res[:, 2]] = [0, 255, 0] diff --git "a/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/cornerHarris.py" "b/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/cornerHarris.py" deleted file mode 100755 index d100d052..00000000 --- "a/ch30-Harris\350\247\222\347\202\271\346\243\200\346\265\213/cornerHarris.py" +++ /dev/null @@ -1,25 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-28 下午7:27 -""" - -import cv2 -import numpy as np -# filename = '../data/chessboard-3.png' -filename = '../data/corner-detection.jpg' - -img = cv2.imread(filename) -gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) -gray = np.float32(gray) - -#输入图像必 是 float32 最后一个参数在 0.04 到 0.05 之间 -dst = cv2.cornerHarris(gray,2,3,0.04) -#result is dilated for marking the corners, not important -dst = cv2.dilate(dst,None) -# Threshold for an optimal value, it may vary depending on the image. -img[dst>0.01*dst.max()]=[0,0,255] - -cv2.imshow('dst',img) -if cv2.waitKey(0) & 0xff == 27: - cv2.destroyAllWindows() \ No newline at end of file diff --git "a/ch31-Shi-Tomasi\350\247\222\347\202\271\346\243\200\346\265\213-\351\200\202\345\220\210\344\272\216\350\267\237\350\270\252\347\232\204\345\233\276\345\203\217\347\211\271\345\276\201/goodFeaturesToTrack.py" "b/ch31-Shi-Tomasi\350\247\222\347\202\271\346\243\200\346\265\213-\351\200\202\345\220\210\344\272\216\350\267\237\350\270\252\347\232\204\345\233\276\345\203\217\347\211\271\345\276\201/goodFeaturesToTrack.py" new file mode 100755 index 00000000..05f96a0b --- /dev/null +++ "b/ch31-Shi-Tomasi\350\247\222\347\202\271\346\243\200\346\265\213-\351\200\202\345\220\210\344\272\216\350\267\237\350\270\252\347\232\204\345\233\276\345\203\217\347\211\271\345\276\201/goodFeaturesToTrack.py" @@ -0,0 +1,34 @@ +# -*-coding:utf8-*-# +__author__ = 'play4fun' +""" +create time:15-10-29 上午7:52 + +使用 Shi-Tomasi 方法获取图像中 N 个最好的角点 + + 常情况下 入的应 是灰度图像。然后确定你想 检测到的 点数目。再 置 点的 水平 0 到 1 之 。它代 了 点的最低 低于 个数的所有 点 会 忽略。最 后在 置两个角点之间的最短欧式距离。 + + 所有低于 水平的 点 会 忽略。然后再把合格 点按 点 序排列。 + 函数会 用 点 最 的 个 点 排序后的第一个 然后将它 最小 离之内 的 点 删掉。 + 按着 样的方式最后 回 N 个最佳 点。 + + 以后会发现这个函数很适合在目标跟踪中使用 +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +# filename = '../data/corner-detection.jpg' +filename = '../data/blox.jpg' +img = cv2.imread(filename) +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + +corners = cv2.goodFeaturesToTrack(gray, maxCorners=25, qualityLevel=0.01, minDistance=10) + +# 返回的结果是 [[ 311., 250.]] 两层括号的数组。 +corners = np.int0(corners) +for i in corners: + x, y = i.ravel() + cv2.circle(img, (x, y), 3, 255, -1) + +plt.imshow(img), plt.show() diff --git "a/ch31-Shi-Tomasi\350\247\222\347\202\271\346\243\200\346\265\213/goodFeaturesToTrack.py" "b/ch31-Shi-Tomasi\350\247\222\347\202\271\346\243\200\346\265\213/goodFeaturesToTrack.py" deleted file mode 100755 index b4cf83f8..00000000 --- "a/ch31-Shi-Tomasi\350\247\222\347\202\271\346\243\200\346\265\213/goodFeaturesToTrack.py" +++ /dev/null @@ -1,23 +0,0 @@ -#-*-coding:utf8-*-# -__author__ = 'play4fun' -""" -create time:15-10-29 上午7:52 -""" - - -import numpy as np -import cv2 -from matplotlib import pyplot as plt - - -filename = '../data/corner-detection.jpg' -img = cv2.imread(filename) -gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) - -corners = cv2.goodFeaturesToTrack(gray,25,0.01,10) -#返回的结果是 [[ 311., 250.]] 两层括号的数组。 -corners = np.int0(corners) -for i in corners: - x,y = i.ravel() - cv2.circle(img,(x,y),3,255,-1) -plt.imshow(img),plt.show() diff --git "a/ch32-\344\273\213\347\273\215SIFT/sift.py" "b/ch32-\344\273\213\347\273\215SIFT/sift.py" new file mode 100644 index 00000000..8a7396b5 --- /dev/null +++ "b/ch32-\344\273\213\347\273\215SIFT/sift.py" @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午2:23 +# @Author : play4fun +# @File : sift.py +# @Software: PyCharm + +""" +sift.py:尺度不变特征变换 + +关键点 极值点 定位 + +""" + +import cv2 +import numpy as np + +img = cv2.imread('../data/home.jpg') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + +sift = cv2.xfeatures2d.SIFT_create() +kp = sift.detect(gray, None) +img = cv2.drawKeypoints(gray, kp, img) + +# 计算关键点描述符 +# 使用函数 sift.compute() 来 计算 些关键点的描述符。例如 +# kp, des = sift.compute(gray, kp) +kp, des = sift.detectAndCompute(gray,None) + +cv2.imwrite('sift_keypoints.jpg', img) +cv2.imshow('sift_keypoints.jpg', img) +cv2.waitKey(0) diff --git "a/ch32-\344\273\213\347\273\215SIFT/sift_keypoints.jpg" "b/ch32-\344\273\213\347\273\215SIFT/sift_keypoints.jpg" new file mode 100644 index 00000000..aafdafbe Binary files /dev/null and "b/ch32-\344\273\213\347\273\215SIFT/sift_keypoints.jpg" differ diff --git "a/ch33-\344\273\213\347\273\215SURF/surf.py" "b/ch33-\344\273\213\347\273\215SURF/surf.py" new file mode 100644 index 00000000..ddde1517 --- /dev/null +++ "b/ch33-\344\273\213\347\273\215SURF/surf.py" @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午3:13 +# @Author : play4fun +# @File : surf.py +# @Software: PyCharm + +""" +surf.py:SURF加速稳健特征,加速版的SIFT + +积分图像的一大特点是 计算图像中某个窗 口内所有像素和时,计算量的大小与窗口大小无关 + +""" +import cv2 +import matplotlib.pyplot as plt + +img = cv2.imread('../data/butterfly.jpg', 0) +# Create SURF object. You can specify params here or later. # Here I set Hessian Threshold to 400 +# surf = cv2.SURF(400) +surf = cv2.xfeatures2d.SURF_create(400) + +# Find keypoints and descriptors directly +kp, des = surf.detectAndCompute(img, None) +len(kp) # 699 + +# 提高Hessian 的阈值 +# Check present Hessian threshold +print(surf.getHessianThreshold()) +# 400.0 +# We set it to some 50000. Remember, it is just for representing in picture. +# In actual cases, it is better to have a value 300-500 +surf.setHessianThreshold(50000) +# Again compute keypoints and check its number. +kp, des = surf.detectAndCompute(img, None) +print(len(kp)) +# 47 +img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4) + +plt.imshow(img2) +plt.show() + +# 最后我们再看看关键点描述符的大小 如果是 64 维的就改成 128 维。 + +# Find size of descriptor +print(surf.descriptorSize()) +# 64 +# That means flag, "extended" is False. +print(surf.getExtended()) +# False +# So we make it to True to get 128-dim descriptors. +# surf.extended = True +surf.setExtended(True) +kp, des = surf.detectAndCompute(img, None) +print(surf.descriptorSize()) +# 128 +print(des.shape) +# (47, 128) + +# 接下来要做的就是匹配了 我们会在后讨论。 diff --git "a/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast.py" "b/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast.py" new file mode 100644 index 00000000..de8caef1 --- /dev/null +++ "b/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast.py" @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午3:31 +# @Author : play4fun +# @File : fast.py +# @Software: PyCharm + +""" +fast.py:FAST 特征检测器 + +效果很好。但是从实时处理的角度来看 +这些算法 不够快。 +一个最好例子就是 SLAM 同步定位与地图构建 +移动机器人 它们的计算资源非常有限。 + +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('../data/blox.jpg', 0) + +# Initiate FAST object with default values +fast = cv2.FastFeatureDetector_create() +# find and draw the keypoints +kp = fast.detect(img, None) +img2 = cv2.drawKeypoints(img, kp, None, color=(255, 0, 0)) + +# Print all default params +print("Threshold: ", fast.getThreshold()) +print("nonmaxSuppression: ", fast.getNonmaxSuppression()) +print("neighborhood: ", fast.getType()) +print("Total Keypoints with nonmaxSuppression: ", len(kp)) +cv2.imwrite('fast_true.png', img2) + +# Disable nonmaxSuppression +fast.setNonmaxSuppression(0) +kp = fast.detect(img, None) +print("Total Keypoints without nonmaxSuppression: ", len(kp)) + +img3 = cv2.drawKeypoints(img, kp, None, color=(255, 0, 0)) +cv2.imwrite('fast_false.png', img3) + +#结果如下。第一幅图是使用了 非最大值抑制的结果 +# 第二幅没有使用非最大值抑制。 \ No newline at end of file diff --git "a/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast_false.png" "b/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast_false.png" new file mode 100644 index 00000000..8941a308 Binary files /dev/null and "b/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast_false.png" differ diff --git "a/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast_true.png" "b/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast_true.png" new file mode 100644 index 00000000..23c8d750 Binary files /dev/null and "b/ch34-\350\247\222\347\202\271\346\243\200\346\265\213\347\232\204FAST\347\256\227\346\263\225/fast_true.png" differ diff --git a/ch35-BRIEF/brief.py b/ch35-BRIEF/brief.py new file mode 100644 index 00000000..2f33532a --- /dev/null +++ b/ch35-BRIEF/brief.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午3:38 +# @Author : play4fun +# @File : brief.py +# @Software: PyCharm + +""" +brief.py: +算法使用的是已经平滑后的图像 + +非常重要的一点是 BRIEF 是一种特征描述符 它不提供查找特征的方法。 所以我们不得不使用其他特征检测器 比如 SIFT 和 SURF 等。 +原始文献推荐 使用 CenSurE 特征检测器 种算法很快。而且 BRIEF 算法对 CenSurE 关键点的描述效果 比 SURF 关键点的描述更好。 + +简单来 BRIEF 是一种对特征点描述符运算和匹 的快速方法。 这种算法可以实现很高的识别率,除非出现平面内的大旋 。 + +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('../data/blox.jpg', 0) + +# Initiate FAST detector +star = cv2.xfeatures2d.StarDetector_create() +# Initiate BRIEF extractor +brief = cv2.xfeatures2d.BriefDescriptorExtractor_create() + +# find the keypoints with STAR +kp = star.detect(img, None) +# compute the descriptors with BRIEF +kp, des = brief.compute(img, kp) + +print(brief.descriptorSize()) +print(des.shape) diff --git a/ch36-ORB/orb.py b/ch36-ORB/orb.py new file mode 100644 index 00000000..f9cb2c9e --- /dev/null +++ b/ch36-ORB/orb.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午3:45 +# @Author : play4fun +# @File : orb.py +# @Software: PyCharm + +""" +orb.py: +SIFT 和 SURF 算法是有专利保护的 如果你 使用它们 就可能要花钱 。但是 ORB 不需要 + +ORB 基本是 FAST 关 点检测和 BRIEF 关 点描 器的结合体 并 + 很多修改增强了性能。 先它使用 FAST 找到关 点 然后再使用 Harris 点检测对 些关 点 排序找到其中的前 N 个点。它也使用 字塔从而产 生尺度不变性特征。 + + 数据的方差大的一个好处是 使得特征更容易分辨。 + +对于描述符,ORB使用BRIEF描述符。但我们已经看到,这个BRIEF的表现在旋转方面表现不佳。因此,ORB所做的是根据关键点的方向来“引导”。 +对于在位置(xi,yi)的n个二进制测试的任何特性集,定义一个包含这些像素坐标的2 n矩阵。然后利用补丁的方向,找到旋转矩阵并旋转S,以得到引导(旋转)版本s。 + +ORB将角度进行离散化,以增加2/30(12度),并构造一个预先计算过的简短模式的查找表。只要键点的方向是一致的,就会使用正确的点集来计算它的描述符。 + +BRIEF有一个重要的属性,即每个比特的特性都有很大的方差,而平均值接近0.5。但是一旦它沿着键点方向移动,它就会失去这个属性并变得更加分散。高方差使特征更有区别,因为它对输入的响应不同。另一个可取的特性是让测试不相关,因为每个测试都将对结果有所贡献。为了解决所有这些问题,ORB在所有可能的二进制测试中运行一个贪婪的搜索,以找到那些既有高方差又接近0.5的,同时又不相关的。结果被称为rBRIEF。 + +对于描述符匹配,在传统的LSH上改进的多探测LSH是被使用的。这篇文章说,ORB比冲浪快得多,而且比冲浪还好。对于全景拼接的低功率设备,ORB是一个不错的选择。 + +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('../data/blox.jpg', 0) + +# Initiate ORB detector +orb = cv2.ORB_create() +# find the keypoints with ORB +kp = orb.detect(img, None) +# compute the descriptors with ORB +kp, des = orb.compute(img, kp) + +# draw only keypoints location,not size and orientation +img2 = cv2.drawKeypoints(img, kp, None, color=(0, 255, 0), flags=0) + +plt.imshow(img2), plt.show() diff --git "a/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.2-\345\257\271ORB\346\217\217\350\277\260\347\254\246\350\277\233\350\241\214\350\233\256\345\212\233\345\214\271\351\205\215.py" "b/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.2-\345\257\271ORB\346\217\217\350\277\260\347\254\246\350\277\233\350\241\214\350\233\256\345\212\233\345\214\271\351\205\215.py" new file mode 100644 index 00000000..894856d7 --- /dev/null +++ "b/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.2-\345\257\271ORB\346\217\217\350\277\260\347\254\246\350\277\233\350\241\214\350\233\256\345\212\233\345\214\271\351\205\215.py" @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午4:00 +# @Author : play4fun +# @File : 37.2-对ORB描述符进行蛮力匹配.py +# @Software: PyCharm + +""" +37.2-对ORB描述符进行蛮力匹配.py: +匹配器对象是什么 +matches = bf.match(des1, des2) 返回值是一个 DMatch对象列表 +DMatch 对 具有下列属性 +• DMatch.distance - 描 符之 的 离。 小 好。 +• DMatch.trainIdx - 目标图像中描 符的索引。 +• DMatch.queryIdx - 查 图像中描 符的索引。 +• DMatch.imgIdx - 目标图像的索引。 +""" + +import numpy as np +import cv2 +import matplotlib.pyplot as plt + +img1 = cv2.imread('../data/box.png', 0) # queryImage +img2 = cv2.imread('../data/box_in_scene.png', 0) # trainImage + +# Initiate ORB detector +orb = cv2.ORB_create() +# find the keypoints and descriptors with ORB +kp1, des1 = orb.detectAndCompute(img1, None) +kp2, des2 = orb.detectAndCompute(img2, None) + +# create BFMatcher object +bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) +# Match descriptors. +matches = bf.match(des1, des2) + +# Sort them in the order of their distance. +matches = sorted(matches, key=lambda x: x.distance) +# Draw first 10 matches. +# img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], flags=2) # 前10个匹配 +img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None,flags=2) # 前10个匹配 + +plt.imshow(img3), plt.show() diff --git "a/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.4-SIFT_match.py" "b/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.4-SIFT_match.py" index 07381ab0..48cc2b4e 100755 --- "a/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.4-SIFT_match.py" +++ "b/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.4-SIFT_match.py" @@ -1,36 +1,44 @@ -#-*-coding:utf8-*-# +# -*-coding:utf8-*-# __author__ = 'play4fun' """ create time:15-11-9 下午1:28 +对 SIFT 描述符进行蛮力匹配和比值测试 """ - - import numpy as np import cv2 from matplotlib import pyplot as plt -img1 = cv2.imread('../data/box.png',0) + +img1 = cv2.imread('../data/box.png', 0) # queryImage -img2 = cv2.imread('../data/box_in_scene.png',0) # trainImage +img2 = cv2.imread('../data/box_in_scene.png', 0) # trainImage # Initiate SIFT detector # sift = cv2.SIFT() sift = cv2.xfeatures2d.SIFT_create() + + # find the keypoints and descriptors with SIFT -kp1, des1 = sift.detectAndCompute(img1,None) -kp2, des2 = sift.detectAndCompute(img2,None) +kp1, des1 = sift.detectAndCompute(img1, None) +kp2, des2 = sift.detectAndCompute(img2, None) + # BFMatcher with default params bf = cv2.BFMatcher() -matches = bf.knnMatch(des1,des2, k=2) +matches = bf.knnMatch(des1, des2, k=2) + # Apply ratio test # 比值测试,首先获取与 A距离最近的点 B (最近)和 C (次近), # 只有当 B/C 小于阀值时(0.75)才被认为是匹配, -#因为假设匹配是一一对应的,真正的匹配的理想距离为0 +# 因为假设匹配是一一对应的,真正的匹配的理想距离为0 good = [] -for m,n in matches: - if m.distance < 0.75*n.distance: +for m, n in matches: + if m.distance < 0.75 * n.distance: good.append([m]) # cv2.drawMatchesKnn expects list of lists as matches. -img3=np.ndarray([2,2]) -img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good[:10],img3,flags=2) -plt.imshow(img3),plt.show() \ No newline at end of file +# img3 = np.ndarray([2, 2]) +# img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good[:10], img3, flags=2) + +# cv2.drawMatchesKnn expects list of lists as matches. +img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) + +plt.imshow(img3), plt.show() diff --git "a/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.5-FLANN\345\214\271\351\205\215\345\231\250.py" "b/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.5-FLANN\345\214\271\351\205\215\345\231\250.py" new file mode 100644 index 00000000..b387a4c2 --- /dev/null +++ "b/ch37-\347\211\271\345\276\201\345\214\271\351\205\215/37.5-FLANN\345\214\271\351\205\215\345\231\250.py" @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午4:22 +# @Author : play4fun +# @File : 37.5-FLANN匹配器.py +# @Software: PyCharm + +""" +37.5-FLANN匹配器.py: +FLANN 是快速最近邻搜索包 Fast_Library_for_Approximate_Nearest_Neighbors 的简称。 +它是一个对大数据集和高维特征进行最近邻搜索的算法的集合 + 而且这些算法 已经被优化 了。 + 在面对大数据集时它的效果 好于 BFMatcher + +""" + + + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img1 = cv2.imread('../data/box.png', 0) # queryImage +img2 = cv2.imread('../data/box_in_scene.png', 0) # trainImage + +# Initiate SIFT detector +# sift = cv2.SIFT() +sift = cv2.xfeatures2d.SIFT_create() + +# find the keypoints and descriptors with SIFT +kp1, des1 = sift.detectAndCompute(img1, None) +kp2, des2 = sift.detectAndCompute(img2, None) + +# FLANN parameters +FLANN_INDEX_KDTREE = 0 +index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) +search_params = dict(checks=50) # or pass empty dictionary + +flann = cv2.FlannBasedMatcher(index_params, search_params) +matches = flann.knnMatch(des1, des2, k=2) +# Need to draw only good matches, so create a mask +matchesMask = [[0, 0] for i in range(len(matches))] + +# ratio test as per Lowe's paper +for i, (m, n) in enumerate(matches): + if m.distance < 0.7 * n.distance: + matchesMask[i] = [1, 0] + +draw_params = dict(matchColor=(0, 255, 0), + singlePointColor=(255, 0, 0), + matchesMask=matchesMask, + flags=0) + +img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **draw_params) + +plt.imshow(img3, ), plt.show() diff --git "a/ch38-\344\275\277\347\224\250\347\211\271\345\276\201\345\214\271\351\205\215\345\222\214\345\215\225\345\272\224\346\200\247\346\237\245\346\211\276\345\257\271\350\261\241/findHomography.py" "b/ch38-\344\275\277\347\224\250\347\211\271\345\276\201\345\214\271\351\205\215\345\222\214\345\215\225\345\272\224\346\200\247\346\237\245\346\211\276\345\257\271\350\261\241/findHomography.py" new file mode 100644 index 00000000..0e4dc98a --- /dev/null +++ "b/ch38-\344\275\277\347\224\250\347\211\271\345\276\201\345\214\271\351\205\215\345\222\214\345\215\225\345\272\224\346\200\247\346\237\245\346\211\276\345\257\271\350\261\241/findHomography.py" @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午5:13 +# @Author : play4fun +# @File : findHomography.py +# @Software: PyCharm + +""" +findHomography.py:联合使用特征提取和 calib3d 模块中的 findHomography 在复杂图像中查找已知对象 +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +MIN_MATCH_COUNT = 10 +img1 = cv2.imread('../data/box.png', 0) # queryImage +img2 = cv2.imread('../data/box_in_scene.png', 0) # trainImage + +# Initiate SIFT detector +sift = cv2.xfeatures2d.SIFT_create() +# find the keypoints and descriptors with SIFT +kp1, des1 = sift.detectAndCompute(img1, None) +kp2, des2 = sift.detectAndCompute(img2, None) + +FLANN_INDEX_KDTREE = 0 +index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) +search_params = dict(checks=50) +flann = cv2.FlannBasedMatcher(index_params, search_params) +matches = flann.knnMatch(des1, des2, k=2) + +# store all the good matches as per Lowe's ratio test. +good = [] +for m, n in matches: + if m.distance < 0.7 * n.distance: + good.append(m) +''' +现在我们 置只有存在 10 个以上匹 时才去查找目标 MIN_MATCH_COUNT=10 否则显示 告消息 现在匹 不 +如果找到了 够的匹 我们 提取两幅图像中匹 点的坐标。把它们传 入到函数中 算 变换。一旦我们找到 3x3 的变换矩 就可以使用它将查 图像的四个 点 四个 变换到目标图像中去了。然后再绘制出来。 +''' + +if len(good) > MIN_MATCH_COUNT: + # 获取关 点的坐标 + src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) + dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) + + # 第三个参数 Method used to computed a homography matrix. The following methods are possible: #0 - a regular method using all the points + # CV_RANSAC - RANSAC-based robust method + # CV_LMEDS - Least-Median robust method + # 第四个参数取值范围在 1 到 10 绝一个点对的 值。原图像的点经 变换后点与目标图像上对应点的 差 # 差就 为是 outlier + # 回值中 M 为变换矩 。 + M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) + matchesMask = mask.ravel().tolist() + # 获得原图像的高和宽 + h, w = img1.shape + # 使用得到的变换矩 对原图像的四个 变换 获得在目标图像上对应的坐标 + pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2) + dst = cv2.perspectiveTransform(pts, M) + # 原图像为灰度图 + img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA) +else: + print("Not enough matches are found - %d/%d" % (len(good), MIN_MATCH_COUNT)) + matchesMask = None + +# 最后我再绘制 inliers 如果能成功的找到目标图像的话 或者匹配的关 点 如果失败。 +draw_params = dict(matchColor=(0, 255, 0), # draw matches in green color + singlePointColor=None, + matchesMask=matchesMask, # draw only inliers + flags=2) + +img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params) + +plt.imshow(img3, 'gray'), plt.show() +# 复杂图像中被找到的目标图像被标记成白色 diff --git "a/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/Camshift.py" "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/Camshift.py" new file mode 100644 index 00000000..d1b3991e --- /dev/null +++ "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/Camshift.py" @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午5:56 +# @Author : play4fun +# @File : Camshift.py +# @Software: PyCharm + +""" +Camshift.py: +""" + +import numpy as np +import cv2 + +cap = cv2.VideoCapture('../data/slow.flv') +# take first frame of the video +ret, frame = cap.read() + +# setup initial location of window +r, h, c, w = 250, 90, 400, 125 # simply hardcoded the values +track_window = (c, r, w, h) +# set up the ROI for tracking +roi = frame[r:r + h, c:c + w] +hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) +mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.))) +roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180]) +cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX) +# Setup the termination criteria, either 10 iteration or move by atleast 1 pt +term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1) + +while True: + ret, frame = cap.read() + if ret is True: + hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) + dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1) + # apply meanshift to get the new location + ret, track_window = cv2.CamShift(dst, track_window, term_crit) + # Draw it on image + pts = cv2.boxPoints(ret) + pts = np.int0(pts) + print('len pts:', len(pts),pts) + img2 = cv2.polylines(frame, [pts], True, (255, 0, 0), 2) + + cv2.imshow('img2', img2) + k = cv2.waitKey(1) # & 0xff + if k == 27: + break + # else: + # cv2.imwrite(chr(k) + ".jpg", img2) + else: + break +cv2.destroyAllWindows() +cap.release() diff --git "a/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/Meanshift.py" "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/Meanshift.py" new file mode 100644 index 00000000..8413ba72 --- /dev/null +++ "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/Meanshift.py" @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午5:27 +# @Author : play4fun +# @File : Meanshift.py +# @Software: PyCharm + +""" +Meanshift.py: + +问题:我们的窗口的大小是固 定的 +而汽车由远及近 在视觉上 是一个 渐变大的过程 +固定的窗口是不 合适的。所以我们需要根据目标的大小和角度来对窗口的大小和角度进行修订 + +http://docs.opencv.org/3.2.0/db/df8/tutorial_py_meanshift.html +""" + +import numpy as np +import cv2 + +cap = cv2.VideoCapture('../data/slow.flv') + +# take first frame of the video +ret, frame = cap.read() +# setup initial location of window +r, h, c, w = 250, 90, 400, 125 # simply hardcoded the values +track_window = (c, r, w, h) +# set up the ROI for tracking +roi = frame[r:r + h, c:c + w] +hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) +# 将低亮度的值忽略掉 +mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.))) +roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180]) + +cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX) + +# Setup the termination criteria, either 10 iteration or move by atleast 1 pt +term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1) + +while True: + ret, frame = cap.read() + if ret is True: + hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) + dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1) + # apply meanshift to get the new location + ret, track_window = cv2.meanShift(dst, track_window, term_crit) + + # Draw it on image + x, y, w, h = track_window + print(track_window) + img2 = cv2.rectangle(frame, (x, y), (x + w, y + h), 255, 2) + cv2.imshow('img2', img2) + + + k = cv2.waitKey(60) # & 0xff + if k == 27: + break + # else: + # cv2.imwrite(chr(k) + ".jpg", img2) + else: + break +cv2.destroyAllWindows() +cap.release() +#不正常 diff --git "a/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/q.jpg" "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/q.jpg" new file mode 100644 index 00000000..a66d6d47 Binary files /dev/null and "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/q.jpg" differ diff --git "a/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/s.jpg" "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/s.jpg" new file mode 100644 index 00000000..4584b0cd Binary files /dev/null and "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/s.jpg" differ diff --git "a/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/\303\277.jpg" "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/\303\277.jpg" new file mode 100644 index 00000000..5498fabc Binary files /dev/null and "b/ch39-\350\247\206\351\242\221\345\210\206\346\236\220-Meanshift\345\222\214Camshift/\303\277.jpg" differ diff --git a/ch4/4.1_imread_imshow.py b/ch4/4.1_imread_imshow.py deleted file mode 100755 index 5e2af2f0..00000000 --- a/ch4/4.1_imread_imshow.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- - -import numpy as np -import cv2 - -print cv2.__version__ - -# Load an color image in grayscale -img = cv2.imread('messi5.jpg',0) -img.I -cv2.namedWindow('image',cv2.WINDOW_NORMAL) -cv2.imshow('image',img) -cv2.waitKey(0) -cv2.destroyAllWindows() - -# -cv2.imwrite('messigray.png',img) \ No newline at end of file diff --git a/ch4/4.imread_imshow_imwrite.py b/ch4/4.imread_imshow_imwrite.py deleted file mode 100755 index 8c176099..00000000 --- a/ch4/4.imread_imshow_imwrite.py +++ /dev/null @@ -1,11 +0,0 @@ -import numpy as np -import cv2 - -img = cv2.imread('messi5.jpg',0) -cv2.imshow('image',img) -k = cv2.waitKey(0) -if k == 27: # wait for ESC key to exit - cv2.destroyAllWindows() -elif k == ord('s'): # wait for 's' key to save and exit - cv2.imwrite('messigray.png',img) - cv2.destroyAllWindows() \ No newline at end of file diff --git a/ch4/4.matplotlib.py b/ch4/4.matplotlib.py deleted file mode 100755 index 9a583ab7..00000000 --- a/ch4/4.matplotlib.py +++ /dev/null @@ -1,8 +0,0 @@ -import numpy as np -import cv2 -from matplotlib import pyplot as plt - -img = cv2.imread('messi5.jpg',0) -plt.imshow(img, cmap = 'gray', interpolation = 'bicubic') -plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis -plt.show() \ No newline at end of file diff --git "a/ch40-\345\205\211\346\265\201/40.3-Lucas-Kanade-\345\205\211\346\265\201calcOpticalFlowPyrLK.py" "b/ch40-\345\205\211\346\265\201/40.3-Lucas-Kanade-\345\205\211\346\265\201calcOpticalFlowPyrLK.py" new file mode 100644 index 00000000..67084c45 --- /dev/null +++ "b/ch40-\345\205\211\346\265\201/40.3-Lucas-Kanade-\345\205\211\346\265\201calcOpticalFlowPyrLK.py" @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午5:59 +# @Author : play4fun +# @File : calcOpticalFlowPyrLK.py +# @Software: PyCharm + +""" +calcOpticalFlowPyrLK.py: +由于目标对象或者摄像机的移动造成的图像对象在 续两帧图像中的移动 被称为光流。 +它是一个 2D 向量场 可以用来显示一个点从第一帧图像到第二 帧图像之间的移动。 +光 流在很多领域中都很有用 +• 由运动重建结构 +• 视频压缩 +• Video Stabilization 等 +""" + +import numpy as np +import cv2 + +cap = cv2.VideoCapture('../data/slow.flv') + +# params for ShiTomasi corner detection +feature_params = dict(maxCorners=100, + qualityLevel=0.3, + minDistance=7, + blockSize=7) +# Parameters for lucas kanade optical flow +# maxLevel 为使用的图像金字塔层数 +lk_params = dict(winSize=(15, 15), + maxLevel=2, + criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) +# Create some random colors +color = np.random.randint(0, 255, (100, 3)) + +# Take first frame and find corners in it +ret, old_frame = cap.read() +old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY) +p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params) +# Create a mask image for drawing purposes +mask = np.zeros_like(old_frame) + +while True: + ret, frame = cap.read() + frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + # calculate optical flow能够获取点的新位置 + p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params) + # Select good points + good_new = p1[st == 1] + good_old = p0[st == 1] + # draw the tracks + for i, (new, old) in enumerate(zip(good_new, good_old)): + a, b = new.ravel() + c, d = old.ravel() + mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2) + frame = cv2.circle(frame, (a, b), 5, color[i].tolist(), -1) + img = cv2.add(frame, mask) + cv2.imshow('frame', img) + + k = cv2.waitKey(30) #& 0xff + if k == 27: + break + # Now update the previous frame and previous points + old_gray = frame_gray.copy() + p0 = good_new.reshape(-1, 1, 2) + +cv2.destroyAllWindows() +cap.release() diff --git "a/ch40-\345\205\211\346\265\201/40.4-OpenCV\344\270\255\347\232\204\347\250\240\345\257\206\345\205\211\346\265\201.py" "b/ch40-\345\205\211\346\265\201/40.4-OpenCV\344\270\255\347\232\204\347\250\240\345\257\206\345\205\211\346\265\201.py" new file mode 100644 index 00000000..4462652f --- /dev/null +++ "b/ch40-\345\205\211\346\265\201/40.4-OpenCV\344\270\255\347\232\204\347\250\240\345\257\206\345\205\211\346\265\201.py" @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午6:08 +# @Author : play4fun +# @File : 40.4-OpenCV中的稠密光流.py +# @Software: PyCharm + +""" +40.4-OpenCV中的稠密光流.py: +""" + +import cv2 +import numpy as np + +cap = cv2.VideoCapture("../data/vtest.avi") +# cap = cv2.VideoCapture("../data/slow.flv") +ret, frame1 = cap.read() + +prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) +hsv = np.zeros_like(frame1) +hsv[..., 1] = 255 + +while True: + ret, frame2 = cap.read() + next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) + flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) + mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1]) + hsv[..., 0] = ang * 180 / np.pi / 2 + hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX) + bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) + + cv2.imshow('frame2', frame2) + cv2.imshow('flow', bgr) + k = cv2.waitKey(1) & 0xff + if k == 27: + break + elif k == ord('s'): + cv2.imwrite('opticalfb.png', frame2) + cv2.imwrite('opticalhsv.png', bgr) + prvs = next + +cap.release() +cv2.destroyAllWindows() diff --git "a/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.2-BackgroundSubtractorMOG.py" "b/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.2-BackgroundSubtractorMOG.py" new file mode 100644 index 00000000..29aeee5a --- /dev/null +++ "b/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.2-BackgroundSubtractorMOG.py" @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午6:12 +# @Author : play4fun +# @File : 41.2-BackgroundSubtractorMOG.py +# @Software: PyCharm + +""" +41.2-BackgroundSubtractorMOG.py: +在很多基础应用中背景检出 是一个 常 的步 。例如 客统 使 用一个 态摄像头来 录 入和离开房 的人数 或者是交 摄像头 提 取交 工具的信息等。在所有的 些例子中 先 将人或 单独提取出来。 技术上来 我们 从 止的背景中提取移动的前景。 + +但是我们现在讲的背景建模是基于时间序列的 + 因此每一个像素点所在的位置在整个时间序列中 就会有很多值 从而构成一个分布。 +""" + +import numpy as np +import cv2 + +# cap = cv2.VideoCapture('../data/vtest.avi') +cap = cv2.VideoCapture(0)#笔记本摄像头 + +fgbg = cv2.bgsegm.createBackgroundSubtractorMOG() +# 可选参数 比如 进行建模场景的时间长度 高斯混合成分的数量-阈值等 + +while True: + ret, frame = cap.read() + # frame = cv2.flip(frame, flipCode=1) # 左右翻转 + + fgmask = fgbg.apply(frame) + + cv2.imshow('frame', fgmask) + k = cv2.waitKey(1) #& 0xff + if k == ord('q'): + break +cap.release() +cv2.destroyAllWindows() diff --git "a/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.3-BackgroundSubtractorMOG2.py" "b/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.3-BackgroundSubtractorMOG2.py" new file mode 100644 index 00000000..aee8cde3 --- /dev/null +++ "b/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.3-BackgroundSubtractorMOG2.py" @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午6:16 +# @Author : play4fun +# @File : 41.3-BackgroundSubtractorMOG2.py +# @Software: PyCharm + +""" +41.3-BackgroundSubtractorMOG2.py: +这个算法的一个特点是它为每一个像素选择一个合适数目的 斯分布。 +上一个方法中我们使用是 K 给斯分 布 。 + 这样就会对由于亮度等发生变化引起的场景变化产生更好的适应。 +和前面一样我们 创建一个背景对 。但在 我们我们可以 择是否 检测阴影。如果 detectShadows = True 默认值 +它就会检测并将影子标记出来 但是 样做会降低处理速度。影子会 标记为灰色。 +""" + +import numpy as np +import cv2 + +# cap = cv2.VideoCapture('../data/vtest.avi') +cap = cv2.VideoCapture(0)#笔记本摄像头 + +fgbg = cv2.createBackgroundSubtractorMOG2() +while True: + ret, frame = cap.read() + # frame = cv2.flip(frame, flipCode=1) # 左右翻转 + + fgmask = fgbg.apply(frame) + + cv2.imshow('frame', fgmask) + k = cv2.waitKey(30) #& 0xff + if k == ord('q'): + break +cap.release() +cv2.destroyAllWindows() diff --git "a/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.4-morphologyEx.py" "b/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.4-morphologyEx.py" new file mode 100644 index 00000000..42ab8274 --- /dev/null +++ "b/ch41-\350\203\214\346\231\257\345\207\217\351\231\244/41.4-morphologyEx.py" @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午6:18 +# @Author : play4fun +# @File : 41.4-BackgroundSubtractorGMG.py +# @Software: PyCharm + +""" +41.4-BackgroundSubtractorGMG.py: + +它使用前 很少的图像 为前 120 帧 背景建模。使用了概率前 景估 算法 使用 叶斯估 定前景 。 是一种自 应的估 新 察到的 对 比旧的对 具有更 的权 从而对光照变化产生 应。一些形态学操作 如开 算 算等 用来 去不 的噪 。在前几帧图像中你会得到一个 色窗口。 + 对结果 形态学开 算对与去 噪声很有帮助。 +""" + +import numpy as np +import cv2 + +# cap = cv2.VideoCapture('../data/vtest.avi') +cap = cv2.VideoCapture(0)#笔记本摄像头 + +kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) +fgbg = cv2.bgsegm.createBackgroundSubtractorGMG() + +counter=0 +while True: + ret, frame = cap.read() + fgmask = fgbg.apply(frame) + fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel) + + cv2.imshow('frame', fgmask)#前 120 帧 + counter+=1 + print(counter) + + k = cv2.waitKey(1) # & 0xff + if k == ord('q'): + break +cap.release() +cv2.destroyAllWindows() diff --git "a/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/42.2.1-\350\256\276\347\275\256-findChessboardCorners.py" "b/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/42.2.1-\350\256\276\347\275\256-findChessboardCorners.py" new file mode 100644 index 00000000..5d4804f9 --- /dev/null +++ "b/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/42.2.1-\350\256\276\347\275\256-findChessboardCorners.py" @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午6:21 +# @Author : play4fun +# @File : 42.2.1-设置-findChessboardCorners.py +# @Software: PyCharm + +""" +42.2.1-设置-findChessboardCorners.py: + +径向畸变和切想畸变 +摄像机的内部和外部参数。 内部参数是摄像机特异的。它包括的信息有焦 ( fx, fy) 光学中心 (cx, cy) 等。 也 称为摄像机矩阵。它完全取决于摄像机自 只需要计算一次 以后就可以已知使用了。 + +至少需要10张图案模式来进行摄像机标定 +3D 点 称为对象点, 2D 图像点 称为图像点 + +除了使用棋盘之外 我们 可以使用环形格子 +使用函数 cv2.findCirclesGrid() 来找图案。 +据说使用环形格子只需要很少的图像 就可以了。 + +""" + +import numpy as np +import cv2 +import glob + +# termination criteria +criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) +# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) +objp = np.zeros((6 * 7, 3), np.float32) +objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2) +# Arrays to store object points and image points from all the images. +objpoints = [] # 3d point in real world space +imgpoints = [] # 2d points in image plane. +images = glob.glob('../data/left*.jpg') +images += glob.glob('../data/right*.jpg') +for fname in images: + img = cv2.imread(fname) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + # Find the chess board corners + ret, corners = cv2.findChessboardCorners(gray, (7, 6), None) + # If found, add object points, image points (after refining them) + if ret == True: + objpoints.append(objp) + corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) + imgpoints.append(corners) + # Draw and display the corners + cv2.drawChessboardCorners(img, (7, 6), corners2, ret) + cv2.imshow('img', img) + cv2.waitKey(500) +cv2.destroyAllWindows() diff --git "a/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/camera-calibration-checker-board_9x7.pdf" "b/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/camera-calibration-checker-board_9x7.pdf" new file mode 100644 index 00000000..92382eeb Binary files /dev/null and "b/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/camera-calibration-checker-board_9x7.pdf" differ diff --git "a/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/camera_calibration.py" "b/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/camera_calibration.py" new file mode 100644 index 00000000..349f48b5 --- /dev/null +++ "b/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/camera_calibration.py" @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/11/14 17:09 +# @Author : play4fun +# @File : cc1.py +# @Software: PyCharm + +""" +camera_calibration1.py: +参考:http://blog.csdn.net/dcrmg/article/details/52939318 + +有结果,但是摄像头分辨率太高,程序运行太慢了 + +所用棋盘来自 +http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration?action=AttachFile&do=view&target=check-108.pdf +""" +import numpy as np +import cv2 + +criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) +cap = cv2.VideoCapture(0) + + +#等比缩放 +frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)#4 ,720 +frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)#3 ,1280 +frame_height=int(480/frame_width*frame_height)#270 +ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)#高 +ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) +# + +while cap.isOpened(): + # img = cv2.imread(fname) + ret, img = cap.read() + + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + + ret, corners = cv2.findChessboardCorners(image=gray, patternSize=(6, 4), corners=None) + ''' + 第一个参数Image,传入拍摄的棋盘图Mat图像,必须是8位的灰度或者彩色图像; +第二个参数patternSize,每个棋盘图上内角点的行列数,一般情况下,行列数不要相同,便于后续标定程序识别标定板的方向; +第三个参数corners,用于存储检测到的内角点图像坐标位置,一般用元素是Point2f的向量来表示:vector image_points_buf; +第四个参数flage:用于定义棋盘图上内角点查找的不同处理方式,有默认值。 + ''' + print(corners) + print('---------') + if ret == True: + # objpoints.append(objp) + corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) + # imgpoints.append(corners) + # Draw and display the corners + cv2.drawChessboardCorners(img, (6, 4), corners2, ret) + + cv2.imshow('img', img) + + key = cv2.waitKey(delay=10) + if key == ord("q"): + break + +cv2.destroyAllWindows() diff --git "a/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/\345\205\266\344\273\226.py" "b/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/\345\205\266\344\273\226.py" new file mode 100644 index 00000000..7f672b4c --- /dev/null +++ "b/ch42-\346\221\204\345\203\217\346\234\272\346\240\207\345\256\232/\345\205\266\344\273\226.py" @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午6:29 +# @Author : play4fun +# @File : 其他.py +# @Software: PyCharm + +""" +其他.py: +""" +import cv2 + +# 标定 +ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) + +# 畸变校正 +img = cv2.imread('left12.jpg') +h, w = img.shape[:2] +newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) + +# 使用 cv2.undistort() 是最简单的方法。只 使用这个函数和上面得到 的 ROI 对结果进行裁剪。 + +# undistort +dst = cv2.undistort(img, mtx, dist, None, newcameramtx) +# crop the image +x, y, w, h = roi +dst = dst[y:y + h, x:x + w] +cv2.imwrite('calibresult.png', dst) + +# 使用 remapping 应 属于 曲线救国 了。 先我们 找到从畸变图像到畸变图像的映射方程。再使用 重映射方程 +# undistort +mapx, mapy = cv2.initUndistortRectifyMap(mtx, dist, None, newcameramtx, (w, h), 5) +dst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR) +# crop the image +x, y, w, h = roi +dst = dst[y:y + h, x:x + w] +cv2.imwrite('calibresult.png', dst) +# 你会发现结果图像中所有的边界 变直了 + +# 反向投影误差 +# 我们可以利用反向投影 差对我们找到的参数的准确性 估 。 +# 得到的 结果越接近 0 越好。有了内部参数 畸变参数和旋 变换矩 我们就可以使 用 cv2.projectPoints() 将对象点转换到图像点。 +# 然后就可以 算变换得到 图像与角点检测算法的绝对差了。 +# 然后我们计算所有标定图像的误差平均值。 +mean_error = 0 +for i in range(len(objpoints)): + imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist) + error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2) + mean_error += error +print("total error: ", mean_error / len(objpoints)) diff --git "a/ch43-\345\247\277\345\212\277\344\274\260\350\256\241/calib3d.py" "b/ch43-\345\247\277\345\212\277\344\274\260\350\256\241/calib3d.py" new file mode 100644 index 00000000..80580af3 --- /dev/null +++ "b/ch43-\345\247\277\345\212\277\344\274\260\350\256\241/calib3d.py" @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午6:44 +# @Author : play4fun +# @File : calib3d.py +# @Software: PyCharm + +""" +calib3d.py: +在图像中绘制一些 2D 的线条来产生 3D 的效果 + +在棋盘的第一个角点绘制 3D 坐标 X Y Z + X 为蓝色 Y 为绿色 Z 为红色。 + 在视觉效果上来看 Z 轴应 是垂直于棋盘平面的。 +""" + +import cv2 +import numpy as np +import glob + +# Load previously saved data摄像机矩阵和畸变系数 +with np.load('B.npz') as X: + mtx, dist, _, _ = [X[i] for i in ('mtx', 'dist', 'rvecs', 'tvecs')] + + +# 函数 draw 它的参数有棋盘上的角点 +# 使用 cv2.findChessboardCorners() 得到 +# 绘制的 3D 坐标轴上的点 +def draw(img, corners, imgpts): + corner = tuple(corners[0].ravel()) + img = cv2.line(img, corner, tuple(imgpts[0].ravel()), (255, 0, 0), 5) + img = cv2.line(img, corner, tuple(imgpts[1].ravel()), (0, 255, 0), 5) + img = cv2.line(img, corner, tuple(imgpts[2].ravel()), (0, 0, 255), 5) + return img + + +# 渲染一个立方体 +def draw_cube(img, corners, imgpts): + imgpts = np.int32(imgpts).reshape(-1, 2) + # draw ground floor in green + img = cv2.drawContours(img, [imgpts[:4]], -1, (0, 255, 0), -3) + # draw pillars in blue color + for i, j in zip(range(4), range(4, 8)): + img = cv2.line(img, tuple(imgpts[i]), tuple(imgpts[j]), (255), 3) + # draw top layer in red color + img = cv2.drawContours(img, [imgpts[4:]], -1, (0, 0, 255), 3) + return img + + +# 设置终止条件 对象点 棋盘上的 3D 角点 和坐标轴点 +criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) +objp = np.zeros((6 * 7, 3), np.float32) +objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2) +axis = np.float32([[3, 0, 0], [0, 3, 0], [0, 0, -3]]).reshape(-1, 3) +# 渲染一个立方体 +# axis = np.float32([[0, 0, 0], [0, 3, 0], [3, 3, 0], [3, 0, 0], +# [0, 0, -3], [0, 3, -3], [3, 3, -3], [3, 0, -3]]) + +''' +很 常一样我们 加 图像。搜寻 7x6 的格子 如果发现 我们就把它 优化到亚像素级。然后使用函数:cv2.solvePnPRansac() 来 算旋 和变 换。但我们有了变换矩 之后 我们就可以利用它们将 些坐标 点映射到图 像平 中去。简单来 我们在图像平 上找到了与 3D 空 中的点 3,0,0 ,(0,3,0),(0,0,3) 相对应的点。然后我们就可以使用我们的函数 draw() 从图像 上的第一个 点开始绘制 接 些点的直线了。搞定 +''' +for fname in glob.glob('../data/left*.jpg'): + img = cv2.imread(fname) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + ret, corners = cv2.findChessboardCorners(gray, (7, 6), None) + if ret == True: + corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) + # Find the rotation and translation vectors. + ret, rvecs, tvecs, inliers = cv2.solvePnP(objp, corners2, mtx, dist) + # project 3D points to image plane + imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist) + img = draw(img, corners2, imgpts) + cv2.imshow('img', img) + k = cv2.waitKey(0) & 0xFF + if k == ord('s'): + cv2.imwrite(fname[:6] + '.png', img) +cv2.destroyAllWindows() + +#如果你对计算机图形学感兴趣的 为了增加图像的真实性 你可以使用 OpenGL 来渲染更复杂的图形。 下一个目标 \ No newline at end of file diff --git "a/ch44-\345\257\271\346\236\201\345\207\240\344\275\225/code.py" "b/ch44-\345\257\271\346\236\201\345\207\240\344\275\225/code.py" new file mode 100644 index 00000000..52cd560a --- /dev/null +++ "b/ch44-\345\257\271\346\236\201\345\207\240\344\275\225/code.py" @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午6:57 +# @Author : play4fun +# @File : code.py +# @Software: PyCharm + +""" +code.py:多视角几何基础,极点 极线 对极约束 对极平面 + +在我们使用针孔相机时 我们会丢失大量重要的信息 + 比如 图像的深度 或者 图像上的点和摄像机的距离 +因为这是一个从 3D 到 2D 的转换。 +重要的问题: + 使用这样的摄像机我们能否计算出深度信息呢? + 答案 就是使用多个相机。 + 我们的眼睛就是这样工作的 使用两个摄像机 两个眼睛 +称为立体视角 + +三角测量 + +本征矩阵 E 和基础矩阵 F + +点越多越好 可以使用 RANSAC 算法得到更加稳定的结果 + +使用 SIFT 描述符 FLANN 匹配器和比值检测 +""" + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + + +# 找到极线 +def drawlines(img1, img2, lines, pts1, pts2): + ''' img1 - image on which we draw the epilines for the points in img2 + lines - corresponding epilines ''' + r, c = img1.shape + img1 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR) + img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR) + for r, pt1, pt2 in zip(lines, pts1, pts2): + color = tuple(np.random.randint(0, 255, 3).tolist()) + x0, y0 = map(int, [0, -r[2] / r[1]]) + x1, y1 = map(int, [c, -(r[2] + r[0] * c) / r[1]]) + img1 = cv2.line(img1, (x0, y0), (x1, y1), color, 1) + img1 = cv2.circle(img1, tuple(pt1), 5, color, -1) + img2 = cv2.circle(img2, tuple(pt2), 5, color, -1) + return img1, img2 + + +img1 = cv2.imread('myleft.jpg', 0) # queryimage # left image +img2 = cv2.imread('myright.jpg', 0) # trainimage # right image +sift = cv2.xfeatures2d.SIFT_create() +# find the keypoints and descriptors with SIFT +kp1, des1 = sift.detectAndCompute(img1, None)#TODO +kp2, des2 = sift.detectAndCompute(img2, None) + +# FLANN parameters +FLANN_INDEX_KDTREE = 0 +index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) +search_params = dict(checks=50) +flann = cv2.FlannBasedMatcher(index_params, search_params) +matches = flann.knnMatch(des1, des2, k=2) +good = [] +pts1 = [] +pts2 = [] +# ratio test as per Lowe's paper +for i, (m, n) in enumerate(matches): + if m.distance < 0.8 * n.distance: + good.append(m) + pts2.append(kp2[m.trainIdx].pt) + pts1.append(kp1[m.queryIdx].pt) + # 匹配点列表,用它来计算【基础矩阵】 + pts1 = np.int32(pts1) + pts2 = np.int32(pts2) + F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_LMEDS) + # We select only inlier points + pts1 = pts1[mask.ravel() == 1] + pts2 = pts2[mask.ravel() == 1] + # 从两幅图像中计算并绘制极线 + # Find epilines corresponding to points in right image (second image) and + # drawing its lines on left image + lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, F) + lines1 = lines1.reshape(-1, 3) + img5, img6 = drawlines(img1, img2, lines1, pts1, pts2) + # Find epilines corresponding to points in left image (first image) and + # drawing its lines on right image + lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1, 1, 2), 1, F) + lines2 = lines2.reshape(-1, 3) + img3, img4 = drawlines(img2, img1, lines2, pts2, pts1) + plt.subplot(121), plt.imshow(img5) + plt.subplot(122), plt.imshow(img3) + plt.show() + +#从上图可以看出所有的极线都汇聚以图像外的一点 这个点就是极点。 +# 为了得到更好的结果 我们应 使用分辨率比较高的图像和 non-planar 点 \ No newline at end of file diff --git "a/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/code.py" "b/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/code.py" new file mode 100644 index 00000000..62811ab9 --- /dev/null +++ "b/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/code.py" @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午7:09 +# @Author : play4fun +# @File : code.py +# @Software: PyCharm + +""" +code.py: +下图左侧为原始图像 右侧为深度图像。 +如图所示 结果中有很大的噪音。 +通过调整 numDisparities 和 blockSize 的值 我们会得到更好的结果。 +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +imgL = cv2.imread('tsukuba_l.png', 0) +imgR = cv2.imread('tsukuba_r.png', 0) + +#参数不对? +stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15) +# stereo = cv2.StereoBM_create(numDisparities=16, blockSize=21) +disparity = stereo.compute(imgL, imgR) + +#不行 +plt.imshow(disparity, 'gray') +plt.show() + +# cv2.imshow('disparity',disparity) +# cv2.waitKey(0) diff --git "a/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/tsukuba_l.png" "b/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/tsukuba_l.png" new file mode 100644 index 00000000..ab85b2d2 Binary files /dev/null and "b/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/tsukuba_l.png" differ diff --git "a/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/tsukuba_r.png" "b/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/tsukuba_r.png" new file mode 100644 index 00000000..cf1719af Binary files /dev/null and "b/ch45-\347\253\213\344\275\223\345\233\276\345\203\217\344\270\255\347\232\204\346\267\261\345\272\246\345\234\260\345\233\276/tsukuba_r.png" differ diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/1-kNN.py" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/1-kNN.py" new file mode 100644 index 00000000..0c85185d --- /dev/null +++ "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/1-kNN.py" @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午7:17 +# @Author : play4fun +# @File : 1-kNN.py +# @Software: PyCharm + +""" +1-kNN.py: + +k 的取值最好为奇数 +根据 k 个 最近邻居进行分类的方法 称为 kNN + +权重 +距离近的具有更高的权重, 距离远的权重更低 + +""" + +import cv2 +import numpy as np +import matplotlib.pyplot as plt + +# Feature set containing (x,y) values of 25 known/training data +trainData = np.random.randint(0, 100, (25, 2)).astype(np.float32) +# Labels each one either Red or Blue with numbers 0 and 1 +responses = np.random.randint(0, 2, (25, 1)).astype(np.float32) +# Take Red families and plot them +red = trainData[responses.ravel() == 0] + +plt.scatter(red[:, 0], red[:, 1], 80, 'r', '^') +# Take Blue families and plot them +blue = trainData[responses.ravel() == 1] + +plt.scatter(blue[:, 0], blue[:, 1], 80, 'b', 's') +plt.show() + +# 测试数据被标记为绿色 +# # 回值包括 +# 1. 由 kNN算法计算得到的测 数据的类别标志0或1 。 +# 如果你想使用最近邻算法 只需 将 k 置为 1 k 就是最近邻的数目。 +# 2. k 个最近邻居的类别标志。 +# 3. 每个最近邻居到测 数据的 离。 +newcomer = np.random.randint(0, 100, (1, 2)).astype(np.float32) +plt.scatter(newcomer[:, 0], newcomer[:, 1], 80, 'g', 'o') +knn = cv2.ml.KNearest_create() +knn.train(trainData, cv2.ml.ROW_SAMPLE, responses) +ret, results, neighbours, dist = knn.findNearest(newcomer, 3) + +print("result: ", results, "\n") +print("neighbours: ", neighbours, "\n") +print("distance: ", dist) +plt.show() + +# 如果我们有大 的数据 测 可以直接传入一个数组。对应的结果 同样也是数组 + +# 10 new comers +newcomers = np.random.randint(0, 100, (10, 2)).astype(np.float32) +ret, results, neighbours, dist = knn.findNearest(newcomer, 3) +# The results also will contain 10 labels. diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2-\344\275\277\347\224\250kNN\345\257\271\346\211\213\345\206\231\346\225\260\345\255\227OCR.py" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2-\344\275\277\347\224\250kNN\345\257\271\346\211\213\345\206\231\346\225\260\345\255\227OCR.py" new file mode 100644 index 00000000..472ebe1d --- /dev/null +++ "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2-\344\275\277\347\224\250kNN\345\257\271\346\211\213\345\206\231\346\225\260\345\255\227OCR.py" @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午7:32 +# @Author : play4fun +# @File : 2-使用kNN对手写数字OCR.py +# @Software: PyCharm + +""" +2-使用kNN对手写数字OCR.py: +""" + +# 准备数据 + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('../data/digits.png') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + +# Now we split the image to 5000 cells, each 20x20 size +cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)] + +# Make it into a Numpy array. It size will be (50,100,20,20) +x = np.array(cells) +# Now we prepare train_data and test_data. +train = x[:, :50].reshape(-1, 400).astype(np.float32) # Size = (2500,400) +test = x[:, 50:100].reshape(-1, 400).astype(np.float32) # Size = (2500,400) + +# Create labels for train and test data +k = np.arange(10) +train_labels = np.repeat(k, 250)[:, np.newaxis] +test_labels = train_labels.copy() + +# Initiate kNN, train the data, then test it with test data for k=1 +knn = cv2.ml.KNearest_create() +knn.train(train, cv2.ml.ROW_SAMPLE, train_labels) +ret, result, neighbours, dist = knn.findNearest(test, k=5) + +# Now we check the accuracy of classification +# For that, compare the result with test_labels and check which are wrong +matches = result == test_labels +correct = np.count_nonzero(matches) +accuracy = correct * 100.0 / result.size +print('准确率', accuracy) # 准确率91.76% + + +# save the data +np.savez('knn_data.npz', train=train, train_labels=train_labels,test=test,test_labels=test_labels) + +# Now load the data +with np.load('knn_data_num.npz') as data: + print(data.files) + train = data['train'] + train_labels = data['train_labels'] + test = data['test'] + test_labels = data['test_labels'] + + +#TODO 怎样预测数字? +retval, results=knn.predict(test[1003:1005]) +# Docstring: predict(samples[, results[, flags]]) -> retval, results +print(retval, results)#(4.0, array([[ 4.],[ 4.]], dtype=float32)) +#对比 +cv2.imwrite('test[1005].jpg',test[1005].reshape((20,20))) \ No newline at end of file diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2-\350\213\261\346\226\207\345\255\227\346\257\215\347\232\204OCR.py" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2-\350\213\261\346\226\207\345\255\227\346\257\215\347\232\204OCR.py" new file mode 100644 index 00000000..e831998e --- /dev/null +++ "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2-\350\213\261\346\226\207\345\255\227\346\257\215\347\232\204OCR.py" @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午7:35 +# @Author : play4fun +# @File : 2-英文字母的OCR.py +# @Software: PyCharm + +""" +2-英文字母的OCR.py: +""" + +import cv2 +import numpy as np +import matplotlib.pyplot as plt + +# Load the data, converters convert the letter to a number +data = np.loadtxt('../data/letter-recognition.data', dtype='float32', delimiter=',', + converters={0: lambda ch: ord(ch) - ord('A')})#20000个 +# split the data to two, 10000 each for train and test +train, test = np.vsplit(data, 2) +# split trainData and testData to features and responses +responses, trainData = np.hsplit(train, [1]) +labels, testData = np.hsplit(test, [1]) + +# Initiate the kNN, classify, measure accuracy. +knn = cv2.ml.KNearest_create() +knn.train(trainData, cv2.ml.ROW_SAMPLE, responses) +ret, result, neighbours, dist = knn.findNearest(testData, k=5) + +correct = np.count_nonzero(result == labels) +accuracy = correct * 100.0 / 10000 +print('准确率', accuracy)#93.06 +#准确率 到了 93.22%。同样你可以 增加训练样本的数量来提 准确率。 + + +# save the data +np.savez('knn_data_alphabet.npz', train_alphabet=train, train_labels_alphabet=responses,test_alphabet=testData,test_labels_alphabet=labels) + +#怎样预测字母?跟预测数字的一样 diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2.png" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2.png" new file mode 100644 index 00000000..aa1cff4d Binary files /dev/null and "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/2.png" differ diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/6.png" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/6.png" new file mode 100644 index 00000000..9af1eb15 Binary files /dev/null and "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/6.png" differ diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn-find_nearest.py" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn-find_nearest.py" new file mode 100644 index 00000000..1351c02a --- /dev/null +++ "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn-find_nearest.py" @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/8 12:33 +# @Author : play4fun +# @File : knn-find_nearest.py +# @Software: PyCharm + +""" +knn-find_nearest.py: +http://www.bogotobogo.com/python/OpenCV_Python/python_opencv3_Machine_Learning_Classification_K-nearest_neighbors_k-NN.php +""" + +import cv2 +import numpy as np +import matplotlib.pyplot as plt + +# Feature set containing (x,y) values of 25 known/training data +trainData = np.random.randint(0, 100, (25, 2)).astype(np.float32) + +# Labels each one either Red or Blue with numbers 0 and 1 +responses = np.random.randint(0, 2, (25, 1)).astype(np.float32) + +# plot Reds +red = trainData[responses.ravel() == 0] +plt.scatter(red[:, 0], red[:, 1], 80, 'r', '^') + +# plot Blues +blue = trainData[responses.ravel() == 1] +plt.scatter(blue[:, 0], blue[:, 1], 80, 'b', 's') + +# CvKNearest instance +# knn = cv2.KNearest() +knn = cv2.ml.KNearest_create() +# trains the model +knn.train(trainData, responses)#TODO +#TypeError: only length-1 arrays can be converted to Python scalars + + +# New sample : (x,y) +newcomer = np.random.randint(0, 100, (1, 2)).astype(np.float32) +plt.scatter(newcomer[:, 0], newcomer[:, 1], 80, 'g', 'o') + +# Finds the 3nearest neighbors and predicts responses for input vectors +ret, results, neighbours, dist = knn.find_nearest(newcomer, 3) + +print("result: ", results, "\n") +print("neighbours: ", neighbours, "\n") +print("distance: ", dist) + +plt.show() diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn_data_alphabet.npz" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn_data_alphabet.npz" new file mode 100644 index 00000000..b9464f42 Binary files /dev/null and "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn_data_alphabet.npz" differ diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn_data_num.npz" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn_data_num.npz" new file mode 100644 index 00000000..f46fd835 Binary files /dev/null and "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/knn_data_num.npz" differ diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/test[1005].jpg" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/test[1005].jpg" new file mode 100644 index 00000000..a60472c5 Binary files /dev/null and "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/test[1005].jpg" differ diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/\345\220\214\346\227\266\351\242\204\346\265\213\346\225\260\345\255\227\345\222\214\350\213\261\346\226\207\345\255\227\346\257\2151.py" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/\345\220\214\346\227\266\351\242\204\346\265\213\346\225\260\345\255\227\345\222\214\350\213\261\346\226\207\345\255\227\346\257\2151.py" new file mode 100644 index 00000000..95d71edd --- /dev/null +++ "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/\345\220\214\346\227\266\351\242\204\346\265\213\346\225\260\345\255\227\345\222\214\350\213\261\346\226\207\345\255\227\346\257\2151.py" @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/10 17:59 +# @Author : play4fun +# @File : 同时预测数字和英文字母1.py +# @Software: PyCharm + +""" +同时预测数字和英文字母1.py: +""" + + + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +with np.load('knn_data_num.npz') as data: + print(data.files) # ['train', 'train_labels', 'test', 'test_labels'] + train = data['train'] + train_labels = data['train_labels'] + test = data['test'] + test_labels = data['test_labels'] + +with np.load('knn_data_alphabet.npz') as data: + print(data.files) + train_alphabet = data['train_alphabet'] + train_labels_alphabet = data['train_labels_alphabet'] + test_alphabet = data['test_alphabet'] + test_labels_alphabet = data['test_labels_alphabet'] + +# shape不一致,无法合并 +# train.shape #(2500, 400) +# train_alphabet.shape#(10000, 17) +# print('合并-数字-字母数据') +# train = np.append(train, train_alphabet) +# tratrain_labelsin = np.append(train_labels,train_labels_alphabet) +# test = np.append(test, test_alphabet) +# test_labels = np.append(test_labels, test_labels_alphabet) + +print('加载KNN,数据') +knn = cv2.ml.KNearest_create() +knn.train(train, cv2.ml.ROW_SAMPLE, train_labels) +knn.train(train_alphabet, cv2.ml.ROW_SAMPLE, train_labels_alphabet) + +ret, result, neighbours, dist = knn.findNearest( + test, k=5)# shape不一致 +#出错,knearest.cpp:325: error: (-215) test_samples.type() == CV_32F && test_samples.cols == samples.cols in function findNearest \ No newline at end of file diff --git "a/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/\351\242\204\346\265\213\346\211\213\345\206\231\346\225\260\345\255\2271.py" "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/\351\242\204\346\265\213\346\211\213\345\206\231\346\225\260\345\255\2271.py" new file mode 100644 index 00000000..4db18304 --- /dev/null +++ "b/ch46-\346\234\272\345\231\250\345\255\246\344\271\240-K\350\277\221\351\202\273/\351\242\204\346\265\213\346\211\213\345\206\231\346\225\260\345\255\2271.py" @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/8 11:57 +# @Author : play4fun +# @File : 预测手写数字1.py +# @Software: PyCharm + +""" +预测手写数字1.py: + +验证码 +https://login.bthhotels.com/ +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +with np.load('knn_data_num.npz') as data: + print(data.files) # ['train', 'train_labels', 'test', 'test_labels'] + train = data['train'] + train_labels = data['train_labels'] + test = data['test'] + test_labels = data['test_labels'] + +print('加载KNN,数据') +knn = cv2.ml.KNearest_create() +knn.train(train, cv2.ml.ROW_SAMPLE, train_labels) + +# 加载相片 +print('加载相片') +img2 = cv2.imread('2.png', 0) +gray2 = cv2.resize(img2, (20, 20)) +# gray2=gray2.reshape((400,)) +gray21 = gray2.reshape((-1, 400)).astype(np.float32) + +img6 = cv2.imread('6.png', 0) +gray6 = cv2.resize(img6, (20, 20)) +# gray2=gray2.reshape((400,)) +gray61 = gray6.reshape((-1, 400)).astype(np.float32) + +g2 = np.append(gray21, gray61) +g3 = g2.reshape((2, 400)) + +# 预测 +retval, results = knn.predict(g3) +print(retval, results) # 不准确 +# (0.0, array([[ 0.], +# [ 5.]], dtype=float32)) diff --git "a/ch47-\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/47.2-\344\275\277\347\224\250SVM\350\277\233\350\241\214-\346\211\213\345\206\231\346\225\260\346\215\256OCR.py" "b/ch47-\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/47.2-\344\275\277\347\224\250SVM\350\277\233\350\241\214-\346\211\213\345\206\231\346\225\260\346\215\256OCR.py" new file mode 100644 index 00000000..25011222 --- /dev/null +++ "b/ch47-\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/47.2-\344\275\277\347\224\250SVM\350\277\233\350\241\214-\346\211\213\345\206\231\346\225\260\346\215\256OCR.py" @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午8:23 +# @Author : play4fun +# @File : 47.2-使用SVM进行-手写数据OCR.py +# @Software: PyCharm + +""" +47.2-使用SVM进行-手写数据OCR.py: +""" + +import cv2 +import numpy as np + +SZ = 20 +bin_n = 16 # Number of bins +affine_flags = cv2.WARP_INVERSE_MAP | cv2.INTER_LINEAR + + +# 使用方向梯度直方图Histogram of Oriented Gradients HOG 作为特征向量 +def deskew(img): + m = cv2.moments(img) + if abs(m['mu02']) < 1e-2: + return img.copy() + skew = m['mu11'] / m['mu02'] + M = np.float32([[1, skew, -0.5 * SZ * skew], [0, 1, 0]]) + img = cv2.warpAffine(img, M, (SZ, SZ), flags=affine_flags) + return img + + +# 计算图像 X 方向和 Y 方向的 Sobel 导数 +def hog(img): + gx = cv2.Sobel(img, cv2.CV_32F, 1, 0) + gy = cv2.Sobel(img, cv2.CV_32F, 0, 1) + mag, ang = cv2.cartToPolar(gx, gy) + bins = np.int32(bin_n * ang / (2 * np.pi)) # quantizing binvalues in (0...16) + bin_cells = bins[:10, :10], bins[10:, :10], bins[:10, 10:], bins[10:, 10:] + mag_cells = mag[:10, :10], mag[10:, :10], mag[:10, 10:], mag[10:, 10:] + hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells, mag_cells)] + hist = np.hstack(hists) # hist is a 64 bit vector + return hist + + +# 最后 和前 一样 我们将大图分割成小图。使用每个数字的前 250 个作 为训练数据 +# 后 250 个作为测试数据 +img = cv2.imread('../data/digits.png', 0) + +cells = [np.hsplit(row, 100) for row in np.vsplit(img, 50)] +# First half is trainData, remaining is testData +train_cells = [i[:50] for i in cells] +test_cells = [i[50:] for i in cells] + +deskewed = [map(deskew, row) for row in train_cells] +# deskewed = [deskew(row) for row in train_cells] +# deskewed = map(deskew, train_cells) +hogdata = [map(hog, row) for row in deskewed] +# hogdata = [hog(row) for row in deskewed] +# hogdata = map(hog, deskewed) + +trainData = np.float32(hogdata).reshape(-1, 64) +responses = np.float32(np.repeat(np.arange(10), 250)[:, np.newaxis]) + +svm = cv2.ml.SVM_create() +svm.setKernel(cv2.ml.SVM_LINEAR) +svm.setType(cv2.ml.SVM_C_SVC) +svm.setC(2.67) +svm.setGamma(5.383) +svm.train(trainData, cv2.ml.ROW_SAMPLE, responses) +svm.save('svm_data.dat') + +deskewed = [map(deskew, row) for row in test_cells] +hogdata = [map(hog, row) for row in deskewed] +testData = np.float32(hogdata).reshape(-1, bin_n * 4) + +result = svm.predict(testData) +mask = result == responses +correct = np.count_nonzero(mask) +print(correct * 100.0 / result.size) +# 94% diff --git "a/ch47-\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/\347\220\206\350\247\243SVM.txt" "b/ch47-\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/\347\220\206\350\247\243SVM.txt" new file mode 100644 index 00000000..9f2cd674 --- /dev/null +++ "b/ch47-\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/\347\220\206\350\247\243SVM.txt" @@ -0,0 +1,30 @@ + +决定边界 Decision_Boundary +这种使用一条直线 或者是高位空间中的超平面 +上述数据分成 两组的方法为:线性分割 + +从上图中我们看到有很多条直线可以将数据分为蓝红两组 +哪一条直线是 最好的呢 ? +直觉上 这条直线应 是与两组数据的距离越远越好。为什么呢 +因为测试数据可能有噪音影响 真实数据 + 噪声 。 +这些数据不应 影响分类 的准确性。 +所以这条距离远的直线抗噪声能力也就最强。 +所以 SVM 要做就是 : +找到一条直线 并使这条直线到 训练样本 各组数据的最短距离最大。 + +支持向量 +支持平面 + +权重向量 +特征向量 + +# 非线性数据分割 + +可以把一维数据转换成两维数据 +简单来说就是在低维空间不能线性分割的数据在高维空间很有可能可以线性分割。 + +分类错误 + +我们需要对我们的模型进行修正来找到一个更好的决定边界 + 最大的边缘 最小的错误分类 + diff --git "a/48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/\345\220\253\346\234\211\345\244\232\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" "b/ch48-K\345\200\274\350\201\232\347\261\273/48.2.2-\345\220\253\346\234\211\345\244\232\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" old mode 100755 new mode 100644 similarity index 90% rename from "48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/\345\220\253\346\234\211\345\244\232\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" rename to "ch48-K\345\200\274\350\201\232\347\261\273/48.2.2-\345\220\253\346\234\211\345\244\232\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" index e922ff7f..43a2611b --- "a/48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/\345\220\253\346\234\211\345\244\232\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" +++ "b/ch48-K\345\200\274\350\201\232\347\261\273/48.2.2-\345\220\253\346\234\211\345\244\232\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" @@ -1,11 +1,14 @@ # -*- coding: utf-8 -*- -# @Time : 2017/2/24 下午3:14 +# @Time : 2017/7/13 下午9:01 # @Author : play4fun -# @File : 含有多个特征的数据.py +# @File : 48.2.2-含有多个特征的数据.py # @Software: PyCharm """ -含有多个特征的数据.py: +48.2.2-含有多个特征的数据.py: +身高 +体重 + """ # 在前 的 T 恤例子中我们只考 了 现在我们也把体 考 去 也 就是两个特征。 @@ -19,12 +22,13 @@ X = np.random.randint(25, 50, (25, 2)) Y = np.random.randint(60, 85, (25, 2)) Z = np.vstack((X, Y)) + # convert to np.float32 Z = np.float32(Z) - # define criteria and apply kmeans() criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) ret, label, center = cv2.kmeans(Z, 2, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) + # Now separate the data, Note the flatten() A = Z[label.ravel() == 0] B = Z[label.ravel() == 1] diff --git "a/48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.2_\344\273\205\346\234\211\344\270\200\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" "b/ch48-K\345\200\274\350\201\232\347\261\273/48.2.2_\344\273\205\346\234\211\344\270\200\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" similarity index 59% rename from "48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.2_\344\273\205\346\234\211\344\270\200\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" rename to "ch48-K\345\200\274\350\201\232\347\261\273/48.2.2_\344\273\205\346\234\211\344\270\200\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" index 936a1bf8..64ebe648 100755 --- "a/48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.2_\344\273\205\346\234\211\344\270\200\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" +++ "b/ch48-K\345\200\274\350\201\232\347\261\273/48.2.2_\344\273\205\346\234\211\344\270\200\344\270\252\347\211\271\345\276\201\347\232\204\346\225\260\346\215\256.py" @@ -6,6 +6,19 @@ """ 48.2.2_仅有一个特征的数据.py: + +输入参数 +1. samples: 应 是 np.float32 类型的数据 每个特征应 放在一列。 +2. nclusters(K): 聚类的最终数目。 +3. criteria: 终止 代的条件。当条件满 时 算法的 代终止。它应 是 一个含有 3 个成员的元组 它们是 typw max_iter epsilon +4. attempts: 使用不同的 始标 来执 算法的次数。算法会 回紧密度 最好的标 。紧密度也会作为 出 回。 +5. flags 用来 置如何 择 始 心。 常我们有两个 择 cv2.KMEANS_PP_CENTERS 和 cv2.KMEANS_RANDOM_CENTERS。 + +输出参数 +1. compactness 紧密度 回每个点到相应 心的 离的平方和。 +2. labels 标志数组 与上一节提到的代码相同 每个成员 标 为 0 1 等 +3. centers 由聚类的中心组成的数组 + """ # 假 我们有一组数据 每个数据只有一个特征 1 维 。例如前 的 T 恤 我们只使用人们的 来决定 T 恤的大小。 @@ -21,7 +34,10 @@ z = z.reshape((50, 1)) z = np.float32(z) plt.hist(z, 256, [0, 256]), plt.show() -# 现在我们有一个 度为 50 取值范围为 0 到 255 的向 z。我已经将向 z 了 排 将它变成了一个列向 。当每个数据含有多个特征是 会很 有用。然后我们数据类型 换成 np.float32。 +# 现在我们有一个 度为 50 取值范围为 0 到 255 的向量z。我已经将向量z 重排 将它变成了一个列向量。 +# 当每个数据含有多个特征是 会很有用。然后我们数据类型 换成 np.float32。 + +# exit(0) ## @@ -34,9 +50,16 @@ flags = cv2.KMEANS_RANDOM_CENTERS # Apply KMeans compactness, labels, centers = cv2.kmeans(z, 2, None, criteria, 10, flags) -# 返回值有紧密度compactness,标志和中心。在本例中我的到的中心是60和207。标志的数目与测数据的多少是相同的每个数据会标上01等。取决与它们的中心是什么。现在我们可以根据它们的标志将把数据分两组。现在将A组数用红色示将B组数据用蓝色示心用色示。 + + +# 返回值有紧密度compactness,标志和中心。在本例中我的到的中心是60和207。标志的数目与测数据的多少是相同的每个数据会标上01等。取决与它们的中心是什么。 + A = z[labels == 0] B = z[labels == 1] + +# 现在我们可以根据它们的标志将把数据分两组。 +# 现在将A组数用红色示 +# 将B组数据用蓝色示,重心用黄色示。 # Now plot 'A' in red, 'B' in blue, 'centers' in yellow plt.hist(A, 256, [0, 256], color='r') plt.hist(B, 256, [0, 256], color='b') diff --git "a/48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\226.py" "b/ch48-K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\226.py" similarity index 75% rename from "48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\226.py" rename to "ch48-K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\226.py" index 39df0eb6..61e16d96 100755 --- "a/48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\226.py" +++ "b/ch48-K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\226.py" @@ -8,15 +8,15 @@ 48.2.3_颜色量化.py: """ -# 色 化就是减少图片中 色数目的一个 程。为什么 减少图片中的 色呢 减少内存消耗 有些 备的 源有 只能显示很少的 色。在 种情 况下就 色 化。我们使用 K 值聚类的方法来 色 化。 +# 颜色量化就是减少图片中颜色数目的一个过程。为什么 减少图片中的 色呢 减少内存消耗 有些 备的 源有 只能显示很少的 色。在 种情 况下就 色 化。我们使用 K 值聚类的方法来 色 化。 # 没有什么新的知 介绍了。现在有 3 个特征 R G B。所以我们 把图片数据变形成 Mx3 M 是图片中像素点的数目 的向 。聚类完成后 我们用聚类中心值替换与其同组的像素值 样结果图片就只含有指定数目的 色了。下 是代码 # -*- coding: utf-8 -*- import numpy as np import cv2 -# img = cv2.imread('../data/home.jpg') -img = cv2.imread('../data/opencv_logo.png') +img = cv2.imread('../data/home.jpg') +# img = cv2.imread('../data/opencv_logo.png') Z = img.reshape((-1, 3)) # convert to np.float32 Z = np.float32(Z) diff --git "a/48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\2262.py" "b/ch48-K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\2262.py" similarity index 95% rename from "48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\2262.py" rename to "ch48-K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\2262.py" index c9f211e5..3207f088 100755 --- "a/48.2_OpenCV\344\270\255\347\232\204K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\2262.py" +++ "b/ch48-K\345\200\274\350\201\232\347\261\273/48.2.3_\351\242\234\350\211\262\351\207\217\345\214\2262.py" @@ -15,8 +15,8 @@ import numpy as np import cv2 -# img = cv2.imread('../data/home.jpg') -img = cv2.imread('../data/opencv_logo.png') +img = cv2.imread('../data/home.jpg') +# img = cv2.imread('../data/opencv_logo.png') Z = img.reshape((-1, 3)) # convert to np.float32 Z = np.float32(Z) diff --git "a/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/1-fastNlMeansDenoisingColored.py" "b/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/1-fastNlMeansDenoisingColored.py" new file mode 100644 index 00000000..c56b7a7d --- /dev/null +++ "b/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/1-fastNlMeansDenoisingColored.py" @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午9:56 +# @Author : play4fun +# @File : 1-fastNlMeansDenoisingColored.py +# @Software: PyCharm + +""" +1-fastNlMeansDenoisingColored.py: +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +img = cv2.imread('die.png') +img = cv2.cvtColor(img, code=cv2.COLOR_BGR2RGB) + +dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21) +# dst2=cv2.cvtColor(dst,code=cv2.COLOR_BGR2RGB) + +plt.subplot(121), plt.imshow(img) +plt.subplot(122), plt.imshow(dst) +# plt.subplot(122), plt.imshow(dst2) +plt.show() diff --git "a/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/2-fastNlMeansDenoisingMulti.py" "b/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/2-fastNlMeansDenoisingMulti.py" new file mode 100644 index 00000000..9d4ba005 --- /dev/null +++ "b/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/2-fastNlMeansDenoisingMulti.py" @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午9:57 +# @Author : play4fun +# @File : 2-fastNlMeansDenoisingMulti.py +# @Software: PyCharm + +""" +2-fastNlMeansDenoisingMulti.py: +""" + +import numpy as np +import cv2 +from matplotlib import pyplot as plt + +cap = cv2.VideoCapture('../data/vtest.avi') +# create a list of first 5 frames +img = [cap.read()[1] for i in range(5)] +# convert all to grayscale +gray = [cv2.cvtColor(i, cv2.COLOR_BGR2GRAY) for i in img] +# convert all to float64 +gray = [np.float64(i) for i in gray] + + +# create a noise of variance 25 +noise = np.random.randn(*gray[1].shape) * 10 +# Add this noise to images +noisy = [i + noise for i in gray] +# Convert back to uint8 +noisy = [np.uint8(np.clip(i, 0, 255)) for i in noisy] + +# Denoise 3rd frame considering all the 5 frames +dst = cv2.fastNlMeansDenoisingMulti(noisy, 2, 5, None, 4, 7, 35) + + +plt.subplot(131), plt.imshow(gray[2], 'gray') +plt.subplot(132), plt.imshow(noisy[2], 'gray') +plt.subplot(133), plt.imshow(dst, 'gray') +plt.show() diff --git "a/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/die.png" "b/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/die.png" new file mode 100644 index 00000000..ef266e09 Binary files /dev/null and "b/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/die.png" differ diff --git "a/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/\345\216\237\347\220\206.txt" "b/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/\345\216\237\347\220\206.txt" new file mode 100644 index 00000000..566fb328 --- /dev/null +++ "b/ch49-\350\256\241\347\256\227\346\221\204\345\275\261\345\255\246-\345\233\276\345\203\217\345\216\273\345\231\252/\345\216\237\347\220\206.txt" @@ -0,0 +1,14 @@ +目标 +• 学习使用非局部平均值去噪算法去除图像中的噪声 +• 学习函数 cv2.fastNlMeansDenoising() cv2.fastNlMeansDenoisingColored() 等 + + +噪声是平均值为1的随机变量 + +对于彩色图像 先转换到 CIELAB 颜色空间 然后对 L 和 AB 成分 分别去噪 + +OpenCV 中的图像去噪 +1. cv2.fastNlMeansDenoising() 使用对象为灰度图。 +2. cv2.fastNlMeansDenoisingColored() 使用对象为彩色图。 +3. cv2.fastNlMeansDenoisingMulti() 用于短时 的图像序列 灰度图像 +4. cv2.fastNlMeansDenoisingColoredMulti() 用于短时 的图 像序列 彩色图像 \ No newline at end of file diff --git a/ch5/5.VideoCapture.py b/ch5/5.VideoCapture.py deleted file mode 100755 index 7bad9e06..00000000 --- a/ch5/5.VideoCapture.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Fri Jan 3 21:06:22 2014 - -@author: duan - """ - -import numpy as np -import cv2 - -cap = cv2.VideoCapture(0) -# while (True): -while (cap.isOpened()): - # Capture frame-by-frame - ret, frame = cap.read() - - # Our operations on the frame come here - gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) - - # Display the resulting frame - cv2.imshow('frame', gray) - if cv2.waitKey(1) & 0xFF == ord('q'): - break - -# When everything done, release the capture -cap.release() -cv2.destroyAllWindows() diff --git a/ch5/5.VideoPlay.py b/ch5/5.VideoPlay.py deleted file mode 100755 index 1d8d1473..00000000 --- a/ch5/5.VideoPlay.py +++ /dev/null @@ -1,16 +0,0 @@ -import numpy as np -import cv2 - -cap = cv2.VideoCapture('vtest.avi') - -while(cap.isOpened()): - ret, frame = cap.read() - - gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) - - cv2.imshow('frame',gray) - if cv2.waitKey(1) & 0xFF == ord('q'): - break - -cap.release() -cv2.destroyAllWindows() \ No newline at end of file diff --git a/ch5/5.VideoWriter.py b/ch5/5.VideoWriter.py deleted file mode 100755 index 853d4d6f..00000000 --- a/ch5/5.VideoWriter.py +++ /dev/null @@ -1,29 +0,0 @@ -import numpy as np -import cv2 - -cap = cv2.VideoCapture(0) - -# Define the codec and create VideoWriter object -fourcc = cv2.VideoWriter_fourcc(*'XVID')#opencv 3.0 -#Error: 'module' object has no attribute 'VideoWriter_fourcc' -# -out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))#上下颠倒 - -while(cap.isOpened()): - ret, frame = cap.read() - if ret==True: - frame = cv2.flip(frame,0) - - # write the flipped frame - out.write(frame) - - cv2.imshow('frame',frame) - if cv2.waitKey(1) & 0xFF == ord('q'): - break - else: - break - -# Release everything if job is finished -cap.release() -out.release() -cv2.destroyAllWindows() \ No newline at end of file diff --git a/ch5/__init__.py b/ch5/__init__.py deleted file mode 100755 index c3e116a5..00000000 --- a/ch5/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'play' diff --git a/ch50-2-HDR-HighDynamicRange/1tl.jpg b/ch50-2-HDR-HighDynamicRange/1tl.jpg new file mode 100644 index 00000000..17a7012d Binary files /dev/null and b/ch50-2-HDR-HighDynamicRange/1tl.jpg differ diff --git a/ch50-2-HDR-HighDynamicRange/2tr.jpg b/ch50-2-HDR-HighDynamicRange/2tr.jpg new file mode 100644 index 00000000..a6ade4f5 Binary files /dev/null and b/ch50-2-HDR-HighDynamicRange/2tr.jpg differ diff --git a/ch50-2-HDR-HighDynamicRange/3bl.jpg b/ch50-2-HDR-HighDynamicRange/3bl.jpg new file mode 100644 index 00000000..61dcd424 Binary files /dev/null and b/ch50-2-HDR-HighDynamicRange/3bl.jpg differ diff --git a/ch50-2-HDR-HighDynamicRange/4br.jpg b/ch50-2-HDR-HighDynamicRange/4br.jpg new file mode 100644 index 00000000..d21c606c Binary files /dev/null and b/ch50-2-HDR-HighDynamicRange/4br.jpg differ diff --git a/ch50-2-HDR-HighDynamicRange/HDR.py b/ch50-2-HDR-HighDynamicRange/HDR.py new file mode 100644 index 00000000..d51b824d --- /dev/null +++ b/ch50-2-HDR-HighDynamicRange/HDR.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午11:43 +# @Author : play4fun +# @File : HDR.py +# @Software: PyCharm + +""" +HDR.py: +http://docs.opencv.org/3.2.0/d2/df0/tutorial_py_hdr.html + +了解如何从曝光序列生成和显示HDR图像。 +使用曝光融合合并曝光序列。 + +高动态范围成像(HDRI或HDR)是一种用于成像和摄影的技术,可以重现比标准数字成像或摄影技术更大的动态光度范围。虽然人眼可以调整到广泛的光线条件,但大多数成像设备每通道使用8位,因此我们仅限于256级。当我们拍摄现实世界的场景时,明亮的地区可能曝光过度,而黑暗的区域可能曝光不足,所以我们无法使用单次曝光拍摄所有细节。HDR图像与每个通道使用超过8位(通常为32位浮点值)的图像一起使用,允许更宽的动态范围。 + +有不同的获取HDR图像的方法,但最常见的是使用不同曝光值拍摄的场景的照片。要组合这些曝光,了解您的相机的响应功能是有用的,并且有算法来估计它。合并HDR图像后,必须将其转换回8位才能在通常的显示屏上进行查看。这个过程叫做tonemapping。当场景或相机的对象在拍摄之间移动时,会出现附加的复杂性,因为具有不同曝光的图像应该被注册和对齐。 + +在本教程中,我们展示了两种算法(Debvec,Robertson)从曝光序列生成和显示HDR图像,并展示了一种称为曝光融合(Mertens)的替代方法,它产生低动态范围图像,不需要曝光时间数据。此外,我们估计对于许多计算机视觉算法具有重要价值的相机响应函数(CRF)。HDR管道的每一步都可以使用不同的算法和参数来实现,因此请参考参考手册来查看。 + + + +""" + +import cv2 +import numpy as np + +# 第一阶段只是将所有图像加载到列表中。此外,我们将需要常规HDR算法的曝光时间。注意数据类型,因为图像应为1通道或3通道8位(np.uint8),曝光时间需要为float32,以秒为单位。 +# Loading exposure images into a list +img_fn = ["1tl.jpg", "2tr.jpg", "3bl.jpg", "4br.jpg"] +img_list = [cv2.imread(fn) for fn in img_fn] +exposure_times = np.array([15.0, 2.5, 0.25, 0.0333], dtype=np.float32) + +# Merge exposures to HDR image +# 在这个阶段,我们将曝光序列合并成一个HDR图像,显示了我们在OpenCV中的两种可能性。第一种方法是Debvec,第二种是Robertson。请注意,HDR图像的类型为float32,而不是uint8,因为它包含所有曝光图像的完整动态范围。 + +merge_debvec = cv2.createMergeDebevec() +hdr_debvec = merge_debvec.process(img_list, times=exposure_times.copy()) +merge_robertson = cv2.createMergeRobertson() +hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy()) + +# Tonemap HDR image +# 我们将32位浮点HDR数据映射到范围[0..1]。实际上,在某些情况下,值可能大于1或低于0,所以注意我们以后不得不剪切数据,以避免溢出。 +tonemap1 = cv2.createTonemapDurand(gamma=2.2) +res_debvec = tonemap1.process(hdr_debvec.copy()) +tonemap2 = cv2.createTonemapDurand(gamma=1.3) +res_robertson = tonemap2.process(hdr_robertson.copy()) + +# Exposure fusion using Mertens +# 这里我们展示了一种可以合并曝光图像的替代算法,我们不需要曝光时间。我们也不需要使用任何tonemap算法,因为Mertens算法已经给出了[0..1]范围内的结果。 +merge_mertens = cv2.createMergeMertens() +res_mertens = merge_mertens.process(img_list) + +# Convert datatype to 8-bit and save +# 为了保存或显示结果,我们需要将数据转换为[0..255]范围内的8位整数。 +res_debvec_8bit = np.clip(res_debvec * 255, 0, 255).astype('uint8') +res_robertson_8bit = np.clip(res_robertson * 255, 0, 255).astype('uint8') +res_mertens_8bit = np.clip(res_mertens * 255, 0, 255).astype('uint8') + +cv2.imwrite("ldr_debvec.jpg", res_debvec_8bit) +cv2.imwrite("ldr_robertson.jpg", res_robertson_8bit) +cv2.imwrite("fusion_mertens.jpg", res_mertens_8bit) + +exit(0) + +# Estimate camera response function (CRF) +# 相机响应功能(CRF)给出了场景辐射度与测量强度值之间的连接。如果在一些计算机视觉算法中非常重要,包括HDR算法,CRF。这里我们估计反相机响应函数并将其用于HDR合并。 +cal_debvec = cv2.createCalibrateDebevec() +crf_debvec = cal_debvec.process(img_list, times=exposure_times) +hdr_debvec = merge_debvec.process(img_list, times=exposure_times.copy(), response=crf_debvec.copy()) +cal_robertson = cv2.createCalibrateRobertson() +crf_robertson = cal_robertson.process(img_list, times=exposure_times) +hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy(), response=crf_robertson.copy()) diff --git a/ch50-2-HDR-HighDynamicRange/exposures.jpg b/ch50-2-HDR-HighDynamicRange/exposures.jpg new file mode 100644 index 00000000..118c53f9 Binary files /dev/null and b/ch50-2-HDR-HighDynamicRange/exposures.jpg differ diff --git a/ch50-2-HDR-HighDynamicRange/fusion_mertens.jpg b/ch50-2-HDR-HighDynamicRange/fusion_mertens.jpg new file mode 100644 index 00000000..61b00737 Binary files /dev/null and b/ch50-2-HDR-HighDynamicRange/fusion_mertens.jpg differ diff --git a/ch50-2-HDR-HighDynamicRange/ldr_debvec.jpg b/ch50-2-HDR-HighDynamicRange/ldr_debvec.jpg new file mode 100644 index 00000000..3a021718 Binary files /dev/null and b/ch50-2-HDR-HighDynamicRange/ldr_debvec.jpg differ diff --git a/ch50-2-HDR-HighDynamicRange/ldr_robertson.jpg b/ch50-2-HDR-HighDynamicRange/ldr_robertson.jpg new file mode 100644 index 00000000..d8c20da5 Binary files /dev/null and b/ch50-2-HDR-HighDynamicRange/ldr_robertson.jpg differ diff --git "a/ch50-\345\233\276\345\203\217\344\277\256\350\241\245/inpaint.py" "b/ch50-\345\233\276\345\203\217\344\277\256\350\241\245/inpaint.py" new file mode 100644 index 00000000..b26502d2 --- /dev/null +++ "b/ch50-\345\233\276\345\203\217\344\277\256\350\241\245/inpaint.py" @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/13 下午10:33 +# @Author : play4fun +# @File : inpaint.py +# @Software: PyCharm + +""" +inpaint.py: +算法 +1.基于快速行进算法cv2.INPAINT_TELEA +2.基于流体动力学并使用了偏微分方程。基本原理是启发式的 cv2.INPAINT_NS +""" + +import numpy as np +import cv2 + +img = cv2.imread('../data/messi_2.jpg') +mask = cv2.imread('../data/mask2.png', 0) +cv2.imshow('img', img) +cv2.imshow('mask', mask) + +dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA) +cv2.imshow('INPAINT_TELEA', dst) + +dst2 = cv2.inpaint(img, mask, 3, cv2.INPAINT_NS) +cv2.imshow('INPAINT_NS', dst2) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch51-\345\257\271xiang\346\243\200\346\265\213/51.CascadeClassifier.py" "b/ch51-\345\257\271xiang\346\243\200\346\265\213/51.CascadeClassifier.py" deleted file mode 100755 index bdaae4d2..00000000 --- "a/ch51-\345\257\271xiang\346\243\200\346\265\213/51.CascadeClassifier.py" +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- - -import numpy as np -import cv2 - -face_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml') -eye_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_eye.xml') - -#img = cv2.imread('../data/sachin.jpg') -img = cv2.imread('../data/kongjie_hezhao.jpg') -gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - -#Detects objects of different sizes in the input image. -# The detected objects are returned as a list of rectangles. -#cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize) -#scaleFactor – Parameter specifying how much the image size is reduced at each image -#scale. -#minNeighbors – Parameter specifying how many neighbors each candidate rectangle should -#have to retain it. -#minSize – Minimum possible object size. Objects smaller than that are ignored. -#maxSize – Maximum possible object size. Objects larger than that are ignored. -faces = face_cascade.detectMultiScale(gray, 1.3, 5) -print "Detected ",len(faces)," face" - -for (x,y,w,h) in faces: - img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) - roi_gray = gray[y:y+h, x:x+w] - roi_color = img[y:y+h, x:x+w] - - eyes = eye_cascade.detectMultiScale(roi_gray) - for (ex,ey,ew,eh) in eyes: - cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) - -cv2.imshow('img',img) -cv2.waitKey(0) -cv2.destroyAllWindows() diff --git "a/ch51-\345\257\271xiang\346\243\200\346\265\213/51.CascadeClassifier.py~" "b/ch51-\345\257\271xiang\346\243\200\346\265\213/51.CascadeClassifier.py~" deleted file mode 100755 index 0e635bda..00000000 --- "a/ch51-\345\257\271xiang\346\243\200\346\265\213/51.CascadeClassifier.py~" +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- - -import numpy as np -import cv2 - -face_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml') -eye_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_eye.xml') - -img = cv2.imread('../data/sachin.jpg') -# img = cv2.imread('../data/kongjie_hezhao.jpg') -gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - -#Detects objects of different sizes in the input image. -# The detected objects are returned as a list of rectangles. -#cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize) -#scaleFactor – Parameter specifying how much the image size is reduced at each image -#scale. -#minNeighbors – Parameter specifying how many neighbors each candidate rectangle should -#have to retain it. -#minSize – Minimum possible object size. Objects smaller than that are ignored. -#maxSize – Maximum possible object size. Objects larger than that are ignored. -faces = face_cascade.detectMultiScale(gray, 1.3, 5) -print "Detected ",len(faces)," face" - -for (x,y,w,h) in faces: - img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) - roi_gray = gray[y:y+h, x:x+w] - roi_color = img[y:y+h, x:x+w] - - eyes = eye_cascade.detectMultiScale(roi_gray) - for (ex,ey,ew,eh) in eyes: - cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) - -cv2.imshow('img',img) -cv2.waitKey(0) -cv2.destroyAllWindows() diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/51.CascadeClassifier\347\272\247\350\201\224\345\210\206\347\261\273\345\231\250.py" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/51.CascadeClassifier\347\272\247\350\201\224\345\210\206\347\261\273\345\231\250.py" new file mode 100755 index 00000000..955d0d75 --- /dev/null +++ "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/51.CascadeClassifier\347\272\247\350\201\224\345\210\206\347\261\273\345\231\250.py" @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +''' +以 Haar 特征分类器为基础的面部检测技术 +将面部检测扩展到眼部检测等。 + +以 Haar 特征分类器为基础的对 检测技术是一种 常有效的对 检测 技术 2001 年 Paul_Viola 和 Michael_Jones 提出 。它是基于机器学习的 使用大 的正 样本图像 练得到一个 cascade_function 最后再用它 来做对 检测。 +现在我们来学习 检测。开始时 算法 大 的正样本图像 图 像 和 样本图像 不含 的图像 来 练分类器。我们 从其中提取特 征。下图中的 Haar 特征会 使用。它们就像我们的卷积核。每一个特征是一 个值 个值等于 色矩形中的像素值之后减去白色矩形中的像素值之和。 + + 那么我们怎样从超过160000+ 个特征中 出最好的特征呢 ? + 使用 Adaboost。 + +OpenCV 自带了训练器和检测器。如果你想自己训练一个分类器来检测 汽车飞机等的 +可以使用 OpenCV 构建。 +Cascade Classifier Training :http://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html + + +''' + +import numpy as np +import cv2 + +# 运行之前,检查cascade文件路径是否在你的电脑上 +face_cascade = cv2.CascadeClassifier('/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml') +eye_cascade = cv2.CascadeClassifier('/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml') + +# img = cv2.imread('../data/sachin.jpg') +# img = cv2.imread('../data/kongjie_hezhao.jpg') +img = cv2.imread('../data/airline-stewardess-bikini.jpg') +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +# cv2.imshow('gray', gray) + + +# Detects objects of different sizes in the input image. +# The detected objects are returned as a list of rectangles. +# cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize) +# scaleFactor – Parameter specifying how much the image size is reduced at each image +# scale. +# minNeighbors – Parameter specifying how many neighbors each candidate rectangle should +# have to retain it. +# minSize – Minimum possible object size. Objects smaller than that are ignored. +# maxSize – Maximum possible object size. Objects larger than that are ignored. +# faces = face_cascade.detectMultiScale(gray, 1.3, 5) +faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)#改进 +print("Detected ", len(faces), " face") + +for (x, y, w, h) in faces: + img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) + roi_gray = gray[y:y + h, x:x + w] + roi_color = img[y:y + h, x:x + w] + + eyes = eye_cascade.detectMultiScale(roi_gray) + for (ex, ey, ew, eh) in eyes: + cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) + +cv2.imshow('img', img) +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/haarcascades.md" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/haarcascades.md" new file mode 100644 index 00000000..ff64865d --- /dev/null +++ "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/haarcascades.md" @@ -0,0 +1,18 @@ +# haarcascades xml文件 + +```bash +nvidia@gpu:/usr/share/OpenCV/haarcascades$ ls +haarcascade_eye_tree_eyeglasses.xml haarcascade_mcs_eyepair_small.xml +haarcascade_eye.xml haarcascade_mcs_leftear.xml +haarcascade_frontalcatface_extended.xml haarcascade_mcs_lefteye.xml +haarcascade_frontalcatface.xml haarcascade_mcs_mouth.xml +haarcascade_frontalface_alt2.xml haarcascade_mcs_nose.xml +haarcascade_frontalface_alt_tree.xml haarcascade_mcs_rightear.xml +haarcascade_frontalface_alt.xml haarcascade_mcs_righteye.xml +haarcascade_frontalface_default.xml haarcascade_mcs_upperbody.xml +haarcascade_fullbody.xml haarcascade_profileface.xml +haarcascade_lefteye_2splits.xml haarcascade_righteye_2splits.xml +haarcascade_licence_plate_rus_16stages.xml haarcascade_russian_plate_number.xml +haarcascade_lowerbody.xml haarcascade_smile.xml +haarcascade_mcs_eyepair_big.xml haarcascade_upperbody.xml +``` \ No newline at end of file diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/visualisation_single_stage.png" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/visualisation_single_stage.png" new file mode 100644 index 00000000..e87bc225 Binary files /dev/null and "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/visualisation_single_stage.png" differ diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/visualisation_video.png" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/visualisation_video.png" new file mode 100644 index 00000000..f3ce484d Binary files /dev/null and "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/visualisation_video.png" differ diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\345\257\271\350\261\241\346\243\200\346\265\213-\345\210\233\345\273\272\350\207\252\345\267\261\347\232\204\346\250\241\345\235\227.md" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\345\257\271\350\261\241\346\243\200\346\265\213-\345\210\233\345\273\272\350\207\252\345\267\261\347\232\204\346\250\241\345\235\227.md" new file mode 100644 index 00000000..d6410a4f --- /dev/null +++ "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\345\257\271\350\261\241\346\243\200\346\265\213-\345\210\233\345\273\272\350\207\252\345\267\261\347\232\204\346\250\241\345\235\227.md" @@ -0,0 +1,174 @@ +# 创建自己想检测的模块 +使用官方OpenCV应用程序:opencv_createsamples,opencv_annotation,opencv_traincascade和opencv_visualisation 实现 + + +原文: +http://docs.opencv.org/3.2.0/dc/d88/tutorial_traincascade.html + +## 介绍 +使用弱分类器的升级级联包括两个主要阶段:培训和检测阶段。使用HAAR或LBP的模型的检测阶段在对象检测教程中进行了描述。本文档概述了培训您自己的弱分类器级联的功能。目前的指导将贯穿各个阶段:收集培训数据,准备培训数 + +## 准备培训资料 + +为了训练弱分类器的级联,我们需要一组积极的样本(包含要检测的实际对象)和一组负图像(包含您不想检测的所有内容)。必须手动准备一组负样本,而使用opencv_createsamples应用程序创建一组正样本。 + +## 负样本 + +负样本取自任意图像,不包含要检测的对象。这些生成样本的负图像应该列在一个特殊的负图像文件中,每个行包含一个图像路径(可以是绝对的或相对的)。请注意,负样本和样本图像也称为背景样本或背景图像,并在本文档中可互换使用。 + +描述的图像可以具有不同的尺寸。然而,每个图像应该等于或大于所需的训练窗口大小(其对应于模型尺寸,大多数时间是对象的平均大小),因为这些图像用于将给定的负图像分割成多个图像具有此训练窗口大小的样本。 + +这样一个负面描述文件的例子: + +目录结构: + +/ IMG + img1.jpg + img2.jpg +bg.txt +文件bg.txt: + +IMG / img1.jpg +IMG / img2.jpg +您将会使用一组负窗口样本来告诉机器学习步骤,在尝试找到感兴趣的对象时,在这种情况下,提升无法寻找的内容。 + +## 阳性样品 + +正样本由opencv_createsamples应用程序创建。它们被推动过程用于定义当试图找到您感兴趣的对象时实际寻找的模型。该应用程序支持生成正样本数据集的两种方式。 + +您可以从单个正面对象图像生成一堆积极的。 +您可以自己提供所有的积极因素,只能使用该工具剪切出来,调整大小并将它们放在opencv所需的二进制格式中。 +虽然第一种方法对固定对象工作正常,如非常刚性的标志,但是对于较少刚性的对象,它往往会失败。在这种情况下,我们建议使用第二种方法。通过使用opencv_createsamples应用程序,网络上的许多教程甚至可以指示100个真实对象图像,可以导致比1000个人为生成的正面更好的模型。如果你决定采取第一种方法,请记住一些事情: + +请注意,在将其提交给上述应用程序之前,您需要使用多个单一的积极样本,因为它仅适用于透视变换。 +如果您想要一个健壮的模型,请采集涵盖范围广泛的可能在对象类中发生的变体的样本。例如,在面孔的情况下,您应该考虑不同的种族和年龄组,情绪和胡须风格。这也适用于使用第二种方法时。 +第一种方法采用单个对象图像,例如公司徽标,并通过随机旋转对象,改变图像强度以及将图像放置在任意背景上,从给定对象图像创建大量正样本。随机性的数量和范围可以通过opencv_createsamples应用程序的命令行参数来控制。 + +命令行参数: + +* -vec :包含训练样本的输出文件的名称。 +* -img :源对象图像(如公司徽标)。 +* -bg :背景描述文件; 包含用作对象的随机变形版本的背景的图像列表。 +* -num :生成的阳性样本数。 +* -bgcolor :背景颜色(目前为灰度图像)背景颜色表示透明颜色。由于可能会出现压缩伪影,所以可以通过-bgthresh指定颜色容差的数量。具有bgcolor-bgthresh和bgcolor + bgthresh范围的所有像素都被解释为透明的。 +* -bgthresh +* -inv :如果指定,颜色将被反转。 +* -randinv :如果指定,颜色将随机反转。 +* -maxidev :前景样本中像素的最大强度偏差。 +* -maxxangle :朝向x轴的最大旋转角度必须以弧度表示。 +* -maxyangle :向y轴的最大旋转角度必须以弧度表示。 +* -maxzangle :朝向z轴的最大旋转角度必须以弧度表示。 +* -show:有用的调试选项。如果指定,将显示每个样品。按Esc将继续样品创建过程,而不显示每个样品。 +* -w :输出样本的宽度(以像素为单位)。 +* -h :输出样本的高度(以像素为单位)。 +以这种方式运行opencv_createsamples时,使用以下过程创建一个示例对象实例:给定的源图像围绕所有三个轴随机旋转。所选择的角由限制-maxxangle,-maxyangle和-maxzangle。那么具有来自[bg_color-bg_color_threshold; bg_color + bg_c​​olor_threshold]范围被解释为透明。将白噪声添加到前景的强度。如果-inv指定了键,则前景像素强度被反转。如果-randinv指定了密钥,则算法随机选择是否应该对该样本应用反演。最后,所获得的图像被放置在从背景描述文件的任意的背景下,调整为所指定的所需的大小-w和-h和存储到VEC文件,-vec + +也可以从先前标记的图像的集合获得正样本,这是构建鲁棒对象模型时的期望方式。该集合由与背景描述文件类似的文本文件描述。该文件的每行对应一个图像。该行的第一个元素是文件名,后跟对象注释的数量,后跟数字描述边界矩形(x,y,width,height)的对象的坐标。 + +描述文件的一个例子: + +目录结构: + +/ IMG + img1.jpg + img2.jpg +info.dat +文件info.dat: + +img / img1.jpg 1 140 100 45 45 +img / img2.jpg 2 100 200 50 50 50 30 25 25 + +图像img1.jpg包含具有以下边界矩形坐标的单个对象实例:(140,100,45,45)。图像img2.jpg包含两个对象实例。 + +为了从这样的收集中创建积极的样本,-info应该指定参数,而不是-img: + +* -info :标记图像集合的描述文件。 +请注意,在这种情况下,这些参数-bg, -bgcolor, -bgthreshold, -inv, -randinv, -maxxangle, -maxyangle, -maxzangle被简单地忽略,不再使用。在这种情况下,样本创建的方案如下。通过从原始图像中切出提供的边界框,从给定图像中取出对象实例。然后它们被调整到目标样本大小(通过定义-w和-h),并存储在输出VEC-文件,由定义的-vec参数。无失真应用,所以只能影响参数是-w,-h,-show和-num。 + +创建-info文件的手动过程也可以使用opencv_annotation工具完成。这是一个开源工具,用于在任何给定的图像中可视化地选择对象实例的感兴趣区域。以下小节将详细讨论如何使用此应用程序。 + +## 额外的言论 + +opencv_createsamples实用程序可用于检查存储在任何给定的正样本文件中的样本。为了做到这一点只-vec,-w并-h应指定的参数。 +vec文件的示例可在此处使用opencv/data/vec_files/trainingfaces_24-24.vec。它可以用于训练具有以下窗口大小的面部检测器:-w 24 -h 24。 +## 使用OpenCV的集成注释工具 + +由于OpenCV 3.x社区一直在提供和维护用于生成-info文件的开放源代码注释工具。如果OpenCV应用程序在其中构建,该工具可以通过命令opencv_annotation访问。 + +使用该工具非常简单。该工具接受几个必需的和一些可选的参数: + +* --annotations (必需):注释txt文件的路径,您要存储注释的位置,然后传递给-info参数[example - /data/annotations.txt] +* --images (必需):包含与对象的图像的文件夹的路径[example - / data / testimages /] +* --maxWindowHeight (可选):如果输入图像的高度较大,则在此给定分辨率,请调整图像的大小,以便更容易的注释,使用--resizeFactor。 +* --resizeFactor (可选):使用--maxWindowHeight参数时用于调整输入图像大小的因子。 +请注意,可选参数只能一起使用。下面可以看到可以使用的命令的例子 + +opencv_annotation --annotations = / path / to / annotations / file.txt --images = / path / to / image / folder / +此命令将启动一个包含将用于注释的第一个图像和鼠标光标的窗口。有关如何使用注释工具的视频,请点击此处。基本上有几个触发动作的按键。鼠标左键用于选择对象的第一个角,然后继续绘制,直到您正常,并且注册了第二个鼠标左键单击时停止。每次选择后,您都有以下选择: + +按c:确认注释,​​将注释转为绿色并确认其存储 +按d:从注释列表中删除最后一个注释(易于删除错误的注释) +按n:继续下一张图片 +按ESC:这将退出注释软件 +最后你会得到一个可以传递给-infoopencv_createsamples参数的可用注释文件。 + +## 级联训练 + +下一步是基于预先准备的正数和负数据集,对弱分类器的升压级联进行实际训练。 + +opencv_traincascade应用程序的命令行参数按目的分组: + +共同论点: +* -data :训练有素的分类器应存放在哪里。预先手动创建该文件夹。 +* -vec :带有正样本的vec文件(由opencv_createsamples实用程序创建)。 +* -bg :背景描述文件。这是包含负样本图像的文件。 +* -numPos :每个分类阶段培训使用的阳性样本数。 +* -numNeg :每个分类阶段训练中使用的负样本数。 +* -numStages :要训练的级联级数。 +* -precalcValBufSize :预先计算的特征值的缓冲区大小(以Mb为单位)。您指定的快训练过程中更多的内存,但是请记住,-precalcValBufSize并-precalcIdxBufSize结合不应超过您可用的系统内存。 +* -precalcIdxBufSize :用于预先计算的特征索引(Mb)的缓冲区大小。您指定的快训练过程中更多的内存,但是请记住,-precalcValBufSize并-precalcIdxBufSize结合不应超过您可用的系统内存。 +* -baseFormatSave:这个说法在哈尔式的特征的情况下是实际的。如果指定,级联将以旧格式保存。这仅适用于向后兼容性原因,并允许用户坚持使用旧的已弃用的界面,至少使用较新界面对模型进行训练。 +* -numThreads :训练期间使用的最大线程数。请注意,根据您的机器和编译选项,实际使用的线程数可能会较低。默认情况下,如果您使用TBB支持构建OpenCV(此优化所需),则可以选择最大可用线程。 +* -acceptanceRatioBreakValue :此参数用于确定您的模型应该如何精确地保持学习和何时停止。一个好的指导方针是训练不超过10e-5,以确保该模型不会超出您的训练数据。默认情况下,该值设置为-1以禁用此功能。 +级联参数: +* -stageType :阶段类型 目前仅支持升级分类器作为舞台类型。 +* -featureType<{HAAR(default), LBP}> :特征类型:HAAR - 类似Haar的功能,LBP - 本地二进制模式。 +* -w :训练样本的宽度(以像素为单位)。必须具有与训练样本创建期间使用的完全相同的值(opencv_createsamples实用程序)。 +* -h :训练样本的高度(以像素为单位)。必须具有与训练样本创建期间使用的完全相同的值(opencv_createsamples实用程序)。 +提升的分类参数: +* -bt <{DAB, RAB, LB, GAB(default)}> :提升分类器的类型:DAB - Discrete AdaBoost,RAB - Real AdaBoost,LB - LogitBoost,GAB - Gentle AdaBoost。 +* -minHitRate :分类器的每个阶段的最小期望命中率。总命中率可以估计为(min_hit_rate ^ number_of_stages),[164] §4.1。 +* -maxFalseAlarmRate :分类器每个阶段的最大期望误报率。总误报率可以估计为(max_false_alarm_rate ^ number_of_stages),[164] §4.1。 +* -weightTrimRate :指定是否使用修剪及其重量。一个体面的选择是0.95。 +* -maxDepth :弱树的最大深度。一个体面的选择是1,就是树桩的情况。 +* -maxWeakCount :每个级联阶段弱树的最大数量。提升的分类器(阶段)将具有如此多的弱树(<= maxWeakCount),以实现给定的需要-maxFalseAlarmRate。 +哈尔式功能参数: +* -mode :选择训练中使用的Haar功能集的类型。BASIC仅使用直立功能,而ALL使用全套直立和45度旋转功能集。有关详细信息,请参阅[97]。 +局部二进制模式参数:局部二进制模式没有参数。 +opencv_traincascade应用程序完成工作后,训练好的级联将被保存在cascade.xml文件-data夹中。此文件夹中的其他文件是针对中断培训的情况而创建的,因此您可以在完成培训后将其删除。 + +训练完毕,你可以测试你的级联分类器! + +## 可视化级联分类器 + +有时可以将训练出的级联可视化,查看其选择的功能以及其阶段的复杂程度。为此OpenCV提供了一个opencv_visualisation应用程序。此应用程序具有以下命令: + +* --image (必需):对象模型的引用图像的路径。这应该是一个注释,其尺寸[ -w,-h]传递给opencv_createsamples和opencv_traincascade应用程序。 +* --model (必需):训练模型的路径,它应该在提供给-dataopencv_traincascade应用程序参数的文件夹中。 +* --data (可选):如果提供了必须事先手动创建的数据文件夹,则会存储舞台输出和功能的视频。 +示例命令可以在下面看到 + +opencv_visualisation --image = / data / object.png --model = / data / model.xml --data = / data / result / +当前可视化工具的一些限制 + +只处理使用opencv_traincascade工具训练的级联分类器模型,其中包含树桩作为决策树[默认设置]。 +提供的图像需要是具有原始模型尺寸的示例窗口,并传递给--image参数。 +HAAR / LBP面部模型的示例在Angelina Jolie的给定窗口上运行,该窗口具有与级联分类器文件相同的预处理 - > 24x24像素图像,灰度转换和直方图均衡: + +为每个阶段制作一个视频,每个功能可视化: + +![visualisation_video](visualisation_video.png "visualisation_video") + +每个阶段都存储为一个图像,以便将来验证这些功能: + +![visualisation_single_stage](visualisation_single_stage.png "visualisation_single_stage") \ No newline at end of file diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/Pedestrian_Detection1.py" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/Pedestrian_Detection1.py" new file mode 100644 index 00000000..2da3c87f --- /dev/null +++ "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/Pedestrian_Detection1.py" @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/23 下午3:55 +# @Author : play4fun +# @File : Pedestrian_Detection1.py +# @Software: PyCharm + +""" +Pedestrian_Detection1.py: + +网址 +http://www.pyimagesearch.com/2015/11/09/pedestrian-detection-opencv/ + +运行 +python Pedestrian_Detection1.py --images images +""" + +# import the necessary packages +from __future__ import print_function +from imutils.object_detection import non_max_suppression +from imutils import paths +import numpy as np +import argparse +import imutils +import cv2 + +# construct the argument parse and parse the arguments +ap = argparse.ArgumentParser() +ap.add_argument("-i", "--images", required=True, help="path to images directory") +args = vars(ap.parse_args()) + +# initialize the HOG descriptor/person detector +hog = cv2.HOGDescriptor() +hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) + +# loop over the image paths +for imagePath in paths.list_images(args["images"]): + # load the image and resize it to (1) reduce detection time + # and (2) improve detection accuracy + image = cv2.imread(imagePath) + image = imutils.resize(image, width=min(400, image.shape[1])) + orig = image.copy() + + # detect people in the image + (rects, weights) = hog.detectMultiScale(image, winStride=(4, 4), + padding=(8, 8), scale=1.05) + + # draw the original bounding boxes + for (x, y, w, h) in rects: + cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2) + + # apply non-maxima suppression to the bounding boxes using a + # fairly large overlap threshold to try to maintain overlapping + # boxes that are still people + rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects]) + pick = non_max_suppression(rects, probs=None, overlapThresh=0.65) + + # draw the final bounding boxes + for (xA, yA, xB, yB) in pick: + cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2) + + # show some information on the number of bounding boxes + filename = imagePath[imagePath.rfind("/") + 1:] + print("[INFO] {}: {} original boxes, {} after suppression".format( + filename, len(rects), len(pick))) + + # show the output images + cv2.imshow("Before NMS", orig) + cv2.moveWindow('Before NMS', x=0, y=0) + cv2.imshow("After NMS", image) + cv2.moveWindow('After NMS', x=orig.shape[1], y=0) + k=cv2.waitKey(0) + if k==ord('q'): + break diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/Pedestrian_Detection_video.py" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/Pedestrian_Detection_video.py" new file mode 100644 index 00000000..a1eb0b0d --- /dev/null +++ "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/Pedestrian_Detection_video.py" @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/23 下午4:14 +# @Author : play4fun +# @File : Pedestrian_Detection_video.py +# @Software: PyCharm + +""" +Pedestrian_Detection_video.py:检测视频里的行人 + +视频网站 +https://v.qq.com/x/page/t0501y6jtfi.html + +""" + +# import the necessary packages +from __future__ import print_function +from imutils.object_detection import non_max_suppression +from imutils import paths +import numpy as np +import argparse +import imutils +import cv2 +import time + +# construct the argument parse and parse the arguments +# ap = argparse.ArgumentParser() +# ap.add_argument("-i", "--images", required=True, help="path to images directory") +# args = vars(ap.parse_args()) + +# initialize the HOG descriptor/person detector +hog = cv2.HOGDescriptor() +hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) + +# +cap = cv2.VideoCapture('videos/礼让斑马线!齐齐哈尔城市文明的伤!.mp4') +# cap = cv2.VideoCapture('../../data/TownCentreXVID.mp4') + +fps = cap.get(cv2.CAP_PROP_FPS) # 25.0 +print("Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps)) +num_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) +print('共有', num_frames, '帧') # 共有 2499.0 帧 + +frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) +frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) +print('高:', frame_height, '宽:', frame_width) # 高: 480.0 宽: 640.0 +# exit(0) + + +# 跳过多少帧 +skips = 20 + +# loop over the image paths +# for imagePath in paths.list_images(args["images"]): +while cap.isOpened(): + + # load the image and resize it to (1) reduce detection time + # and (2) improve detection accuracy + # image = cv2.imread(imagePath) + + ret, frame = cap.read() + image = frame + + # + current = cap.get(cv2.CAP_PROP_POS_FRAMES) + if current % skips != 0: + continue + + image = imutils.resize(image, width=min(400, image.shape[1])) + orig = image.copy() + + # detect people in the image + (rects, weights) = hog.detectMultiScale(image, winStride=(4, 4), + padding=(8, 8), scale=1.05) + + # draw the original bounding boxes + for (x, y, w, h) in rects: + cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2) + + # apply non-maxima suppression to the bounding boxes using a + # fairly large overlap threshold to try to maintain overlapping + # boxes that are still people + rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects]) + pick = non_max_suppression(rects, probs=None, overlapThresh=0.65) + + # draw the final bounding boxes + for (xA, yA, xB, yB) in pick: + cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2) + + # show some information on the number of bounding boxes + # filename = imagePath[imagePath.rfind("/") + 1:] + # print("[INFO] {}: {} original boxes, {} after suppression".format( + print("[INFO] {} original boxes, {} after suppression".format(len(rects), len(pick))) + + # show the output images + cv2.imshow("Before NMS", orig) + cv2.imshow("After NMS", image) + cv2.moveWindow("After NMS", y=0, x=400) + + key = cv2.waitKey(delay=1) + if key == ord("q"): + break + +# When everything done, release the capture +cap.release() +cv2.destroyAllWindows() diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/README.md" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/README.md" new file mode 100644 index 00000000..fc317297 --- /dev/null +++ "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/README.md" @@ -0,0 +1,3 @@ +请看官方示例: + +官方samples/peopledetect.py \ No newline at end of file diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p1.jpg" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p1.jpg" new file mode 100644 index 00000000..b4c72381 Binary files /dev/null and "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p1.jpg" differ diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p2.jpg" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p2.jpg" new file mode 100644 index 00000000..1960980f Binary files /dev/null and "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p2.jpg" differ diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p3.jpg" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p3.jpg" new file mode 100644 index 00000000..e5e18f70 Binary files /dev/null and "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p3.jpg" differ diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p4.JPG" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p4.JPG" new file mode 100644 index 00000000..2b1a87f9 Binary files /dev/null and "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/images/p4.JPG" differ diff --git "a/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/videos/\347\244\274\350\256\251\346\226\221\351\251\254\347\272\277\357\274\201\351\275\220\351\275\220\345\223\210\345\260\224\345\237\216\345\270\202\346\226\207\346\230\216\347\232\204\344\274\244\357\274\201.mp4" "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/videos/\347\244\274\350\256\251\346\226\221\351\251\254\347\272\277\357\274\201\351\275\220\351\275\220\345\223\210\345\260\224\345\237\216\345\270\202\346\226\207\346\230\216\347\232\204\344\274\244\357\274\201.mp4" new file mode 100644 index 00000000..9fa6341d Binary files /dev/null and "b/ch51-\345\257\271\350\261\241\346\243\200\346\265\213-\344\275\277\347\224\250Haar\345\210\206\347\261\273\345\231\250\350\277\233\350\241\214\351\235\242\351\203\250\346\243\200\346\265\213/\350\241\214\344\272\272\346\243\200\346\265\213/videos/\347\244\274\350\256\251\346\226\221\351\251\254\347\272\277\357\274\201\351\275\220\351\275\220\345\223\210\345\260\224\345\237\216\345\270\202\346\226\207\346\230\216\347\232\204\344\274\244\357\274\201.mp4" differ diff --git a/ch52-Python_C++_binding_in_OpenCV/Python C++ binding in OpenCV.md b/ch52-Python_C++_binding_in_OpenCV/Python C++ binding in OpenCV.md new file mode 100644 index 00000000..f8a9d0ab --- /dev/null +++ b/ch52-Python_C++_binding_in_OpenCV/Python C++ binding in OpenCV.md @@ -0,0 +1,84 @@ +# Python C++ binding in OpenCV +http://docs.opencv.org/3.2.0/da/d49/tutorial_py_bindings_basics.html + +## OpenCV-Python绑定如何工作? + + +### 学习目标: + +* 如何生成OpenCV-Python绑定? +* 如何将新的OpenCV模块扩展到Python? + +### 如何生成OpenCV-Python绑定? + +在OpenCV中,所有算法都用C ++实现。但是这些算法可以从Python,Java等不同的语言使用。这可以通过绑定生成器来实现。这些生成器在C ++和Python之间创建了一个桥梁,使用户能够从Python调用C ++函数。要了解背景中发生的情况,需要熟悉Python / C API。官方Python文档[1]可以找到一个将C ++函数扩展为Python的简单示例。因此,通过手动编写其包装函数将OpenCV中的所有功能扩展到Python是一项耗时的任务。因此,OpenCV以更智能的方式实现。OpenCV使用位于modules / python / src2中的Python脚本从C ++头自动生成这些包装函数。我们将研究他们做什么。 + +首先,modules / python / CMakeFiles.txt是一个CMake脚本,它将模块扩展到Python。它将自动检查所有模块的扩展名并抓取其头文件。这些头文件包含该特定模块的所有类,函数,常量等的列表。 + +其次,这些头文件传递给Python脚本modules / python / src2 / gen2.py。这是Python绑定生成器脚本。它调用另一个Python脚本modules / python / src2 / hdr_parser.py。这是头解析器脚本。这个头文件解析器将完整的头文件分成小的Python列表。所以这些列表包含有关特定函数,类等的所有细节。例如,一个函数将被解析以获取包含函数名,返回类型,输入参数,参数类型等的列表。最终列表包含所有函数的详细信息,结构体,类别等。 + +但是头解析器不解析头文件中的所有函数/类。开发人员必须指定哪些函数应该导出到Python。为此,有一些宏添加到这些声明的开始,使头解析器能够识别要解析的函数。这些宏由编程特定功能的开发人员添加。简而言之,开发者决定哪些功能应该扩展到Python,哪些不是。这些宏的细节将在下一个会议中给出。 + +所以头解析器返回一个最后一个解析函数列表。我们的生成器脚本(gen2.py)将为头解析器解析的所有函数/ classes / enums / struct创建包装函数(您可以在build / modules / python /文件夹中编译时找到这些头文件作为pyopencv_generated _ * .h文件)。但是可能会有一些基本的OpenCV数据类型,如Mat,Vec4i,Size。他们需要手动扩展。例如,一个Mat类型应该扩展到Numpy数组,Size应该被扩展为一个两个整数的元组等等。类似地,可能有一些复杂的结构体/类/函数等需要手动扩展。所有这些手动包装器功能都放在modules / python / src2 / cv2.cpp中。 + +所以现在只剩下的是编译这些包装文件,这给我们提供了cv2模块。所以当你调用一个函数的时候,你可以用Python中的res = equalizeHist(img1,img2)来传递两个numpy数组,你会发现另外一个numpy数组作为输出。所以这些numpy数组被转换为cv :: Mat,然后调用C ++中的equalizeHist()函数。最终的结果,res将被转换成一个Numpy数组。所以简而言之,几乎所有的操作都是用C ++完成的,这给了我们几乎与C ++相同的速度。 + +所以这是OpenCV-Python绑定生成的基本版本。 + +如何将新模块扩展到Python? + +头文件解析器基于添加到函数声明中的一些包装器宏解析头文件。枚举常数不需要任何包装宏。它们被自动包装。但是剩下的函数,类等都需要包装宏。 + +使用CV_EXPORTS_W宏扩展函数。一个例子如下所示。 +```C++ +CV_EXPORTS_W void equalizeHist(InputArray src,OutputArray dst); +``` +标题解析器可以了解InputArray,OutputArray等关键字的输入和输出参数。但有时候,我们可能需要对输入和输出进行硬编码。为此,使用像CV_OUT,CV_IN_OUT等宏。 +``` +CV_EXPORTS_W void minEnclosingCircle(InputArray points, + CV_OUT Point2f&center,CV_OUT float&radius); +``` +对于大班,也使用CV_EXPORTS_W。要扩展类方法,使用CV_WRAP。类似地,CV_PROP用于类字段。 +``` +class CV_EXPORTS_W CLAHE : public Algorithm +{ +public: + CV_WRAP virtual void apply(InputArray src, OutputArray dst) = 0; + CV_WRAP virtual void setClipLimit(double clipLimit) = 0; + CV_WRAP virtual double getClipLimit() const = 0; +} +``` +可以使用CV_EXPORTS_AS扩展重载功能。但是我们需要传递一个新名称,以便每个函数都将被Python中的该名称调用。以下为积分函数。有三个功能可用,所以每个功能都用Python中的后缀命名。类似地,CV_WRAP_AS可用于包装重载方法。 +``` +CV_EXPORTS_W void integral( InputArray src, OutputArray sum, int sdepth = -1 ); +CV_EXPORTS_AS(integral2) void integral( InputArray src, OutputArray sum, + OutputArray sqsum, int sdepth = -1, int sqdepth = -1 ); +CV_EXPORTS_AS(integral3) void integral( InputArray src, OutputArray sum, + OutputArray sqsum, OutputArray tilted, + int sdepth = -1, int sqdepth = -1 ); +``` +使用CV_EXPORTS_W_SIMPLE扩展小类/结构体。这些结构体通过值传递给C ++函数。示例是KeyPoint,Match等。它们的方法由CV_WRAP扩展,字段由CV_PROP_RW扩展。 +``` +class CV_EXPORTS_W_SIMPLE DMatch +{ +public: + CV_WRAP DMatch(); + CV_WRAP DMatch(int _queryIdx, int _trainIdx, float _distance); + CV_WRAP DMatch(int _queryIdx, int _trainIdx, int _imgIdx, float _distance); + CV_PROP_RW int queryIdx; // query descriptor index + CV_PROP_RW int trainIdx; // train descriptor index + CV_PROP_RW int imgIdx; // train image index + CV_PROP_RW float distance; +}; +``` +可以使用CV_EXPORTS_W_MAP导出一些其他小类/结构体,将其导出到Python本机字典。Moments()是一个例子。 +``` +class CV_EXPORTS_W_MAP Moments +{ +public: + CV_PROP_RW double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03; + CV_PROP_RW double mu20, mu11, mu02, mu30, mu21, mu12, mu03; + CV_PROP_RW double nu20, nu11, nu02, nu30, nu21, nu12, nu03; +}; +``` +所以这些是OpenCV中可用的主要扩展宏。通常,开发人员必须将适当的宏放在适当的位置。休息由生成器脚本完成。有时,发生器脚本可能不能创建包装器的特殊情况。这样的功能需要手动处理,为此您可以编写自己的pyopencv _ *。hpp扩展头文件,并将它们放入模块的misc / python子目录中。但大多数情况下,根据OpenCV编码指南编写的代码将被生成器脚本自动包装。 \ No newline at end of file diff --git a/ch6/6.draw.py b/ch6/6.draw.py deleted file mode 100755 index 3f62c3f6..00000000 --- a/ch6/6.draw.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -import numpy as np -import cv2 - -# Create a black image -img = np.zeros((512, 512, 3), np.uint8) - - -# Draw a diagonal blue line with thickness of 5 px -cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5) - -cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3) - -cv2.circle(img, (447, 63), 63, (0, 0, 255), -1) - -cv2.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1) - -pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32) -pts = pts.reshape((-1, 1, 2)) -# 这里 reshape 的第一个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。 - -font=cv2.FONT_HERSHEY_SIMPLEX -cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2) - -winname = 'example' -cv2.namedWindow(winname, 0) -cv2.imshow(winname, img) -cv2.waitKey(0) -cv2.destroyAllWindows() diff --git a/ch8/8.createTrackbar.py b/ch8/8.createTrackbar.py deleted file mode 100755 index ddbf5c95..00000000 --- a/ch8/8.createTrackbar.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np - -def nothing(x): - pass - -# Create a black image, a window -img = np.zeros((300,512,3), np.uint8) -cv2.namedWindow('image') - -# create trackbars for color change -cv2.createTrackbar('R','image',0,255,nothing) -cv2.createTrackbar('G','image',0,255,nothing) -cv2.createTrackbar('B','image',0,255,nothing) - -# create switch for ON/OFF functionality -switch = '0 : OFF \n1 : ON' -cv2.createTrackbar(switch, 'image',0,1,nothing) - -while(1): - cv2.imshow('image',img) - k = cv2.waitKey(1) & 0xFF - if k == 27: - break - - # get current positions of four trackbars - r = cv2.getTrackbarPos('R','image') - g = cv2.getTrackbarPos('G','image') - b = cv2.getTrackbarPos('B','image') - s = cv2.getTrackbarPos(switch,'image') - - if s == 0: - img[:] = 0 - else: - img[:] = [b,g,r] - -cv2.destroyAllWindows() \ No newline at end of file diff --git a/ch9/9.MakeBorder.py b/ch9/9.MakeBorder.py deleted file mode 100755 index 1dbf097b..00000000 --- a/ch9/9.MakeBorder.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -import cv2 -import numpy as np -from matplotlib import pyplot as plt - -BLUE = [255,0,0] - -img1 = cv2.imread('../data/opencv_logo.png') - -replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE) -reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT) -reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101) -wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP) -constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE) - -plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL') -plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE') -plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT') -plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101') -plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP') -plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT') - -plt.show() diff --git a/ch9/9.img_roi.py b/ch9/9.img_roi.py deleted file mode 100755 index 08d48443..00000000 --- a/ch9/9.img_roi.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np - -img=cv2.imread('../data/messi5.jpg') - -ball=img[280:340,330:390] -img[273:333,100:160]=ball - - - -cv2.namedWindow("messi",0) -cv2.imshow("messi",img) -cv2.waitKey(0) diff --git a/ch9/9.itemset.py b/ch9/9.itemset.py deleted file mode 100755 index 57db2a30..00000000 --- a/ch9/9.itemset.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np - -img=cv2.imread('../data/messi5.jpg') -print img.item(10,10,2) -img.itemset((10,10,2),100) -print img.item(10,10,2) diff --git a/ch9/9.shape.py b/ch9/9.shape.py deleted file mode 100755 index 4afc06fc..00000000 --- a/ch9/9.shape.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np - - -img=cv2.imread('../data/messi5.jpg',0)#gray -print img.shape - -img=cv2.imread('../data/messi5.jpg') -print img.shape - -print img.size -print img.dtype - diff --git "a/cv-Kinect\346\267\261\345\272\246\347\233\270\346\234\272/Xbox-Kinect-\346\267\261\345\272\246\347\233\270\346\234\272.md" "b/cv-Kinect\346\267\261\345\272\246\347\233\270\346\234\272/Xbox-Kinect-\346\267\261\345\272\246\347\233\270\346\234\272.md" new file mode 100644 index 00000000..3da70cd0 --- /dev/null +++ "b/cv-Kinect\346\267\261\345\272\246\347\233\270\346\234\272/Xbox-Kinect-\346\267\261\345\272\246\347\233\270\346\234\272.md" @@ -0,0 +1 @@ +- 移动到[Kinect Tutorial in Python3 教程2018](https://github.com/makelove/Kinect_Tutorial) \ No newline at end of file diff --git "a/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/EnA6A.jpg" "b/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/EnA6A.jpg" new file mode 100644 index 00000000..918656f4 Binary files /dev/null and "b/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/EnA6A.jpg" differ diff --git "a/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/MSER_create1.py" "b/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/MSER_create1.py" new file mode 100644 index 00000000..09bf88d8 --- /dev/null +++ "b/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/MSER_create1.py" @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/7 19:34 +# @Author : play4fun +# @File : MSER_create1.py +# @Software: PyCharm + +""" +MSER_create1.py: +https://stackoverflow.com/questions/40443988/python-opencv-ocr-image-segmentation +""" + +import cv2 + +img = cv2.imread('WQbGH.jpg') +img = img[5:-5, 5:-5, :] + +mser = cv2.MSER_create() + +# Resize the image so that MSER can work better +img2 = cv2.resize(img, (img.shape[1] * 2, img.shape[0] * 2))#扩大 + +gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) +vis = img2.copy() + +regions = mser.detectRegions(gray) +hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions[0]] +cv2.polylines(vis, hulls, 1, (0, 255, 0)) + +img3 = cv2.resize(vis, (img.shape[1], img.shape[0])) +cv2.namedWindow('img', 0) +cv2.imshow('img', img3) +cv2.imwrite('mser-result.jpg', vis) +cv2.waitKey(0) +cv2.destroyAllWindows() + diff --git "a/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/WQbGH.jpg" "b/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/WQbGH.jpg" new file mode 100644 index 00000000..244f39e8 Binary files /dev/null and "b/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/WQbGH.jpg" differ diff --git "a/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/mser-result.jpg" "b/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/mser-result.jpg" new file mode 100644 index 00000000..2befa6e4 Binary files /dev/null and "b/cv-MSER\345\214\272\345\237\237\346\243\200\346\265\213/mser-result.jpg" differ diff --git a/cv-Tkinter-GUI/Displaying-video-feed-with-OpenCV-and-Tkinter.py b/cv-Tkinter-GUI/Displaying-video-feed-with-OpenCV-and-Tkinter.py new file mode 100644 index 00000000..941aa4ea --- /dev/null +++ b/cv-Tkinter-GUI/Displaying-video-feed-with-OpenCV-and-Tkinter.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/2/8 16:09 +# @Author : play4fun +# @File : Displaying a video feed with OpenCV and Tkinter.py +# @Software: PyCharm + +""" +Displaying a video feed with OpenCV and Tkinter.py: +https://www.pyimagesearch.com/2016/05/30/displaying-a-video-feed-with-opencv-and-tkinter/ + +""" + +# import the necessary packages +from __future__ import print_function +from photoboothapp import PhotoBoothApp +from imutils.video import VideoStream +import argparse +import time + +# construct the argument parse and parse the arguments +ap = argparse.ArgumentParser() +ap.add_argument("-o", "--output", required=True, + help="path to output directory to store snapshots") +ap.add_argument("-p", "--picamera", type=int, default=-1, + help="whether or not the Raspberry Pi camera should be used") +args = vars(ap.parse_args()) + +# initialize the video stream and allow the camera sensor to warmup +print("[INFO] warming up camera...") +vs = VideoStream(usePiCamera=args["picamera"] > 0).start() +time.sleep(2.0) + +# start the app +pba = PhotoBoothApp(vs, args["output"]) +pba.root.mainloop() diff --git a/cv-Tkinter-GUI/kivy-GUI/kivy_cv1.py b/cv-Tkinter-GUI/kivy-GUI/kivy_cv1.py new file mode 100644 index 00000000..31a9aa28 --- /dev/null +++ b/cv-Tkinter-GUI/kivy-GUI/kivy_cv1.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/2/8 16:30 +# @Author : play4fun +# @File : kivy_cv1.py +# @Software: PyCharm + +""" +参考:https://github.com/kivy/kivy/blob/master/kivy/core/camera/camera_opencv.py + +kivy_cv1.py: +https://gist.github.com/ExpandOcean/de261e66949009f44ad2 + +pip install kivy + +问题:无显示 +""" + +# coding:utf-8 +from kivy.app import App +from kivy.uix.image import Image +from kivy.clock import Clock +from kivy.graphics.texture import Texture +import cv2 + + +class KivyCamera(Image): + def __init__(self, capture, fps, **kwargs): + super(KivyCamera, self).__init__(**kwargs) + self.capture = capture + Clock.schedule_interval(self.update, 1.0 / fps) + + def update(self, dt): + ret, frame = self.capture.read() + if ret: + # convert it to texture + buf1 = cv2.flip(frame, 0) + buf = buf1.tostring() + image_texture = Texture.create( + size=(frame.shape[1], frame.shape[0]), colorfmt='bgr') + image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte') + # display image from the texture + self.texture = image_texture + + +class CamApp(App): + def build(self): + self.capture = cv2.VideoCapture(1) + self.my_camera = KivyCamera(capture=self.capture, fps=30) + return self.my_camera + + def on_stop(self): + # without this, app will not exit even if the window is closed + self.capture.release() + + +if __name__ == '__main__': + CamApp().run() diff --git a/cv-Tkinter-GUI/opencv-with-tkinter.py b/cv-Tkinter-GUI/opencv-with-tkinter.py new file mode 100644 index 00000000..98c13db3 --- /dev/null +++ b/cv-Tkinter-GUI/opencv-with-tkinter.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/2/8 15:56 +# @Author : play4fun +# @File : opencv-with-tkinter.py +# @Software: PyCharm + +""" +opencv-with-tkinter.py: +https://www.pyimagesearch.com/2016/05/23/opencv-with-tkinter/ + +不需要 +pip install image + +""" + +# import the necessary packages +from tkinter import * +from PIL import Image +from PIL import ImageTk +import tkinter.filedialog as tkFileDialog +import cv2 + + +def select_image(): + # grab a reference to the image panels + global panelA, panelB + + # open a file chooser dialog and allow the user to select an input + # image + path = tkFileDialog.askopenfilename() + + # ensure a file path was selected + if len(path) > 0: + # load the image from disk, convert it to grayscale, and detect + # edges in it + image = cv2.imread(path) + gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + edged = cv2.Canny(gray, 50, 100) + + # represents images in BGR order; however PIL represents + # images in RGB order, so we need to swap the channels + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + + # convert the images to PIL format... + image = Image.fromarray(image) + edged = Image.fromarray(edged) + + # ...and then to ImageTk format + image = ImageTk.PhotoImage(image) + edged = ImageTk.PhotoImage(edged) + + # if the panels are None, initialize them + if panelA is None or panelB is None: + # the first panel will store our original image + panelA = Label(image=image) + panelA.image = image + panelA.pack(side="left", padx=10, pady=10) + + # while the second panel will store the edge map + panelB = Label(image=edged) + panelB.image = edged + panelB.pack(side="right", padx=10, pady=10) + + # otherwise, update the image panels + else: + # update the pannels + panelA.configure(image=image) + panelB.configure(image=edged) + panelA.image = image + panelB.image = edged + + +# initialize the window toolkit along with the two image panels +root = Tk() +panelA = None +panelB = None + +# create a button, then when pressed, will trigger a file chooser +# dialog and allow the user to select an input image; then add the +# button the GUI +btn = Button(root, text="Select an image", command=select_image) +btn.pack(side="bottom", fill="both", expand="yes", padx="10", pady="10") + +# kick off the GUI +root.mainloop() diff --git a/cv-Tkinter-GUI/photoboothapp.py b/cv-Tkinter-GUI/photoboothapp.py new file mode 100644 index 00000000..6e1cbe5e --- /dev/null +++ b/cv-Tkinter-GUI/photoboothapp.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/2/8 16:10 +# @Author : play4fun +# @File : photoboothapp.py +# @Software: PyCharm + +""" +photoboothapp.py: +""" + +# import the necessary packages +from __future__ import print_function +from PIL import Image +from PIL import ImageTk +import tkinter as tki +import threading +import datetime +import imutils +import cv2 +import os + + +class PhotoBoothApp: + def __init__(self, vs, outputPath): + # store the video stream object and output path, then initialize + # the most recently read frame, thread for reading frames, and + # the thread stop event + self.vs = vs + self.outputPath = outputPath + self.frame = None + self.thread = None + self.stopEvent = None + + # initialize the root window and image panel + self.root = tki.Tk() + self.panel = None + + # create a button, that when pressed, will take the current + # frame and save it to file + btn = tki.Button(self.root, text="Snapshot!", + command=self.takeSnapshot) + btn.pack(side="bottom", fill="both", expand="yes", padx=10, + pady=10) + + # start a thread that constantly pools the video sensor for + # the most recently read frame + self.stopEvent = threading.Event() + self.thread = threading.Thread(target=self.videoLoop, args=()) + self.thread.start() + + # set a callback to handle when the window is closed + self.root.wm_title("PyImageSearch PhotoBooth") + self.root.wm_protocol("WM_DELETE_WINDOW", self.onClose) + + def videoLoop(self): + # DISCLAIMER: + # I'm not a GUI developer, nor do I even pretend to be. This + # try/except statement is a pretty ugly hack to get around + # a RunTime error that throws due to threading + try: + # keep looping over frames until we are instructed to stop + while not self.stopEvent.is_set(): + # grab the frame from the video stream and resize it to + # have a maximum width of 300 pixels + self.frame = self.vs.read() + self.frame = imutils.resize(self.frame, width=300) + + # represents images in BGR order; however PIL + # represents images in RGB order, so we need to swap + # the channels, then convert to PIL and ImageTk format + image = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB) + image = Image.fromarray(image) + image = ImageTk.PhotoImage(image) + + # if the panel is not None, we need to initialize it + if self.panel is None: + self.panel = tki.Label(image=image) + self.panel.image = image + self.panel.pack(side="left", padx=10, pady=10) + + # otherwise, simply update the panel + else: + self.panel.configure(image=image) + self.panel.image = image + + except RuntimeError as e: + print("[INFO] caught a RuntimeError") + + def takeSnapshot(self): + # grab the current timestamp and use it to construct the + # output path + ts = datetime.datetime.now() + filename = "{}.jpg".format(ts.strftime("%Y-%m-%d_%H-%M-%S")) + p = os.path.sep.join((self.outputPath, filename)) + + # save the file + cv2.imwrite(p, self.frame.copy()) + print("[INFO] saved {}".format(filename)) + + def onClose(self): + # set the stop event, cleanup the camera, and allow the rest of + # the quit process to continue + print("[INFO] closing...") + self.stopEvent.set() + self.vs.stop() + self.root.quit() diff --git a/data/._messi5.jpg b/data/._messi5.jpg deleted file mode 100755 index 5a2f9f0e..00000000 Binary files a/data/._messi5.jpg and /dev/null differ diff --git a/data/H1to3p.xml b/data/H1to3p.xml new file mode 100755 index 00000000..d8b70878 --- /dev/null +++ b/data/H1to3p.xml @@ -0,0 +1,11 @@ + + + + 3 + 3 +
d
+ + 7.6285898e-01 -2.9922929e-01 2.2567123e+02 + 3.3443473e-01 1.0143901e+00 -7.6999973e+01 + 3.4663091e-04 -1.4364524e-05 1.0000000e+00
+
diff --git a/data/HappyFish.jpg b/data/HappyFish.jpg new file mode 100755 index 00000000..c76288ed Binary files /dev/null and b/data/HappyFish.jpg differ diff --git a/data/Lenna-playboy.jpg b/data/Lenna-playboy.jpg new file mode 100644 index 00000000..e6856659 Binary files /dev/null and b/data/Lenna-playboy.jpg differ diff --git a/data/Lenna.png b/data/Lenna.png new file mode 100644 index 00000000..3e610d16 Binary files /dev/null and b/data/Lenna.png differ diff --git a/data/LinuxLogo.jpg b/data/LinuxLogo.jpg new file mode 100755 index 00000000..34cba886 Binary files /dev/null and b/data/LinuxLogo.jpg differ diff --git a/data/Megamind.avi b/data/Megamind.avi new file mode 100644 index 00000000..86351eb0 Binary files /dev/null and b/data/Megamind.avi differ diff --git a/data/Megamind_bugy.avi b/data/Megamind_bugy.avi new file mode 100644 index 00000000..67ab6bec Binary files /dev/null and b/data/Megamind_bugy.avi differ diff --git a/data/TownCentreXVID.mp4 b/data/TownCentreXVID.mp4 new file mode 100755 index 00000000..1a871e48 Binary files /dev/null and b/data/TownCentreXVID.mp4 differ diff --git a/data/WindowsLogo.jpg b/data/WindowsLogo.jpg new file mode 100755 index 00000000..04be4492 Binary files /dev/null and b/data/WindowsLogo.jpg differ diff --git a/data/aero1.jpg b/data/aero1.jpg new file mode 100644 index 00000000..a7249e48 Binary files /dev/null and b/data/aero1.jpg differ diff --git a/data/aero3.jpg b/data/aero3.jpg new file mode 100644 index 00000000..3c2a99e2 Binary files /dev/null and b/data/aero3.jpg differ diff --git a/data/airline-stewardess-bikini.jpg b/data/airline-stewardess-bikini.jpg new file mode 100644 index 00000000..8e1f56b6 Binary files /dev/null and b/data/airline-stewardess-bikini.jpg differ diff --git a/data/alipay_donate.jpg b/data/alipay_donate.jpg new file mode 100644 index 00000000..0d57ddaf Binary files /dev/null and b/data/alipay_donate.jpg differ diff --git a/data/aloeGT.png b/data/aloeGT.png new file mode 100644 index 00000000..43e62ebf Binary files /dev/null and b/data/aloeGT.png differ diff --git a/data/aloeL.jpg b/data/aloeL.jpg new file mode 100644 index 00000000..4c192768 Binary files /dev/null and b/data/aloeL.jpg differ diff --git a/data/aloeR.jpg b/data/aloeR.jpg new file mode 100644 index 00000000..7ecdf489 Binary files /dev/null and b/data/aloeR.jpg differ diff --git a/data/apple.jpg b/data/apple.jpg new file mode 100644 index 00000000..2ff27ee0 Binary files /dev/null and b/data/apple.jpg differ diff --git a/data/baboon.jpg b/data/baboon.jpg new file mode 100644 index 00000000..2f98d835 Binary files /dev/null and b/data/baboon.jpg differ diff --git a/data/basketball1.png b/data/basketball1.png new file mode 100644 index 00000000..53b2dbaa Binary files /dev/null and b/data/basketball1.png differ diff --git a/data/basketball2.png b/data/basketball2.png new file mode 100644 index 00000000..1d069b96 Binary files /dev/null and b/data/basketball2.png differ diff --git a/data/blox.jpg b/data/blox.jpg new file mode 100644 index 00000000..b682b2c0 Binary files /dev/null and b/data/blox.jpg differ diff --git a/data/board.jpg b/data/board.jpg new file mode 100644 index 00000000..2e10e6fe Binary files /dev/null and b/data/board.jpg differ diff --git a/data/box.jpg b/data/box.jpg new file mode 100644 index 00000000..06201ca8 Binary files /dev/null and b/data/box.jpg differ diff --git a/data/box.png b/data/box.png old mode 100755 new mode 100644 diff --git a/data/box1.png b/data/box1.png new file mode 100755 index 00000000..6f01082f Binary files /dev/null and b/data/box1.png differ diff --git a/data/box_in_scene.png b/data/box_in_scene.png old mode 100755 new mode 100644 diff --git a/data/building.jpg b/data/building.jpg new file mode 100644 index 00000000..6056492f Binary files /dev/null and b/data/building.jpg differ diff --git a/data/butterfly.jpg b/data/butterfly.jpg new file mode 100644 index 00000000..67d60f05 Binary files /dev/null and b/data/butterfly.jpg differ diff --git a/data/cards.png b/data/cards.png new file mode 100644 index 00000000..1e61d874 Binary files /dev/null and b/data/cards.png differ diff --git a/data/chessboard.png b/data/chessboard.png new file mode 100644 index 00000000..39bb399e Binary files /dev/null and b/data/chessboard.png differ diff --git a/data/chicky_512.png b/data/chicky_512.png new file mode 100644 index 00000000..746f8cc2 Binary files /dev/null and b/data/chicky_512.png differ diff --git a/data/data01.xml b/data/data01.xml new file mode 100644 index 00000000..d17167cc --- /dev/null +++ b/data/data01.xml @@ -0,0 +1,58 @@ + + + + 40 + 784 +
f
+ + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 149 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 149 149 149 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 149 149 149 149 149 149 149 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 149 149 149 149 149 149 149 149 149 149 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 149 149 149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +
+ + 40 + 1 +
d
+ + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + +
+
diff --git a/data/detect_blob.png b/data/detect_blob.png new file mode 100644 index 00000000..fe8537ab Binary files /dev/null and b/data/detect_blob.png differ diff --git a/data/digits.png b/data/digits.png new file mode 100644 index 00000000..01cdd297 Binary files /dev/null and b/data/digits.png differ diff --git a/data/dnn/VGG_VOC0712_SSD_300x300_iter_60000.prototxt b/data/dnn/VGG_VOC0712_SSD_300x300_iter_60000.prototxt new file mode 100644 index 00000000..77a23655 --- /dev/null +++ b/data/dnn/VGG_VOC0712_SSD_300x300_iter_60000.prototxt @@ -0,0 +1,1546 @@ +name: "VGG_VOC0712_SSD_300x300_deploy" +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 300 +input_dim: 300 +layer { + name: "conv1_1" + type: "Convolution" + bottom: "data" + top: "conv1_1" + param { + lr_mult: 0 + decay_mult: 0 + } + param { + lr_mult: 0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 0 + decay_mult: 0 + } + param { + lr_mult: 0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1" + top: "conv2_1" + param { + lr_mult: 0 + decay_mult: 0 + } + param { + lr_mult: 0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 0 + decay_mult: 0 + } + param { + lr_mult: 0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "conv2_2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2" + top: "conv3_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "pool3" + type: "Pooling" + bottom: "conv3_3" + top: "pool3" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3" + top: "conv4_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu4_3" + type: "ReLU" + bottom: "conv4_3" + top: "conv4_3" +} +layer { + name: "pool4" + type: "Pooling" + bottom: "conv4_3" + top: "pool4" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv5_1" + type: "Convolution" + bottom: "pool4" + top: "conv5_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu5_1" + type: "ReLU" + bottom: "conv5_1" + top: "conv5_1" +} +layer { + name: "conv5_2" + type: "Convolution" + bottom: "conv5_1" + top: "conv5_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu5_2" + type: "ReLU" + bottom: "conv5_2" + top: "conv5_2" +} +layer { + name: "conv5_3" + type: "Convolution" + bottom: "conv5_2" + top: "conv5_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu5_3" + type: "ReLU" + bottom: "conv5_3" + top: "conv5_3" +} +layer { + name: "pool5" + type: "Pooling" + bottom: "conv5_3" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "fc6" + type: "Convolution" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 1024 + pad: 6 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + dilation: 6 + } +} +layer { + name: "relu6" + type: "ReLU" + bottom: "fc6" + top: "fc6" +} +layer { + name: "fc7" + type: "Convolution" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 1024 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu7" + type: "ReLU" + bottom: "fc7" + top: "fc7" +} +layer { + name: "conv6_1" + type: "Convolution" + bottom: "fc7" + top: "conv6_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_1_relu" + type: "ReLU" + bottom: "conv6_1" + top: "conv6_1" +} +layer { + name: "conv6_2" + type: "Convolution" + bottom: "conv6_1" + top: "conv6_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_relu" + type: "ReLU" + bottom: "conv6_2" + top: "conv6_2" +} +layer { + name: "conv7_1" + type: "Convolution" + bottom: "conv6_2" + top: "conv7_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_1_relu" + type: "ReLU" + bottom: "conv7_1" + top: "conv7_1" +} +layer { + name: "conv7_2" + type: "Convolution" + bottom: "conv7_1" + top: "conv7_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_relu" + type: "ReLU" + bottom: "conv7_2" + top: "conv7_2" +} +layer { + name: "conv8_1" + type: "Convolution" + bottom: "conv7_2" + top: "conv8_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_1_relu" + type: "ReLU" + bottom: "conv8_1" + top: "conv8_1" +} +layer { + name: "conv8_2" + type: "Convolution" + bottom: "conv8_1" + top: "conv8_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_relu" + type: "ReLU" + bottom: "conv8_2" + top: "conv8_2" +} +layer { + name: "pool6" + type: "Pooling" + bottom: "conv8_2" + top: "pool6" + pooling_param { + pool: AVE + global_pooling: true + } +} +layer { + name: "conv4_3_norm" + type: "NormalizeBBox" + bottom: "conv4_3" + top: "conv4_3_norm" + normalize_bbox_param { + across_spatial: false + scale_filler { + type: "constant" + value: 20 + } + channel_shared: false + } +} +layer { + name: "conv4_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 12 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv4_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_loc" + top: "conv4_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_loc_perm" + top: "conv4_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 63 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv4_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_conf" + top: "conv4_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_conf_perm" + top: "conv4_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv4_3_norm" + bottom: "data" + top: "conv4_3_norm_mbox_priorbox" + prior_box_param { + min_size: 30.0 + aspect_ratio: 2 + flip: true + clip: true + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + } +} +layer { + name: "fc7_mbox_loc" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "fc7_mbox_loc_perm" + type: "Permute" + bottom: "fc7_mbox_loc" + top: "fc7_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_loc_flat" + type: "Flatten" + bottom: "fc7_mbox_loc_perm" + top: "fc7_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_conf" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "fc7_mbox_conf_perm" + type: "Permute" + bottom: "fc7_mbox_conf" + top: "fc7_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_conf_flat" + type: "Flatten" + bottom: "fc7_mbox_conf_perm" + top: "fc7_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_priorbox" + type: "PriorBox" + bottom: "fc7" + bottom: "data" + top: "fc7_mbox_priorbox" + prior_box_param { + min_size: 60.0 + max_size: 114.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: true + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + } +} +layer { + name: "conv6_2_mbox_loc" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_mbox_loc_perm" + type: "Permute" + bottom: "conv6_2_mbox_loc" + top: "conv6_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv6_2_mbox_loc_perm" + top: "conv6_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_conf" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_mbox_conf_perm" + type: "Permute" + bottom: "conv6_2_mbox_conf" + top: "conv6_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv6_2_mbox_conf_perm" + top: "conv6_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv6_2" + bottom: "data" + top: "conv6_2_mbox_priorbox" + prior_box_param { + min_size: 114.0 + max_size: 168.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: true + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + } +} +layer { + name: "conv7_2_mbox_loc" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_mbox_loc_perm" + type: "Permute" + bottom: "conv7_2_mbox_loc" + top: "conv7_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv7_2_mbox_loc_perm" + top: "conv7_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_conf" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_mbox_conf_perm" + type: "Permute" + bottom: "conv7_2_mbox_conf" + top: "conv7_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv7_2_mbox_conf_perm" + top: "conv7_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv7_2" + bottom: "data" + top: "conv7_2_mbox_priorbox" + prior_box_param { + min_size: 168.0 + max_size: 222.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: true + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + } +} +layer { + name: "conv8_2_mbox_loc" + type: "Convolution" + bottom: "conv8_2" + top: "conv8_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_mbox_loc_perm" + type: "Permute" + bottom: "conv8_2_mbox_loc" + top: "conv8_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv8_2_mbox_loc_perm" + top: "conv8_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_conf" + type: "Convolution" + bottom: "conv8_2" + top: "conv8_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_mbox_conf_perm" + type: "Permute" + bottom: "conv8_2_mbox_conf" + top: "conv8_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv8_2_mbox_conf_perm" + top: "conv8_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv8_2" + bottom: "data" + top: "conv8_2_mbox_priorbox" + prior_box_param { + min_size: 222.0 + max_size: 276.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: true + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + } +} +layer { + name: "pool6_mbox_loc" + type: "Convolution" + bottom: "pool6" + top: "pool6_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "pool6_mbox_loc_perm" + type: "Permute" + bottom: "pool6_mbox_loc" + top: "pool6_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "pool6_mbox_loc_flat" + type: "Flatten" + bottom: "pool6_mbox_loc_perm" + top: "pool6_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "pool6_mbox_conf" + type: "Convolution" + bottom: "pool6" + top: "pool6_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "pool6_mbox_conf_perm" + type: "Permute" + bottom: "pool6_mbox_conf" + top: "pool6_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "pool6_mbox_conf_flat" + type: "Flatten" + bottom: "pool6_mbox_conf_perm" + top: "pool6_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "pool6_mbox_priorbox" + type: "PriorBox" + bottom: "pool6" + bottom: "data" + top: "pool6_mbox_priorbox" + prior_box_param { + min_size: 276.0 + max_size: 330.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: true + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + } +} +layer { + name: "mbox_loc" + type: "Concat" + bottom: "conv4_3_norm_mbox_loc_flat" + bottom: "fc7_mbox_loc_flat" + bottom: "conv6_2_mbox_loc_flat" + bottom: "conv7_2_mbox_loc_flat" + bottom: "conv8_2_mbox_loc_flat" + bottom: "pool6_mbox_loc_flat" + top: "mbox_loc" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_conf" + type: "Concat" + bottom: "conv4_3_norm_mbox_conf_flat" + bottom: "fc7_mbox_conf_flat" + bottom: "conv6_2_mbox_conf_flat" + bottom: "conv7_2_mbox_conf_flat" + bottom: "conv8_2_mbox_conf_flat" + bottom: "pool6_mbox_conf_flat" + top: "mbox_conf" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_priorbox" + type: "Concat" + bottom: "conv4_3_norm_mbox_priorbox" + bottom: "fc7_mbox_priorbox" + bottom: "conv6_2_mbox_priorbox" + bottom: "conv7_2_mbox_priorbox" + bottom: "conv8_2_mbox_priorbox" + bottom: "pool6_mbox_priorbox" + top: "mbox_priorbox" + concat_param { + axis: 2 + } +} +layer { + name: "mbox_conf_reshape" + type: "Reshape" + bottom: "mbox_conf" + top: "mbox_conf_reshape" + reshape_param { + shape { + dim: 0 + dim: -1 + dim: 21 + } + } +} +layer { + name: "mbox_conf_softmax" + type: "Softmax" + bottom: "mbox_conf_reshape" + top: "mbox_conf_softmax" + softmax_param { + axis: 2 + } +} +layer { + name: "mbox_conf_flatten" + type: "Flatten" + bottom: "mbox_conf_softmax" + top: "mbox_conf_flatten" + flatten_param { + axis: 1 + } +} +layer { + name: "detection_out" + type: "DetectionOutput" + bottom: "mbox_loc" + bottom: "mbox_conf_flatten" + bottom: "mbox_priorbox" + top: "detection_out" + include { + phase: TEST + } + detection_output_param { + num_classes: 21 + share_location: true + background_label_id: 0 + nms_threshold: 0.45 + top_k: 400 + code_type: CENTER_SIZE + keep_top_k: 200 + confidence_threshold: 0.01 + } +} diff --git a/data/dnn/bvlc_googlenet.prototxt b/data/dnn/bvlc_googlenet.prototxt new file mode 100644 index 00000000..4648bf26 --- /dev/null +++ b/data/dnn/bvlc_googlenet.prototxt @@ -0,0 +1,2156 @@ +name: "GoogleNet" +input: "data" +input_dim: 10 +input_dim: 3 +input_dim: 224 +input_dim: 224 +layer { + name: "conv1/7x7_s2" + type: "Convolution" + bottom: "data" + top: "conv1/7x7_s2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv1/relu_7x7" + type: "ReLU" + bottom: "conv1/7x7_s2" + top: "conv1/7x7_s2" +} +layer { + name: "pool1/3x3_s2" + type: "Pooling" + bottom: "conv1/7x7_s2" + top: "pool1/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "pool1/norm1" + type: "LRN" + bottom: "pool1/3x3_s2" + top: "pool1/norm1" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layer { + name: "conv2/3x3_reduce" + type: "Convolution" + bottom: "pool1/norm1" + top: "conv2/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv2/relu_3x3_reduce" + type: "ReLU" + bottom: "conv2/3x3_reduce" + top: "conv2/3x3_reduce" +} +layer { + name: "conv2/3x3" + type: "Convolution" + bottom: "conv2/3x3_reduce" + top: "conv2/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "conv2/relu_3x3" + type: "ReLU" + bottom: "conv2/3x3" + top: "conv2/3x3" +} +layer { + name: "conv2/norm2" + type: "LRN" + bottom: "conv2/3x3" + top: "conv2/norm2" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layer { + name: "pool2/3x3_s2" + type: "Pooling" + bottom: "conv2/norm2" + top: "pool2/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_3a/1x1" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_1x1" + type: "ReLU" + bottom: "inception_3a/1x1" + top: "inception_3a/1x1" +} +layer { + name: "inception_3a/3x3_reduce" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3_reduce" +} +layer { + name: "inception_3a/3x3" + type: "Convolution" + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_3x3" + type: "ReLU" + bottom: "inception_3a/3x3" + top: "inception_3a/3x3" +} +layer { + name: "inception_3a/5x5_reduce" + type: "Convolution" + bottom: "pool2/3x3_s2" + top: "inception_3a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5_reduce" +} +layer { + name: "inception_3a/5x5" + type: "Convolution" + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_5x5" + type: "ReLU" + bottom: "inception_3a/5x5" + top: "inception_3a/5x5" +} +layer { + name: "inception_3a/pool" + type: "Pooling" + bottom: "pool2/3x3_s2" + top: "inception_3a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_3a/pool_proj" + type: "Convolution" + bottom: "inception_3a/pool" + top: "inception_3a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3a/relu_pool_proj" + type: "ReLU" + bottom: "inception_3a/pool_proj" + top: "inception_3a/pool_proj" +} +layer { + name: "inception_3a/output" + type: "Concat" + bottom: "inception_3a/1x1" + bottom: "inception_3a/3x3" + bottom: "inception_3a/5x5" + bottom: "inception_3a/pool_proj" + top: "inception_3a/output" +} +layer { + name: "inception_3b/1x1" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_1x1" + type: "ReLU" + bottom: "inception_3b/1x1" + top: "inception_3b/1x1" +} +layer { + name: "inception_3b/3x3_reduce" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3_reduce" +} +layer { + name: "inception_3b/3x3" + type: "Convolution" + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_3x3" + type: "ReLU" + bottom: "inception_3b/3x3" + top: "inception_3b/3x3" +} +layer { + name: "inception_3b/5x5_reduce" + type: "Convolution" + bottom: "inception_3a/output" + top: "inception_3b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5_reduce" +} +layer { + name: "inception_3b/5x5" + type: "Convolution" + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_5x5" + type: "ReLU" + bottom: "inception_3b/5x5" + top: "inception_3b/5x5" +} +layer { + name: "inception_3b/pool" + type: "Pooling" + bottom: "inception_3a/output" + top: "inception_3b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_3b/pool_proj" + type: "Convolution" + bottom: "inception_3b/pool" + top: "inception_3b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_3b/relu_pool_proj" + type: "ReLU" + bottom: "inception_3b/pool_proj" + top: "inception_3b/pool_proj" +} +layer { + name: "inception_3b/output" + type: "Concat" + bottom: "inception_3b/1x1" + bottom: "inception_3b/3x3" + bottom: "inception_3b/5x5" + bottom: "inception_3b/pool_proj" + top: "inception_3b/output" +} +layer { + name: "pool3/3x3_s2" + type: "Pooling" + bottom: "inception_3b/output" + top: "pool3/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_4a/1x1" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_1x1" + type: "ReLU" + bottom: "inception_4a/1x1" + top: "inception_4a/1x1" +} +layer { + name: "inception_4a/3x3_reduce" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3_reduce" +} +layer { + name: "inception_4a/3x3" + type: "Convolution" + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 208 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_3x3" + type: "ReLU" + bottom: "inception_4a/3x3" + top: "inception_4a/3x3" +} +layer { + name: "inception_4a/5x5_reduce" + type: "Convolution" + bottom: "pool3/3x3_s2" + top: "inception_4a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5_reduce" +} +layer { + name: "inception_4a/5x5" + type: "Convolution" + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 48 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_5x5" + type: "ReLU" + bottom: "inception_4a/5x5" + top: "inception_4a/5x5" +} +layer { + name: "inception_4a/pool" + type: "Pooling" + bottom: "pool3/3x3_s2" + top: "inception_4a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4a/pool_proj" + type: "Convolution" + bottom: "inception_4a/pool" + top: "inception_4a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4a/relu_pool_proj" + type: "ReLU" + bottom: "inception_4a/pool_proj" + top: "inception_4a/pool_proj" +} +layer { + name: "inception_4a/output" + type: "Concat" + bottom: "inception_4a/1x1" + bottom: "inception_4a/3x3" + bottom: "inception_4a/5x5" + bottom: "inception_4a/pool_proj" + top: "inception_4a/output" +} +layer { + name: "inception_4b/1x1" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_1x1" + type: "ReLU" + bottom: "inception_4b/1x1" + top: "inception_4b/1x1" +} +layer { + name: "inception_4b/3x3_reduce" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3_reduce" +} +layer { + name: "inception_4b/3x3" + type: "Convolution" + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 224 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_3x3" + type: "ReLU" + bottom: "inception_4b/3x3" + top: "inception_4b/3x3" +} +layer { + name: "inception_4b/5x5_reduce" + type: "Convolution" + bottom: "inception_4a/output" + top: "inception_4b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5_reduce" +} +layer { + name: "inception_4b/5x5" + type: "Convolution" + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_5x5" + type: "ReLU" + bottom: "inception_4b/5x5" + top: "inception_4b/5x5" +} +layer { + name: "inception_4b/pool" + type: "Pooling" + bottom: "inception_4a/output" + top: "inception_4b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4b/pool_proj" + type: "Convolution" + bottom: "inception_4b/pool" + top: "inception_4b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4b/relu_pool_proj" + type: "ReLU" + bottom: "inception_4b/pool_proj" + top: "inception_4b/pool_proj" +} +layer { + name: "inception_4b/output" + type: "Concat" + bottom: "inception_4b/1x1" + bottom: "inception_4b/3x3" + bottom: "inception_4b/5x5" + bottom: "inception_4b/pool_proj" + top: "inception_4b/output" +} +layer { + name: "inception_4c/1x1" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_1x1" + type: "ReLU" + bottom: "inception_4c/1x1" + top: "inception_4c/1x1" +} +layer { + name: "inception_4c/3x3_reduce" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3_reduce" +} +layer { + name: "inception_4c/3x3" + type: "Convolution" + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_3x3" + type: "ReLU" + bottom: "inception_4c/3x3" + top: "inception_4c/3x3" +} +layer { + name: "inception_4c/5x5_reduce" + type: "Convolution" + bottom: "inception_4b/output" + top: "inception_4c/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5_reduce" +} +layer { + name: "inception_4c/5x5" + type: "Convolution" + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_5x5" + type: "ReLU" + bottom: "inception_4c/5x5" + top: "inception_4c/5x5" +} +layer { + name: "inception_4c/pool" + type: "Pooling" + bottom: "inception_4b/output" + top: "inception_4c/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4c/pool_proj" + type: "Convolution" + bottom: "inception_4c/pool" + top: "inception_4c/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4c/relu_pool_proj" + type: "ReLU" + bottom: "inception_4c/pool_proj" + top: "inception_4c/pool_proj" +} +layer { + name: "inception_4c/output" + type: "Concat" + bottom: "inception_4c/1x1" + bottom: "inception_4c/3x3" + bottom: "inception_4c/5x5" + bottom: "inception_4c/pool_proj" + top: "inception_4c/output" +} +layer { + name: "inception_4d/1x1" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_1x1" + type: "ReLU" + bottom: "inception_4d/1x1" + top: "inception_4d/1x1" +} +layer { + name: "inception_4d/3x3_reduce" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 144 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3_reduce" +} +layer { + name: "inception_4d/3x3" + type: "Convolution" + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 288 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_3x3" + type: "ReLU" + bottom: "inception_4d/3x3" + top: "inception_4d/3x3" +} +layer { + name: "inception_4d/5x5_reduce" + type: "Convolution" + bottom: "inception_4c/output" + top: "inception_4d/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5_reduce" +} +layer { + name: "inception_4d/5x5" + type: "Convolution" + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_5x5" + type: "ReLU" + bottom: "inception_4d/5x5" + top: "inception_4d/5x5" +} +layer { + name: "inception_4d/pool" + type: "Pooling" + bottom: "inception_4c/output" + top: "inception_4d/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4d/pool_proj" + type: "Convolution" + bottom: "inception_4d/pool" + top: "inception_4d/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4d/relu_pool_proj" + type: "ReLU" + bottom: "inception_4d/pool_proj" + top: "inception_4d/pool_proj" +} +layer { + name: "inception_4d/output" + type: "Concat" + bottom: "inception_4d/1x1" + bottom: "inception_4d/3x3" + bottom: "inception_4d/5x5" + bottom: "inception_4d/pool_proj" + top: "inception_4d/output" +} +layer { + name: "inception_4e/1x1" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_1x1" + type: "ReLU" + bottom: "inception_4e/1x1" + top: "inception_4e/1x1" +} +layer { + name: "inception_4e/3x3_reduce" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3_reduce" +} +layer { + name: "inception_4e/3x3" + type: "Convolution" + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_3x3" + type: "ReLU" + bottom: "inception_4e/3x3" + top: "inception_4e/3x3" +} +layer { + name: "inception_4e/5x5_reduce" + type: "Convolution" + bottom: "inception_4d/output" + top: "inception_4e/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5_reduce" +} +layer { + name: "inception_4e/5x5" + type: "Convolution" + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_5x5" + type: "ReLU" + bottom: "inception_4e/5x5" + top: "inception_4e/5x5" +} +layer { + name: "inception_4e/pool" + type: "Pooling" + bottom: "inception_4d/output" + top: "inception_4e/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_4e/pool_proj" + type: "Convolution" + bottom: "inception_4e/pool" + top: "inception_4e/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_4e/relu_pool_proj" + type: "ReLU" + bottom: "inception_4e/pool_proj" + top: "inception_4e/pool_proj" +} +layer { + name: "inception_4e/output" + type: "Concat" + bottom: "inception_4e/1x1" + bottom: "inception_4e/3x3" + bottom: "inception_4e/5x5" + bottom: "inception_4e/pool_proj" + top: "inception_4e/output" +} +layer { + name: "pool4/3x3_s2" + type: "Pooling" + bottom: "inception_4e/output" + top: "pool4/3x3_s2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layer { + name: "inception_5a/1x1" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_1x1" + type: "ReLU" + bottom: "inception_5a/1x1" + top: "inception_5a/1x1" +} +layer { + name: "inception_5a/3x3_reduce" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3_reduce" +} +layer { + name: "inception_5a/3x3" + type: "Convolution" + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_3x3" + type: "ReLU" + bottom: "inception_5a/3x3" + top: "inception_5a/3x3" +} +layer { + name: "inception_5a/5x5_reduce" + type: "Convolution" + bottom: "pool4/3x3_s2" + top: "inception_5a/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5_reduce" +} +layer { + name: "inception_5a/5x5" + type: "Convolution" + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_5x5" + type: "ReLU" + bottom: "inception_5a/5x5" + top: "inception_5a/5x5" +} +layer { + name: "inception_5a/pool" + type: "Pooling" + bottom: "pool4/3x3_s2" + top: "inception_5a/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_5a/pool_proj" + type: "Convolution" + bottom: "inception_5a/pool" + top: "inception_5a/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5a/relu_pool_proj" + type: "ReLU" + bottom: "inception_5a/pool_proj" + top: "inception_5a/pool_proj" +} +layer { + name: "inception_5a/output" + type: "Concat" + bottom: "inception_5a/1x1" + bottom: "inception_5a/3x3" + bottom: "inception_5a/5x5" + bottom: "inception_5a/pool_proj" + top: "inception_5a/output" +} +layer { + name: "inception_5b/1x1" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/1x1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 384 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_1x1" + type: "ReLU" + bottom: "inception_5b/1x1" + top: "inception_5b/1x1" +} +layer { + name: "inception_5b/3x3_reduce" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/3x3_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_3x3_reduce" + type: "ReLU" + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3_reduce" +} +layer { + name: "inception_5b/3x3" + type: "Convolution" + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_3x3" + type: "ReLU" + bottom: "inception_5b/3x3" + top: "inception_5b/3x3" +} +layer { + name: "inception_5b/5x5_reduce" + type: "Convolution" + bottom: "inception_5a/output" + top: "inception_5b/5x5_reduce" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 48 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_5x5_reduce" + type: "ReLU" + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5_reduce" +} +layer { + name: "inception_5b/5x5" + type: "Convolution" + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_5x5" + type: "ReLU" + bottom: "inception_5b/5x5" + top: "inception_5b/5x5" +} +layer { + name: "inception_5b/pool" + type: "Pooling" + bottom: "inception_5a/output" + top: "inception_5b/pool" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "inception_5b/pool_proj" + type: "Convolution" + bottom: "inception_5b/pool" + top: "inception_5b/pool_proj" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layer { + name: "inception_5b/relu_pool_proj" + type: "ReLU" + bottom: "inception_5b/pool_proj" + top: "inception_5b/pool_proj" +} +layer { + name: "inception_5b/output" + type: "Concat" + bottom: "inception_5b/1x1" + bottom: "inception_5b/3x3" + bottom: "inception_5b/5x5" + bottom: "inception_5b/pool_proj" + top: "inception_5b/output" +} +layer { + name: "pool5/7x7_s1" + type: "Pooling" + bottom: "inception_5b/output" + top: "pool5/7x7_s1" + pooling_param { + pool: AVE + kernel_size: 7 + stride: 1 + } +} +layer { + name: "pool5/drop_7x7_s1" + type: "Dropout" + bottom: "pool5/7x7_s1" + top: "pool5/7x7_s1" + dropout_param { + dropout_ratio: 0.4 + } +} +layer { + name: "loss3/classifier" + type: "InnerProduct" + bottom: "pool5/7x7_s1" + top: "loss3/classifier" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "prob" + type: "Softmax" + bottom: "loss3/classifier" + top: "prob" +} diff --git a/data/dnn/enet-classes.txt b/data/dnn/enet-classes.txt new file mode 100644 index 00000000..303bf6f4 --- /dev/null +++ b/data/dnn/enet-classes.txt @@ -0,0 +1,20 @@ +Unlabeled 0 0 0 +Road 128 64 128 +Sidewalk 244 35 232 +Building 70 70 70 +Wall 102 102 156 +Fence 190 153 153 +Pole 153 153 153 +TrafficLight 250 170 30 +TrafficSign 220 220 0 +Vegetation 107 142 35 +Terrain 152 251 152 +Sky 70 130 180 +Person 220 20 60 +Rider 255 0 0 +Car 0 0 142 +Truck 0 0 70 +Bus 0 60 100 +Train 0 80 100 +Motorcycle 0 0 230 +Bicycle 119 11 32 \ No newline at end of file diff --git a/data/dnn/fcn32s-heavy-pascal.prototxt b/data/dnn/fcn32s-heavy-pascal.prototxt new file mode 100644 index 00000000..7b5a0c55 --- /dev/null +++ b/data/dnn/fcn32s-heavy-pascal.prototxt @@ -0,0 +1,502 @@ +# +# This prototxt is based on voc-fcn32s/val.prototxt file from +# https://github.com/shelhamer/fcn.berkeleyvision.org, which is distributed under +# Caffe (BSD) license: +# http://caffe.berkeleyvision.org/model_zoo.html#bvlc-model-license +# +name: "voc-fcn32s" +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 500 +input_dim: 500 +layer { + name: "conv1_1" + type: "Convolution" + bottom: "data" + top: "conv1_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 100 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1" + top: "conv2_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "conv2_2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2" + top: "conv3_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "pool3" + type: "Pooling" + bottom: "conv3_3" + top: "pool3" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3" + top: "conv4_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu4_3" + type: "ReLU" + bottom: "conv4_3" + top: "conv4_3" +} +layer { + name: "pool4" + type: "Pooling" + bottom: "conv4_3" + top: "pool4" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv5_1" + type: "Convolution" + bottom: "pool4" + top: "conv5_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu5_1" + type: "ReLU" + bottom: "conv5_1" + top: "conv5_1" +} +layer { + name: "conv5_2" + type: "Convolution" + bottom: "conv5_1" + top: "conv5_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu5_2" + type: "ReLU" + bottom: "conv5_2" + top: "conv5_2" +} +layer { + name: "conv5_3" + type: "Convolution" + bottom: "conv5_2" + top: "conv5_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu5_3" + type: "ReLU" + bottom: "conv5_3" + top: "conv5_3" +} +layer { + name: "pool5" + type: "Pooling" + bottom: "conv5_3" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "fc6" + type: "Convolution" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4096 + pad: 0 + kernel_size: 7 + stride: 1 + } +} +layer { + name: "relu6" + type: "ReLU" + bottom: "fc6" + top: "fc6" +} +layer { + name: "fc7" + type: "Convolution" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4096 + pad: 0 + kernel_size: 1 + stride: 1 + } +} +layer { + name: "relu7" + type: "ReLU" + bottom: "fc7" + top: "fc7" +} +layer { + name: "score_fr" + type: "Convolution" + bottom: "fc7" + top: "score_fr" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 21 + pad: 0 + kernel_size: 1 + } +} +layer { + name: "upscore" + type: "Deconvolution" + bottom: "score_fr" + top: "upscore" + param { + lr_mult: 0 + } + convolution_param { + num_output: 21 + bias_term: false + kernel_size: 64 + stride: 32 + } +} +layer { + name: "score" + type: "Crop" + bottom: "upscore" + bottom: "data" + top: "score" + crop_param { + axis: 2 + offset: 19 + } +} diff --git a/data/dnn/fcn8s-heavy-pascal.prototxt b/data/dnn/fcn8s-heavy-pascal.prototxt new file mode 100644 index 00000000..426b40f8 --- /dev/null +++ b/data/dnn/fcn8s-heavy-pascal.prototxt @@ -0,0 +1,612 @@ +# +# This prototxt is based on voc-fcn8s/val.prototxt file from +# https://github.com/shelhamer/fcn.berkeleyvision.org, which is distributed under +# Caffe (BSD) license: +# http://caffe.berkeleyvision.org/model_zoo.html#bvlc-model-license +# +name: "voc-fcn8s" +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 500 +input_dim: 500 +layer { + name: "conv1_1" + type: "Convolution" + bottom: "data" + top: "conv1_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 100 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1" + top: "conv2_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "conv2_2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2" + top: "conv3_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "pool3" + type: "Pooling" + bottom: "conv3_3" + top: "pool3" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3" + top: "conv4_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu4_3" + type: "ReLU" + bottom: "conv4_3" + top: "conv4_3" +} +layer { + name: "pool4" + type: "Pooling" + bottom: "conv4_3" + top: "pool4" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv5_1" + type: "Convolution" + bottom: "pool4" + top: "conv5_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu5_1" + type: "ReLU" + bottom: "conv5_1" + top: "conv5_1" +} +layer { + name: "conv5_2" + type: "Convolution" + bottom: "conv5_1" + top: "conv5_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu5_2" + type: "ReLU" + bottom: "conv5_2" + top: "conv5_2" +} +layer { + name: "conv5_3" + type: "Convolution" + bottom: "conv5_2" + top: "conv5_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu5_3" + type: "ReLU" + bottom: "conv5_3" + top: "conv5_3" +} +layer { + name: "pool5" + type: "Pooling" + bottom: "conv5_3" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "fc6" + type: "Convolution" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4096 + pad: 0 + kernel_size: 7 + stride: 1 + } +} +layer { + name: "relu6" + type: "ReLU" + bottom: "fc6" + top: "fc6" +} +layer { + name: "fc7" + type: "Convolution" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4096 + pad: 0 + kernel_size: 1 + stride: 1 + } +} +layer { + name: "relu7" + type: "ReLU" + bottom: "fc7" + top: "fc7" +} +layer { + name: "score_fr" + type: "Convolution" + bottom: "fc7" + top: "score_fr" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 21 + pad: 0 + kernel_size: 1 + } +} +layer { + name: "upscore2" + type: "Deconvolution" + bottom: "score_fr" + top: "upscore2" + param { + lr_mult: 0 + } + convolution_param { + num_output: 21 + bias_term: false + kernel_size: 4 + stride: 2 + } +} +layer { + name: "score_pool4" + type: "Convolution" + bottom: "pool4" + top: "score_pool4" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 21 + pad: 0 + kernel_size: 1 + } +} +layer { + name: "score_pool4c" + type: "Crop" + bottom: "score_pool4" + bottom: "upscore2" + top: "score_pool4c" + crop_param { + axis: 2 + offset: 5 + } +} +layer { + name: "fuse_pool4" + type: "Eltwise" + bottom: "upscore2" + bottom: "score_pool4c" + top: "fuse_pool4" + eltwise_param { + operation: SUM + } +} +layer { + name: "upscore_pool4" + type: "Deconvolution" + bottom: "fuse_pool4" + top: "upscore_pool4" + param { + lr_mult: 0 + } + convolution_param { + num_output: 21 + bias_term: false + kernel_size: 4 + stride: 2 + } +} +layer { + name: "score_pool3" + type: "Convolution" + bottom: "pool3" + top: "score_pool3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 21 + pad: 0 + kernel_size: 1 + } +} +layer { + name: "score_pool3c" + type: "Crop" + bottom: "score_pool3" + bottom: "upscore_pool4" + top: "score_pool3c" + crop_param { + axis: 2 + offset: 9 + } +} +layer { + name: "fuse_pool3" + type: "Eltwise" + bottom: "upscore_pool4" + bottom: "score_pool3c" + top: "fuse_pool3" + eltwise_param { + operation: SUM + } +} +layer { + name: "upscore8" + type: "Deconvolution" + bottom: "fuse_pool3" + top: "upscore8" + param { + lr_mult: 0 + } + convolution_param { + num_output: 21 + bias_term: false + kernel_size: 16 + stride: 8 + } +} +layer { + name: "score" + type: "Crop" + bottom: "upscore8" + bottom: "data" + top: "score" + crop_param { + axis: 2 + offset: 31 + } +} diff --git a/data/dnn/pascal-classes.txt b/data/dnn/pascal-classes.txt new file mode 100644 index 00000000..a3a62c19 --- /dev/null +++ b/data/dnn/pascal-classes.txt @@ -0,0 +1,21 @@ +background 0 0 0 +aeroplane 128 0 0 +bicycle 0 128 0 +bird 128 128 0 +boat 0 0 128 +bottle 128 0 128 +bus 0 128 128 +car 128 128 128 +cat 64 0 0 +chair 192 0 0 +cow 64 128 0 +diningtable 192 128 0 +dog 64 0 128 +horse 192 0 128 +motorbike 64 128 128 +person 192 128 128 +pottedplant 0 64 0 +sheep 128 64 0 +sofa 0 192 0 +train 128 192 0 +tvmonitor 0 64 128 diff --git a/data/dnn/rgb.jpg b/data/dnn/rgb.jpg new file mode 100644 index 00000000..f78e6e44 Binary files /dev/null and b/data/dnn/rgb.jpg differ diff --git a/data/dnn/space_shuttle.jpg b/data/dnn/space_shuttle.jpg new file mode 100644 index 00000000..412a9196 Binary files /dev/null and b/data/dnn/space_shuttle.jpg differ diff --git a/data/dnn/synset_words.txt b/data/dnn/synset_words.txt new file mode 100644 index 00000000..a9e8c7f5 --- /dev/null +++ b/data/dnn/synset_words.txt @@ -0,0 +1,1000 @@ +n01440764 tench, Tinca tinca +n01443537 goldfish, Carassius auratus +n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias +n01491361 tiger shark, Galeocerdo cuvieri +n01494475 hammerhead, hammerhead shark +n01496331 electric ray, crampfish, numbfish, torpedo +n01498041 stingray +n01514668 cock +n01514859 hen +n01518878 ostrich, Struthio camelus +n01530575 brambling, Fringilla montifringilla +n01531178 goldfinch, Carduelis carduelis +n01532829 house finch, linnet, Carpodacus mexicanus +n01534433 junco, snowbird +n01537544 indigo bunting, indigo finch, indigo bird, Passerina cyanea +n01558993 robin, American robin, Turdus migratorius +n01560419 bulbul +n01580077 jay +n01582220 magpie +n01592084 chickadee +n01601694 water ouzel, dipper +n01608432 kite +n01614925 bald eagle, American eagle, Haliaeetus leucocephalus +n01616318 vulture +n01622779 great grey owl, great gray owl, Strix nebulosa +n01629819 European fire salamander, Salamandra salamandra +n01630670 common newt, Triturus vulgaris +n01631663 eft +n01632458 spotted salamander, Ambystoma maculatum +n01632777 axolotl, mud puppy, Ambystoma mexicanum +n01641577 bullfrog, Rana catesbeiana +n01644373 tree frog, tree-frog +n01644900 tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui +n01664065 loggerhead, loggerhead turtle, Caretta caretta +n01665541 leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea +n01667114 mud turtle +n01667778 terrapin +n01669191 box turtle, box tortoise +n01675722 banded gecko +n01677366 common iguana, iguana, Iguana iguana +n01682714 American chameleon, anole, Anolis carolinensis +n01685808 whiptail, whiptail lizard +n01687978 agama +n01688243 frilled lizard, Chlamydosaurus kingi +n01689811 alligator lizard +n01692333 Gila monster, Heloderma suspectum +n01693334 green lizard, Lacerta viridis +n01694178 African chameleon, Chamaeleo chamaeleon +n01695060 Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis +n01697457 African crocodile, Nile crocodile, Crocodylus niloticus +n01698640 American alligator, Alligator mississipiensis +n01704323 triceratops +n01728572 thunder snake, worm snake, Carphophis amoenus +n01728920 ringneck snake, ring-necked snake, ring snake +n01729322 hognose snake, puff adder, sand viper +n01729977 green snake, grass snake +n01734418 king snake, kingsnake +n01735189 garter snake, grass snake +n01737021 water snake +n01739381 vine snake +n01740131 night snake, Hypsiglena torquata +n01742172 boa constrictor, Constrictor constrictor +n01744401 rock python, rock snake, Python sebae +n01748264 Indian cobra, Naja naja +n01749939 green mamba +n01751748 sea snake +n01753488 horned viper, cerastes, sand viper, horned asp, Cerastes cornutus +n01755581 diamondback, diamondback rattlesnake, Crotalus adamanteus +n01756291 sidewinder, horned rattlesnake, Crotalus cerastes +n01768244 trilobite +n01770081 harvestman, daddy longlegs, Phalangium opilio +n01770393 scorpion +n01773157 black and gold garden spider, Argiope aurantia +n01773549 barn spider, Araneus cavaticus +n01773797 garden spider, Aranea diademata +n01774384 black widow, Latrodectus mactans +n01774750 tarantula +n01775062 wolf spider, hunting spider +n01776313 tick +n01784675 centipede +n01795545 black grouse +n01796340 ptarmigan +n01797886 ruffed grouse, partridge, Bonasa umbellus +n01798484 prairie chicken, prairie grouse, prairie fowl +n01806143 peacock +n01806567 quail +n01807496 partridge +n01817953 African grey, African gray, Psittacus erithacus +n01818515 macaw +n01819313 sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita +n01820546 lorikeet +n01824575 coucal +n01828970 bee eater +n01829413 hornbill +n01833805 hummingbird +n01843065 jacamar +n01843383 toucan +n01847000 drake +n01855032 red-breasted merganser, Mergus serrator +n01855672 goose +n01860187 black swan, Cygnus atratus +n01871265 tusker +n01872401 echidna, spiny anteater, anteater +n01873310 platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus +n01877812 wallaby, brush kangaroo +n01882714 koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus +n01883070 wombat +n01910747 jellyfish +n01914609 sea anemone, anemone +n01917289 brain coral +n01924916 flatworm, platyhelminth +n01930112 nematode, nematode worm, roundworm +n01943899 conch +n01944390 snail +n01945685 slug +n01950731 sea slug, nudibranch +n01955084 chiton, coat-of-mail shell, sea cradle, polyplacophore +n01968897 chambered nautilus, pearly nautilus, nautilus +n01978287 Dungeness crab, Cancer magister +n01978455 rock crab, Cancer irroratus +n01980166 fiddler crab +n01981276 king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica +n01983481 American lobster, Northern lobster, Maine lobster, Homarus americanus +n01984695 spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish +n01985128 crayfish, crawfish, crawdad, crawdaddy +n01986214 hermit crab +n01990800 isopod +n02002556 white stork, Ciconia ciconia +n02002724 black stork, Ciconia nigra +n02006656 spoonbill +n02007558 flamingo +n02009229 little blue heron, Egretta caerulea +n02009912 American egret, great white heron, Egretta albus +n02011460 bittern +n02012849 crane +n02013706 limpkin, Aramus pictus +n02017213 European gallinule, Porphyrio porphyrio +n02018207 American coot, marsh hen, mud hen, water hen, Fulica americana +n02018795 bustard +n02025239 ruddy turnstone, Arenaria interpres +n02027492 red-backed sandpiper, dunlin, Erolia alpina +n02028035 redshank, Tringa totanus +n02033041 dowitcher +n02037110 oystercatcher, oyster catcher +n02051845 pelican +n02056570 king penguin, Aptenodytes patagonica +n02058221 albatross, mollymawk +n02066245 grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus +n02071294 killer whale, killer, orca, grampus, sea wolf, Orcinus orca +n02074367 dugong, Dugong dugon +n02077923 sea lion +n02085620 Chihuahua +n02085782 Japanese spaniel +n02085936 Maltese dog, Maltese terrier, Maltese +n02086079 Pekinese, Pekingese, Peke +n02086240 Shih-Tzu +n02086646 Blenheim spaniel +n02086910 papillon +n02087046 toy terrier +n02087394 Rhodesian ridgeback +n02088094 Afghan hound, Afghan +n02088238 basset, basset hound +n02088364 beagle +n02088466 bloodhound, sleuthhound +n02088632 bluetick +n02089078 black-and-tan coonhound +n02089867 Walker hound, Walker foxhound +n02089973 English foxhound +n02090379 redbone +n02090622 borzoi, Russian wolfhound +n02090721 Irish wolfhound +n02091032 Italian greyhound +n02091134 whippet +n02091244 Ibizan hound, Ibizan Podenco +n02091467 Norwegian elkhound, elkhound +n02091635 otterhound, otter hound +n02091831 Saluki, gazelle hound +n02092002 Scottish deerhound, deerhound +n02092339 Weimaraner +n02093256 Staffordshire bullterrier, Staffordshire bull terrier +n02093428 American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier +n02093647 Bedlington terrier +n02093754 Border terrier +n02093859 Kerry blue terrier +n02093991 Irish terrier +n02094114 Norfolk terrier +n02094258 Norwich terrier +n02094433 Yorkshire terrier +n02095314 wire-haired fox terrier +n02095570 Lakeland terrier +n02095889 Sealyham terrier, Sealyham +n02096051 Airedale, Airedale terrier +n02096177 cairn, cairn terrier +n02096294 Australian terrier +n02096437 Dandie Dinmont, Dandie Dinmont terrier +n02096585 Boston bull, Boston terrier +n02097047 miniature schnauzer +n02097130 giant schnauzer +n02097209 standard schnauzer +n02097298 Scotch terrier, Scottish terrier, Scottie +n02097474 Tibetan terrier, chrysanthemum dog +n02097658 silky terrier, Sydney silky +n02098105 soft-coated wheaten terrier +n02098286 West Highland white terrier +n02098413 Lhasa, Lhasa apso +n02099267 flat-coated retriever +n02099429 curly-coated retriever +n02099601 golden retriever +n02099712 Labrador retriever +n02099849 Chesapeake Bay retriever +n02100236 German short-haired pointer +n02100583 vizsla, Hungarian pointer +n02100735 English setter +n02100877 Irish setter, red setter +n02101006 Gordon setter +n02101388 Brittany spaniel +n02101556 clumber, clumber spaniel +n02102040 English springer, English springer spaniel +n02102177 Welsh springer spaniel +n02102318 cocker spaniel, English cocker spaniel, cocker +n02102480 Sussex spaniel +n02102973 Irish water spaniel +n02104029 kuvasz +n02104365 schipperke +n02105056 groenendael +n02105162 malinois +n02105251 briard +n02105412 kelpie +n02105505 komondor +n02105641 Old English sheepdog, bobtail +n02105855 Shetland sheepdog, Shetland sheep dog, Shetland +n02106030 collie +n02106166 Border collie +n02106382 Bouvier des Flandres, Bouviers des Flandres +n02106550 Rottweiler +n02106662 German shepherd, German shepherd dog, German police dog, alsatian +n02107142 Doberman, Doberman pinscher +n02107312 miniature pinscher +n02107574 Greater Swiss Mountain dog +n02107683 Bernese mountain dog +n02107908 Appenzeller +n02108000 EntleBucher +n02108089 boxer +n02108422 bull mastiff +n02108551 Tibetan mastiff +n02108915 French bulldog +n02109047 Great Dane +n02109525 Saint Bernard, St Bernard +n02109961 Eskimo dog, husky +n02110063 malamute, malemute, Alaskan malamute +n02110185 Siberian husky +n02110341 dalmatian, coach dog, carriage dog +n02110627 affenpinscher, monkey pinscher, monkey dog +n02110806 basenji +n02110958 pug, pug-dog +n02111129 Leonberg +n02111277 Newfoundland, Newfoundland dog +n02111500 Great Pyrenees +n02111889 Samoyed, Samoyede +n02112018 Pomeranian +n02112137 chow, chow chow +n02112350 keeshond +n02112706 Brabancon griffon +n02113023 Pembroke, Pembroke Welsh corgi +n02113186 Cardigan, Cardigan Welsh corgi +n02113624 toy poodle +n02113712 miniature poodle +n02113799 standard poodle +n02113978 Mexican hairless +n02114367 timber wolf, grey wolf, gray wolf, Canis lupus +n02114548 white wolf, Arctic wolf, Canis lupus tundrarum +n02114712 red wolf, maned wolf, Canis rufus, Canis niger +n02114855 coyote, prairie wolf, brush wolf, Canis latrans +n02115641 dingo, warrigal, warragal, Canis dingo +n02115913 dhole, Cuon alpinus +n02116738 African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus +n02117135 hyena, hyaena +n02119022 red fox, Vulpes vulpes +n02119789 kit fox, Vulpes macrotis +n02120079 Arctic fox, white fox, Alopex lagopus +n02120505 grey fox, gray fox, Urocyon cinereoargenteus +n02123045 tabby, tabby cat +n02123159 tiger cat +n02123394 Persian cat +n02123597 Siamese cat, Siamese +n02124075 Egyptian cat +n02125311 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor +n02127052 lynx, catamount +n02128385 leopard, Panthera pardus +n02128757 snow leopard, ounce, Panthera uncia +n02128925 jaguar, panther, Panthera onca, Felis onca +n02129165 lion, king of beasts, Panthera leo +n02129604 tiger, Panthera tigris +n02130308 cheetah, chetah, Acinonyx jubatus +n02132136 brown bear, bruin, Ursus arctos +n02133161 American black bear, black bear, Ursus americanus, Euarctos americanus +n02134084 ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus +n02134418 sloth bear, Melursus ursinus, Ursus ursinus +n02137549 mongoose +n02138441 meerkat, mierkat +n02165105 tiger beetle +n02165456 ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle +n02167151 ground beetle, carabid beetle +n02168699 long-horned beetle, longicorn, longicorn beetle +n02169497 leaf beetle, chrysomelid +n02172182 dung beetle +n02174001 rhinoceros beetle +n02177972 weevil +n02190166 fly +n02206856 bee +n02219486 ant, emmet, pismire +n02226429 grasshopper, hopper +n02229544 cricket +n02231487 walking stick, walkingstick, stick insect +n02233338 cockroach, roach +n02236044 mantis, mantid +n02256656 cicada, cicala +n02259212 leafhopper +n02264363 lacewing, lacewing fly +n02268443 dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk +n02268853 damselfly +n02276258 admiral +n02277742 ringlet, ringlet butterfly +n02279972 monarch, monarch butterfly, milkweed butterfly, Danaus plexippus +n02280649 cabbage butterfly +n02281406 sulphur butterfly, sulfur butterfly +n02281787 lycaenid, lycaenid butterfly +n02317335 starfish, sea star +n02319095 sea urchin +n02321529 sea cucumber, holothurian +n02325366 wood rabbit, cottontail, cottontail rabbit +n02326432 hare +n02328150 Angora, Angora rabbit +n02342885 hamster +n02346627 porcupine, hedgehog +n02356798 fox squirrel, eastern fox squirrel, Sciurus niger +n02361337 marmot +n02363005 beaver +n02364673 guinea pig, Cavia cobaya +n02389026 sorrel +n02391049 zebra +n02395406 hog, pig, grunter, squealer, Sus scrofa +n02396427 wild boar, boar, Sus scrofa +n02397096 warthog +n02398521 hippopotamus, hippo, river horse, Hippopotamus amphibius +n02403003 ox +n02408429 water buffalo, water ox, Asiatic buffalo, Bubalus bubalis +n02410509 bison +n02412080 ram, tup +n02415577 bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis +n02417914 ibex, Capra ibex +n02422106 hartebeest +n02422699 impala, Aepyceros melampus +n02423022 gazelle +n02437312 Arabian camel, dromedary, Camelus dromedarius +n02437616 llama +n02441942 weasel +n02442845 mink +n02443114 polecat, fitch, foulmart, foumart, Mustela putorius +n02443484 black-footed ferret, ferret, Mustela nigripes +n02444819 otter +n02445715 skunk, polecat, wood pussy +n02447366 badger +n02454379 armadillo +n02457408 three-toed sloth, ai, Bradypus tridactylus +n02480495 orangutan, orang, orangutang, Pongo pygmaeus +n02480855 gorilla, Gorilla gorilla +n02481823 chimpanzee, chimp, Pan troglodytes +n02483362 gibbon, Hylobates lar +n02483708 siamang, Hylobates syndactylus, Symphalangus syndactylus +n02484975 guenon, guenon monkey +n02486261 patas, hussar monkey, Erythrocebus patas +n02486410 baboon +n02487347 macaque +n02488291 langur +n02488702 colobus, colobus monkey +n02489166 proboscis monkey, Nasalis larvatus +n02490219 marmoset +n02492035 capuchin, ringtail, Cebus capucinus +n02492660 howler monkey, howler +n02493509 titi, titi monkey +n02493793 spider monkey, Ateles geoffroyi +n02494079 squirrel monkey, Saimiri sciureus +n02497673 Madagascar cat, ring-tailed lemur, Lemur catta +n02500267 indri, indris, Indri indri, Indri brevicaudatus +n02504013 Indian elephant, Elephas maximus +n02504458 African elephant, Loxodonta africana +n02509815 lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens +n02510455 giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca +n02514041 barracouta, snoek +n02526121 eel +n02536864 coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch +n02606052 rock beauty, Holocanthus tricolor +n02607072 anemone fish +n02640242 sturgeon +n02641379 gar, garfish, garpike, billfish, Lepisosteus osseus +n02643566 lionfish +n02655020 puffer, pufferfish, blowfish, globefish +n02666196 abacus +n02667093 abaya +n02669723 academic gown, academic robe, judge's robe +n02672831 accordion, piano accordion, squeeze box +n02676566 acoustic guitar +n02687172 aircraft carrier, carrier, flattop, attack aircraft carrier +n02690373 airliner +n02692877 airship, dirigible +n02699494 altar +n02701002 ambulance +n02704792 amphibian, amphibious vehicle +n02708093 analog clock +n02727426 apiary, bee house +n02730930 apron +n02747177 ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin +n02749479 assault rifle, assault gun +n02769748 backpack, back pack, knapsack, packsack, rucksack, haversack +n02776631 bakery, bakeshop, bakehouse +n02777292 balance beam, beam +n02782093 balloon +n02783161 ballpoint, ballpoint pen, ballpen, Biro +n02786058 Band Aid +n02787622 banjo +n02788148 bannister, banister, balustrade, balusters, handrail +n02790996 barbell +n02791124 barber chair +n02791270 barbershop +n02793495 barn +n02794156 barometer +n02795169 barrel, cask +n02797295 barrow, garden cart, lawn cart, wheelbarrow +n02799071 baseball +n02802426 basketball +n02804414 bassinet +n02804610 bassoon +n02807133 bathing cap, swimming cap +n02808304 bath towel +n02808440 bathtub, bathing tub, bath, tub +n02814533 beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon +n02814860 beacon, lighthouse, beacon light, pharos +n02815834 beaker +n02817516 bearskin, busby, shako +n02823428 beer bottle +n02823750 beer glass +n02825657 bell cote, bell cot +n02834397 bib +n02835271 bicycle-built-for-two, tandem bicycle, tandem +n02837789 bikini, two-piece +n02840245 binder, ring-binder +n02841315 binoculars, field glasses, opera glasses +n02843684 birdhouse +n02859443 boathouse +n02860847 bobsled, bobsleigh, bob +n02865351 bolo tie, bolo, bola tie, bola +n02869837 bonnet, poke bonnet +n02870880 bookcase +n02871525 bookshop, bookstore, bookstall +n02877765 bottlecap +n02879718 bow +n02883205 bow tie, bow-tie, bowtie +n02892201 brass, memorial tablet, plaque +n02892767 brassiere, bra, bandeau +n02894605 breakwater, groin, groyne, mole, bulwark, seawall, jetty +n02895154 breastplate, aegis, egis +n02906734 broom +n02909870 bucket, pail +n02910353 buckle +n02916936 bulletproof vest +n02917067 bullet train, bullet +n02927161 butcher shop, meat market +n02930766 cab, hack, taxi, taxicab +n02939185 caldron, cauldron +n02948072 candle, taper, wax light +n02950826 cannon +n02951358 canoe +n02951585 can opener, tin opener +n02963159 cardigan +n02965783 car mirror +n02966193 carousel, carrousel, merry-go-round, roundabout, whirligig +n02966687 carpenter's kit, tool kit +n02971356 carton +n02974003 car wheel +n02977058 cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM +n02978881 cassette +n02979186 cassette player +n02980441 castle +n02981792 catamaran +n02988304 CD player +n02992211 cello, violoncello +n02992529 cellular telephone, cellular phone, cellphone, cell, mobile phone +n02999410 chain +n03000134 chainlink fence +n03000247 chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour +n03000684 chain saw, chainsaw +n03014705 chest +n03016953 chiffonier, commode +n03017168 chime, bell, gong +n03018349 china cabinet, china closet +n03026506 Christmas stocking +n03028079 church, church building +n03032252 cinema, movie theater, movie theatre, movie house, picture palace +n03041632 cleaver, meat cleaver, chopper +n03042490 cliff dwelling +n03045698 cloak +n03047690 clog, geta, patten, sabot +n03062245 cocktail shaker +n03063599 coffee mug +n03063689 coffeepot +n03065424 coil, spiral, volute, whorl, helix +n03075370 combination lock +n03085013 computer keyboard, keypad +n03089624 confectionery, confectionary, candy store +n03095699 container ship, containership, container vessel +n03100240 convertible +n03109150 corkscrew, bottle screw +n03110669 cornet, horn, trumpet, trump +n03124043 cowboy boot +n03124170 cowboy hat, ten-gallon hat +n03125729 cradle +n03126707 crane +n03127747 crash helmet +n03127925 crate +n03131574 crib, cot +n03133878 Crock Pot +n03134739 croquet ball +n03141823 crutch +n03146219 cuirass +n03160309 dam, dike, dyke +n03179701 desk +n03180011 desktop computer +n03187595 dial telephone, dial phone +n03188531 diaper, nappy, napkin +n03196217 digital clock +n03197337 digital watch +n03201208 dining table, board +n03207743 dishrag, dishcloth +n03207941 dishwasher, dish washer, dishwashing machine +n03208938 disk brake, disc brake +n03216828 dock, dockage, docking facility +n03218198 dogsled, dog sled, dog sleigh +n03220513 dome +n03223299 doormat, welcome mat +n03240683 drilling platform, offshore rig +n03249569 drum, membranophone, tympan +n03250847 drumstick +n03255030 dumbbell +n03259280 Dutch oven +n03271574 electric fan, blower +n03272010 electric guitar +n03272562 electric locomotive +n03290653 entertainment center +n03291819 envelope +n03297495 espresso maker +n03314780 face powder +n03325584 feather boa, boa +n03337140 file, file cabinet, filing cabinet +n03344393 fireboat +n03345487 fire engine, fire truck +n03347037 fire screen, fireguard +n03355925 flagpole, flagstaff +n03372029 flute, transverse flute +n03376595 folding chair +n03379051 football helmet +n03384352 forklift +n03388043 fountain +n03388183 fountain pen +n03388549 four-poster +n03393912 freight car +n03394916 French horn, horn +n03400231 frying pan, frypan, skillet +n03404251 fur coat +n03417042 garbage truck, dustcart +n03424325 gasmask, respirator, gas helmet +n03425413 gas pump, gasoline pump, petrol pump, island dispenser +n03443371 goblet +n03444034 go-kart +n03445777 golf ball +n03445924 golfcart, golf cart +n03447447 gondola +n03447721 gong, tam-tam +n03450230 gown +n03452741 grand piano, grand +n03457902 greenhouse, nursery, glasshouse +n03459775 grille, radiator grille +n03461385 grocery store, grocery, food market, market +n03467068 guillotine +n03476684 hair slide +n03476991 hair spray +n03478589 half track +n03481172 hammer +n03482405 hamper +n03483316 hand blower, blow dryer, blow drier, hair dryer, hair drier +n03485407 hand-held computer, hand-held microcomputer +n03485794 handkerchief, hankie, hanky, hankey +n03492542 hard disc, hard disk, fixed disk +n03494278 harmonica, mouth organ, harp, mouth harp +n03495258 harp +n03496892 harvester, reaper +n03498962 hatchet +n03527444 holster +n03529860 home theater, home theatre +n03530642 honeycomb +n03532672 hook, claw +n03534580 hoopskirt, crinoline +n03535780 horizontal bar, high bar +n03538406 horse cart, horse-cart +n03544143 hourglass +n03584254 iPod +n03584829 iron, smoothing iron +n03590841 jack-o'-lantern +n03594734 jean, blue jean, denim +n03594945 jeep, landrover +n03595614 jersey, T-shirt, tee shirt +n03598930 jigsaw puzzle +n03599486 jinrikisha, ricksha, rickshaw +n03602883 joystick +n03617480 kimono +n03623198 knee pad +n03627232 knot +n03630383 lab coat, laboratory coat +n03633091 ladle +n03637318 lampshade, lamp shade +n03642806 laptop, laptop computer +n03649909 lawn mower, mower +n03657121 lens cap, lens cover +n03658185 letter opener, paper knife, paperknife +n03661043 library +n03662601 lifeboat +n03666591 lighter, light, igniter, ignitor +n03670208 limousine, limo +n03673027 liner, ocean liner +n03676483 lipstick, lip rouge +n03680355 Loafer +n03690938 lotion +n03691459 loudspeaker, speaker, speaker unit, loudspeaker system, speaker system +n03692522 loupe, jeweler's loupe +n03697007 lumbermill, sawmill +n03706229 magnetic compass +n03709823 mailbag, postbag +n03710193 mailbox, letter box +n03710637 maillot +n03710721 maillot, tank suit +n03717622 manhole cover +n03720891 maraca +n03721384 marimba, xylophone +n03724870 mask +n03729826 matchstick +n03733131 maypole +n03733281 maze, labyrinth +n03733805 measuring cup +n03742115 medicine chest, medicine cabinet +n03743016 megalith, megalithic structure +n03759954 microphone, mike +n03761084 microwave, microwave oven +n03763968 military uniform +n03764736 milk can +n03769881 minibus +n03770439 miniskirt, mini +n03770679 minivan +n03773504 missile +n03775071 mitten +n03775546 mixing bowl +n03776460 mobile home, manufactured home +n03777568 Model T +n03777754 modem +n03781244 monastery +n03782006 monitor +n03785016 moped +n03786901 mortar +n03787032 mortarboard +n03788195 mosque +n03788365 mosquito net +n03791053 motor scooter, scooter +n03792782 mountain bike, all-terrain bike, off-roader +n03792972 mountain tent +n03793489 mouse, computer mouse +n03794056 mousetrap +n03796401 moving van +n03803284 muzzle +n03804744 nail +n03814639 neck brace +n03814906 necklace +n03825788 nipple +n03832673 notebook, notebook computer +n03837869 obelisk +n03838899 oboe, hautboy, hautbois +n03840681 ocarina, sweet potato +n03841143 odometer, hodometer, mileometer, milometer +n03843555 oil filter +n03854065 organ, pipe organ +n03857828 oscilloscope, scope, cathode-ray oscilloscope, CRO +n03866082 overskirt +n03868242 oxcart +n03868863 oxygen mask +n03871628 packet +n03873416 paddle, boat paddle +n03874293 paddlewheel, paddle wheel +n03874599 padlock +n03876231 paintbrush +n03877472 pajama, pyjama, pj's, jammies +n03877845 palace +n03884397 panpipe, pandean pipe, syrinx +n03887697 paper towel +n03888257 parachute, chute +n03888605 parallel bars, bars +n03891251 park bench +n03891332 parking meter +n03895866 passenger car, coach, carriage +n03899768 patio, terrace +n03902125 pay-phone, pay-station +n03903868 pedestal, plinth, footstall +n03908618 pencil box, pencil case +n03908714 pencil sharpener +n03916031 perfume, essence +n03920288 Petri dish +n03924679 photocopier +n03929660 pick, plectrum, plectron +n03929855 pickelhaube +n03930313 picket fence, paling +n03930630 pickup, pickup truck +n03933933 pier +n03935335 piggy bank, penny bank +n03937543 pill bottle +n03938244 pillow +n03942813 ping-pong ball +n03944341 pinwheel +n03947888 pirate, pirate ship +n03950228 pitcher, ewer +n03954731 plane, carpenter's plane, woodworking plane +n03956157 planetarium +n03958227 plastic bag +n03961711 plate rack +n03967562 plow, plough +n03970156 plunger, plumber's helper +n03976467 Polaroid camera, Polaroid Land camera +n03976657 pole +n03977966 police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria +n03980874 poncho +n03982430 pool table, billiard table, snooker table +n03983396 pop bottle, soda bottle +n03991062 pot, flowerpot +n03992509 potter's wheel +n03995372 power drill +n03998194 prayer rug, prayer mat +n04004767 printer +n04005630 prison, prison house +n04008634 projectile, missile +n04009552 projector +n04019541 puck, hockey puck +n04023962 punching bag, punch bag, punching ball, punchball +n04026417 purse +n04033901 quill, quill pen +n04033995 quilt, comforter, comfort, puff +n04037443 racer, race car, racing car +n04039381 racket, racquet +n04040759 radiator +n04041544 radio, wireless +n04044716 radio telescope, radio reflector +n04049303 rain barrel +n04065272 recreational vehicle, RV, R.V. +n04067472 reel +n04069434 reflex camera +n04070727 refrigerator, icebox +n04074963 remote control, remote +n04081281 restaurant, eating house, eating place, eatery +n04086273 revolver, six-gun, six-shooter +n04090263 rifle +n04099969 rocking chair, rocker +n04111531 rotisserie +n04116512 rubber eraser, rubber, pencil eraser +n04118538 rugby ball +n04118776 rule, ruler +n04120489 running shoe +n04125021 safe +n04127249 safety pin +n04131690 saltshaker, salt shaker +n04133789 sandal +n04136333 sarong +n04141076 sax, saxophone +n04141327 scabbard +n04141975 scale, weighing machine +n04146614 school bus +n04147183 schooner +n04149813 scoreboard +n04152593 screen, CRT screen +n04153751 screw +n04154565 screwdriver +n04162706 seat belt, seatbelt +n04179913 sewing machine +n04192698 shield, buckler +n04200800 shoe shop, shoe-shop, shoe store +n04201297 shoji +n04204238 shopping basket +n04204347 shopping cart +n04208210 shovel +n04209133 shower cap +n04209239 shower curtain +n04228054 ski +n04229816 ski mask +n04235860 sleeping bag +n04238763 slide rule, slipstick +n04239074 sliding door +n04243546 slot, one-armed bandit +n04251144 snorkel +n04252077 snowmobile +n04252225 snowplow, snowplough +n04254120 soap dispenser +n04254680 soccer ball +n04254777 sock +n04258138 solar dish, solar collector, solar furnace +n04259630 sombrero +n04263257 soup bowl +n04264628 space bar +n04265275 space heater +n04266014 space shuttle +n04270147 spatula +n04273569 speedboat +n04275548 spider web, spider's web +n04277352 spindle +n04285008 sports car, sport car +n04286575 spotlight, spot +n04296562 stage +n04310018 steam locomotive +n04311004 steel arch bridge +n04311174 steel drum +n04317175 stethoscope +n04325704 stole +n04326547 stone wall +n04328186 stopwatch, stop watch +n04330267 stove +n04332243 strainer +n04335435 streetcar, tram, tramcar, trolley, trolley car +n04336792 stretcher +n04344873 studio couch, day bed +n04346328 stupa, tope +n04347754 submarine, pigboat, sub, U-boat +n04350905 suit, suit of clothes +n04355338 sundial +n04355933 sunglass +n04356056 sunglasses, dark glasses, shades +n04357314 sunscreen, sunblock, sun blocker +n04366367 suspension bridge +n04367480 swab, swob, mop +n04370456 sweatshirt +n04371430 swimming trunks, bathing trunks +n04371774 swing +n04372370 switch, electric switch, electrical switch +n04376876 syringe +n04380533 table lamp +n04389033 tank, army tank, armored combat vehicle, armoured combat vehicle +n04392985 tape player +n04398044 teapot +n04399382 teddy, teddy bear +n04404412 television, television system +n04409515 tennis ball +n04417672 thatch, thatched roof +n04418357 theater curtain, theatre curtain +n04423845 thimble +n04428191 thresher, thrasher, threshing machine +n04429376 throne +n04435653 tile roof +n04442312 toaster +n04443257 tobacco shop, tobacconist shop, tobacconist +n04447861 toilet seat +n04456115 torch +n04458633 totem pole +n04461696 tow truck, tow car, wrecker +n04462240 toyshop +n04465501 tractor +n04467665 trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi +n04476259 tray +n04479046 trench coat +n04482393 tricycle, trike, velocipede +n04483307 trimaran +n04485082 tripod +n04486054 triumphal arch +n04487081 trolleybus, trolley coach, trackless trolley +n04487394 trombone +n04493381 tub, vat +n04501370 turnstile +n04505470 typewriter keyboard +n04507155 umbrella +n04509417 unicycle, monocycle +n04515003 upright, upright piano +n04517823 vacuum, vacuum cleaner +n04522168 vase +n04523525 vault +n04525038 velvet +n04525305 vending machine +n04532106 vestment +n04532670 viaduct +n04536866 violin, fiddle +n04540053 volleyball +n04542943 waffle iron +n04548280 wall clock +n04548362 wallet, billfold, notecase, pocketbook +n04550184 wardrobe, closet, press +n04552348 warplane, military plane +n04553703 washbasin, handbasin, washbowl, lavabo, wash-hand basin +n04554684 washer, automatic washer, washing machine +n04557648 water bottle +n04560804 water jug +n04562935 water tower +n04579145 whiskey jug +n04579432 whistle +n04584207 wig +n04589890 window screen +n04590129 window shade +n04591157 Windsor tie +n04591713 wine bottle +n04592741 wing +n04596742 wok +n04597913 wooden spoon +n04599235 wool, woolen, woollen +n04604644 worm fence, snake fence, snake-rail fence, Virginia fence +n04606251 wreck +n04612504 yawl +n04613696 yurt +n06359193 web site, website, internet site, site +n06596364 comic book +n06785654 crossword puzzle, crossword +n06794110 street sign +n06874185 traffic light, traffic signal, stoplight +n07248320 book jacket, dust cover, dust jacket, dust wrapper +n07565083 menu +n07579787 plate +n07583066 guacamole +n07584110 consomme +n07590611 hot pot, hotpot +n07613480 trifle +n07614500 ice cream, icecream +n07615774 ice lolly, lolly, lollipop, popsicle +n07684084 French loaf +n07693725 bagel, beigel +n07695742 pretzel +n07697313 cheeseburger +n07697537 hotdog, hot dog, red hot +n07711569 mashed potato +n07714571 head cabbage +n07714990 broccoli +n07715103 cauliflower +n07716358 zucchini, courgette +n07716906 spaghetti squash +n07717410 acorn squash +n07717556 butternut squash +n07718472 cucumber, cuke +n07718747 artichoke, globe artichoke +n07720875 bell pepper +n07730033 cardoon +n07734744 mushroom +n07742313 Granny Smith +n07745940 strawberry +n07747607 orange +n07749582 lemon +n07753113 fig +n07753275 pineapple, ananas +n07753592 banana +n07754684 jackfruit, jak, jack +n07760859 custard apple +n07768694 pomegranate +n07802026 hay +n07831146 carbonara +n07836838 chocolate sauce, chocolate syrup +n07860988 dough +n07871810 meat loaf, meatloaf +n07873807 pizza, pizza pie +n07875152 potpie +n07880968 burrito +n07892512 red wine +n07920052 espresso +n07930864 cup +n07932039 eggnog +n09193705 alp +n09229709 bubble +n09246464 cliff, drop, drop-off +n09256479 coral reef +n09288635 geyser +n09332890 lakeside, lakeshore +n09399592 promontory, headland, head, foreland +n09421951 sandbar, sand bar +n09428293 seashore, coast, seacoast, sea-coast +n09468604 valley, vale +n09472597 volcano +n09835506 ballplayer, baseball player +n10148035 groom, bridegroom +n10565667 scuba diver +n11879895 rapeseed +n11939491 daisy +n12057211 yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum +n12144580 corn +n12267677 acorn +n12620546 hip, rose hip, rosehip +n12768682 buckeye, horse chestnut, conker +n12985857 coral fungus +n12998815 agaric +n13037406 gyromitra +n13040303 stinkhorn, carrion fungus +n13044778 earthstar +n13052670 hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa +n13054560 bolete +n13133613 ear, spike, capitulum +n15075141 toilet tissue, toilet paper, bathroom tissue diff --git a/data/free_server.jpeg b/data/free_server.jpeg new file mode 100644 index 00000000..ccb1de4c Binary files /dev/null and b/data/free_server.jpeg differ diff --git a/data/fruits.jpg b/data/fruits.jpg new file mode 100644 index 00000000..a89b84a5 Binary files /dev/null and b/data/fruits.jpg differ diff --git a/data/gradient.png b/data/gradient.png new file mode 100644 index 00000000..255e77f9 Binary files /dev/null and b/data/gradient.png differ diff --git a/data/graf1.png b/data/graf1.png new file mode 100755 index 00000000..67e34731 Binary files /dev/null and b/data/graf1.png differ diff --git a/data/graf3.png b/data/graf3.png new file mode 100755 index 00000000..3bcc6093 Binary files /dev/null and b/data/graf3.png differ diff --git a/data/home.jpg b/data/home.jpg old mode 100755 new mode 100644 diff --git a/data/imageTextN.png b/data/imageTextN.png new file mode 100644 index 00000000..cdb58f65 Binary files /dev/null and b/data/imageTextN.png differ diff --git a/data/imageTextR.png b/data/imageTextR.png new file mode 100644 index 00000000..7f90abdf Binary files /dev/null and b/data/imageTextR.png differ diff --git a/data/inpaint_result.jpg b/data/inpaint_result.jpg new file mode 100644 index 00000000..ef568da5 Binary files /dev/null and b/data/inpaint_result.jpg differ diff --git a/data/intrinsics.yml b/data/intrinsics.yml new file mode 100644 index 00000000..70c61518 --- /dev/null +++ b/data/intrinsics.yml @@ -0,0 +1,23 @@ +%YAML:1.0 +M1: !!opencv-matrix + rows: 3 + cols: 3 + dt: d + data: [ 5.3480326845051309e+02, 0., 3.3568643204394891e+02, 0., + 5.3480326845051309e+02, 2.4066183054066337e+02, 0., 0., 1. ] +D1: !!opencv-matrix + rows: 1 + cols: 5 + dt: d + data: [ 2.9589439552724328e-01, -1.0354662043042675e+00, 0., 0., 0. ] +M2: !!opencv-matrix + rows: 3 + cols: 3 + dt: d + data: [ 5.3480326845051309e+02, 0., 3.3455744527912015e+02, 0., + 5.3480326845051309e+02, 2.4205324573376600e+02, 0., 0., 1. ] +D2: !!opencv-matrix + rows: 1 + cols: 5 + dt: d + data: [ -1.6916358306948096e-01, -1.1214173641213163e-01, 0., 0., 0. ] diff --git a/data/left.jpg b/data/left.jpg new file mode 100644 index 00000000..f4c26303 Binary files /dev/null and b/data/left.jpg differ diff --git a/data/left01.jpg b/data/left01.jpg new file mode 100644 index 00000000..6ade3200 Binary files /dev/null and b/data/left01.jpg differ diff --git a/data/left02.jpg b/data/left02.jpg new file mode 100644 index 00000000..457820e9 Binary files /dev/null and b/data/left02.jpg differ diff --git a/data/left03.jpg b/data/left03.jpg new file mode 100644 index 00000000..7f3990f4 Binary files /dev/null and b/data/left03.jpg differ diff --git a/data/left04.jpg b/data/left04.jpg new file mode 100644 index 00000000..3144a18f Binary files /dev/null and b/data/left04.jpg differ diff --git a/data/left05.jpg b/data/left05.jpg new file mode 100644 index 00000000..7b571318 Binary files /dev/null and b/data/left05.jpg differ diff --git a/data/left06.jpg b/data/left06.jpg new file mode 100644 index 00000000..1c6a217c Binary files /dev/null and b/data/left06.jpg differ diff --git a/data/left07.jpg b/data/left07.jpg new file mode 100644 index 00000000..46acbb9e Binary files /dev/null and b/data/left07.jpg differ diff --git a/data/left08.jpg b/data/left08.jpg new file mode 100644 index 00000000..0fe76460 Binary files /dev/null and b/data/left08.jpg differ diff --git a/data/left09.jpg b/data/left09.jpg new file mode 100644 index 00000000..5d17e957 Binary files /dev/null and b/data/left09.jpg differ diff --git a/data/left11.jpg b/data/left11.jpg new file mode 100644 index 00000000..7ca2a147 Binary files /dev/null and b/data/left11.jpg differ diff --git a/data/left12.jpg b/data/left12.jpg new file mode 100644 index 00000000..897955d7 Binary files /dev/null and b/data/left12.jpg differ diff --git a/data/left13.jpg b/data/left13.jpg new file mode 100644 index 00000000..e2f060f2 Binary files /dev/null and b/data/left13.jpg differ diff --git a/data/left14.jpg b/data/left14.jpg new file mode 100644 index 00000000..1dec7c68 Binary files /dev/null and b/data/left14.jpg differ diff --git a/data/lena.jpg b/data/lena.jpg old mode 100755 new mode 100644 diff --git a/data/lena_tmpl.jpg b/data/lena_tmpl.jpg new file mode 100644 index 00000000..0c9fc20d Binary files /dev/null and b/data/lena_tmpl.jpg differ diff --git a/data/letter-recognition.data b/data/letter-recognition.data new file mode 100644 index 00000000..4dfa6f01 --- /dev/null +++ b/data/letter-recognition.data @@ -0,0 +1,20000 @@ +T,2,8,3,5,1,8,13,0,6,6,10,8,0,8,0,8 +I,5,12,3,7,2,10,5,5,4,13,3,9,2,8,4,10 +D,4,11,6,8,6,10,6,2,6,10,3,7,3,7,3,9 +N,7,11,6,6,3,5,9,4,6,4,4,10,6,10,2,8 +G,2,1,3,1,1,8,6,6,6,6,5,9,1,7,5,10 +S,4,11,5,8,3,8,8,6,9,5,6,6,0,8,9,7 +B,4,2,5,4,4,8,7,6,6,7,6,6,2,8,7,10 +A,1,1,3,2,1,8,2,2,2,8,2,8,1,6,2,7 +J,2,2,4,4,2,10,6,2,6,12,4,8,1,6,1,7 +M,11,15,13,9,7,13,2,6,2,12,1,9,8,1,1,8 +X,3,9,5,7,4,8,7,3,8,5,6,8,2,8,6,7 +O,6,13,4,7,4,6,7,6,3,10,7,9,5,9,5,8 +G,4,9,6,7,6,7,8,6,2,6,5,11,4,8,7,8 +M,6,9,8,6,9,7,8,6,5,7,5,8,8,9,8,6 +R,5,9,5,7,6,6,11,7,3,7,3,9,2,7,5,11 +F,6,9,5,4,3,10,6,3,5,10,5,7,3,9,6,9 +O,3,4,4,3,2,8,7,7,5,7,6,8,2,8,3,8 +C,7,10,5,5,2,6,8,6,8,11,7,11,2,8,5,9 +T,6,11,6,8,5,6,11,5,6,11,9,4,3,12,2,4 +J,2,2,3,3,1,10,6,3,6,12,4,9,0,7,1,7 +J,1,3,2,2,1,8,8,2,5,14,5,8,0,7,0,7 +H,4,5,5,4,4,7,7,6,6,7,6,8,3,8,3,8 +S,3,2,3,3,2,8,8,7,5,7,5,7,2,8,9,8 +O,6,11,7,8,5,7,6,9,6,7,5,9,4,8,5,5 +J,3,6,4,4,2,6,6,4,4,14,8,12,1,6,1,6 +C,6,11,7,8,3,7,8,7,11,4,7,14,1,7,4,8 +M,7,11,11,8,9,3,8,4,5,10,11,10,10,9,5,7 +W,12,14,12,8,5,9,10,4,3,5,10,7,10,12,2,6 +H,6,9,8,7,6,8,6,6,7,7,7,9,6,8,4,8 +G,3,6,4,4,2,6,6,5,5,6,6,9,2,8,4,8 +L,2,3,3,4,1,0,1,5,6,0,0,6,0,8,0,8 +L,1,3,3,1,1,6,4,1,7,8,3,10,0,7,2,9 +X,8,12,8,6,4,3,10,4,7,12,11,9,3,7,3,4 +B,5,9,7,7,10,9,8,4,4,6,8,6,6,11,8,7 +M,6,9,9,7,6,5,6,3,5,10,9,9,8,5,2,7 +G,4,7,6,5,3,6,6,6,8,6,5,9,3,10,4,8 +O,4,7,5,5,3,7,7,8,6,7,6,8,3,8,3,8 +P,3,6,4,4,2,4,14,8,1,11,6,3,0,10,4,8 +G,4,9,5,6,6,8,5,4,3,7,5,11,6,8,5,11 +E,3,4,3,6,2,3,8,6,10,7,6,15,0,8,7,8 +X,5,11,8,8,4,8,8,1,8,10,5,7,3,8,4,8 +E,3,7,4,5,4,7,7,5,8,8,8,9,3,9,6,9 +X,4,6,7,4,3,9,7,2,8,11,3,7,3,8,4,9 +G,4,5,5,8,3,7,6,8,8,6,6,10,1,8,6,11 +V,7,9,6,5,2,8,10,4,5,8,10,5,4,12,3,8 +X,4,10,5,7,5,8,7,3,8,5,6,6,3,8,6,8 +W,5,9,6,7,8,7,9,5,3,7,9,8,6,8,3,8 +G,1,3,2,1,1,7,7,5,6,7,5,10,1,9,3,9 +R,8,10,8,6,6,7,7,3,5,8,4,8,6,6,7,7 +S,3,9,4,7,2,7,5,6,10,5,6,10,0,9,9,8 +Y,7,11,9,8,8,9,5,6,4,7,8,8,3,9,8,3 +L,3,6,3,4,1,1,0,6,6,0,1,5,0,8,0,8 +Y,2,4,4,3,2,6,10,1,7,8,11,8,1,11,2,7 +J,4,5,6,6,5,8,10,4,4,7,7,9,3,7,7,5 +S,4,9,5,6,4,7,8,7,7,8,4,7,2,7,9,8 +Q,6,9,7,11,7,8,5,7,5,9,6,9,3,8,6,8 +Q,3,5,5,4,4,9,3,4,3,8,4,9,3,6,4,8 +D,2,6,3,4,2,6,7,10,8,6,6,6,3,8,3,8 +C,6,10,4,5,2,6,9,6,6,11,7,7,2,9,5,9 +L,5,10,6,8,5,9,3,2,6,9,2,9,2,5,3,9 +N,3,3,3,5,2,7,7,13,2,5,6,8,5,8,0,8 +C,2,3,3,1,1,5,9,4,6,11,9,11,1,9,2,8 +E,6,9,4,4,2,7,7,4,7,10,6,10,1,9,7,9 +X,4,9,5,6,5,7,6,3,5,6,6,9,2,8,8,8 +H,3,3,4,1,2,8,7,5,6,7,6,8,5,8,3,7 +L,2,3,2,4,1,0,1,5,6,0,0,6,0,8,0,8 +H,3,5,5,4,3,7,8,3,6,10,6,8,3,8,3,8 +E,2,3,3,2,2,7,7,5,7,7,6,8,2,8,5,10 +Y,5,10,6,7,6,9,6,6,4,7,8,7,6,9,8,3 +H,8,12,8,6,4,9,8,4,5,8,4,5,6,9,5,9 +Q,5,10,5,5,4,9,6,5,6,10,6,7,4,8,9,9 +Q,3,8,5,7,3,8,7,9,6,6,6,9,3,8,5,9 +Q,4,6,6,4,5,8,5,6,4,6,7,10,4,7,5,9 +J,2,8,3,6,1,13,3,8,4,13,3,11,1,6,0,8 +J,4,7,5,5,2,8,9,1,7,14,5,6,0,8,1,8 +D,4,5,5,4,3,7,7,7,7,7,6,5,2,8,3,7 +R,2,6,4,4,3,6,7,5,5,6,5,7,3,7,5,8 +M,4,5,7,4,4,6,6,3,4,9,9,10,7,5,2,8 +A,3,7,5,5,3,12,2,3,2,10,2,9,2,6,3,8 +N,3,5,4,4,2,7,8,5,4,7,7,7,6,9,2,5 +M,6,10,9,7,8,3,7,4,5,10,11,10,7,9,3,7 +P,8,14,7,8,4,5,10,6,3,12,5,4,4,10,4,8 +C,6,12,5,7,4,8,5,4,3,9,9,11,4,9,8,10 +P,6,10,8,8,7,8,5,7,5,7,6,6,3,9,8,9 +N,2,3,3,1,1,5,9,3,3,10,8,8,4,8,0,8 +W,3,4,4,3,2,9,10,3,2,5,9,7,6,11,0,8 +V,3,8,5,6,6,8,7,4,1,8,7,8,5,10,4,7 +V,6,9,9,8,10,8,7,5,5,7,6,8,8,9,9,3 +M,6,7,9,5,7,4,7,3,5,10,10,11,8,6,3,7 +E,4,8,5,6,4,7,7,4,8,11,8,9,2,9,5,7 +N,6,11,8,8,9,5,8,3,4,8,8,9,7,9,5,4 +Y,8,10,8,7,4,3,10,3,7,11,12,6,1,11,3,5 +W,4,8,5,6,3,6,8,4,1,7,8,8,8,9,0,8 +O,6,7,8,6,6,6,6,5,6,8,5,8,3,6,5,6 +N,4,4,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +H,4,8,5,6,5,7,10,8,5,8,5,6,3,6,7,11 +O,4,7,5,5,3,8,7,8,5,10,6,8,3,8,3,8 +N,4,8,5,6,4,7,7,9,4,6,4,6,3,7,3,8 +H,4,9,5,6,2,7,6,15,1,7,7,8,3,8,0,8 +U,7,11,8,9,4,3,9,6,7,11,11,10,3,9,2,6 +Y,2,7,3,5,1,6,10,0,3,7,11,8,1,11,0,8 +S,6,8,7,6,4,6,9,4,8,11,7,6,2,8,5,5 +S,5,9,6,7,5,7,7,7,5,7,6,7,2,8,9,8 +T,2,3,2,2,1,7,11,2,6,7,10,8,1,11,1,7 +C,2,3,3,2,1,4,7,4,6,10,9,13,1,9,2,7 +V,4,10,7,7,2,9,8,5,3,5,14,8,3,9,0,8 +T,5,8,5,6,3,6,12,4,7,12,9,4,2,12,2,4 +K,7,12,6,6,3,7,8,2,7,9,7,8,5,8,3,7 +D,3,8,4,6,4,7,8,7,6,7,7,5,3,8,3,7 +W,2,1,3,1,1,7,8,4,0,7,8,8,6,10,0,8 +I,2,9,3,7,2,8,7,0,7,13,6,9,0,8,1,8 +E,3,8,3,6,2,3,7,6,10,7,6,14,0,8,7,8 +F,6,9,8,7,4,6,12,6,6,13,7,3,2,9,2,5 +I,3,9,4,7,3,7,7,0,7,13,6,8,0,8,1,8 +H,5,10,7,8,8,7,7,6,6,7,6,9,3,8,4,8 +U,4,7,4,5,2,7,5,13,5,7,14,7,3,9,0,8 +C,2,3,3,2,1,6,8,7,7,9,7,12,1,10,3,9 +F,5,9,6,7,7,7,6,6,4,7,7,8,5,10,9,12 +A,3,8,5,6,3,9,2,2,3,8,2,8,2,6,3,7 +Z,3,7,5,5,3,7,8,2,9,11,7,7,1,8,6,7 +X,3,7,5,5,2,10,5,2,8,10,1,7,3,7,3,10 +N,3,3,5,2,2,5,10,3,4,10,8,7,5,8,1,8 +R,6,9,5,4,3,10,6,5,5,10,2,8,6,6,4,9 +B,3,3,3,4,3,7,7,5,5,7,6,6,5,8,5,10 +B,5,9,7,7,7,8,8,3,6,10,5,6,3,7,6,8 +U,5,6,5,4,2,5,8,6,8,9,8,8,3,9,2,5 +J,4,4,6,5,4,8,9,4,5,7,6,9,3,7,8,8 +F,3,7,4,5,2,1,11,4,4,11,11,8,0,8,2,7 +M,6,8,9,6,6,11,6,2,5,9,3,6,9,7,2,9 +H,1,1,2,1,1,7,7,12,1,7,6,8,3,8,0,8 +A,2,1,4,2,1,8,1,2,2,7,2,8,2,5,2,7 +O,5,10,4,5,3,6,6,6,2,9,6,9,5,9,4,8 +E,1,0,1,1,1,4,7,5,8,7,6,13,0,8,6,10 +U,3,3,3,1,1,5,8,5,7,10,9,8,3,10,2,6 +A,3,7,5,5,3,10,4,1,2,8,3,9,2,4,2,7 +X,4,8,5,6,3,5,8,1,8,10,9,9,2,9,3,6 +S,5,8,7,6,4,8,8,4,9,11,3,8,2,6,4,9 +J,1,3,2,2,1,10,7,1,5,11,4,8,0,7,0,7 +K,5,11,8,8,5,6,7,2,7,10,7,10,4,8,4,8 +I,2,6,2,4,1,9,5,0,6,13,5,9,0,8,1,8 +P,7,11,10,8,6,6,11,3,6,13,6,3,0,10,3,8 +T,2,1,2,1,0,8,15,1,4,6,10,8,0,8,0,8 +C,1,1,2,2,1,6,8,6,6,9,7,12,1,9,3,10 +H,4,9,4,7,4,7,8,13,1,7,5,8,3,8,0,8 +A,2,4,4,3,2,10,2,2,2,9,2,9,2,7,3,9 +L,6,11,9,8,11,7,7,3,6,6,7,11,6,11,9,7 +T,3,6,4,4,3,7,12,4,6,7,11,8,2,12,1,7 +A,2,8,4,6,2,12,2,4,3,11,2,10,3,6,3,9 +V,3,9,5,7,3,8,9,4,1,6,12,8,2,10,0,8 +U,5,7,6,5,5,8,8,8,5,6,7,9,4,8,4,5 +I,2,9,2,6,3,7,7,0,7,7,6,8,0,8,2,8 +Z,8,14,8,8,5,8,5,2,9,12,6,9,3,7,6,7 +V,4,7,6,5,6,8,8,4,2,8,7,8,7,11,5,8 +M,5,9,7,6,7,9,7,5,5,6,7,6,10,7,4,6 +L,4,8,6,6,4,6,5,2,8,7,2,8,1,6,3,7 +O,3,3,5,5,2,9,6,9,7,7,5,10,3,8,4,8 +B,4,2,5,4,4,7,7,5,6,7,6,6,2,8,7,10 +A,8,15,7,8,4,8,2,3,2,8,5,12,5,4,5,5 +K,6,9,9,6,7,9,6,1,7,10,3,8,3,7,3,9 +H,3,7,4,5,4,7,7,5,6,7,6,8,3,8,3,8 +T,7,9,7,7,5,6,10,1,8,11,9,5,2,9,3,4 +W,6,5,7,4,4,4,11,2,2,9,9,8,7,11,1,7 +F,3,8,3,5,1,1,12,4,5,12,11,8,0,8,2,6 +A,3,3,5,4,1,7,6,3,0,7,0,8,2,7,1,8 +E,3,8,3,6,3,3,6,5,9,5,4,13,0,8,6,9 +M,4,9,5,7,4,7,7,12,1,7,9,8,8,6,0,8 +B,4,9,5,7,6,7,8,9,6,7,6,6,2,8,8,10 +M,3,7,5,5,6,7,8,6,4,6,6,8,5,8,7,9 +Y,6,9,6,7,4,5,8,0,8,8,9,5,2,11,4,4 +V,4,9,6,7,3,6,12,3,4,7,12,9,3,10,1,8 +S,2,8,3,6,3,8,8,7,6,7,4,6,2,7,8,8 +C,2,1,2,2,1,6,8,7,7,8,7,12,1,9,4,10 +H,4,9,6,6,8,7,7,6,3,7,6,7,8,7,9,9 +U,5,8,5,6,4,8,6,11,4,8,13,7,3,9,0,8 +P,6,10,6,6,4,7,10,5,2,11,5,4,4,11,5,7 +Z,3,8,4,6,2,7,7,4,13,10,6,8,0,8,8,8 +E,3,4,5,2,2,7,7,2,8,11,7,9,2,8,4,8 +N,5,9,7,6,4,4,10,3,4,9,10,9,5,8,1,8 +P,6,10,5,6,3,5,9,6,3,10,5,6,5,9,4,7 +H,4,5,5,4,4,7,7,6,6,7,6,7,3,8,3,6 +T,6,11,6,8,5,6,11,3,7,11,9,5,2,12,2,4 +B,5,5,5,8,4,7,9,10,8,7,5,7,2,8,9,10 +U,5,10,6,7,2,7,4,14,6,7,15,8,3,9,0,8 +S,3,4,4,6,2,8,8,6,9,5,5,5,0,8,9,7 +F,5,6,5,8,2,1,14,5,3,12,9,5,0,8,3,6 +J,3,9,4,7,4,9,6,1,6,11,4,7,0,6,1,6 +R,3,6,4,4,4,6,7,5,5,7,6,7,3,7,4,9 +E,3,2,3,4,3,7,8,5,7,7,5,9,2,8,5,10 +P,6,9,6,4,4,8,9,5,3,10,5,5,5,10,5,6 +I,2,2,1,4,1,7,7,1,7,7,6,8,0,8,3,8 +K,7,10,9,8,9,7,7,5,5,7,6,7,7,6,9,13 +D,4,10,6,7,4,8,6,8,7,4,5,3,3,8,4,8 +B,4,7,6,5,7,9,6,4,4,6,6,7,7,8,6,7 +H,5,10,7,8,6,7,9,8,5,8,5,6,3,7,7,10 +M,7,10,10,7,7,9,6,2,5,9,5,7,8,6,2,8 +P,6,11,7,8,3,4,13,9,2,10,6,4,1,10,4,8 +O,4,8,6,6,4,8,5,8,4,7,5,8,3,8,3,8 +S,2,8,3,6,3,8,7,7,5,7,6,7,2,9,8,8 +K,4,7,6,5,4,3,8,3,7,11,11,12,3,8,3,5 +V,7,10,7,8,3,3,11,4,4,10,12,8,3,10,1,8 +F,7,11,10,8,5,6,11,2,7,14,7,4,1,10,2,7 +Y,3,4,5,6,1,6,10,3,2,9,13,8,1,11,0,8 +D,4,6,6,4,3,11,6,3,8,11,3,6,3,8,3,9 +Z,1,0,1,1,0,7,7,2,10,8,6,8,0,8,6,8 +Q,3,5,3,6,3,7,8,6,3,8,8,9,3,8,5,7 +S,8,14,8,8,4,9,4,4,4,13,5,8,3,10,3,8 +B,5,7,7,5,6,8,6,5,6,9,6,7,3,9,6,10 +K,8,13,9,7,5,6,7,3,6,10,8,10,6,10,4,7 +V,3,10,5,7,2,5,8,5,3,9,14,8,3,10,0,8 +B,4,7,4,5,3,6,7,9,7,7,6,7,2,8,9,10 +Y,2,2,4,4,2,6,10,1,7,7,11,9,1,11,1,8 +O,3,4,4,3,2,7,7,7,5,7,6,8,2,8,3,8 +Z,6,10,8,7,5,8,6,3,10,12,4,9,1,7,6,9 +L,2,3,3,2,1,6,4,1,8,7,2,10,0,7,2,8 +J,1,3,2,2,1,10,6,2,6,12,4,9,0,7,1,7 +Z,1,3,3,2,1,7,8,1,9,11,7,7,1,8,5,7 +A,3,5,5,7,2,7,7,3,1,6,0,8,3,7,1,8 +L,3,5,4,5,3,8,7,4,5,7,6,8,3,8,7,10 +J,2,5,3,3,1,10,7,1,7,12,3,7,0,7,1,7 +Q,5,6,6,8,5,8,7,6,3,7,7,12,3,8,6,8 +N,1,3,2,1,1,7,8,5,3,7,7,7,4,8,1,6 +Z,2,6,3,4,1,7,7,3,13,9,6,8,0,8,8,8 +E,4,9,5,7,3,3,7,6,11,7,6,15,0,8,7,7 +J,4,7,3,10,3,9,7,3,3,11,4,5,3,8,6,9 +D,4,8,5,6,3,5,7,10,10,6,5,6,3,8,4,8 +O,5,10,6,8,5,7,8,9,6,8,8,6,4,8,5,10 +L,3,6,4,4,2,5,4,3,8,3,2,6,1,6,2,5 +V,4,5,5,4,2,4,12,4,4,11,11,6,2,10,1,8 +X,6,10,9,8,6,7,7,0,8,9,6,8,3,8,4,7 +J,5,8,6,6,3,6,6,4,5,14,8,12,1,6,1,7 +N,7,10,10,8,5,7,8,3,5,10,6,7,7,8,1,8 +H,3,5,5,7,4,10,11,3,2,7,8,8,3,10,7,9 +A,2,7,4,5,3,13,3,3,2,10,1,8,2,6,2,8 +P,4,6,5,9,9,8,7,5,0,7,6,7,6,10,6,9 +A,4,9,6,6,2,10,5,3,1,8,1,9,2,7,2,8 +F,4,8,5,6,3,5,10,4,6,11,10,5,2,10,3,5 +X,3,4,6,3,2,7,7,1,9,10,6,8,2,8,3,7 +D,5,11,6,9,4,5,8,11,9,8,7,5,3,8,4,8 +V,3,7,5,5,3,9,11,2,2,4,10,8,2,12,1,8 +P,7,10,6,5,4,10,7,4,4,12,4,5,4,11,5,9 +F,5,9,6,7,6,6,9,4,6,9,9,6,5,9,3,6 +P,6,11,9,8,5,8,10,7,5,10,4,3,3,10,4,8 +Y,4,10,6,8,2,9,11,0,4,6,11,8,0,10,0,8 +W,3,3,4,4,2,5,8,4,1,7,9,8,7,10,0,8 +P,6,9,8,7,5,6,11,7,3,11,5,3,2,10,4,8 +J,5,6,7,7,6,7,8,4,5,7,7,8,4,6,8,6 +E,4,2,4,4,3,8,7,6,10,6,5,9,2,8,6,8 +S,4,8,5,6,3,7,5,6,9,5,6,10,0,9,9,8 +E,3,7,3,5,2,3,8,6,11,7,5,14,0,8,7,8 +B,5,9,7,7,6,7,9,5,6,10,6,6,3,8,7,8 +I,1,9,1,7,1,7,7,0,9,7,6,8,0,8,3,8 +S,6,8,7,6,4,9,6,4,6,10,3,8,2,8,5,10 +S,3,8,4,6,3,8,6,8,6,7,8,9,2,10,9,8 +C,3,7,4,5,2,5,8,6,7,6,8,13,1,8,4,10 +M,8,10,11,8,9,9,6,2,5,9,4,7,11,9,3,8 +P,9,10,7,5,3,6,11,6,2,11,5,5,4,10,4,8 +R,2,4,4,3,3,7,8,4,4,9,5,8,2,6,3,10 +U,3,8,5,6,6,8,7,4,4,6,7,8,7,9,5,6 +U,6,6,6,4,3,4,8,5,8,11,11,9,3,9,2,6 +D,3,8,4,6,2,5,7,10,8,7,7,5,3,8,4,8 +U,2,1,3,1,1,7,5,11,5,7,14,8,3,10,0,8 +J,2,5,3,4,2,10,7,2,6,11,3,7,1,6,2,7 +Z,7,13,7,7,5,6,7,2,9,11,6,8,4,5,8,6 +F,5,11,7,8,6,7,9,3,6,12,7,6,3,9,2,7 +V,1,0,2,1,0,8,9,4,2,7,12,8,2,10,0,8 +M,6,5,8,4,7,6,9,5,3,6,4,8,13,8,5,7 +U,3,6,4,4,1,7,5,13,5,7,13,8,3,9,0,8 +B,3,7,4,5,5,7,7,4,6,6,6,6,2,8,5,10 +L,4,8,6,6,4,6,5,1,9,7,2,10,0,6,3,8 +T,4,10,5,8,3,8,13,0,5,7,10,8,0,8,0,8 +D,8,12,8,6,4,9,4,4,6,12,3,8,5,6,5,10 +T,6,11,6,8,4,6,10,1,10,11,9,5,2,8,4,4 +O,5,8,7,6,4,7,5,8,4,6,4,7,3,9,4,9 +T,1,0,2,1,0,7,14,1,4,7,10,8,0,8,0,8 +U,4,3,5,2,2,5,8,5,7,10,10,9,3,9,2,6 +D,2,4,4,2,2,9,6,4,6,11,4,6,2,8,3,8 +R,4,8,5,5,3,5,11,8,3,7,4,8,3,7,6,11 +G,7,10,7,7,5,5,7,7,6,9,8,10,2,9,5,9 +D,2,1,2,2,1,6,7,8,7,6,6,6,2,8,3,8 +S,3,8,4,6,4,7,7,7,5,7,6,8,2,8,8,8 +S,7,10,9,8,10,9,5,5,4,9,6,9,6,9,12,11 +M,6,10,9,8,8,7,7,2,4,9,7,8,8,6,2,8 +M,4,8,6,6,8,9,6,2,2,8,4,8,7,7,2,5 +D,6,7,8,6,6,5,7,6,7,7,4,7,3,6,5,6 +Z,4,9,6,7,4,8,6,2,9,12,5,9,3,6,8,8 +W,4,9,7,7,5,9,8,4,1,6,9,8,7,11,0,8 +C,2,1,3,2,1,6,8,6,7,7,8,12,1,9,4,10 +K,3,6,4,4,4,6,7,3,7,6,6,9,3,8,6,10 +J,6,9,9,7,5,8,5,7,7,8,6,7,2,6,4,6 +A,6,9,8,8,8,8,7,3,5,7,8,8,6,8,4,5 +D,5,12,5,6,4,8,7,3,6,10,5,7,5,8,7,6 +C,4,8,6,6,4,8,8,8,6,7,6,8,4,7,4,8 +V,3,4,4,3,1,4,12,3,3,10,11,7,2,11,1,8 +S,4,7,4,5,2,9,10,6,9,5,6,6,0,7,8,9 +F,4,9,6,6,4,9,8,1,6,13,5,5,1,10,2,9 +A,5,10,7,8,5,8,3,3,1,7,1,8,5,9,5,8 +B,3,2,4,3,3,8,7,5,6,7,6,6,2,8,6,9 +N,2,3,3,2,2,7,9,5,4,7,6,7,5,9,2,7 +U,6,10,5,6,3,6,6,4,4,6,7,8,5,5,2,8 +S,4,10,5,8,5,7,7,5,8,5,6,8,0,8,9,8 +Q,2,5,3,6,3,8,8,7,2,5,7,10,3,9,5,9 +F,4,8,4,5,1,1,13,5,5,12,11,7,0,8,2,6 +F,4,9,6,6,5,5,10,4,6,10,10,6,2,10,3,6 +X,5,10,8,8,4,8,7,4,10,6,6,8,4,6,8,9 +A,3,7,5,5,3,11,3,2,2,8,2,9,3,4,2,8 +B,4,9,4,6,3,6,7,9,7,7,6,7,2,8,9,10 +O,5,9,6,7,5,7,7,8,7,7,6,7,2,8,3,8 +J,2,6,3,4,1,14,1,6,5,14,2,11,0,7,0,8 +H,4,8,5,5,2,7,5,15,1,7,9,8,3,8,0,8 +M,6,9,7,4,3,6,9,5,5,4,4,10,8,7,2,8 +I,3,7,4,5,2,7,7,0,7,13,6,8,0,8,1,7 +W,6,10,6,8,6,2,10,2,3,10,9,8,7,11,2,6 +N,3,6,4,4,3,6,7,8,5,7,5,7,3,7,3,8 +A,1,3,2,2,1,10,3,2,1,9,2,9,1,6,1,8 +S,2,3,4,1,1,7,8,2,6,10,5,7,1,8,4,8 +P,1,0,1,0,0,5,10,6,1,9,6,5,0,9,2,8 +D,6,9,8,8,8,7,6,5,7,7,5,9,6,5,9,4 +M,7,9,10,7,6,5,6,4,5,11,10,11,11,5,4,8 +T,4,8,5,6,5,8,11,3,6,6,11,8,3,12,1,7 +L,3,6,4,4,2,5,5,1,9,6,2,11,0,8,3,7 +X,3,6,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +G,2,4,3,6,2,7,7,8,6,5,7,9,2,7,5,11 +D,6,10,8,8,5,10,5,4,8,11,3,7,4,6,4,9 +E,3,4,4,6,2,3,8,6,10,7,6,14,0,8,7,7 +N,2,3,2,1,1,6,9,6,3,8,7,8,4,9,1,7 +G,2,4,3,3,2,6,6,6,5,6,6,9,2,8,4,8 +V,7,10,6,8,3,2,11,5,5,12,12,8,2,10,1,8 +A,2,7,4,4,2,7,3,3,2,7,2,8,3,7,2,8 +E,5,9,4,4,2,8,7,4,4,10,5,10,3,8,7,10 +K,4,5,5,8,2,3,6,7,3,7,8,12,3,8,3,10 +M,6,9,9,6,6,5,7,3,5,10,10,9,8,6,3,8 +L,5,11,5,6,3,7,5,3,5,12,7,11,3,8,6,9 +T,5,6,5,4,2,5,12,3,8,12,9,4,1,11,2,4 +G,2,4,4,3,2,7,6,6,6,6,6,10,2,9,4,9 +J,2,4,4,3,1,8,8,2,7,15,5,8,0,7,1,8 +F,5,10,5,7,2,1,14,5,4,12,10,6,0,8,2,5 +W,7,8,7,6,6,6,11,5,2,9,6,6,8,13,4,4 +A,3,6,5,4,3,12,3,2,2,9,2,9,2,6,2,8 +K,6,11,8,8,5,9,5,1,7,10,3,9,5,9,5,11 +P,1,1,2,2,1,5,10,4,4,10,8,4,1,9,3,7 +M,7,6,9,5,9,7,7,5,4,6,5,8,10,8,5,5 +O,2,6,3,4,2,8,7,7,5,7,6,9,2,8,3,8 +S,4,11,5,8,3,6,6,6,9,4,6,9,0,9,9,8 +C,4,6,6,5,5,4,7,3,6,6,6,10,4,10,7,7 +O,1,0,2,1,0,8,7,6,4,7,6,8,2,8,3,8 +Z,2,1,3,2,1,7,7,5,9,6,6,9,1,8,7,8 +X,4,9,6,7,6,9,7,3,6,7,4,5,6,6,9,8 +W,4,4,5,3,3,6,11,5,2,8,7,6,6,11,2,6 +B,4,9,4,6,5,6,6,8,6,6,6,7,2,8,7,9 +C,6,11,6,8,4,4,8,5,6,12,10,11,2,10,3,7 +F,2,4,3,3,2,5,10,3,5,10,9,5,1,10,3,6 +I,1,4,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +B,1,3,2,2,1,8,7,3,5,10,5,7,2,8,3,9 +P,3,4,5,2,2,8,9,3,5,13,4,3,1,10,3,8 +K,11,14,10,8,4,6,8,3,7,9,8,10,6,8,4,6 +U,4,5,5,4,2,5,8,5,8,10,8,8,3,9,3,5 +N,3,8,4,6,2,7,7,14,2,5,6,8,5,8,0,8 +Y,4,11,6,8,1,7,11,2,3,8,12,8,1,11,0,8 +I,3,5,5,6,4,8,8,4,4,7,6,8,3,7,8,8 +Q,8,15,7,8,4,8,5,4,9,11,4,10,3,6,9,9 +Q,4,5,4,7,4,9,7,6,2,8,6,11,3,9,6,8 +Z,1,0,1,0,0,8,7,2,9,8,6,8,0,8,5,8 +F,4,5,5,6,5,7,9,5,4,8,6,7,4,9,8,7 +M,8,10,11,8,8,9,6,2,5,9,6,7,8,6,2,8 +D,4,7,5,5,2,5,7,10,9,7,6,5,3,8,4,8 +N,2,3,3,1,1,8,9,3,4,10,4,6,4,9,1,7 +W,5,10,8,8,5,3,10,3,3,9,10,9,8,11,1,8 +U,4,9,4,6,4,7,5,13,5,7,10,8,3,9,0,8 +G,6,11,8,9,6,6,6,7,5,5,6,12,5,7,5,6 +G,7,11,9,8,11,8,5,4,3,6,5,10,8,7,9,13 +O,5,10,4,5,3,7,7,5,4,7,4,7,5,8,5,8 +U,2,6,3,4,1,8,6,13,5,7,13,8,3,9,0,8 +K,6,10,8,8,8,6,7,5,3,7,5,8,5,7,10,8 +W,4,8,6,6,3,4,8,5,1,7,9,8,8,10,0,8 +K,5,7,7,5,5,5,7,2,6,10,8,11,3,8,3,8 +E,5,11,4,6,2,9,6,4,6,10,5,9,1,10,7,9 +V,3,6,5,4,1,9,8,4,2,5,14,8,3,10,0,8 +R,8,12,8,7,6,9,6,3,5,9,4,8,6,8,6,8 +Z,4,11,5,8,5,9,6,6,10,7,5,6,2,7,8,8 +S,4,10,6,7,4,7,8,3,7,10,5,7,2,6,5,8 +N,3,6,5,4,5,7,8,3,3,8,7,8,5,9,5,4 +X,5,11,8,8,4,5,8,2,8,10,11,9,3,9,4,6 +I,3,6,4,4,2,5,7,3,7,7,6,12,0,8,4,9 +Q,1,2,2,3,1,8,7,4,1,7,8,10,2,9,3,9 +N,10,15,9,8,4,7,9,4,5,3,5,10,6,10,2,7 +C,5,7,5,5,3,6,7,6,8,12,8,12,2,10,4,7 +Q,6,9,5,4,3,10,4,4,7,11,3,10,3,7,7,11 +N,7,10,9,8,7,7,7,8,6,7,5,6,4,8,4,8 +K,6,9,8,8,8,7,7,2,4,7,3,9,7,4,9,10 +S,8,12,8,7,4,5,10,4,5,14,8,6,2,9,3,7 +E,2,3,3,2,1,6,8,2,8,11,8,8,1,8,4,7 +D,4,8,6,6,8,9,7,5,6,7,5,6,5,6,8,7 +X,4,4,5,5,1,7,7,4,4,7,6,8,3,8,4,8 +C,1,0,2,1,0,7,7,6,7,7,6,13,0,8,4,10 +J,5,9,7,7,3,9,5,4,6,15,4,10,1,6,0,7 +B,5,7,7,5,5,7,6,6,7,8,7,6,3,9,8,7 +D,5,9,5,7,5,5,7,9,7,6,5,5,2,8,3,8 +R,7,10,7,5,5,7,6,3,5,8,4,9,6,8,6,7 +Z,2,1,2,1,1,7,7,3,11,8,6,8,0,8,6,8 +T,2,3,4,4,1,8,14,1,6,6,11,8,0,8,0,8 +K,5,9,5,7,2,4,7,9,2,7,6,12,3,8,3,11 +G,5,11,7,8,5,7,6,7,8,7,4,12,2,9,6,8 +B,11,15,10,8,9,9,8,3,6,10,4,6,8,3,9,7 +X,8,11,11,9,7,6,8,1,8,10,8,9,3,8,4,6 +D,6,9,8,7,6,10,6,3,7,11,4,7,4,7,4,9 +V,2,5,4,4,1,6,11,3,4,8,11,8,2,10,1,8 +I,2,11,0,8,1,7,7,5,3,7,6,8,0,8,0,8 +Z,2,5,4,4,2,7,8,2,10,11,6,8,1,8,6,7 +G,2,3,3,2,1,7,6,5,4,6,6,9,2,9,4,9 +J,3,5,4,8,1,13,2,9,5,14,3,12,0,6,0,8 +V,2,5,4,4,2,7,12,2,3,7,11,8,2,10,1,8 +V,8,15,8,8,5,5,8,5,4,8,7,6,6,12,3,8 +J,6,12,5,9,4,10,7,2,4,12,4,6,2,9,7,9 +C,3,6,4,4,1,6,7,6,10,7,6,13,1,8,4,9 +U,2,3,3,1,1,4,8,5,6,11,10,8,3,10,1,6 +A,2,6,4,4,2,12,2,4,3,12,2,10,2,6,3,9 +Y,3,10,5,7,1,10,10,3,2,5,13,8,2,11,0,8 +T,3,7,5,5,3,7,11,1,8,7,11,8,1,10,1,8 +M,5,8,7,6,6,8,7,2,4,9,5,7,7,6,2,8 +V,5,8,5,6,3,4,11,2,3,8,10,7,3,12,1,7 +S,4,8,5,6,3,6,8,4,6,10,9,8,2,9,5,4 +M,5,6,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +Y,3,8,6,5,1,10,10,3,2,5,13,8,2,11,0,8 +Z,9,9,6,12,6,6,9,4,2,12,7,7,3,8,13,6 +M,3,8,4,6,3,8,6,12,1,5,9,8,7,6,0,8 +M,3,7,4,5,4,7,5,10,0,7,8,8,6,5,0,8 +J,3,8,3,6,2,13,3,5,4,13,2,10,0,7,0,8 +K,7,13,7,7,4,8,7,2,6,10,7,9,6,11,4,8 +B,3,3,4,4,3,7,7,6,5,7,6,6,2,8,6,10 +K,4,10,6,8,7,7,7,5,4,7,5,7,4,6,9,14 +Z,5,8,7,6,4,5,10,3,10,11,9,6,1,9,6,5 +F,4,8,4,6,3,1,13,4,4,12,10,6,0,8,1,6 +N,1,1,2,1,1,7,8,5,3,7,7,7,4,8,1,6 +P,7,10,10,8,5,7,14,5,3,13,4,0,0,10,4,7 +C,4,3,5,5,2,6,7,6,10,7,6,13,1,8,4,9 +Z,4,8,6,6,3,9,5,3,10,11,4,9,1,7,6,9 +S,2,3,4,2,1,8,7,2,6,10,6,8,1,9,5,8 +W,4,6,7,4,4,9,11,2,3,5,9,8,7,11,1,8 +P,2,3,4,2,2,7,9,4,4,11,4,4,1,9,3,8 +L,4,8,4,6,1,0,0,6,6,0,1,4,0,8,0,8 +U,3,4,4,6,2,8,5,14,5,7,13,8,3,9,0,8 +J,3,10,4,7,1,13,2,9,4,14,4,12,1,6,0,8 +J,2,4,3,6,1,12,2,9,4,13,6,13,1,6,0,8 +Z,3,5,3,3,2,8,7,5,10,6,6,7,2,8,7,8 +M,4,2,5,4,4,8,6,6,4,7,7,8,8,6,3,6 +U,7,13,6,7,4,8,4,5,5,7,9,8,4,8,3,8 +J,1,3,2,2,1,9,7,2,6,14,5,8,0,7,0,8 +B,5,9,5,7,7,6,7,8,5,7,6,7,2,8,7,9 +B,7,11,9,8,7,10,6,4,7,10,3,7,2,8,6,12 +Q,8,14,8,8,4,9,4,4,7,11,4,10,3,7,8,11 +N,3,4,5,3,2,7,9,2,5,10,6,6,5,9,1,7 +D,3,7,4,5,3,9,7,5,7,10,4,5,3,8,3,8 +B,1,0,1,0,0,7,7,6,4,7,6,7,1,8,5,9 +E,4,6,6,4,4,7,8,2,7,11,7,9,3,8,4,9 +E,3,3,5,2,2,6,8,3,8,11,8,9,2,9,4,7 +N,6,11,8,8,5,7,9,2,5,9,6,7,5,9,1,8 +T,2,4,4,6,1,7,14,0,6,8,11,8,0,8,0,8 +Y,3,3,5,4,1,9,9,3,1,5,13,8,2,10,0,8 +Q,7,9,7,10,8,8,8,6,2,7,7,11,4,10,8,6 +U,9,15,8,8,5,5,5,4,4,7,8,10,7,5,3,9 +H,3,3,4,4,2,7,10,14,2,7,3,8,3,8,0,8 +J,2,10,3,8,1,14,3,7,5,14,1,10,0,7,0,8 +D,1,4,3,3,2,10,6,3,5,10,3,6,2,8,2,9 +G,2,4,2,2,1,6,7,5,5,9,7,10,2,8,4,9 +V,5,9,7,8,9,7,7,5,4,7,6,8,7,9,7,8 +U,2,2,3,3,2,7,9,5,7,7,9,9,3,9,1,8 +U,7,11,9,8,7,5,9,5,7,6,9,10,3,9,1,8 +Z,3,3,4,4,2,7,7,3,14,9,6,8,0,8,8,8 +G,2,3,3,1,1,7,7,5,5,9,6,10,2,9,4,10 +L,4,11,5,8,4,7,4,1,7,8,2,10,1,6,3,8 +D,4,6,5,4,4,9,7,3,6,10,4,6,3,8,2,8 +J,3,10,5,7,5,9,8,3,3,8,4,6,4,8,6,5 +K,3,6,5,4,5,7,6,3,4,6,6,8,7,7,6,9 +A,3,9,5,7,3,12,3,4,3,11,1,9,2,6,3,9 +L,3,4,4,7,1,0,1,6,6,0,0,6,0,8,0,8 +X,4,9,6,7,5,8,5,3,5,6,7,8,3,9,9,9 +Q,5,9,5,5,3,11,5,3,6,9,4,7,3,9,6,11 +F,3,8,3,6,2,2,12,4,3,12,10,6,0,8,2,7 +W,2,3,4,2,2,7,10,2,2,6,9,8,5,11,0,7 +K,6,9,9,6,6,5,7,1,7,10,8,10,3,8,4,7 +P,4,9,4,6,4,4,12,7,1,10,6,4,1,10,3,8 +V,6,9,5,5,2,8,11,4,5,7,10,5,4,10,2,6 +L,7,15,6,8,3,10,2,3,5,13,4,12,2,8,5,10 +A,3,8,5,5,1,6,6,3,1,6,0,8,2,6,1,7 +B,3,3,3,4,3,6,7,9,6,7,6,7,2,8,8,10 +S,6,9,5,5,2,8,4,4,5,9,2,8,3,6,5,8 +I,6,11,4,6,2,10,6,5,5,12,3,6,3,8,5,10 +B,1,0,1,0,1,7,8,6,4,7,6,7,1,8,6,9 +F,4,8,6,6,5,4,10,1,2,10,8,7,5,10,2,4 +I,3,4,4,5,3,7,8,4,5,7,8,7,2,9,8,9 +M,5,8,7,6,7,7,6,5,5,7,7,10,11,6,2,8 +K,2,1,3,2,2,5,7,4,7,7,6,11,3,8,4,9 +C,2,3,2,2,1,6,8,6,7,8,7,12,1,9,3,10 +H,4,7,6,5,4,9,8,3,7,10,4,7,3,8,3,9 +S,3,2,4,4,3,8,7,7,5,7,6,7,2,8,9,8 +B,4,5,5,7,4,7,7,10,7,7,6,8,2,8,9,9 +O,2,3,2,1,1,8,7,6,4,9,6,8,2,8,3,8 +M,9,11,12,8,8,4,6,4,5,10,11,11,11,6,4,8 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +W,7,9,10,8,11,6,6,6,5,5,5,8,11,11,9,12 +U,4,6,4,4,1,8,5,12,5,7,15,8,3,9,0,8 +Y,4,5,5,4,2,4,11,2,7,11,10,6,1,11,2,5 +A,3,9,6,7,3,11,2,3,3,10,2,9,2,6,3,8 +P,2,3,4,2,2,7,10,3,4,12,4,3,1,10,2,8 +B,4,7,6,5,5,7,8,5,5,9,6,6,3,7,6,7 +O,4,7,5,5,3,8,6,8,5,10,6,9,3,8,3,8 +Y,5,7,5,5,2,3,10,3,7,11,12,7,2,11,3,5 +I,4,5,6,5,4,8,9,4,5,7,6,9,3,8,8,7 +R,3,9,4,6,3,5,10,9,3,7,4,8,3,7,6,11 +N,6,8,9,6,5,10,8,3,6,10,2,4,5,9,1,7 +B,3,7,3,5,4,6,7,7,5,7,6,7,2,8,7,10 +Q,9,15,8,8,4,9,3,4,7,11,4,10,3,8,8,11 +H,6,11,8,8,6,9,7,6,7,7,6,8,6,8,4,7 +J,2,4,3,3,1,11,6,2,7,11,3,7,0,7,1,8 +W,4,4,5,6,3,7,8,4,1,7,8,8,8,10,0,8 +Y,5,11,6,8,2,3,11,3,8,13,11,5,0,10,2,4 +F,4,9,5,7,3,4,11,3,7,11,10,6,1,10,3,5 +A,4,9,6,6,2,7,4,3,2,7,1,8,3,7,3,8 +X,1,0,2,0,0,7,7,4,4,7,6,8,2,8,3,8 +Z,5,10,7,8,5,7,8,2,9,12,7,8,1,9,6,7 +H,3,7,4,4,2,7,9,14,2,7,3,8,3,8,0,8 +K,6,11,9,8,8,7,6,1,6,10,5,9,7,7,6,9 +J,4,7,5,8,5,8,8,4,5,7,6,8,3,8,9,8 +N,2,4,4,3,2,6,9,2,4,10,7,7,5,8,1,8 +W,5,9,7,7,7,7,5,6,2,7,7,8,7,7,6,12 +U,4,6,5,4,2,6,8,7,9,9,10,8,3,9,1,8 +Y,2,6,4,4,1,9,10,3,2,5,13,8,2,11,0,8 +Q,4,7,4,9,4,7,7,6,3,8,9,10,3,8,6,8 +V,3,3,4,2,1,4,12,4,3,11,11,6,2,11,1,8 +D,6,13,6,7,5,11,5,4,6,10,4,7,5,9,6,10 +V,3,8,4,6,2,7,9,4,2,8,12,8,2,10,0,8 +R,4,8,5,6,3,5,12,8,4,8,3,9,3,7,6,11 +L,1,0,1,1,0,2,2,5,5,1,1,6,0,8,0,8 +V,4,10,7,8,3,8,12,3,4,5,11,8,3,10,1,8 +F,5,10,7,8,5,6,10,2,6,13,7,5,1,10,2,7 +B,5,8,7,7,8,7,8,5,5,8,6,8,7,8,9,6 +R,3,4,4,5,2,6,10,9,4,7,4,8,3,7,5,10 +J,3,6,4,4,3,9,6,6,5,8,6,7,2,8,4,6 +V,3,7,5,5,1,7,8,4,2,7,14,8,3,10,0,8 +Y,9,9,8,13,5,9,10,2,4,5,11,5,4,10,7,8 +M,8,9,11,7,8,10,6,2,5,9,4,7,8,7,2,8 +X,3,2,4,3,2,7,7,3,9,6,6,8,2,8,6,8 +S,3,9,4,7,2,7,7,6,8,5,6,7,0,8,9,7 +K,2,3,4,2,2,8,7,1,6,10,5,8,3,8,2,8 +T,3,7,5,5,3,6,11,1,7,8,11,9,1,11,1,8 +H,3,4,6,3,3,7,8,3,6,10,6,8,3,8,3,7 +L,4,9,4,7,2,0,2,4,6,1,0,8,0,8,0,8 +J,3,8,4,6,2,10,6,2,8,12,3,7,0,6,2,6 +D,2,1,2,1,1,5,7,8,7,6,6,6,2,8,3,8 +B,2,1,3,2,2,8,7,5,5,7,6,6,2,8,5,9 +N,6,9,9,7,5,10,8,3,6,10,2,4,5,9,1,7 +R,6,10,9,8,11,6,7,4,4,6,6,9,8,9,9,7 +M,13,15,13,8,7,3,8,6,6,4,2,13,9,11,2,8 +Z,3,6,4,4,2,7,7,4,14,9,6,8,0,8,8,8 +R,6,9,8,7,9,6,7,4,5,7,6,8,6,9,7,5 +K,5,11,6,8,2,3,7,8,2,7,6,11,4,8,2,11 +W,5,9,8,7,7,7,12,2,2,6,8,8,7,12,1,8 +P,3,6,4,4,2,7,10,4,4,12,5,3,1,10,3,8 +E,3,8,4,6,4,6,7,5,8,7,5,10,3,8,5,9 +E,7,12,5,6,4,8,7,4,4,11,5,9,3,9,8,11 +Y,3,3,4,4,1,10,13,3,3,3,11,9,0,10,0,8 +J,3,10,4,7,3,11,5,2,6,11,2,7,0,7,1,7 +L,3,7,4,5,2,4,5,2,10,3,1,8,0,7,2,5 +I,2,5,1,3,1,7,7,1,7,7,6,8,0,8,3,8 +I,1,4,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +M,6,10,7,6,4,13,2,4,3,12,1,9,5,5,1,9 +V,2,5,4,3,2,7,12,2,2,7,11,9,2,10,1,8 +P,7,10,9,8,6,7,10,4,4,12,5,3,1,10,3,8 +H,5,10,7,8,7,7,7,6,7,7,6,8,6,8,4,8 +R,9,13,7,8,5,8,6,5,5,9,5,9,6,6,7,11 +X,4,9,6,7,5,8,7,3,5,6,7,6,4,11,10,8 +P,2,5,3,7,6,8,7,4,1,7,6,7,5,8,4,8 +V,4,10,5,7,3,7,9,4,2,7,13,8,2,10,0,8 +N,3,6,3,4,3,8,7,11,1,6,6,8,5,9,0,6 +O,3,1,4,3,2,8,7,7,5,7,6,8,2,8,3,8 +G,6,11,7,8,5,5,7,6,6,9,8,10,2,8,5,9 +T,4,5,5,4,2,5,12,3,7,11,10,4,1,11,1,5 +R,8,12,7,6,6,6,7,3,5,7,5,9,6,9,6,6 +W,4,3,5,5,3,8,8,4,1,6,8,8,8,9,0,8 +U,6,9,6,5,3,7,5,5,5,7,8,8,5,7,2,8 +L,6,12,6,6,4,8,3,3,4,12,8,12,3,10,5,11 +S,7,12,7,6,3,10,4,5,4,13,5,8,2,9,2,7 +Q,4,9,5,11,7,9,8,8,2,5,7,10,3,8,6,10 +M,3,1,4,3,3,7,6,6,4,6,7,7,8,6,2,7 +F,2,2,3,3,2,5,10,4,5,10,9,5,1,10,3,6 +V,5,8,5,6,2,2,11,5,4,12,12,8,2,10,1,8 +V,5,7,5,5,2,3,11,4,3,10,12,8,2,10,1,8 +F,4,8,4,6,3,1,13,4,3,12,10,7,0,8,1,6 +M,4,11,6,8,6,6,6,6,5,7,7,10,8,5,2,9 +I,3,8,4,6,2,7,7,0,6,13,6,8,0,8,1,8 +P,3,7,3,4,2,4,12,8,2,10,6,4,1,10,4,8 +U,4,2,5,3,2,6,8,5,8,7,10,9,3,9,1,8 +B,3,4,3,3,3,7,7,5,5,7,6,6,2,8,6,9 +Q,4,10,6,9,6,8,7,8,5,6,4,8,3,8,4,7 +H,5,8,5,6,4,7,8,13,1,7,5,8,3,8,0,8 +X,3,8,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +M,4,7,6,5,6,9,7,5,5,6,7,5,8,6,2,6 +J,3,7,4,5,1,7,7,3,7,15,6,10,0,7,1,7 +V,6,12,5,7,3,7,10,6,4,9,9,5,5,12,3,8 +B,2,3,2,2,2,7,7,5,5,6,6,5,2,8,6,8 +T,5,8,5,6,3,4,13,4,6,12,10,4,1,11,1,5 +U,8,10,9,8,5,4,7,6,8,10,10,9,3,9,2,5 +D,4,7,6,5,4,7,8,5,6,10,6,4,3,8,4,8 +Y,4,9,6,7,2,7,12,1,3,7,11,8,0,10,0,8 +O,2,1,2,2,1,8,7,7,4,7,6,8,2,8,3,8 +O,2,0,2,1,1,7,6,7,5,7,6,8,2,8,3,8 +K,4,4,4,6,2,4,7,8,1,7,6,11,3,8,2,11 +W,8,11,8,6,5,9,8,4,5,6,9,6,11,8,3,6 +A,5,11,7,8,4,8,3,2,3,7,1,8,2,7,3,7 +O,8,12,6,6,4,5,9,6,4,9,8,9,5,10,5,8 +S,5,9,6,8,7,9,7,5,6,7,6,7,6,8,10,12 +T,5,7,5,5,3,6,11,3,7,11,9,5,2,12,3,4 +S,2,7,3,5,3,8,8,7,5,7,5,6,2,8,8,8 +X,3,4,5,3,2,7,7,1,8,10,6,8,2,8,3,7 +T,2,9,4,6,1,5,14,1,6,9,11,7,0,8,0,8 +U,5,9,6,7,5,6,6,8,5,7,6,10,5,8,7,3 +Y,5,6,5,4,3,5,9,1,7,9,10,6,2,11,3,5 +V,3,3,4,2,1,4,12,3,3,10,11,7,2,11,1,7 +D,2,4,4,3,2,9,7,4,6,10,4,6,2,8,3,8 +H,5,10,8,8,7,7,8,7,7,7,5,9,3,8,3,8 +B,4,8,6,6,8,9,7,4,4,6,7,7,7,10,7,6 +S,5,11,6,8,3,7,8,4,8,11,7,7,2,8,5,6 +O,2,2,3,3,2,8,7,7,4,7,6,8,2,8,3,8 +O,6,11,7,9,3,7,8,9,8,7,7,6,3,8,4,8 +J,2,6,2,4,1,12,2,9,3,13,5,13,1,6,0,8 +P,3,4,4,6,6,8,9,4,0,8,7,7,5,9,5,7 +O,3,7,5,5,5,8,6,5,1,7,6,8,7,8,3,8 +I,3,7,4,5,2,7,7,0,7,13,6,8,0,8,1,7 +Z,4,9,6,6,6,7,7,3,8,8,6,9,1,8,11,7 +W,3,6,5,4,7,9,7,4,2,7,6,8,8,11,1,6 +F,2,4,3,5,1,1,13,4,4,12,11,7,0,8,2,6 +H,5,7,8,5,6,8,7,3,6,10,6,8,3,8,3,8 +D,2,4,3,3,2,9,6,3,5,10,4,6,2,8,2,8 +B,2,1,2,2,1,7,7,8,5,6,6,7,2,8,7,10 +K,0,0,1,0,0,4,7,5,3,7,6,10,3,8,2,11 +T,4,10,6,8,3,5,11,1,9,9,12,8,0,10,1,7 +N,3,8,3,6,2,7,7,13,2,5,6,8,5,8,0,8 +F,2,6,2,4,1,1,11,3,6,11,11,9,0,8,1,6 +A,3,8,5,5,2,7,4,3,1,7,1,8,3,7,2,8 +V,8,11,7,8,5,4,11,1,3,8,10,8,5,12,1,7 +F,9,13,7,7,3,4,13,3,5,13,7,3,2,7,5,4 +Y,2,1,3,1,0,7,10,3,1,7,13,8,1,11,0,8 +R,4,7,6,5,4,9,8,3,6,10,3,6,3,6,4,10 +Q,5,9,5,11,7,8,7,6,2,8,7,10,3,8,5,8 +M,6,9,9,7,6,10,5,3,5,9,3,6,8,6,2,9 +P,3,5,3,3,2,4,10,3,5,10,8,4,0,10,3,7 +K,3,7,4,5,3,6,7,4,7,6,6,9,3,8,5,9 +Y,6,6,8,9,8,10,12,6,4,6,7,6,5,10,7,4 +D,4,6,6,6,5,6,7,4,7,6,4,7,3,7,5,6 +R,4,3,5,5,3,6,9,10,5,7,5,8,2,8,5,10 +B,4,7,6,5,5,10,7,3,6,10,4,6,2,8,4,10 +T,4,8,6,6,4,6,7,7,7,8,9,8,3,10,5,9 +W,6,10,8,8,4,7,7,4,2,7,8,8,9,9,0,8 +K,5,9,7,7,8,7,9,5,5,8,5,7,7,6,8,12 +G,10,15,9,8,5,8,4,5,4,9,4,5,4,7,5,8 +P,3,7,3,5,2,4,12,8,2,10,6,4,1,10,3,8 +C,1,0,1,1,0,6,7,6,8,7,6,14,0,8,4,10 +S,5,11,7,8,4,10,6,4,8,11,3,8,2,8,5,11 +J,5,9,6,7,4,7,4,5,4,14,8,14,1,6,1,6 +P,5,11,8,8,6,7,11,7,3,10,5,3,3,11,4,8 +X,3,2,4,4,2,7,7,3,9,6,6,8,2,8,6,8 +L,8,13,8,8,5,9,3,3,3,11,6,11,4,8,7,9 +B,4,5,4,8,4,6,8,10,7,7,5,7,2,8,9,10 +E,3,5,6,4,3,8,7,2,8,11,5,8,2,8,5,10 +H,3,4,4,6,2,7,9,15,2,7,4,8,3,8,0,8 +T,3,4,4,3,2,6,11,3,7,11,9,4,2,11,3,4 +P,2,1,2,1,1,5,11,8,2,9,6,4,1,9,3,8 +S,2,3,4,2,2,6,8,2,6,10,8,8,1,8,5,6 +N,1,0,2,1,1,7,7,11,1,5,6,8,4,8,0,8 +P,5,4,5,6,3,4,12,9,3,10,6,4,1,10,4,8 +D,3,5,5,4,3,9,7,5,7,9,4,5,3,8,3,8 +T,2,7,3,4,1,6,14,0,6,8,11,8,0,8,0,8 +B,2,4,4,2,2,9,7,3,5,11,5,7,2,7,4,9 +Y,3,7,5,5,2,7,10,2,2,7,12,8,1,11,0,8 +J,3,11,4,8,2,15,3,4,5,13,0,8,0,7,0,8 +A,3,9,6,7,4,11,3,2,2,9,2,9,3,4,3,8 +J,3,7,5,5,2,11,6,2,7,14,3,8,0,8,0,8 +S,2,3,3,4,1,9,10,5,9,5,6,5,0,7,8,7 +E,4,8,4,6,2,3,7,6,11,7,6,15,0,8,7,7 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +H,5,9,7,6,7,8,8,6,7,7,6,9,6,8,4,7 +G,4,5,5,8,2,7,6,8,8,6,5,10,2,8,6,11 +Z,2,2,3,3,2,7,8,5,9,6,6,9,1,9,7,8 +Y,4,6,6,4,3,9,10,1,7,3,11,8,1,11,1,9 +H,3,7,4,5,5,7,5,4,4,6,5,8,4,8,5,7 +B,4,8,6,6,7,8,8,7,6,7,5,6,2,7,7,10 +A,4,9,6,7,4,10,3,2,2,8,2,10,4,4,3,8 +B,6,10,6,6,5,10,6,3,5,9,5,8,6,8,7,9 +M,6,10,8,8,7,9,6,6,5,6,7,6,8,6,2,6 +P,4,9,4,6,2,5,10,9,4,9,6,5,2,10,4,8 +W,5,11,8,8,6,4,11,2,3,8,9,9,9,11,2,7 +S,2,4,4,2,1,6,8,2,7,11,7,8,1,8,4,6 +J,3,10,4,8,1,13,2,9,4,14,5,13,1,6,0,8 +N,8,14,9,8,5,7,7,2,4,12,4,8,6,8,0,7 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +P,5,8,7,11,11,8,9,4,1,8,7,6,8,10,6,8 +G,2,3,3,2,1,6,7,5,5,9,7,10,2,8,4,10 +E,6,8,8,6,5,4,9,4,9,11,10,9,2,9,4,5 +Q,6,8,7,10,6,8,7,7,4,8,7,10,3,8,6,8 +R,3,8,4,6,2,5,11,8,4,7,4,9,3,7,6,11 +K,2,3,2,2,2,5,7,4,7,6,6,10,3,8,4,10 +Y,4,5,6,6,6,9,9,6,4,7,7,7,5,11,6,4 +P,4,5,6,6,6,6,9,4,2,8,7,6,6,10,4,6 +G,6,9,6,4,3,7,3,5,2,6,5,4,4,8,5,7 +G,4,7,6,5,6,7,7,6,2,7,6,11,4,9,7,9 +P,7,9,8,7,7,6,7,5,5,7,6,9,5,9,7,10 +L,7,15,7,8,5,9,3,3,4,12,6,11,3,8,6,9 +J,1,2,2,3,1,10,6,2,6,12,4,9,0,7,1,7 +Y,3,10,5,8,2,8,10,1,3,6,12,8,1,11,0,8 +D,6,11,8,8,8,8,8,6,6,9,5,4,6,9,5,10 +M,6,10,9,8,8,8,7,2,4,9,7,8,8,6,2,8 +G,2,1,2,2,1,8,6,6,6,6,5,10,1,7,5,10 +U,4,9,5,6,4,6,9,8,5,3,7,12,4,8,5,6 +I,0,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +I,4,11,5,8,3,8,6,0,7,13,6,9,1,7,3,8 +B,6,11,6,8,5,6,6,9,7,6,6,7,2,8,10,10 +Q,1,2,2,3,2,7,7,5,2,8,8,9,2,9,4,9 +J,2,7,3,5,1,13,2,9,4,14,4,12,1,6,0,8 +B,4,11,5,8,4,6,7,9,7,7,6,7,2,8,9,10 +A,3,5,5,5,4,9,8,3,4,6,8,7,4,10,4,5 +S,3,4,5,2,2,8,8,2,7,10,6,7,1,8,5,7 +U,4,4,4,6,2,8,5,14,5,6,13,8,3,9,0,8 +E,2,3,4,2,2,7,7,2,7,11,7,9,2,8,4,8 +R,3,8,3,6,3,6,10,7,4,6,3,10,2,6,5,11 +L,3,6,3,4,1,1,0,6,6,0,1,5,0,8,0,8 +N,3,7,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +B,6,9,9,8,10,7,8,5,5,7,7,8,7,9,9,6 +K,6,9,8,6,9,7,6,3,5,6,6,9,8,6,7,7 +X,5,8,6,7,7,6,8,2,5,7,6,9,4,7,8,7 +P,6,9,5,4,2,5,11,5,3,13,5,4,4,9,3,8 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +G,8,14,7,8,5,8,6,4,3,9,6,8,4,9,8,8 +A,3,10,6,8,4,12,2,3,3,10,2,9,2,6,4,8 +K,4,4,6,3,3,8,6,1,7,10,4,9,4,7,4,9 +B,5,10,7,8,7,8,6,7,7,6,7,6,2,8,8,11 +Y,3,8,5,6,3,5,9,1,6,8,12,10,1,11,2,8 +N,2,4,4,3,2,5,10,3,3,10,8,8,5,8,1,7 +Y,2,4,4,6,1,5,10,3,2,8,13,8,2,11,0,8 +O,9,12,6,7,3,8,7,6,5,9,4,7,5,9,5,9 +E,6,11,9,9,7,6,8,2,8,10,7,9,3,8,5,7 +U,6,10,6,8,4,3,9,5,6,11,11,9,3,9,1,7 +U,7,8,8,6,3,4,8,5,8,10,10,9,3,9,2,6 +X,3,5,6,4,3,9,7,1,9,10,4,7,2,8,3,8 +D,1,0,1,0,0,6,7,7,5,7,6,6,2,8,3,8 +D,2,1,3,2,2,8,7,7,7,7,7,4,2,8,3,6 +S,4,5,6,4,3,7,7,2,8,11,5,7,1,8,5,8 +K,4,5,7,4,4,5,7,2,8,10,9,10,3,8,4,6 +I,2,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +F,4,5,5,5,5,7,8,4,5,7,5,7,4,9,8,7 +A,1,1,3,2,1,6,2,2,1,6,2,7,1,6,2,6 +R,3,6,5,4,5,6,7,3,3,7,6,9,5,9,7,5 +P,3,2,4,3,3,6,9,4,4,9,7,4,1,10,4,7 +Y,2,7,4,5,2,8,10,1,6,5,11,8,1,11,1,8 +V,4,9,6,7,3,9,11,2,4,4,11,8,2,10,1,8 +M,5,11,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +K,4,9,6,6,5,6,6,3,7,6,6,9,3,8,5,10 +F,4,8,7,6,7,10,6,1,5,9,6,6,5,10,4,6 +X,7,10,7,6,4,9,6,2,7,11,4,7,4,9,4,9 +H,4,9,6,6,7,7,7,6,6,7,6,9,3,8,3,8 +L,4,9,5,7,1,0,0,6,6,0,1,5,0,8,0,8 +H,6,9,8,6,7,11,6,3,6,10,3,7,3,7,3,10 +J,5,11,7,8,8,10,7,4,4,8,4,5,4,7,6,5 +R,2,3,3,2,2,6,7,5,5,7,6,7,2,7,4,9 +G,1,1,2,1,1,7,7,5,5,6,6,10,2,9,3,9 +F,5,9,8,6,7,4,10,1,4,10,7,6,7,10,3,4 +D,6,9,6,4,3,12,2,4,5,12,2,9,4,7,2,10 +K,9,13,9,7,4,4,9,3,7,10,9,11,5,7,3,6 +L,3,9,5,6,3,5,4,2,8,6,1,10,0,6,3,7 +P,5,4,5,6,3,5,9,10,5,8,5,5,2,10,4,8 +A,2,3,3,2,1,8,2,2,1,6,2,8,2,7,2,7 +I,6,10,8,7,5,7,6,2,8,7,6,8,0,9,4,8 +X,3,7,5,5,2,9,7,1,8,10,4,7,3,8,3,8 +M,3,6,5,4,5,12,5,3,2,9,4,8,5,6,2,6 +R,4,2,4,3,3,7,8,5,5,6,5,6,3,7,4,8 +Y,1,0,1,0,0,7,10,3,1,7,12,8,1,11,0,8 +I,1,3,2,1,0,7,7,1,7,13,6,8,0,8,0,7 +T,5,11,6,8,8,7,8,4,5,6,7,9,7,7,8,7 +F,3,9,4,6,2,1,12,5,4,11,10,7,0,8,3,6 +R,5,10,8,8,5,11,7,3,6,11,1,6,4,5,4,10 +Z,9,11,6,15,6,5,11,3,3,12,8,6,3,9,11,5 +K,4,8,6,6,3,7,7,1,7,10,6,9,3,8,4,8 +R,6,9,6,5,4,9,8,4,6,9,2,6,5,5,5,7 +E,4,8,5,6,3,3,9,6,12,7,5,14,0,8,7,7 +Y,10,12,8,7,5,6,8,4,5,10,7,4,3,9,5,4 +M,6,10,7,8,4,7,7,13,2,8,9,8,9,6,0,8 +G,8,15,7,8,6,8,5,4,3,8,6,8,4,9,8,8 +X,4,6,6,4,2,7,7,2,8,11,6,8,3,8,3,7 +Z,3,10,4,7,3,7,8,3,11,9,6,8,0,8,7,8 +T,3,8,4,5,1,8,15,1,6,6,11,9,0,8,0,8 +A,3,3,5,4,1,9,3,3,2,8,2,9,3,6,2,8 +A,2,4,4,5,1,8,6,3,1,7,0,8,2,6,1,8 +P,3,5,5,4,3,8,9,3,4,12,4,4,2,8,3,8 +H,4,8,4,5,2,7,8,15,1,7,5,8,3,8,0,8 +T,5,10,7,8,7,7,6,7,7,6,8,9,4,9,8,6 +M,7,10,9,8,8,9,6,2,5,9,5,7,9,8,2,8 +K,4,9,6,7,7,6,6,3,4,6,5,9,8,6,8,8 +T,1,1,2,1,0,7,14,1,4,7,11,8,0,8,0,8 +J,2,7,3,5,2,8,7,2,5,11,5,8,3,8,2,6 +I,2,8,3,6,2,9,6,0,7,13,5,9,0,8,1,8 +J,1,5,2,3,1,10,6,2,6,11,3,8,0,7,1,7 +C,4,8,5,6,2,5,9,8,8,13,9,6,2,10,2,6 +Y,3,3,4,2,1,4,11,2,7,11,10,5,1,11,2,5 +L,7,15,7,8,5,9,3,4,4,12,7,11,4,8,7,9 +B,2,4,3,2,2,8,7,3,5,9,6,6,2,8,4,8 +P,6,10,8,8,6,8,10,5,4,11,4,3,1,10,3,8 +Q,4,10,5,9,6,8,7,8,5,6,3,8,3,9,4,8 +D,3,6,4,4,5,9,7,5,4,7,5,7,4,7,6,5 +E,5,11,4,6,3,9,6,3,5,11,4,8,3,9,7,11 +D,5,7,6,6,5,6,7,6,7,7,5,7,4,7,5,5 +P,6,11,8,8,8,7,5,6,5,7,6,9,6,9,8,9 +O,4,7,6,5,4,7,7,8,4,7,6,8,3,8,3,8 +H,4,7,6,5,5,8,6,6,7,7,7,6,3,9,3,7 +N,7,11,10,8,6,12,7,3,5,10,0,3,7,11,2,9 +A,3,6,5,4,2,9,2,2,2,7,1,8,2,7,3,7 +T,4,8,6,6,5,7,7,7,7,5,9,10,4,8,7,6 +C,1,1,2,1,1,6,8,6,6,8,7,12,1,9,3,10 +L,1,3,2,2,1,7,4,2,7,7,2,9,0,7,2,8 +P,2,7,4,5,2,6,11,5,4,10,8,3,1,10,4,6 +P,4,9,5,7,4,5,10,4,5,10,9,4,4,10,4,7 +J,3,5,4,7,1,12,2,9,4,14,5,13,1,6,0,8 +D,3,1,4,2,2,7,7,6,7,6,5,5,2,8,3,7 +I,0,3,0,1,0,7,7,1,7,7,6,8,0,8,2,8 +H,2,3,4,2,2,8,7,3,5,10,6,8,3,8,2,8 +T,9,11,9,8,7,7,10,2,9,11,9,5,4,11,5,5 +Y,7,9,7,7,4,3,10,2,7,11,11,7,1,11,2,5 +C,3,6,4,4,2,6,7,5,6,11,8,12,1,9,3,9 +S,4,5,6,4,6,8,8,4,5,7,7,8,4,9,9,10 +L,5,11,5,8,2,0,0,6,6,0,1,5,0,8,0,8 +N,3,2,4,4,3,7,9,5,5,7,6,6,5,9,2,6 +G,5,7,6,5,4,5,7,6,5,9,7,10,2,9,4,10 +Q,7,9,8,11,9,8,7,6,2,7,7,12,6,9,9,6 +I,1,8,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +V,4,8,6,6,3,7,11,2,3,5,11,9,2,10,1,8 +R,4,9,5,7,4,9,8,4,6,9,3,7,3,7,4,11 +N,1,3,3,1,1,9,8,3,4,10,3,5,4,8,1,8 +C,6,14,5,8,4,7,8,4,3,9,8,10,4,9,9,11 +T,4,7,5,5,4,7,8,7,7,7,8,9,3,10,5,8 +R,4,9,5,7,5,9,7,3,5,9,3,8,3,6,3,11 +Z,3,8,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +B,2,2,3,3,2,7,7,5,5,6,6,6,2,8,5,9 +T,2,2,3,3,2,7,11,2,7,7,11,8,1,11,1,8 +R,1,0,1,0,0,6,8,6,3,7,5,7,2,7,4,11 +J,2,3,4,2,1,9,6,3,5,14,6,10,0,7,0,8 +M,5,10,5,8,4,7,7,12,2,7,9,8,8,6,0,8 +X,9,13,9,7,5,4,9,3,8,12,10,9,4,9,4,5 +S,5,10,6,8,4,9,6,5,8,11,2,8,2,7,5,11 +S,3,6,4,4,2,8,7,5,8,5,6,8,0,8,9,8 +G,2,1,2,1,1,8,6,6,6,6,5,9,1,7,5,10 +B,9,14,7,8,4,9,6,6,6,11,4,9,6,7,7,10 +M,2,0,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +S,3,6,4,4,2,6,5,5,9,5,6,10,0,9,9,8 +M,3,7,4,5,3,7,6,11,1,8,9,8,7,6,0,8 +L,2,6,4,4,1,5,4,1,9,7,1,9,0,7,2,7 +G,3,6,4,4,3,7,6,6,6,6,6,10,2,9,4,8 +C,7,10,5,5,2,6,10,6,7,12,8,8,2,9,5,8 +S,5,8,7,6,4,5,8,4,6,10,9,8,2,8,5,4 +C,4,10,5,8,2,5,7,7,10,7,5,14,1,9,4,9 +R,2,4,3,3,2,7,7,5,5,6,5,6,2,7,4,8 +G,6,11,8,8,9,8,7,6,2,7,6,11,5,8,9,7 +C,2,4,3,3,2,6,8,7,8,8,7,13,1,9,4,10 +I,3,8,4,6,2,7,8,0,8,14,6,6,0,8,1,7 +Y,8,11,8,8,4,2,11,3,6,12,12,7,1,11,2,5 +C,3,6,4,4,4,8,6,5,2,7,7,10,6,9,4,7 +Y,4,11,6,8,3,10,10,1,3,6,12,8,1,11,0,8 +K,4,2,5,3,3,5,7,4,8,7,6,11,3,8,5,9 +I,7,8,8,9,8,7,8,4,6,6,8,7,4,9,10,9 +E,5,9,7,7,6,8,7,6,3,7,6,10,5,9,9,8 +O,2,5,3,4,2,7,7,8,5,7,5,8,2,8,3,8 +M,5,7,7,5,6,4,7,3,4,10,10,10,6,6,2,6 +Q,4,8,5,9,5,8,7,7,2,8,7,12,3,9,6,8 +Z,3,9,4,6,3,7,7,6,11,6,6,8,1,8,8,8 +H,3,8,5,6,6,8,6,4,5,6,6,8,6,7,6,7 +Z,8,8,6,12,5,8,5,5,4,11,6,8,3,9,11,7 +H,4,9,6,7,7,7,7,5,6,7,6,8,3,8,3,8 +O,5,9,6,7,4,7,8,8,6,7,8,8,3,7,4,9 +U,5,9,5,6,4,7,5,14,5,7,11,8,3,9,0,8 +W,6,9,6,7,7,4,9,2,3,9,8,8,7,11,2,7 +L,3,8,3,6,1,0,1,5,6,0,0,6,0,8,0,8 +J,0,0,1,1,0,12,4,5,3,12,4,11,0,7,0,8 +L,5,10,7,8,5,5,5,1,9,6,2,10,3,7,4,5 +O,5,8,7,7,6,7,5,5,5,9,5,10,5,5,7,5 +K,6,11,8,8,7,6,6,4,7,6,6,11,5,7,8,10 +J,4,6,6,7,5,8,9,5,5,7,7,9,3,7,8,6 +K,3,6,4,4,4,7,9,4,4,7,5,8,4,7,6,9 +T,3,7,4,5,2,7,11,3,7,10,9,4,2,11,3,5 +G,4,10,6,8,7,7,9,6,3,5,5,11,5,7,8,7 +M,5,5,6,7,4,7,7,12,2,7,9,8,9,6,0,8 +J,2,10,3,7,1,15,2,6,6,14,0,9,0,7,0,8 +V,3,4,5,2,1,3,13,4,2,11,11,7,2,10,1,7 +T,6,8,6,6,3,6,11,2,9,12,9,4,1,11,3,4 +Y,2,1,4,2,1,6,10,2,7,8,11,8,1,11,2,7 +C,3,3,4,5,1,5,7,6,9,6,6,12,1,8,4,8 +A,3,4,5,6,2,8,5,3,1,7,1,8,2,7,2,8 +R,8,12,6,6,4,10,6,6,5,11,2,8,7,6,5,10 +M,5,9,8,7,7,12,6,2,4,9,2,6,8,6,2,8 +U,9,10,9,8,3,4,9,6,9,13,12,9,3,9,1,7 +Q,6,8,6,9,8,8,7,6,3,8,8,10,3,8,6,8 +X,3,6,5,4,3,8,7,4,9,6,6,8,3,8,6,8 +C,4,7,5,5,5,6,7,4,4,7,7,10,6,9,3,8 +Y,4,10,6,7,1,6,10,3,2,8,13,8,1,11,0,8 +L,3,6,4,4,2,4,4,4,9,2,1,7,0,7,1,6 +M,4,8,7,6,9,9,5,2,2,8,4,8,10,6,2,6 +S,1,0,1,0,0,8,7,3,5,5,6,7,0,8,6,8 +I,2,7,2,5,2,7,7,0,7,7,6,8,0,8,3,8 +J,6,7,4,11,3,6,9,3,4,13,5,5,3,8,6,9 +E,10,15,7,8,5,7,7,4,5,10,6,8,3,9,8,9 +M,5,9,8,7,10,7,6,4,2,7,4,8,13,6,3,7 +L,3,4,3,6,1,0,1,5,6,0,0,7,0,8,0,8 +T,3,8,5,6,3,7,12,4,6,8,11,7,2,12,1,7 +X,5,11,6,8,2,7,7,5,4,7,6,8,3,8,4,8 +X,5,11,6,8,2,7,7,5,4,7,6,8,3,8,4,8 +V,8,11,8,8,3,2,11,6,5,13,12,8,3,10,1,8 +D,2,4,4,2,2,9,6,4,6,10,4,6,2,8,2,9 +X,8,15,8,9,4,8,8,2,8,9,7,8,4,12,4,7 +S,3,2,4,4,3,8,7,7,5,7,7,8,2,9,9,8 +B,1,3,2,1,1,8,7,2,5,10,5,7,1,8,3,9 +E,1,3,3,2,2,6,8,2,7,11,7,9,2,8,4,9 +S,5,11,6,8,3,9,10,6,10,5,6,5,0,7,9,8 +K,5,8,8,6,5,3,8,2,6,10,11,11,3,7,3,5 +P,4,8,6,12,10,8,9,5,0,8,6,7,5,11,6,6 +Z,2,2,3,4,2,7,7,5,9,6,6,8,2,8,7,8 +R,3,5,6,3,4,8,8,3,5,9,4,7,3,6,3,11 +S,2,3,3,2,1,9,7,2,6,10,5,7,1,9,5,9 +F,2,1,3,2,1,5,11,4,5,10,9,5,1,9,3,6 +L,4,8,5,6,3,4,3,5,9,1,1,5,1,6,1,5 +N,5,9,6,7,4,8,6,9,6,4,4,4,5,7,3,7 +N,6,7,8,5,4,10,7,3,6,10,1,4,6,10,2,8 +N,1,0,1,1,0,7,7,10,0,6,6,8,4,8,0,8 +D,4,8,6,6,4,8,7,6,7,10,5,5,3,8,3,8 +M,6,10,7,8,4,8,7,13,2,6,9,8,9,6,0,8 +Y,5,10,7,8,6,8,6,7,5,5,8,8,3,8,10,6 +R,9,13,7,8,5,7,7,5,5,9,5,9,7,5,7,11 +D,6,9,8,8,8,6,8,5,7,5,3,6,5,9,8,5 +E,3,6,3,4,2,3,8,6,10,7,6,15,0,8,7,7 +R,2,0,2,1,1,7,11,8,2,7,5,8,2,7,4,10 +M,4,7,6,5,5,6,6,2,4,9,8,9,7,5,2,7 +I,6,10,8,8,5,9,5,2,6,6,7,6,0,10,4,7 +F,4,9,5,6,3,2,11,5,6,11,10,9,0,8,2,6 +P,5,10,7,8,7,6,9,3,7,9,8,5,4,10,4,7 +S,6,10,7,8,4,6,8,4,8,11,8,7,2,8,5,5 +X,3,5,4,4,4,5,8,2,4,8,7,9,2,7,7,8 +T,2,7,3,4,1,7,14,0,6,7,11,8,0,8,0,8 +R,5,10,5,8,7,6,8,8,4,7,5,7,3,8,6,12 +O,2,3,2,1,1,8,7,6,4,9,6,8,2,8,3,8 +A,4,9,6,7,3,11,2,4,3,10,2,9,3,7,3,8 +P,5,8,8,6,3,7,11,3,7,14,5,2,0,9,3,8 +X,5,8,6,7,6,7,7,2,5,7,6,8,3,10,8,7 +M,3,1,4,2,1,8,7,11,1,7,9,8,7,6,0,8 +U,3,5,5,4,4,8,6,4,4,6,6,8,4,10,1,7 +B,2,6,3,4,3,6,7,7,5,7,6,7,2,8,6,9 +Z,3,8,4,6,3,7,7,6,10,6,6,8,1,8,8,8 +G,5,8,6,6,4,6,7,5,4,9,8,9,2,7,5,9 +P,4,9,5,7,5,5,8,6,4,8,7,9,3,8,7,10 +S,6,10,9,8,11,6,7,3,2,7,5,6,3,8,11,4 +M,7,8,9,7,10,5,8,5,4,6,5,8,13,7,6,9 +E,5,5,5,8,3,3,8,6,12,7,5,15,0,8,7,6 +K,5,11,7,8,7,9,6,1,6,10,3,8,7,7,6,11 +T,3,4,5,6,1,7,15,1,5,7,11,8,0,8,0,8 +A,7,15,5,8,4,10,3,3,2,8,4,11,5,5,4,8 +S,2,6,3,4,3,7,6,7,5,7,7,8,2,9,8,7 +R,4,8,4,6,4,6,8,9,4,7,5,8,2,7,5,11 +D,3,8,4,6,6,10,7,4,5,7,6,6,4,6,9,6 +H,6,10,9,8,8,7,7,3,6,10,6,8,3,8,3,7 +G,5,9,4,4,3,9,3,5,2,9,7,10,4,9,6,8 +E,6,10,8,8,7,9,6,2,7,11,4,9,5,7,6,11 +O,5,10,5,8,5,8,6,8,4,9,5,8,3,8,3,8 +J,6,10,8,8,4,5,9,3,6,15,7,9,2,7,2,7 +C,5,8,7,7,6,5,7,3,4,7,6,11,4,10,7,10 +I,1,3,2,2,0,7,7,1,7,13,6,9,0,8,1,8 +D,4,6,5,5,4,6,6,6,7,7,6,8,4,6,5,5 +F,1,0,1,1,0,3,11,4,3,11,9,7,0,8,2,8 +U,2,3,3,2,1,4,8,4,6,11,10,9,3,9,1,7 +Q,2,3,2,3,2,8,8,5,2,8,7,10,2,9,3,8 +Q,3,7,5,5,4,8,4,7,4,6,5,7,3,8,3,9 +W,6,10,9,7,7,4,11,2,2,8,9,9,7,12,1,8 +R,4,6,5,4,4,6,7,4,6,7,6,6,6,7,4,8 +J,1,3,3,2,1,8,6,3,5,14,6,11,1,7,0,7 +Z,6,10,8,8,5,7,8,3,10,12,8,7,2,8,7,6 +C,4,9,5,8,6,5,7,3,4,7,6,11,4,10,7,10 +Q,2,3,3,3,2,8,7,6,3,6,6,9,2,8,5,9 +Q,2,2,2,2,1,7,8,4,2,8,7,9,2,9,3,9 +T,2,7,4,4,1,8,15,1,5,6,11,8,0,8,0,8 +E,3,5,3,4,3,7,7,5,7,7,6,9,2,8,5,10 +E,3,5,3,3,3,7,7,5,7,7,6,9,2,8,5,10 +P,4,7,5,5,2,6,14,5,3,12,5,1,0,10,3,7 +F,2,3,4,2,1,6,11,2,5,13,6,4,1,10,1,8 +C,4,4,5,6,2,6,6,7,11,8,5,12,1,9,4,9 +S,1,3,3,2,1,7,9,3,7,10,7,6,1,8,4,6 +S,3,6,4,4,3,7,6,7,5,7,7,9,2,9,8,7 +N,3,2,4,4,3,7,8,5,5,7,7,6,5,10,2,5 +T,6,8,6,6,3,7,11,3,8,11,9,4,2,12,3,4 +A,1,3,2,2,1,9,3,2,1,8,2,9,1,6,1,7 +X,3,2,4,3,2,8,7,3,9,6,6,8,2,8,6,8 +W,5,7,7,5,3,4,8,5,1,7,9,8,8,10,0,8 +V,3,6,5,4,5,8,5,5,2,7,7,7,4,9,4,6 +F,3,6,4,4,2,6,11,2,6,14,6,4,1,10,2,8 +D,2,2,3,3,3,7,7,6,6,7,6,5,2,8,3,7 +Q,4,9,5,8,3,9,8,8,6,5,8,9,3,8,5,9 +H,1,1,2,1,1,7,7,12,1,7,6,8,3,8,0,8 +O,4,6,6,5,4,6,6,5,5,8,4,8,3,7,5,6 +V,4,6,4,4,2,5,11,3,4,9,11,7,2,10,1,8 +T,3,8,5,6,1,7,15,1,5,7,11,8,0,8,0,8 +U,3,6,4,4,1,7,4,14,5,7,13,8,3,9,0,8 +Y,2,7,3,5,2,5,10,2,2,8,12,8,1,11,0,8 +G,1,0,2,0,1,8,7,5,5,6,6,9,1,7,5,10 +H,4,7,6,10,7,8,9,5,1,8,6,6,5,11,10,6 +U,2,1,2,1,1,8,5,11,4,6,13,8,3,10,0,8 +I,3,10,4,8,2,7,7,0,8,13,6,8,0,8,1,8 +L,4,10,5,8,3,0,2,4,6,1,0,8,0,8,0,8 +P,4,7,5,5,4,8,9,4,4,11,5,5,3,10,3,7 +L,4,10,6,7,8,7,7,3,5,6,7,10,6,10,7,4 +N,3,7,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +W,7,10,7,8,8,5,10,3,3,9,7,7,8,11,3,6 +F,5,10,5,7,3,0,13,3,3,11,9,6,0,8,2,6 +A,6,14,6,8,4,12,2,3,2,12,4,11,4,4,4,11 +G,5,10,6,8,5,7,7,7,6,6,5,9,2,8,6,11 +Y,4,7,6,5,2,9,11,1,7,3,11,8,1,11,2,9 +L,5,10,7,7,3,6,4,1,10,8,2,11,0,7,3,7 +M,4,1,5,3,3,8,6,6,5,6,7,8,8,5,2,7 +O,2,4,3,2,1,8,7,7,5,7,6,8,2,8,3,8 +G,4,7,5,5,4,6,7,6,4,5,7,9,2,7,4,9 +Y,3,5,4,4,2,4,10,1,8,10,10,6,1,10,3,4 +M,3,3,5,2,3,9,6,3,4,9,5,7,6,5,1,8 +A,3,6,5,4,3,11,2,2,2,9,2,9,2,6,3,8 +P,4,8,4,5,2,3,14,8,1,11,7,3,1,10,4,8 +U,4,8,4,6,3,7,6,12,4,7,12,8,3,9,0,8 +F,2,3,4,2,1,6,10,3,5,13,6,5,1,9,2,7 +A,3,6,5,4,1,7,5,3,1,6,1,8,2,7,2,7 +P,1,3,2,1,1,5,10,3,4,10,8,5,0,9,3,7 +H,3,4,4,5,2,7,9,15,2,7,3,8,3,8,0,8 +A,4,10,7,7,5,7,5,2,3,5,2,6,3,7,4,4 +F,4,9,5,6,2,1,15,5,3,12,9,4,0,8,2,6 +G,2,1,2,1,1,8,6,6,6,6,5,9,1,7,5,10 +X,11,14,10,8,4,8,7,2,10,9,6,8,4,8,4,8 +S,9,15,8,9,4,11,2,2,5,10,2,9,3,7,4,12 +K,5,8,7,6,5,5,7,1,7,10,8,10,3,8,4,7 +D,4,4,5,6,3,5,6,10,9,5,5,5,3,8,4,8 +J,4,5,5,6,4,9,8,5,4,6,5,8,3,8,9,8 +T,7,9,7,7,5,6,12,5,6,11,9,4,3,13,3,4 +P,3,3,5,2,2,7,10,3,4,12,4,3,1,9,3,8 +K,4,8,6,6,5,5,8,1,6,9,7,9,3,8,3,8 +A,2,7,4,5,2,12,2,4,3,11,2,9,2,6,3,9 +A,3,4,6,6,2,9,3,3,3,8,2,9,3,6,3,9 +C,4,7,5,5,3,6,7,6,9,8,4,10,1,10,4,10 +M,2,3,4,2,2,6,6,3,3,9,8,9,5,5,1,8 +V,3,4,4,3,1,4,12,4,3,10,11,7,2,10,1,8 +M,5,8,7,6,8,7,7,7,5,7,5,8,7,9,8,6 +J,2,6,2,4,1,15,3,3,5,12,1,8,0,8,0,8 +O,3,7,4,5,2,7,8,8,7,7,7,8,3,8,4,8 +S,5,10,7,8,5,10,6,4,6,10,3,7,2,8,5,10 +N,3,5,4,7,3,7,7,14,2,5,6,8,6,8,0,8 +L,5,11,6,9,4,4,4,1,9,6,1,10,0,6,3,6 +V,2,5,4,4,2,6,12,2,3,8,11,8,2,10,1,8 +H,3,3,3,4,2,7,8,14,1,7,5,8,3,8,0,8 +Z,3,5,4,7,2,7,7,4,14,10,6,8,0,8,8,8 +J,2,7,3,5,1,13,2,8,4,13,4,12,1,6,0,8 +K,11,15,10,8,4,7,8,3,8,9,7,8,6,8,4,7 +X,6,8,9,6,4,6,8,2,9,10,9,8,3,8,4,7 +C,7,10,7,7,4,6,7,6,8,13,8,12,3,11,5,5 +D,3,6,3,4,3,5,7,8,6,7,7,6,2,8,3,8 +E,4,10,4,8,5,2,8,5,9,7,7,14,0,8,6,9 +M,5,9,8,7,6,5,7,3,4,10,9,9,8,6,3,8 +A,7,13,7,7,4,12,3,6,2,12,2,10,5,3,4,10 +M,6,9,8,6,8,7,7,6,5,6,7,9,8,6,2,8 +C,3,7,4,5,2,5,8,6,7,7,6,12,1,9,4,10 +J,3,10,4,8,1,12,2,10,4,14,4,13,1,6,0,8 +J,2,5,4,3,2,9,5,4,5,14,6,11,1,6,0,7 +L,4,10,4,8,1,0,1,6,6,0,0,6,0,8,0,8 +Q,3,4,4,5,4,8,8,7,2,5,7,9,3,8,5,9 +M,4,3,4,4,3,7,7,12,1,7,9,8,8,6,0,8 +Z,2,3,4,2,2,7,8,2,9,12,6,8,1,9,5,8 +Q,6,7,8,6,6,7,4,4,5,7,4,9,5,5,6,7 +N,5,6,6,6,6,7,7,4,3,7,5,7,6,9,5,5 +V,2,3,3,1,1,4,12,3,2,10,11,7,2,11,1,7 +B,3,6,4,4,3,8,6,6,7,6,6,6,2,8,7,10 +K,5,7,8,5,5,9,5,1,6,9,3,8,4,7,4,10 +Q,6,12,6,6,4,11,4,4,6,12,3,9,3,9,7,12 +A,3,7,5,5,3,11,2,2,2,9,2,9,3,6,3,9 +R,4,8,6,6,4,7,8,6,6,6,5,8,4,6,7,9 +I,1,1,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +M,6,8,9,6,9,10,6,3,3,9,4,7,9,8,3,6 +H,6,11,6,8,3,7,6,15,0,7,7,8,3,8,0,8 +D,4,6,6,4,4,7,7,6,5,7,6,6,4,8,3,7 +D,2,4,4,3,2,8,7,5,6,9,5,5,2,8,3,7 +H,3,4,4,3,3,7,8,5,7,7,6,8,6,8,4,8 +R,3,3,4,5,2,5,11,8,4,7,3,9,3,7,6,11 +Z,4,7,5,5,3,7,8,2,9,11,7,8,1,8,6,7 +Q,4,7,5,6,3,7,6,8,6,6,7,7,3,8,5,9 +B,4,9,5,6,4,6,7,8,7,7,6,7,2,8,9,10 +G,2,4,3,3,2,6,7,5,5,9,7,10,2,8,4,9 +B,1,0,2,1,1,7,8,7,5,7,6,7,1,8,6,8 +C,4,5,5,7,2,5,7,7,10,7,6,13,1,8,4,8 +K,8,15,8,8,5,3,8,4,6,10,11,11,5,11,4,7 +C,8,13,5,8,2,8,6,7,7,12,5,9,2,10,5,9 +W,4,7,5,5,5,7,7,6,2,7,8,8,5,8,3,9 +Q,3,7,4,6,2,8,6,8,6,6,4,8,3,8,4,8 +U,6,10,6,5,3,7,6,5,4,6,7,7,5,6,3,6 +X,5,8,8,6,5,10,6,1,8,10,2,7,4,9,4,10 +D,4,2,5,3,3,7,7,6,7,6,6,5,5,8,3,7 +F,6,7,8,8,8,7,9,4,5,7,7,6,5,9,9,9 +Z,5,9,7,6,5,7,8,2,9,12,6,8,1,9,6,8 +K,7,9,10,7,7,2,9,2,7,10,11,11,5,7,4,4 +S,2,3,3,2,2,8,7,6,4,7,6,8,2,8,9,8 +O,6,11,7,9,5,8,7,9,6,7,5,10,4,8,5,5 +X,10,12,9,7,4,8,7,2,9,9,6,8,4,11,4,8 +N,3,7,4,5,3,7,7,12,1,6,6,8,5,8,0,8 +Q,3,4,4,5,3,7,8,5,2,8,9,10,2,9,5,9 +J,6,11,7,8,3,9,5,3,7,15,4,10,0,6,1,7 +J,3,9,4,6,2,9,5,3,6,14,4,9,0,7,1,7 +H,6,9,8,7,7,7,7,7,5,6,5,7,3,7,7,10 +O,4,6,5,4,2,7,7,8,8,7,6,8,3,8,4,8 +B,4,6,6,4,5,9,8,3,6,7,6,8,6,8,6,9 +P,1,0,2,0,0,5,10,7,2,9,6,5,1,9,3,8 +N,6,10,9,8,6,11,8,3,5,10,1,4,7,11,2,8 +E,2,4,2,3,2,7,7,5,7,7,6,8,2,8,5,10 +I,7,13,6,7,3,12,5,2,6,12,3,6,2,10,4,12 +L,1,3,3,2,1,6,4,1,7,7,2,10,0,7,2,8 +H,4,8,4,5,2,7,7,15,1,7,6,8,3,8,0,8 +H,3,5,5,3,3,8,6,3,5,10,6,9,3,7,3,8 +M,1,0,2,0,1,7,6,9,0,7,8,8,5,6,0,8 +H,6,11,6,6,3,8,8,3,4,9,6,7,6,9,5,9 +X,1,0,1,0,0,8,7,3,5,7,6,8,2,8,3,7 +U,9,10,7,5,3,5,3,5,5,3,7,7,5,8,2,7 +I,5,11,6,8,4,9,6,0,8,13,5,9,0,8,1,9 +X,6,10,9,7,5,7,7,0,8,10,6,8,3,8,3,8 +C,2,6,3,4,2,7,8,8,7,10,6,11,2,11,4,9 +B,2,3,2,2,2,7,7,5,5,7,6,6,2,8,5,9 +D,2,3,3,2,2,7,7,6,7,7,6,4,2,8,3,7 +V,3,2,6,4,2,7,12,2,3,6,11,9,4,12,2,7 +K,4,9,5,6,5,6,5,4,4,6,6,9,3,6,8,10 +K,4,8,6,6,7,7,7,3,4,6,6,8,7,7,7,7 +B,4,11,6,8,8,8,8,6,6,7,6,5,2,8,6,9 +Q,4,9,4,4,2,11,4,4,5,12,3,8,2,7,6,12 +T,6,9,6,7,3,5,11,2,10,12,9,4,0,10,3,4 +H,3,4,6,3,3,8,7,3,6,10,5,8,3,8,3,7 +L,5,11,7,8,5,5,3,6,8,2,2,4,1,6,1,5 +W,4,11,7,8,8,10,11,2,2,5,8,7,9,12,2,8 +R,5,9,7,7,6,7,8,5,7,7,5,6,3,7,5,8 +Y,2,7,4,5,2,5,9,1,6,9,12,9,1,11,2,7 +A,3,3,5,4,1,8,6,3,1,7,1,8,2,7,1,8 +U,8,10,9,8,6,3,9,5,8,10,10,10,3,9,2,6 +Z,3,8,4,6,4,7,8,5,9,7,6,9,1,9,7,7 +D,5,8,7,6,6,8,8,6,6,9,6,4,6,10,5,7 +J,6,11,8,9,3,8,7,3,7,15,5,10,1,6,1,7 +X,4,9,6,7,6,7,8,2,6,7,7,9,4,10,6,7 +S,4,5,6,4,5,8,7,5,5,7,6,8,5,8,9,11 +O,8,15,5,8,3,7,9,6,6,9,6,6,4,10,5,9 +V,3,5,6,4,2,6,13,3,3,8,11,8,3,10,1,8 +C,5,8,7,6,6,6,5,4,4,9,6,12,6,8,4,9 +H,3,5,5,7,4,8,12,3,2,8,8,7,3,10,7,6 +R,2,3,4,2,2,8,7,3,4,9,4,6,2,7,3,9 +M,6,8,9,7,10,6,8,5,3,6,5,8,13,9,5,8 +T,3,10,5,8,5,7,11,4,5,7,11,8,3,12,1,8 +Y,1,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +Y,2,4,3,3,1,3,12,3,6,12,10,5,1,11,2,5 +J,2,6,3,4,1,13,2,8,4,14,4,12,0,7,0,8 +F,2,7,3,5,1,1,12,4,4,12,10,7,0,8,2,6 +J,5,9,6,7,3,9,5,4,6,15,5,11,1,6,0,7 +C,5,11,6,9,3,4,9,7,8,13,11,12,2,9,3,7 +G,1,0,2,0,1,8,6,5,5,6,5,9,1,8,5,10 +Q,6,7,8,6,6,7,4,5,6,7,4,8,5,4,6,7 +P,3,8,4,6,2,3,14,8,1,11,7,3,1,10,4,8 +Q,2,2,3,2,2,8,7,6,4,6,5,9,2,9,3,9 +D,4,9,6,7,9,8,8,5,4,7,6,5,6,8,8,5 +V,7,12,6,6,3,9,10,5,4,6,10,6,5,12,3,7 +G,5,9,4,4,3,7,6,3,3,8,6,8,4,9,8,6 +Y,2,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +L,3,6,3,4,1,0,1,6,6,0,1,5,0,8,0,8 +N,5,11,5,9,6,7,7,13,1,6,6,8,5,9,0,7 +V,4,6,5,4,3,9,11,3,1,4,10,9,3,11,4,9 +C,2,1,2,2,0,6,7,6,9,7,6,15,0,8,4,10 +I,1,4,2,3,1,7,7,1,8,13,6,8,0,8,1,8 +Y,2,6,3,4,0,6,10,2,2,8,12,8,1,10,0,8 +O,4,7,5,5,3,7,7,8,5,8,7,10,3,8,3,7 +M,6,7,9,6,9,5,9,5,3,6,4,8,13,6,5,8 +E,4,10,5,8,3,3,7,6,11,7,6,15,0,8,7,6 +I,1,5,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +C,5,7,5,5,3,3,8,5,7,11,10,13,2,9,3,7 +E,4,7,6,5,4,5,8,5,8,12,10,9,3,8,5,5 +I,7,12,5,6,2,10,5,6,4,13,3,8,3,8,5,10 +E,2,4,4,3,2,7,7,2,7,11,6,8,2,8,4,9 +X,1,0,1,0,0,8,7,3,4,7,6,8,2,8,4,8 +X,4,2,6,4,3,7,7,3,10,6,6,8,2,8,6,8 +G,3,5,4,4,2,6,7,5,5,9,7,10,2,8,4,9 +E,3,6,4,4,3,7,7,6,9,7,7,9,3,8,6,8 +J,3,7,4,5,2,9,4,5,4,14,6,12,0,6,1,7 +D,3,5,4,4,2,8,7,7,7,6,6,3,2,8,3,7 +S,4,10,5,7,3,6,8,5,8,11,8,7,2,9,5,5 +Z,4,9,6,6,4,8,7,2,9,11,5,9,1,8,6,8 +W,7,10,10,8,14,9,7,5,2,7,7,8,13,10,4,6 +M,4,3,4,5,3,7,7,12,1,7,9,8,8,6,0,8 +L,4,8,5,6,3,3,4,2,8,2,1,8,0,7,1,6 +R,3,9,3,6,4,5,9,8,3,7,5,8,2,7,5,11 +H,4,7,6,5,4,7,8,3,6,10,7,8,3,8,3,8 +D,3,7,3,5,3,6,7,9,7,6,5,6,2,8,3,7 +S,2,4,4,3,2,7,7,2,7,10,6,8,1,9,5,8 +Y,3,10,5,7,1,8,11,1,3,6,12,8,1,11,0,8 +N,3,3,4,4,2,7,7,14,2,5,6,8,6,8,0,8 +Y,4,4,5,6,7,8,8,3,2,7,8,9,4,11,7,7 +R,3,9,4,6,4,6,8,8,4,7,5,8,2,7,5,11 +D,2,4,4,3,2,8,7,4,6,10,5,6,2,8,3,8 +O,3,4,4,6,2,7,6,9,6,6,5,6,3,8,4,8 +G,3,7,4,5,2,7,6,8,7,6,6,8,2,8,6,11 +H,9,15,10,8,7,8,7,3,5,10,4,7,7,6,6,7 +Y,6,10,8,8,7,9,7,7,4,6,9,7,3,9,9,4 +M,7,10,9,8,8,8,6,6,5,6,8,8,9,6,2,7 +P,9,10,7,5,3,6,12,6,4,13,5,3,4,10,4,8 +H,3,4,5,6,4,9,12,3,2,8,8,7,3,10,6,7 +V,6,9,5,4,2,7,10,7,3,9,9,5,5,12,3,9 +B,5,10,7,7,6,8,8,6,8,7,6,6,6,8,6,10 +X,3,8,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +O,3,3,4,2,2,7,8,7,5,7,7,8,2,8,3,8 +K,4,11,5,8,2,3,7,8,2,7,5,11,3,8,2,11 +G,1,0,2,1,1,8,6,6,5,6,5,9,1,8,5,10 +T,3,7,5,5,3,7,11,1,8,7,11,8,1,10,1,8 +K,2,4,3,2,2,5,7,4,6,7,6,11,3,8,4,9 +H,3,7,4,4,2,7,8,14,1,7,6,8,3,8,0,8 +G,3,7,5,5,5,7,9,6,3,6,6,10,3,7,7,8 +B,4,4,5,6,4,6,6,9,7,6,6,7,2,8,9,9 +V,4,9,6,7,2,7,8,4,3,7,14,8,3,9,0,8 +T,4,9,6,8,6,6,8,4,8,8,7,8,3,9,8,7 +N,5,5,6,7,3,7,7,15,2,4,6,8,6,8,0,8 +U,3,3,3,2,1,5,8,5,7,9,8,8,3,9,2,5 +Z,4,6,6,4,3,6,9,3,9,11,8,6,1,9,6,6 +K,1,0,1,0,0,5,8,7,0,7,6,10,3,8,2,11 +H,8,13,8,7,4,10,8,4,6,9,2,5,6,7,4,9 +I,1,3,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +A,2,1,3,2,1,8,2,2,1,7,2,8,2,7,2,7 +H,4,8,6,6,8,7,6,5,3,6,6,8,7,7,9,9 +G,4,8,5,6,2,8,6,8,8,7,5,12,2,8,5,10 +O,8,13,6,8,3,7,7,5,5,8,4,7,5,9,5,8 +E,1,1,2,2,1,4,7,5,8,7,6,13,0,8,6,9 +X,4,8,7,6,4,4,8,2,8,10,12,10,3,8,4,5 +J,4,10,5,7,3,8,6,3,6,14,4,9,0,6,1,7 +O,2,4,3,3,2,7,7,6,4,9,7,7,2,8,3,8 +X,1,1,2,2,1,7,7,3,8,6,6,8,2,8,5,8 +V,4,4,6,7,1,8,8,4,3,7,14,8,3,9,0,8 +C,5,10,5,8,3,6,8,7,7,13,7,9,2,11,3,7 +M,5,5,6,4,4,8,6,6,5,6,7,7,10,6,4,6 +Q,4,6,5,8,5,7,9,5,3,8,9,9,4,10,6,7 +K,3,1,4,2,2,6,7,4,7,7,6,10,3,8,4,9 +W,2,0,2,1,1,7,8,3,0,7,8,8,6,9,0,8 +R,2,3,3,2,2,9,6,3,4,10,4,7,2,7,3,10 +G,3,9,5,6,3,6,7,7,6,5,7,9,2,7,4,9 +S,7,10,8,8,5,7,7,4,6,9,8,9,2,11,5,6 +O,4,6,6,4,3,7,6,8,5,8,5,11,4,8,4,7 +Y,3,10,5,7,3,7,10,2,6,6,12,9,2,11,2,8 +P,5,4,5,6,3,4,13,8,2,10,6,3,1,10,4,8 +T,3,4,3,3,1,5,12,3,6,11,9,5,1,11,1,5 +R,4,6,6,4,4,9,7,4,5,9,3,7,3,7,4,11 +H,6,10,6,6,4,5,8,3,4,10,9,9,6,10,5,8 +E,6,9,8,7,7,8,6,6,2,7,6,9,4,8,8,10 +B,3,7,5,5,3,9,7,4,6,10,5,6,2,8,6,9 +F,3,4,3,3,2,5,11,3,6,11,9,5,1,10,3,6 +N,5,10,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +H,3,4,3,5,2,7,7,14,1,7,6,8,3,8,0,8 +H,5,9,8,7,5,6,8,3,6,10,8,9,3,8,3,7 +L,3,7,4,5,2,6,4,2,8,7,2,10,0,7,2,8 +Q,5,7,7,11,10,9,10,5,0,5,7,10,6,13,6,12 +I,1,3,2,2,0,7,8,1,6,13,6,7,0,8,0,7 +F,3,9,4,6,2,1,13,5,4,12,10,7,0,8,2,6 +D,3,6,5,4,3,9,7,4,5,10,4,5,3,8,2,8 +B,5,9,4,5,3,7,7,5,5,10,6,9,5,7,7,9 +D,2,4,4,3,2,8,7,4,6,9,5,5,2,8,3,7 +A,1,3,2,2,1,10,2,2,1,9,2,9,1,6,2,8 +W,4,8,7,6,5,7,10,2,3,7,9,8,8,11,1,8 +D,7,11,9,8,8,7,8,7,6,8,7,6,7,7,3,7 +D,3,5,4,4,3,7,7,7,6,7,6,5,2,8,3,7 +T,3,6,4,5,4,6,7,3,8,8,7,10,3,7,7,6 +W,5,6,5,4,4,4,10,2,3,9,9,7,7,11,2,6 +E,3,2,3,3,3,7,7,5,7,7,5,9,2,8,5,10 +Z,3,9,5,7,5,8,6,3,7,7,6,8,1,7,11,9 +Y,3,8,5,6,2,5,10,3,2,8,12,8,1,11,0,8 +U,6,9,8,7,10,9,8,4,5,5,8,8,10,7,8,6 +J,6,8,8,9,7,8,9,5,5,7,7,9,4,6,9,6 +E,8,15,6,8,5,8,6,5,5,11,5,10,3,8,7,11 +W,6,5,7,4,3,3,10,3,3,10,10,8,7,10,1,7 +Y,6,8,8,10,10,10,10,6,3,6,7,7,6,11,8,3 +I,1,7,0,5,1,7,7,5,3,7,6,8,0,8,0,8 +J,3,9,4,7,3,10,6,0,8,11,3,6,0,7,1,7 +I,1,4,2,3,0,7,8,0,7,13,6,8,0,8,0,8 +P,8,15,7,8,4,6,9,6,4,13,5,5,4,10,4,8 +N,4,9,6,6,4,8,9,9,6,8,5,5,3,7,3,7 +H,3,9,4,6,2,7,8,15,1,7,4,8,3,8,0,8 +P,11,13,8,7,4,6,12,6,5,14,6,2,4,10,4,8 +Y,6,9,6,7,4,5,9,0,8,8,9,5,1,11,4,5 +E,3,7,3,5,2,3,7,6,11,7,7,15,0,8,6,7 +S,4,6,5,6,6,8,8,5,4,7,7,8,5,11,9,10 +T,4,9,5,7,5,7,11,4,6,7,11,8,2,12,1,7 +M,6,11,7,8,7,8,6,11,1,7,8,8,9,4,1,8 +L,2,6,2,4,0,0,2,5,6,0,0,7,0,8,0,8 +V,2,0,3,1,0,7,9,4,2,7,13,8,2,10,0,8 +B,4,11,6,8,8,7,7,6,5,7,6,6,3,8,6,10 +V,2,3,2,1,1,5,11,2,2,9,10,7,1,11,1,7 +S,4,9,5,7,3,8,6,6,9,5,6,8,0,9,9,8 +Q,6,13,5,7,3,8,4,4,7,10,4,9,3,8,8,10 +S,3,4,5,3,2,8,7,2,7,10,5,8,1,9,5,8 +O,5,9,6,7,5,7,8,8,4,6,7,9,3,7,4,7 +E,1,0,1,1,1,5,7,5,8,7,6,12,0,8,6,9 +A,2,6,4,4,1,8,5,3,1,7,1,8,2,7,2,8 +T,3,3,4,2,1,5,11,3,7,11,9,4,1,10,2,5 +G,2,1,3,2,2,6,7,6,6,6,6,10,2,9,3,9 +R,4,11,6,8,6,6,7,6,6,6,5,8,3,6,6,9 +H,4,7,4,4,2,7,10,14,2,7,3,8,3,8,0,8 +M,8,9,11,7,9,6,8,3,4,9,9,9,9,8,3,8 +D,4,7,6,5,3,9,6,4,8,11,4,6,3,8,3,9 +X,3,7,5,5,4,7,7,3,8,5,6,8,2,8,6,8 +C,6,11,6,8,3,4,8,6,8,12,10,13,1,9,3,7 +S,3,7,4,5,3,8,8,5,7,5,6,8,0,8,8,8 +P,5,10,7,8,6,7,10,5,4,12,5,3,1,10,3,8 +P,4,8,6,6,4,6,9,7,6,9,7,4,2,10,4,6 +J,0,0,1,0,0,11,4,5,3,12,4,10,0,7,0,8 +R,5,11,7,8,6,6,8,5,6,6,5,7,3,6,6,9 +E,7,11,4,6,2,8,7,5,8,10,6,9,2,10,7,9 +J,2,10,3,7,3,8,6,2,4,11,5,10,1,6,2,6 +Q,2,3,3,5,3,8,8,6,1,5,7,10,3,9,5,10 +V,7,12,5,6,3,8,10,5,5,7,10,5,5,12,3,7 +O,2,6,3,4,2,7,7,6,3,7,6,8,3,8,2,8 +G,2,4,3,3,2,6,7,5,4,9,7,10,2,9,4,10 +P,5,7,6,5,5,6,9,6,4,8,7,9,2,9,7,10 +I,0,3,0,2,0,9,7,2,6,7,6,7,0,8,1,7 +G,3,2,5,3,3,7,7,6,6,6,7,9,2,8,4,8 +D,3,4,4,3,2,7,7,7,7,7,6,5,2,8,3,7 +U,6,9,8,6,6,7,8,8,6,5,7,11,4,8,5,6 +D,5,8,7,7,6,6,7,5,7,7,5,7,4,7,6,5 +A,1,0,2,0,0,8,4,2,0,7,2,8,1,6,1,8 +U,1,0,1,0,0,7,7,10,4,7,12,8,3,10,0,8 +V,3,4,5,3,2,8,12,2,3,6,11,9,2,10,1,8 +D,5,9,6,7,3,6,8,11,10,8,7,6,3,8,4,8 +A,3,6,5,4,2,11,2,4,2,10,2,10,2,7,3,8 +U,7,11,6,6,4,6,6,5,5,7,8,9,5,8,3,9 +M,4,7,4,5,3,7,7,12,1,7,9,8,8,6,0,8 +X,7,10,7,5,4,6,9,3,7,11,10,8,4,14,4,6 +P,5,11,7,8,5,8,8,1,6,13,6,5,1,9,3,9 +Z,4,5,6,8,5,11,4,2,5,8,3,6,1,8,6,9 +J,6,8,7,9,7,8,7,4,6,6,6,7,4,9,10,9 +X,7,15,8,8,5,10,5,3,8,11,2,8,4,5,4,9 +G,4,8,5,6,3,7,7,7,7,11,6,11,2,9,4,9 +C,2,2,3,4,2,6,8,7,7,8,8,13,1,9,4,10 +R,4,5,7,4,6,7,7,3,4,7,5,8,6,9,5,7 +B,3,7,5,5,5,7,8,7,6,7,5,7,2,7,6,10 +T,3,5,4,4,3,7,11,3,7,7,11,8,2,11,1,8 +O,3,7,4,5,2,7,6,8,8,7,4,8,3,8,4,8 +G,5,8,7,7,7,7,8,6,3,7,7,9,7,10,8,8 +N,6,12,7,6,3,7,7,2,3,12,5,8,5,8,0,7 +K,3,4,5,3,3,6,8,1,7,10,7,10,3,8,2,7 +N,5,9,7,6,4,7,9,6,5,7,6,7,7,9,3,7 +S,3,4,3,3,2,8,7,7,5,7,6,8,2,9,9,8 +K,4,2,5,3,3,5,7,4,8,7,6,11,3,8,5,9 +A,4,12,7,8,3,7,4,3,2,6,1,8,3,7,3,7 +I,3,10,5,7,2,7,7,0,9,14,6,8,0,8,1,8 +I,1,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +J,5,6,6,7,5,8,9,4,5,7,6,8,3,8,8,8 +O,3,4,4,3,2,8,6,7,4,9,5,8,2,8,3,8 +C,3,4,4,6,1,5,6,7,9,6,5,13,1,8,4,9 +L,2,5,4,4,2,7,4,1,8,8,2,10,0,7,2,8 +T,3,7,4,5,2,6,12,2,7,8,11,8,1,11,1,7 +K,5,10,7,7,6,6,7,4,7,6,6,9,7,8,5,9 +P,6,9,8,7,6,5,14,6,2,12,6,2,1,10,3,7 +U,6,7,7,5,4,4,8,5,7,9,8,9,3,9,3,5 +P,4,10,6,7,6,7,6,7,4,7,6,8,3,8,7,10 +T,6,13,5,7,2,6,9,3,7,13,6,6,2,8,4,4 +C,3,2,4,4,2,5,8,7,7,9,8,13,1,9,4,10 +N,2,3,3,2,2,7,9,6,4,8,6,7,4,8,1,7 +H,4,2,5,3,4,7,7,6,6,7,6,8,3,8,3,9 +K,5,11,6,8,2,4,5,9,2,7,7,12,4,7,3,11 +F,4,8,6,9,8,7,9,4,4,8,6,7,4,9,8,8 +C,4,7,5,5,2,7,7,6,7,12,7,11,2,10,3,8 +F,5,11,6,8,6,6,9,4,7,10,9,6,2,9,4,6 +L,4,9,5,4,3,9,4,3,4,12,7,11,3,10,4,10 +Y,4,7,4,5,2,4,9,2,6,10,11,6,1,11,2,5 +S,7,11,9,8,11,8,6,5,3,8,6,8,5,7,11,8 +U,3,8,5,6,3,6,8,8,9,9,9,8,3,9,1,8 +N,1,1,2,2,1,7,7,11,1,5,6,8,4,8,0,8 +Z,4,8,5,6,3,8,6,2,10,11,4,9,2,8,6,9 +O,2,1,3,2,2,8,7,7,4,7,6,8,2,8,3,8 +P,6,9,5,5,2,7,9,5,3,12,4,5,4,9,4,8 +J,3,10,4,8,2,14,3,5,5,13,1,9,0,7,0,8 +O,4,9,6,7,3,8,7,9,8,7,5,8,3,8,4,8 +Z,2,4,4,2,2,7,7,2,9,12,6,8,1,8,5,8 +X,4,4,6,3,3,7,6,1,9,11,7,9,3,7,3,7 +H,5,10,7,8,8,7,7,6,7,7,6,9,3,8,4,8 +X,5,9,6,6,1,7,7,5,4,7,6,8,3,8,4,8 +H,5,6,7,4,5,5,9,3,6,10,9,9,3,9,3,6 +K,3,7,3,5,2,5,7,7,2,6,5,11,3,8,2,11 +D,5,11,6,8,7,10,6,3,6,10,3,6,3,8,3,9 +T,4,9,5,7,4,9,11,3,7,5,11,8,2,12,1,8 +A,4,11,6,8,4,8,3,2,3,6,1,8,2,7,3,7 +H,4,5,5,3,3,7,7,6,6,7,6,8,3,8,3,8 +Q,2,3,3,3,2,8,9,5,2,5,8,10,2,9,5,9 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +P,8,11,7,6,4,8,9,4,4,12,4,4,4,10,5,7 +F,6,10,8,8,9,7,6,6,4,8,7,8,4,10,8,11 +K,1,0,1,0,0,4,6,5,1,7,6,10,2,7,1,10 +H,1,0,2,0,0,7,8,11,1,7,6,8,2,8,0,8 +E,3,6,3,4,2,3,8,6,10,7,5,14,0,8,7,7 +A,2,4,4,3,2,9,2,2,1,8,2,9,2,7,2,8 +C,7,11,8,8,5,4,8,6,7,12,9,11,2,11,3,7 +H,7,12,8,6,5,11,6,3,5,10,4,6,5,9,4,8 +I,1,10,0,8,1,7,7,5,3,7,6,8,0,8,0,8 +J,1,7,2,5,1,9,6,2,7,11,4,8,0,7,1,6 +Y,9,9,7,13,5,7,11,2,3,9,10,5,4,10,6,8 +G,3,5,4,3,2,6,7,5,5,9,7,10,2,8,4,9 +X,5,10,6,7,2,7,7,5,4,7,6,8,3,8,4,8 +T,2,6,4,4,1,8,15,1,5,6,11,8,0,8,0,8 +D,3,7,5,5,4,9,7,3,5,10,4,6,3,8,2,8 +Q,5,8,5,9,5,8,6,7,2,8,7,12,3,8,6,7 +Y,3,8,5,6,1,6,9,3,1,8,13,8,2,11,0,8 +O,4,7,4,5,4,7,8,7,4,9,7,8,3,8,3,8 +B,5,9,7,7,5,8,8,4,7,10,5,5,2,8,6,10 +E,3,5,5,3,2,6,7,1,8,11,6,9,2,8,4,8 +Z,3,3,4,5,2,7,7,4,14,9,6,8,0,8,8,8 +X,7,15,8,8,5,11,7,2,8,11,4,6,3,11,4,9 +G,2,2,4,3,2,6,7,6,6,7,6,10,2,8,4,9 +M,6,10,8,8,10,7,6,7,4,6,5,8,8,8,8,9 +U,4,7,5,5,2,7,4,14,5,7,14,8,3,9,0,8 +X,4,9,7,6,4,7,7,0,8,9,6,8,2,8,3,7 +W,3,2,4,3,3,8,11,2,2,6,8,8,6,11,0,8 +M,2,3,4,2,2,8,6,3,4,9,6,8,6,5,1,7 +T,3,4,4,3,2,5,12,3,7,11,9,4,1,11,2,5 +B,2,3,4,1,2,8,7,2,5,10,5,6,1,8,4,9 +J,1,6,2,4,1,14,2,6,5,13,1,9,0,7,0,8 +I,1,3,2,2,1,7,8,1,7,13,6,7,0,8,1,7 +L,2,6,3,4,2,3,4,3,8,2,1,8,0,7,1,6 +F,3,9,5,6,3,4,11,2,6,11,10,6,1,10,3,5 +L,3,7,4,5,3,5,5,2,8,7,2,9,1,7,3,7 +N,4,9,4,6,4,8,7,12,1,6,6,8,5,9,0,8 +J,3,7,4,5,2,9,6,1,6,11,4,7,0,7,1,7 +E,4,6,6,4,4,6,8,3,7,11,8,9,3,9,4,7 +B,3,5,5,3,3,9,7,3,6,10,5,6,2,8,5,10 +G,1,0,2,0,0,8,6,5,4,6,5,9,1,8,5,10 +Y,3,9,6,6,1,5,11,3,2,10,12,7,1,11,0,8 +H,2,3,4,2,2,6,8,2,5,10,7,8,3,8,2,7 +B,6,11,8,8,7,9,7,4,7,10,4,6,3,8,6,10 +Y,7,9,5,13,4,5,11,2,4,11,10,6,4,11,6,7 +A,3,9,5,6,3,9,3,2,3,7,1,8,2,6,2,7 +R,1,0,2,1,1,6,10,7,2,7,5,8,2,7,4,10 +R,3,4,3,5,2,5,11,7,4,7,3,9,3,7,6,11 +H,7,9,7,4,3,8,8,4,5,8,5,7,6,7,4,8 +A,5,8,8,7,7,8,7,2,5,7,8,8,5,10,3,6 +D,2,6,3,4,3,8,7,5,6,6,5,4,3,8,3,7 +P,4,7,6,5,5,6,7,7,4,7,6,8,3,10,7,9 +A,2,4,3,2,1,8,2,2,2,8,2,8,2,6,2,7 +E,5,9,7,6,5,7,8,1,8,11,6,9,3,8,4,9 +Y,2,3,4,4,0,7,10,2,2,8,12,8,1,11,0,8 +V,6,8,6,6,2,4,12,4,4,10,12,7,3,9,1,8 +Q,6,7,8,11,8,10,12,6,0,4,7,11,6,15,5,8 +F,2,1,2,1,1,5,10,4,4,10,9,5,1,10,2,7 +G,5,8,6,6,6,7,7,6,2,6,6,10,4,8,7,7 +N,3,5,5,3,2,6,9,2,4,10,7,7,5,8,1,8 +Q,3,4,4,5,3,8,8,5,2,8,7,10,2,9,4,8 +X,2,5,4,3,2,7,7,3,9,6,6,8,2,8,6,8 +K,4,5,7,4,4,6,7,2,7,10,7,10,3,8,3,8 +I,1,3,2,1,0,7,7,1,6,13,6,8,0,8,0,8 +V,4,7,5,5,3,9,12,2,3,4,10,9,3,12,2,8 +K,5,9,7,8,8,8,8,2,5,8,3,8,5,4,4,10 +V,7,12,7,7,4,7,8,4,4,7,7,6,6,12,2,9 +L,3,6,5,4,5,8,8,3,5,5,7,9,6,11,6,5 +W,7,10,7,8,7,4,11,2,2,9,8,7,7,12,2,6 +D,5,8,8,6,6,8,8,5,6,10,6,5,5,9,4,10 +U,2,6,4,4,3,6,9,4,5,6,9,9,3,9,0,8 +S,6,11,8,8,5,8,7,3,6,10,5,7,2,8,5,8 +D,1,0,1,0,0,6,7,7,5,7,6,6,2,8,3,8 +V,9,14,7,8,3,7,11,5,6,10,10,5,4,11,3,8 +Z,3,8,5,6,3,6,9,2,9,11,8,7,2,9,6,7 +E,4,7,6,5,3,7,8,3,9,11,7,8,2,8,5,7 +Y,4,10,6,8,2,5,11,1,4,9,11,8,0,10,0,8 +T,2,8,3,6,2,7,13,0,5,7,10,8,0,8,0,8 +M,4,6,6,4,4,10,6,7,5,6,7,4,8,5,2,5 +L,2,1,2,3,1,4,4,5,7,2,2,5,1,7,1,6 +S,2,1,2,2,1,8,7,6,4,8,5,8,2,8,8,8 +J,1,3,3,2,1,8,6,3,6,14,5,10,0,7,0,7 +B,2,2,3,3,2,8,7,5,5,6,6,5,2,8,7,9 +Z,7,10,5,14,5,5,11,3,3,12,8,6,3,8,12,5 +S,4,8,5,6,3,10,7,4,8,11,5,7,2,9,5,9 +A,7,12,6,6,3,9,0,3,2,9,4,12,3,5,4,6 +R,3,6,3,4,3,6,9,7,3,7,5,8,2,7,5,11 +Y,1,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +U,5,6,5,4,3,4,8,5,7,9,8,9,3,9,3,5 +Y,5,8,5,6,2,3,13,4,6,13,11,4,1,11,2,5 +Z,5,11,7,8,8,6,7,3,9,7,6,10,1,8,11,5 +X,1,0,1,0,0,7,7,3,4,7,6,8,2,8,3,8 +R,7,12,7,6,5,11,5,3,5,10,3,8,6,8,6,10 +S,4,8,5,6,3,7,7,4,8,11,4,8,2,7,5,8 +Q,4,7,5,6,3,8,5,8,7,7,4,9,3,8,4,8 +D,2,5,4,4,3,8,7,5,6,9,5,5,3,8,4,8 +C,1,3,2,1,1,5,9,4,6,11,8,10,1,9,2,8 +P,6,9,5,4,2,7,9,6,3,13,5,4,4,9,4,7 +G,7,15,6,8,5,8,7,4,4,8,6,7,4,9,9,8 +Z,3,4,5,6,4,9,7,5,6,8,3,7,3,6,6,8 +N,4,8,6,6,4,5,9,2,3,9,8,8,5,8,1,7 +M,5,9,6,7,4,8,7,13,2,6,9,8,8,6,0,8 +A,3,6,4,4,2,8,2,2,2,7,2,8,2,6,3,7 +N,4,7,6,5,4,8,8,5,6,7,6,4,7,9,4,6 +Z,2,4,4,6,3,11,5,3,4,9,3,7,2,7,6,8 +T,4,8,6,6,5,6,8,7,7,8,7,8,3,10,6,9 +I,3,6,4,4,2,7,7,0,7,13,6,8,0,8,1,7 +N,3,3,5,2,2,7,9,3,4,10,6,6,5,9,1,7 +D,4,6,5,5,5,7,7,5,6,7,5,9,4,6,6,5 +X,4,11,6,8,6,6,7,2,7,7,7,10,6,5,8,7 +Z,1,1,2,2,1,7,8,5,8,6,6,9,1,8,7,7 +N,4,8,6,6,5,8,8,5,5,6,6,5,6,10,2,5 +Q,3,4,4,5,3,8,7,6,3,8,8,10,3,8,5,8 +Q,5,7,5,9,5,7,9,4,3,7,9,11,3,9,6,8 +A,1,0,2,1,0,8,4,2,0,7,2,8,2,7,1,8 +G,3,5,4,4,2,5,7,5,5,9,7,10,2,8,4,9 +W,2,4,4,2,2,8,10,2,2,6,9,8,6,11,0,8 +B,5,8,7,6,6,8,6,6,6,9,7,7,3,8,7,8 +Q,3,4,4,5,3,8,8,6,2,5,7,10,3,9,5,10 +O,2,2,3,3,2,7,7,8,4,7,6,8,2,8,3,8 +N,3,7,4,5,3,8,8,6,4,7,6,6,5,9,1,6 +I,2,8,2,6,2,7,7,0,7,7,6,8,0,8,3,8 +N,4,5,5,4,3,7,8,6,5,7,6,6,6,9,2,5 +U,4,5,5,3,2,3,8,4,6,11,11,9,3,9,1,6 +Z,4,7,6,5,5,8,8,5,3,6,4,6,4,8,8,3 +K,4,10,5,8,4,3,6,7,4,7,7,12,3,8,3,11 +C,4,6,4,4,2,3,9,5,8,10,10,12,1,8,3,7 +N,4,5,7,4,3,6,10,3,5,10,8,7,5,8,1,7 +K,3,5,5,4,3,6,7,1,7,10,7,10,3,8,3,8 +C,4,7,5,5,2,4,9,6,8,12,10,12,1,9,3,7 +R,4,6,5,4,3,10,7,3,6,10,3,6,3,7,4,10 +O,6,9,6,7,4,8,6,8,5,10,6,10,3,8,4,6 +Q,1,0,2,1,1,8,7,6,4,6,6,8,2,8,3,8 +I,1,4,2,3,1,7,8,0,6,13,6,8,0,8,0,8 +W,4,10,6,7,4,11,8,5,2,7,9,8,8,10,0,8 +X,2,1,3,2,2,8,7,3,8,6,6,8,2,8,5,8 +T,1,0,2,1,0,7,14,1,4,7,10,8,0,8,0,8 +R,4,6,4,4,2,6,12,8,3,7,3,9,2,7,5,11 +J,3,6,5,4,4,8,8,4,3,8,4,7,4,9,5,4 +K,5,9,8,7,5,8,6,1,7,10,3,9,5,6,6,10 +J,3,9,4,7,1,12,2,9,4,13,7,13,1,6,0,8 +E,3,5,5,4,3,7,7,2,7,11,6,8,2,9,5,8 +A,1,0,2,0,0,7,4,2,0,7,2,8,1,6,1,8 +C,5,7,5,5,3,5,8,6,8,12,9,13,1,9,3,7 +X,3,6,4,4,2,7,7,4,4,7,6,8,2,8,4,8 +L,2,7,3,5,2,5,5,3,8,3,2,7,0,6,2,6 +S,3,5,5,3,2,7,7,3,7,11,5,8,1,8,5,8 +N,2,1,2,2,1,7,7,12,1,5,6,8,5,8,0,8 +F,3,6,4,4,3,5,10,2,6,10,9,6,1,10,3,6 +S,6,9,8,7,5,6,7,4,7,10,10,9,2,9,5,5 +K,3,6,4,4,3,6,7,5,7,7,6,10,3,8,5,9 +O,5,9,6,6,8,7,8,5,1,7,7,8,8,9,6,10 +J,5,10,7,8,5,9,4,5,6,8,5,6,2,8,4,6 +T,3,4,4,2,1,5,11,2,7,11,9,5,1,10,2,5 +H,5,8,7,6,6,4,9,3,5,10,9,9,3,8,3,5 +Z,2,0,2,1,1,7,7,3,11,8,6,8,0,8,7,8 +X,7,15,8,8,5,6,8,2,8,11,7,8,4,9,4,6 +F,3,5,4,7,2,0,14,4,4,12,11,6,0,8,2,6 +D,6,11,8,8,8,10,7,4,6,9,3,6,3,8,3,8 +C,3,10,5,8,4,5,8,7,6,9,8,14,2,9,4,10 +B,3,7,3,5,3,6,8,9,6,6,5,7,2,8,8,9 +C,4,9,6,6,7,7,7,4,3,6,7,10,8,10,6,6 +H,5,10,5,8,5,8,7,13,1,7,7,8,3,8,0,8 +T,3,3,3,2,1,5,12,3,5,11,9,4,2,11,1,5 +J,2,7,3,5,2,9,6,1,6,11,4,8,0,7,1,7 +S,2,3,2,1,1,8,8,6,5,7,5,7,2,8,8,8 +M,3,2,4,3,3,8,6,5,3,7,7,9,9,5,1,8 +H,2,3,4,1,2,8,7,3,6,10,5,7,3,8,2,7 +N,4,7,4,5,3,8,8,12,1,6,6,7,5,8,0,9 +K,3,6,5,4,5,6,7,3,6,6,5,8,3,8,4,9 +A,2,5,4,3,2,10,2,3,2,10,2,9,2,6,2,8 +D,1,1,2,2,1,6,7,8,6,6,6,6,2,8,3,8 +P,4,6,6,4,3,8,10,3,5,13,4,3,1,10,3,9 +I,1,4,3,3,1,7,7,1,7,14,6,8,0,8,1,8 +J,6,11,5,8,4,9,8,2,3,12,5,6,2,9,7,9 +J,2,10,3,8,2,12,3,7,3,12,5,11,1,6,0,8 +F,3,8,3,6,1,1,13,5,3,12,10,6,0,8,2,6 +K,6,7,8,5,5,7,8,2,7,10,5,9,4,7,3,7 +W,4,9,6,6,3,4,8,5,1,7,9,8,8,10,0,8 +V,4,5,7,8,2,7,8,4,3,7,14,8,3,9,0,8 +I,1,1,1,1,0,7,7,2,8,7,6,8,0,8,3,8 +O,2,3,3,2,2,7,7,7,5,7,6,8,2,8,3,8 +P,4,7,6,5,3,7,11,5,4,12,4,1,1,10,3,8 +W,4,4,6,6,3,8,8,4,1,7,8,8,8,9,0,8 +U,4,8,5,6,5,7,6,9,5,7,6,9,4,9,6,4 +O,3,8,4,6,3,7,7,8,4,10,6,8,3,8,3,7 +U,5,9,7,6,4,4,8,7,9,9,10,11,3,9,1,7 +I,3,9,4,6,2,7,8,0,8,14,6,6,0,8,1,7 +X,2,3,3,2,1,7,7,1,8,10,6,8,2,8,2,7 +J,2,8,3,6,2,9,6,3,6,11,4,9,1,6,2,6 +B,4,2,5,4,4,8,7,5,6,6,5,5,2,8,7,10 +Q,2,3,3,4,2,7,9,4,1,7,8,10,2,9,4,8 +G,4,7,4,5,3,7,6,6,6,10,6,12,2,10,4,9 +Q,7,8,7,9,7,8,7,6,2,7,7,11,5,9,7,7 +J,7,11,9,8,6,9,4,5,6,8,5,6,2,7,5,6 +D,8,12,8,6,4,11,3,3,6,10,2,8,4,7,3,12 +U,4,10,6,7,9,10,8,4,4,5,8,8,9,8,8,6 +P,4,10,5,8,4,6,10,6,5,9,7,3,2,10,4,7 +X,4,8,5,6,1,7,7,4,4,7,6,8,3,8,4,8 +B,3,6,4,4,4,8,7,5,6,7,6,6,2,8,6,9 +G,4,8,5,6,3,7,7,8,6,7,6,12,3,8,4,9 +W,3,4,5,6,3,6,8,4,1,7,8,8,8,10,0,8 +G,2,4,3,3,2,6,7,5,5,9,7,10,2,9,4,9 +A,4,9,5,6,4,7,5,3,0,6,1,8,2,7,1,7 +R,4,8,6,6,6,6,7,5,6,7,6,7,3,7,5,9 +B,2,4,3,2,2,10,7,2,6,10,4,6,2,8,4,10 +X,8,11,7,6,3,7,7,2,9,9,7,9,4,11,4,7 +N,3,4,5,3,2,6,9,3,4,11,8,8,5,7,1,8 +K,7,10,10,7,8,8,6,1,7,9,5,9,5,7,5,8 +B,4,8,6,6,6,7,8,6,4,7,5,6,4,7,6,6 +E,3,7,4,5,3,4,9,2,8,10,8,10,2,8,4,5 +E,4,8,4,6,2,3,6,6,11,7,7,15,0,8,7,7 +W,4,6,6,4,5,7,11,2,2,7,8,8,6,11,1,8 +A,3,9,5,7,3,13,3,3,2,11,1,8,2,6,3,9 +U,3,5,4,4,2,6,8,6,7,7,9,9,3,9,1,8 +M,3,4,5,2,3,8,6,6,4,7,7,9,9,5,2,8 +J,5,9,7,7,3,9,6,3,7,15,5,10,1,6,1,7 +C,5,4,6,6,2,6,7,7,11,7,6,14,1,8,4,9 +M,3,6,4,4,4,7,6,6,4,6,7,8,7,5,2,7 +P,4,7,6,5,3,8,9,3,5,13,5,4,1,10,2,8 +I,1,5,1,3,1,7,7,1,7,7,6,8,0,8,3,8 +D,5,10,7,7,6,11,6,2,6,11,3,7,3,8,3,9 +E,5,11,7,8,5,5,9,4,9,11,9,8,3,8,5,5 +S,4,7,5,5,3,10,6,4,8,11,3,8,2,8,5,10 +I,3,8,6,6,5,8,8,4,5,9,6,4,5,10,4,6 +W,8,13,8,7,5,4,8,1,3,8,9,8,9,11,2,5 +C,3,7,4,5,2,3,8,5,8,9,9,13,1,8,3,7 +F,4,9,4,6,2,1,13,5,3,12,10,6,0,8,2,6 +C,3,7,4,5,2,3,9,6,7,11,11,11,1,8,2,6 +Z,4,8,5,6,3,7,7,3,12,9,6,8,0,8,8,8 +F,5,10,7,8,5,8,9,2,6,13,6,5,2,10,2,8 +R,7,11,10,8,11,5,8,3,5,6,5,10,8,9,9,6 +A,5,10,8,8,5,11,3,1,2,8,2,9,4,6,3,8 +V,5,9,5,7,4,3,11,2,3,9,11,8,2,11,1,8 +Z,4,5,5,8,2,7,7,4,14,9,6,8,0,8,8,8 +I,1,3,2,2,1,7,8,0,6,13,6,7,0,8,0,7 +O,10,13,7,8,4,7,7,5,5,8,4,7,5,9,6,8 +D,1,0,1,0,0,6,7,6,4,7,6,6,2,8,2,8 +M,3,4,4,2,3,7,6,6,4,6,7,8,6,6,2,8 +S,6,12,6,6,3,7,8,3,6,13,6,7,2,8,3,7 +E,6,10,9,8,6,4,9,4,9,12,10,9,3,8,5,5 +D,6,11,9,8,8,7,8,6,6,10,7,5,7,9,6,11 +I,2,5,4,4,1,7,7,0,7,13,6,8,0,8,1,8 +Q,5,5,7,8,4,8,9,7,6,6,8,9,3,7,6,10 +M,5,5,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +P,4,7,5,5,3,6,10,7,3,10,5,4,2,10,3,8 +N,6,10,9,8,5,8,8,3,5,10,5,6,6,8,2,7 +F,5,5,5,7,2,1,14,5,4,12,10,6,0,8,2,5 +P,6,10,8,8,5,6,12,5,3,12,5,2,1,11,3,8 +T,5,10,6,8,4,7,9,0,8,11,9,6,1,10,3,4 +U,2,6,3,4,1,8,5,13,5,6,13,8,3,9,0,8 +O,4,10,6,8,3,8,8,9,8,6,7,10,3,8,4,8 +O,5,9,6,6,5,7,7,7,4,9,6,10,4,8,4,7 +S,5,10,7,7,4,9,6,3,7,10,6,9,2,10,5,9 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +B,4,10,5,8,6,8,7,7,6,7,6,6,2,8,7,10 +N,3,2,3,3,2,7,8,5,4,7,6,7,4,8,1,7 +X,3,7,5,5,3,8,7,4,9,6,6,8,3,8,7,9 +Q,3,6,4,6,2,8,6,8,6,6,6,8,3,8,4,8 +P,2,1,2,2,1,5,10,4,4,9,7,4,1,10,3,7 +L,5,10,7,8,4,7,3,2,9,7,1,9,1,6,3,7 +W,3,5,5,4,4,9,11,3,2,5,9,7,7,11,1,8 +N,3,7,5,5,3,6,9,6,5,8,7,8,5,8,1,7 +O,4,9,5,6,4,8,7,8,5,7,7,7,3,8,3,8 +V,7,11,9,8,6,5,12,3,2,9,10,7,5,10,6,8 +G,4,8,6,6,3,6,6,6,7,7,5,9,3,10,4,8 +F,3,4,3,5,1,1,14,5,3,12,9,5,0,8,2,6 +L,2,4,4,3,2,6,4,1,8,8,2,11,0,7,2,8 +B,4,5,5,8,4,6,7,10,7,7,6,7,2,8,9,9 +I,1,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +X,4,4,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +D,4,8,5,6,8,9,7,5,5,7,6,6,4,7,7,6 +I,1,8,2,6,2,7,7,0,8,7,6,8,0,8,3,8 +D,2,7,4,5,4,7,7,4,6,7,6,6,3,8,2,7 +C,6,11,7,8,4,5,8,8,9,9,9,13,2,9,4,9 +G,4,6,5,4,3,6,7,6,6,9,8,9,2,8,4,9 +V,1,1,2,1,0,7,9,4,2,7,13,8,2,10,0,8 +T,5,5,5,4,2,5,12,3,7,12,9,4,1,11,1,5 +K,5,7,7,5,4,4,8,2,7,10,10,11,3,8,4,6 +C,7,11,7,8,4,5,7,6,8,12,9,14,2,10,4,7 +Z,4,5,5,7,2,7,7,4,15,9,6,8,0,8,8,8 +W,6,10,6,8,7,4,10,3,2,9,7,8,8,12,3,5 +E,4,9,4,7,3,3,8,6,12,7,5,15,0,8,7,7 +B,7,12,6,6,4,8,6,4,5,10,5,8,6,7,7,10 +B,4,7,6,5,4,10,6,3,7,10,4,7,3,8,5,11 +K,2,1,3,3,2,6,7,4,7,7,6,10,3,8,5,9 +M,2,3,4,1,2,8,6,3,4,9,6,7,6,5,1,7 +H,4,4,6,6,5,9,9,3,1,7,7,8,4,9,8,8 +C,6,8,8,7,7,5,7,4,5,7,6,11,4,9,8,9 +V,7,12,7,6,4,9,8,4,5,8,8,5,6,10,3,6 +F,4,10,6,8,3,4,13,6,5,12,10,3,2,10,2,4 +T,3,8,4,6,2,9,13,0,5,6,10,8,0,8,0,8 +Y,5,10,7,8,3,7,10,1,3,7,12,8,1,11,0,8 +F,3,7,3,4,1,2,14,5,2,12,9,4,0,8,3,6 +X,2,3,3,2,2,8,7,3,8,6,6,6,2,8,6,8 +D,5,8,7,6,6,8,7,5,6,9,4,5,3,8,4,9 +R,2,0,2,1,1,6,10,7,2,7,5,7,2,7,4,9 +Y,1,3,2,2,1,6,11,1,7,8,11,9,1,11,2,8 +X,4,8,6,6,4,7,7,3,9,5,6,8,3,8,7,8 +O,4,6,4,4,4,6,9,7,4,9,8,8,3,8,3,7 +C,8,12,5,7,3,5,10,6,8,11,8,8,1,8,6,8 +H,3,3,4,4,2,7,7,14,1,7,6,8,3,8,0,8 +A,3,9,5,7,3,9,3,2,2,8,1,8,2,6,3,7 +X,6,10,9,8,4,5,8,2,9,11,12,10,4,7,4,5 +R,5,8,8,7,8,8,8,3,3,7,5,8,7,8,6,4 +T,5,7,6,6,6,5,8,4,8,9,7,10,3,7,7,5 +C,5,4,6,7,2,7,6,7,11,9,5,13,1,9,4,8 +D,8,14,8,8,4,11,4,3,6,10,2,7,5,7,4,12 +N,1,3,3,2,1,5,9,3,3,10,8,8,4,8,0,7 +A,4,6,6,5,5,8,8,3,5,7,8,7,5,10,4,6 +A,3,8,5,6,3,7,5,3,0,7,1,8,2,7,1,8 +A,3,11,6,8,4,12,2,2,2,9,2,9,2,6,3,8 +B,4,9,6,7,5,8,7,6,6,9,6,6,3,8,7,8 +V,1,0,2,0,0,8,9,3,2,6,12,8,2,10,0,8 +D,5,5,6,7,3,5,7,10,10,6,6,6,3,8,4,8 +X,2,3,3,2,2,7,7,3,9,6,6,8,2,8,5,8 +D,6,11,6,6,3,10,4,3,6,9,3,7,4,7,4,11 +J,2,5,4,4,1,9,6,2,7,14,5,10,1,6,1,7 +H,5,11,5,8,3,7,9,15,2,7,3,8,3,8,0,8 +E,2,3,4,2,2,7,7,2,7,11,7,9,2,8,4,8 +I,3,9,4,6,3,8,7,0,7,13,6,8,0,8,1,8 +U,7,9,6,5,3,4,4,5,5,4,7,8,5,7,2,7 +C,7,10,9,8,6,7,7,8,7,6,7,8,5,6,5,9 +I,7,14,5,8,2,9,7,6,4,13,3,7,3,7,6,11 +T,4,6,5,6,5,5,8,4,7,8,8,9,3,8,7,6 +A,2,4,3,3,1,10,2,3,2,10,2,9,2,6,2,8 +K,8,13,8,8,4,8,7,3,6,9,7,8,6,11,4,7 +W,5,8,8,6,3,7,7,5,2,7,8,8,9,9,0,8 +Q,4,7,5,9,6,8,6,8,2,5,6,9,3,8,5,10 +T,5,10,6,8,4,5,11,1,9,8,11,9,1,10,1,7 +Z,1,0,2,1,0,7,7,2,11,8,6,8,0,8,6,8 +B,5,4,5,6,4,7,9,9,8,7,5,7,2,8,9,9 +P,4,6,6,4,3,7,10,3,4,13,6,3,1,10,3,9 +V,6,11,6,6,3,5,9,4,3,10,8,5,5,12,2,7 +P,2,1,2,1,1,5,11,7,2,9,6,4,1,9,3,8 +H,3,6,4,4,2,7,8,14,1,7,5,8,3,8,0,8 +X,7,10,10,8,6,9,6,1,8,10,3,7,3,8,3,9 +P,4,9,6,6,4,5,10,6,5,10,8,3,1,10,4,6 +C,0,0,1,0,0,6,7,5,7,7,6,14,0,8,3,10 +G,3,4,4,3,2,7,6,6,6,6,6,10,2,9,4,9 +G,3,5,4,4,3,6,7,5,5,9,7,10,2,8,4,10 +X,9,11,8,6,3,7,7,2,9,9,6,8,4,9,4,8 +Z,5,8,6,6,4,7,8,2,10,12,7,6,1,7,6,6 +W,6,11,9,8,7,5,9,5,1,7,9,8,8,11,0,7 +I,2,8,3,6,1,9,7,0,8,14,5,8,0,8,1,8 +Z,2,4,4,3,2,8,7,2,9,12,6,7,1,8,5,8 +C,2,6,3,4,2,6,8,8,8,9,8,13,1,9,4,10 +W,3,7,6,5,4,5,10,2,3,8,9,9,7,11,1,8 +G,4,7,5,5,3,6,7,7,7,10,7,9,2,10,4,9 +X,3,3,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +R,3,7,3,5,2,6,9,9,5,7,5,8,3,8,5,10 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +N,5,9,8,7,5,10,7,3,5,10,2,5,6,9,1,7 +W,8,10,8,5,4,1,9,3,3,11,12,9,8,10,1,6 +K,7,10,10,8,6,4,9,2,7,10,9,10,5,6,4,5 +U,4,7,4,5,3,7,6,12,4,7,12,8,3,9,0,8 +B,8,12,6,6,4,7,7,5,6,10,5,8,6,6,7,10 +H,4,5,6,4,4,7,7,3,6,10,6,8,3,8,3,8 +E,4,7,5,5,4,10,6,2,7,11,4,8,4,9,5,12 +C,3,7,5,5,5,5,7,3,4,7,6,10,5,10,3,8 +Q,3,6,4,8,4,8,11,4,3,5,9,11,2,10,5,8 +P,6,11,8,8,5,5,11,7,4,11,7,2,1,10,4,6 +L,3,7,3,5,1,0,1,5,6,0,0,6,0,8,0,8 +E,0,0,1,0,0,5,7,5,6,7,6,12,0,8,6,10 +K,1,1,2,1,1,6,7,4,7,7,6,11,3,8,4,9 +R,4,4,4,6,3,5,11,8,4,7,2,9,3,7,6,11 +O,1,0,1,0,0,7,6,6,3,7,6,7,2,8,3,8 +K,4,9,6,7,4,5,7,5,7,6,6,10,4,8,5,9 +V,5,6,5,4,2,3,12,4,4,10,12,7,2,10,1,7 +F,5,8,7,6,4,7,9,3,6,13,6,5,2,9,3,7 +T,2,4,3,3,1,7,11,2,7,6,11,8,1,10,1,8 +S,2,6,3,4,2,7,6,5,8,4,6,8,0,9,8,8 +Q,3,7,4,6,3,8,7,7,4,6,6,9,2,8,4,9 +V,2,0,3,1,0,7,9,4,2,7,13,8,2,10,0,8 +U,3,6,4,4,2,7,4,14,5,7,12,8,3,9,0,8 +P,1,0,2,0,0,5,11,6,1,9,6,5,1,9,3,8 +J,1,1,2,3,1,11,6,2,6,12,3,7,0,7,1,8 +S,6,9,7,6,4,8,8,4,10,11,4,7,2,6,5,9 +M,10,15,12,9,6,10,2,3,2,10,3,9,8,1,1,8 +T,3,9,4,7,4,7,11,3,6,7,11,9,2,12,1,8 +U,5,6,6,4,3,3,9,5,7,11,11,9,3,9,2,6 +F,3,7,3,4,1,1,13,5,4,12,10,7,0,8,2,6 +X,3,5,6,3,3,7,7,1,8,10,6,8,2,8,3,8 +L,7,11,6,6,3,10,2,4,4,12,5,13,2,7,5,9 +X,4,6,5,5,5,8,8,2,4,7,6,8,3,8,7,7 +F,7,12,6,6,3,8,8,3,7,12,4,5,2,8,7,7 +J,7,8,4,12,4,7,9,3,4,13,4,5,3,8,7,10 +T,5,9,5,6,3,5,12,3,8,12,9,4,1,11,2,4 +Y,3,9,5,6,2,9,11,1,3,5,11,8,1,10,0,8 +A,3,8,5,5,2,7,5,3,1,6,1,8,2,7,2,7 +F,4,7,6,5,3,5,11,3,5,13,8,5,1,10,2,7 +I,2,9,2,7,3,7,7,0,7,7,6,8,0,8,3,8 +U,3,2,4,4,2,6,8,6,7,6,9,9,3,9,1,7 +I,0,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +E,4,5,6,4,5,6,8,4,4,8,7,9,4,11,8,10 +H,8,10,11,8,6,7,8,3,7,10,8,8,6,8,5,7 +M,4,2,6,3,4,8,6,6,5,6,7,8,8,7,3,6 +N,3,6,4,4,2,7,7,14,2,5,6,8,6,8,0,8 +S,3,8,4,6,2,7,6,6,10,5,7,10,0,9,9,8 +L,10,15,8,8,4,9,2,4,5,12,4,13,2,7,6,8 +F,3,5,5,6,4,6,9,3,4,8,7,7,4,10,8,9 +H,5,9,8,7,7,8,8,5,7,7,6,7,6,8,4,7 +W,5,6,7,5,8,6,7,6,5,6,5,8,8,10,8,10 +N,4,7,6,5,3,11,6,4,5,10,1,5,5,9,1,7 +H,7,9,10,7,6,5,8,4,7,10,9,10,3,8,3,6 +I,2,8,4,6,4,10,6,1,4,8,5,5,3,8,5,7 +D,3,5,5,4,3,9,6,4,7,10,4,6,2,8,3,9 +D,4,11,5,8,5,5,7,10,7,6,5,6,3,8,3,8 +Q,4,7,5,7,4,8,7,7,5,6,4,9,2,8,3,8 +J,6,7,8,9,7,8,8,4,6,7,6,7,4,8,8,8 +V,3,8,5,6,3,6,11,2,3,7,11,9,2,10,1,8 +J,2,7,3,5,1,9,6,3,7,12,4,9,0,7,2,6 +C,2,4,3,3,2,6,8,7,7,8,7,13,1,9,4,10 +O,7,11,7,8,5,8,7,8,5,10,6,8,3,8,3,8 +J,7,10,5,8,4,8,10,3,3,13,4,5,2,9,7,9 +F,5,6,6,7,6,7,9,6,6,7,6,9,5,8,8,6 +T,6,10,6,7,5,5,11,3,7,11,10,5,2,12,2,4 +X,3,6,4,4,3,8,7,3,8,6,6,8,2,8,6,8 +G,6,10,7,8,4,6,7,7,8,10,7,10,2,10,5,9 +S,3,9,4,6,3,8,7,8,7,7,7,9,2,10,9,8 +O,2,4,2,3,2,8,7,6,3,9,6,8,2,8,2,8 +E,5,8,7,6,4,7,7,3,8,12,7,9,3,8,5,8 +R,4,4,4,5,2,5,10,8,4,7,4,8,3,7,6,11 +Y,4,7,6,5,3,9,10,1,7,3,11,8,1,11,2,9 +B,3,6,5,4,4,7,8,5,5,9,6,6,3,8,7,8 +T,3,11,4,8,1,5,14,1,6,9,11,7,0,8,0,8 +F,4,8,5,6,4,4,11,6,5,11,10,5,2,9,2,5 +Q,6,9,7,11,8,7,9,5,3,8,10,10,5,8,8,10 +R,5,7,8,6,8,9,7,4,4,8,5,7,8,10,7,5 +E,3,9,4,6,2,3,7,6,11,7,6,15,0,8,7,7 +V,3,5,5,4,2,4,12,3,3,9,11,8,2,11,0,8 +O,4,8,5,6,2,8,6,8,7,7,5,8,3,8,4,8 +W,12,14,12,8,5,2,9,3,2,10,12,8,9,10,1,6 +K,4,2,5,3,3,6,7,4,8,7,6,10,6,8,5,9 +A,3,9,6,6,3,11,3,2,2,9,2,9,3,5,3,8 +U,5,7,6,5,3,4,8,6,8,10,10,9,3,9,2,5 +X,4,10,6,7,6,7,7,2,6,7,6,7,4,7,6,7 +W,6,9,9,7,7,4,10,2,3,8,9,9,10,9,1,8 +M,7,10,10,8,9,11,6,2,5,9,4,6,10,7,2,8 +L,3,8,4,6,1,0,0,6,6,0,1,5,0,8,0,8 +Q,4,9,6,8,3,9,8,8,6,5,8,9,3,8,5,9 +H,6,9,6,4,3,9,6,4,4,9,7,8,6,12,4,9 +N,1,0,1,0,0,7,7,9,0,6,6,8,3,8,0,8 +N,4,8,6,6,3,5,9,3,4,10,9,9,5,8,1,7 +Q,2,2,3,3,2,8,8,6,1,5,6,9,2,9,4,10 +E,5,8,7,6,6,6,8,3,7,11,9,9,3,8,5,6 +K,2,6,3,4,2,3,7,6,2,7,6,10,3,8,2,11 +G,3,6,4,4,4,7,8,5,3,6,6,10,3,8,6,8 +I,2,8,3,6,1,7,7,0,8,14,6,9,0,8,1,8 +C,4,9,6,7,4,5,8,6,6,8,8,15,3,10,4,9 +E,2,4,2,3,2,7,7,5,6,7,6,8,2,8,5,11 +G,2,1,3,2,1,6,7,5,5,6,6,9,2,9,4,8 +B,3,5,5,4,4,9,6,3,6,10,5,7,2,8,5,10 +T,4,10,6,8,4,6,12,3,7,7,12,8,2,12,1,7 +P,2,3,4,2,2,8,8,3,3,12,4,5,1,9,2,8 +J,4,9,6,7,3,6,7,3,5,15,6,10,1,6,1,7 +M,2,3,3,1,2,6,6,6,4,7,7,10,6,5,1,9 +U,4,3,4,2,2,5,8,5,7,10,9,9,3,9,2,6 +L,7,10,9,8,7,6,7,7,7,6,6,8,6,8,5,10 +N,5,7,7,5,3,5,9,3,5,10,9,9,6,7,1,7 +W,5,10,8,8,13,9,7,5,2,7,7,8,10,10,3,5 +I,7,12,5,6,2,10,5,6,4,13,3,9,3,8,4,9 +V,10,15,10,8,5,6,8,4,4,8,8,5,6,12,4,6 +Z,6,9,8,7,4,9,6,3,10,11,4,9,1,7,6,8 +M,5,5,6,8,4,8,7,12,2,6,9,8,9,6,0,8 +E,5,5,5,7,3,3,8,6,12,7,5,15,0,8,7,7 +A,2,2,4,3,2,8,2,2,2,8,2,8,2,6,3,7 +M,4,7,8,5,8,10,6,3,3,9,4,7,10,5,3,6 +D,1,0,2,0,0,6,7,7,6,7,6,6,2,8,3,8 +Z,5,5,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +N,8,11,11,8,6,12,7,3,6,10,0,3,7,11,2,8 +J,2,5,5,3,1,8,6,3,7,15,6,10,1,6,1,7 +Y,6,11,9,8,8,8,4,6,5,8,7,8,6,8,8,3 +X,4,9,6,7,4,8,7,4,9,6,6,6,3,8,7,7 +B,2,3,4,2,2,8,7,3,5,10,5,6,2,8,4,9 +A,3,11,5,8,4,12,3,3,3,10,1,9,2,6,3,8 +T,5,7,6,5,6,6,8,4,6,7,6,10,5,8,5,7 +H,3,2,4,4,3,7,7,5,6,7,6,8,6,8,4,8 +H,4,9,5,6,2,7,6,15,1,7,8,8,3,8,0,8 +H,3,7,3,4,2,7,6,14,1,7,7,8,3,8,0,8 +Y,4,5,5,7,5,10,11,5,4,5,8,8,5,10,9,5 +V,4,6,4,4,2,3,11,4,3,10,12,7,2,10,1,8 +K,5,11,6,8,2,4,6,9,2,7,7,12,4,8,3,11 +X,3,7,5,5,2,9,7,1,8,10,4,7,3,8,3,8 +Q,5,8,6,7,3,9,8,8,6,5,8,9,3,7,5,9 +S,5,8,6,6,4,8,8,4,8,10,4,6,2,7,5,8 +C,4,9,5,6,3,4,8,5,6,12,10,12,2,9,2,7 +B,1,0,2,1,1,7,7,7,5,6,6,7,1,8,7,9 +B,5,11,7,8,7,8,7,7,7,6,6,5,2,8,8,10 +H,5,9,7,6,4,7,6,3,7,10,8,9,3,8,3,7 +X,3,5,5,4,3,7,7,3,9,6,6,8,3,8,6,8 +H,3,7,4,4,2,7,7,14,1,7,6,8,3,8,0,8 +Z,3,8,5,6,3,8,7,2,9,11,5,9,1,8,6,8 +S,7,11,7,6,3,7,6,3,4,13,8,8,3,8,4,7 +M,5,2,6,4,4,9,6,7,4,6,7,5,10,5,3,5 +V,1,0,1,0,0,8,10,3,1,7,12,8,2,11,0,8 +W,4,7,6,5,3,9,8,5,1,7,8,8,8,9,0,8 +F,4,8,6,6,4,7,9,2,6,13,6,5,2,10,2,8 +O,5,9,5,7,4,7,7,8,5,9,7,10,3,8,4,6 +T,4,9,5,7,3,6,11,2,8,8,12,8,1,11,1,7 +O,4,10,5,8,3,9,7,9,7,7,6,10,3,8,4,8 +B,5,7,7,5,5,8,6,6,7,9,7,6,3,8,8,7 +T,4,8,5,6,4,6,7,7,6,8,10,8,3,9,5,9 +X,3,7,4,5,2,7,7,4,4,7,6,7,2,8,4,8 +C,9,12,7,7,5,7,9,4,5,9,8,9,4,9,8,11 +N,6,5,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +X,6,10,9,8,5,7,8,1,8,10,6,8,3,8,4,8 +Q,5,7,6,5,5,8,6,7,4,4,8,10,6,6,7,10 +V,2,1,4,1,1,7,12,3,2,6,11,9,2,11,0,7 +D,2,3,4,2,2,9,6,4,6,10,4,6,2,8,3,8 +K,5,9,8,7,4,4,9,2,7,10,10,11,3,8,3,6 +A,3,11,6,8,2,8,6,3,1,7,0,8,3,7,2,8 +V,3,6,4,4,2,2,11,4,3,11,12,8,2,10,1,8 +H,4,8,5,6,5,8,7,5,6,7,6,8,6,8,3,7 +D,1,0,1,0,0,6,7,7,5,7,6,6,2,8,2,8 +G,3,8,4,6,2,7,6,8,7,6,5,11,1,8,5,11 +J,2,5,3,8,1,12,3,10,4,13,5,13,1,6,0,8 +C,2,5,3,4,2,6,8,7,7,8,8,13,1,9,4,10 +G,5,10,6,8,3,7,6,8,8,6,6,8,2,8,6,11 +K,5,5,5,8,2,3,6,8,3,7,7,11,4,8,3,11 +V,3,9,5,6,1,7,8,4,2,7,14,8,3,9,0,8 +C,3,4,4,3,2,4,8,4,6,11,10,12,1,9,2,7 +M,5,10,6,8,4,8,7,12,2,6,9,8,8,6,0,8 +F,5,8,7,6,7,7,8,1,4,10,6,6,5,10,3,5 +Y,2,3,3,4,0,8,11,1,3,5,11,8,0,10,0,8 +C,3,5,4,3,2,4,8,5,8,11,9,13,1,9,3,7 +Q,6,8,9,12,14,8,5,6,1,6,6,9,10,10,8,14 +H,9,15,8,8,5,6,7,5,4,8,10,9,7,11,5,9 +U,9,11,8,6,4,9,6,6,7,3,9,7,5,9,3,5 +D,5,10,6,8,6,7,7,7,7,7,6,5,3,8,3,7 +H,5,10,7,8,10,8,9,5,3,6,7,7,7,9,9,8 +O,6,10,8,8,10,8,9,6,1,7,7,8,9,8,5,9 +W,3,7,5,5,7,9,5,5,2,7,6,8,5,10,2,5 +S,4,7,6,5,6,8,9,4,4,9,5,7,4,9,10,9 +U,2,3,3,2,1,5,8,4,7,10,8,8,3,9,2,6 +Y,6,11,6,8,3,4,10,2,7,10,11,6,1,11,3,4 +N,3,8,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +N,7,12,6,6,3,5,9,4,5,4,4,11,5,9,2,7 +M,4,2,5,4,4,8,6,6,4,7,7,8,7,5,2,7 +E,2,7,4,5,4,7,8,3,5,5,7,10,3,11,7,8 +I,1,3,2,2,1,7,8,1,7,13,6,8,0,8,1,7 +Z,2,3,2,2,2,7,7,5,9,6,6,8,1,8,6,8 +B,2,4,2,3,2,7,7,5,5,6,6,6,2,8,5,9 +B,7,11,9,8,7,9,6,4,7,10,5,6,3,8,6,10 +G,6,10,8,8,8,6,6,6,3,6,6,10,5,8,8,7 +P,4,9,5,6,2,3,14,7,1,11,6,3,0,10,4,8 +P,3,4,5,6,7,8,5,5,2,7,6,7,6,9,6,9 +U,3,5,5,3,2,7,9,6,7,7,10,9,3,9,1,8 +K,8,10,11,8,5,4,8,4,9,12,12,11,3,8,4,5 +V,6,10,5,5,2,8,10,6,3,7,9,5,6,13,3,7 +C,9,14,7,8,5,7,6,4,4,9,8,11,4,9,9,11 +W,3,8,5,6,5,6,11,2,2,7,8,8,6,11,1,8 +V,4,7,6,5,4,8,11,2,2,6,10,8,4,10,4,9 +C,5,5,6,8,2,6,7,7,10,8,6,15,1,9,4,9 +E,2,3,3,2,1,7,7,2,7,11,7,9,1,8,3,8 +O,4,9,5,7,2,7,7,9,8,7,5,8,3,8,4,8 +O,1,1,2,1,1,7,7,6,4,7,6,8,2,8,2,8 +E,4,7,6,5,4,6,8,3,7,11,8,8,3,8,4,6 +C,2,1,2,1,1,6,7,6,9,7,6,13,0,8,4,9 +O,3,5,4,4,2,8,6,7,4,9,5,8,2,8,3,8 +A,3,8,6,6,4,8,5,2,4,6,2,6,2,6,2,6 +N,4,10,4,7,3,7,7,14,2,4,6,8,6,8,0,8 +Z,3,9,4,7,3,7,8,3,11,8,6,8,0,8,7,7 +A,6,9,6,5,3,13,0,5,1,12,3,11,2,3,2,10 +S,4,5,5,5,6,7,7,5,4,7,7,7,5,8,10,10 +I,3,10,6,8,7,10,6,2,5,8,4,5,3,8,5,7 +F,6,10,8,7,6,6,10,2,6,13,7,6,2,10,2,7 +L,3,7,4,5,2,4,5,1,9,7,2,11,0,8,2,7 +V,7,8,9,7,10,8,7,4,5,7,6,8,8,10,9,4 +G,5,11,6,8,8,8,4,4,3,7,5,11,6,8,6,13 +G,5,9,4,5,2,7,4,4,2,7,4,5,4,7,5,8 +L,5,10,7,8,4,7,3,2,9,7,1,9,1,6,3,7 +P,3,6,4,4,2,5,12,7,3,12,6,3,1,10,4,7 +A,3,8,5,6,3,11,2,3,3,10,2,9,2,6,3,8 +P,3,7,5,10,8,7,12,4,1,9,8,5,4,11,4,8 +C,5,8,6,6,2,6,7,7,10,6,6,15,1,8,4,9 +M,4,2,5,4,4,8,6,6,4,7,7,8,7,5,2,8 +U,2,1,2,2,1,7,9,5,5,6,9,9,3,9,1,8 +Y,5,6,5,4,3,5,9,1,7,9,10,6,1,11,3,5 +D,7,10,9,8,7,7,7,5,6,7,6,7,7,8,3,8 +Y,9,9,7,13,5,7,8,4,3,6,11,5,5,10,6,6 +Y,4,5,5,4,2,4,11,2,7,11,10,6,1,11,2,5 +T,4,9,4,4,2,5,10,2,6,11,8,6,2,9,4,3 +W,4,9,5,6,6,7,6,6,2,7,7,8,6,8,4,8 +B,5,11,8,8,11,9,7,4,4,6,7,7,8,8,8,7 +E,3,5,6,4,3,6,8,2,9,11,8,8,2,8,4,6 +X,3,9,5,7,4,8,7,3,8,5,6,8,3,8,6,8 +S,2,7,3,5,3,8,7,7,5,7,7,8,2,9,8,8 +U,5,5,6,4,3,4,8,5,8,10,8,9,3,9,2,6 +T,4,6,5,4,4,7,7,7,7,7,6,8,3,10,6,8 +U,3,4,4,3,2,5,8,5,7,9,8,8,3,9,2,5 +V,3,8,5,6,2,5,11,3,4,9,12,9,3,10,1,9 +J,4,6,5,4,2,9,7,0,7,13,5,7,0,8,0,8 +B,5,10,5,5,5,7,8,3,5,9,6,7,6,5,7,8 +H,1,0,1,0,0,7,8,10,1,7,6,8,2,8,0,8 +D,6,11,8,8,7,7,7,6,6,7,7,7,7,7,3,7 +S,3,3,4,4,2,7,7,5,8,5,6,8,0,8,8,8 +L,1,4,2,3,1,7,4,1,7,7,2,10,0,7,2,8 +Q,6,8,7,10,6,8,6,7,4,8,7,11,4,9,7,7 +H,3,3,5,2,2,9,6,3,6,10,4,8,3,8,3,9 +M,4,3,5,5,3,7,7,12,1,7,9,8,8,6,0,8 +C,1,0,1,1,0,7,7,5,7,7,6,14,0,8,4,10 +R,3,2,4,4,3,7,8,5,5,6,5,6,3,7,4,8 +G,1,0,2,1,0,8,6,6,4,6,5,9,1,8,5,10 +A,2,6,5,4,3,6,5,1,3,5,2,7,2,6,3,4 +O,4,7,4,5,3,9,6,7,5,10,4,10,3,8,3,8 +I,1,6,3,4,3,9,6,3,4,7,6,5,3,8,5,5 +V,4,8,4,6,2,3,11,4,4,11,12,8,2,10,1,8 +V,1,0,2,1,0,7,9,3,2,7,12,8,2,10,0,8 +A,5,12,5,6,3,14,0,4,2,12,3,11,2,4,2,10 +K,3,2,4,4,3,5,7,3,7,6,6,10,6,8,4,9 +V,3,5,4,3,1,4,12,4,4,11,11,7,2,11,1,8 +C,7,10,7,7,4,4,10,7,8,12,10,9,2,10,3,6 +L,4,6,5,4,3,6,6,7,6,6,6,8,2,8,4,10 +H,2,1,2,1,2,8,8,6,6,7,6,8,3,8,3,8 +U,5,6,6,4,3,4,9,5,7,11,11,9,3,9,2,7 +N,3,5,4,3,3,7,9,5,5,7,6,6,5,9,2,6 +D,4,10,6,8,4,8,7,7,7,10,5,4,3,7,5,9 +Q,3,3,4,4,3,8,7,6,2,8,7,9,2,9,4,8 +X,3,5,5,3,2,8,7,3,9,6,6,9,3,7,7,9 +N,4,11,5,8,5,7,7,13,1,6,6,8,6,9,1,6 +N,1,0,1,0,0,7,7,10,0,5,6,8,4,8,0,8 +L,3,9,5,7,7,7,8,3,5,6,6,10,6,11,7,5 +F,4,11,5,8,4,4,11,4,6,11,10,6,2,10,3,5 +N,5,9,5,5,2,5,8,4,6,4,4,9,4,7,2,8 +I,1,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +Y,5,8,5,6,3,5,9,1,8,9,9,5,1,11,3,4 +Z,2,4,4,3,2,7,8,2,9,12,7,7,1,8,5,6 +N,5,11,7,8,6,7,7,8,5,7,5,6,3,7,3,8 +N,4,7,5,5,4,6,7,8,5,7,5,7,3,7,3,8 +P,4,10,4,7,2,4,10,10,3,9,6,4,2,10,4,8 +K,12,15,11,9,5,6,8,3,7,9,9,10,6,10,4,6 +A,1,0,2,1,0,7,4,2,0,7,2,8,2,7,1,8 +K,5,10,6,7,2,4,7,9,2,7,6,12,3,8,3,11 +G,7,11,8,8,5,6,6,7,8,10,7,11,2,10,5,9 +K,4,5,7,4,4,6,7,1,7,10,7,10,3,8,3,8 +A,3,10,6,7,4,11,3,2,2,9,2,9,3,7,3,9 +T,2,1,3,2,1,6,12,2,7,8,11,8,1,10,1,7 +Q,4,9,5,8,3,8,6,9,7,6,5,9,3,8,4,8 +Y,3,4,5,6,1,7,12,2,3,8,12,8,1,10,0,8 +N,3,7,5,5,3,7,9,6,5,7,6,7,5,9,2,6 +L,2,6,2,4,1,0,1,5,6,0,0,7,0,8,0,8 +E,7,13,5,7,3,6,8,6,8,10,6,10,1,8,8,8 +J,1,3,2,5,1,12,3,9,3,13,5,13,1,6,0,8 +Z,2,1,2,2,1,7,7,3,11,9,6,8,0,8,7,8 +G,1,0,1,0,0,8,7,5,4,6,5,9,1,8,4,10 +U,5,9,6,7,6,8,8,8,5,5,7,9,3,8,4,6 +C,3,2,4,4,2,6,8,7,8,9,8,13,1,9,4,10 +G,8,12,6,6,5,8,8,4,3,9,5,6,4,9,9,8 +W,6,10,6,8,6,2,11,2,2,10,9,7,6,11,2,6 +J,4,9,6,6,4,7,6,4,5,8,6,7,5,6,4,6 +L,4,11,6,8,8,7,8,3,5,6,6,10,6,11,7,5 +R,5,10,7,8,6,6,8,5,6,6,5,8,3,6,6,9 +F,2,4,4,3,2,7,9,1,7,13,5,5,1,9,2,8 +Y,6,12,5,6,3,4,9,4,2,10,9,6,3,9,3,4 +Y,3,5,5,4,2,7,10,1,7,7,11,8,1,11,2,8 +H,2,1,3,3,2,6,7,5,6,7,6,8,3,8,3,8 +X,3,6,4,4,3,7,8,3,8,6,6,8,2,8,6,8 +R,5,11,7,8,10,6,7,3,4,6,6,9,7,10,8,6 +P,3,6,5,4,3,5,12,6,3,10,7,2,1,10,3,6 +U,3,3,3,5,1,7,5,13,5,7,14,8,3,9,0,8 +C,2,0,2,1,1,6,7,6,10,7,6,14,0,8,4,9 +R,1,0,2,1,1,6,9,7,3,7,5,8,2,7,4,11 +T,8,15,7,9,3,6,10,3,8,13,6,6,2,8,5,4 +Y,6,8,8,11,12,8,8,4,2,7,8,9,4,12,9,8 +O,4,7,4,5,3,7,7,8,6,9,7,10,3,8,3,7 +J,0,0,1,0,0,12,4,6,3,12,4,11,0,7,0,8 +R,3,4,5,3,3,9,7,3,5,11,3,6,2,7,3,9 +Z,1,3,3,2,1,8,7,2,9,11,6,8,1,8,5,7 +X,3,11,4,8,4,7,7,4,4,7,6,8,3,8,4,8 +U,2,3,3,2,1,5,8,5,6,10,9,9,3,9,2,6 +C,5,11,6,8,5,5,8,8,7,10,8,13,2,11,4,10 +V,5,11,7,8,8,8,5,5,3,8,7,9,9,9,6,11 +C,4,7,5,5,2,6,7,6,10,6,6,12,1,7,4,8 +M,8,10,11,7,7,5,6,4,5,11,10,11,11,5,4,7 +I,1,1,1,1,1,7,7,2,7,7,6,8,0,8,2,8 +U,1,0,2,1,0,8,6,11,4,7,12,8,3,10,0,8 +L,5,11,7,8,9,8,7,3,5,6,7,9,7,10,7,6 +J,1,3,1,2,0,10,6,2,5,11,4,9,0,7,1,7 +F,5,8,7,6,3,4,12,3,6,14,8,4,1,10,1,7 +G,2,4,3,3,2,6,7,5,5,9,7,10,2,9,4,9 +G,4,10,6,8,7,8,6,5,2,6,6,10,7,8,5,10 +A,2,1,3,1,1,7,4,2,0,7,2,8,2,6,2,8 +Q,2,0,2,1,1,8,7,6,4,6,6,9,2,8,3,8 +B,4,8,6,6,6,8,7,6,5,9,7,6,3,8,7,8 +P,1,0,1,0,0,5,10,7,1,9,6,5,1,9,2,8 +C,3,8,4,6,3,5,8,6,6,9,8,14,1,9,3,10 +E,2,4,4,3,2,6,8,2,8,11,7,9,2,8,4,8 +M,10,13,12,7,6,10,2,3,2,10,2,9,8,1,2,8 +L,2,6,2,4,1,0,2,5,6,0,0,7,0,8,0,8 +D,4,11,6,8,7,8,7,5,7,7,6,6,6,8,3,7 +B,2,6,3,4,3,6,7,7,5,7,6,7,2,8,6,9 +E,4,9,6,7,5,5,9,3,7,11,9,9,3,9,4,6 +Q,6,15,6,8,4,7,5,5,8,9,5,8,3,7,9,9 +M,7,6,9,5,9,7,8,5,4,6,5,8,13,7,5,8 +G,4,6,6,6,6,7,7,5,4,7,7,8,7,10,6,8 +U,3,6,5,4,4,8,8,8,5,6,7,9,3,8,4,6 +X,3,7,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +N,8,10,10,9,11,7,7,5,4,7,6,7,8,9,6,5 +W,5,6,5,4,4,3,10,2,3,10,9,8,6,11,2,6 +I,0,1,1,2,1,7,7,1,6,7,6,8,0,8,2,8 +F,5,5,5,7,2,1,15,5,3,12,9,4,0,8,3,6 +E,5,10,5,8,5,2,7,5,9,7,6,14,0,8,6,8 +Y,4,10,6,7,1,8,10,2,2,6,13,8,1,11,0,8 +B,4,8,6,6,5,10,6,3,6,10,4,7,3,8,5,11 +D,4,8,5,6,4,6,7,8,7,6,5,4,3,8,4,8 +O,2,1,2,2,1,8,7,7,5,7,6,8,2,8,3,8 +H,3,3,5,2,2,7,8,3,5,10,7,8,3,8,3,7 +Q,4,5,5,5,2,8,5,8,8,6,4,8,3,8,4,8 +Y,4,8,4,6,2,3,12,4,5,12,12,6,1,11,2,6 +B,3,8,4,6,5,8,7,8,5,7,6,6,3,8,7,10 +O,4,9,5,7,3,6,9,7,5,10,8,7,3,8,3,8 +P,3,4,5,3,3,7,10,6,3,11,4,3,1,10,3,8 +E,1,0,1,0,0,5,8,5,7,7,6,12,0,8,6,10 +O,3,7,4,5,2,8,8,8,6,6,7,9,3,8,4,8 +V,3,8,5,6,1,9,8,4,3,6,14,8,3,9,0,8 +Q,6,9,6,10,8,8,5,7,4,9,5,8,4,8,5,7 +K,4,8,5,6,7,8,7,3,4,6,6,8,6,8,7,5 +T,6,10,6,7,4,6,12,4,7,11,9,4,2,13,4,4 +C,5,9,6,7,3,4,8,6,9,12,9,12,1,9,3,7 +U,4,5,5,3,2,6,8,6,7,7,10,10,3,9,1,8 +N,1,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +C,3,2,4,3,2,6,8,7,7,9,8,12,2,10,3,9 +K,7,10,9,8,5,4,8,3,8,11,11,11,4,6,5,5 +H,6,11,8,8,8,6,6,8,4,6,4,8,4,6,8,11 +P,6,10,5,5,3,4,12,6,1,12,6,4,3,10,4,8 +P,1,0,2,0,0,5,11,6,1,9,6,5,1,9,3,8 +U,3,3,4,2,1,5,8,5,7,11,10,8,3,9,2,6 +C,5,9,5,7,4,4,8,5,6,11,9,14,2,9,3,7 +U,5,4,6,3,2,4,8,5,8,10,9,9,3,9,2,6 +E,2,3,2,1,1,7,7,5,7,7,6,8,2,8,5,10 +V,10,15,9,8,5,6,9,4,4,9,8,5,5,12,3,8 +J,2,6,4,4,3,10,5,2,4,7,5,5,3,8,4,6 +Y,5,9,5,6,3,3,10,2,7,11,11,6,1,11,2,5 +B,4,6,5,4,4,8,9,3,5,10,5,5,3,8,5,8 +F,4,9,5,6,2,1,12,5,5,12,10,8,0,8,2,6 +L,8,12,8,6,4,8,4,4,5,12,8,11,3,9,6,9 +S,4,9,6,7,3,9,7,4,8,12,4,7,2,8,5,9 +O,2,6,3,4,3,7,8,7,5,7,9,8,2,9,3,7 +U,6,7,7,5,3,4,10,6,7,12,11,8,3,9,2,7 +R,3,7,4,5,2,5,10,8,3,7,5,8,2,8,6,11 +T,3,6,4,4,3,7,8,7,6,7,7,8,3,10,5,9 +Z,1,3,2,1,1,7,7,5,8,6,6,8,1,8,6,8 +O,5,6,6,9,3,8,7,9,8,7,6,9,3,8,4,8 +G,7,11,9,9,12,8,7,4,3,6,5,9,8,7,9,14 +K,6,9,9,8,9,6,7,2,4,7,4,9,7,5,10,10 +Y,8,10,6,15,5,4,9,3,1,9,10,5,4,10,7,5 +G,6,9,5,4,3,8,3,4,3,7,3,5,4,7,4,9 +H,4,5,7,4,4,7,8,3,6,10,6,8,3,8,3,8 +J,3,9,4,7,1,12,2,10,4,14,5,13,1,6,0,8 +T,3,5,4,4,2,6,10,1,8,11,9,5,1,9,3,4 +W,5,9,7,7,3,8,8,4,2,7,8,8,8,9,0,8 +B,2,4,4,3,3,8,7,2,5,10,5,6,2,8,4,9 +U,3,8,4,6,2,7,5,14,5,7,13,8,3,9,0,8 +F,1,3,3,2,1,5,11,3,4,13,7,5,1,9,1,7 +R,4,10,6,8,6,7,7,4,6,6,5,7,3,7,5,9 +U,3,9,4,7,2,7,5,15,5,7,12,8,3,9,0,8 +M,8,9,12,8,12,7,7,4,4,6,5,8,14,9,6,9 +P,3,4,5,2,2,7,11,4,3,12,4,2,1,9,2,9 +I,2,11,2,8,4,7,7,0,6,7,6,8,0,9,3,8 +J,3,5,5,6,4,8,9,4,5,7,6,8,3,8,8,9 +P,6,9,8,7,7,6,6,8,4,7,6,8,4,9,8,11 +U,4,8,6,6,6,10,6,4,5,6,7,6,5,8,4,6 +I,1,6,0,4,0,7,7,5,3,7,6,8,0,8,0,8 +P,4,7,6,5,3,7,12,4,5,14,5,1,0,10,3,8 +H,3,3,5,2,3,7,7,2,6,10,6,8,3,8,3,7 +V,4,2,6,4,2,7,13,3,4,8,12,8,3,10,2,8 +N,6,9,9,7,5,7,9,2,5,10,6,6,6,9,1,8 +G,6,11,7,8,4,7,6,7,7,11,6,13,3,9,5,8 +W,4,2,6,4,4,9,11,2,2,5,9,7,9,11,2,7 +S,5,11,6,8,6,8,8,5,8,5,5,8,0,8,9,8 +J,1,3,3,2,1,9,4,4,4,13,7,12,1,7,0,7 +B,3,7,4,5,3,6,6,9,7,6,6,7,2,8,9,9 +V,3,10,5,8,2,8,8,4,3,6,14,8,3,9,0,8 +E,4,9,4,6,4,3,6,5,9,6,7,13,0,8,7,9 +Q,5,6,5,8,5,8,4,6,5,10,5,10,4,7,6,7 +G,6,10,8,7,5,7,7,7,6,5,7,9,3,8,4,8 +X,3,6,5,5,5,9,6,2,6,8,6,7,3,10,8,6 +D,3,4,4,3,3,7,7,6,7,7,6,5,2,8,3,7 +G,5,9,6,6,7,9,6,5,2,6,6,10,6,7,5,11 +X,3,5,6,3,2,5,8,2,9,11,10,9,2,9,3,6 +F,6,10,9,7,5,5,12,4,5,13,8,4,2,10,2,6 +W,3,7,5,5,3,11,8,5,1,6,9,8,7,10,0,8 +Q,4,9,5,8,5,8,8,7,4,5,9,9,2,9,4,9 +Z,4,8,5,6,5,7,7,5,10,7,6,8,1,8,7,7 +W,6,9,8,6,7,7,7,6,3,8,8,7,7,9,5,10 +F,2,5,3,4,2,6,9,4,5,10,9,6,2,10,3,6 +Y,6,9,6,4,3,7,7,4,4,9,8,6,4,10,4,4 +I,1,9,0,7,1,7,7,5,3,7,6,8,0,8,0,8 +U,2,3,3,2,1,5,8,4,5,10,8,9,3,10,1,7 +A,4,11,7,8,6,7,5,1,4,5,2,6,5,6,6,6 +U,3,8,4,6,2,7,5,14,5,7,13,8,3,9,0,8 +D,1,3,2,2,1,9,6,4,4,10,3,5,2,8,2,8 +S,6,12,6,6,3,10,4,4,3,12,6,9,3,10,2,8 +U,1,3,2,1,1,9,8,6,5,5,9,7,3,10,0,8 +D,3,9,5,6,4,6,7,9,6,6,6,5,3,8,3,8 +I,2,6,3,4,1,7,7,1,8,14,6,8,0,8,1,8 +O,5,9,4,4,3,6,8,6,4,9,8,9,4,9,4,8 +V,3,7,5,5,1,8,8,4,2,6,14,8,3,10,0,8 +P,5,9,7,7,6,9,8,4,5,11,4,4,2,9,4,8 +T,2,10,4,7,1,7,14,0,6,7,11,8,0,8,0,8 +S,3,7,4,5,3,8,8,7,6,7,6,8,2,8,9,8 +G,3,6,4,4,2,8,6,7,7,6,6,9,1,7,6,11 +O,4,11,5,8,3,7,7,9,7,7,6,8,3,8,4,8 +X,5,9,8,6,4,10,6,2,8,10,2,7,3,8,3,9 +G,5,9,7,7,7,7,9,6,3,5,5,10,4,8,7,8 +U,6,9,6,7,4,5,7,7,8,8,6,9,3,9,3,4 +F,4,9,5,6,2,1,11,5,7,12,11,9,0,8,2,6 +Q,5,8,6,10,6,9,5,7,4,9,5,11,4,8,6,7 +M,1,0,2,0,1,7,6,9,0,7,8,8,6,6,0,8 +B,7,13,7,7,6,10,6,4,5,9,5,8,6,8,8,9 +C,5,8,6,6,2,3,10,5,8,12,11,10,1,8,2,6 +K,7,9,10,8,10,9,7,3,4,9,2,8,8,4,8,12 +R,1,1,2,1,1,6,9,8,4,7,5,8,2,7,4,11 +A,6,11,8,9,8,7,7,8,4,8,5,8,4,8,10,1 +Q,6,7,6,9,7,8,5,7,4,8,6,7,6,8,6,9 +K,4,10,5,7,2,3,8,8,2,7,5,11,3,8,3,10 +I,1,6,1,4,1,7,7,0,7,7,6,9,0,8,3,8 +V,5,6,5,4,3,4,12,1,2,8,10,7,3,11,1,7 +F,2,1,3,2,1,5,11,3,5,11,9,5,1,10,3,6 +O,4,8,5,6,4,7,8,8,5,10,7,8,3,8,3,8 +A,2,7,4,5,3,12,3,2,2,9,2,9,3,7,3,9 +N,6,10,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +C,2,1,2,2,1,6,8,7,7,9,7,12,1,10,4,10 +W,1,0,1,0,0,7,8,3,0,7,8,8,3,9,0,8 +M,5,7,6,5,7,8,8,6,5,7,6,8,7,9,7,6 +Q,5,9,6,11,7,7,9,4,3,8,10,10,4,10,8,8 +C,3,8,4,6,3,5,7,6,7,7,5,11,1,8,4,10 +A,7,9,10,8,8,6,8,2,4,7,7,9,8,6,4,8 +Y,3,5,5,8,1,6,10,2,2,7,13,8,2,11,0,8 +I,1,11,0,8,1,7,7,5,3,7,6,8,0,8,0,8 +B,5,9,7,8,9,7,7,5,4,7,6,8,6,9,8,7 +G,4,7,4,5,2,6,7,6,6,10,8,9,2,9,4,9 +L,4,9,4,5,2,9,3,4,5,12,4,13,2,6,5,9 +I,2,8,3,6,2,8,7,0,7,13,6,8,0,8,1,8 +Y,8,10,7,5,4,8,6,4,6,9,6,5,4,10,4,6 +K,3,6,5,4,5,8,6,4,4,7,6,8,6,7,6,8 +X,5,11,9,9,7,6,8,2,6,7,6,9,6,5,8,7 +V,8,10,7,8,5,3,12,2,3,9,11,8,7,11,2,6 +S,8,11,9,8,6,7,8,3,6,10,5,7,4,6,6,8 +K,3,7,5,5,5,5,6,3,4,6,5,9,5,7,8,7 +A,3,8,5,5,2,7,5,3,1,7,1,8,2,7,2,7 +S,9,13,8,7,4,9,4,4,3,13,8,10,4,9,3,9 +D,2,4,4,3,2,8,7,5,6,9,5,5,2,8,3,7 +Q,6,9,8,7,6,8,4,9,5,7,4,8,3,8,4,8 +N,10,13,9,7,4,4,9,4,7,3,3,11,5,8,2,7 +Z,5,7,7,9,6,10,5,4,4,8,2,6,2,7,7,8 +A,4,9,7,7,4,8,2,2,3,6,1,7,2,7,3,7 +B,4,6,5,4,4,8,7,5,6,9,6,6,2,8,6,9 +U,5,8,5,6,2,7,4,14,5,7,14,8,3,9,0,8 +S,3,5,6,3,2,6,8,2,7,10,7,8,1,9,5,6 +P,3,1,4,2,2,5,10,4,4,10,8,4,1,9,4,7 +C,3,2,4,4,2,6,8,7,7,8,7,13,1,9,4,10 +Q,1,0,2,1,1,8,7,6,4,6,6,9,2,8,3,8 +Q,5,6,7,9,8,8,11,4,3,5,8,11,5,13,7,11 +E,3,8,5,6,4,4,8,5,8,11,10,9,2,9,4,5 +D,2,4,4,3,2,9,6,4,6,10,4,5,2,8,3,8 +G,4,2,5,4,3,7,6,6,6,6,6,9,2,8,4,8 +V,2,1,4,2,1,6,13,3,2,8,11,8,2,10,1,8 +A,4,10,7,7,2,7,5,3,1,7,1,8,3,7,2,8 +A,2,8,4,6,2,12,3,3,2,10,1,9,2,6,2,8 +R,3,2,4,4,3,7,7,5,5,6,5,7,3,6,6,9 +S,3,5,4,4,2,8,7,3,7,10,6,8,1,9,5,8 +Q,5,9,5,4,3,8,5,4,8,10,4,9,3,7,8,10 +Z,6,9,9,7,6,8,6,2,9,11,5,9,3,5,7,8 +C,7,10,8,8,5,3,7,5,7,11,10,14,2,9,3,7 +F,6,12,5,6,3,4,12,3,5,12,7,4,2,7,5,5 +B,4,10,5,8,7,7,8,9,6,7,6,7,2,7,8,10 +R,3,7,3,5,3,5,9,7,3,7,5,8,2,7,4,11 +W,8,10,9,8,6,1,10,3,3,11,11,9,7,10,1,7 +K,6,10,8,7,6,6,6,1,7,10,6,10,4,8,4,8 +P,2,4,4,3,2,8,8,3,5,12,4,4,1,10,2,8 +O,3,6,4,4,3,7,8,7,4,9,7,8,3,8,2,8 +J,5,8,4,6,3,8,7,2,4,11,6,8,2,10,6,11 +A,6,9,5,4,2,11,3,3,1,9,4,11,4,5,4,9 +P,3,7,5,5,3,9,8,2,5,12,4,5,1,10,2,9 +N,10,13,12,8,5,4,9,3,4,13,10,9,6,8,0,7 +M,3,2,5,3,3,9,6,6,4,6,7,6,7,5,2,6 +P,3,7,5,11,8,8,9,5,0,8,6,6,5,11,6,9 +Z,3,7,5,5,3,6,8,2,9,11,7,7,1,9,6,7 +S,4,6,5,4,3,9,8,3,7,10,4,7,2,7,4,9 +X,1,0,1,0,0,8,7,3,4,7,6,8,2,8,4,8 +P,4,8,4,5,2,5,10,9,5,9,6,5,2,10,4,8 +C,6,11,6,8,4,5,8,7,8,12,9,12,2,10,4,6 +P,5,8,7,6,5,9,8,2,6,13,5,5,2,9,3,9 +D,3,7,3,5,2,5,6,10,7,5,4,5,3,8,3,8 +Z,2,4,5,3,2,7,8,2,9,12,7,7,1,8,5,6 +Y,7,6,6,9,4,6,8,4,2,7,10,5,4,10,5,6 +L,1,3,3,1,1,6,4,1,7,7,2,9,0,7,2,8 +K,4,5,5,4,3,5,7,4,8,7,6,10,6,8,5,9 +T,6,9,6,6,4,7,11,3,9,12,9,4,2,12,3,4 +R,2,1,2,1,1,6,10,7,2,7,5,8,2,7,4,10 +T,4,11,5,8,2,5,15,1,6,9,11,7,0,8,0,8 +A,8,14,8,8,6,9,4,5,4,10,6,12,9,2,7,11 +H,5,10,5,7,3,7,5,15,1,7,8,8,3,8,0,8 +Z,5,7,6,5,4,8,5,2,9,11,4,10,2,8,6,10 +G,4,4,6,6,2,8,5,8,9,6,5,10,2,8,5,10 +U,3,1,4,1,1,7,9,5,6,7,10,9,3,10,1,8 +B,4,8,6,6,4,11,6,3,7,11,3,7,2,8,5,11 +L,7,13,6,7,3,7,4,3,6,11,4,13,2,7,6,8 +V,7,9,9,8,10,7,6,5,4,7,6,7,7,10,8,11 +B,2,5,4,3,3,8,7,3,6,9,5,7,2,8,5,10 +Q,1,1,2,2,2,8,7,5,2,5,6,9,2,9,4,10 +G,6,11,7,8,5,6,7,7,7,10,8,10,2,8,5,9 +D,4,8,6,6,5,7,8,8,6,9,7,4,4,9,3,7 +K,7,10,7,5,3,7,6,3,6,9,8,9,6,11,3,7 +Y,4,5,5,7,7,9,6,6,3,7,7,8,7,8,6,4 +W,4,8,6,6,3,6,8,4,1,7,8,8,8,9,0,8 +Y,4,4,5,6,5,9,9,5,3,7,7,7,5,10,6,4 +H,4,4,4,5,2,7,6,15,1,7,8,8,3,8,0,8 +S,7,10,5,5,2,9,2,3,4,9,2,9,3,6,5,10 +Q,8,15,8,8,5,11,4,5,7,12,3,10,3,7,8,12 +D,6,5,6,8,3,5,7,10,10,7,6,5,3,8,4,8 +G,3,8,5,6,4,6,6,6,6,7,5,11,2,10,4,9 +F,4,11,4,8,3,1,11,4,5,11,11,9,0,8,2,6 +U,2,3,3,2,1,5,8,5,6,10,9,8,3,9,2,6 +S,2,5,2,4,2,8,8,7,5,8,5,7,2,8,8,8 +A,3,9,5,7,3,11,3,2,2,9,2,9,3,5,3,8 +C,2,2,3,3,2,6,8,7,8,8,7,13,1,9,4,10 +I,3,9,5,7,3,7,7,0,7,13,6,8,0,8,1,8 +I,1,1,1,2,1,7,7,1,6,7,6,8,0,8,2,8 +H,3,3,5,2,2,7,8,3,6,10,7,7,3,8,3,8 +Y,3,5,5,8,6,7,10,3,3,7,8,9,4,10,9,5 +W,4,8,7,6,9,9,8,5,2,7,7,7,12,10,4,6 +P,3,7,5,11,9,9,8,4,1,8,6,7,7,9,5,6 +F,6,11,6,8,2,1,12,5,6,12,11,8,0,8,2,5 +J,0,0,1,1,0,12,4,6,3,12,5,11,0,7,0,8 +U,2,4,3,3,2,5,8,5,6,10,9,9,3,9,2,6 +H,8,11,12,9,10,6,7,3,7,10,8,9,5,8,5,7 +R,3,5,4,4,3,7,7,4,5,6,5,6,3,7,4,8 +C,3,8,4,6,3,5,7,6,8,5,6,12,1,7,4,10 +R,4,9,6,7,6,6,7,5,6,7,6,6,3,7,5,9 +B,4,8,6,6,8,8,8,4,3,6,7,7,6,11,8,9 +M,6,9,10,7,11,10,5,3,2,9,4,8,11,6,4,7 +O,4,8,5,6,4,7,7,7,6,7,5,8,2,8,3,8 +C,6,11,7,8,5,5,8,7,6,8,8,15,4,9,6,6 +E,3,4,5,3,2,6,8,2,8,11,8,9,2,8,4,7 +Z,1,4,2,3,1,8,7,5,8,6,6,8,1,8,7,7 +M,6,11,8,8,8,8,6,5,5,6,7,8,8,6,2,7 +E,3,7,3,5,2,3,7,6,11,7,7,15,0,8,7,7 +U,4,10,5,8,4,8,6,12,4,7,13,7,3,8,0,9 +R,3,8,3,6,4,5,9,7,3,7,5,8,2,7,5,11 +D,4,11,4,8,3,5,7,11,8,7,6,5,3,8,4,8 +F,5,7,6,5,6,7,8,6,4,8,6,8,3,10,8,11 +C,7,11,8,8,5,5,7,5,7,12,9,13,4,11,5,5 +L,5,10,6,8,4,7,4,2,8,7,1,8,1,6,3,7 +F,5,11,6,8,7,6,9,6,4,8,6,8,3,10,8,11 +S,2,4,4,3,2,9,6,3,7,10,4,8,1,9,5,9 +C,6,9,8,8,8,5,7,3,5,7,6,11,4,11,8,8 +U,4,6,4,4,3,7,5,12,4,7,12,8,3,9,0,8 +P,6,13,6,7,4,8,9,4,3,12,4,4,4,11,5,6 +H,3,6,4,4,2,7,7,14,0,7,6,8,3,8,0,8 +H,3,5,6,3,3,7,7,3,6,10,6,8,3,8,3,7 +H,4,5,5,4,4,8,7,6,6,7,6,8,3,8,3,7 +V,4,7,4,5,2,2,11,3,3,11,11,8,2,11,0,8 +J,4,11,5,8,4,8,5,3,7,12,4,10,1,6,2,6 +Z,2,1,3,3,2,7,7,5,9,6,6,8,1,8,7,8 +M,4,3,5,5,3,7,7,12,1,7,9,8,8,6,0,8 +I,1,1,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +S,7,11,7,6,3,9,5,4,4,13,6,8,2,9,3,8 +J,1,4,2,3,1,10,7,1,7,11,4,7,0,7,1,7 +W,10,15,10,8,5,4,9,2,2,8,10,8,9,12,1,6 +N,6,9,9,7,5,9,8,2,5,10,2,4,7,10,2,7 +I,1,1,1,3,1,7,7,1,6,7,6,8,0,8,2,8 +M,5,6,7,4,6,7,6,5,5,8,6,11,10,5,2,9 +E,3,8,4,6,3,7,8,6,10,6,4,9,3,8,6,8 +G,4,7,5,5,3,7,7,6,7,10,7,11,2,9,4,9 +P,2,3,3,1,1,5,9,4,4,9,8,5,1,9,3,7 +R,5,11,7,8,6,10,7,3,5,10,3,7,3,7,4,10 +Z,2,3,3,2,2,7,7,5,9,6,6,8,1,8,7,8 +O,2,4,3,3,2,7,7,6,4,9,6,8,2,8,2,8 +W,4,8,6,6,6,5,11,2,2,7,8,8,7,11,1,8 +A,2,4,3,3,1,11,3,3,2,11,2,9,2,6,2,9 +J,0,0,1,0,0,12,4,5,3,12,5,11,0,7,0,8 +T,3,5,4,4,3,9,12,4,5,5,11,9,2,12,1,8 +X,2,1,3,3,2,7,7,3,8,6,6,8,2,8,6,8 +J,2,7,3,5,1,14,2,6,5,14,2,11,0,7,0,8 +D,2,2,3,3,2,7,7,6,6,7,6,5,2,8,3,7 +J,2,9,3,6,2,10,6,1,7,11,3,6,0,7,1,7 +X,3,8,5,6,3,8,7,4,8,6,6,8,3,8,6,8 +J,1,7,2,5,2,10,6,1,5,11,4,8,0,6,1,7 +W,4,4,6,3,3,8,11,3,2,6,9,8,8,12,1,7 +A,3,9,5,7,3,11,4,2,2,8,2,9,3,5,3,8 +R,3,5,5,4,3,9,7,3,5,10,4,6,3,7,4,10 +V,6,11,6,8,4,3,11,1,2,9,10,8,4,11,1,7 +T,8,11,7,6,3,7,9,4,8,13,6,8,2,7,4,6 +V,5,8,5,6,2,3,11,3,4,10,11,7,2,10,1,8 +B,1,0,1,0,1,7,7,6,4,6,6,7,1,8,5,9 +G,2,1,3,2,2,7,7,5,5,7,6,10,3,7,4,9 +B,4,9,6,6,5,9,6,4,6,10,5,7,3,7,6,9 +N,5,9,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +K,2,3,3,2,2,6,7,4,7,6,6,10,3,8,4,9 +U,3,6,4,4,1,7,4,13,5,7,13,8,3,9,0,8 +L,3,7,4,5,3,5,4,5,7,2,2,5,1,6,1,5 +O,2,4,3,3,2,8,7,6,3,9,6,8,2,8,2,8 +W,5,5,7,8,4,9,8,4,2,7,8,8,9,9,0,8 +H,4,11,6,8,7,7,7,5,6,7,6,9,6,8,3,8 +B,8,12,6,6,4,9,5,4,5,10,5,9,5,7,7,10 +V,5,8,5,6,3,3,12,3,3,10,11,8,2,10,1,8 +D,4,6,6,4,5,9,6,4,5,10,3,6,3,7,3,8 +Q,3,5,4,8,7,8,7,5,0,6,6,9,7,10,6,12 +G,7,12,6,7,3,10,4,4,4,10,3,6,4,7,5,9 +D,4,7,5,5,3,6,7,10,10,6,5,6,3,8,4,8 +G,6,10,8,8,6,6,6,6,6,5,6,11,2,9,4,8 +L,1,4,2,3,1,6,4,2,7,7,2,9,0,7,2,8 +D,6,9,6,5,3,8,6,5,5,10,4,6,4,7,6,10 +H,1,0,2,0,0,7,7,11,1,7,6,8,3,8,0,8 +V,3,3,5,4,1,8,8,4,2,6,14,8,3,10,0,8 +T,3,9,5,7,3,7,12,3,7,7,12,8,1,12,1,8 +W,4,8,7,6,4,7,10,2,3,7,9,8,8,11,1,8 +I,1,5,3,4,1,7,7,0,7,13,6,8,0,8,1,8 +M,3,6,4,4,4,9,6,6,4,6,7,5,7,5,2,6 +E,3,8,4,6,5,6,7,3,4,6,7,10,4,11,8,7 +U,5,5,6,7,2,7,4,14,6,7,15,8,3,9,0,8 +A,3,5,5,3,2,10,2,2,2,10,2,9,2,6,2,7 +M,11,15,11,8,6,9,11,6,4,4,6,9,10,12,2,7 +M,3,4,5,3,3,8,6,6,4,7,7,8,7,5,2,7 +A,3,9,5,7,3,10,2,2,2,8,1,8,2,7,3,8 +L,4,8,6,7,6,7,6,5,5,7,7,7,3,9,8,11 +R,4,8,5,6,4,7,9,6,5,7,6,8,3,7,6,9 +U,6,11,7,8,6,8,5,13,5,6,12,8,3,9,0,8 +E,0,0,1,0,0,5,7,5,6,7,6,12,0,8,5,11 +E,4,7,6,6,5,5,9,3,5,8,7,9,4,10,7,7 +P,7,15,7,8,5,8,9,4,4,12,5,4,4,11,6,6 +U,3,7,4,5,3,8,5,12,4,7,11,8,3,9,0,8 +N,5,10,7,8,4,3,9,4,4,10,11,10,5,7,1,8 +K,3,7,5,5,5,8,7,4,4,7,6,7,4,6,8,13 +X,5,5,6,8,2,7,7,5,4,7,6,8,3,8,4,8 +O,1,0,1,0,0,7,7,6,3,7,6,8,2,8,3,8 +D,6,5,6,8,3,5,7,10,9,7,6,5,3,8,4,8 +J,3,7,4,5,1,8,6,3,7,15,5,10,0,7,1,7 +E,5,10,7,8,4,5,9,3,9,11,9,9,2,9,5,5 +D,3,6,3,4,2,6,8,10,8,7,7,6,3,8,4,8 +Q,3,3,4,5,3,8,8,7,2,5,7,9,2,9,5,9 +D,9,15,8,8,6,8,6,3,7,10,5,6,6,7,9,6 +O,3,4,4,3,2,7,7,7,4,9,7,9,2,8,3,8 +Z,8,8,6,11,5,7,7,4,3,11,6,8,3,9,11,6 +R,5,6,6,8,4,5,12,8,3,7,3,9,3,7,7,11 +R,4,7,5,5,4,11,7,2,5,11,3,7,3,7,3,11 +E,5,10,5,8,3,3,8,6,12,7,5,15,0,8,7,7 +Y,7,10,7,7,3,2,11,5,6,13,13,7,2,11,2,6 +I,0,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +W,4,7,6,5,3,4,8,5,1,7,9,8,8,10,0,8 +K,4,10,6,7,6,6,7,3,7,6,5,8,3,8,5,9 +F,2,6,3,4,3,6,10,3,5,10,9,5,2,10,3,6 +B,5,5,5,7,4,6,7,9,6,7,6,6,2,8,9,10 +D,3,7,4,5,3,6,7,8,6,7,6,4,3,8,3,7 +Q,5,8,6,9,6,8,7,7,4,9,8,9,4,9,7,9 +U,8,10,9,8,4,3,8,6,8,10,10,9,3,9,2,5 +N,7,10,10,7,4,6,8,3,5,10,8,8,6,7,1,7 +C,2,3,2,2,1,4,9,5,6,12,9,10,1,9,2,7 +A,5,9,9,7,6,5,5,2,4,3,2,7,6,7,7,2 +B,2,2,3,3,2,8,7,5,5,6,5,5,2,8,6,9 +C,9,14,6,8,3,7,8,7,7,11,6,7,2,9,6,8 +T,3,5,5,6,1,8,15,1,5,7,11,8,0,8,0,8 +Y,2,4,4,5,1,8,10,2,2,6,12,8,1,11,0,8 +Q,4,6,6,5,6,8,4,4,4,7,4,10,5,6,7,7 +G,6,11,5,6,3,11,4,3,4,10,2,7,4,7,4,9 +G,5,11,7,8,5,6,6,7,7,6,5,10,2,9,4,8 +A,3,8,6,5,2,6,5,3,0,6,1,8,2,7,2,7 +L,4,10,6,8,3,7,4,0,9,9,2,10,0,7,3,8 +L,3,6,4,5,4,8,6,5,5,7,7,9,3,8,7,10 +Y,9,12,8,7,5,6,6,5,4,9,9,6,5,11,4,6 +D,1,1,2,1,1,6,7,8,6,6,6,6,2,8,3,8 +D,5,10,8,8,5,9,8,5,8,10,5,4,4,7,5,9 +A,3,9,5,7,4,9,3,2,2,7,2,8,2,6,3,6 +P,7,15,7,8,5,6,11,3,5,13,6,3,3,9,5,5 +D,4,10,5,7,3,5,7,10,9,6,6,5,3,8,4,8 +O,4,8,5,6,4,8,6,8,4,7,4,8,3,8,3,8 +U,5,6,5,4,4,5,8,5,6,9,7,10,3,9,3,6 +S,4,7,5,5,3,5,9,3,6,10,7,6,3,7,4,5 +E,7,10,9,7,7,5,9,2,8,11,8,9,3,8,5,6 +U,5,8,6,6,5,8,6,8,5,7,6,9,3,8,4,6 +C,5,9,6,7,4,4,8,7,8,7,8,14,2,8,4,10 +P,5,11,6,8,3,5,9,11,6,8,6,5,2,10,4,8 +U,2,0,2,1,0,7,5,11,4,7,13,8,3,10,0,8 +B,3,6,4,4,4,9,6,3,5,10,4,7,2,8,4,10 +D,6,9,8,6,5,10,6,4,7,10,4,6,5,9,5,8 +Y,4,6,6,8,1,7,11,2,3,7,12,8,1,11,0,8 +A,3,7,5,5,3,8,2,2,2,7,1,8,2,7,3,7 +G,7,12,6,6,4,7,6,4,3,9,6,8,4,9,9,8 +O,6,11,7,8,6,7,8,8,7,7,6,6,4,7,5,10 +H,4,3,5,4,4,6,7,6,6,7,6,10,3,8,3,8 +Y,3,6,5,8,1,10,11,2,4,4,12,8,0,10,0,8 +K,3,2,4,4,3,5,7,4,7,7,6,11,3,8,5,9 +B,5,10,5,7,7,6,7,8,5,7,6,7,2,8,7,10 +M,2,3,4,1,2,5,7,4,3,10,10,10,4,7,1,6 +C,3,7,5,6,5,5,8,3,5,7,7,11,3,9,6,10 +Q,4,7,6,6,5,6,4,4,5,6,4,7,3,5,6,6 +S,6,9,8,8,9,8,8,4,5,7,7,7,5,10,10,10 +I,4,10,6,8,4,5,6,2,6,7,7,12,0,9,4,9 +R,7,11,9,8,6,9,8,4,7,9,3,7,3,6,5,11 +D,8,11,8,6,4,9,6,5,6,12,4,8,6,6,6,10 +X,5,9,8,6,4,5,8,2,8,11,11,9,3,9,4,6 +Q,3,5,4,5,3,8,7,7,4,6,6,9,2,8,4,9 +L,3,5,4,4,2,4,4,4,8,2,1,6,0,7,1,6 +R,3,7,5,5,5,8,7,7,5,8,6,7,3,8,5,9 +H,9,13,9,7,5,10,6,4,5,9,5,5,7,10,5,9 +K,4,5,5,7,2,4,7,9,2,7,5,11,4,8,2,11 +I,1,9,2,6,2,7,7,0,6,7,6,8,0,8,2,8 +A,2,6,5,4,3,5,5,2,2,4,2,7,2,6,3,3 +D,4,6,6,4,4,7,7,4,6,7,6,8,6,8,3,7 +G,3,7,4,5,2,8,7,8,7,6,6,9,2,7,5,11 +Y,3,9,5,6,1,8,10,3,2,6,13,8,2,11,0,8 +A,3,9,6,7,4,13,3,3,3,11,1,9,2,6,2,9 +U,7,10,6,5,3,6,6,4,5,4,8,7,5,8,2,6 +I,1,1,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +Q,2,1,2,1,1,8,7,6,4,6,6,8,2,8,3,8 +J,1,3,2,2,0,9,6,3,6,14,6,10,0,7,0,8 +N,6,9,9,8,8,7,9,4,4,7,4,7,9,7,6,6 +A,2,3,3,2,1,10,2,2,1,8,2,9,1,6,1,8 +O,4,5,5,8,2,8,7,9,7,7,5,8,3,8,4,8 +K,4,7,6,5,3,6,6,2,7,10,7,10,3,8,4,8 +M,4,8,5,6,5,7,5,10,0,7,8,8,8,5,2,10 +L,5,11,5,8,3,0,1,5,6,0,0,7,0,8,0,8 +E,5,7,6,6,6,5,7,4,3,7,6,8,5,11,9,8 +G,4,7,5,5,5,9,5,5,2,7,6,10,5,10,3,9 +H,3,5,5,4,3,9,6,3,6,10,4,8,3,8,3,9 +S,4,9,5,6,6,9,7,5,3,8,6,8,4,8,10,9 +T,6,7,6,5,3,7,11,3,7,11,8,4,4,10,4,4 +B,3,6,4,4,3,6,6,8,6,6,6,7,2,8,9,10 +A,2,7,4,5,3,11,3,2,2,9,2,9,2,6,3,8 +W,5,8,7,6,3,5,8,5,1,7,8,8,8,9,0,8 +M,6,9,9,6,10,10,3,3,2,9,4,8,11,5,3,7 +T,5,10,6,7,5,8,11,3,7,6,11,8,2,12,1,8 +O,4,8,6,6,2,6,7,8,8,7,6,7,3,8,4,8 +N,6,9,5,4,2,9,11,5,4,4,6,10,5,11,3,7 +M,4,5,7,3,4,7,6,3,4,9,7,8,7,5,2,8 +U,7,9,7,7,5,3,8,5,7,10,9,9,3,9,2,6 +H,3,5,4,3,3,8,7,6,6,7,6,6,3,8,3,6 +N,6,10,9,7,5,6,10,5,4,8,7,9,7,7,2,8 +J,7,12,5,9,5,8,9,2,4,11,6,7,2,9,8,9 +I,1,4,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +O,3,8,4,6,2,7,8,9,7,7,7,8,3,8,4,8 +B,3,8,5,6,5,9,7,4,5,10,5,7,2,8,5,9 +Q,4,6,6,9,9,9,7,6,1,7,6,9,10,9,5,7 +K,5,11,6,8,2,3,7,8,2,7,6,11,4,8,2,11 +Z,7,9,7,5,4,7,7,2,9,12,6,8,3,7,6,6 +R,2,3,3,2,2,8,8,3,4,9,5,7,2,7,3,9 +B,3,4,5,3,3,7,8,3,5,10,6,6,2,8,5,9 +V,7,9,7,7,4,3,12,2,3,9,11,8,4,12,1,7 +R,6,12,6,7,5,10,6,3,5,10,4,8,6,8,6,10 +Z,2,1,2,2,1,7,7,3,11,9,6,8,0,8,6,8 +F,4,9,6,6,3,6,11,3,6,13,7,4,1,10,2,7 +S,4,8,5,6,2,7,7,6,9,5,6,8,0,8,9,7 +T,2,7,3,4,1,10,14,1,6,4,11,9,0,8,0,8 +B,3,6,5,4,6,8,6,5,4,7,7,8,7,9,7,8 +P,5,6,7,4,3,9,8,4,6,12,4,5,2,9,4,9 +Y,7,10,7,7,3,4,10,2,8,11,11,6,1,10,3,3 +A,5,6,7,5,5,8,8,3,4,7,8,8,5,9,3,6 +V,5,6,5,4,2,3,12,5,4,11,11,7,3,10,1,8 +P,3,9,5,7,5,6,9,4,5,9,8,4,1,10,4,7 +C,7,11,5,6,2,7,7,7,7,12,6,9,2,9,5,9 +H,4,8,6,6,7,8,7,4,3,6,6,7,7,8,7,6 +A,3,4,5,3,2,10,2,2,2,8,2,9,4,5,2,9 +A,3,6,6,4,4,8,5,2,4,7,2,6,2,6,4,6 +L,5,10,5,5,3,8,5,3,5,12,7,11,2,9,6,9 +J,3,8,4,6,2,8,7,1,8,12,5,8,0,6,2,6 +R,8,12,6,6,4,11,5,5,5,11,2,8,6,6,6,10 +T,2,6,3,4,1,7,13,0,5,7,10,8,0,8,0,8 +M,5,10,6,8,4,7,7,12,2,8,9,8,8,6,0,8 +W,7,7,7,5,6,4,11,2,2,10,9,7,7,11,2,6 +Y,5,7,7,10,10,8,8,4,2,7,8,9,4,11,9,8 +O,3,10,5,8,4,8,8,8,6,6,6,11,3,8,4,7 +H,8,10,12,8,7,7,8,3,7,10,5,7,3,8,3,8 +R,4,9,5,7,5,7,7,5,6,6,5,7,3,7,5,8 +B,6,11,7,8,8,8,7,5,5,7,5,7,4,8,6,8 +N,6,8,9,6,5,4,10,3,4,10,10,8,5,8,1,8 +S,2,4,2,2,1,8,8,6,5,7,5,7,2,8,8,8 +J,3,10,5,8,5,8,7,2,5,11,5,9,5,6,3,4 +L,2,7,3,5,1,0,2,3,5,1,0,8,0,8,0,8 +B,9,14,7,8,5,6,8,5,7,10,6,8,6,6,7,9 +A,3,9,5,7,3,11,3,3,4,11,2,9,2,6,3,8 +D,3,7,5,5,4,7,7,7,4,6,5,6,3,8,3,7 +J,7,10,5,8,4,7,10,3,2,12,5,5,2,9,8,9 +X,3,5,6,4,3,6,7,1,9,11,9,9,3,8,3,7 +U,2,0,3,1,1,7,5,11,5,7,14,8,3,10,0,8 +Q,1,0,2,1,0,8,7,7,3,6,6,9,2,8,3,8 +N,2,1,3,2,2,7,8,5,4,7,6,6,4,8,1,6 +Y,4,7,5,5,5,9,6,5,4,7,8,7,3,9,8,4 +Y,7,6,6,9,3,6,12,2,3,10,10,6,4,11,5,7 +M,5,11,8,8,8,9,7,5,5,6,7,5,10,8,3,5 +D,4,8,4,6,2,5,7,10,9,6,6,5,3,8,4,8 +H,4,7,6,9,5,10,11,3,2,7,8,8,3,11,7,10 +C,7,10,8,8,5,5,8,6,7,12,9,12,3,11,4,6 +Q,1,2,2,2,1,8,8,4,2,8,7,9,2,9,3,9 +A,2,3,4,4,2,8,3,1,2,7,2,8,2,6,2,7 +T,2,7,4,5,2,8,12,4,6,6,11,8,2,12,1,8 +J,6,8,8,9,7,8,8,4,7,6,7,7,4,11,11,9 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +F,9,13,8,7,6,7,9,3,5,11,6,6,5,8,8,7 +P,6,9,8,7,7,7,7,5,5,7,6,9,6,8,7,10 +U,4,6,5,4,3,6,7,5,6,8,6,8,3,9,3,6 +X,6,11,8,9,7,8,6,3,5,6,7,8,3,9,9,9 +P,4,5,4,3,3,5,10,5,4,10,8,4,1,10,4,7 +G,3,8,4,6,3,6,6,6,6,7,5,11,3,10,4,8 +W,3,5,5,3,3,5,11,2,2,8,9,9,6,10,0,8 +H,2,3,4,2,2,7,7,2,5,10,5,8,3,7,2,8 +Z,3,8,4,6,2,7,7,3,13,10,6,8,0,8,8,8 +S,2,1,2,2,1,8,8,6,5,8,6,7,2,8,8,8 +S,7,12,7,7,4,10,3,4,3,13,6,10,3,9,3,9 +M,5,10,5,8,4,7,7,12,2,7,9,8,8,6,0,8 +G,4,8,5,6,3,5,6,5,6,6,6,9,2,8,4,7 +R,6,11,6,8,4,5,11,9,3,7,4,8,3,8,6,11 +R,9,11,7,6,4,10,6,6,5,11,2,8,6,6,5,10 +I,1,6,0,4,1,7,7,5,3,7,6,8,0,8,0,8 +U,6,9,8,8,7,7,7,5,4,5,7,8,7,7,2,6 +O,5,5,6,7,3,7,7,9,8,7,5,7,3,8,4,8 +B,9,12,8,7,7,7,8,4,5,9,6,7,8,5,9,7 +N,3,7,5,5,3,4,10,3,3,10,10,9,5,8,1,7 +J,4,9,6,7,3,6,9,2,6,14,6,7,1,7,1,7 +A,3,10,6,7,2,7,3,3,3,7,1,8,3,6,3,7 +P,3,2,4,3,2,5,10,4,5,10,8,3,1,10,4,7 +Y,2,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +Y,5,5,7,8,8,8,8,7,3,7,7,8,6,10,6,4 +N,6,7,8,5,4,9,7,3,5,10,2,5,5,9,1,7 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +F,5,10,5,6,2,6,10,3,5,13,6,5,2,8,5,6 +B,4,6,7,6,6,7,10,6,6,8,7,8,5,9,7,9 +H,6,11,8,8,7,10,7,3,6,10,3,7,6,8,5,9 +Q,5,9,5,4,3,12,3,3,4,10,3,8,3,9,5,12 +L,4,10,6,8,3,3,4,3,10,2,0,7,0,7,1,5 +E,4,8,5,6,5,7,7,5,8,7,7,9,3,8,6,9 +N,4,11,4,8,5,8,7,12,1,6,6,7,5,8,0,9 +R,4,7,6,5,4,9,7,4,6,9,4,7,3,7,5,11 +G,4,9,5,7,4,5,7,6,5,9,8,10,2,8,4,9 +L,5,12,5,7,3,10,2,3,4,12,4,11,2,8,4,10 +S,8,11,9,9,6,5,8,3,6,10,8,8,3,8,5,5 +Y,7,9,6,5,3,4,7,5,3,9,11,6,4,10,3,4 +E,2,0,2,1,1,5,7,5,8,7,6,12,0,8,7,9 +T,5,7,6,5,5,6,7,7,6,7,6,8,3,9,6,10 +J,2,5,5,4,2,10,5,4,5,14,5,11,1,6,1,7 +F,3,8,3,6,1,1,14,5,3,12,10,5,0,8,2,6 +Z,4,8,5,6,2,7,7,4,14,9,6,8,0,8,8,8 +V,6,9,6,4,2,5,12,5,2,11,7,4,3,11,2,7 +A,2,3,3,1,1,8,2,2,1,7,2,8,2,6,2,7 +I,2,2,1,4,1,7,7,1,8,7,6,8,0,8,3,8 +V,2,7,4,5,2,5,11,3,3,9,11,9,2,11,1,8 +V,2,7,4,5,2,8,11,2,3,5,10,8,2,11,1,8 +B,2,4,3,3,3,7,8,5,5,7,6,6,2,8,6,9 +C,7,9,7,7,4,4,7,5,7,11,9,14,3,10,4,7 +U,7,15,7,8,5,8,5,5,5,6,6,7,5,7,3,6 +Z,2,7,3,5,2,7,7,3,12,8,6,8,0,8,7,8 +R,10,13,8,7,5,7,7,5,5,9,4,9,7,6,7,11 +H,8,11,11,9,7,8,6,3,6,10,5,8,3,8,3,8 +Q,4,5,4,6,4,8,5,6,3,9,6,9,3,8,4,8 +Q,3,5,4,6,3,8,10,5,2,6,9,12,2,10,6,8 +Y,5,8,5,6,3,5,8,0,8,9,9,6,1,10,3,4 +A,5,10,7,8,4,9,2,3,3,8,1,8,2,7,4,8 +B,4,6,5,4,3,8,8,4,6,9,6,5,2,8,7,7 +J,2,4,4,3,1,9,5,3,7,15,6,12,0,7,0,8 +E,2,3,4,1,2,7,7,2,7,11,7,9,1,9,4,8 +K,4,5,5,4,3,4,7,5,8,7,6,13,3,8,5,9 +Q,3,7,4,9,5,8,7,8,3,5,6,9,3,8,6,10 +R,3,8,4,6,4,5,8,7,5,6,4,9,3,6,5,8 +W,8,14,8,8,6,4,8,1,3,8,9,8,10,11,2,6 +G,5,8,7,6,4,6,7,6,6,6,6,9,4,7,4,8 +T,3,5,4,3,2,5,12,3,7,11,9,5,1,11,2,5 +L,2,5,2,3,1,4,3,3,7,2,2,6,0,7,0,6 +G,3,4,4,6,2,7,5,7,7,5,5,10,1,8,6,11 +K,3,6,4,4,1,4,8,8,1,7,6,11,3,8,3,11 +Z,4,9,6,7,6,7,9,3,8,7,6,8,2,10,13,6 +E,4,9,6,7,6,8,9,7,2,6,6,11,4,7,8,9 +S,4,10,6,7,4,9,6,3,7,10,6,8,2,9,4,9 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +M,6,11,9,8,10,7,10,6,4,7,7,8,6,8,6,8 +X,3,4,4,3,2,7,7,3,9,6,6,10,2,8,6,7 +C,3,9,4,6,3,5,8,8,7,10,8,12,2,11,4,10 +T,4,10,6,8,8,7,7,4,6,7,7,9,5,9,5,7 +A,2,6,4,4,1,7,5,3,1,6,0,8,2,7,1,7 +B,5,9,7,6,9,8,6,5,4,7,7,8,7,9,7,9 +K,4,7,6,5,4,3,8,2,6,10,9,11,3,8,2,6 +K,3,4,6,2,3,7,7,2,7,10,6,9,4,8,4,7 +T,7,12,6,7,4,9,8,3,7,11,5,6,2,8,6,7 +W,11,14,12,8,7,8,9,3,4,6,9,6,11,8,2,6 +R,3,7,5,5,3,9,8,6,6,8,5,8,3,7,6,10 +M,6,8,9,6,10,6,8,4,3,7,4,8,14,3,4,7 +U,4,9,5,7,4,8,6,13,4,7,11,8,3,9,0,8 +M,1,0,2,0,0,7,6,9,0,7,8,8,5,6,0,8 +F,5,11,5,8,4,1,13,5,4,12,10,6,0,8,2,6 +L,3,7,5,5,3,7,4,1,7,8,2,9,1,6,2,8 +I,1,6,1,4,1,7,7,1,6,7,6,8,0,8,2,8 +D,7,11,9,8,8,6,7,7,5,7,7,6,4,7,4,8 +Y,6,8,6,6,2,2,12,4,6,13,12,6,1,11,1,6 +U,3,4,4,6,2,8,5,14,5,6,13,8,3,9,0,8 +Z,6,10,9,8,7,10,9,6,5,7,6,8,4,9,10,7 +U,7,11,8,8,4,4,8,7,8,10,9,9,3,9,3,5 +D,3,7,4,5,3,10,6,3,7,11,3,6,3,8,3,9 +L,9,14,9,8,5,7,4,4,5,12,8,12,4,9,6,10 +I,1,11,0,8,1,7,7,5,3,7,6,8,0,8,0,8 +O,4,9,5,7,4,7,6,8,4,7,5,9,3,8,3,8 +D,5,11,7,8,7,9,7,4,5,10,4,5,3,8,3,8 +D,2,1,3,3,2,7,7,6,6,7,6,5,2,8,2,7 +N,10,12,8,6,4,9,11,6,5,3,5,10,6,9,2,7 +B,6,9,9,8,11,7,7,5,4,8,6,8,7,9,8,7 +X,1,0,1,0,0,7,7,3,4,7,6,8,2,8,3,8 +Q,2,2,3,2,2,7,9,4,2,7,8,10,2,9,4,9 +P,5,10,6,8,6,5,10,3,7,10,9,6,4,10,4,7 +E,6,10,8,8,7,5,9,4,8,12,10,8,3,8,5,4 +Y,4,7,6,10,9,9,7,6,3,7,7,8,7,10,6,4 +M,4,9,6,7,6,8,6,6,4,7,7,8,8,5,2,7 +M,4,10,5,8,4,7,7,12,2,7,9,8,8,6,0,8 +B,1,0,1,0,0,7,7,6,4,7,6,7,1,8,5,9 +L,4,6,5,6,4,7,7,4,5,7,6,8,2,9,7,10 +N,6,8,8,6,4,10,8,3,6,10,2,4,5,9,1,7 +W,2,1,3,2,2,5,10,3,2,8,9,9,5,11,0,8 +L,3,9,4,6,2,7,4,0,9,9,2,11,0,7,2,8 +V,9,11,7,6,4,9,9,6,5,6,10,5,6,13,3,7 +M,5,10,6,5,3,10,2,1,3,9,3,9,5,4,1,9 +Q,7,12,6,6,4,10,5,4,7,11,4,8,3,8,8,11 +V,4,6,6,6,6,7,6,5,4,6,5,8,7,9,7,9 +C,7,10,7,8,5,5,7,5,7,12,8,13,4,9,5,6 +X,6,13,7,7,4,9,7,2,7,11,4,6,4,10,4,8 +D,2,1,3,2,2,7,7,6,6,7,6,5,2,8,3,7 +P,9,13,8,7,4,8,7,5,5,11,3,6,5,9,4,8 +E,2,5,4,3,2,7,7,2,8,11,7,9,2,9,4,8 +A,7,9,9,8,8,5,8,3,5,7,8,10,8,8,4,8 +L,3,7,5,5,2,6,3,2,8,7,2,10,0,7,2,8 +P,2,5,4,4,2,7,11,4,3,12,4,2,1,10,3,8 +S,3,8,4,6,3,8,7,8,6,8,6,7,2,8,9,8 +I,1,4,1,3,0,8,7,0,7,13,6,8,0,8,0,8 +U,5,9,6,8,7,7,6,4,4,6,7,8,7,8,2,7 +T,7,10,9,7,7,6,7,7,7,8,10,8,3,9,6,8 +S,4,7,4,5,2,7,6,6,9,6,7,11,0,9,9,8 +B,3,7,5,5,6,8,6,5,3,7,6,8,6,10,8,7 +M,6,5,6,8,4,7,7,13,2,7,9,8,9,6,0,8 +F,6,9,9,7,6,7,9,3,6,12,7,6,3,9,3,7 +C,4,8,5,6,3,5,8,6,6,8,8,15,3,10,4,10 +D,2,4,4,3,2,9,6,4,6,10,4,6,2,8,3,8 +X,3,9,5,6,4,7,7,3,8,5,6,8,2,8,6,8 +J,3,8,4,6,3,8,7,1,7,11,5,8,0,6,1,6 +R,2,3,4,2,2,8,7,4,5,9,4,7,2,7,4,10 +E,1,3,2,1,2,7,7,5,6,7,6,8,2,8,5,10 +Q,4,8,5,10,5,10,11,6,2,3,8,12,3,10,6,10 +L,2,5,3,3,1,4,4,4,7,2,2,6,1,7,1,6 +E,4,5,4,4,4,7,7,5,8,7,7,9,2,8,6,9 +Y,7,6,5,9,4,7,11,2,3,8,10,5,3,9,5,7 +L,2,3,2,5,1,0,1,5,6,0,0,7,0,8,0,8 +F,2,4,2,2,1,6,10,4,5,10,9,4,1,10,3,6 +X,4,8,5,6,3,8,7,4,4,7,6,8,3,8,4,8 +T,4,6,4,4,2,5,12,4,5,11,9,4,2,11,1,5 +K,4,10,4,7,2,4,8,9,2,6,3,11,4,8,2,11 +B,5,10,5,8,7,7,8,8,6,8,6,7,2,8,8,9 +E,4,7,6,5,4,9,6,2,8,11,5,9,3,8,5,10 +R,3,5,6,4,4,9,7,3,5,9,4,6,3,7,4,10 +P,3,6,4,9,8,8,9,5,0,8,7,6,5,10,3,7 +X,6,11,7,6,4,7,8,2,7,11,7,7,4,10,4,6 +K,6,10,9,8,6,5,8,2,7,10,8,10,3,8,3,8 +E,4,9,6,6,6,7,7,6,3,7,6,11,4,8,8,9 +Y,3,9,5,6,1,6,12,2,3,9,12,8,1,10,0,8 +E,4,5,4,8,3,3,8,6,11,7,5,14,0,8,7,7 +A,2,4,4,5,2,7,4,3,1,7,1,8,2,7,2,8 +X,4,7,7,5,3,10,6,1,8,10,3,7,2,8,3,9 +A,4,7,5,5,3,8,2,2,2,6,2,8,2,6,3,6 +Z,6,12,6,6,4,6,7,2,9,11,7,8,3,7,6,6 +H,4,3,4,4,2,7,7,14,0,7,6,8,3,8,0,8 +A,4,6,6,5,5,8,8,2,4,7,8,8,5,8,4,6 +Q,6,10,6,5,4,9,6,4,6,10,5,8,3,8,9,9 +O,4,6,4,4,3,9,6,7,5,10,4,10,3,8,4,7 +M,2,1,3,2,2,7,6,6,4,6,7,8,6,5,1,8 +F,4,5,4,8,2,1,12,5,4,11,10,7,0,8,3,6 +A,4,6,5,6,5,7,9,2,4,7,7,9,7,7,3,8 +D,5,11,5,6,4,6,8,5,6,9,6,7,5,10,6,5 +H,5,11,6,8,3,7,9,15,1,7,3,8,3,8,0,8 +O,2,5,3,4,2,7,7,8,5,7,6,8,2,8,3,8 +A,5,7,6,5,6,8,7,7,4,7,6,8,2,8,8,3 +T,7,15,6,8,4,9,7,3,7,12,5,7,3,9,5,6 +L,2,7,4,5,5,7,8,2,4,6,7,10,5,11,6,5 +F,3,8,4,6,2,1,14,5,3,12,10,5,0,8,2,6 +V,4,4,6,6,1,10,8,5,3,5,14,8,3,9,0,8 +P,2,3,4,2,2,7,9,3,4,12,5,4,1,10,2,8 +T,4,7,5,5,2,6,11,2,8,11,9,5,1,11,3,4 +R,5,10,5,5,4,7,7,3,4,7,5,9,5,8,6,7 +J,1,7,2,5,1,13,3,8,4,13,4,12,1,6,0,8 +L,2,3,2,5,1,0,1,5,6,0,0,7,0,8,0,8 +E,5,10,7,8,6,4,9,4,7,12,10,8,3,9,4,5 +Z,4,10,5,7,4,7,7,3,12,9,6,8,0,8,8,8 +V,3,5,6,7,2,6,8,4,3,7,14,8,3,9,0,8 +I,1,10,2,8,2,7,7,0,8,7,6,8,0,8,3,8 +E,3,10,4,7,2,3,7,6,11,7,6,15,0,8,7,7 +K,4,9,5,6,5,6,7,3,6,6,6,9,3,8,5,10 +O,4,9,5,7,4,7,7,8,6,7,6,6,2,8,3,8 +P,2,3,3,2,1,7,10,3,4,12,5,3,0,9,2,8 +N,3,5,3,3,2,7,8,5,5,7,6,6,5,10,2,5 +F,4,7,6,5,4,9,8,2,5,13,5,6,2,9,2,9 +X,4,5,5,7,2,7,7,5,4,7,6,8,3,8,4,8 +E,4,9,4,6,2,3,7,6,11,7,6,15,0,8,7,7 +D,2,5,4,4,3,9,6,4,6,10,4,6,2,8,3,8 +Z,2,8,3,6,3,7,8,3,11,8,6,8,0,8,7,8 +S,4,6,5,4,2,8,8,4,8,11,8,7,2,10,5,6 +V,2,4,4,3,1,7,12,2,2,7,11,9,2,10,1,8 +G,3,5,4,4,2,6,6,5,5,9,7,11,2,9,4,10 +O,3,5,4,3,2,7,7,7,4,9,6,7,2,8,3,7 +P,1,1,2,1,1,5,11,7,2,10,6,4,1,9,3,8 +G,4,6,5,4,3,7,6,5,6,11,6,12,2,10,3,10 +V,6,8,6,6,3,3,12,3,3,9,11,8,3,11,1,7 +E,2,5,4,3,2,7,8,2,8,11,7,9,2,9,4,8 +C,2,1,3,2,1,6,8,7,7,8,7,13,1,9,4,10 +O,2,4,3,3,2,7,7,8,5,7,6,8,2,8,3,8 +G,4,8,5,6,3,6,6,7,6,10,7,12,2,9,4,9 +U,2,0,2,1,0,7,5,10,4,7,12,8,3,10,0,8 +J,4,8,6,6,2,7,6,4,6,15,7,11,1,6,1,7 +C,3,6,5,5,4,5,6,3,4,7,6,11,4,10,7,8 +E,3,5,5,4,3,5,8,3,8,11,9,10,2,8,4,6 +Q,3,6,4,5,3,8,8,6,4,6,9,8,3,8,5,9 +S,4,8,5,6,3,9,7,4,8,11,7,7,2,10,5,8 +I,1,4,2,3,1,7,8,0,7,13,6,8,0,8,1,7 +T,3,10,5,7,1,5,15,1,6,9,11,7,0,8,0,8 +C,5,10,6,8,2,6,7,7,11,6,6,13,1,8,4,8 +X,5,11,8,8,7,7,7,3,8,5,7,10,3,8,6,8 +A,3,9,4,6,3,9,5,2,0,8,1,8,2,6,1,8 +A,4,7,5,5,5,7,7,6,3,7,6,8,2,7,8,3 +W,3,2,5,4,3,7,11,2,2,7,9,8,7,11,0,8 +G,3,3,5,5,2,8,6,7,8,6,5,10,1,8,6,11 +Y,6,11,9,8,5,6,9,1,7,6,12,9,2,11,2,8 +P,3,7,4,5,3,4,12,7,1,10,6,4,1,10,3,8 +G,2,4,3,3,2,6,7,5,5,10,7,10,2,9,4,9 +G,3,2,4,4,2,6,6,5,6,6,6,9,2,9,3,8 +H,4,7,4,5,3,7,7,12,0,7,7,7,3,8,0,8 +O,1,0,1,1,0,7,6,6,3,7,6,8,2,8,3,8 +T,2,5,3,3,2,8,12,3,6,6,11,7,2,11,1,7 +L,2,6,4,4,2,6,4,3,8,6,2,7,1,6,2,7 +X,5,8,8,6,4,6,8,1,8,10,9,9,2,9,3,7 +O,2,3,3,1,1,8,7,7,5,7,6,8,2,8,3,8 +A,4,9,4,4,3,10,3,4,2,10,5,11,5,4,4,10 +G,4,7,4,5,3,6,7,5,5,9,7,12,2,9,4,10 +J,3,9,5,7,5,9,9,3,3,8,4,6,4,8,5,5 +J,3,11,4,8,5,7,7,2,5,11,5,9,4,7,2,6 +T,3,3,4,2,1,5,11,3,7,11,9,5,1,11,2,5 +J,4,8,5,6,3,7,5,5,4,14,8,14,1,6,1,7 +M,6,11,9,8,9,9,7,5,5,6,7,5,11,8,4,6 +M,4,2,5,3,4,9,6,6,4,6,7,6,9,6,3,6 +H,3,6,4,4,2,7,6,14,1,7,7,8,3,8,0,8 +N,2,1,2,1,1,7,7,12,1,5,6,8,5,8,0,8 +D,1,0,1,1,0,5,7,7,5,6,6,6,2,8,3,8 +X,7,13,6,7,3,8,7,2,8,9,6,8,4,8,4,8 +Z,1,0,2,1,0,7,7,2,10,8,6,8,0,8,6,8 +T,3,5,4,7,1,9,14,0,6,5,11,8,0,8,0,8 +B,5,8,8,7,9,8,6,5,5,7,6,7,8,11,9,6 +P,8,15,8,8,5,9,8,4,4,11,4,5,5,11,6,7 +I,1,8,0,6,1,7,7,5,3,7,6,8,0,8,0,8 +Z,3,5,4,4,3,7,7,5,10,6,6,8,2,8,7,8 +G,2,0,2,1,1,8,6,6,5,6,5,9,1,8,5,10 +N,5,11,6,8,6,8,8,13,1,6,6,8,6,8,1,10 +R,3,6,4,4,4,6,10,7,3,7,4,8,2,6,5,11 +Z,3,6,6,4,3,7,7,2,10,12,6,8,1,8,6,8 +J,3,8,5,6,5,9,7,3,3,8,4,5,4,8,6,5 +S,2,4,4,3,2,7,7,2,7,10,5,7,1,8,5,8 +B,2,7,3,5,2,6,6,9,7,6,7,7,2,8,8,10 +Z,5,8,7,6,5,8,7,2,9,12,6,7,1,7,6,7 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +V,5,5,6,4,2,4,12,3,3,10,11,7,2,10,1,8 +I,0,1,1,2,0,7,7,2,6,7,6,8,0,8,2,8 +O,4,8,6,6,3,8,6,8,8,7,5,8,3,8,4,8 +Q,2,5,3,6,4,8,7,8,3,6,6,10,2,9,4,9 +P,7,11,10,9,8,7,11,6,4,11,5,3,2,11,4,8 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +N,4,11,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +F,2,7,3,5,2,1,11,3,5,11,11,9,0,8,2,7 +Z,8,10,6,14,5,6,11,3,3,12,7,6,3,9,13,5 +W,4,7,6,5,4,6,11,2,3,7,9,9,8,11,1,8 +I,1,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +C,8,15,5,8,3,7,7,8,8,12,7,10,2,9,5,9 +C,3,3,4,4,1,6,7,7,9,7,6,13,1,9,4,9 +E,5,9,7,7,8,8,7,3,5,6,7,9,5,10,8,8 +O,4,5,6,4,4,6,6,5,5,8,4,7,3,7,4,7 +D,5,7,6,6,6,6,7,5,6,6,4,7,4,7,6,5 +V,6,8,6,6,3,3,12,3,3,10,11,8,2,10,1,8 +E,2,1,3,2,2,7,7,5,7,7,6,8,2,8,5,10 +R,3,9,4,7,4,6,9,8,3,7,5,8,2,7,5,11 +Z,2,3,3,2,2,7,7,5,9,6,6,9,1,8,7,8 +J,4,5,6,6,5,8,9,4,5,7,6,8,3,8,8,7 +X,4,9,6,7,6,9,7,2,6,7,5,6,3,8,6,8 +E,3,9,5,7,4,7,7,6,9,6,4,9,2,8,6,9 +E,4,7,5,5,3,7,7,6,10,7,7,9,3,8,6,8 +F,9,14,8,8,6,9,8,3,5,12,4,5,5,7,8,9 +A,1,1,2,1,1,7,3,2,1,6,2,8,1,6,1,7 +T,10,14,8,8,4,7,8,3,10,13,6,6,2,9,5,5 +V,2,3,3,2,1,4,12,3,3,10,11,7,2,11,0,8 +H,4,7,6,5,5,7,7,2,6,10,6,8,3,8,3,8 +Q,6,10,6,5,3,12,3,3,7,11,2,8,2,9,5,13 +Y,6,9,5,4,2,5,9,4,4,11,9,6,4,10,4,4 +F,3,5,5,3,2,6,10,2,6,13,7,5,1,9,2,7 +I,1,3,0,2,0,7,7,1,7,7,6,8,0,8,2,8 +N,2,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +U,4,9,4,4,3,6,6,5,4,7,8,8,4,7,3,8 +V,4,6,4,4,2,2,12,3,3,11,11,8,2,11,1,8 +N,6,7,8,5,4,7,9,2,5,10,5,6,5,9,1,7 +H,3,7,4,5,3,8,7,7,6,7,6,7,3,8,4,7 +C,6,12,5,6,4,8,6,4,3,9,8,11,4,9,7,11 +M,6,8,10,6,7,4,7,3,5,11,10,11,9,8,4,7 +R,1,0,1,1,1,6,9,7,3,7,5,8,2,7,4,10 +F,3,3,5,2,2,6,11,2,5,13,7,4,1,9,1,7 +K,8,11,11,8,7,9,7,2,7,10,3,8,3,8,3,9 +Z,5,10,6,8,3,7,7,4,15,9,6,8,0,8,9,8 +Y,1,1,2,2,1,7,11,1,6,7,11,8,1,11,1,8 +Y,5,7,6,9,9,8,8,7,3,7,7,8,9,11,6,4 +W,3,7,5,5,3,6,8,4,1,7,8,8,8,9,0,8 +Q,2,0,2,1,1,8,7,7,5,6,6,9,2,8,3,8 +R,4,6,6,6,6,6,8,4,3,6,5,9,7,6,7,8 +P,6,11,9,8,6,6,12,4,4,13,6,3,1,10,3,8 +S,7,11,8,8,6,5,9,3,7,10,6,6,3,7,5,5 +K,4,8,6,6,4,6,8,4,7,6,5,10,3,8,4,9 +T,10,14,8,8,3,4,12,3,8,12,8,4,2,9,3,3 +D,6,11,6,8,6,5,7,10,7,5,4,6,4,10,5,9 +O,5,10,5,8,4,8,7,8,5,10,6,8,3,8,3,8 +Z,1,0,2,1,0,7,7,3,11,8,6,8,0,8,6,8 +R,6,9,9,8,9,7,7,4,4,7,5,8,8,7,7,9 +A,6,11,8,8,8,8,9,8,5,6,6,8,3,7,8,4 +O,6,7,8,6,6,7,5,4,5,8,5,11,5,6,7,6 +N,3,7,4,5,2,7,7,14,2,5,6,8,6,8,0,8 +S,2,1,3,2,2,8,8,6,5,7,6,7,2,8,9,8 +Z,9,10,6,14,6,6,10,4,2,12,7,6,3,9,14,6 +Z,2,7,3,5,2,7,8,3,11,8,6,8,0,8,7,7 +X,3,8,5,6,4,7,7,3,8,6,6,8,3,8,6,7 +H,5,5,5,7,3,7,8,15,1,7,4,8,3,8,0,8 +G,4,9,6,7,7,7,9,6,3,6,6,10,4,8,7,7 +Y,3,5,4,7,6,7,9,3,2,7,7,8,3,11,7,6 +I,1,4,3,2,1,7,7,1,8,14,6,8,0,8,1,8 +N,8,10,7,6,3,7,10,5,5,4,5,10,6,11,3,7 +P,4,9,4,6,4,5,10,8,2,9,6,5,1,10,3,8 +P,4,7,5,5,5,5,9,6,4,8,7,9,2,9,7,10 +Y,6,9,5,4,3,6,8,3,4,10,8,5,3,10,4,4 +N,3,7,4,5,3,5,9,6,4,8,7,9,5,8,1,7 +L,5,11,6,8,4,10,3,2,7,9,2,9,4,5,5,9 +E,6,8,8,7,8,5,10,4,5,8,7,9,4,10,9,7 +S,5,9,6,7,5,8,8,7,5,7,5,7,2,7,9,8 +B,3,5,4,4,3,8,7,6,6,6,5,6,2,8,6,10 +D,2,3,4,1,2,9,6,4,6,10,4,6,2,8,3,8 +V,4,4,5,3,1,4,12,4,4,11,11,6,2,10,1,8 +A,4,5,7,7,2,7,6,3,0,7,0,8,3,7,1,8 +I,3,9,4,6,2,5,8,0,8,14,7,8,0,8,1,7 +Q,5,6,5,8,5,8,8,5,2,8,8,10,3,9,6,8 +C,2,1,2,1,0,6,7,6,9,7,6,14,0,8,4,10 +R,3,5,5,4,3,8,7,3,5,10,4,6,3,7,3,9 +K,9,12,9,6,5,8,7,3,6,10,7,9,6,12,4,9 +G,3,4,4,3,2,6,6,5,5,7,6,9,3,7,4,8 +H,8,12,7,6,4,9,9,4,7,8,2,5,6,6,4,8 +Y,4,5,5,8,7,10,8,5,3,7,7,7,6,10,8,4 +L,4,9,5,7,3,6,4,4,8,5,2,6,1,6,2,6 +V,3,6,5,4,3,8,11,3,2,5,10,9,3,10,3,10 +J,0,0,1,1,0,12,4,5,3,12,4,11,0,7,0,8 +L,2,5,4,3,2,7,4,1,8,8,2,10,0,7,3,8 +L,3,8,4,6,2,4,3,6,7,1,1,5,1,6,1,6 +E,6,11,8,8,6,4,9,2,8,10,8,9,3,8,5,5 +Y,5,6,6,9,6,10,12,5,4,6,7,7,6,11,8,6 +J,1,2,2,3,1,10,6,3,5,12,4,9,1,6,1,7 +A,2,8,4,5,2,6,5,3,1,6,1,8,2,7,2,7 +K,2,1,2,1,0,5,7,8,1,7,6,11,3,8,2,11 +R,4,7,7,6,6,7,7,3,3,7,5,8,6,8,5,7 +Y,7,9,7,7,3,4,11,2,8,12,11,5,1,10,2,4 +U,4,4,5,3,2,5,8,5,8,10,8,8,3,9,2,5 +C,5,4,6,7,2,5,7,7,11,7,5,12,1,9,4,8 +O,5,8,5,6,4,7,7,8,5,10,7,8,3,8,4,8 +F,5,7,7,8,7,7,10,5,5,8,7,9,5,9,7,5 +P,2,1,3,2,2,5,9,5,4,9,7,4,1,10,3,7 +D,3,6,4,4,3,7,8,8,7,8,7,3,3,8,3,7 +B,2,2,2,3,2,7,7,6,5,7,6,6,2,8,5,10 +X,5,9,8,6,4,6,8,1,8,10,9,9,2,9,3,7 +H,3,5,5,3,3,6,7,6,6,7,6,9,3,8,3,8 +I,2,5,4,4,2,7,7,0,8,13,6,8,0,8,1,8 +U,3,6,3,4,1,7,5,13,5,7,13,8,3,9,0,8 +U,5,5,6,8,2,8,5,14,5,6,15,8,3,9,0,8 +M,4,3,5,4,4,8,6,6,4,6,7,8,9,5,3,6 +R,4,2,4,3,3,7,8,5,5,6,5,6,3,7,4,8 +C,1,3,2,1,1,5,9,4,6,11,9,11,1,9,2,8 +C,4,9,5,6,4,5,8,7,6,9,8,14,2,10,4,10 +B,3,7,5,5,4,7,8,7,6,7,5,6,2,8,7,10 +O,7,9,9,8,6,5,7,6,8,9,7,8,4,5,6,5 +L,2,4,3,3,1,5,4,4,7,2,2,5,1,7,1,6 +G,2,1,4,2,2,7,7,5,5,7,6,9,3,7,4,9 +B,3,5,5,4,5,7,7,4,4,7,6,8,6,9,8,6 +P,6,7,8,9,8,7,9,2,3,7,9,6,6,10,6,4 +F,2,4,3,2,2,5,10,4,5,10,9,5,1,10,3,6 +S,4,4,5,6,3,7,6,5,9,5,6,8,0,9,9,8 +X,3,6,5,4,3,7,7,3,8,6,6,9,3,8,6,8 +F,4,9,6,7,4,5,11,4,6,11,10,5,2,10,3,5 +T,2,3,3,1,1,5,12,3,5,11,9,5,1,10,1,5 +O,6,10,4,5,2,8,7,6,5,9,4,7,5,9,5,9 +V,4,7,6,5,7,7,8,4,1,8,7,8,5,10,5,8 +X,2,2,3,3,2,8,7,3,8,6,6,7,2,8,5,7 +U,5,7,6,5,4,5,7,5,7,9,7,9,3,9,3,6 +N,4,3,4,5,2,7,7,14,2,5,6,8,6,8,0,8 +M,4,9,5,6,5,6,6,6,4,7,7,11,7,5,2,10 +N,4,6,6,4,3,7,8,3,4,10,6,7,5,8,0,7 +R,3,9,5,6,4,6,7,6,6,6,6,6,3,8,6,8 +B,4,6,6,5,6,8,8,5,5,7,6,8,6,8,8,3 +W,4,7,7,5,5,5,11,2,2,8,9,8,7,12,1,8 +Z,1,0,1,1,0,7,7,2,9,9,6,8,0,8,6,8 +P,7,14,7,8,5,8,9,4,4,12,5,4,4,11,6,6 +B,6,8,9,7,9,7,8,5,5,8,6,8,7,7,9,6 +O,3,2,4,3,2,7,7,7,5,7,7,7,2,8,3,7 +Y,4,7,6,5,3,8,10,1,6,4,11,9,2,11,2,8 +D,2,3,3,1,2,9,6,3,6,10,4,6,2,8,2,9 +K,2,6,3,4,1,4,8,8,2,7,4,11,3,8,2,10 +A,5,11,8,8,5,11,2,3,3,9,2,9,5,7,4,9 +C,1,0,2,0,0,7,7,6,8,7,6,13,0,8,4,10 +Z,4,10,5,8,5,8,7,6,10,7,5,7,1,7,8,8 +A,3,6,5,5,4,9,7,3,5,7,8,6,4,10,3,5 +I,5,11,6,9,4,9,5,2,5,6,7,5,1,10,4,7 +H,6,9,6,5,4,8,7,3,4,10,5,7,6,9,5,7 +D,3,2,4,4,3,7,7,7,7,7,6,5,2,8,3,7 +B,3,6,4,4,4,6,7,6,3,6,5,7,2,8,6,6 +B,4,6,6,4,6,9,9,4,4,5,7,7,7,12,6,8 +M,2,0,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +A,1,3,2,1,1,9,3,2,1,8,2,9,1,6,0,8 +L,1,0,1,0,0,2,2,5,4,1,2,6,0,8,0,8 +M,4,7,7,5,7,9,5,2,1,8,4,8,10,5,2,6 +B,6,10,6,8,5,6,6,9,8,6,6,7,2,8,10,10 +F,2,3,3,4,1,1,14,4,3,12,9,5,0,8,2,6 +L,4,3,4,5,1,1,0,6,6,0,1,4,0,8,0,8 +A,3,7,5,5,3,11,2,3,2,10,2,9,2,6,3,8 +Q,2,2,2,3,2,8,8,5,2,7,8,10,2,9,4,8 +Y,3,7,5,5,2,7,10,1,2,7,12,8,1,11,0,8 +X,3,7,5,5,2,6,9,1,8,10,8,8,2,8,3,7 +T,1,1,2,1,0,7,14,1,4,7,10,8,0,8,0,8 +Q,2,4,3,4,3,8,8,6,3,8,7,9,2,9,4,9 +N,6,11,9,9,7,7,7,8,5,7,5,6,3,7,3,8 +D,3,6,5,5,5,7,7,4,6,7,4,8,4,7,6,5 +M,5,6,8,4,4,9,6,3,5,9,5,7,8,6,2,8 +Q,4,6,5,7,4,8,6,6,4,9,6,10,3,8,5,8 +F,3,9,4,7,3,0,11,3,4,11,11,8,0,8,2,7 +V,3,5,6,4,2,6,12,2,3,8,11,8,2,10,1,9 +V,4,9,7,7,2,9,8,5,3,6,14,8,3,9,0,8 +O,4,6,5,4,5,8,5,5,2,7,5,8,8,8,3,9 +E,6,8,8,6,5,7,8,2,10,11,6,9,2,8,4,8 +H,3,7,4,5,3,7,7,12,1,7,6,8,3,8,0,8 +S,2,7,3,5,3,8,7,7,6,7,8,9,2,10,8,8 +I,3,9,5,7,6,10,8,2,5,9,5,4,3,9,6,5 +X,2,7,4,5,2,7,7,4,8,6,6,8,3,8,6,8 +U,2,0,2,1,1,8,5,11,5,7,13,8,3,10,0,8 +X,3,5,4,3,2,7,7,3,9,6,6,7,3,8,6,7 +T,3,5,4,3,2,9,12,3,7,5,11,9,1,11,1,8 +N,2,4,4,3,2,6,8,2,4,10,7,8,4,8,0,8 +Q,4,7,6,6,5,6,4,4,4,5,3,7,3,6,5,6 +A,2,4,4,3,2,9,2,2,2,8,2,9,1,6,1,7 +O,7,12,5,6,3,5,8,6,4,10,7,9,5,10,5,8 +V,7,9,7,7,3,3,11,2,4,9,11,7,5,11,1,6 +R,4,7,5,5,3,6,10,9,4,6,4,8,2,8,5,10 +R,3,7,5,5,4,7,8,5,6,8,5,9,3,6,5,11 +V,8,14,7,8,3,9,10,4,6,6,11,6,4,11,3,6 +F,2,1,2,2,1,5,10,4,5,10,9,5,1,10,3,7 +Y,3,6,5,9,8,8,6,4,1,7,8,9,7,10,8,8 +X,4,6,6,4,3,8,7,2,8,10,5,8,3,8,4,8 +M,5,6,7,5,7,7,9,4,4,7,5,7,9,8,5,5 +Y,2,1,3,1,0,7,10,3,1,7,13,8,1,11,0,8 +X,3,8,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +U,4,6,6,5,5,7,8,4,3,6,6,8,4,7,1,7 +G,6,11,5,6,4,8,5,4,3,9,6,9,4,9,8,8 +S,3,7,4,5,2,7,8,4,8,11,8,8,2,10,5,7 +F,6,10,10,8,9,8,8,1,6,10,6,5,5,10,4,6 +L,2,4,3,2,1,6,4,1,8,7,2,10,0,7,2,8 +S,5,9,8,7,9,7,4,3,3,7,5,7,4,8,11,6 +M,5,8,7,6,5,11,5,2,4,9,3,6,7,6,2,8 +U,4,9,4,7,2,7,5,14,5,7,14,8,3,9,0,8 +A,2,1,3,3,1,7,2,1,2,6,2,7,2,5,2,8 +S,3,7,5,5,6,7,5,3,3,6,5,7,3,8,9,3 +J,4,9,5,7,3,7,9,2,6,14,5,7,0,6,1,7 +X,3,7,4,5,2,7,7,4,4,7,6,8,2,8,4,8 +J,3,7,5,5,4,8,9,4,3,8,5,6,6,9,6,4 +T,4,7,5,5,5,6,8,3,5,7,6,9,5,9,4,8 +E,3,6,4,4,4,8,7,6,3,7,6,10,3,8,7,9 +T,4,7,6,5,6,5,8,4,6,7,6,10,5,8,5,7 +L,6,11,6,6,3,8,4,3,5,12,7,12,3,8,6,9 +F,3,5,5,3,2,6,10,2,6,13,7,5,1,10,2,7 +R,5,9,7,8,8,7,8,3,4,7,5,8,7,8,6,8 +D,3,6,4,4,4,7,7,4,6,7,6,6,3,8,2,7 +M,5,9,6,4,3,7,3,3,2,7,4,10,6,3,2,8 +A,1,3,2,2,1,10,2,3,1,9,2,9,2,6,1,7 +Q,4,9,5,10,7,8,6,8,3,6,5,9,3,8,6,10 +M,4,4,5,6,3,7,7,12,1,7,9,8,8,6,0,8 +W,2,1,4,2,2,7,11,2,2,7,9,8,5,11,0,8 +M,4,4,7,3,4,7,6,3,4,9,8,9,7,5,2,8 +Q,4,6,4,7,4,7,9,5,3,7,9,11,3,9,7,8 +B,3,8,4,6,4,7,7,7,6,7,6,6,2,8,7,9 +U,2,1,2,1,1,8,5,11,5,7,13,8,3,10,0,8 +I,1,5,1,4,1,7,7,1,7,7,6,9,0,8,3,8 +N,6,10,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +I,1,2,1,3,1,7,7,1,7,7,6,8,0,8,3,8 +U,6,11,9,8,5,6,8,6,8,7,9,10,3,9,1,8 +C,6,11,6,8,4,2,9,5,7,11,11,13,1,8,2,7 +W,8,9,8,6,6,2,10,2,3,10,10,9,7,10,2,7 +Z,3,5,5,6,3,10,3,2,6,7,3,6,1,8,7,7 +U,6,8,6,6,3,4,8,6,8,10,10,9,3,9,2,5 +W,3,7,5,5,4,7,10,2,3,6,9,8,7,11,1,8 +U,5,8,6,6,3,4,9,5,7,12,11,9,3,9,2,7 +M,2,1,3,1,2,7,6,6,4,6,7,7,7,6,2,7 +B,5,11,8,8,10,9,5,5,5,7,7,7,7,9,8,9 +W,4,8,6,6,3,9,8,4,1,7,8,8,8,9,0,8 +Z,2,2,3,3,2,7,7,5,9,6,6,8,2,8,7,8 +T,3,1,4,3,2,7,12,4,6,7,11,8,2,11,1,8 +U,2,5,3,4,2,7,8,7,8,8,9,7,3,9,1,8 +T,1,0,2,0,0,7,14,1,4,7,10,8,0,8,0,8 +Z,4,9,5,7,5,8,7,5,9,7,5,7,1,7,7,8 +E,6,10,5,5,3,7,8,4,4,10,6,8,3,9,9,9 +S,2,6,3,4,2,8,8,7,6,7,5,8,2,8,9,8 +X,4,9,5,6,1,7,7,4,4,7,6,8,3,8,4,8 +S,4,8,5,6,3,7,6,6,10,5,6,10,0,9,9,8 +V,5,10,5,7,3,4,11,2,3,9,11,7,2,10,1,8 +A,7,12,7,7,4,12,1,4,1,11,4,12,5,4,4,11 +B,6,10,8,8,9,8,7,5,6,7,6,6,2,8,6,10 +J,4,8,3,12,3,8,7,3,3,11,4,5,3,8,7,10 +Z,2,1,3,2,2,7,7,5,9,6,6,8,1,8,7,8 +L,5,9,6,6,5,6,7,7,5,6,6,9,6,8,5,11 +A,3,11,5,8,4,12,3,2,2,9,2,9,2,6,2,8 +H,5,10,5,8,5,7,8,13,1,7,5,8,3,8,0,8 +S,4,7,5,5,3,8,7,3,6,9,6,7,2,8,5,8 +Y,2,5,4,3,2,7,10,1,7,7,11,8,2,11,2,8 +C,2,2,3,4,2,6,8,8,7,9,8,12,1,10,4,10 +K,4,8,4,6,2,3,6,8,3,7,7,11,4,8,3,10 +C,5,9,6,8,7,6,7,5,5,6,7,12,6,9,8,10 +Y,1,1,3,2,1,8,11,1,6,6,10,8,1,11,1,8 +Y,3,6,5,4,1,6,10,3,2,8,13,8,2,11,0,8 +P,4,8,4,5,2,3,14,7,1,11,7,3,0,10,4,8 +D,3,4,5,3,3,9,6,4,6,10,4,6,2,8,3,8 +Q,1,0,2,1,1,8,7,6,4,6,6,9,2,8,3,8 +T,4,4,4,3,2,5,12,3,7,12,9,4,1,11,1,5 +S,3,9,4,7,2,9,9,6,10,5,5,5,0,7,9,7 +O,3,5,4,4,3,8,7,7,4,9,6,8,2,8,3,7 +V,6,8,6,6,3,3,12,4,4,10,12,7,2,10,1,8 +O,5,11,5,8,6,8,6,8,4,9,4,8,3,8,3,8 +K,3,4,4,3,3,6,7,4,7,7,6,11,3,8,5,10 +F,5,8,7,6,5,7,9,2,5,13,6,5,2,10,2,8 +T,3,7,4,5,3,7,11,1,8,7,11,8,0,10,1,8 +T,3,4,4,3,1,5,12,2,7,11,9,5,0,10,1,5 +P,3,4,5,3,2,7,10,3,4,12,4,2,1,10,2,8 +L,4,10,6,8,4,5,5,1,9,6,2,10,1,7,3,7 +H,5,8,7,6,5,5,8,3,6,10,8,9,3,8,3,6 +C,2,5,3,3,2,6,8,7,7,9,7,12,2,9,4,10 +T,4,10,6,7,5,9,11,3,7,5,11,8,2,12,1,8 +W,4,7,6,5,8,9,6,5,2,7,6,8,10,10,2,7 +D,5,11,7,8,5,8,8,6,7,10,6,4,4,7,5,10 +S,5,10,6,8,4,10,7,4,6,10,3,7,3,9,5,11 +C,1,0,2,1,0,6,7,6,8,7,6,14,0,8,4,10 +F,4,9,5,6,2,1,14,5,3,12,9,4,0,8,3,6 +X,3,6,5,4,4,7,7,3,5,6,6,9,2,8,8,8 +N,4,7,6,5,3,4,9,4,4,10,10,9,5,8,1,7 +C,6,9,8,7,5,7,7,8,6,8,5,11,4,9,4,8 +W,6,9,8,7,4,11,8,5,2,6,9,8,8,9,0,8 +R,6,11,8,8,7,9,7,3,6,10,3,7,3,6,3,11 +Q,1,0,2,1,0,8,7,6,3,6,6,9,2,8,3,8 +H,2,1,3,2,2,7,8,6,6,7,6,9,3,8,3,8 +Y,2,7,3,4,0,7,11,1,3,8,12,8,1,11,0,8 +J,2,3,2,5,1,12,3,9,3,13,5,12,1,6,0,8 +P,6,6,8,8,8,6,11,2,3,8,9,6,5,10,5,6 +M,3,6,4,4,4,7,5,10,0,6,8,8,6,5,0,7 +J,2,3,3,5,1,13,3,8,4,13,4,11,1,6,0,8 +Y,5,10,8,8,5,8,10,1,7,4,11,8,1,11,2,8 +A,1,3,3,2,1,8,3,2,2,7,2,8,2,6,2,7 +S,5,10,6,7,4,6,8,5,8,11,10,7,2,10,5,5 +N,5,4,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +I,2,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +I,1,1,1,3,0,7,7,1,8,7,6,8,0,8,3,8 +A,6,11,6,6,4,10,2,4,2,11,5,12,5,4,6,10 +V,5,8,7,6,5,7,12,2,1,7,10,8,5,11,6,8 +C,4,7,5,5,2,4,9,6,8,13,11,10,1,9,2,6 +C,5,8,5,6,3,6,7,5,6,12,8,13,3,9,4,7 +G,3,7,5,5,5,8,9,6,3,6,6,9,4,8,6,7 +W,6,10,6,7,7,4,10,2,3,9,8,8,7,11,2,7 +W,6,8,9,7,11,9,7,5,5,7,5,8,12,10,9,4 +C,3,7,4,5,2,6,8,8,8,9,7,12,1,10,4,9 +Y,4,10,6,8,3,7,10,1,7,7,12,8,1,11,2,8 +L,4,7,5,5,6,6,7,3,6,7,7,11,6,11,6,5 +K,2,1,2,1,1,6,7,4,7,6,6,10,3,8,4,9 +F,1,3,3,2,1,7,9,2,4,13,6,6,1,9,1,8 +S,2,3,2,2,2,8,7,6,5,7,7,8,2,9,8,8 +I,0,0,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +R,5,9,7,7,6,6,8,6,6,6,5,8,3,6,6,9 +Y,3,5,5,8,7,8,7,4,2,6,8,9,4,11,7,8 +W,4,7,6,5,4,7,8,4,0,6,9,8,7,12,0,8 +N,6,7,8,5,3,8,8,3,5,10,5,6,6,9,1,7 +I,1,6,1,4,1,7,7,0,7,7,6,8,0,8,2,8 +X,3,7,4,5,3,8,7,2,5,6,6,7,2,8,8,9 +Z,6,10,8,7,5,6,9,3,10,12,9,7,1,9,6,6 +U,5,10,7,7,5,6,8,8,5,5,6,12,5,9,7,3 +H,4,11,6,8,10,8,9,5,3,6,7,7,8,8,10,8 +U,5,8,5,6,2,7,4,14,5,7,14,8,3,9,0,8 +F,2,7,4,5,2,5,11,2,7,10,9,5,1,10,3,5 +K,4,9,5,7,2,3,7,8,2,7,6,12,3,8,3,11 +V,2,6,4,4,2,9,12,2,3,4,10,9,2,11,1,9 +H,2,3,3,1,2,7,8,6,6,7,6,9,3,8,3,8 +G,2,1,3,1,1,8,6,6,6,6,5,9,1,7,6,10 +Z,2,7,4,5,4,8,8,2,7,7,7,7,0,8,8,9 +L,6,11,8,8,10,7,7,3,6,6,7,11,6,11,7,5 +S,3,4,5,3,2,8,8,2,8,11,5,6,1,9,4,8 +F,4,9,4,7,3,1,12,4,4,11,10,7,0,8,2,7 +Z,2,4,3,2,1,8,7,2,9,11,5,9,1,9,5,8 +P,7,10,7,5,4,7,10,3,6,13,5,4,3,10,5,6 +G,5,11,5,8,5,5,7,5,4,9,9,9,2,8,5,9 +E,6,9,8,7,7,8,5,7,3,8,6,11,5,8,8,10 +U,9,11,9,8,7,4,8,5,8,9,7,9,6,8,4,3 +D,4,5,4,8,3,5,7,11,8,7,7,5,3,8,4,8 +E,5,9,7,6,4,7,7,2,9,11,6,9,2,8,4,8 +I,1,8,2,6,2,7,7,0,7,7,6,8,0,8,2,8 +W,9,12,9,6,5,4,8,2,4,8,10,8,10,10,2,5 +K,1,0,2,1,0,5,8,8,1,7,6,11,3,8,2,11 +R,5,6,7,5,7,6,7,4,3,6,5,9,7,9,6,10 +H,11,13,10,7,5,8,9,4,6,9,5,7,6,8,5,9 +I,2,8,3,6,1,7,7,0,7,13,6,9,0,8,1,8 +C,5,5,6,7,2,5,7,7,11,7,6,12,1,8,4,9 +J,1,1,2,2,1,11,7,1,5,11,4,7,0,7,0,8 +N,3,6,4,4,3,6,9,6,4,7,6,8,5,9,1,7 +P,7,10,6,5,4,6,12,5,3,12,6,3,3,11,5,6 +D,2,5,4,3,3,9,6,3,6,10,4,7,3,7,3,8 +T,3,7,5,5,3,7,12,3,7,8,11,7,2,11,1,7 +F,2,2,3,3,2,5,11,4,5,11,9,5,1,10,3,6 +K,1,0,1,0,0,5,7,7,0,7,6,10,2,8,2,11 +W,8,11,7,6,4,1,9,3,2,11,12,9,7,10,0,6 +H,2,1,3,2,2,6,7,6,5,7,6,8,3,8,3,8 +I,5,8,6,9,6,7,8,5,6,7,7,7,3,9,9,9 +Y,3,9,5,6,1,7,12,1,3,7,12,8,1,10,0,8 +H,3,3,5,2,3,7,7,3,6,10,6,8,3,8,3,7 +F,7,13,6,7,3,7,9,3,6,12,5,5,2,8,6,6 +V,7,11,7,8,4,2,12,2,3,9,11,8,2,10,1,7 +O,4,9,4,7,4,7,8,7,4,9,7,8,3,8,3,7 +C,4,9,5,6,3,5,7,6,8,5,7,12,1,7,4,9 +E,3,9,5,6,5,6,8,3,6,6,7,11,4,11,8,8 +H,8,10,8,5,5,8,8,3,5,10,3,7,6,5,4,7 +E,3,7,4,5,3,3,7,5,9,7,6,14,0,8,6,9 +B,3,7,4,5,3,7,6,9,7,6,7,7,2,9,8,9 +N,8,11,11,8,5,9,7,3,6,10,3,5,6,8,2,7 +P,2,4,4,3,2,7,11,5,2,11,5,3,1,10,2,9 +N,2,3,4,2,1,7,9,3,4,10,7,7,5,8,1,8 +U,4,4,5,3,2,4,8,5,8,10,10,9,3,9,2,6 +O,6,11,7,8,3,8,8,8,9,6,7,9,3,8,4,8 +C,3,4,4,3,2,6,8,7,7,9,8,12,2,10,3,9 +F,2,2,3,3,2,5,10,4,5,10,9,5,1,10,3,6 +Q,2,1,2,1,1,8,7,7,4,6,6,8,2,8,3,8 +F,2,6,3,4,2,4,11,5,5,11,10,6,2,10,2,6 +T,3,10,5,7,1,8,14,0,6,6,11,8,0,8,0,8 +I,0,1,1,2,1,7,7,1,6,7,6,8,0,8,2,8 +R,3,6,5,4,5,7,8,3,4,6,6,9,6,8,7,6 +T,3,8,5,6,3,6,12,4,7,9,12,7,2,12,1,7 +X,3,7,4,5,4,6,6,3,5,6,6,10,2,8,8,7 +A,2,4,4,2,2,11,2,2,1,9,2,9,2,7,2,9 +L,3,9,5,6,6,7,8,3,6,5,7,10,5,12,6,5 +C,5,8,6,6,2,6,6,7,11,8,5,12,1,9,4,8 +R,4,7,6,5,4,10,7,3,7,11,2,6,4,5,3,9 +P,6,6,8,9,8,7,9,3,2,8,8,6,8,11,6,5 +G,4,7,5,5,2,7,6,7,9,6,5,10,1,8,6,11 +X,5,11,7,8,5,4,8,1,8,9,10,10,2,9,3,5 +M,4,10,5,8,4,8,7,12,2,6,9,8,8,6,0,8 +S,5,9,6,7,3,8,7,4,8,11,6,7,2,9,5,8 +L,6,10,7,8,6,6,6,7,6,6,5,8,5,7,4,10 +L,2,5,4,4,2,7,4,1,7,9,2,10,0,7,2,8 +Y,3,10,5,7,1,7,10,1,3,7,12,8,1,11,0,8 +U,3,3,4,2,1,4,8,4,6,11,11,9,3,9,0,7 +F,2,5,4,4,2,6,10,2,6,13,7,6,1,9,2,7 +G,2,3,3,2,2,7,7,5,5,9,7,10,2,8,4,9 +Q,4,7,6,7,3,8,9,8,5,6,7,9,3,8,5,9 +V,8,9,10,8,12,7,6,5,5,7,6,8,7,10,6,9 +H,3,4,6,2,3,9,6,3,5,10,5,7,3,8,3,7 +K,4,9,6,7,8,7,9,3,5,5,6,8,8,9,8,7 +T,2,7,4,5,1,9,14,1,6,5,11,9,0,8,0,8 +L,5,11,4,6,2,5,5,3,7,9,4,12,2,6,5,7 +M,3,5,6,4,4,7,7,2,4,9,7,8,7,5,1,8 +O,4,9,5,7,4,8,7,8,4,7,6,4,4,8,4,8 +H,4,7,4,5,4,7,9,12,1,7,4,8,3,7,0,8 +U,2,0,2,1,0,8,5,11,4,7,13,8,3,10,0,8 +R,4,2,4,3,3,7,8,5,6,6,5,7,3,7,4,8 +B,7,10,9,8,7,9,7,4,7,10,5,6,2,8,6,10 +D,3,6,4,4,3,8,7,4,5,10,5,5,3,8,3,8 +L,3,10,3,8,1,0,1,5,6,0,0,7,0,8,0,8 +V,3,4,4,3,1,4,12,3,3,10,11,7,2,11,1,8 +E,1,0,1,1,1,5,7,5,8,7,6,12,0,8,6,9 +V,4,11,6,8,4,6,11,2,3,7,11,9,2,10,1,9 +U,4,6,5,4,3,6,8,6,7,6,9,9,3,9,1,8 +O,3,6,5,4,3,7,6,8,6,6,4,7,3,8,3,8 +V,10,13,8,7,4,8,10,5,6,6,10,5,5,12,4,7 +D,2,3,3,1,2,7,7,6,6,7,6,5,2,8,3,7 +H,8,10,11,7,8,7,7,2,6,10,6,9,5,7,4,7 +R,5,10,7,8,7,8,8,4,6,8,4,8,4,5,5,11 +J,5,6,3,9,3,8,8,3,3,12,5,5,3,8,6,10 +H,3,3,4,4,2,7,9,14,1,7,4,8,3,8,0,8 +J,6,11,8,8,4,8,9,1,7,14,4,6,2,8,2,7 +H,4,3,4,4,2,7,6,14,1,7,8,8,3,8,0,8 +Q,2,0,2,1,1,8,7,6,4,6,6,9,2,8,3,8 +C,3,7,4,5,3,6,8,7,7,10,8,13,2,10,4,10 +H,3,4,4,6,4,8,7,4,0,7,6,7,3,9,8,5 +S,5,7,6,5,3,8,8,4,9,11,4,7,2,6,5,9 +M,3,7,3,5,3,8,7,11,1,6,9,8,7,6,0,8 +Q,2,2,3,3,2,8,8,5,2,5,7,10,2,9,5,10 +M,7,9,10,7,6,4,6,4,5,11,11,11,9,3,4,6 +C,4,4,5,7,2,7,6,7,10,9,5,13,1,10,4,9 +F,3,8,3,6,1,1,12,4,5,12,11,8,0,8,2,6 +Y,5,9,5,6,3,3,11,3,7,12,11,6,1,10,2,5 +V,6,8,6,6,4,3,12,2,3,9,11,8,4,12,1,7 +X,3,6,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +L,2,5,4,4,2,6,4,1,8,8,2,10,0,7,2,8 +C,2,3,2,2,1,4,8,4,6,11,10,11,1,9,2,7 +T,2,8,4,6,2,6,11,3,7,8,11,7,2,11,1,7 +C,9,13,6,8,3,6,9,7,7,11,7,6,2,9,6,8 +G,5,9,6,7,3,8,6,8,9,6,6,10,1,8,6,10 +K,1,0,1,1,0,5,7,7,1,7,6,11,2,8,2,11 +S,9,14,7,8,4,8,3,4,5,8,1,7,3,6,6,9 +Y,7,9,7,7,4,5,8,2,8,8,10,5,5,11,6,3 +Q,3,3,4,4,3,8,7,6,3,8,6,9,2,9,3,9 +F,2,3,4,2,1,6,10,3,5,13,7,5,1,9,1,7 +W,4,5,4,3,3,3,10,2,2,10,10,8,5,11,1,7 +T,4,11,6,8,6,9,11,3,7,5,12,8,2,12,1,9 +U,2,6,3,4,1,8,6,12,5,7,13,8,3,9,0,8 +I,1,5,1,4,1,7,7,1,7,7,6,8,0,8,2,8 +G,5,10,6,7,3,7,5,8,10,7,5,12,1,9,5,10 +G,3,5,4,7,3,7,7,8,7,7,7,7,2,7,6,11 +L,7,15,6,8,3,8,4,3,6,11,4,12,2,7,6,9 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +R,3,4,5,3,3,8,7,3,5,9,4,7,3,7,4,10 +X,4,9,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +K,2,1,3,2,2,5,7,4,7,7,6,11,3,8,4,9 +T,5,5,5,4,2,5,12,2,7,11,9,4,1,11,2,4 +P,6,9,5,5,3,6,11,6,2,11,5,4,4,10,4,8 +N,11,14,9,8,4,8,11,5,5,3,6,10,6,10,3,7 +K,4,5,7,3,4,7,6,2,7,10,6,10,4,8,4,8 +Q,4,6,6,9,3,7,6,8,6,5,7,8,3,8,5,9 +M,5,7,7,5,6,7,7,3,4,9,8,9,7,5,2,8 +G,6,11,7,9,5,6,7,8,7,6,6,13,3,8,5,7 +J,7,10,4,14,4,7,9,3,4,13,5,5,3,8,7,10 +I,4,7,6,8,5,8,8,5,6,7,7,7,4,8,9,9 +B,3,6,5,4,5,8,8,6,6,7,6,6,2,8,6,9 +S,6,10,8,8,4,9,7,4,8,11,7,8,2,10,5,7 +L,2,3,3,2,1,6,4,2,8,8,2,10,0,7,2,8 +O,3,7,4,5,3,9,5,7,5,10,4,9,3,8,3,8 +I,1,3,2,2,0,7,7,1,7,13,6,8,0,8,0,7 +K,3,2,4,3,2,5,7,4,8,7,6,11,3,8,5,9 +Z,1,1,2,1,0,8,7,2,10,9,6,8,0,8,6,8 +O,6,9,6,7,5,8,6,8,4,9,5,8,4,7,4,9 +G,5,5,6,8,3,7,6,8,8,6,6,10,2,8,6,11 +L,3,7,4,5,3,6,5,7,6,6,6,9,2,8,4,10 +C,3,5,4,4,2,6,7,7,8,8,8,13,1,9,4,10 +X,6,10,7,5,3,5,9,2,8,11,8,8,4,9,3,6 +F,1,1,1,1,0,2,12,4,3,11,9,6,0,8,2,7 +I,8,13,7,7,4,9,7,3,6,12,4,5,3,8,6,11 +Z,2,7,3,5,2,8,6,5,10,7,6,7,1,7,8,8 +Z,7,11,9,8,6,8,7,3,10,12,6,8,2,7,6,8 +I,7,15,6,8,4,9,7,3,6,13,3,5,3,8,6,10 +F,2,7,3,4,1,1,13,5,3,12,10,6,0,8,3,7 +X,4,5,5,7,2,7,7,5,4,7,6,8,3,8,4,8 +G,5,10,6,8,5,5,7,6,6,10,8,11,2,9,4,10 +I,1,3,1,2,1,8,7,1,7,7,6,7,0,8,2,7 +I,3,5,4,6,4,7,8,5,5,6,8,7,3,10,8,8 +K,3,5,5,4,4,6,7,3,3,6,4,9,4,6,7,8 +J,3,5,4,7,1,13,2,8,5,14,3,12,0,6,0,8 +I,1,5,2,3,1,7,7,0,7,13,6,8,0,8,0,8 +P,3,5,5,4,2,7,12,4,3,12,4,1,1,10,3,8 +M,5,9,6,7,4,7,7,12,2,7,9,8,9,6,0,8 +Z,3,9,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +J,5,11,4,8,3,9,7,2,4,12,5,7,2,9,7,9 +O,2,5,3,3,2,8,7,7,4,9,5,8,2,8,3,8 +G,4,8,5,6,2,7,6,7,9,6,6,9,2,8,6,11 +E,3,8,3,6,2,3,7,6,9,7,6,14,0,8,7,8 +L,6,11,6,6,3,6,6,5,5,12,9,11,3,10,6,9 +P,3,6,3,4,2,3,12,6,1,11,7,4,0,9,3,8 +V,4,5,6,3,2,4,13,3,3,10,11,7,3,10,1,7 +V,1,0,2,1,0,7,9,3,2,7,12,8,2,10,0,8 +S,3,5,3,4,2,8,7,7,5,8,5,7,2,9,9,8 +F,3,8,5,6,2,3,13,6,3,13,9,4,2,10,2,5 +L,3,6,4,6,4,8,6,5,5,6,7,8,3,8,8,11 +P,5,8,7,6,6,7,6,6,4,7,6,9,5,8,7,10 +C,4,8,5,6,3,5,8,8,8,8,8,14,1,9,4,9 +V,8,10,8,8,5,3,12,3,3,10,11,8,3,9,2,6 +R,4,7,6,5,6,6,8,3,4,6,6,9,6,10,7,5 +U,5,9,4,5,3,7,7,4,5,7,7,8,5,6,3,7 +T,6,11,6,8,4,3,13,4,6,12,10,4,1,11,1,4 +P,5,6,5,8,3,4,12,9,2,10,6,4,1,10,4,8 +E,4,8,6,6,5,8,6,6,3,7,6,10,4,8,8,9 +V,6,10,6,8,4,2,11,2,3,10,11,8,2,10,1,8 +I,3,10,4,7,2,7,8,0,8,13,6,7,0,8,1,7 +S,3,5,3,4,2,8,7,7,5,8,6,7,2,9,9,8 +O,5,10,5,8,4,8,7,8,5,10,5,8,3,8,3,8 +Q,7,9,8,11,7,8,7,6,3,8,7,11,5,8,8,6 +A,6,12,6,6,3,13,1,5,2,12,2,10,2,3,2,10 +P,3,9,4,7,3,5,11,9,2,10,6,4,1,10,3,7 +H,6,11,6,8,3,7,7,15,0,7,6,8,3,8,0,8 +N,4,6,6,5,5,7,7,4,4,6,5,8,6,8,4,6 +B,6,10,6,8,5,6,6,9,8,6,6,7,2,8,10,10 +W,5,8,8,6,11,7,7,7,2,7,6,8,15,12,4,11 +H,6,8,9,6,7,6,9,3,6,10,8,8,3,8,4,6 +C,1,3,2,2,1,6,8,7,7,8,7,13,1,9,4,10 +O,2,1,2,1,1,8,7,7,6,7,6,8,2,8,3,8 +W,6,9,9,8,11,10,7,5,5,7,5,8,10,11,9,4 +H,3,3,4,2,2,7,8,6,6,7,6,8,3,8,3,7 +T,4,5,5,8,2,9,15,1,6,5,11,9,0,8,0,8 +H,4,6,6,4,5,7,8,5,6,7,5,8,3,8,3,8 +G,4,5,5,8,2,7,6,8,8,6,5,11,2,8,6,11 +Y,7,15,6,8,4,5,8,4,3,10,9,6,4,10,4,4 +Z,5,9,7,7,5,6,9,3,9,12,8,6,3,10,8,6 +D,4,7,5,5,5,7,8,6,6,8,7,5,3,8,3,7 +Z,4,8,5,6,5,8,7,3,8,8,6,7,1,8,10,9 +R,2,4,4,3,2,8,7,3,4,9,4,6,3,7,3,9 +M,6,8,9,6,7,8,7,2,5,9,6,8,9,6,2,8 +J,4,9,4,7,3,8,9,2,3,13,5,5,2,9,7,9 +L,4,8,5,6,4,3,4,4,7,2,0,8,0,6,1,6 +I,1,5,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +R,2,1,2,2,2,6,7,5,5,6,5,6,2,7,4,8 +L,5,9,6,7,5,5,6,5,6,6,5,9,8,7,4,10 +V,3,7,5,5,3,7,12,2,3,6,11,9,2,11,1,8 +J,4,7,5,5,2,8,6,3,7,15,5,10,0,7,1,7 +R,6,9,6,5,5,7,7,3,4,7,5,9,5,8,6,7 +D,4,8,5,6,4,7,7,8,7,7,6,5,3,8,3,7 +X,3,5,4,5,4,6,7,2,5,8,7,10,2,10,7,8 +E,5,9,6,7,6,6,7,6,9,8,7,10,3,8,6,8 +D,6,10,6,5,3,8,6,5,6,12,4,7,5,7,5,9 +L,2,6,3,4,1,0,1,5,6,0,0,6,0,8,0,8 +U,6,7,7,5,3,4,9,5,8,11,11,9,3,9,2,7 +S,5,9,6,7,3,8,7,4,8,11,7,8,2,10,5,8 +Q,6,8,6,9,7,8,9,6,2,6,8,11,3,8,6,8 +K,5,9,8,6,6,6,7,1,6,9,6,9,3,8,3,8 +F,4,5,4,8,2,1,12,5,5,11,11,8,0,8,2,6 +H,3,2,5,3,3,7,7,6,6,7,6,8,3,8,3,8 +G,3,7,4,5,2,8,7,8,8,6,6,11,1,8,5,10 +N,6,9,8,8,8,7,7,5,4,7,5,8,7,9,5,7 +X,4,8,6,6,4,8,8,3,9,5,5,6,3,9,7,8 +V,1,0,2,0,0,7,9,3,1,7,11,8,2,11,0,8 +G,5,9,4,4,3,7,8,4,3,8,6,7,3,10,9,7 +Z,7,15,7,9,5,11,3,4,6,12,3,10,3,7,7,11 +H,2,3,4,1,2,7,8,3,5,10,7,7,3,9,2,7 +Z,7,11,9,8,7,7,7,2,9,12,6,9,2,9,6,8 +F,7,13,6,8,3,6,9,3,6,12,5,5,2,9,6,6 +T,5,9,5,4,2,7,8,2,7,11,7,8,2,9,4,5 +I,4,10,7,8,8,10,8,1,6,9,5,5,3,8,7,6 +X,2,1,2,1,0,8,7,4,4,7,6,8,3,8,4,8 +E,3,4,5,3,2,7,7,2,8,11,7,9,2,8,4,8 +C,6,11,7,8,4,6,7,10,9,10,7,11,2,12,4,9 +T,5,8,6,6,4,4,12,3,6,12,10,5,1,11,1,5 +C,2,2,3,4,2,6,8,7,7,8,8,13,1,9,4,10 +M,4,4,6,3,3,10,6,3,4,9,4,7,7,6,2,8 +G,4,3,5,5,2,8,5,7,9,7,4,11,1,9,5,10 +K,7,9,6,5,3,6,8,3,7,9,8,9,5,8,3,7 +K,4,10,5,7,2,3,6,8,3,7,7,11,4,8,2,11 +E,2,1,3,2,2,7,7,5,7,7,6,8,2,8,5,10 +N,5,9,8,7,5,7,9,2,4,9,5,6,5,9,1,7 +Z,2,4,5,3,2,7,7,2,9,12,6,8,1,8,5,8 +M,4,3,5,5,3,8,7,12,1,6,9,8,8,6,0,8 +I,1,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +I,1,7,1,5,2,8,7,0,7,7,6,7,0,8,2,7 +Y,6,9,6,4,3,6,6,4,4,9,9,6,4,10,3,5 +H,4,10,5,7,3,7,7,15,1,7,6,8,3,8,0,8 +F,5,9,4,5,2,7,8,2,7,10,6,6,2,10,5,7 +W,3,3,4,1,2,5,11,3,2,9,8,7,6,11,1,6 +O,4,6,6,6,4,7,5,4,4,8,3,7,3,7,4,8 +B,3,4,4,3,3,7,7,5,5,7,6,6,2,8,6,9 +X,7,13,8,7,5,8,7,2,8,11,4,7,4,9,4,7 +R,4,5,4,8,3,5,11,8,4,7,4,9,3,7,7,11 +O,5,9,6,7,5,8,6,8,4,6,5,5,4,8,4,8 +I,3,7,4,5,2,8,6,2,7,7,6,7,0,9,4,7 +Y,3,7,5,5,4,8,6,6,5,5,8,8,2,8,9,5 +V,2,6,4,4,4,8,7,4,2,8,7,8,5,10,4,7 +L,3,2,3,3,2,4,4,5,7,2,1,6,1,7,1,6 +F,5,9,4,4,2,6,10,3,5,12,6,5,2,8,5,6 +O,3,5,4,7,2,7,7,9,6,7,6,8,3,8,4,8 +V,2,3,4,4,1,7,8,4,2,7,13,8,3,10,0,8 +U,1,0,2,1,0,7,6,10,4,7,12,8,3,10,0,8 +H,5,10,6,8,8,8,8,6,6,7,6,6,6,8,3,8 +T,5,9,5,7,3,5,12,4,6,12,9,4,2,12,2,4 +L,3,3,3,4,1,1,0,6,6,0,1,5,0,8,0,8 +D,8,14,7,8,5,7,6,3,7,10,5,7,6,7,8,5 +Z,4,6,5,4,4,9,9,5,4,7,5,7,3,8,9,5 +B,3,7,5,5,4,9,8,3,5,9,5,6,2,8,5,9 +E,5,7,7,5,5,7,8,1,8,11,6,9,3,8,4,9 +O,3,3,4,2,2,8,7,7,5,7,6,7,2,8,3,7 +F,4,9,4,4,2,6,10,2,5,11,7,5,2,9,5,5 +C,2,3,3,1,1,5,8,4,6,11,9,11,1,9,2,8 +J,5,8,7,6,5,8,6,9,6,7,7,8,4,5,6,3 +C,5,9,6,6,3,5,9,7,8,5,8,14,2,7,5,8 +G,3,5,5,4,5,7,8,5,2,7,7,8,6,11,7,8 +V,3,4,4,3,1,4,12,3,3,10,11,7,2,11,1,8 +J,1,1,1,1,0,12,3,6,4,13,4,11,0,7,0,8 +C,6,9,8,7,8,6,6,4,5,7,6,10,6,9,4,8 +S,4,8,6,6,3,9,6,4,8,11,4,8,2,8,5,10 +T,3,6,4,4,3,6,7,7,6,7,6,7,3,9,5,9 +C,6,8,6,6,3,5,7,6,8,11,8,14,2,10,4,7 +W,2,3,3,1,2,8,11,2,1,6,9,8,5,11,0,8 +B,2,6,3,4,4,6,6,7,5,6,6,7,2,9,7,10 +J,5,9,6,7,5,8,7,6,5,8,7,7,3,6,4,6 +O,5,9,6,7,4,8,6,8,5,10,5,9,3,8,3,8 +O,6,11,5,6,3,5,8,6,4,10,8,9,5,10,4,8 +D,2,3,3,1,1,8,7,4,5,10,4,5,2,8,2,8 +A,1,3,2,1,1,9,3,1,1,8,3,9,1,6,1,8 +D,5,6,7,5,5,6,7,5,7,7,4,7,3,7,5,6 +J,7,9,5,13,4,6,9,3,3,12,6,5,3,8,8,8 +Y,6,9,8,7,7,9,7,6,5,5,9,7,3,8,9,5 +D,4,7,4,5,2,5,6,10,9,5,5,6,3,8,4,8 +N,5,6,7,4,3,6,8,3,5,11,8,8,5,8,1,8 +Y,2,1,3,2,1,9,10,1,6,5,11,7,1,11,2,8 +W,6,9,6,4,3,1,10,3,3,12,11,9,6,11,0,6 +C,4,8,5,6,3,5,7,6,9,6,7,13,1,7,4,9 +L,2,3,3,2,1,7,4,1,8,8,2,10,0,7,2,8 +C,3,5,4,5,4,5,7,3,4,7,6,11,4,9,7,9 +A,3,5,5,3,2,8,2,2,2,8,2,8,2,6,3,7 +F,3,3,4,4,1,1,15,5,3,12,9,4,0,8,2,6 +C,4,6,5,5,5,5,6,3,5,7,6,11,4,10,6,10 +P,3,7,3,5,2,3,14,7,2,12,7,3,0,10,4,8 +Q,9,14,8,8,5,9,3,4,7,11,4,10,3,7,8,11 +E,2,4,4,3,2,7,8,2,7,11,7,8,2,8,4,8 +M,4,3,5,5,3,7,7,12,1,7,9,8,8,6,0,8 +M,4,8,6,6,7,7,8,6,4,7,5,8,6,9,7,7 +G,4,7,5,5,5,8,5,4,3,7,6,10,6,8,4,10 +H,4,7,6,5,5,7,8,5,5,7,6,8,6,7,5,9 +H,5,8,8,6,5,7,7,3,6,10,6,8,3,8,3,7 +I,2,7,3,5,2,7,7,0,7,13,6,8,0,8,1,8 +O,4,5,6,7,3,8,7,9,8,7,6,8,3,8,4,8 +S,7,12,6,7,3,9,3,4,4,9,2,8,3,6,5,9 +Q,2,1,3,2,1,8,6,7,5,6,6,8,3,8,4,8 +B,3,7,3,5,4,7,7,8,5,7,6,7,2,8,7,9 +W,6,9,8,7,8,8,4,7,3,7,6,7,8,7,6,3 +Z,2,7,3,5,3,7,8,5,8,7,6,10,1,9,7,7 +O,4,7,6,5,6,8,10,5,2,7,7,8,7,9,4,9 +S,3,5,5,4,2,7,7,3,7,11,6,8,1,9,5,7 +Q,1,2,2,2,1,8,7,6,2,6,6,9,2,9,3,10 +U,5,10,7,7,7,8,9,7,6,6,8,9,6,7,4,8 +H,2,1,2,2,2,7,8,5,5,7,6,8,3,8,2,8 +T,5,6,5,4,3,4,11,1,7,11,9,6,1,10,2,5 +L,5,11,6,8,4,3,4,3,9,2,0,8,0,7,1,5 +C,4,8,6,6,5,5,6,4,5,8,6,11,6,9,4,8 +C,5,9,5,7,3,5,8,6,8,12,9,12,2,10,3,7 +H,1,0,2,0,0,7,8,11,1,7,5,8,3,8,0,8 +X,3,5,6,3,2,9,6,1,8,11,4,8,2,8,3,9 +H,6,9,9,7,7,8,6,2,6,10,6,9,3,8,4,7 +E,3,7,3,5,2,3,7,6,10,7,6,15,0,8,7,7 +A,2,7,4,5,2,12,4,4,3,11,1,8,2,6,2,8 +F,4,5,5,8,2,1,14,5,4,12,10,5,0,8,2,5 +X,6,9,6,4,3,8,7,2,8,9,6,8,4,9,4,8 +B,8,13,6,7,4,9,6,5,5,11,4,9,6,6,7,10 +V,5,9,8,6,8,7,7,4,2,8,8,8,5,10,4,8 +P,5,9,5,4,3,10,8,4,4,12,4,5,4,10,5,9 +D,5,5,6,7,3,5,8,10,9,7,7,5,3,8,4,8 +S,3,4,5,3,2,9,6,2,7,10,4,7,1,9,5,10 +H,6,7,9,9,8,9,12,3,2,8,7,6,4,11,8,6 +H,4,8,5,5,2,7,5,15,1,7,8,8,3,8,0,8 +H,7,9,10,7,8,10,6,3,6,10,3,8,5,7,5,9 +U,7,10,6,5,4,8,6,4,5,7,7,7,6,7,4,6 +R,5,7,6,5,5,9,9,6,3,7,4,6,5,7,8,8 +N,2,2,3,3,2,7,8,5,4,7,6,6,5,8,1,6 +P,3,4,5,6,6,8,9,5,0,8,6,6,5,9,5,8 +C,3,8,4,6,2,6,7,7,10,6,6,14,1,8,4,9 +B,3,5,5,4,4,9,6,3,6,11,4,7,4,7,5,9 +Z,4,10,6,7,4,8,7,2,10,11,6,8,1,7,6,8 +E,5,9,7,8,7,5,8,4,3,8,6,9,5,11,10,9 +E,6,9,8,7,5,9,7,2,9,11,4,9,2,8,5,10 +W,7,9,7,4,3,6,10,1,3,8,10,7,7,12,1,7 +H,4,9,4,7,4,7,7,13,1,7,6,8,3,8,0,8 +L,5,10,5,5,3,10,3,3,3,11,6,10,3,10,4,10 +O,7,14,5,8,4,5,6,7,4,10,6,9,6,9,5,7 +G,5,9,7,8,8,7,6,6,4,8,7,9,10,8,10,7 +Z,3,5,5,8,3,11,5,3,5,10,2,7,2,7,5,11 +O,4,11,5,8,5,8,7,8,6,7,6,8,3,8,3,8 +S,4,9,5,7,3,9,8,6,9,5,6,8,0,8,9,8 +J,4,9,6,7,4,8,5,3,5,8,6,8,4,6,4,6 +M,5,11,6,8,4,9,7,13,2,6,9,8,8,6,0,8 +H,5,11,5,8,5,7,8,14,1,7,5,8,3,8,0,8 +T,2,3,3,2,1,7,12,2,7,7,11,8,1,11,1,8 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +P,3,4,4,6,2,3,14,7,2,11,7,3,0,10,4,8 +X,2,4,3,3,2,8,7,3,8,6,6,6,2,8,5,8 +Y,3,5,5,4,2,4,10,1,8,10,10,5,3,11,5,3 +O,5,10,5,8,5,7,7,8,4,9,6,8,3,8,3,8 +Z,3,5,5,4,2,7,7,2,10,12,6,8,1,8,6,8 +U,5,8,7,7,6,7,7,4,5,6,7,8,7,8,2,7 +X,3,4,4,3,2,8,7,3,9,6,6,6,2,8,6,8 +R,3,6,5,4,5,7,7,3,4,7,6,8,6,9,6,6 +D,3,8,5,6,7,9,8,4,4,7,6,6,4,7,7,6 +L,2,7,3,5,2,4,4,6,7,2,2,5,1,6,1,6 +P,5,5,7,8,8,7,6,4,3,7,7,7,7,11,5,6 +E,3,5,4,4,3,7,8,5,8,7,5,9,2,8,6,9 +G,5,10,6,8,8,9,6,5,2,7,6,10,8,8,5,10 +X,7,10,10,7,5,5,9,2,9,11,12,9,3,9,4,5 +A,2,6,4,4,2,11,3,3,2,10,1,9,2,6,2,8 +U,4,9,5,7,4,7,6,11,4,6,13,8,3,9,0,8 +X,6,11,9,8,5,10,7,1,8,10,2,7,3,8,4,9 +G,3,7,5,5,5,8,5,4,3,7,6,10,6,8,4,10 +V,2,2,4,3,2,7,12,2,3,7,11,9,2,10,1,8 +T,3,7,4,5,3,7,12,3,7,7,11,8,2,11,1,8 +K,5,9,5,5,2,4,8,4,6,9,11,11,5,9,3,6 +F,6,10,8,7,6,7,9,3,6,12,7,6,3,9,2,7 +I,4,7,5,5,3,7,8,2,7,7,6,9,0,8,4,8 +N,8,10,11,7,5,11,7,3,6,11,0,3,6,9,2,8 +U,3,6,4,5,4,6,7,5,4,6,5,9,4,8,1,8 +O,4,11,5,8,5,8,7,8,4,7,6,5,4,8,3,8 +P,5,10,7,8,6,5,10,4,5,11,9,4,1,10,4,7 +U,4,7,4,5,1,8,5,13,5,7,14,8,3,9,0,8 +T,7,10,7,8,5,7,11,4,7,11,8,4,3,12,3,4 +B,8,10,7,5,5,9,7,4,5,9,4,7,6,7,8,9 +F,3,8,5,6,4,4,11,2,6,11,9,6,1,10,3,6 +L,2,6,2,4,1,0,1,5,6,0,0,6,0,8,0,8 +F,2,1,3,3,2,5,11,4,5,11,9,5,1,10,3,6 +D,5,11,7,8,5,8,7,9,8,7,6,2,4,8,5,9 +T,8,10,8,7,6,6,11,4,6,11,9,5,3,12,2,4 +C,3,2,4,3,2,6,8,7,7,9,8,13,1,9,4,10 +S,7,9,9,8,9,10,8,4,7,7,7,8,5,9,9,11 +U,6,10,6,5,4,8,5,5,5,6,8,7,4,9,3,7 +V,8,14,7,8,4,9,10,6,4,7,10,5,6,13,4,7 +U,6,9,8,7,10,9,7,4,5,5,8,7,11,9,6,6 +M,3,1,4,2,1,7,7,11,1,7,9,8,7,6,0,8 +J,5,6,3,9,3,9,7,3,3,11,4,5,3,8,6,9 +J,1,1,2,2,0,10,6,3,5,12,4,9,1,7,1,7 +X,6,9,9,6,4,5,8,2,8,11,11,9,3,9,4,5 +I,1,11,0,8,1,7,7,5,3,7,6,8,0,8,0,8 +D,6,11,8,8,7,7,6,7,5,5,5,6,7,9,3,7 +B,4,6,6,4,7,8,7,5,2,6,7,8,5,10,9,8 +D,3,6,5,6,4,7,7,5,6,7,5,7,4,7,6,5 +E,2,1,2,2,1,4,7,5,8,7,6,13,0,8,7,9 +P,4,10,6,8,6,7,7,8,4,8,6,7,3,9,7,9 +Z,3,5,4,7,2,7,7,4,14,10,6,8,0,8,8,8 +G,3,8,5,6,4,6,6,6,5,5,7,10,2,8,4,9 +L,5,9,5,5,3,7,5,3,6,11,6,11,2,7,6,8 +J,4,11,5,9,3,14,3,5,4,13,2,10,0,7,0,8 +W,5,11,8,8,12,10,8,4,2,6,7,8,11,10,4,5 +I,6,11,7,8,5,7,8,1,8,7,6,8,0,7,4,8 +E,3,2,4,3,3,7,8,5,8,7,6,9,2,8,6,9 +I,1,3,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +Y,4,5,5,4,2,4,10,2,8,11,10,5,3,10,4,3 +C,5,6,5,4,2,5,9,6,8,12,9,10,2,9,3,7 +V,3,8,5,6,1,6,8,4,3,8,13,8,3,10,0,8 +P,4,8,6,6,5,7,5,6,5,7,6,8,3,8,4,8 +R,12,15,9,8,5,9,6,6,5,10,2,8,7,6,6,11 +U,2,0,2,0,0,7,5,10,4,7,13,8,3,10,0,8 +A,1,0,2,0,0,7,4,2,0,7,2,8,1,7,1,8 +M,5,8,7,6,6,4,7,3,4,10,10,10,5,6,2,6 +K,6,8,9,6,4,6,8,2,7,11,6,8,3,8,4,7 +T,3,9,4,6,3,10,10,1,8,5,11,8,1,10,1,8 +Q,4,5,4,6,4,7,8,6,3,9,9,9,3,9,6,7 +X,4,5,5,7,2,7,7,5,4,7,6,8,3,8,4,8 +J,4,9,6,7,2,10,5,4,7,15,3,9,0,7,0,8 +X,2,1,3,1,1,8,7,4,8,6,6,7,2,8,5,8 +F,2,6,4,4,3,5,10,3,5,10,9,6,2,10,3,6 +S,4,10,5,8,3,8,7,6,9,4,6,8,0,8,9,8 +V,8,10,8,8,3,2,11,6,5,13,12,8,3,10,1,8 +X,3,4,5,3,2,9,7,2,8,10,3,7,2,8,3,9 +M,11,13,11,7,6,11,11,7,3,4,7,9,10,13,3,6 +T,7,10,9,8,7,6,7,7,8,7,8,9,4,10,7,7 +S,1,0,1,1,0,8,7,4,6,5,6,7,0,8,7,8 +C,4,8,5,6,2,5,7,7,10,7,5,12,1,9,4,9 +I,4,5,6,5,5,8,8,4,5,7,6,7,4,8,8,9 +P,5,9,5,7,5,4,11,9,2,10,6,4,1,10,3,8 +D,4,8,6,6,5,7,5,8,5,5,5,5,3,9,3,8 +C,5,9,6,6,5,7,8,8,6,6,6,11,4,8,4,8 +T,2,3,2,1,1,5,12,2,5,11,9,5,1,10,1,5 +D,5,7,6,5,5,7,7,4,6,7,7,9,6,7,3,7 +P,5,11,7,8,5,5,12,5,5,11,8,2,1,10,4,6 +G,3,7,5,5,6,7,6,4,3,6,5,10,6,8,6,10 +J,1,3,3,1,1,8,8,2,5,14,5,8,1,7,0,8 +W,4,4,5,3,3,4,11,3,2,9,9,8,6,11,1,7 +Y,4,8,6,6,3,7,10,1,7,5,11,8,1,11,2,8 +U,1,0,2,0,0,7,6,10,4,7,13,8,2,10,0,8 +Y,3,4,5,5,1,6,11,2,2,9,12,8,1,10,0,8 +W,4,2,5,4,3,6,10,2,3,7,9,8,7,11,0,8 +F,6,12,6,7,4,8,8,3,4,10,5,5,3,9,7,8 +U,3,6,3,4,2,8,6,12,4,8,11,8,3,9,0,8 +C,3,7,5,6,5,5,8,3,5,7,6,11,3,9,7,9 +S,5,7,6,5,3,6,9,3,8,11,5,7,2,6,5,8 +W,5,4,6,3,3,5,11,3,2,9,8,7,7,12,2,6 +T,2,7,3,5,1,9,14,0,6,5,11,8,0,8,0,8 +S,5,10,8,7,9,5,10,3,4,8,7,6,3,8,10,1 +W,3,1,3,2,1,8,8,4,0,7,8,8,7,10,0,8 +I,3,7,4,5,1,7,9,0,7,14,6,6,0,9,2,7 +C,3,10,4,8,3,5,7,6,8,7,5,12,1,8,4,10 +Z,2,1,3,3,2,7,8,5,9,6,6,9,1,9,7,8 +A,7,13,6,8,4,8,2,3,2,8,4,12,5,5,4,7 +S,4,9,6,7,4,10,6,5,6,10,2,7,2,7,4,11 +F,6,8,8,6,7,8,7,5,4,7,6,8,5,11,9,11 +I,2,9,3,7,2,7,7,0,7,13,6,8,0,8,1,8 +G,5,10,7,7,8,7,4,5,3,8,6,11,7,7,10,6 +Q,6,7,8,10,8,10,13,5,2,3,8,12,5,15,4,10 +O,5,10,7,8,5,7,8,9,6,7,7,8,3,8,4,7 +V,2,6,3,4,1,7,9,3,1,7,12,8,2,11,0,8 +O,5,11,7,8,5,8,5,9,5,6,6,4,5,7,5,9 +S,5,11,6,8,6,8,7,8,5,7,6,7,2,8,9,8 +D,4,10,5,8,7,7,7,6,6,7,6,5,6,8,3,7 +U,2,3,3,2,1,7,8,6,6,7,9,8,3,10,1,8 +T,5,8,7,6,7,7,8,4,6,7,6,9,5,8,5,7 +U,4,7,5,5,3,7,9,6,7,5,10,9,3,9,1,8 +A,4,9,7,7,5,6,5,2,3,4,1,6,5,7,5,4 +S,4,10,5,8,5,8,8,5,9,5,5,6,1,6,9,6 +J,5,10,7,8,3,8,8,1,8,14,4,6,1,9,1,8 +W,4,8,5,6,3,4,8,5,1,7,8,8,8,10,0,8 +M,4,7,7,5,8,7,7,3,2,7,5,8,8,5,2,7 +E,6,11,4,6,2,6,8,4,6,10,6,9,2,9,8,9 +Y,4,5,5,3,2,4,10,2,8,11,10,5,1,11,3,4 +X,4,6,6,4,3,10,7,1,8,10,2,6,3,8,3,9 +X,3,6,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +K,3,9,4,6,2,3,7,7,2,7,5,11,3,8,2,10 +U,7,10,6,5,3,6,4,5,5,4,8,8,5,10,2,7 +D,1,3,3,2,2,8,7,4,5,9,4,6,2,8,2,8 +M,3,7,4,5,3,7,7,11,1,7,9,8,8,5,0,8 +T,3,3,3,2,1,5,13,4,5,11,8,4,2,11,1,5 +K,5,6,7,4,4,4,7,2,7,10,9,11,3,8,3,6 +O,4,6,6,4,3,7,5,7,5,8,4,10,3,7,3,8 +P,2,3,3,2,1,5,11,3,4,10,8,3,0,9,3,6 +Q,7,8,7,10,6,7,8,6,4,8,9,10,4,8,8,8 +Y,3,8,6,6,3,9,10,1,6,4,11,8,1,11,2,9 +S,4,5,5,7,3,8,8,6,9,5,6,7,0,8,9,8 +X,4,7,6,5,3,5,8,1,8,10,9,9,2,9,3,6 +M,4,4,6,3,4,5,7,3,4,10,10,10,7,7,2,8 +C,3,2,4,4,2,6,8,8,8,9,8,12,2,10,4,9 +J,1,4,2,2,1,8,7,2,5,14,6,9,1,7,0,7 +L,5,11,6,8,2,0,0,7,6,0,1,4,0,8,0,8 +F,4,8,6,6,5,7,8,6,4,8,6,8,3,10,8,10 +X,3,5,5,3,3,8,7,3,10,6,6,8,4,7,7,9 +E,2,6,3,4,2,3,8,5,8,7,6,13,0,8,6,10 +D,3,8,3,6,2,5,7,10,8,7,6,5,3,8,4,8 +W,4,6,6,4,5,7,7,6,2,8,8,8,6,7,4,8 +L,2,4,3,6,1,0,1,5,6,0,0,7,0,8,0,8 +U,4,4,5,3,2,5,8,5,8,10,9,9,3,9,2,6 +H,4,7,6,5,4,8,8,3,6,10,5,7,3,8,3,7 +K,2,3,3,1,1,4,8,2,6,10,10,10,2,8,2,6 +W,9,10,9,5,3,3,10,2,2,10,11,8,8,12,0,7 +W,3,1,5,2,2,8,11,3,2,6,9,8,6,11,1,7 +R,4,7,4,4,2,5,11,8,3,7,4,8,3,7,6,11 +Q,4,6,5,8,3,8,7,8,6,6,8,8,3,7,6,10 +S,4,9,5,7,3,8,8,6,9,5,6,6,0,8,9,7 +U,9,10,9,8,5,4,7,6,9,9,8,9,6,10,4,2 +O,5,11,6,8,6,8,7,9,4,7,6,7,3,8,3,8 +A,3,7,5,5,4,8,5,1,3,7,2,6,2,6,4,5 +N,6,11,6,8,6,7,7,13,1,6,6,8,5,8,0,8 +D,5,9,7,7,5,7,6,8,5,6,5,4,5,8,5,9 +F,5,11,6,8,2,1,15,5,3,12,9,4,0,8,2,5 +T,4,6,4,4,2,6,12,3,6,11,9,4,2,11,2,5 +H,6,10,6,8,6,7,6,13,2,7,8,8,3,9,0,8 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +O,2,5,3,4,2,8,7,7,4,9,6,8,2,8,2,8 +Y,6,8,9,12,12,7,9,3,3,7,8,9,7,13,12,5 +C,10,15,6,8,3,7,8,6,7,12,6,7,2,9,5,8 +N,3,3,5,2,2,6,10,3,4,10,8,7,5,8,0,8 +Z,6,7,5,11,4,9,6,4,3,11,6,8,3,9,11,7 +P,4,6,6,4,3,6,13,7,2,11,5,2,1,10,4,7 +V,9,13,8,7,4,6,10,4,4,8,8,5,5,11,3,6 +M,4,10,5,8,6,7,6,10,1,7,8,8,7,5,0,8 +R,4,6,6,4,5,7,7,3,4,6,6,8,6,9,6,6 +B,6,9,8,6,8,7,9,6,5,7,5,6,4,7,6,8 +Z,5,8,7,6,4,7,8,2,10,12,7,9,1,9,6,8 +Y,4,9,4,4,2,7,7,4,4,9,9,5,3,11,3,4 +X,4,6,6,4,3,10,7,1,8,10,2,6,3,8,3,10 +L,2,6,4,4,2,4,5,1,8,6,2,10,0,7,2,7 +L,3,8,4,6,2,0,2,4,6,1,0,7,0,8,0,8 +X,3,10,6,7,6,8,7,2,6,7,6,8,3,8,6,8 +S,4,10,6,8,7,7,6,3,2,7,5,6,3,7,14,4 +S,4,5,6,5,6,8,7,5,5,7,6,7,5,8,9,11 +O,4,8,5,6,4,7,8,8,4,7,7,8,3,8,3,8 +E,4,7,6,5,5,6,8,3,7,11,8,9,3,8,4,7 +Y,1,1,2,1,0,8,9,2,2,7,12,8,1,10,0,8 +O,9,14,6,8,4,4,9,6,5,10,8,9,5,10,5,7 +G,7,10,6,6,4,8,7,4,3,9,5,6,4,9,8,8 +A,3,4,5,3,2,8,2,2,2,8,2,8,2,7,3,7 +D,4,9,5,6,4,8,7,6,6,10,5,5,3,8,3,8 +Y,4,10,6,7,3,7,10,1,8,6,12,8,1,11,2,8 +T,2,6,4,4,2,6,12,3,7,8,11,8,1,11,1,7 +V,3,5,4,3,2,4,12,2,3,9,11,7,3,10,1,7 +G,4,7,5,5,2,7,6,7,9,6,5,10,1,8,6,11 +N,5,9,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +G,6,9,8,7,10,8,7,4,3,6,5,9,8,7,9,13 +E,6,11,8,8,7,10,6,1,8,11,4,8,4,7,5,11 +D,4,5,5,4,4,6,7,5,7,6,4,7,3,8,5,6 +Q,2,1,3,2,1,8,7,7,5,6,6,8,3,8,4,8 +C,5,11,6,8,5,7,8,8,6,5,6,12,4,7,4,7 +W,4,10,6,8,8,7,7,6,3,8,8,7,6,8,4,9 +O,4,6,6,5,4,7,6,4,4,7,3,7,3,7,4,8 +I,3,11,5,8,6,10,6,1,4,9,4,4,3,8,5,8 +W,3,7,5,5,5,7,7,6,2,7,8,8,5,8,3,8 +P,4,7,6,5,4,6,12,5,3,12,5,1,1,10,3,8 +E,2,7,3,5,2,3,7,6,10,7,6,14,0,8,7,8 +V,4,7,4,5,3,3,11,2,2,9,11,8,2,11,1,8 +D,8,13,8,7,4,9,5,4,6,11,3,7,5,6,6,11 +N,2,2,3,3,2,7,8,5,4,7,7,6,5,9,2,5 +H,5,7,7,5,5,6,7,6,7,7,6,8,6,8,3,8 +W,4,9,6,7,3,8,8,4,1,6,8,8,8,10,0,8 +A,5,12,5,6,3,12,2,4,2,11,3,11,4,4,4,11 +N,7,13,7,7,3,6,9,4,5,4,5,11,6,11,2,7 +A,2,1,4,2,1,8,2,2,1,7,2,8,2,6,3,6 +Z,4,8,5,6,5,8,11,6,5,6,5,7,3,9,6,4 +N,5,7,8,5,3,7,8,3,5,10,6,7,6,8,1,7 +Z,2,4,4,3,2,8,6,2,9,11,5,9,1,8,5,9 +V,3,9,5,7,1,7,8,4,2,7,14,8,3,9,0,8 +B,8,13,8,7,7,8,8,4,5,9,5,7,8,4,9,7 +M,3,4,4,3,3,7,6,6,4,7,7,10,6,5,1,9 +R,6,11,9,8,6,9,9,4,7,8,3,8,3,6,5,11 +B,6,11,4,6,3,10,5,6,5,11,3,9,6,7,6,10 +E,1,3,3,1,1,6,7,2,6,10,7,10,1,8,4,9 +K,2,1,3,2,2,7,7,4,6,6,6,9,3,8,5,10 +E,2,3,3,5,2,3,8,6,10,7,6,14,0,8,7,8 +X,4,9,7,6,4,7,7,4,10,6,6,8,3,8,7,8 +Z,3,7,5,5,2,9,5,3,9,11,4,9,2,7,6,9 +A,3,7,5,4,2,8,3,3,3,7,2,8,3,6,3,8 +F,5,7,6,8,7,6,11,4,4,8,7,6,4,9,7,7 +O,4,8,5,6,4,8,7,8,6,7,7,10,3,7,4,7 +M,5,9,6,5,3,14,2,4,3,12,1,9,5,4,0,9 +O,3,5,4,3,3,8,7,7,5,7,6,8,2,8,3,8 +K,4,8,6,6,5,5,6,4,7,6,6,10,3,8,5,10 +Q,3,5,4,6,4,9,8,7,2,4,7,11,3,9,6,10 +I,5,7,6,8,6,7,9,4,5,8,7,7,4,8,9,10 +U,4,5,4,4,2,4,8,5,7,10,9,9,3,9,2,6 +G,5,10,6,7,3,7,5,8,9,6,5,10,1,8,6,11 +X,1,0,2,1,0,7,7,4,5,7,6,8,2,8,4,8 +A,2,5,3,3,2,11,3,2,2,9,2,9,2,6,2,8 +T,1,6,2,4,1,7,13,0,4,7,10,8,0,8,0,8 +J,2,6,4,4,3,9,7,2,3,8,4,6,4,8,6,5 +A,3,5,5,4,2,10,2,2,2,8,2,9,3,5,2,8 +P,1,0,1,0,0,5,11,6,1,9,6,5,0,9,3,8 +K,4,8,4,6,2,3,6,9,2,7,7,11,3,8,2,11 +Y,2,8,3,6,1,9,10,1,3,6,11,8,1,11,0,8 +W,5,11,8,8,4,8,8,5,2,7,8,8,9,9,0,8 +K,4,7,6,5,5,5,7,4,7,6,6,11,3,8,5,9 +W,4,2,6,4,4,8,11,3,2,6,9,8,8,12,1,7 +M,11,11,11,6,5,6,10,5,5,4,4,11,10,12,2,7 +W,8,10,11,9,14,7,7,5,5,6,5,8,11,9,10,9 +F,8,11,6,6,3,9,6,3,8,11,4,6,2,10,5,9 +K,4,7,5,5,5,6,8,5,3,7,5,8,4,6,7,10 +T,4,8,5,6,4,6,11,3,7,8,11,8,2,12,1,7 +U,3,7,5,5,4,8,7,7,5,6,7,9,5,8,3,7 +U,3,8,4,6,3,8,6,12,4,7,11,8,3,9,0,8 +I,1,6,2,4,1,7,7,0,7,14,6,8,0,8,1,8 +D,5,8,5,6,5,6,7,9,8,6,5,6,2,8,3,7 +L,1,0,1,1,0,2,2,5,5,1,1,6,0,8,0,8 +A,4,9,6,7,4,12,2,3,2,10,2,9,2,7,3,8 +I,3,10,4,7,2,7,7,0,8,14,6,8,0,8,1,8 +V,4,6,4,4,2,4,12,1,2,9,10,7,2,11,0,8 +Z,4,8,5,6,5,8,10,5,4,6,5,6,3,8,8,3 +H,4,9,4,6,2,7,8,15,1,7,5,8,3,8,0,8 +C,2,1,2,1,0,6,7,6,9,7,6,14,0,8,4,10 +Y,1,0,2,0,0,7,9,3,1,7,12,8,1,11,0,8 +H,6,10,6,6,3,7,8,3,5,9,5,7,6,7,5,8 +F,1,3,3,2,1,5,11,3,4,12,7,5,1,9,1,7 +A,3,2,5,4,2,10,2,2,2,9,1,8,2,6,3,8 +B,5,7,6,5,6,8,7,4,4,7,5,7,6,8,5,8 +T,7,9,7,7,4,5,10,1,8,11,9,6,0,9,2,4 +G,10,14,8,8,4,11,4,4,5,11,3,8,5,7,5,10 +E,6,9,8,7,6,5,8,3,8,11,9,9,3,9,4,6 +Y,1,0,2,0,0,7,10,1,3,7,12,8,1,11,0,8 +X,9,15,10,9,6,8,8,2,7,11,6,6,5,12,4,8 +Y,3,4,5,6,6,7,8,4,1,6,8,9,4,11,7,7 +V,3,4,5,6,1,9,8,4,3,6,14,8,3,10,0,8 +M,3,8,4,6,3,7,6,11,1,7,9,8,8,6,0,8 +X,3,8,5,6,3,7,7,4,9,6,6,8,3,8,6,8 +H,4,10,6,7,10,8,8,5,2,6,6,7,8,9,10,8 +S,5,5,6,8,4,8,9,6,10,5,6,6,0,7,9,7 +Y,3,6,4,4,2,10,11,2,2,5,12,8,1,11,0,8 +R,4,8,6,6,7,6,7,3,4,6,6,9,7,10,7,5 +G,4,7,5,5,3,6,7,6,7,10,7,11,2,9,4,9 +B,3,2,4,4,4,7,7,5,6,7,6,6,2,8,6,10 +L,3,10,3,8,1,0,1,5,6,0,0,7,0,8,0,8 +T,4,11,5,8,3,7,14,0,5,7,10,8,0,8,0,8 +S,6,12,5,6,2,10,2,1,5,9,1,8,2,8,4,11 +I,1,3,1,2,1,8,7,1,7,7,6,7,0,8,2,7 +R,4,6,6,4,3,10,8,3,7,11,1,6,3,7,3,10 +E,3,9,4,7,4,7,7,7,9,8,8,10,3,8,6,7 +O,7,13,5,7,4,6,6,6,3,10,7,9,5,9,5,8 +Y,7,11,7,8,5,4,9,1,7,9,10,6,2,12,4,3 +X,4,4,6,3,3,5,8,2,9,11,10,9,3,7,3,6 +O,4,8,6,6,5,7,7,8,4,7,5,8,3,8,3,8 +V,3,7,5,5,5,8,5,4,1,7,7,8,5,9,3,7 +H,3,7,4,5,2,7,8,14,1,7,6,8,3,8,0,8 +C,8,12,5,6,2,7,8,7,7,11,7,9,2,9,5,9 +P,7,10,6,5,3,5,11,5,2,12,5,4,4,9,4,8 +R,7,11,10,8,7,11,6,3,6,11,2,6,6,7,5,10 +A,2,1,3,1,0,7,4,2,0,7,2,8,2,7,1,8 +P,2,6,2,4,2,3,13,5,1,11,7,4,0,9,2,7 +R,3,8,3,6,2,6,10,9,4,7,4,8,3,7,5,10 +Y,3,3,4,2,1,4,10,2,7,10,10,5,2,12,3,4 +T,3,8,4,6,1,8,15,1,6,6,11,9,0,8,0,8 +Q,5,10,7,9,3,8,7,8,7,6,7,9,3,8,5,9 +V,3,2,5,3,2,7,12,2,3,7,11,9,2,10,1,8 +J,6,10,9,8,6,9,5,6,5,8,6,7,3,7,4,6 +N,5,9,7,7,4,8,7,3,5,10,5,6,6,8,1,7 +M,4,5,6,4,4,8,6,2,4,9,6,8,7,5,2,8 +V,7,9,7,7,3,3,11,5,5,12,12,7,3,10,1,8 +W,4,4,6,6,3,4,8,5,1,7,8,8,8,9,0,8 +E,1,0,1,1,0,5,7,5,7,7,6,12,0,8,6,10 +M,4,2,5,3,4,8,6,6,4,7,7,9,9,5,2,8 +S,3,5,3,4,2,8,7,7,5,8,5,7,2,8,9,8 +H,5,8,8,6,5,5,9,4,6,10,10,9,4,9,4,6 +J,4,9,6,7,3,7,7,3,6,15,6,11,1,6,1,7 +T,6,9,6,7,2,5,13,3,9,12,9,3,0,10,2,4 +J,3,6,4,4,2,9,4,5,4,14,7,13,1,6,0,7 +B,6,9,8,7,6,9,7,3,7,11,4,6,2,8,6,10 +J,2,8,3,6,1,11,5,2,9,12,2,8,0,7,1,8 +S,2,4,4,3,2,9,6,2,7,11,5,8,1,9,4,9 +K,3,9,4,6,3,4,7,7,3,7,6,12,3,8,3,11 +L,4,9,6,6,3,7,3,2,8,7,2,8,1,6,2,7 +N,4,4,4,6,2,7,7,14,2,4,6,8,6,8,0,8 +F,5,7,7,8,7,7,8,4,6,7,6,6,4,9,9,9 +N,6,10,8,8,6,7,9,5,5,7,6,6,7,7,3,7 +V,1,0,2,1,0,8,9,3,2,7,12,8,2,10,0,8 +U,3,2,4,4,2,8,8,6,7,5,9,8,3,9,1,8 +P,5,7,6,10,11,8,6,6,1,7,6,7,9,8,6,8 +O,3,7,4,5,3,6,8,7,5,9,8,8,3,8,3,8 +I,4,10,5,7,3,7,7,0,7,13,6,8,0,8,1,8 +J,3,7,5,5,2,9,5,5,5,15,6,11,0,6,1,7 +M,3,7,4,5,3,7,7,11,1,7,9,8,8,5,0,8 +P,8,9,7,4,3,6,11,6,2,10,4,5,4,9,4,8 +Q,5,10,6,9,6,8,8,7,4,5,10,9,3,8,5,9 +X,6,9,9,7,5,4,8,2,8,10,12,11,3,8,3,5 +Z,3,8,4,6,3,9,6,5,10,7,5,6,1,7,8,8 +M,1,0,2,0,1,7,6,9,0,7,8,8,6,6,0,8 +G,5,11,6,8,7,7,8,6,2,6,6,10,4,8,7,7 +T,4,5,5,7,2,5,15,1,6,9,11,7,0,8,0,8 +I,6,12,4,7,3,11,3,4,5,12,2,8,3,8,4,10 +I,4,10,5,8,4,6,8,0,7,13,7,8,0,8,1,7 +L,5,10,5,5,3,5,7,3,7,12,8,11,2,8,6,7 +J,2,6,4,4,3,9,7,3,3,8,5,6,4,8,6,5 +J,4,9,6,7,6,9,9,4,3,8,4,6,4,8,5,4 +P,3,3,4,5,2,4,11,9,2,10,6,4,1,10,4,8 +M,5,5,7,4,4,7,6,6,6,6,7,7,9,7,3,6 +I,3,11,4,8,3,9,7,0,7,13,5,8,0,8,1,8 +U,3,1,4,3,2,6,9,5,7,7,10,9,3,9,1,8 +B,2,3,4,2,2,8,8,3,5,10,5,6,3,7,5,8 +U,5,10,6,8,6,9,6,6,6,7,6,8,9,8,4,7 +F,3,8,3,5,1,1,13,4,4,12,11,6,0,8,2,6 +F,5,9,5,5,4,5,12,3,3,11,7,4,4,10,7,5 +L,5,10,7,8,4,7,3,1,9,9,2,11,0,7,3,9 +Q,6,10,8,9,4,8,6,8,8,6,5,8,3,8,5,8 +X,2,0,2,1,0,7,7,6,2,7,6,8,3,8,3,8 +P,2,3,3,2,2,5,9,4,4,9,7,4,1,10,3,7 +Z,2,1,2,2,1,7,7,5,9,6,6,8,1,8,6,8 +B,7,10,9,8,6,11,5,3,7,11,3,7,5,7,7,12 +E,6,9,8,8,8,6,9,4,4,8,7,10,5,11,8,10 +E,3,2,3,3,3,7,7,5,7,7,5,9,2,8,5,10 +F,6,9,8,6,5,6,11,3,5,13,7,4,2,10,2,7 +V,3,6,5,4,1,7,8,4,2,7,13,8,3,10,0,8 +M,4,11,5,8,4,7,7,12,2,7,9,8,8,6,0,8 +F,4,10,7,8,8,9,6,1,5,9,6,6,6,11,5,6 +K,4,10,6,8,6,7,6,5,4,6,6,8,4,6,10,11 +X,1,1,2,1,1,7,7,3,7,6,6,8,2,8,5,8 +Y,5,8,5,6,2,4,10,1,7,10,10,6,1,11,3,3 +L,4,8,5,6,2,5,3,1,9,6,1,10,0,7,2,7 +T,5,8,5,6,3,5,11,2,8,12,10,5,1,10,2,4 +Y,9,13,8,7,4,6,7,5,4,10,9,5,4,10,4,5 +S,8,15,6,9,3,11,3,4,5,11,2,9,4,6,5,11 +G,3,8,4,6,2,8,5,8,9,8,4,12,1,9,5,10 +B,6,10,8,7,6,10,7,3,7,11,3,6,2,8,5,11 +H,4,5,5,4,4,8,7,6,6,7,6,8,3,8,4,7 +J,3,6,5,4,2,7,6,3,6,15,6,11,1,6,0,8 +V,4,5,7,8,2,7,8,4,3,7,14,8,3,9,0,8 +V,3,6,5,4,1,8,8,4,2,6,14,8,3,9,0,8 +Y,4,7,6,5,3,5,9,1,7,8,12,9,1,11,2,7 +Z,3,9,5,7,5,8,6,2,7,8,6,8,1,7,11,10 +Q,2,4,3,5,3,8,7,6,2,8,7,9,2,8,4,9 +F,7,11,6,6,3,7,8,3,6,12,5,6,2,8,6,6 +Y,3,7,5,4,1,7,10,3,2,7,13,8,2,11,0,8 +T,5,6,7,6,6,7,9,5,8,7,7,7,3,11,7,7 +E,4,9,5,7,6,6,7,5,8,7,6,10,3,8,6,9 +Q,3,5,4,6,4,8,7,7,3,8,6,9,2,9,3,8 +Z,3,5,6,4,3,8,7,2,10,12,6,9,1,8,6,8 +U,12,14,10,8,4,6,5,4,7,3,9,6,6,7,2,7 +X,2,3,4,1,2,7,7,4,9,7,6,8,2,8,6,7 +D,8,14,7,8,5,6,7,5,6,9,6,6,5,8,7,4 +I,5,10,4,6,2,9,7,3,6,13,4,5,2,9,4,10 +C,4,9,5,6,3,4,8,6,6,11,10,12,2,10,3,7 +N,6,9,5,5,2,4,8,4,6,4,4,11,5,9,2,7 +R,5,9,8,6,9,8,7,4,4,6,7,8,7,9,8,6 +U,4,5,5,4,2,4,8,5,8,10,9,9,3,9,2,6 +X,3,6,5,4,4,8,6,2,5,6,6,7,2,9,8,9 +L,7,11,9,9,7,9,7,8,6,6,6,7,6,7,9,15 +B,7,11,9,8,9,8,8,4,6,7,6,7,7,7,7,9 +F,3,10,4,8,3,1,12,3,4,12,11,8,0,8,2,6 +G,5,11,6,8,4,6,7,7,7,10,7,11,2,9,4,9 +K,4,5,6,5,5,9,5,2,4,8,4,8,4,6,6,11 +J,3,9,5,7,3,5,7,3,5,15,8,11,1,6,1,7 +X,3,8,5,6,4,8,7,3,8,5,6,8,2,8,6,8 +R,1,0,1,0,0,6,8,7,3,7,5,7,2,7,4,11 +R,2,3,3,2,2,6,8,4,5,7,5,7,2,7,4,9 +R,3,8,5,6,5,8,8,7,4,8,5,7,4,7,6,11 +R,5,9,7,6,6,6,8,5,6,7,5,8,3,7,5,9 +J,1,3,2,2,1,8,6,3,4,14,6,10,1,7,0,7 +Z,4,7,4,5,3,7,7,6,11,6,6,8,1,8,8,8 +A,4,9,7,6,4,8,3,1,2,5,2,8,3,5,3,7 +V,2,1,3,2,1,9,12,2,2,5,10,9,2,11,0,8 +G,6,9,6,7,5,5,6,6,5,9,8,11,2,9,4,10 +K,7,12,7,7,4,11,6,4,6,11,2,6,5,8,4,10 +I,3,6,4,4,2,7,7,0,7,13,6,8,0,8,1,8 +N,6,9,8,7,9,7,7,3,5,8,6,7,6,9,7,5 +X,5,8,7,6,3,8,7,2,8,10,4,7,3,8,4,8 +N,4,4,4,6,2,7,7,14,2,4,6,8,6,8,0,8 +E,5,10,7,8,6,7,7,6,9,7,6,9,6,8,6,9 +J,3,7,5,5,2,8,5,5,5,15,7,12,1,6,1,6 +W,5,11,7,8,4,7,7,5,2,7,8,8,9,9,0,8 +Z,4,8,6,6,3,7,7,2,10,12,6,7,1,7,6,7 +D,7,12,7,6,4,12,2,4,5,12,1,9,4,7,2,11 +J,4,5,6,5,5,8,8,4,6,7,6,8,3,9,8,8 +D,5,8,7,6,5,10,5,2,7,11,3,7,4,7,3,9 +J,4,11,6,9,5,7,7,1,6,11,5,9,1,6,2,5 +Z,1,0,1,1,0,7,7,2,10,9,6,8,0,8,6,8 +W,6,10,8,8,4,4,8,5,2,7,9,8,9,9,0,8 +B,5,11,5,8,7,6,7,8,5,6,6,7,2,8,8,9 +S,4,5,4,4,3,8,8,7,5,7,6,7,2,9,9,8 +L,4,9,4,7,1,0,0,6,6,0,1,5,0,8,0,8 +C,5,11,6,8,3,4,7,7,11,7,7,12,1,7,4,8 +E,4,6,5,5,5,6,8,4,3,8,7,9,4,10,8,11 +J,5,8,3,12,3,9,6,2,4,9,5,6,3,9,5,10 +E,5,9,8,7,5,10,6,2,8,11,4,9,3,8,5,11 +M,7,11,9,8,11,7,8,6,4,7,6,8,8,10,9,11 +W,7,10,7,8,7,4,11,2,2,9,8,7,7,12,2,6 +W,6,8,8,7,10,7,7,5,5,6,5,8,10,8,8,10 +X,5,10,7,8,5,8,7,3,9,5,6,9,5,7,9,8 +W,4,4,5,3,3,4,11,3,2,9,9,7,6,12,1,6 +J,2,7,2,5,1,15,3,3,5,12,1,8,0,8,0,8 +D,2,3,4,2,2,9,6,4,6,10,4,6,2,8,3,8 +R,3,7,4,5,4,8,8,7,2,7,4,6,4,6,8,8 +H,4,7,6,5,5,7,9,7,5,8,5,7,3,7,5,10 +E,2,1,3,3,2,7,7,5,7,7,6,9,2,8,5,10 +C,4,7,5,5,2,4,9,6,8,12,10,11,1,9,3,7 +T,2,3,3,1,1,7,11,2,6,7,11,8,1,10,1,7 +O,4,7,5,5,3,7,6,8,5,7,5,8,3,8,3,8 +M,2,1,3,2,1,7,6,10,1,7,9,8,7,6,0,8 +F,3,11,4,8,2,1,13,5,4,12,10,7,0,8,3,6 +L,3,9,5,7,3,5,5,2,8,6,1,10,0,6,3,7 +S,4,6,5,4,5,8,9,4,4,8,5,6,3,9,9,7 +Y,1,0,2,0,0,8,10,3,1,6,12,8,1,11,0,8 +R,4,5,5,7,3,5,10,9,4,7,4,8,3,7,6,11 +F,2,4,3,2,1,4,11,4,4,13,8,5,1,9,1,7 +Z,5,11,6,8,5,6,8,6,11,7,7,10,1,9,8,8 +Y,3,2,5,4,2,6,10,1,8,8,12,8,1,11,3,7 +J,5,9,7,7,4,6,7,3,6,15,7,11,1,6,2,6 +D,6,11,9,8,8,8,8,5,6,10,6,5,4,8,4,9 +T,2,1,3,2,1,8,12,3,6,7,11,8,2,11,1,8 +M,3,5,4,4,4,8,6,6,4,7,7,8,7,5,2,7 +Q,3,5,4,8,2,8,7,9,5,6,7,9,3,8,5,9 +O,1,0,2,0,0,7,7,6,4,7,6,8,2,8,3,8 +B,4,11,5,8,4,6,8,10,7,7,5,7,2,8,9,9 +D,2,4,4,3,2,9,6,4,6,10,4,6,2,8,3,8 +U,4,9,5,6,4,7,6,12,4,6,12,8,3,9,0,8 +Z,3,9,4,7,5,9,9,3,7,7,7,5,0,9,12,9 +C,4,7,4,5,3,5,8,5,6,11,9,13,2,9,3,7 +N,1,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +F,6,11,8,8,8,6,10,6,5,9,6,9,3,10,8,10 +J,5,10,6,8,3,6,9,3,6,15,7,8,2,8,2,8 +C,5,11,6,8,3,5,8,8,8,8,8,14,2,9,4,9 +P,2,3,2,2,1,5,9,3,4,9,8,5,1,9,2,7 +L,7,10,9,7,7,6,6,9,5,6,6,9,3,7,6,13 +I,4,5,6,5,4,8,9,4,6,7,7,8,3,8,8,8 +M,2,0,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +S,4,6,5,4,3,7,8,3,7,10,4,7,2,6,4,8 +W,6,7,6,5,6,7,10,4,2,8,6,6,8,12,4,5 +Z,5,6,4,8,3,8,6,5,5,10,6,7,3,9,9,9 +C,1,3,2,2,1,6,8,6,7,7,8,12,1,9,4,10 +J,5,7,7,8,6,8,9,4,5,7,6,7,3,8,9,8 +F,2,4,3,3,2,7,9,2,5,13,6,6,2,11,2,7 +S,4,7,6,5,3,9,7,4,8,11,3,8,2,8,5,11 +Y,3,5,4,7,6,8,8,3,1,7,7,9,4,11,6,7 +T,3,4,4,2,1,5,13,3,6,12,9,3,1,10,1,5 +T,4,9,4,4,1,6,10,2,7,12,7,5,1,10,3,5 +N,4,2,5,4,3,7,9,5,5,7,6,6,7,8,3,7 +Y,5,6,6,8,9,9,8,6,3,7,7,8,6,10,7,4 +C,3,3,4,2,1,4,8,4,7,10,9,12,1,9,2,7 +G,6,9,5,5,4,8,4,5,2,9,6,9,4,8,7,8 +F,8,15,7,8,5,8,10,3,5,12,5,4,4,9,7,7 +A,3,7,4,5,3,9,4,3,1,8,1,8,2,6,1,8 +Q,3,4,4,5,3,8,7,5,3,8,8,9,3,8,4,9 +U,4,7,6,5,7,7,7,4,4,6,7,8,10,9,5,8 +G,3,4,4,3,2,6,7,5,5,9,7,9,2,9,4,9 +Q,3,4,4,6,2,8,7,8,6,6,7,8,3,8,5,9 +K,5,9,6,5,3,3,9,3,6,9,8,11,4,7,3,6 +C,1,3,2,2,1,6,7,7,6,8,7,13,1,9,3,10 +O,4,5,5,8,3,8,8,9,7,6,7,9,3,8,4,8 +C,5,11,6,9,4,6,8,9,7,10,7,11,2,11,4,9 +W,4,6,6,4,3,9,8,4,1,7,8,8,8,9,0,8 +Z,4,10,5,7,5,7,8,5,9,7,6,9,1,9,7,7 +U,3,1,4,3,2,6,8,6,7,7,9,9,3,9,1,8 +R,3,7,4,5,4,6,9,8,3,7,5,8,2,7,5,11 +C,3,2,4,4,2,6,8,8,8,9,8,12,2,10,4,10 +C,2,1,3,2,1,6,8,7,8,8,8,13,1,9,4,10 +P,6,11,6,8,3,4,13,9,2,10,6,4,1,10,4,8 +N,4,6,7,4,6,7,8,3,4,8,7,7,6,9,5,4 +W,3,3,4,2,2,4,11,3,2,9,9,7,6,11,1,7 +U,6,8,7,6,5,4,8,5,7,9,8,10,5,8,3,4 +K,6,9,9,7,10,7,7,4,4,6,6,9,8,8,8,8 +D,4,8,5,6,4,7,7,5,5,7,6,7,4,8,3,7 +K,1,0,1,0,0,4,6,6,1,7,6,10,3,7,1,10 +M,5,6,8,4,5,7,6,2,5,9,7,8,8,6,2,8 +I,3,11,4,9,2,6,8,0,7,13,7,8,0,8,1,7 +W,4,8,6,6,5,8,8,4,1,6,9,8,7,11,0,8 +Z,3,5,3,3,2,8,7,5,10,6,6,7,2,8,7,8 +B,3,7,3,5,4,6,7,8,5,7,6,7,2,8,7,10 +G,9,14,7,8,5,8,7,5,4,9,5,6,4,9,8,8 +Z,5,5,7,8,3,7,7,4,15,9,6,8,0,8,9,8 +F,4,11,5,8,2,1,11,5,7,12,12,10,0,8,2,6 +T,2,5,3,4,2,7,12,3,6,7,11,8,2,11,1,8 +G,4,3,5,4,3,6,6,5,6,6,6,8,2,8,4,8 +J,3,7,4,5,2,9,6,1,6,13,4,8,0,7,0,8 +A,8,12,8,6,4,11,0,4,3,12,6,14,4,5,5,11 +S,3,10,4,8,5,8,8,8,5,7,5,8,2,8,8,8 +N,5,6,7,4,3,7,8,3,5,10,6,7,5,8,1,7 +J,2,9,3,6,3,11,5,2,6,11,2,7,0,7,1,7 +K,6,11,9,8,8,3,8,1,6,9,9,11,3,8,3,6 +U,4,6,6,6,5,7,6,5,4,6,6,8,4,8,1,7 +S,4,7,6,5,7,6,6,3,2,8,6,7,3,7,11,2 +Y,4,7,6,10,10,7,5,4,3,8,8,9,9,10,8,8 +E,2,1,2,1,2,7,7,5,6,7,6,8,2,8,5,10 +O,5,11,5,8,5,8,7,8,4,9,6,6,4,9,4,8 +V,3,9,5,7,3,7,11,2,3,6,11,9,2,10,1,8 +W,7,10,9,7,6,4,8,5,1,7,9,8,8,10,0,8 +A,3,7,5,5,3,10,2,2,2,9,2,8,2,6,4,8 +I,2,6,4,4,2,7,7,0,8,13,6,8,0,8,1,7 +Z,2,2,2,3,2,7,8,5,9,6,6,9,1,9,7,8 +O,4,7,4,5,3,8,6,6,3,10,5,10,3,8,2,8 +P,4,9,6,7,4,6,10,5,6,10,8,3,1,10,4,7 +X,2,1,4,2,2,7,7,3,9,6,6,8,2,8,5,8 +M,5,10,8,7,10,12,4,3,1,9,4,9,10,6,3,8 +R,1,1,2,1,1,6,9,7,3,7,5,8,2,7,4,11 +M,4,7,7,5,9,8,7,3,3,8,4,7,10,5,2,6 +Z,2,5,3,3,3,8,7,5,9,6,6,7,2,8,7,8 +N,5,5,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +M,5,10,6,8,4,8,7,13,2,6,9,8,8,6,0,8 +L,3,6,4,4,2,5,3,5,8,2,2,4,1,6,1,5 +M,1,0,2,0,1,7,6,9,0,7,8,8,5,6,0,8 +N,4,8,6,6,4,8,6,9,5,4,4,5,4,6,3,8 +W,9,10,8,7,6,5,10,3,3,9,8,7,10,11,4,5 +Y,4,9,5,6,1,7,10,3,2,7,13,8,1,11,0,8 +N,3,6,5,4,3,4,9,3,3,10,10,9,5,8,0,8 +J,3,8,4,6,2,9,5,4,5,15,6,12,1,6,1,7 +L,4,11,6,8,3,4,4,1,10,6,1,11,0,7,3,6 +C,7,11,8,8,4,2,10,5,8,11,11,11,1,8,2,6 +A,4,9,6,7,4,7,5,3,0,6,1,8,2,7,1,7 +F,2,3,2,1,1,5,11,3,5,11,9,5,1,9,3,6 +T,2,7,4,5,1,7,14,0,5,7,10,8,0,8,0,8 +N,2,3,4,2,2,8,9,3,4,10,4,5,5,9,1,7 +I,1,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +H,3,2,4,4,3,8,8,6,6,7,6,8,3,8,3,9 +A,3,7,5,6,4,6,8,2,4,7,7,9,5,9,3,7 +R,2,3,3,5,2,6,9,9,4,7,5,7,2,8,5,10 +H,5,8,7,6,7,6,7,6,6,7,6,10,3,8,3,9 +E,4,8,6,6,4,6,8,4,9,11,9,9,2,9,5,5 +Y,3,5,4,3,2,4,10,1,7,10,10,5,2,11,3,4 +L,2,6,3,4,1,0,1,5,6,0,0,6,0,8,0,8 +J,4,7,5,5,2,9,5,3,7,15,4,9,0,7,0,8 +A,1,1,2,1,0,7,4,2,0,7,2,8,2,6,1,8 +U,4,5,5,4,3,4,8,5,7,10,9,9,3,9,2,6 +Y,2,7,4,4,1,9,10,2,3,6,12,8,1,11,0,8 +I,7,12,5,6,2,9,6,5,5,13,3,8,3,7,5,10 +O,6,9,8,8,7,7,5,4,5,9,3,7,4,8,6,9 +T,4,5,5,3,2,6,11,2,8,11,9,4,1,11,3,4 +K,4,8,6,6,4,4,7,6,7,6,6,13,4,7,6,10 +Q,3,6,5,5,3,8,7,7,5,6,6,8,2,8,4,9 +P,2,1,2,1,1,5,11,7,1,9,6,4,1,9,3,8 +P,5,8,8,6,4,6,12,7,2,11,5,2,1,10,4,9 +U,4,4,4,6,2,8,5,14,5,6,13,8,3,9,0,8 +V,5,9,5,6,3,2,11,2,3,10,11,8,2,11,1,8 +O,2,3,2,1,1,8,7,6,4,9,6,8,2,8,3,8 +L,3,2,4,3,2,4,4,5,7,2,2,5,1,6,1,6 +W,6,6,6,4,4,7,11,5,2,8,6,6,7,12,2,6 +I,6,15,4,8,3,11,5,5,4,13,3,8,3,8,5,9 +N,4,4,5,6,2,7,7,15,2,4,6,8,6,8,0,8 +V,6,9,5,4,2,6,11,6,3,11,9,4,4,12,3,9 +K,4,8,6,6,4,5,7,4,8,7,6,10,4,8,5,9 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +I,0,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +H,2,6,3,4,1,7,8,14,1,7,5,8,3,8,0,8 +B,7,9,6,4,5,9,7,3,5,9,4,7,7,5,7,8 +D,8,12,7,6,5,8,6,3,7,10,5,7,6,7,8,6 +A,6,14,6,8,5,11,3,4,2,11,3,11,5,3,4,11 +R,7,10,9,8,11,7,7,3,5,6,6,9,7,9,7,6 +P,3,2,3,3,2,5,11,5,4,10,7,2,1,10,4,6 +L,5,11,7,8,5,9,3,1,8,9,2,10,3,6,5,10 +L,1,0,1,1,0,2,2,5,5,1,1,6,0,8,0,8 +E,2,4,4,3,2,6,7,2,7,11,7,9,2,8,4,8 +M,3,4,4,3,3,8,6,6,4,6,7,8,7,5,2,7 +J,2,6,4,4,1,10,6,2,7,15,4,7,0,7,0,8 +I,4,9,5,7,3,9,6,0,7,13,5,9,0,8,1,8 +H,7,9,10,6,6,6,7,3,7,10,8,9,3,8,3,7 +V,3,8,5,6,1,8,8,4,3,6,14,8,3,10,0,8 +D,3,5,4,3,2,8,7,7,8,6,6,3,2,8,3,7 +D,10,15,9,8,5,7,6,5,6,9,4,5,5,8,6,9 +K,5,6,7,4,5,6,7,1,6,10,6,10,4,8,4,8 +D,5,8,8,6,5,8,8,7,8,10,5,4,3,8,5,8 +L,4,10,5,8,7,8,8,3,5,5,7,9,5,11,9,10 +Y,9,15,8,8,4,7,8,4,4,10,7,5,4,9,5,3 +D,2,1,2,2,1,6,7,9,6,6,6,6,2,8,3,8 +V,6,11,9,8,10,7,5,5,3,8,8,9,9,9,6,8 +X,3,4,6,3,3,6,9,1,8,10,9,8,2,8,3,6 +N,2,3,4,2,1,5,9,3,3,10,8,8,5,8,0,7 +J,1,5,3,4,1,9,6,3,6,14,5,10,0,7,0,7 +P,4,5,6,7,7,6,8,5,3,7,7,6,7,12,6,9 +W,5,9,7,7,7,10,11,2,2,6,8,7,9,13,2,8 +V,4,9,7,7,3,5,12,3,4,8,12,9,2,10,1,8 +F,4,7,6,5,6,7,8,5,4,8,6,9,4,11,9,11 +K,8,10,7,5,3,8,7,3,7,9,7,7,6,10,4,8 +E,3,7,4,5,3,7,7,6,8,7,6,9,3,8,6,8 +T,3,11,5,8,1,6,14,0,6,8,11,8,0,8,0,8 +O,5,9,5,6,4,7,7,8,5,10,6,8,3,8,3,8 +K,7,9,10,7,6,2,8,3,8,11,12,12,5,6,5,3 +R,5,8,7,6,6,8,8,5,5,9,5,8,3,8,5,11 +T,4,8,6,6,5,6,7,6,6,7,9,9,3,10,5,8 +I,2,8,2,6,2,7,7,0,8,7,6,8,0,8,3,8 +D,1,3,2,2,1,9,6,3,4,10,4,6,2,8,2,8 +K,4,4,5,6,2,3,7,8,2,7,6,11,3,8,2,11 +J,1,6,2,4,1,11,3,9,3,13,7,13,1,6,0,8 +U,4,4,5,2,2,4,8,5,7,10,9,9,3,9,2,6 +H,2,4,4,2,2,7,8,3,5,10,6,7,3,8,2,8 +P,7,11,9,8,6,8,9,2,6,14,6,5,3,10,4,9 +K,3,4,6,3,3,6,7,2,7,10,7,10,3,8,3,7 +F,3,7,3,5,2,1,12,4,4,11,10,8,0,8,2,6 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +K,4,8,5,6,2,4,8,9,1,7,6,11,3,8,3,11 +Q,1,0,1,1,0,8,6,7,5,6,6,9,2,7,3,9 +Q,3,4,4,5,3,8,8,6,2,8,7,9,2,9,3,9 +L,4,11,5,8,3,9,2,2,7,9,2,10,1,5,3,9 +I,0,3,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +T,7,13,6,7,4,8,8,3,7,11,5,6,2,8,6,7 +A,4,8,6,6,3,13,3,4,3,11,1,8,2,6,2,9 +G,5,10,6,7,4,6,7,7,7,10,7,11,2,9,5,9 +O,6,9,8,7,5,7,6,8,4,7,5,8,3,8,3,8 +P,2,2,3,3,2,5,10,4,4,9,8,4,1,10,3,7 +N,4,10,6,8,4,8,8,6,5,6,6,6,6,9,2,5 +T,3,1,4,2,1,7,11,2,7,7,11,8,1,10,1,8 +V,5,9,6,7,4,8,11,3,2,5,10,9,5,11,5,8 +H,5,6,7,4,4,10,7,4,6,10,2,7,3,8,3,9 +G,1,0,1,0,0,7,6,6,5,6,5,9,1,7,4,10 +P,4,9,4,7,4,5,10,9,3,9,6,5,1,10,3,8 +D,3,6,5,4,3,9,7,5,7,10,5,4,3,8,3,8 +K,5,6,7,5,6,7,7,2,4,7,3,9,6,4,8,10 +Z,1,0,1,0,0,7,7,2,9,8,6,8,0,8,5,8 +X,4,6,5,4,3,7,8,1,8,10,7,8,3,8,3,7 +K,7,9,9,8,9,10,6,3,5,10,2,8,8,6,7,12 +G,4,7,5,5,5,8,7,6,2,7,6,11,4,8,7,9 +J,4,9,5,7,3,9,6,2,6,14,4,8,0,7,0,8 +Q,9,15,8,8,5,9,4,5,9,11,3,11,3,6,8,11 +M,5,5,8,4,4,10,5,3,5,9,3,7,10,7,3,9 +Q,1,2,2,3,2,8,7,6,2,5,6,10,2,9,4,9 +C,6,9,6,7,3,3,8,5,7,12,10,12,2,9,2,7 +Y,7,11,6,6,3,5,9,4,3,11,10,6,4,10,3,3 +F,3,10,4,7,2,0,13,4,4,12,11,7,0,8,2,6 +U,4,10,4,7,2,7,5,15,5,7,13,8,3,9,0,8 +T,6,9,5,4,2,5,11,3,6,13,7,5,2,8,3,4 +I,6,7,8,8,7,9,8,5,5,7,5,9,3,8,9,7 +F,4,8,4,6,3,2,12,5,6,11,10,8,0,8,2,7 +L,2,3,2,2,1,4,4,4,7,2,2,6,0,7,1,6 +L,3,7,5,6,4,8,5,5,4,6,7,8,3,8,8,11 +G,4,6,6,6,6,8,9,6,3,6,6,9,7,11,6,9 +H,2,4,3,3,3,7,7,5,5,7,6,8,3,8,2,8 +K,8,13,8,7,4,9,7,3,7,9,3,6,5,8,4,8 +C,2,5,3,3,2,6,8,7,8,8,7,13,1,9,4,10 +V,2,7,4,5,1,9,8,4,2,6,13,8,3,10,0,8 +Q,2,2,2,3,2,8,9,5,2,8,8,10,2,9,4,9 +Y,1,0,2,0,0,8,10,3,1,6,12,8,1,11,0,8 +O,2,1,3,2,2,7,8,7,5,7,7,8,2,8,3,8 +Y,8,14,6,8,4,7,8,4,4,9,8,5,4,10,4,4 +X,5,11,7,8,7,8,7,3,5,6,7,6,4,10,11,9 +A,1,0,2,0,0,8,4,2,0,7,2,8,1,6,1,8 +P,6,9,9,7,4,9,9,3,7,14,4,3,2,9,4,9 +L,2,2,3,4,1,3,4,3,8,2,1,7,0,7,1,6 +V,9,12,7,7,3,7,9,6,4,8,9,5,6,13,4,9 +F,2,5,3,4,2,5,11,3,5,11,9,5,1,10,3,6 +E,3,8,5,6,5,7,7,3,6,7,7,10,4,10,8,8 +Z,5,12,6,6,4,9,5,3,8,12,4,9,3,9,5,11 +U,3,3,4,1,1,4,9,5,6,11,10,9,3,10,2,7 +J,2,5,3,4,1,11,6,2,6,11,3,8,1,6,1,7 +F,2,4,4,3,2,6,10,2,6,13,7,5,1,10,1,7 +F,4,6,6,4,5,10,7,1,5,9,5,6,4,10,4,7 +Z,1,3,2,2,1,7,7,5,8,6,6,8,2,8,7,8 +W,3,4,4,3,3,6,10,4,2,8,7,7,6,11,1,6 +J,1,0,1,1,0,12,3,5,3,12,5,11,0,7,0,8 +P,4,9,5,6,3,5,10,10,5,9,6,5,2,10,4,8 +L,0,0,1,0,0,2,2,5,4,1,2,6,0,8,0,8 +C,5,11,6,8,2,5,7,7,10,7,6,14,1,8,4,9 +A,5,8,7,6,6,8,9,7,5,6,6,8,3,7,7,4 +X,6,9,8,8,8,8,7,2,5,7,6,7,4,9,8,8 +Q,6,9,7,11,8,9,10,6,4,3,9,12,4,9,9,14 +A,3,2,6,4,2,10,2,2,2,9,1,8,2,6,2,8 +W,4,4,5,2,3,7,11,3,2,6,9,8,7,11,0,8 +K,4,9,5,6,2,3,8,8,2,7,5,11,4,8,3,10 +F,5,9,7,7,8,10,6,2,4,9,5,6,6,9,5,7 +E,4,8,4,6,3,3,9,6,12,7,5,14,0,8,7,7 +H,7,10,10,8,9,7,8,3,6,10,6,7,3,8,3,8 +G,8,11,7,6,4,7,6,6,5,9,5,6,4,7,5,7 +Y,5,6,6,8,8,9,7,6,3,7,8,8,7,10,6,5 +T,2,3,3,4,1,7,14,0,6,7,11,8,0,8,0,8 +J,2,8,3,6,1,12,2,9,4,14,6,13,1,6,0,8 +T,8,11,8,8,4,4,12,2,8,13,10,5,0,10,2,4 +V,4,10,5,8,3,5,11,3,3,9,12,9,2,10,1,8 +A,5,6,7,5,6,6,6,3,5,7,8,10,8,11,3,8 +V,5,9,4,4,2,9,9,5,4,5,10,6,4,11,3,5 +M,3,7,5,5,5,9,6,6,4,6,7,6,7,5,2,6 +U,5,10,6,8,5,6,8,8,5,5,6,12,5,9,7,3 +D,5,10,7,8,6,6,7,8,7,7,7,5,4,7,4,9 +Q,6,9,6,10,6,8,6,7,4,9,6,10,4,10,7,6 +X,4,6,6,4,3,7,7,1,8,10,7,9,3,8,3,7 +H,3,9,4,7,4,8,9,13,2,7,4,8,3,8,0,8 +V,1,0,2,0,0,8,9,3,1,6,12,8,2,11,0,8 +G,4,6,4,4,3,6,7,5,6,9,8,10,2,9,4,9 +F,3,4,3,6,1,0,11,4,7,12,12,9,0,8,2,6 +H,6,7,9,10,8,7,11,5,1,8,7,5,4,12,10,4 +U,6,10,6,6,4,7,6,5,5,7,8,9,5,8,3,8 +W,4,4,5,2,3,4,11,3,2,10,9,8,6,11,1,6 +H,4,10,4,7,2,7,7,15,1,7,7,8,3,8,0,8 +M,6,10,8,8,7,6,7,3,5,9,9,9,8,6,2,7 +U,10,14,9,8,5,6,6,5,5,6,8,9,7,7,4,9 +E,3,3,3,5,2,3,9,6,11,7,5,14,0,8,7,8 +Z,6,6,5,9,4,7,8,5,3,11,7,7,2,9,9,7 +U,2,5,4,4,3,7,7,4,3,6,7,8,3,8,1,7 +U,3,6,4,4,1,7,5,13,5,7,14,8,3,9,0,8 +Y,3,6,5,4,2,10,11,2,7,3,11,8,1,11,1,9 +T,1,0,1,0,0,7,14,1,4,7,10,8,0,8,0,8 +D,6,11,6,8,4,6,7,11,11,6,5,6,3,8,4,8 +I,1,4,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +M,2,0,3,1,1,7,6,10,0,7,9,8,7,6,0,8 +I,1,8,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +I,3,10,4,8,2,7,7,0,8,13,6,8,0,8,1,7 +E,2,3,3,2,1,6,8,1,7,11,6,9,2,8,3,8 +Q,8,13,8,7,5,12,4,3,6,10,3,7,3,9,6,13 +W,2,0,2,0,1,7,8,4,0,7,8,8,6,9,0,8 +H,7,9,10,7,8,6,8,2,6,10,7,8,5,9,4,8 +I,2,5,3,3,1,7,8,1,8,14,6,7,0,8,1,7 +Q,4,6,5,9,6,8,13,4,3,4,8,12,4,14,7,13 +D,3,6,5,4,3,7,7,8,7,7,6,5,3,8,3,7 +Q,6,10,8,8,7,7,4,8,4,6,7,10,5,7,7,9 +C,3,8,4,6,2,6,8,8,7,10,8,13,2,10,4,10 +V,5,7,5,5,2,3,11,4,3,10,12,7,2,10,1,8 +D,3,6,4,4,3,5,8,8,7,8,7,6,2,8,3,8 +J,4,10,6,7,6,10,8,3,4,8,3,6,4,8,7,7 +N,3,6,4,4,3,7,7,12,1,7,6,8,5,9,0,8 +V,3,3,4,2,1,4,12,3,2,10,11,7,2,11,1,8 +U,5,7,5,5,3,3,9,5,6,11,11,9,3,9,1,6 +S,2,6,3,4,2,8,7,7,7,7,7,9,2,10,9,8 +A,3,7,5,5,3,11,2,3,2,10,2,9,3,7,3,9 +W,7,7,9,6,10,7,7,5,5,7,6,8,9,9,9,8 +F,4,11,6,8,4,5,11,4,6,11,10,5,2,10,3,5 +N,2,1,2,1,1,7,7,11,1,5,6,8,4,8,0,8 +N,2,4,3,3,2,7,8,5,4,7,6,6,4,8,1,6 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +P,4,6,5,4,4,6,7,6,4,7,6,8,2,9,7,10 +T,2,7,3,4,1,7,14,0,6,7,11,8,0,8,0,8 +D,6,9,9,8,8,6,7,5,7,7,4,7,4,6,6,5 +R,5,8,7,6,7,8,6,7,3,8,6,8,6,6,6,11 +E,5,9,5,7,3,3,8,6,11,7,6,15,0,8,7,7 +Z,7,10,9,8,6,7,8,2,9,12,7,7,1,8,6,8 +F,1,0,1,0,0,3,11,4,3,11,9,7,0,8,2,8 +P,4,7,5,5,3,7,10,6,4,11,5,4,1,10,3,8 +T,7,15,6,8,3,6,9,3,8,13,6,6,2,8,5,4 +P,3,10,4,8,4,3,12,7,2,11,8,4,0,10,3,8 +K,3,7,4,5,1,3,7,7,2,7,7,11,3,8,3,10 +E,3,6,4,4,2,5,9,4,8,12,9,8,2,9,5,5 +W,10,11,10,8,8,2,11,2,3,10,11,9,7,10,2,6 +Z,4,9,4,7,2,7,7,4,14,9,6,8,0,8,8,8 +B,4,5,5,8,4,6,9,9,7,8,5,6,2,8,9,10 +R,3,7,4,5,4,7,9,6,5,8,5,9,3,6,5,10 +Y,9,8,7,12,5,8,5,5,5,5,12,6,5,10,4,7 +Z,5,10,6,8,5,7,8,3,12,9,6,8,0,8,8,7 +Z,2,5,4,4,2,7,8,2,10,11,6,7,1,8,6,7 +I,2,10,2,8,3,7,7,0,7,7,6,8,0,8,3,8 +Z,4,8,5,6,5,8,8,3,7,7,6,7,1,9,10,8 +L,2,3,3,2,1,5,4,5,8,3,2,6,1,7,1,6 +E,3,5,3,4,3,7,8,5,8,7,5,9,2,8,6,9 +K,3,9,4,7,2,3,7,7,3,7,7,11,3,8,3,10 +G,3,7,4,5,3,6,6,5,4,6,6,9,2,9,4,8 +P,4,9,6,6,3,9,9,2,6,14,5,4,1,10,3,10 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +P,7,10,7,5,4,8,9,4,3,12,5,4,4,11,5,6 +K,6,11,8,8,5,6,7,2,7,10,7,10,3,8,3,8 +V,4,8,6,6,1,6,8,5,3,8,14,8,3,9,0,8 +T,3,4,3,3,1,5,13,3,5,11,9,3,1,11,1,5 +Q,2,2,3,4,3,8,8,6,2,5,7,9,3,9,5,9 +R,5,8,7,6,5,10,6,3,5,10,3,7,3,7,4,10 +P,6,7,8,10,9,7,9,4,2,7,8,7,6,11,6,5 +N,7,12,7,6,3,8,10,5,4,4,6,9,6,10,3,6 +B,4,9,5,6,5,7,8,7,4,7,5,6,4,7,6,6 +N,3,5,5,4,2,7,8,3,5,10,6,7,5,8,1,7 +R,5,11,6,8,7,6,8,9,5,6,5,8,2,8,8,9 +C,5,5,6,8,2,6,7,7,10,7,6,15,1,8,4,9 +M,4,7,4,5,3,7,7,12,1,7,9,8,8,6,0,8 +H,5,8,8,6,5,6,8,4,7,10,9,9,4,9,4,6 +Q,4,8,5,8,3,8,7,8,6,6,7,8,3,8,5,9 +Q,3,5,5,8,3,7,5,9,6,6,4,8,3,8,4,8 +S,4,7,5,5,4,7,7,5,8,5,6,9,0,9,9,8 +J,4,9,5,7,2,10,6,2,8,14,3,8,0,7,0,8 +R,5,10,5,8,6,6,9,9,4,6,5,7,3,8,5,11 +F,5,8,6,10,8,7,9,5,5,7,6,7,4,9,9,7 +P,1,0,1,0,0,5,11,6,1,9,6,5,0,9,3,8 +I,1,11,0,8,1,7,7,5,3,7,6,8,0,8,0,8 +I,3,11,6,8,7,11,6,1,6,8,4,5,3,8,5,9 +S,2,7,3,5,3,8,8,8,6,8,4,6,2,6,8,8 +Q,5,6,6,8,5,8,6,8,4,5,6,9,3,8,6,10 +V,7,11,6,6,3,9,8,6,4,7,10,7,7,12,3,8 +A,3,8,6,6,3,11,2,2,2,9,2,9,3,7,3,9 +Q,4,5,5,8,3,8,7,8,6,5,6,8,3,8,5,9 +J,0,0,1,1,0,12,4,5,3,12,4,11,0,7,0,8 +U,2,0,2,1,0,8,5,11,4,7,13,8,3,10,0,8 +G,4,7,6,5,5,7,8,5,3,6,6,11,4,8,7,8 +H,4,2,5,4,4,8,7,6,6,7,6,8,3,8,3,9 +K,5,11,7,8,8,5,7,5,4,7,5,8,4,6,10,8 +B,3,4,5,3,3,8,7,2,6,11,5,7,2,8,4,9 +O,6,10,9,8,10,8,7,5,1,7,6,8,9,9,7,11 +B,3,5,5,3,3,8,7,2,6,10,5,7,2,8,4,10 +H,3,6,4,4,3,7,6,12,1,7,7,8,3,8,0,8 +H,5,11,8,8,9,8,8,6,7,7,5,8,3,8,4,7 +J,0,0,1,1,0,12,4,5,3,12,4,11,0,7,0,8 +K,3,6,4,4,3,5,7,4,8,6,6,11,3,8,6,9 +E,3,8,5,6,6,5,7,3,7,8,7,12,4,9,8,8 +R,10,11,8,6,4,10,5,5,5,10,3,8,6,6,6,11 +F,4,9,5,7,4,4,11,4,6,11,10,6,2,10,3,5 +I,4,6,5,7,5,8,9,4,5,8,7,8,4,7,8,7 +B,4,10,6,7,7,8,6,4,4,6,5,7,4,9,5,8 +Q,4,5,5,7,5,9,11,6,2,3,7,12,3,10,5,10 +G,4,9,5,7,2,7,6,8,9,7,5,11,1,8,5,10 +A,5,10,7,8,5,8,4,3,0,7,1,8,2,7,4,8 +B,2,3,3,2,2,8,7,3,5,10,6,7,2,8,4,9 +Y,2,1,3,1,0,7,10,3,1,7,12,8,1,11,0,8 +A,3,5,5,3,2,11,2,2,2,9,2,9,2,6,2,8 +V,8,11,8,6,4,7,10,4,5,8,9,6,5,11,3,7 +Z,6,10,9,7,5,5,10,4,10,11,10,6,1,9,6,5 +W,11,12,10,6,4,4,10,2,3,9,11,8,9,12,1,6 +H,5,6,7,4,4,7,7,3,7,10,7,9,3,8,3,7 +H,4,5,5,4,4,7,7,6,6,7,6,8,3,8,3,7 +G,2,4,3,3,2,6,7,5,5,9,7,10,2,9,4,9 +Z,4,6,5,4,4,9,9,5,4,6,5,7,3,8,8,4 +N,5,11,6,9,3,7,7,15,2,4,6,8,6,8,0,8 +S,5,9,6,6,4,6,7,4,7,10,10,9,2,9,5,5 +B,7,15,7,8,6,10,6,4,5,10,4,7,7,6,8,9 +Q,5,7,6,6,5,9,3,4,4,8,3,10,3,6,6,7 +Z,5,11,7,8,5,7,7,3,13,9,6,8,0,8,8,8 +Q,2,3,2,3,2,8,8,5,1,8,7,9,2,9,4,8 +M,6,10,7,8,7,8,5,11,0,7,9,8,10,5,3,7 +G,7,11,7,8,5,7,6,7,7,10,7,13,3,8,5,7 +Y,4,6,6,8,8,9,6,6,3,7,8,8,6,10,6,4 +A,2,7,4,5,2,8,3,2,2,7,1,8,2,6,2,7 +J,2,6,2,4,1,13,2,7,4,13,4,12,0,7,0,8 +J,2,8,2,6,1,15,3,4,5,12,1,8,0,7,0,8 +E,8,12,5,6,3,8,6,5,7,11,6,9,2,10,8,9 +D,5,11,7,8,8,7,7,4,8,6,6,6,3,8,3,7 +Z,4,7,4,5,3,7,7,5,11,7,6,9,1,8,8,8 +N,2,2,3,4,2,7,8,5,4,7,7,7,5,9,2,6 +O,4,8,5,6,4,7,7,7,4,10,6,8,3,8,3,8 +E,2,1,2,1,1,4,8,5,8,7,6,13,0,8,7,9 +G,2,2,3,3,2,7,6,6,5,6,6,10,2,9,4,9 +O,8,9,5,5,3,7,9,6,5,9,5,6,4,9,5,8 +G,4,7,4,5,3,6,7,6,7,9,8,9,2,10,4,9 +T,7,9,6,5,2,8,8,4,8,13,5,7,2,8,5,6 +Y,5,8,5,6,4,4,9,1,6,9,10,7,3,11,4,4 +G,4,7,6,5,3,5,5,5,7,6,5,9,2,10,4,7 +T,6,8,6,6,4,6,12,4,6,11,9,4,3,12,3,4 +A,1,1,2,1,0,7,4,2,0,6,2,8,2,7,1,8 +O,5,11,6,8,9,8,10,5,2,7,7,8,8,9,5,10 +A,3,9,5,7,4,12,2,3,3,10,2,9,3,8,4,9 +M,2,0,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +O,4,7,4,5,3,7,7,7,5,10,6,8,3,8,3,8 +T,3,4,4,3,2,5,12,3,6,11,9,4,1,11,1,5 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +K,6,9,7,4,3,5,8,3,5,9,9,10,5,10,3,6 +D,4,8,6,6,5,8,8,5,6,10,5,4,3,8,4,8 +X,5,9,8,7,7,6,7,3,6,8,8,11,6,6,8,6 +B,6,9,8,7,6,9,6,4,7,9,5,7,3,8,6,10 +F,7,12,6,6,3,6,8,2,7,10,7,6,2,10,5,6 +A,5,11,7,9,5,8,3,3,1,7,2,8,5,8,5,10 +D,4,9,4,4,3,7,8,4,7,10,5,6,4,8,5,6 +C,6,10,6,7,3,4,8,6,8,12,10,12,1,9,3,7 +E,4,7,6,5,5,8,7,6,3,7,6,10,4,8,8,9 +E,3,9,4,7,2,3,8,6,11,7,5,15,0,8,7,7 +B,4,4,5,6,4,6,8,9,7,7,5,7,2,8,9,9 +Y,5,10,5,7,3,3,10,2,8,11,11,6,0,10,2,4 +D,2,5,4,3,3,9,6,4,6,10,4,6,2,8,3,8 +E,4,6,5,4,5,7,9,5,4,6,6,9,4,7,7,7 +N,10,14,12,8,5,12,5,3,4,13,1,6,6,7,0,8 +V,8,10,8,8,4,2,13,5,4,11,12,7,3,9,2,7 +Q,4,8,5,9,5,8,9,6,2,6,8,12,3,10,6,8 +Y,3,7,5,5,2,4,9,1,7,10,12,9,1,10,2,7 +W,12,15,11,8,5,6,10,2,3,7,10,7,10,12,1,6 +U,8,9,9,7,6,4,7,5,8,9,7,9,6,8,4,3 +M,3,1,3,1,1,8,6,11,0,7,9,8,7,6,0,8 +Z,3,7,4,5,2,7,7,4,13,9,6,8,0,8,8,8 +E,3,6,5,4,3,5,9,5,8,11,10,8,3,8,4,4 +W,3,1,4,2,1,7,8,4,0,7,8,8,7,9,0,8 +O,5,9,4,4,2,9,7,5,4,9,4,8,4,9,5,8 +T,5,10,7,7,6,6,7,7,7,7,6,8,4,11,7,8 +X,3,7,5,5,3,5,8,1,7,10,10,9,2,9,3,6 +F,5,9,7,6,4,10,7,2,6,13,4,6,6,9,5,9 +L,1,4,3,3,1,6,5,2,9,7,2,10,0,7,3,7 +M,5,2,7,4,5,8,6,6,5,6,7,7,10,6,3,6 +P,8,9,6,4,3,8,8,5,4,12,3,6,5,9,4,8 +W,6,10,7,5,4,7,8,3,4,6,9,6,9,9,2,6 +E,3,9,4,7,4,6,7,7,9,8,8,10,3,8,6,8 +U,6,8,7,6,3,3,9,5,8,11,11,9,3,9,2,6 +I,3,7,5,5,5,9,7,2,4,8,5,5,3,9,5,6 +H,5,7,8,5,4,8,7,3,6,10,4,7,3,8,3,8 +E,4,11,5,8,5,2,8,5,10,7,5,14,0,8,6,9 +D,4,9,5,7,3,5,7,10,9,6,5,6,3,8,4,8 +Q,1,2,2,3,2,8,7,6,2,6,6,9,2,9,3,10 +R,6,11,6,8,4,5,13,8,4,7,3,9,3,7,7,11 +M,2,1,2,1,1,8,6,10,0,6,9,8,6,6,0,8 +B,5,10,8,8,11,8,7,5,3,6,7,7,7,10,9,9 +M,2,4,3,3,3,8,6,6,4,6,7,6,6,6,2,6 +Y,7,8,7,6,3,2,12,4,6,13,11,5,1,11,1,5 +G,5,9,4,4,3,8,6,5,2,9,6,8,3,10,7,8 +Y,2,3,3,2,1,4,10,2,7,10,10,5,1,11,2,4 +U,4,4,5,3,2,4,8,5,7,11,10,9,3,9,1,7 +O,1,0,2,0,0,7,7,6,4,7,6,8,2,8,3,8 +K,4,7,6,5,4,6,7,1,6,10,7,10,3,8,3,8 +X,2,2,4,3,2,8,7,3,9,6,6,8,3,8,6,8 +X,2,1,3,3,2,7,8,3,8,6,6,7,2,8,6,7 +C,2,1,2,2,1,6,8,7,6,9,7,11,2,10,4,10 +U,6,10,7,7,4,3,8,5,7,10,9,9,3,9,2,6 +X,4,8,7,6,6,8,7,2,6,7,6,7,5,7,7,8 +N,5,5,6,7,3,7,7,15,2,4,6,8,6,8,0,8 +M,4,7,5,5,6,7,7,7,4,6,5,8,6,9,7,8 +D,3,6,5,4,4,7,7,6,6,6,5,5,3,8,3,7 +E,4,7,6,5,4,5,9,2,8,11,7,9,3,9,5,7 +R,4,8,5,6,4,8,8,5,7,6,4,7,3,6,5,8 +A,4,8,6,6,4,9,5,3,0,8,1,8,2,7,1,8 +U,5,10,6,8,4,5,8,7,7,8,10,10,3,9,1,8 +Z,4,4,5,7,2,7,7,4,15,9,6,8,0,8,8,8 +I,2,10,3,7,2,9,7,0,7,13,5,8,0,8,1,8 +H,2,1,3,1,2,6,7,5,6,7,6,8,5,8,3,8 +F,5,7,6,8,7,7,9,4,4,7,6,7,4,9,9,8 +K,5,10,5,8,4,4,7,7,3,7,6,12,3,8,3,11 +R,4,7,4,5,4,6,9,8,3,7,5,8,2,7,5,11 +P,2,3,4,2,2,7,10,3,4,12,4,3,1,10,2,8 +H,8,11,12,8,10,9,6,3,7,10,5,8,6,8,5,8 +Q,6,6,8,6,6,8,3,4,5,7,3,9,5,5,6,8 +G,7,10,6,6,3,7,6,6,5,10,5,7,4,7,5,7 +D,6,7,8,6,8,7,6,5,6,7,5,9,5,6,8,3 +B,6,10,8,8,9,8,6,5,6,9,5,7,4,9,7,10 +F,4,9,4,6,2,1,14,5,3,12,9,4,0,8,3,6 +U,3,7,4,5,3,7,5,12,4,7,11,8,3,9,0,8 +K,3,4,6,3,3,7,7,1,6,10,5,9,4,7,4,8 +R,3,7,4,4,2,5,11,8,3,7,3,9,3,7,5,11 +X,5,9,7,8,8,8,7,2,4,8,6,8,4,10,8,6 +W,3,6,5,4,3,7,10,2,2,7,9,8,6,11,0,8 +N,4,7,6,5,4,7,9,6,5,7,6,6,5,9,1,6 +W,1,0,2,0,1,8,8,4,0,7,8,8,5,10,0,8 +K,5,8,7,6,5,4,7,2,6,10,10,11,3,8,3,6 +E,2,3,4,2,2,7,7,2,7,11,6,9,2,8,4,8 +E,2,3,3,2,2,7,7,5,7,7,6,8,2,8,5,10 +A,3,8,6,6,3,12,2,2,2,10,2,9,2,6,2,8 +R,2,1,3,2,2,7,8,5,5,7,5,6,2,7,4,8 +S,2,3,4,2,1,9,6,3,7,10,4,8,1,8,5,10 +P,6,10,5,5,2,6,10,6,5,14,5,5,3,9,4,8 +F,1,1,2,1,0,3,12,4,3,11,9,6,0,8,2,7 +G,5,7,5,5,4,6,8,5,5,9,8,8,2,8,4,9 +O,4,7,5,5,4,7,7,7,4,8,5,10,4,8,3,7 +X,5,8,7,7,7,9,8,3,5,8,5,6,3,6,8,8 +B,5,11,7,8,8,7,6,8,6,6,6,6,3,8,8,11 +Z,1,0,1,1,0,7,7,2,10,8,6,8,0,8,6,8 +M,3,3,3,4,2,8,6,11,1,6,9,8,7,6,0,8 +N,1,3,3,2,1,6,8,3,3,10,7,8,4,8,0,7 +B,3,2,4,4,3,7,7,5,5,6,6,5,2,8,6,10 +V,4,7,6,6,7,6,7,5,4,7,6,8,6,9,7,10 +J,4,11,5,8,3,11,5,4,7,12,2,9,1,6,2,6 +D,5,10,7,8,7,9,7,6,6,8,5,5,5,9,4,10 +V,5,8,5,6,2,4,12,4,4,10,12,7,3,10,1,8 +G,6,11,6,8,5,5,6,5,5,9,8,11,2,9,4,9 +G,7,14,6,8,5,7,7,5,4,9,5,6,4,9,9,8 +Q,3,6,4,7,4,9,8,7,2,5,7,10,3,9,5,9 +C,4,5,5,5,4,6,8,3,5,6,6,11,4,9,7,9 +F,9,14,8,8,6,7,11,3,4,12,6,4,6,8,9,5 +D,6,11,9,8,8,8,8,5,6,10,6,5,6,9,6,11 +H,6,9,8,7,7,6,7,5,5,7,6,8,6,7,7,11 +M,5,8,8,6,5,3,7,4,5,11,12,11,6,9,3,7 +L,3,2,4,3,2,5,4,5,7,2,2,5,1,7,1,6 +S,5,9,7,8,8,9,8,4,5,7,6,8,5,10,9,11 +P,5,11,5,8,3,5,10,10,4,9,6,5,2,10,4,8 +Y,7,10,6,5,4,7,6,4,4,9,8,5,3,10,4,4 +S,5,7,6,5,4,9,7,4,7,10,3,7,2,7,5,10 +Q,3,5,4,6,4,9,10,6,2,4,7,11,2,9,5,10 +T,2,4,3,5,1,5,14,1,6,9,11,7,0,8,0,8 +Y,4,11,7,8,4,7,10,1,7,6,12,9,1,11,2,8 +M,3,7,4,5,3,8,7,11,1,6,9,8,8,6,0,8 +O,4,8,5,6,2,7,7,8,7,7,6,8,3,8,4,8 +X,4,9,6,7,3,6,8,1,8,10,9,8,3,8,4,7 +N,6,11,8,8,8,5,9,3,4,9,8,9,9,8,7,3 +B,4,8,6,6,6,8,7,4,5,9,5,6,3,8,6,9 +E,2,3,4,2,2,8,6,1,7,11,5,9,2,8,4,10 +H,3,7,4,5,2,7,9,14,2,7,3,8,3,8,0,8 +X,5,9,8,7,4,5,8,2,8,11,11,9,3,9,4,6 +K,4,8,4,6,2,3,7,8,2,7,6,11,4,8,2,11 +O,4,9,5,7,5,8,6,7,3,10,5,9,3,8,3,7 +Y,4,6,6,9,7,9,10,6,3,7,7,7,6,11,6,5 +C,6,10,7,8,4,6,8,7,8,13,8,10,2,11,3,7 +W,6,9,8,6,7,7,7,6,3,5,8,9,11,8,6,4 +U,5,5,6,8,2,8,4,14,6,6,14,8,3,9,0,8 +F,6,10,8,7,8,8,8,6,4,8,6,7,5,11,9,11 +C,1,0,1,1,0,7,7,5,7,7,6,13,0,8,4,10 +O,5,9,6,7,5,8,7,8,7,7,6,8,3,8,4,8 +X,3,7,4,5,2,7,7,4,4,7,6,8,2,8,4,8 +E,4,6,6,4,5,7,9,5,3,6,6,8,4,8,6,7 +U,5,8,8,6,4,7,8,6,9,5,9,8,3,9,1,8 +Q,4,7,5,7,3,8,7,8,6,6,7,9,3,8,5,9 +R,5,11,7,8,6,7,7,4,8,7,6,6,3,8,5,8 +P,6,12,6,7,4,6,10,3,5,13,6,3,3,10,5,6 +S,3,9,4,7,4,8,8,5,7,5,5,6,0,8,8,8 +Z,2,4,5,3,2,7,8,2,9,11,7,6,1,8,5,7 +K,7,12,7,7,4,5,8,3,5,10,9,11,5,9,3,7 +R,6,9,8,7,8,9,5,7,4,7,5,7,6,7,8,9 +P,5,10,8,8,5,8,9,5,5,12,4,3,2,10,4,8 +D,3,5,4,7,2,5,6,11,7,5,5,5,3,8,4,8 +D,7,9,9,8,9,6,7,5,7,6,3,7,5,10,9,5 +Q,2,2,2,2,1,7,8,5,2,7,8,10,2,9,4,8 +L,4,11,6,9,5,8,4,0,8,9,3,10,2,5,3,9 +N,6,10,8,7,5,8,9,2,5,9,4,6,5,9,1,7 +V,3,6,5,4,2,7,12,3,4,8,12,8,3,10,1,8 +A,1,1,2,1,0,7,4,2,0,7,2,8,2,7,1,8 +S,6,10,5,5,2,8,4,5,4,9,3,8,4,6,5,9 +R,6,10,6,8,4,6,10,10,5,7,5,8,3,8,6,10 +D,5,10,7,8,7,7,8,7,5,8,7,7,7,8,3,7 +T,4,10,6,8,5,6,7,8,7,8,8,7,3,10,6,10 +V,4,6,5,5,6,8,7,5,4,7,6,9,6,8,8,4 +E,6,11,8,8,5,4,10,4,9,11,10,9,2,8,5,4 +C,4,10,6,8,4,4,9,5,6,5,7,14,4,8,5,7 +W,6,10,9,8,8,5,12,2,2,8,8,9,9,14,2,8 +V,1,3,2,1,1,6,12,2,3,8,11,8,2,11,0,8 +H,2,7,3,4,2,7,6,14,2,7,8,8,3,8,0,8 +J,2,8,3,6,1,13,3,9,4,13,4,12,1,6,0,8 +B,4,7,4,5,3,6,7,9,7,7,6,7,2,8,8,9 +N,5,8,8,6,3,3,9,4,4,11,11,10,5,8,1,7 +I,0,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +L,5,11,5,6,3,7,4,3,5,11,7,12,3,7,6,8 +Z,5,8,7,10,7,11,5,5,4,9,3,8,3,6,6,9 +K,10,12,10,7,4,9,8,4,8,9,1,5,5,6,3,9 +Z,3,6,4,4,3,7,8,5,10,7,7,9,1,9,7,8 +N,6,7,8,5,4,11,7,3,6,10,1,4,5,9,1,7 +I,2,6,3,4,1,7,7,0,7,13,6,8,0,8,1,8 +M,2,0,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +Z,3,7,4,5,2,7,7,4,14,9,6,8,0,8,8,8 +X,10,12,9,6,4,10,6,3,8,10,4,7,4,12,4,9 +O,4,9,3,5,3,6,8,6,4,9,7,9,5,9,4,8 +T,2,4,4,6,1,7,14,0,6,7,11,8,0,8,0,8 +Z,4,7,6,5,3,7,7,2,10,12,6,8,1,9,6,8 +P,5,10,7,8,6,6,6,6,4,7,6,9,5,8,7,10 +M,7,11,8,8,4,7,7,13,2,7,10,8,9,6,0,8 +I,1,10,0,8,1,7,7,5,3,7,6,8,0,8,0,8 +Y,2,3,2,2,1,4,11,3,5,11,10,5,1,11,2,6 +G,6,6,7,8,3,8,5,8,9,6,5,10,2,8,6,11 +N,5,10,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +N,3,5,6,4,3,9,8,3,5,10,3,5,5,9,1,8 +D,5,11,6,8,4,5,7,10,10,6,5,6,3,8,4,8 +D,4,7,4,5,2,5,7,10,8,7,6,5,3,8,4,8 +T,2,9,4,6,1,7,14,0,6,7,11,8,0,8,0,8 +L,2,5,4,3,2,7,3,2,8,8,2,9,1,7,3,8 +G,3,6,4,4,3,6,7,5,5,10,8,10,2,9,4,9 +O,5,8,7,6,8,8,6,5,2,7,5,8,9,9,5,11 +R,5,10,5,7,3,5,10,9,4,7,4,8,3,7,6,11 +S,6,13,5,7,3,10,4,5,5,10,3,10,4,5,4,10 +X,3,1,4,2,2,7,7,3,9,6,6,8,3,8,6,8 +L,1,3,2,1,1,7,3,1,6,9,3,10,0,7,2,9 +W,6,6,6,4,4,2,11,2,2,10,10,8,6,11,1,7 +J,0,0,1,1,0,12,4,5,3,12,4,10,0,7,0,8 +F,3,7,5,5,2,5,12,4,6,12,9,4,1,10,3,4 +F,2,5,3,4,2,5,10,4,5,10,9,5,2,10,3,6 +C,2,4,3,3,1,6,8,7,8,8,7,14,1,9,4,10 +C,2,7,3,5,2,5,8,7,7,8,8,13,2,9,4,10 +U,5,9,5,7,2,7,4,14,5,7,14,8,3,9,0,8 +V,8,11,7,8,4,3,11,3,4,10,12,8,3,10,1,7 +L,2,5,4,4,2,6,4,1,8,8,2,10,0,7,2,8 +X,2,3,3,2,2,7,8,3,8,6,6,7,2,8,5,7 +V,4,6,6,5,6,7,7,4,4,7,6,8,6,10,7,7 +G,7,8,9,7,10,7,6,5,4,7,7,9,8,10,9,7 +D,6,10,6,5,4,9,6,3,7,10,4,7,5,7,8,7 +L,4,9,4,7,2,0,2,4,6,1,0,8,0,8,0,8 +P,1,0,1,1,0,5,10,6,1,9,6,4,1,9,2,8 +X,3,4,5,3,2,9,6,1,8,10,4,7,2,8,3,8 +C,8,12,6,6,2,5,11,5,8,11,8,9,1,7,5,8 +M,6,10,7,8,4,7,7,13,2,7,9,8,9,6,0,8 +Y,3,6,4,4,1,5,11,2,2,8,12,8,1,11,0,8 +R,6,11,9,8,9,6,8,5,6,6,5,8,3,7,5,9 +A,3,8,5,5,2,9,6,3,1,8,0,8,2,7,1,8 +Q,4,3,5,5,4,8,8,6,2,5,7,10,3,9,6,9 +M,3,3,4,1,2,8,6,6,4,6,7,8,6,5,2,7 +U,5,5,6,3,3,4,8,5,8,10,9,9,3,9,2,6 +T,6,9,6,6,5,6,11,4,6,11,9,5,3,12,2,4 +J,2,8,3,6,1,13,2,8,4,13,4,12,1,6,0,8 +M,4,7,6,5,5,9,7,2,4,9,6,7,7,5,2,7 +O,4,11,5,8,3,8,8,9,7,7,8,8,3,8,4,8 +U,5,9,6,7,6,8,6,8,5,7,6,9,3,8,4,6 +E,7,10,9,8,8,7,4,6,4,7,6,9,5,9,9,8 +N,4,5,6,5,5,7,8,5,4,7,5,7,6,9,5,3 +L,3,7,4,5,2,6,4,1,9,8,2,11,0,7,2,8 +Y,4,9,6,7,3,8,10,1,8,5,12,8,1,11,2,8 +Z,5,9,7,7,5,9,6,2,9,11,4,9,3,7,7,9 +W,9,11,9,6,5,5,8,2,4,7,9,7,10,10,2,5 +K,2,3,4,1,1,4,9,2,6,10,9,10,3,8,2,7 +Q,1,0,1,0,0,8,7,6,3,6,6,8,2,8,3,8 +C,2,3,3,4,1,5,8,6,8,7,7,12,1,7,4,9 +R,2,3,2,2,2,6,8,4,4,7,5,7,2,7,3,8 +T,3,4,3,3,1,5,11,3,7,11,9,5,1,11,2,5 +Y,3,5,4,4,2,4,11,2,7,11,10,6,1,11,2,5 +Z,3,5,5,4,2,8,7,2,10,12,5,9,1,8,6,9 +Z,3,4,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +M,4,3,4,4,2,7,7,12,1,7,9,8,8,6,0,8 +I,1,3,2,2,1,7,8,1,7,13,6,8,0,8,1,7 +O,4,10,5,8,5,8,8,8,5,6,8,9,3,8,3,7 +E,2,1,3,2,2,7,7,5,7,7,6,8,2,8,5,10 +Y,5,9,5,4,3,6,6,5,4,9,10,6,3,9,2,5 +E,2,3,4,2,2,7,7,1,8,11,6,9,1,8,4,8 +Q,7,10,6,5,3,10,4,4,7,12,3,11,3,7,7,11 +R,2,2,3,4,3,7,7,5,6,7,6,7,3,7,5,8 +T,7,10,7,8,5,5,11,3,6,11,10,5,2,12,2,4 +E,4,9,6,7,6,7,7,5,8,7,7,9,3,8,5,9 +V,2,0,3,1,0,7,9,4,2,7,13,8,2,10,0,8 +U,3,4,4,3,2,4,8,5,6,11,10,9,3,9,1,7 +T,4,7,5,5,4,7,7,7,6,6,7,9,3,10,6,7 +G,3,6,5,5,5,7,8,5,2,7,7,8,6,11,7,7 +D,3,7,4,5,2,5,7,10,8,7,6,5,3,8,4,8 +W,4,4,5,3,2,4,10,3,2,9,9,7,6,11,1,7 +N,5,5,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +M,4,4,7,3,4,7,5,3,4,10,8,9,7,5,2,8 +R,5,7,7,5,4,8,9,4,6,8,4,8,3,6,5,11 +Y,4,10,7,8,3,4,10,2,8,10,12,9,1,10,2,7 +T,5,7,5,5,3,7,11,3,8,11,9,4,2,12,3,5 +M,8,12,10,7,5,9,4,3,2,10,2,9,10,1,1,8 +R,4,9,4,6,4,6,10,8,3,7,4,8,2,7,5,11 +Y,3,7,4,5,4,9,8,6,4,5,9,7,2,8,7,5 +J,3,6,5,4,1,7,8,2,8,15,6,8,0,7,0,7 +T,2,3,3,2,1,5,12,3,6,11,9,5,1,10,1,5 +P,2,2,3,4,2,5,10,4,4,10,8,4,1,10,3,7 +D,5,5,6,5,5,7,7,4,6,7,4,8,4,7,5,6 +K,4,10,6,8,6,5,7,4,7,6,6,11,3,8,6,9 +V,5,10,7,8,4,9,9,4,2,5,13,8,4,9,1,7 +V,5,10,5,8,3,3,11,5,4,12,12,8,2,10,1,8 +V,5,9,5,6,3,2,11,4,4,11,12,8,2,10,1,7 +P,5,11,6,8,3,4,12,9,2,10,6,4,1,10,4,8 +X,4,7,6,5,3,6,8,1,8,10,8,9,3,8,3,7 +B,7,12,6,6,6,8,8,4,5,9,6,7,6,7,8,7 +C,3,5,5,3,2,4,8,5,7,11,10,12,1,9,2,7 +P,5,8,7,6,5,8,9,5,4,11,4,4,2,10,3,8 +M,7,9,10,7,7,3,7,4,5,10,11,11,10,6,4,7 +S,5,9,7,6,8,7,8,5,3,8,5,8,4,8,10,7 +H,5,11,6,8,3,7,7,15,1,7,7,8,3,8,0,8 +J,2,7,3,5,1,12,2,9,4,13,5,13,1,6,0,8 +N,4,7,5,5,4,8,8,13,1,6,6,7,6,8,1,10 +S,4,8,6,6,4,9,7,3,6,10,5,8,2,9,5,9 +B,4,9,4,7,6,6,8,8,5,7,5,7,2,8,7,10 +R,5,7,6,5,6,8,9,7,3,8,4,6,5,7,7,9 +T,3,5,4,7,1,7,14,0,6,7,11,8,0,8,0,8 +J,2,7,3,5,3,9,7,1,5,10,4,7,0,7,1,6 +I,2,11,2,8,2,8,7,0,8,7,6,7,0,8,3,7 +A,2,4,4,3,2,8,2,2,2,7,2,8,2,6,2,7 +E,4,8,5,6,4,6,8,2,8,11,7,9,2,8,5,7 +S,9,15,8,9,4,11,2,4,5,11,2,10,3,6,5,12 +Y,3,7,4,5,4,9,5,6,5,7,8,8,3,9,7,4 +T,3,9,4,6,2,9,13,0,6,6,10,8,0,8,0,8 +S,1,0,2,0,0,8,8,4,6,5,6,7,0,8,7,8 +V,2,3,4,4,1,8,8,4,2,6,13,8,3,10,0,8 +E,3,5,6,3,3,7,6,2,8,11,6,10,2,8,4,9 +H,3,5,5,6,4,11,5,3,2,8,4,9,4,8,5,11 +O,2,1,3,2,1,7,7,7,6,7,6,8,2,8,3,8 +V,5,6,7,6,7,7,8,6,5,7,6,7,6,9,7,10 +T,3,4,4,3,2,6,10,2,8,11,9,5,1,10,3,4 +Z,6,6,5,9,4,7,8,4,2,11,7,7,3,9,10,6 +C,3,4,4,3,1,5,9,5,7,12,9,11,1,10,3,7 +O,5,10,6,8,5,7,8,8,5,10,8,8,3,8,3,8 +V,2,6,4,4,1,8,8,4,2,6,13,8,3,10,0,8 +P,6,11,8,8,5,7,11,6,4,12,5,2,1,11,4,9 +U,6,11,6,6,3,6,5,4,5,6,8,8,5,7,2,8 +Y,2,3,2,2,1,4,11,2,6,11,10,5,1,10,1,5 +R,4,10,5,7,3,5,10,9,4,7,4,8,3,7,6,11 +V,5,7,7,6,7,8,6,5,5,7,6,8,7,10,6,7 +S,2,7,3,5,2,8,7,7,7,7,7,8,2,9,9,8 +N,7,9,8,4,3,9,6,4,4,13,2,7,6,8,0,7 +B,2,5,4,4,3,8,8,3,5,10,6,6,3,7,5,9 +F,2,3,4,2,2,7,9,2,6,13,6,5,2,9,2,7 +T,3,2,4,3,2,7,12,2,7,7,11,8,1,11,1,7 +B,2,4,3,3,2,8,7,3,5,9,6,6,2,8,5,9 +K,5,8,8,7,7,7,7,2,4,7,3,8,6,4,8,11 +F,6,11,5,6,3,7,9,2,6,11,6,5,2,10,5,6 +T,3,9,5,6,3,7,12,2,8,7,12,8,1,11,1,8 +P,3,5,6,4,3,7,10,4,4,12,4,3,1,10,3,8 +T,5,11,7,8,6,7,11,2,7,7,11,8,2,12,1,8 +O,2,1,2,2,1,8,7,7,4,7,6,8,2,8,3,8 +F,3,5,3,4,2,5,10,4,5,10,9,5,1,10,3,7 +R,3,7,3,5,3,6,10,8,4,7,3,9,2,6,4,10 +J,2,9,4,6,4,10,7,3,3,9,3,6,2,7,7,7 +W,9,13,9,7,5,5,9,2,2,7,10,8,10,12,1,6 +X,4,8,7,6,3,7,7,1,8,10,7,9,3,8,3,7 +T,3,7,4,5,2,6,14,1,5,8,10,7,0,8,0,8 +F,3,11,4,8,3,1,13,4,4,12,10,7,0,8,2,6 +N,8,15,7,8,4,7,9,4,7,4,4,9,5,8,2,8 +C,3,6,4,4,2,4,9,6,7,12,9,10,2,10,3,7 +Z,3,8,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +B,4,8,5,6,4,6,6,8,7,6,6,7,2,8,9,10 +P,6,9,9,7,6,6,13,7,2,12,5,2,1,11,4,8 +R,4,8,6,6,4,8,7,6,6,9,5,7,3,8,5,11 +F,2,4,4,3,2,7,9,2,6,13,6,6,1,9,2,8 +K,6,11,6,8,3,4,9,9,2,7,3,11,4,8,2,11 +O,4,8,5,6,3,7,6,8,5,7,5,8,3,8,3,8 +V,6,10,6,7,4,4,12,1,2,8,10,7,6,12,2,7 +E,4,7,6,5,4,7,8,2,7,11,6,9,3,8,4,9 +D,5,11,6,8,5,9,7,5,7,10,4,5,3,8,3,8 +L,9,15,8,8,4,9,2,4,5,12,4,13,2,7,6,8 +R,4,8,6,6,5,6,8,5,6,6,5,7,3,7,5,8 +W,5,7,5,5,5,5,9,3,3,9,7,7,6,11,3,6 +B,2,3,4,2,2,9,7,2,5,10,5,6,2,8,4,9 +C,6,12,4,6,2,5,10,5,8,11,8,9,2,8,5,8 +L,4,10,4,8,1,0,0,6,6,0,0,5,0,8,0,8 +P,3,5,4,4,3,5,10,4,4,10,8,4,1,10,3,7 +V,5,10,7,9,8,7,7,6,4,7,6,8,7,10,8,11 +Y,4,4,6,6,1,7,10,3,2,7,13,8,2,11,0,8 +S,1,1,2,1,0,8,7,4,7,5,6,7,0,8,7,8 +L,6,14,6,8,4,8,4,3,4,12,8,11,4,9,6,10 +B,6,10,9,7,7,8,7,5,6,9,5,6,3,7,7,10 +R,6,11,6,6,5,7,8,3,6,8,3,8,6,6,6,7 +Z,2,2,3,3,2,7,7,5,9,6,6,8,1,8,7,8 +C,4,9,5,7,4,6,8,6,8,7,6,13,1,8,4,9 +Z,8,14,8,8,5,7,7,2,9,11,7,9,4,7,7,5 +M,7,11,10,8,13,11,5,3,3,9,4,8,11,8,4,8 +H,5,7,7,5,4,5,8,4,6,10,9,9,3,8,3,7 +T,5,10,7,8,6,6,7,7,7,8,9,8,4,9,7,7 +T,8,14,7,8,4,5,11,2,7,12,8,6,3,8,5,3 +G,2,4,3,3,2,6,7,5,5,9,7,10,2,9,4,9 +O,1,0,2,1,0,8,7,7,4,7,6,8,2,8,3,8 +H,3,4,6,3,3,7,7,3,6,10,6,8,3,8,3,7 +P,3,5,4,8,7,8,7,5,1,7,6,7,6,9,5,9 +K,7,9,9,7,7,6,7,1,7,9,6,10,4,8,4,8 +Q,6,8,6,9,6,8,7,7,4,8,7,10,3,8,6,8 +X,4,6,5,5,5,7,9,2,6,8,6,8,3,6,6,7 +Z,4,6,6,9,4,12,3,3,6,10,2,8,1,7,5,11 +L,4,8,5,6,2,3,1,7,9,0,1,3,0,7,1,5 +X,9,13,10,7,5,7,7,2,9,11,5,8,4,7,4,7 +Q,6,11,6,6,4,11,3,4,5,12,3,9,3,9,7,12 +W,4,5,6,3,4,6,11,2,2,7,9,8,8,11,1,8 +J,3,6,4,4,2,6,8,2,5,14,7,9,1,6,0,7 +A,2,3,3,1,1,8,2,2,1,7,2,8,2,7,2,7 +P,1,0,2,0,0,5,11,7,1,9,6,4,1,9,3,8 +M,2,3,4,1,2,5,6,3,4,10,10,10,4,7,1,7 +T,4,11,6,8,2,8,15,1,6,7,11,8,0,8,0,8 +F,3,2,4,3,2,6,10,4,5,10,9,4,2,10,3,6 +Y,9,15,8,8,5,5,7,4,3,9,9,6,4,9,4,4 +J,2,6,2,4,1,13,2,8,4,13,4,12,0,7,0,8 +P,4,8,6,6,4,9,7,2,5,13,4,5,1,10,3,10 +D,5,5,5,7,3,6,7,10,10,7,7,6,3,8,4,8 +M,5,7,7,6,8,5,7,5,4,6,5,8,11,7,5,9 +F,3,4,5,3,2,6,10,3,6,13,7,5,1,10,2,7 +W,3,1,5,3,3,7,11,3,2,6,9,8,7,11,0,8 +U,3,3,4,2,2,6,8,5,7,6,9,9,3,10,1,7 +J,4,8,6,6,2,9,6,2,8,15,4,8,0,7,0,8 +P,5,5,7,7,8,8,7,4,2,7,8,7,7,12,5,7 +Z,5,10,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +C,5,9,6,7,7,5,6,3,4,7,6,11,6,9,3,8 +E,3,2,4,3,3,7,7,5,8,7,5,8,2,8,6,9 +K,4,7,5,5,4,6,6,1,6,10,7,10,3,8,3,8 +U,5,11,7,8,5,4,9,6,7,9,11,10,3,9,1,8 +B,7,11,7,6,5,9,7,3,5,10,5,7,6,7,7,8 +X,3,4,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +Z,4,11,4,9,4,6,8,6,10,7,7,9,2,9,8,8 +O,2,3,3,2,1,7,7,7,4,7,6,8,2,8,2,8 +X,5,5,6,7,2,7,7,5,4,7,6,8,3,8,4,8 +R,5,10,6,8,7,8,5,7,3,8,6,8,6,5,6,10 +Y,2,3,4,4,1,8,10,2,2,6,13,8,2,11,0,8 +I,3,10,4,8,3,7,9,0,7,13,6,7,0,9,2,7 +V,5,11,7,8,9,8,5,5,2,8,7,8,6,8,5,8 +J,5,11,7,8,8,9,7,4,4,8,4,6,4,7,6,4 +C,5,10,5,7,3,3,8,5,7,11,10,13,1,9,3,8 +N,3,5,4,7,3,7,7,14,2,5,6,8,6,8,0,8 +P,3,8,4,5,2,5,10,10,4,8,6,5,2,10,4,8 +O,2,5,3,3,2,7,7,8,4,7,6,8,2,8,3,8 +O,3,7,4,5,3,7,8,7,4,8,7,10,3,8,3,9 +A,2,6,4,4,2,11,3,3,2,10,1,9,2,6,2,8 +R,3,6,4,4,4,7,8,4,6,6,5,7,3,7,5,8 +W,4,2,6,4,4,8,11,2,2,6,9,8,9,13,1,7 +D,4,6,5,4,3,8,8,7,8,9,5,3,3,8,4,6 +T,3,8,4,6,2,8,14,0,5,6,10,8,0,8,0,8 +N,1,0,2,1,1,7,7,11,1,5,6,8,4,8,0,8 +H,4,8,6,10,7,9,10,3,1,8,7,6,3,10,8,7 +D,3,7,5,5,4,8,7,3,5,10,5,6,3,8,3,8 +R,5,9,7,7,6,10,6,3,5,10,3,7,4,6,4,10 +B,7,10,6,6,4,8,5,4,5,10,6,9,5,7,7,10 +A,5,8,8,7,7,7,7,2,5,7,9,10,5,11,3,7 +A,2,1,3,1,1,7,4,2,0,7,1,8,3,6,1,8 +T,4,10,5,8,4,5,12,4,7,9,12,7,2,12,1,7 +O,9,13,6,7,4,5,8,6,4,10,8,9,5,10,5,8 +J,5,8,6,6,3,8,8,1,6,14,5,7,1,6,1,8 +Y,4,4,6,6,6,9,10,5,4,6,7,7,5,10,7,5 +L,6,15,6,8,4,7,5,3,5,11,7,11,3,8,6,9 +Q,4,6,5,7,5,8,5,7,3,6,5,9,3,8,5,9 +B,5,7,7,5,6,7,9,4,6,10,6,6,3,7,6,8 +R,5,8,7,7,7,7,8,3,3,7,5,7,6,8,6,6 +E,4,8,4,6,2,3,6,6,11,7,7,15,0,8,7,7 +M,7,10,10,8,6,10,5,2,5,9,4,7,8,6,2,9 +Q,4,9,5,10,5,7,7,6,3,8,9,10,3,8,7,9 +U,4,5,4,8,2,7,4,15,6,7,12,8,3,9,0,8 +E,6,9,8,8,8,7,9,5,6,6,8,11,8,9,9,8 +N,4,6,6,4,5,4,10,2,4,8,7,9,6,7,4,5 +G,5,8,6,6,3,7,7,7,8,10,6,11,2,10,4,9 +D,2,4,4,3,2,9,7,4,6,10,4,6,2,8,3,8 +U,8,9,9,7,4,3,8,6,8,10,11,10,3,9,2,5 +A,5,11,9,8,7,10,5,1,5,9,1,5,3,7,4,8 +P,4,10,5,8,5,4,10,4,5,11,9,5,1,10,3,7 +L,5,11,6,8,5,3,4,3,8,2,0,8,0,7,1,5 +P,4,11,5,8,3,4,12,9,2,10,6,4,1,10,4,8 +L,2,2,3,4,2,4,4,5,7,2,2,5,1,6,1,6 +B,3,6,5,4,4,7,8,4,5,9,6,5,2,8,6,6 +E,3,4,4,6,2,3,8,6,10,7,6,14,0,8,7,7 +C,3,8,4,6,3,6,8,6,5,9,8,14,1,9,3,11 +H,4,5,6,3,3,8,8,3,6,10,6,8,3,8,3,8 +L,3,7,3,5,1,0,1,6,6,0,1,6,0,8,0,8 +T,5,7,7,6,6,5,8,3,8,7,7,9,3,7,7,5 +O,2,2,3,3,2,7,7,7,4,7,6,8,2,8,3,8 +D,7,11,6,6,5,8,8,4,7,10,5,6,6,6,7,6 +K,4,6,6,4,4,3,8,2,6,10,10,11,3,8,3,6 +B,3,2,4,3,3,7,7,5,6,6,6,6,2,8,7,10 +F,2,1,2,2,1,5,11,3,5,11,9,5,1,10,3,6 +Y,7,8,6,11,5,7,6,5,5,6,11,6,4,11,3,7 +R,8,10,6,6,4,6,8,5,5,9,6,9,7,5,7,11 +Y,7,9,7,7,4,3,10,2,7,11,11,6,1,11,2,5 +K,5,9,7,7,7,6,6,3,7,6,6,9,7,8,5,9 +M,3,3,5,2,3,8,6,6,4,7,7,8,7,5,2,7 +Y,3,8,5,5,1,7,10,3,2,7,13,8,2,11,0,8 +G,3,5,4,7,2,7,7,8,7,5,6,10,2,7,5,11 +K,5,4,5,6,2,4,8,9,1,7,6,11,3,8,3,11 +J,1,3,2,2,1,8,5,4,4,13,7,12,1,7,0,8 +X,4,11,6,8,4,7,7,4,9,6,6,8,3,8,7,7 +W,6,10,6,8,6,1,10,2,3,10,10,9,6,10,1,7 +A,4,9,6,6,2,8,4,3,1,7,1,8,3,7,2,8 +V,9,15,8,8,4,5,10,4,4,9,9,6,4,11,2,8 +H,3,1,4,2,3,7,7,6,6,7,6,8,3,8,4,8 +I,7,14,6,8,4,8,9,3,7,14,4,5,2,8,5,9 +B,3,5,5,4,4,8,8,3,6,10,5,5,3,7,6,9 +D,4,8,6,6,4,8,8,6,7,9,5,4,3,7,4,9 +M,6,11,9,9,10,9,7,5,5,6,7,6,10,9,3,6 +G,3,5,4,4,2,6,7,6,7,7,5,10,2,9,4,9 +H,2,1,3,2,2,8,7,6,5,7,6,8,3,8,3,8 +D,2,3,3,2,2,9,6,4,6,10,5,6,2,8,2,8 +G,3,4,5,7,2,8,7,9,7,5,6,10,2,7,5,10 +M,3,8,4,6,3,7,7,11,1,7,9,8,8,5,0,8 +G,6,11,8,9,9,9,7,5,2,6,6,10,8,8,5,10 +A,2,8,4,6,3,11,3,3,3,10,2,9,2,6,3,8 +O,5,9,6,6,3,7,7,8,8,7,6,8,3,8,4,8 +Y,3,5,4,6,5,8,10,6,4,7,7,6,4,10,6,3 +D,2,5,3,3,3,7,7,6,6,7,6,5,2,8,2,7 +J,6,11,5,8,4,5,13,3,3,13,6,4,2,8,6,6 +C,2,5,3,4,2,6,8,7,7,9,8,13,1,9,4,10 +M,4,10,5,8,6,7,5,11,1,7,9,8,9,5,2,8 +T,3,4,5,6,1,7,15,1,6,7,11,8,0,8,0,8 +L,5,11,7,8,4,7,3,2,8,7,2,8,1,6,3,7 +J,1,6,2,4,1,10,6,1,7,11,3,7,0,7,1,7 +D,4,9,5,6,8,8,10,5,4,8,6,5,6,10,9,6 +Z,5,7,7,5,6,9,5,5,4,7,5,7,3,7,10,5 +R,4,6,5,4,5,8,7,6,3,8,5,7,4,7,7,10 +V,5,10,5,7,4,4,11,1,2,8,10,7,3,10,1,8 +H,5,8,7,6,7,8,7,6,7,7,6,7,3,8,4,7 +K,9,14,9,8,6,3,8,4,6,10,11,12,5,8,4,6 +O,6,11,9,8,11,8,6,6,1,7,6,8,11,8,6,8 +M,7,9,9,7,7,6,6,3,5,10,9,9,10,7,3,8 +R,4,4,5,6,3,5,13,8,4,8,3,9,3,7,7,11 +X,5,10,6,8,4,7,7,4,4,7,6,7,3,8,4,8 +O,9,15,6,9,5,4,8,6,4,10,8,9,5,10,5,8 +L,5,7,6,5,4,6,6,7,7,5,6,10,2,8,4,10 +Z,4,7,6,5,4,9,6,2,8,11,4,10,2,7,6,10 +F,4,7,6,5,4,5,11,3,5,13,7,5,1,10,2,7 +Q,5,5,7,4,5,8,5,5,4,7,4,10,5,6,6,8 +C,8,12,6,6,5,7,7,4,4,9,8,10,4,9,8,10 +G,3,7,4,5,3,6,5,5,6,6,6,9,2,9,3,7 +V,4,5,6,3,2,4,12,3,3,10,11,7,2,10,1,8 +I,6,9,8,7,4,6,7,2,7,7,6,11,0,8,4,8 +C,4,5,6,8,2,6,8,7,10,5,7,13,1,7,4,9 +D,4,8,5,6,4,7,6,7,8,6,5,5,3,8,3,7 +X,5,11,6,8,2,7,7,5,4,7,6,8,3,8,4,8 +E,5,11,5,8,3,3,7,6,11,7,6,14,0,8,8,7 +E,1,1,2,2,1,4,7,5,8,7,6,13,0,8,7,9 +S,4,10,5,7,5,8,9,8,6,7,4,6,2,6,9,8 +V,5,9,7,7,3,9,12,3,4,4,11,9,3,10,1,8 +D,2,6,4,4,3,9,6,4,6,10,4,6,3,8,3,8 +L,4,10,4,8,1,0,1,5,6,0,0,6,0,8,0,8 +D,3,8,5,6,7,9,8,4,5,7,6,6,5,6,8,6 +U,3,5,5,5,4,8,7,4,4,6,7,7,4,8,1,6 +I,2,6,3,4,1,7,7,0,7,13,6,8,0,8,1,8 +V,6,7,8,6,9,8,6,5,5,7,6,8,8,10,7,4 +F,8,14,7,8,5,10,6,3,5,10,4,6,4,8,7,10 +M,5,7,8,5,7,8,7,2,4,9,6,7,7,5,2,7 +I,4,10,6,8,4,7,7,0,8,13,6,8,0,8,1,8 +W,4,5,5,4,3,4,10,3,2,9,9,7,6,11,1,6 +I,4,5,5,6,5,7,10,4,5,8,7,8,4,7,6,6 +H,8,10,8,5,5,8,7,3,5,10,5,7,6,9,4,8 +A,4,10,6,7,2,7,5,3,1,7,0,8,3,7,2,8 +N,6,8,9,7,9,6,7,4,4,6,5,8,8,9,5,8 +P,6,9,9,7,4,7,10,2,7,14,5,3,3,8,4,8 +V,4,5,6,8,2,7,8,4,3,7,14,8,3,9,0,8 +R,7,9,10,8,11,7,7,4,4,7,5,8,7,8,6,6 +R,4,8,5,6,5,8,8,7,5,8,5,7,7,8,6,11 +I,4,11,6,8,3,7,7,0,8,14,6,8,0,8,1,8 +E,3,5,5,4,3,8,7,2,7,11,5,8,2,9,5,10 +F,5,9,5,6,2,1,12,5,6,12,11,9,0,8,2,6 +G,4,5,5,4,3,6,7,5,5,9,8,9,2,8,5,9 +O,5,9,6,7,5,8,6,8,6,7,5,8,3,8,4,7 +A,4,8,6,6,6,8,8,7,4,6,6,8,3,7,7,4 +S,4,8,4,6,4,8,8,5,7,5,5,7,0,8,8,8 +J,2,5,3,8,1,12,3,10,3,13,6,13,1,6,0,8 +E,3,2,3,3,3,7,7,5,7,7,6,9,2,8,5,10 +Q,6,14,5,8,5,9,6,4,6,11,5,7,4,8,9,10 +F,3,8,4,6,3,3,12,4,5,12,10,5,1,10,3,5 +X,4,8,6,6,4,8,7,1,8,10,4,7,3,8,3,8 +X,3,3,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +G,5,9,4,4,3,7,8,3,3,8,6,6,3,9,8,7 +U,3,5,4,3,2,6,8,6,7,7,10,9,3,9,0,8 +Z,2,7,4,5,3,8,7,2,6,7,6,7,0,9,8,8 +U,6,8,7,6,3,3,9,6,7,11,11,9,3,9,1,6 +Q,4,7,5,8,5,8,6,7,5,9,6,9,3,8,5,7 +V,3,5,5,4,2,4,12,3,3,9,11,7,2,10,1,8 +K,3,4,4,3,2,5,7,4,7,7,6,11,3,8,5,9 +U,5,9,7,6,9,7,6,4,4,7,7,8,10,8,6,6 +C,6,10,6,8,4,5,8,6,8,12,9,13,2,9,4,7 +N,4,7,4,5,3,8,7,12,1,6,6,8,5,8,0,9 +H,4,4,6,3,3,7,6,3,6,10,5,9,4,6,4,7 +Y,6,10,6,5,3,6,8,4,3,10,8,5,3,10,4,4 +G,2,1,4,2,2,7,7,6,6,6,6,10,2,9,4,9 +T,4,6,6,6,5,5,8,4,8,8,8,9,3,9,7,6 +B,5,9,8,7,7,9,7,3,7,11,4,7,3,7,5,9 +B,3,5,6,4,4,9,6,3,6,10,5,7,2,8,5,9 +V,5,9,5,7,4,3,11,2,3,9,11,8,3,12,1,7 +Z,4,8,5,6,2,7,7,4,14,9,6,8,0,8,8,8 +X,3,9,5,6,4,7,7,3,8,5,6,8,2,8,6,7 +S,7,11,8,8,6,6,7,3,6,10,7,8,3,7,5,6 +V,7,9,6,7,3,4,11,3,4,9,11,7,3,10,1,7 +R,5,9,6,6,7,8,8,7,3,8,4,6,5,7,8,9 +U,2,1,3,2,1,6,8,6,6,6,9,9,3,9,0,8 +J,4,8,3,12,3,9,7,3,3,11,5,5,3,8,6,10 +Q,5,9,6,11,6,8,6,7,4,9,7,10,3,8,6,8 +V,11,14,8,8,4,9,10,6,5,6,10,6,6,13,3,6 +S,4,6,5,4,3,8,7,3,6,10,6,8,2,9,5,8 +S,3,8,4,6,2,7,7,6,9,5,7,10,0,8,9,8 +C,6,11,5,6,3,7,8,4,3,8,8,10,4,8,7,11 +Q,4,6,6,8,8,9,9,5,0,6,7,10,6,12,5,10 +H,1,0,1,0,0,7,7,10,2,7,6,8,2,8,0,8 +M,5,11,7,8,9,8,9,7,4,7,7,8,8,8,9,5 +V,3,7,4,5,2,8,9,3,1,7,12,8,2,10,0,8 +S,5,11,6,8,5,7,8,3,7,10,4,6,2,6,5,8 +E,4,10,4,8,4,3,8,5,9,7,6,14,0,8,6,8 +G,5,11,5,8,4,5,6,7,6,7,7,11,3,7,5,8 +T,2,1,3,2,0,7,15,1,4,7,11,8,0,8,0,8 +F,4,9,4,6,2,1,14,5,3,12,9,5,0,8,2,6 +J,5,11,7,8,4,8,6,3,6,15,4,9,0,7,0,7 +P,4,9,5,6,4,5,11,8,2,9,5,4,1,10,3,7 +D,3,7,5,5,3,10,6,4,7,10,3,6,3,8,3,9 +L,3,3,4,5,1,1,0,6,6,0,1,5,0,8,0,8 +G,5,10,6,7,5,6,6,6,6,10,7,13,3,9,5,9 +Q,2,2,3,3,2,8,7,6,3,6,6,9,2,9,3,10 +L,5,10,5,8,3,0,1,5,6,0,0,7,0,8,0,8 +T,6,9,6,7,3,4,14,5,6,12,9,3,1,11,2,4 +F,1,3,3,1,1,6,10,3,4,13,7,5,1,9,1,7 +N,5,7,7,5,4,4,10,3,4,10,10,9,5,8,1,8 +X,2,3,4,2,2,8,7,1,7,10,5,8,2,8,2,8 +I,0,3,0,2,0,7,7,1,7,7,6,8,0,8,2,8 +C,4,9,3,4,2,6,8,4,3,9,8,10,3,9,8,9 +L,4,10,6,7,4,8,4,0,8,10,3,10,0,7,3,9 +A,3,7,6,5,3,11,2,3,2,10,2,9,2,6,3,9 +T,2,8,3,5,1,8,13,0,6,6,11,8,0,8,0,8 +N,4,7,6,5,4,5,9,3,4,10,9,8,5,8,1,8 +V,3,1,5,3,1,7,12,2,3,7,11,9,2,10,1,8 +L,2,3,2,2,1,4,3,4,8,2,2,5,0,7,1,6 +H,5,9,8,7,7,5,9,3,6,10,9,9,3,9,4,6 +X,8,12,9,6,5,8,7,2,7,11,4,7,5,10,4,8 +S,4,8,5,6,5,8,6,7,5,6,8,9,3,9,9,8 +Z,3,7,4,5,3,6,8,5,9,7,7,9,1,9,7,7 +Y,5,8,7,11,11,8,8,4,2,7,8,9,4,11,8,8 +Y,2,2,3,3,1,7,10,1,6,7,11,9,1,11,1,8 +K,6,11,9,8,7,7,7,4,7,6,5,8,7,8,5,9 +E,3,3,3,4,2,3,7,6,10,7,6,14,0,8,7,7 +F,3,5,5,3,2,6,12,3,5,13,7,4,1,10,2,6 +K,5,9,7,7,9,8,7,3,4,6,7,8,10,8,8,7 +H,3,7,3,4,2,7,9,14,3,7,3,8,3,8,0,8 +O,3,6,5,4,3,8,8,8,4,7,6,7,3,8,3,8 +R,5,10,8,8,9,6,7,3,4,7,6,9,8,10,8,5 +C,2,5,3,3,2,6,8,7,7,8,8,13,1,9,4,10 +H,7,10,10,8,6,8,7,3,7,10,5,8,3,8,3,8 +X,6,9,8,8,9,6,8,2,5,7,7,10,4,5,8,7 +E,4,10,5,8,7,8,7,3,5,6,7,10,4,9,8,8 +A,3,6,5,8,2,7,5,3,1,7,0,8,3,7,2,8 +Z,3,5,5,4,3,7,8,2,9,12,6,8,1,9,5,7 +Y,5,7,6,5,3,4,9,1,8,10,10,6,1,10,3,4 +A,2,1,4,2,1,7,2,2,1,6,2,8,2,7,2,7 +A,3,9,6,6,4,11,3,1,2,8,2,9,2,6,2,7 +J,2,7,4,5,2,7,8,2,5,14,5,7,0,6,1,7 +C,4,5,5,3,2,4,8,4,8,11,9,12,1,9,3,7 +Q,6,8,6,9,6,7,7,7,4,9,9,9,4,8,7,9 +F,5,8,7,6,4,8,9,3,6,13,5,5,2,9,2,7 +U,5,10,6,8,4,3,9,5,7,11,10,9,3,9,2,7 +S,5,11,6,8,6,8,8,7,5,7,5,7,2,8,9,8 +E,3,9,4,6,4,3,8,5,9,7,7,14,0,8,6,9 +I,1,3,1,1,1,7,7,2,7,7,6,8,0,8,2,8 +E,4,9,6,7,5,7,7,2,7,11,7,9,3,8,4,8 +F,3,5,4,4,3,5,10,3,5,10,9,5,1,10,3,6 +U,3,2,4,4,2,6,8,6,6,7,9,9,3,9,1,8 +O,2,2,3,3,2,7,7,7,4,7,6,8,2,8,3,8 +H,10,12,9,7,5,7,7,5,5,8,9,8,7,11,5,9 +X,2,1,3,2,2,7,7,3,9,6,6,8,2,8,5,8 +Q,3,5,4,6,4,8,7,5,2,8,7,10,3,9,5,8 +L,4,9,5,7,3,3,4,3,9,2,0,7,0,7,1,5 +N,5,9,7,6,4,6,9,6,5,8,7,8,5,8,1,7 +S,4,10,5,8,5,8,9,8,6,7,4,5,2,6,8,8 +T,4,8,5,6,3,7,11,3,8,11,9,4,2,11,3,5 +E,5,9,8,7,8,6,7,3,7,5,6,11,4,10,11,8 +T,2,7,4,5,2,6,12,3,7,8,11,7,1,11,1,7 +J,2,7,2,5,1,12,2,9,4,13,5,12,1,6,0,8 +L,1,3,2,1,0,6,4,1,7,8,2,10,0,7,2,9 +X,5,10,6,7,2,7,7,5,4,7,6,8,3,8,4,8 +O,4,6,5,5,4,8,5,4,4,9,4,10,3,7,5,7 +P,3,5,5,7,6,8,11,3,1,8,8,6,6,10,4,6 +U,4,9,5,7,2,7,5,15,5,7,13,8,3,9,0,8 +U,7,11,9,8,8,7,6,9,6,7,6,9,6,8,7,2 +N,4,6,6,4,3,7,8,3,5,10,6,7,5,8,1,7 +Y,9,12,8,6,5,7,5,4,5,9,9,5,4,10,4,5 +M,4,2,5,4,4,8,6,6,4,6,7,8,8,6,2,7 +P,3,10,4,8,4,4,12,7,2,10,7,4,1,10,3,8 +A,2,3,4,2,1,6,2,2,2,5,2,8,2,6,2,6 +K,3,7,5,5,6,8,6,3,4,6,6,8,6,8,6,8 +S,3,4,5,3,2,9,6,3,8,11,4,7,1,9,4,9 +G,4,7,5,5,2,8,6,7,7,6,6,9,2,8,6,11 +B,4,10,5,7,4,6,8,9,7,7,5,7,2,8,9,9 +U,4,4,5,6,2,7,4,14,5,7,14,8,3,9,0,8 +Q,4,9,6,7,6,8,5,7,4,6,6,8,3,7,5,9 +Z,5,6,4,9,3,6,9,5,3,12,7,7,2,9,10,6 +N,6,9,8,7,4,6,8,3,4,10,8,8,5,8,1,7 +R,5,5,6,8,4,6,9,10,5,6,5,8,3,8,6,11 +V,2,3,3,2,1,7,12,2,2,6,10,9,2,11,0,8 +M,5,9,5,6,6,7,5,11,0,7,8,8,7,5,1,9 +L,3,4,4,6,1,0,0,6,6,0,1,5,0,8,0,8 +N,4,5,4,3,3,7,8,5,5,7,7,6,6,9,3,6 +E,4,9,6,7,5,9,6,2,7,11,5,9,3,7,6,10 +J,4,6,5,4,2,8,6,4,7,15,6,10,1,6,1,7 +V,4,11,5,8,4,6,9,4,1,8,12,8,3,9,1,8 +A,2,7,4,4,1,8,5,3,1,7,0,8,2,7,2,8 +P,1,1,2,1,1,5,11,7,2,10,6,4,1,9,3,8 +Y,9,11,9,8,6,5,8,0,9,8,9,5,4,13,7,3 +L,4,5,5,4,2,4,4,5,8,2,2,5,1,6,1,5 +Q,7,8,7,10,7,8,5,7,5,9,6,9,3,8,6,7 +U,5,11,5,8,4,7,5,12,4,7,13,8,3,9,0,7 +D,4,9,5,7,3,5,7,10,9,6,5,5,3,8,4,8 +B,4,11,5,8,4,6,8,9,8,7,5,7,3,8,9,10 +N,3,6,3,4,3,8,7,11,1,6,6,8,5,9,0,6 +L,4,9,5,8,6,7,6,5,4,7,7,8,2,9,7,10 +U,5,9,5,6,2,8,4,14,6,7,14,8,3,9,0,8 +V,4,10,5,8,3,6,9,4,1,8,12,8,4,9,1,8 +P,6,11,9,8,7,9,8,2,5,13,5,5,3,9,4,9 +E,6,8,8,6,6,7,7,2,8,11,5,9,3,8,4,9 +A,4,8,5,6,3,7,5,2,0,7,1,8,2,7,1,8 +Y,7,9,7,6,3,4,10,2,8,10,11,5,2,13,4,3 +W,5,9,8,6,6,7,10,2,3,7,9,8,8,11,1,8 +K,8,13,8,7,4,9,7,3,7,9,3,6,5,8,4,8 +D,5,9,7,8,7,6,7,6,7,7,6,9,5,5,7,4 +P,0,0,1,0,0,5,10,6,1,9,6,5,1,9,2,8 +C,2,2,3,3,2,6,8,7,7,8,7,13,1,9,4,10 +Y,3,7,5,4,1,8,11,2,2,5,12,8,1,11,0,8 +J,2,5,3,3,1,9,6,3,6,12,4,9,1,6,1,7 +C,6,11,8,9,6,7,7,8,6,6,6,13,6,8,5,7 +Q,5,9,5,10,6,8,6,7,5,9,6,9,3,8,6,8 +D,3,5,5,4,3,9,6,4,7,9,4,6,2,8,3,8 +I,5,12,4,6,2,11,5,3,6,12,3,7,2,9,4,11 +G,4,7,5,5,3,5,8,5,5,9,9,8,2,8,4,9 +M,6,9,8,7,8,7,7,5,5,6,7,8,9,7,3,7 +A,4,9,6,6,2,8,3,3,3,7,2,8,3,6,3,8 +I,2,8,2,6,2,7,7,0,7,7,6,8,0,8,3,8 +G,6,7,8,6,7,7,8,5,3,7,7,8,9,10,9,7 +Q,4,7,5,9,5,9,7,7,3,5,7,10,3,8,7,10 +D,4,8,4,6,4,6,7,9,7,7,7,6,2,8,3,8 +D,3,8,5,6,7,10,8,4,5,7,6,6,4,7,7,4 +D,4,9,6,7,6,7,7,8,6,6,5,5,3,9,4,8 +T,3,3,3,2,1,6,11,2,7,11,9,5,1,10,2,5 +Z,2,5,5,3,2,7,8,2,9,12,6,8,1,9,5,8 +D,3,9,4,6,3,6,7,11,9,7,6,6,3,8,4,8 +M,6,10,9,8,7,10,6,2,5,9,4,7,8,6,2,8 +Z,2,1,3,2,2,7,7,5,8,6,6,9,2,8,7,8 +G,5,8,6,6,3,5,7,6,6,10,8,10,2,8,5,9 +D,3,2,4,3,2,7,7,6,7,6,6,5,2,8,3,7 +K,5,10,7,8,6,10,6,1,6,10,3,8,4,9,4,11 +Z,6,10,8,8,6,8,7,2,9,12,5,8,1,8,6,8 +C,6,10,6,8,4,4,7,6,6,13,10,12,2,11,3,7 +K,6,11,9,8,7,6,6,1,6,9,6,10,5,7,5,8 +O,4,9,5,6,4,8,6,7,3,10,4,8,3,8,3,7 +M,5,5,7,4,5,8,6,6,5,7,7,8,8,6,2,8 +R,4,5,4,6,3,5,11,8,4,7,3,9,3,7,6,11 +U,4,10,6,7,4,5,8,7,7,8,10,10,3,9,1,8 +Q,7,13,6,7,4,10,3,4,7,10,4,9,3,9,6,13 +O,4,9,6,7,4,8,6,9,3,6,5,7,3,8,4,9 +U,3,5,4,3,2,5,8,4,7,10,8,9,3,9,2,6 +H,3,7,5,5,4,6,7,6,4,6,5,8,3,7,6,11 +A,2,3,4,4,1,7,5,3,1,6,1,8,2,7,2,7 +W,5,10,7,8,4,11,8,5,2,6,9,8,8,10,0,8 +F,2,3,4,2,1,5,11,3,5,13,7,4,1,9,1,7 +U,5,5,6,3,2,4,8,5,8,10,10,9,3,9,2,5 +U,1,0,1,0,0,7,6,10,4,7,11,8,3,10,0,8 +J,5,9,6,7,3,7,7,3,6,15,6,10,1,6,1,7 +S,3,3,4,5,2,8,6,5,9,5,6,8,0,9,9,8 +W,2,0,3,1,1,7,8,4,0,7,8,8,7,9,0,8 +Q,2,2,3,2,2,8,8,5,2,8,7,9,2,9,3,8 +A,3,9,5,7,3,13,2,4,4,12,1,9,3,6,3,10 +U,6,7,7,5,4,3,8,5,7,10,9,10,3,9,2,5 +G,3,3,4,5,2,8,7,8,7,6,6,10,2,7,5,11 +Q,4,7,5,6,3,8,7,8,6,6,7,9,3,8,5,9 +B,6,11,8,8,8,9,7,3,6,9,4,6,3,8,5,9 +E,5,8,7,6,4,5,9,4,10,12,10,8,2,8,5,3 +E,5,7,7,5,4,6,7,4,9,12,8,9,2,8,5,7 +M,6,10,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +E,4,9,4,7,2,3,7,6,11,7,7,15,0,8,7,7 +I,4,11,6,8,3,7,7,0,8,14,6,8,0,8,1,8 +D,2,4,4,3,2,9,7,4,6,10,4,6,2,8,3,8 +W,4,5,5,4,3,7,11,3,2,6,9,8,7,11,0,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +F,8,12,7,6,4,9,7,4,7,12,4,6,2,8,8,8 +T,4,5,6,4,5,8,9,5,7,7,7,8,3,10,7,7 +G,7,11,8,8,6,6,6,7,7,9,8,11,2,11,5,9 +H,7,11,8,6,5,6,9,3,5,10,6,8,6,7,5,7 +H,4,10,6,8,7,8,7,5,6,7,6,6,3,8,4,7 +F,5,6,6,7,6,6,12,3,5,9,7,6,4,9,5,6 +N,4,10,5,8,3,7,7,14,2,4,6,8,6,8,0,8 +C,4,7,4,5,2,5,9,6,7,12,9,9,2,10,2,7 +X,4,5,6,3,3,7,7,1,9,10,6,8,2,8,3,7 +P,3,7,4,5,3,5,11,5,4,11,8,4,1,10,4,7 +N,3,8,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +D,4,8,5,6,5,8,8,6,5,9,5,5,3,8,3,7 +U,6,11,8,8,8,9,7,8,5,6,7,9,6,8,4,6 +P,6,6,8,8,9,7,9,3,3,8,8,6,6,11,6,5 +B,0,0,1,0,0,6,7,6,4,7,6,8,1,8,5,10 +X,4,7,7,5,3,5,9,2,8,10,10,8,3,8,4,6 +T,3,5,4,7,1,10,14,1,6,4,11,9,0,8,0,8 +O,3,10,5,8,5,8,6,8,4,6,5,6,3,8,3,7 +Z,4,7,5,5,4,9,9,6,4,7,5,8,3,9,10,7 +T,1,1,2,1,0,7,14,1,5,7,11,8,0,8,0,8 +W,3,4,4,2,2,6,11,3,2,8,7,7,6,11,1,6 +T,7,9,6,4,2,4,12,3,7,13,8,4,2,8,3,4 +T,2,6,3,4,1,7,12,0,5,7,10,8,0,8,0,8 +A,5,11,5,6,4,9,4,5,3,10,6,12,7,4,6,10 +R,5,10,6,8,6,5,8,6,6,6,5,9,4,8,6,10 +R,1,0,1,0,0,6,9,7,3,7,5,8,2,7,3,10 +T,3,2,4,4,3,7,11,3,6,7,11,8,2,11,1,8 +L,1,0,2,1,0,2,1,6,5,0,2,5,0,8,0,8 +T,4,8,5,6,3,7,10,1,8,11,9,5,1,10,3,5 +Y,2,3,3,5,0,7,10,1,3,7,12,8,1,11,0,8 +T,5,11,5,8,3,5,11,2,8,12,10,4,1,11,2,4 +S,2,6,3,4,1,6,5,5,8,5,6,11,0,9,8,8 +N,6,8,8,6,4,9,9,3,5,10,3,5,5,9,1,7 +F,4,7,6,5,5,5,9,2,4,10,8,7,5,10,3,4 +M,3,1,4,3,3,8,6,6,4,7,7,8,7,6,2,7 +H,9,11,12,8,8,5,7,4,7,10,9,10,3,8,4,6 +D,6,9,6,5,3,9,5,4,5,12,3,8,5,7,5,10 +J,4,9,6,6,5,9,8,3,4,8,4,6,4,8,5,4 +O,4,7,5,5,2,8,7,8,7,7,6,9,3,8,4,8 +P,2,4,4,3,2,8,9,3,4,12,4,3,1,10,3,8 +C,3,9,5,7,3,4,8,7,7,9,9,14,2,9,4,9 +B,3,5,5,3,3,9,7,3,6,10,5,6,2,8,5,9 +T,2,1,3,3,1,7,12,3,6,7,11,8,2,11,1,8 +F,4,4,4,6,2,1,13,5,4,12,10,7,0,8,2,6 +J,1,3,2,4,0,14,3,6,4,13,2,10,0,7,0,8 +L,3,7,5,5,3,7,3,2,7,8,2,9,2,5,3,8 +E,3,5,6,3,3,7,7,2,8,11,6,9,2,8,4,8 +S,4,7,5,5,6,8,8,4,3,8,5,7,3,8,10,8 +P,7,12,6,6,3,8,9,7,5,14,4,4,4,10,4,7 +A,2,6,4,4,2,8,2,2,2,7,2,8,2,6,3,6 +F,5,10,7,8,4,5,13,5,4,13,8,3,2,10,2,5 +H,6,9,6,4,3,8,8,4,4,8,6,6,6,10,4,8 +S,5,11,7,8,4,8,9,6,10,5,6,6,0,8,9,7 +B,3,7,4,5,3,6,7,8,6,7,6,6,2,8,9,10 +G,7,11,8,9,5,7,6,7,7,12,6,12,3,11,5,8 +Z,2,6,3,4,1,7,7,3,13,9,6,8,0,8,8,8 +S,2,1,2,2,1,8,7,6,5,7,6,7,2,8,8,8 +W,3,3,5,4,2,9,8,4,1,7,8,8,8,9,0,8 +Z,5,5,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +A,4,11,6,8,5,7,3,1,2,5,2,7,4,6,4,7 +R,7,9,10,8,10,8,8,4,4,8,4,7,8,6,7,6 +U,3,8,4,6,2,8,6,13,5,6,13,8,3,9,0,8 +O,5,9,6,7,3,8,8,9,8,6,8,9,3,8,4,8 +I,5,10,6,8,4,6,8,0,7,13,7,8,0,8,1,7 +Z,3,5,5,7,4,9,4,3,5,7,3,6,3,8,7,6 +V,6,11,5,6,3,9,10,5,4,7,10,5,4,11,3,6 +R,6,10,8,8,6,8,8,5,7,8,3,9,4,5,5,12 +N,7,9,9,8,9,8,7,5,4,7,5,7,7,9,6,5 +C,4,7,5,5,2,6,8,6,10,6,7,12,1,7,4,8 +F,3,8,6,6,6,11,6,1,5,9,5,6,4,10,4,7 +A,3,8,6,6,4,10,5,1,4,8,2,6,2,7,4,8 +X,3,6,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +A,3,5,5,5,4,9,8,2,4,7,7,7,4,8,4,5 +P,3,4,4,5,2,4,13,8,2,11,6,3,1,10,4,8 +W,6,9,6,6,6,3,11,2,3,10,10,8,6,11,2,7 +V,4,10,6,8,4,6,11,2,3,7,11,9,2,10,1,9 +Q,3,5,3,6,4,8,9,5,1,6,7,11,2,9,5,9 +B,5,10,5,8,4,6,8,9,7,7,6,7,2,8,9,10 +C,5,10,6,8,2,6,7,7,11,7,6,14,1,8,4,9 +L,4,8,4,6,2,0,1,5,5,0,1,6,0,8,0,8 +S,5,10,6,7,3,7,7,6,9,5,6,8,0,8,9,7 +V,2,2,4,3,1,7,12,2,3,7,11,9,2,10,1,8 +F,2,4,4,2,1,6,10,2,5,13,7,5,1,9,1,7 +E,4,9,4,6,2,3,8,6,10,7,6,14,0,8,7,7 +T,6,7,6,5,3,7,10,2,10,11,9,4,1,11,4,5 +Q,6,7,8,6,7,8,4,5,5,7,4,10,4,5,7,7 +Z,1,3,3,2,1,7,8,2,9,11,6,8,1,8,5,7 +K,1,0,1,0,0,5,7,7,1,7,6,11,2,8,2,11 +M,3,4,6,3,3,7,6,3,4,9,7,8,7,5,1,8 +E,1,3,2,2,2,7,7,5,6,7,6,8,2,8,5,10 +U,6,9,8,8,7,7,6,5,4,6,7,8,7,8,2,7 +D,3,8,3,6,2,5,7,10,8,6,6,5,3,8,4,8 +E,4,6,4,8,3,3,7,6,11,7,6,15,0,8,7,7 +W,9,11,9,9,7,7,11,4,3,8,6,6,11,13,4,4 +W,5,11,7,8,9,8,7,6,2,7,8,8,6,8,4,8 +H,4,4,5,3,4,6,7,6,6,7,6,10,3,8,3,9 +Q,3,4,4,5,4,8,7,7,3,6,6,9,2,8,5,9 +S,6,10,8,8,4,8,7,4,8,11,5,7,2,8,5,8 +G,3,2,5,4,3,6,6,6,6,6,6,9,2,9,4,9 +Z,4,10,5,7,4,6,8,6,10,7,7,10,1,9,8,8 +A,8,12,6,6,3,10,1,2,2,10,4,12,3,5,4,8 +R,4,9,5,6,3,5,12,8,4,7,3,9,3,7,6,11 +F,6,11,8,8,8,7,6,5,5,7,6,8,6,10,8,12 +Y,0,0,1,0,0,7,10,1,3,7,11,8,1,11,0,8 +L,4,10,6,7,7,6,7,3,6,7,7,11,5,11,6,5 +Z,5,8,6,6,5,9,11,6,6,6,5,9,3,8,8,5 +B,3,7,5,5,5,8,7,5,6,6,6,6,2,8,5,9 +V,3,3,4,2,1,3,12,4,3,11,11,7,2,11,1,8 +E,2,4,4,3,2,7,7,2,7,11,6,8,2,8,5,9 +E,7,13,5,7,4,9,5,4,5,11,4,9,3,9,7,11 +Y,3,4,4,3,1,4,11,2,7,11,10,5,1,11,2,5 +R,8,10,6,5,3,10,5,5,5,10,3,9,6,6,6,10 +P,1,1,2,1,1,5,11,7,1,9,6,4,1,9,3,8 +O,5,8,6,6,8,8,6,5,2,7,6,8,8,9,4,10 +Y,4,5,5,4,2,3,11,3,6,12,11,6,1,11,2,5 +Z,6,10,8,8,4,6,9,3,10,11,9,5,2,8,7,5 +H,3,8,5,6,6,8,7,4,2,6,6,7,6,8,8,7 +Y,7,10,7,8,4,4,10,2,8,10,11,6,2,10,4,3 +T,6,9,6,6,3,7,10,2,9,11,9,4,3,9,4,4 +P,2,4,3,2,2,5,10,4,4,9,8,5,3,10,3,7 +G,2,2,4,3,2,6,6,6,6,7,6,11,2,9,4,9 +W,7,8,7,6,6,4,12,3,2,9,8,7,6,12,2,6 +X,3,2,5,4,3,8,7,3,9,6,6,8,3,8,6,8 +D,5,9,8,6,5,10,6,5,8,10,3,5,3,8,4,9 +K,4,5,5,7,2,4,8,8,2,7,4,11,3,8,2,11 +J,3,9,5,6,3,7,7,3,6,15,5,9,1,7,1,7 +H,5,5,6,7,3,7,6,15,0,7,7,8,3,8,0,8 +T,2,5,4,7,1,5,14,1,6,9,11,7,0,8,0,8 +K,7,9,7,5,4,6,8,2,6,10,4,9,5,6,3,8 +X,4,8,6,6,3,5,8,2,8,10,10,9,3,8,3,6 +P,2,1,2,1,1,5,10,4,4,10,8,4,0,9,3,7 +S,3,6,4,4,3,8,7,7,5,7,6,8,2,8,9,8 +U,6,10,7,8,4,4,8,6,8,10,9,9,3,9,2,5 +S,3,8,4,6,2,8,7,5,9,5,6,7,0,8,9,8 +M,7,8,10,6,7,11,6,2,5,9,3,6,9,8,2,9 +Q,4,7,4,8,5,8,7,6,4,8,7,9,3,8,6,8 +D,6,14,6,8,5,8,6,4,6,9,5,7,5,9,7,6 +C,1,3,2,2,1,5,8,4,5,12,8,10,1,10,2,8 +N,4,2,5,4,3,7,8,5,5,7,7,7,5,9,2,6 +X,5,9,7,7,4,6,8,1,8,10,8,9,3,8,3,6 +P,7,10,9,8,5,9,8,3,7,13,3,3,2,10,4,9 +K,2,3,4,1,2,6,8,1,6,10,6,9,3,8,2,8 +T,3,6,4,4,2,9,11,2,9,5,11,8,1,10,1,8 +D,6,7,8,6,6,5,7,6,8,7,6,7,4,7,5,5 +U,8,10,8,8,5,3,8,5,7,10,10,9,3,9,2,6 +T,3,5,5,3,2,8,12,3,7,6,11,7,2,11,1,7 +I,1,10,2,8,3,7,7,0,7,7,6,8,0,8,3,8 +D,3,9,5,6,5,7,8,7,5,8,7,5,3,8,3,7 +T,2,4,3,5,1,7,14,0,6,7,11,8,0,8,0,8 +M,3,4,5,3,3,9,6,3,4,9,5,7,6,5,1,8 +H,3,8,4,5,2,7,8,15,1,7,5,8,3,8,0,8 +Z,5,11,7,8,5,8,7,2,9,12,6,7,1,7,6,7 +H,8,10,11,8,7,9,7,3,6,10,4,7,3,8,4,8 +I,1,5,3,4,1,7,7,0,8,13,6,8,0,8,1,7 +A,4,10,5,7,4,9,4,3,1,8,2,8,2,7,2,8 +G,3,4,4,3,2,6,7,5,5,9,7,10,2,9,4,9 +L,3,7,4,5,2,5,4,1,9,7,2,10,0,7,2,7 +O,3,5,4,3,2,8,7,8,5,7,7,8,2,8,3,8 +G,6,10,8,8,9,7,7,6,2,7,6,11,7,9,10,7 +W,3,6,4,4,3,9,10,2,2,6,9,8,6,11,1,8 +J,2,9,3,7,2,10,7,0,7,10,4,6,0,7,1,7 +N,10,12,8,6,4,4,8,4,6,3,2,12,6,11,2,7 +F,3,7,3,5,2,1,11,3,4,11,11,8,0,8,1,7 +S,3,2,3,3,2,8,8,6,5,7,6,7,2,8,9,8 +G,4,10,6,7,3,7,5,7,10,5,4,10,1,9,6,11 +H,5,9,7,7,5,9,7,3,6,10,5,7,3,8,3,9 +B,5,9,7,6,7,8,7,4,4,7,6,7,4,8,6,8 +W,5,7,7,5,4,5,8,5,1,8,10,9,8,11,0,8 +U,4,5,5,4,2,4,8,5,7,10,9,9,3,9,2,5 +S,8,15,6,9,3,8,4,4,5,8,2,8,4,6,6,9 +L,5,9,5,5,3,10,4,3,3,12,7,11,3,10,4,10 +W,4,9,6,6,3,6,8,4,2,7,8,8,8,10,0,8 +N,7,9,6,4,3,4,9,4,7,3,3,11,5,9,2,8 +O,2,1,2,2,1,7,7,7,4,7,6,8,2,8,2,7 +O,7,11,9,8,10,7,10,5,3,8,7,7,11,11,7,10 +L,7,14,7,8,4,6,5,4,5,12,9,11,3,9,7,8 +S,3,7,4,5,5,8,8,5,3,8,5,8,4,9,10,6 +B,6,9,9,7,6,10,6,3,7,11,3,7,6,8,7,11 +H,2,6,2,4,1,7,8,14,1,7,5,8,3,8,0,8 +G,3,1,4,2,2,7,7,6,6,6,6,9,2,9,4,9 +L,2,1,3,2,1,4,3,5,6,2,3,4,1,7,0,6 +Q,1,2,2,3,1,8,6,6,3,8,6,9,2,9,3,8 +M,4,5,5,7,4,8,7,12,2,6,9,8,8,6,0,8 +Z,2,4,3,3,1,8,6,2,9,11,5,8,1,8,5,8 +U,5,11,6,8,5,6,9,5,6,6,9,9,3,8,1,8 +V,3,5,4,4,5,8,8,5,4,7,6,8,6,8,7,4 +T,1,0,1,1,0,8,13,1,5,6,10,8,0,8,0,8 +T,4,10,6,7,7,7,8,5,5,6,7,9,6,8,8,6 +K,1,1,2,1,1,6,7,4,7,6,6,10,3,8,4,9 +O,2,4,3,3,2,7,7,7,4,9,6,8,2,8,3,8 +K,6,11,9,8,6,7,6,2,7,10,5,9,4,7,5,9 +U,3,6,5,4,3,6,9,5,7,7,9,9,3,9,1,8 +L,3,7,5,5,2,5,4,2,10,6,1,9,0,7,3,6 +R,10,15,8,8,5,9,7,7,5,10,2,9,7,5,6,10 +M,6,7,9,5,6,9,6,2,5,9,5,7,8,4,2,8 +A,2,2,4,3,2,6,2,2,2,5,2,8,2,6,2,6 +H,12,15,11,8,6,8,7,4,5,9,7,7,7,10,5,9 +J,5,9,6,7,3,10,6,1,7,14,3,7,0,7,0,8 +H,8,13,8,8,5,6,9,4,5,9,8,9,6,8,6,8 +M,7,11,11,8,8,7,6,3,5,9,8,9,8,6,2,8 +F,4,10,4,7,2,1,12,5,5,12,11,8,0,8,2,6 +S,4,8,5,6,4,7,9,7,7,8,4,6,2,7,9,9 +Y,8,7,6,10,4,9,7,6,6,4,10,7,5,10,3,7 +M,5,6,8,4,5,8,6,2,5,9,6,8,7,5,2,8 +O,2,5,3,4,2,8,7,7,4,9,4,8,2,8,2,8 +G,2,1,2,2,1,7,7,6,5,6,6,9,2,9,4,9 +L,1,4,3,3,1,6,5,1,6,8,3,10,1,7,2,9 +G,4,5,5,4,3,6,6,6,6,6,6,9,2,9,4,8 +X,2,3,3,4,1,7,7,4,4,7,6,8,3,8,4,8 +A,2,7,3,5,2,7,4,2,0,7,2,8,1,6,1,8 +S,4,6,5,8,2,8,7,6,9,4,6,7,0,8,9,8 +T,4,8,5,6,4,6,11,3,6,8,11,8,2,12,1,7 +T,9,13,8,7,4,8,6,4,10,13,5,7,2,9,6,6 +X,7,11,10,8,5,10,7,2,9,11,1,6,4,9,4,10 +C,2,4,3,3,1,4,9,4,7,11,9,12,1,9,2,7 +Z,4,6,5,4,3,7,8,2,9,11,8,6,1,8,6,6 +Z,4,11,5,9,6,7,7,5,10,7,5,9,3,10,9,8 +T,2,7,4,4,1,9,14,1,6,5,11,9,0,8,0,8 +V,3,2,5,4,2,6,12,3,4,8,12,8,3,10,1,8 +X,3,4,6,3,2,9,6,2,8,10,3,7,2,7,3,9 +L,3,3,3,5,1,0,1,6,6,0,1,5,0,8,0,8 +R,4,9,4,6,3,6,11,9,3,7,2,9,3,7,5,10 +H,7,11,10,8,8,9,7,3,6,10,4,7,6,8,5,8 +Q,5,8,7,9,7,9,7,7,2,5,8,9,5,9,7,11 +P,8,12,7,6,3,7,9,6,4,13,4,5,4,10,4,8 +J,2,7,4,5,2,7,7,3,5,15,6,9,1,6,1,7 +V,6,11,5,6,3,8,10,5,5,7,10,5,5,12,3,7 +Q,3,3,4,5,4,8,7,6,2,5,7,9,3,9,5,10 +S,4,5,6,4,5,10,8,5,5,6,8,9,4,11,6,10 +Y,3,5,5,7,1,9,10,3,2,6,13,8,2,11,0,8 +L,3,10,4,7,4,3,4,4,7,2,0,8,0,6,1,6 +L,5,11,6,8,4,3,4,4,9,2,0,7,0,7,1,5 +A,5,8,7,7,6,9,7,3,4,7,7,6,5,10,4,6 +X,8,13,8,7,5,7,6,2,8,11,4,8,4,5,4,7 +F,4,11,4,8,2,0,13,5,4,12,11,6,0,8,2,5 +M,4,10,5,8,6,7,5,11,1,7,9,8,8,6,1,9 +I,2,9,3,7,3,8,7,0,7,7,6,8,0,8,3,7 +H,3,4,6,3,3,8,8,3,6,10,6,7,3,8,3,8 +L,6,9,8,8,7,7,7,4,6,7,7,8,3,8,9,10 +E,2,1,3,3,2,7,7,5,7,7,6,9,2,8,5,10 +V,4,10,6,7,2,9,8,4,3,6,14,8,3,10,0,8 +G,4,9,5,6,2,7,6,8,8,6,5,10,2,8,5,11 +P,4,7,6,9,7,6,8,5,2,8,7,6,9,12,7,8 +G,5,9,7,8,8,7,9,5,2,7,7,8,6,11,7,9 +A,3,8,5,6,3,5,4,3,0,5,2,7,2,7,2,7 +S,5,10,6,8,3,8,8,6,10,5,6,6,0,8,9,7 +X,11,15,10,8,5,11,6,3,9,10,4,7,4,11,4,11 +I,2,9,3,6,2,6,8,0,7,14,7,8,0,8,1,7 +D,3,6,5,4,3,7,7,7,8,6,5,4,3,8,3,7 +L,2,2,3,4,2,4,4,4,7,2,1,6,0,7,1,6 +W,4,3,4,2,2,4,11,3,2,9,9,7,6,11,1,6 +A,3,2,6,4,3,8,1,2,2,7,2,8,2,7,3,7 +P,5,9,6,7,5,7,9,5,6,9,8,4,5,10,5,7 +A,4,6,6,6,5,7,8,2,4,7,7,9,5,7,3,7 +K,9,13,9,7,5,10,6,2,6,11,4,7,6,11,3,9 +N,3,7,5,5,3,5,10,6,4,7,7,9,5,9,1,8 +X,4,4,5,6,1,7,7,4,4,7,6,8,3,8,4,8 +T,5,10,7,8,6,7,7,7,6,5,10,10,5,6,9,7 +R,5,10,6,8,4,5,11,8,3,7,4,8,3,8,6,11 +P,6,10,9,8,5,7,12,7,3,11,4,2,2,11,4,8 +L,2,5,4,4,2,7,3,1,8,9,2,10,0,7,2,8 +X,5,9,8,7,5,4,8,1,8,10,11,10,3,9,3,5 +W,7,11,9,8,10,8,7,6,3,6,8,8,6,8,5,7 +P,5,11,8,8,6,8,9,3,5,13,5,4,4,10,4,8 +B,3,7,4,5,3,6,7,8,6,7,6,7,2,8,9,10 +C,2,1,3,2,1,6,7,6,7,8,7,13,1,9,4,10 +M,5,8,8,6,7,7,6,5,5,7,7,11,14,6,2,10 +S,8,13,6,7,3,9,1,2,5,8,2,8,3,7,5,11 +M,7,10,9,8,9,9,7,6,5,6,7,6,11,8,4,5 +H,3,7,5,5,6,8,7,4,3,6,6,7,7,8,8,8 +P,4,10,4,7,4,4,11,8,2,9,6,4,1,10,3,8 +W,6,6,6,4,4,5,11,3,2,9,7,7,7,12,2,6 +Z,3,5,4,7,2,7,7,4,13,10,6,8,0,8,8,8 +H,5,10,7,8,10,9,6,4,4,6,6,7,8,7,7,6 +U,4,9,6,7,4,7,9,5,7,5,9,9,3,9,1,8 +E,5,10,5,7,3,3,8,6,11,7,6,15,0,8,7,7 +Q,2,3,3,4,2,8,7,5,3,8,7,9,2,9,3,8 +O,3,5,4,4,3,8,7,7,4,9,5,8,2,8,2,8 +S,3,7,4,5,3,7,8,3,7,10,5,7,2,7,5,8 +M,4,5,6,4,6,6,8,5,3,6,5,8,9,7,4,8 +N,3,7,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +E,2,3,3,2,2,8,7,1,7,11,5,8,2,8,4,10 +P,1,1,2,2,1,5,9,4,3,9,7,4,1,10,2,7 +H,6,9,9,7,8,6,8,3,6,10,7,8,3,8,3,7 +B,2,3,3,2,2,7,7,5,5,6,5,6,2,8,5,9 +W,6,11,10,8,6,5,10,2,3,8,9,9,8,11,1,8 +I,1,3,2,1,0,7,7,1,6,13,6,8,0,8,0,8 +R,5,11,6,8,4,6,9,10,5,7,5,8,3,8,6,10 +H,6,10,6,8,5,7,6,14,2,7,8,8,3,8,0,8 +W,6,5,8,7,4,4,8,5,2,7,9,8,9,9,0,8 +M,5,11,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +X,1,0,1,0,0,8,7,3,5,7,6,8,2,8,3,7 +H,2,5,4,3,3,7,7,2,5,10,6,8,3,8,2,8 +G,5,5,7,8,3,7,5,7,10,5,5,9,1,9,7,11 +V,3,7,5,5,2,7,12,3,4,6,12,8,2,10,1,8 +V,6,11,6,8,3,2,12,5,4,11,12,8,3,9,1,8 +B,3,5,4,4,4,7,7,5,5,6,6,6,2,8,6,9 +E,3,7,5,5,3,10,6,2,7,11,4,9,2,8,5,12 +W,6,7,6,5,4,6,11,4,2,8,7,6,6,12,2,5 +W,7,7,10,6,10,8,8,5,5,7,5,8,9,8,9,6 +O,5,9,6,6,4,8,6,8,4,7,4,8,3,8,3,8 +Z,3,9,4,6,3,7,7,3,12,9,6,8,0,8,8,8 +Y,6,6,5,9,4,7,7,4,3,6,11,6,4,11,6,6 +Z,1,0,2,1,0,7,7,2,10,8,6,8,0,8,6,8 +W,5,11,8,8,4,4,8,5,2,7,9,8,8,10,0,8 +T,2,6,4,4,1,9,15,1,5,5,11,9,0,8,0,8 +H,3,5,4,4,3,7,7,6,6,7,6,8,3,8,3,8 +D,5,10,7,8,6,7,7,8,5,7,6,5,4,8,3,7 +Z,3,7,5,5,3,8,7,2,9,11,5,10,1,9,6,10 +X,6,11,9,8,6,5,8,1,8,10,10,10,3,8,4,6 +J,1,3,2,2,1,10,6,3,6,12,4,10,0,7,1,8 +V,1,0,2,0,0,8,9,3,2,7,12,8,2,10,0,8 +H,3,7,5,5,6,7,6,5,4,6,6,8,6,8,8,10 +H,6,11,6,8,6,7,8,14,1,7,5,8,3,8,0,8 +R,7,11,9,8,9,8,6,7,5,8,6,8,7,7,6,12 +B,5,9,7,7,5,9,7,4,6,10,5,6,2,8,6,10 +X,5,9,6,8,7,9,8,2,5,8,5,6,4,7,9,8 +J,4,11,6,8,2,9,6,2,7,15,4,9,0,6,1,7 +Q,5,9,6,10,6,8,11,6,2,5,8,12,3,11,7,6 +E,4,5,4,8,3,3,7,6,10,7,6,14,0,8,7,7 +T,3,3,4,2,1,6,11,3,6,11,9,4,2,11,2,5 +U,3,3,4,2,1,6,8,6,7,7,10,9,3,10,1,8 +Q,5,7,7,10,9,9,9,5,0,6,7,10,8,14,5,11 +Q,4,5,4,6,4,8,9,5,1,7,8,11,2,9,5,8 +E,5,12,4,6,3,8,7,4,4,10,6,8,3,9,8,10 +X,5,9,8,7,4,7,8,1,8,10,7,8,3,8,4,7 +P,4,10,6,8,5,4,10,3,6,11,10,6,3,10,3,7 +C,5,10,6,7,4,5,7,6,9,7,6,13,1,8,4,9 +S,1,0,1,0,0,8,7,3,5,5,6,7,0,8,6,8 +Y,4,4,5,6,6,9,8,5,3,7,8,7,6,10,6,4 +O,5,10,7,7,5,7,8,8,5,7,7,9,3,7,4,7 +U,11,14,9,8,4,4,3,5,5,4,7,7,6,6,2,6 +E,5,11,4,6,3,6,9,4,5,10,6,8,3,8,7,9 +D,4,10,6,8,10,9,8,5,5,7,6,6,5,6,7,6 +P,3,4,5,3,2,7,10,3,4,12,4,2,1,10,2,8 +D,5,4,5,6,3,5,8,10,9,7,7,5,3,8,4,8 +X,2,5,3,3,2,7,7,3,9,6,6,8,2,8,6,8 +F,6,11,6,6,4,6,10,3,4,11,6,4,4,10,8,6 +Y,1,0,2,1,0,7,10,3,1,7,13,8,1,11,0,8 +P,9,13,9,7,6,11,6,3,4,12,4,6,5,9,6,9 +J,6,11,8,8,3,8,6,4,6,15,6,11,1,6,1,6 +D,2,3,3,2,2,10,6,3,6,10,3,6,2,8,3,9 +Q,1,2,2,2,1,8,8,5,2,8,7,10,2,9,3,9 +S,7,10,5,5,2,9,3,4,4,9,2,9,3,6,5,10 +T,6,8,6,6,4,7,11,3,8,12,9,4,2,12,3,4 +D,6,9,9,8,8,6,6,5,7,7,6,8,5,6,6,4 +U,2,1,3,2,1,6,8,6,6,6,9,9,3,9,1,7 +N,3,4,5,2,2,9,7,3,4,10,3,5,5,9,1,7 +H,1,0,2,0,0,7,8,11,1,7,6,8,2,8,0,8 +U,3,3,4,2,1,7,9,6,7,7,10,9,3,10,1,8 +W,2,1,2,2,1,7,8,4,0,7,8,8,6,10,0,8 +F,2,3,2,2,1,5,10,3,5,10,9,5,1,10,3,6 +H,5,9,6,7,5,7,8,13,1,7,6,8,3,8,0,8 +R,5,11,7,8,6,8,8,5,6,9,4,8,3,7,5,11 +O,5,9,5,7,5,7,7,7,4,9,7,8,3,8,3,8 +S,7,10,8,8,4,9,7,4,9,11,6,7,2,10,5,8 +Y,10,9,8,13,5,7,9,2,2,7,10,4,4,10,7,7 +W,6,9,8,7,12,10,7,5,2,7,7,8,11,10,3,5 +O,2,4,2,3,1,7,7,6,4,9,6,8,2,8,2,8 +G,3,4,4,6,2,7,8,8,7,5,7,8,2,7,6,11 +T,5,10,5,7,4,4,12,3,5,11,10,5,2,13,2,4 +G,1,0,2,1,0,8,6,6,4,6,5,9,1,8,5,10 +S,3,4,3,3,2,8,6,6,5,7,6,9,2,10,9,8 +E,2,0,2,1,1,5,7,5,8,7,6,12,0,8,7,9 +A,4,10,6,8,3,10,3,2,3,9,1,8,2,7,4,9 +J,1,3,2,2,1,10,6,2,5,12,4,9,0,7,0,7 +N,5,7,7,5,4,7,9,2,5,10,5,6,5,9,1,7 +B,3,2,3,3,3,7,7,5,5,6,6,6,2,8,6,9 +R,4,9,6,6,6,6,7,3,5,6,5,9,6,10,7,5 +G,4,6,5,4,6,8,5,4,3,7,6,10,6,8,4,10 +T,2,5,3,3,1,8,12,2,7,6,11,7,1,11,1,7 +C,5,10,6,8,2,6,6,7,11,9,5,14,1,9,4,8 +E,4,8,6,6,6,7,7,5,8,7,7,9,3,8,6,9 +U,4,8,6,6,5,7,7,8,5,6,6,10,4,8,5,6 +I,4,10,7,8,8,10,6,2,4,8,4,4,3,8,5,7 +P,3,2,4,3,2,5,10,4,4,10,8,4,1,10,3,6 +C,7,10,7,7,5,4,8,5,7,12,9,12,2,10,4,6 +C,7,10,7,8,4,3,8,6,7,12,11,12,2,9,2,7 +P,3,6,5,4,3,6,11,3,5,13,6,4,0,10,2,8 +A,1,1,2,2,1,7,3,2,1,6,2,8,1,6,1,7 +G,3,5,4,7,2,7,6,8,9,8,4,13,1,9,5,10 +H,4,7,5,5,4,8,7,6,6,7,6,9,6,8,3,8 +N,4,5,5,4,3,7,8,5,5,8,7,7,7,9,3,5 +W,6,6,6,4,4,3,11,2,3,10,10,8,7,11,1,7 +W,5,9,7,7,8,8,8,6,3,6,8,8,6,7,4,7 +N,3,2,4,3,3,7,8,5,4,7,6,6,5,9,2,6 +S,5,8,6,6,3,9,7,4,8,11,4,8,2,8,5,9 +F,1,0,1,0,0,4,12,4,2,11,8,6,0,8,2,8 +K,2,3,3,2,1,6,7,2,6,10,7,10,3,8,2,8 +B,4,8,6,6,4,8,8,4,7,10,5,6,2,8,6,10 +Y,2,2,4,3,2,6,10,1,7,8,12,8,2,11,2,7 +E,7,9,9,8,9,7,8,5,5,7,7,10,8,9,10,9 +Z,6,11,8,8,8,10,9,5,4,7,5,7,3,8,9,5 +X,4,8,6,6,4,8,7,3,8,5,6,6,3,8,6,7 +O,5,11,5,9,6,8,7,8,3,9,6,7,3,8,3,8 +V,4,11,5,8,3,5,11,3,4,9,12,9,2,10,1,8 +R,3,6,4,4,3,10,7,3,5,10,3,7,3,7,3,11 +L,3,7,4,5,3,7,4,1,7,8,2,10,0,7,2,8 +V,6,8,6,6,3,3,12,4,4,10,12,7,2,10,1,8 +H,5,8,7,6,8,7,6,5,5,6,6,7,8,7,8,9 +P,2,4,3,3,2,9,8,3,4,12,4,3,1,10,3,9 +L,1,3,2,1,1,6,4,1,7,8,3,10,0,7,2,8 +Q,3,5,3,6,3,8,8,5,2,8,8,11,2,9,5,8 +D,3,2,4,3,3,7,7,7,7,7,6,5,2,8,3,7 +V,3,6,4,4,2,8,9,4,2,7,12,8,2,10,0,8 +H,5,9,6,7,6,7,5,13,2,7,9,8,3,9,0,8 +G,7,13,6,8,5,7,6,4,3,8,6,8,4,9,9,7 +V,2,3,3,1,1,6,12,3,2,8,11,8,2,11,1,8 +P,4,6,6,4,3,7,10,4,4,12,5,3,1,10,2,8 +K,4,5,5,8,2,4,8,8,2,7,4,11,4,8,2,11 +U,6,9,6,7,4,3,8,5,7,10,9,9,3,9,2,6 +U,4,7,6,5,5,9,6,7,5,7,7,8,5,8,4,6 +Y,5,10,6,7,6,9,5,7,5,6,9,7,3,9,9,4 +D,5,11,6,8,6,6,7,9,7,6,5,5,2,8,3,7 +F,5,11,7,8,4,6,11,2,6,13,7,4,1,10,2,7 +I,1,5,2,4,1,7,7,0,7,13,6,8,0,8,1,8 +N,2,1,2,2,1,7,9,5,4,7,6,7,4,8,1,6 +L,5,11,7,9,6,8,4,0,7,9,3,10,1,6,2,9 +N,6,10,9,8,4,3,9,4,4,11,11,10,6,7,1,8 +E,2,6,3,4,2,3,6,6,10,7,6,14,0,8,7,8 +N,5,10,7,5,3,8,7,2,4,12,8,8,5,8,0,8 +M,3,3,5,2,3,7,6,3,4,9,7,8,7,5,1,8 +B,5,7,7,5,5,8,8,4,6,10,5,6,3,8,6,10 +U,5,5,6,8,2,8,4,15,6,7,14,8,3,9,0,8 +B,5,8,7,6,5,10,5,3,7,10,4,7,3,7,6,11 +T,4,4,4,3,2,5,11,2,8,12,9,4,1,10,2,4 +G,6,8,8,7,8,8,6,6,4,7,6,10,10,10,8,9 +N,3,7,5,5,5,7,7,3,4,8,8,8,6,9,4,5 +S,3,9,4,7,4,7,7,7,5,7,7,9,2,9,8,8 +B,11,13,8,7,5,9,6,5,6,11,4,9,6,7,7,11 +O,9,13,6,7,4,5,7,7,4,10,7,8,5,9,5,7 +N,7,10,10,8,10,6,8,3,4,8,8,9,8,10,7,4 +F,4,11,6,8,4,3,11,2,7,11,10,6,1,10,3,5 +J,3,9,5,6,2,7,5,4,5,14,7,12,1,6,1,6 +L,1,4,2,3,1,7,3,1,6,8,2,10,0,7,2,8 +G,2,3,3,2,1,6,7,5,5,9,7,10,1,8,4,10 +P,5,11,6,8,7,6,7,5,4,8,7,8,8,8,6,11 +C,2,6,3,4,2,5,8,6,6,6,7,14,1,8,3,10 +E,3,5,4,3,3,7,7,5,8,6,5,8,2,8,6,9 +U,3,4,4,3,2,4,8,5,6,11,10,9,3,9,1,7 +M,5,9,8,7,6,4,7,3,4,10,10,10,8,6,3,7 +L,4,10,5,7,4,4,4,3,8,2,1,7,0,6,1,6 +A,5,12,5,6,4,11,2,4,2,11,4,11,5,4,5,10 +C,5,9,6,8,7,5,6,4,5,7,6,11,6,10,9,10 +M,5,8,6,6,3,7,7,12,2,7,9,8,8,6,0,8 +L,5,11,8,9,9,7,8,3,6,5,7,11,5,11,9,7 +M,8,10,11,7,9,5,7,3,5,9,9,9,9,7,3,8 +T,5,7,7,6,7,7,8,4,8,8,7,9,3,8,8,6 +F,2,5,4,4,1,5,13,3,5,13,7,3,0,9,2,6 +N,4,8,5,6,4,7,7,13,1,6,6,8,5,8,0,8 +J,5,9,7,7,6,7,7,5,5,8,6,7,6,7,4,7 +P,6,8,8,10,9,6,8,4,2,8,8,6,7,12,7,7 +B,8,14,7,8,6,10,7,3,6,10,4,7,6,6,7,9 +A,3,2,5,4,2,8,2,2,2,8,1,8,2,6,3,7 +G,7,12,6,6,4,8,3,4,3,7,4,4,4,7,5,8 +Z,4,9,4,6,3,7,10,3,11,8,6,7,0,8,7,7 +U,4,4,5,3,2,4,8,5,7,12,10,9,3,9,2,7 +P,9,15,7,8,4,5,11,6,2,11,6,4,5,10,4,7 +Y,4,11,5,8,3,8,11,1,3,7,12,8,1,11,0,8 +A,3,8,6,6,3,12,2,3,2,10,2,9,2,6,3,8 +T,6,11,8,8,7,7,7,7,7,5,9,10,6,7,9,4 +X,3,6,5,4,3,6,8,1,8,10,8,9,2,8,3,6 +S,4,7,4,5,3,7,8,4,7,10,5,7,2,7,4,8 +K,6,10,5,5,3,7,8,3,6,9,9,9,6,11,3,6 +Z,1,1,2,2,1,7,7,4,8,6,6,8,1,8,6,8 +P,5,9,5,6,3,5,12,9,2,9,5,4,1,10,4,8 +E,1,0,1,0,0,5,7,5,7,7,6,12,0,8,6,9 +Y,7,8,7,6,4,5,8,1,7,8,9,5,2,11,3,4 +X,3,3,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +Q,6,11,6,6,4,11,4,4,5,11,4,8,3,9,6,12 +Y,3,5,5,4,2,7,11,1,8,6,11,8,1,11,2,8 +X,3,5,5,4,2,10,7,1,8,11,3,7,2,8,3,9 +Z,7,9,7,5,4,9,4,3,8,12,5,10,3,8,6,8 +O,8,10,6,5,3,8,6,5,5,8,4,8,5,9,5,8 +Y,2,2,4,4,2,7,10,1,7,7,11,8,1,11,2,8 +G,4,8,5,6,2,7,6,7,8,6,6,9,1,8,6,11 +Z,5,9,7,7,6,10,9,6,4,7,5,8,3,8,10,7 +N,4,7,6,5,4,7,9,6,5,7,6,6,6,9,1,6 +W,7,9,7,4,3,5,10,2,2,9,10,8,8,12,0,7 +H,3,3,5,2,2,8,7,3,6,10,4,7,3,7,3,8 +X,2,0,2,1,0,7,7,6,2,7,6,8,3,8,3,8 +V,3,9,5,7,3,8,9,4,1,7,12,8,2,10,0,8 +S,4,9,6,6,7,5,8,3,1,7,6,5,3,8,9,1 +M,8,9,11,6,9,8,6,2,5,9,7,8,8,6,2,8 +Y,4,4,5,3,2,4,10,2,8,10,10,5,3,11,4,3 +S,3,4,4,6,2,9,9,6,10,5,5,5,0,7,9,7 +U,3,7,5,5,4,8,9,8,5,4,7,11,3,7,3,7 +Q,4,9,5,8,3,8,6,9,5,6,6,8,3,8,5,9 +X,4,7,6,5,3,7,8,1,8,10,7,8,2,8,3,7 +H,5,9,6,4,4,4,9,3,4,10,9,9,4,8,4,6 +V,2,1,4,2,1,6,12,2,3,8,11,8,2,11,1,8 +C,4,7,5,5,2,5,9,7,8,8,8,14,1,8,4,9 +L,1,3,2,2,1,7,4,1,7,8,2,9,0,7,2,8 +S,3,9,4,7,2,7,7,6,8,5,6,7,0,8,9,7 +L,2,7,2,5,1,0,1,5,6,0,0,7,0,8,0,8 +P,7,9,9,7,5,7,12,8,3,10,5,3,2,11,5,8 +J,0,0,1,0,0,12,4,5,3,12,4,10,0,7,0,8 +T,3,3,4,2,2,6,11,3,7,11,9,5,1,11,3,4 +T,1,0,2,0,0,7,15,2,4,7,10,8,0,8,0,8 +T,2,3,2,2,1,7,11,2,6,7,10,8,1,11,1,7 +B,4,5,5,4,4,7,7,5,6,7,6,6,2,8,6,10 +L,5,10,6,8,4,5,3,6,9,1,1,4,1,6,1,5 +I,1,4,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +P,1,3,3,2,1,8,7,4,3,11,4,5,1,9,2,9 +I,6,8,8,9,7,7,8,4,7,6,8,7,4,8,11,9 +C,3,8,4,6,2,4,8,7,9,9,9,13,1,9,4,9 +I,3,10,4,8,2,7,7,0,8,14,6,8,0,8,1,8 +L,2,3,3,5,1,0,1,5,6,0,0,7,0,8,0,8 +N,2,1,3,2,2,7,9,6,5,8,7,6,5,9,1,6 +M,4,1,5,2,3,8,6,6,4,7,7,8,8,6,3,6 +X,2,1,2,1,0,7,7,4,4,7,6,8,2,8,4,8 +A,7,11,5,6,3,10,1,3,1,10,4,12,3,4,4,8 +Q,6,10,7,9,4,8,7,8,7,6,7,9,3,8,5,9 +M,4,7,5,5,5,8,7,5,5,6,6,5,8,7,2,6 +Z,3,4,5,6,4,9,7,5,5,9,3,6,2,6,6,7 +V,6,9,4,4,2,8,10,5,4,7,10,5,4,11,3,7 +A,3,11,5,8,3,13,3,4,3,12,1,9,2,6,3,9 +L,3,10,3,7,1,0,1,5,6,0,0,7,0,8,0,8 +Y,3,11,5,8,1,5,10,3,2,9,13,8,1,11,0,8 +Q,4,4,5,6,2,9,8,8,6,5,7,10,3,8,5,9 +C,4,8,6,6,6,7,7,4,4,6,7,10,7,9,5,7 +S,3,4,4,2,2,7,8,2,7,10,7,7,1,8,5,6 +C,3,6,4,4,1,6,7,7,10,8,6,13,1,9,4,9 +N,5,9,6,6,5,7,7,9,5,6,4,5,5,8,5,11 +K,3,6,5,4,4,6,6,3,8,6,6,9,3,8,5,9 +E,9,11,6,6,3,8,7,5,7,10,6,11,2,9,8,8 +S,4,8,6,6,3,9,7,5,8,11,2,8,2,7,5,11 +S,2,4,3,3,2,8,8,7,5,8,5,7,2,8,8,8 +X,6,10,9,7,5,7,8,1,9,10,6,8,3,8,4,7 +K,4,10,4,8,4,3,7,6,3,6,5,11,3,8,2,11 +B,2,3,4,2,2,7,7,3,5,10,6,6,2,8,5,8 +F,5,11,7,8,5,9,8,1,6,13,5,5,2,9,3,9 +M,3,4,5,2,3,9,6,3,4,8,5,7,7,5,1,8 +X,4,7,6,5,3,4,9,2,7,10,11,9,3,9,3,5 +C,3,1,4,3,2,6,8,7,7,8,8,13,1,10,4,10 +E,4,6,5,4,3,6,8,4,8,12,8,9,2,9,4,6 +U,4,5,5,4,2,4,8,5,7,11,10,9,3,9,2,6 +I,6,11,7,8,5,7,7,1,7,7,6,8,0,8,4,8 +T,4,9,4,4,2,4,11,2,6,12,8,5,2,8,4,3 +A,2,4,3,3,2,10,2,2,2,9,2,9,1,6,2,8 +H,2,6,3,4,1,7,9,14,2,7,4,8,3,8,0,8 +P,5,11,8,8,5,6,11,3,6,14,7,4,0,10,3,8 +E,3,5,5,3,3,6,8,2,8,11,8,9,2,9,4,7 +D,7,15,7,9,5,9,6,5,6,12,3,7,5,7,6,10 +I,5,11,7,8,4,9,6,2,7,7,6,6,0,9,4,7 +N,5,10,5,8,5,7,7,12,1,6,6,8,6,7,1,10 +P,2,7,4,5,2,5,11,3,6,11,9,5,0,9,3,6 +T,5,9,5,6,4,5,12,4,6,11,9,4,2,12,2,4 +D,3,9,5,7,8,10,7,5,5,7,5,6,4,6,10,6 +G,4,6,6,5,5,8,10,5,2,7,7,9,6,11,7,10 +C,4,6,5,4,2,4,9,5,7,11,10,12,1,9,3,7 +Y,4,6,6,8,8,9,8,4,2,6,8,9,4,11,7,8 +D,2,1,2,1,1,7,7,6,6,7,6,5,2,8,2,7 +P,2,3,2,2,1,6,10,5,4,9,7,3,1,9,3,6 +X,2,5,4,4,2,7,7,3,9,6,6,8,2,8,6,8 +B,4,7,6,5,4,8,8,4,6,10,5,6,2,8,6,8 +F,2,2,3,3,2,6,10,4,5,10,9,5,2,9,3,6 +Z,2,5,4,4,2,7,8,2,10,12,7,7,1,8,5,6 +P,6,9,9,7,4,5,15,6,2,12,5,1,0,9,4,7 +J,3,9,4,7,3,11,6,3,6,12,2,8,1,6,2,6 +B,3,9,4,7,3,6,7,10,6,7,6,7,2,8,9,10 +C,3,8,4,6,2,5,7,6,8,8,6,12,1,9,4,9 +B,4,9,4,4,3,9,6,3,4,9,5,8,6,8,7,9 +U,3,3,3,5,2,7,6,13,5,7,14,8,3,9,0,8 +O,6,9,7,7,6,7,8,7,5,9,7,9,3,8,4,7 +M,6,9,8,6,8,6,6,6,5,7,7,11,11,5,2,9 +D,3,10,5,8,7,8,9,5,4,8,7,5,4,9,11,6 +D,5,6,6,8,3,5,7,11,9,6,5,5,3,8,4,8 +P,2,3,4,1,1,8,9,3,4,12,4,3,1,9,2,9 +P,3,5,5,4,2,7,10,5,3,11,4,3,1,10,3,8 +Y,5,9,5,7,3,3,11,3,6,11,12,6,1,11,2,6 +F,2,5,3,3,2,5,10,3,5,10,9,6,2,10,3,6 +I,1,6,2,4,1,7,7,0,8,7,6,8,0,8,3,8 +B,3,2,4,4,4,7,7,5,5,7,6,6,2,8,6,10 +F,5,10,6,8,7,6,10,6,4,8,5,9,3,10,8,11 +U,3,7,5,5,4,7,8,8,5,5,6,11,3,8,5,6 +B,3,7,4,5,3,6,5,9,7,6,7,7,2,9,8,9 +A,9,15,9,8,6,11,2,5,2,11,4,11,7,2,5,11 +Z,4,8,6,6,6,8,8,2,8,7,6,7,0,8,9,8 +E,5,11,6,8,7,7,7,6,3,7,6,9,4,8,8,8 +E,1,0,1,1,1,5,7,5,8,7,6,12,0,8,6,9 +A,1,0,2,0,0,7,4,2,0,7,2,8,1,6,1,8 +M,6,7,9,5,5,8,6,2,5,9,6,7,8,6,2,8 +J,5,9,6,7,4,9,4,7,6,8,6,6,2,7,4,6 +T,4,4,4,3,2,6,12,3,7,11,9,4,1,11,2,4 +W,8,10,8,8,6,5,10,3,3,9,8,7,8,11,3,6 +K,4,7,6,5,5,6,6,4,6,6,5,8,7,7,7,9 +M,5,11,7,8,8,9,7,5,4,6,7,5,9,7,3,5 +N,5,8,7,7,7,8,8,5,5,8,5,6,6,10,7,2 +W,3,3,5,5,3,6,8,4,1,7,8,8,8,9,0,8 +D,3,9,5,7,4,8,7,7,7,7,7,4,3,8,3,7 +H,4,6,6,8,6,9,5,3,2,7,5,7,4,8,6,9 +H,3,4,4,3,3,7,7,6,6,7,6,8,3,8,3,8 +M,8,10,11,8,9,12,6,2,5,9,3,6,10,4,2,8 +R,5,9,5,4,4,7,8,3,5,8,4,9,5,7,6,7 +B,6,10,8,8,7,9,7,2,7,10,4,7,4,7,5,10 +O,6,10,7,8,6,8,6,8,4,9,5,6,5,8,4,9 +R,5,11,7,8,7,9,8,3,5,10,4,7,5,5,4,10 +F,5,9,8,7,5,9,8,1,6,13,5,5,3,9,3,9 +U,4,7,6,5,7,8,7,4,4,6,7,8,7,10,5,7 +Z,2,4,4,2,2,7,7,2,9,12,6,8,1,8,5,7 +H,5,11,7,8,10,8,7,4,3,6,6,7,7,8,9,8 +P,4,8,5,6,4,7,9,8,4,8,6,3,3,10,3,6 +H,2,3,4,1,2,7,7,3,5,10,6,8,3,8,3,8 +T,3,7,4,5,2,5,14,1,5,9,10,7,0,8,0,8 +B,1,0,1,0,1,7,8,6,4,7,6,7,1,8,6,9 +O,3,2,4,3,3,8,7,8,5,7,6,8,2,8,3,8 +D,4,8,6,6,8,9,7,4,7,7,6,5,5,5,7,7 +S,2,4,3,3,1,9,7,3,6,10,6,7,1,9,5,8 +C,3,8,4,6,2,6,8,7,10,6,7,12,1,7,4,9 +N,2,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +D,2,4,3,3,2,9,6,3,5,10,4,6,3,7,2,8 +A,2,5,4,4,2,8,3,2,2,8,2,8,2,6,2,7 +S,4,8,5,6,4,8,6,7,7,7,8,8,2,10,9,8 +K,3,4,4,5,1,4,7,8,2,7,5,11,4,8,2,11 +W,4,7,5,5,3,5,8,5,1,7,8,8,8,9,0,8 +R,4,6,7,5,7,9,6,4,4,8,5,7,6,9,6,7 +H,4,5,5,7,3,7,7,15,0,7,6,8,3,8,0,8 +U,4,8,6,6,8,9,7,4,5,6,8,8,8,8,6,6 +N,5,9,7,6,5,9,8,6,6,6,5,4,7,11,3,5 +X,5,7,8,5,3,9,6,2,8,11,2,7,3,8,4,9 +O,5,8,6,6,4,8,6,8,5,10,5,8,3,8,3,8 +L,2,4,4,3,1,6,4,1,8,8,2,10,0,7,2,8 +B,3,5,4,4,5,7,7,5,4,7,6,8,6,9,6,9 +E,4,7,6,5,4,10,6,2,8,11,3,9,2,8,5,12 +B,4,9,5,6,4,6,8,9,7,7,6,7,2,8,9,9 +V,4,7,6,6,6,6,9,5,6,8,6,8,6,9,7,6 +N,4,6,5,4,3,7,9,2,4,9,7,7,5,8,1,8 +X,3,6,4,4,2,7,7,4,4,7,6,7,3,8,4,8 +X,2,3,3,2,1,9,7,3,8,6,6,6,2,8,5,8 +B,2,3,4,2,2,8,7,3,5,10,5,7,2,8,4,9 +O,4,7,5,5,3,7,8,8,5,10,6,6,3,8,3,8 +D,3,5,4,4,3,7,7,7,7,6,6,5,2,8,3,7 +S,6,11,7,8,4,8,7,4,8,11,5,7,2,8,5,8 +I,1,4,2,3,1,7,8,0,7,13,6,8,0,8,1,7 +N,5,10,8,8,5,5,10,3,4,9,9,8,5,9,1,7 +S,3,8,5,6,6,6,7,3,2,7,6,6,2,8,10,1 +U,6,11,8,8,5,8,9,4,6,5,8,9,6,9,2,8 +T,3,8,5,6,3,7,12,4,6,7,11,8,2,12,1,8 +G,4,8,5,6,4,7,6,7,7,7,4,11,1,8,5,11 +J,3,9,4,7,4,10,6,2,5,9,4,6,3,7,7,8 +W,3,2,5,3,3,5,11,3,2,8,9,9,7,11,0,8 +S,2,3,3,2,1,7,8,2,7,11,7,8,1,9,4,6 +S,5,11,6,9,5,8,7,8,6,8,6,7,2,8,9,8 +M,4,9,5,6,3,7,7,12,1,7,9,8,8,6,0,8 +I,2,7,3,5,2,6,8,0,7,13,7,8,0,8,1,7 +E,1,0,1,1,0,4,7,5,7,7,6,12,0,8,6,10 +H,4,10,4,7,3,7,6,15,2,7,8,8,3,8,0,8 +Q,4,10,5,9,3,8,7,8,6,6,7,8,3,8,6,9 +T,5,7,5,5,3,7,10,2,7,11,9,5,1,11,3,5 +H,3,5,6,4,4,8,8,3,6,10,6,8,3,8,3,8 +A,3,2,6,4,2,8,2,2,2,6,2,7,3,7,3,7 +Z,3,2,4,4,3,7,7,5,9,6,6,8,1,8,7,8 +R,4,6,6,4,4,10,7,3,6,11,2,7,3,6,3,10 +M,4,5,7,3,4,8,6,3,4,9,6,8,8,6,2,8 +I,2,5,3,4,1,7,7,0,7,13,6,8,0,8,1,8 +C,5,8,5,6,3,5,7,5,6,11,8,13,2,9,4,8 +M,4,4,5,6,3,7,7,12,1,7,9,8,8,6,0,8 +K,3,4,4,3,3,6,7,4,8,7,6,11,3,8,5,10 +R,4,8,6,6,5,9,7,3,5,10,3,7,3,6,4,10 +Y,4,10,5,7,1,7,11,2,3,7,12,8,1,11,0,8 +Q,4,8,5,7,3,8,7,8,6,6,7,8,3,8,5,9 +P,2,4,4,2,2,8,9,4,3,12,4,4,1,10,2,9 +W,8,12,8,6,5,2,9,2,3,9,11,9,8,11,1,5 +J,3,10,4,8,2,14,3,5,4,13,2,10,0,7,0,8 +E,6,10,9,8,7,10,6,2,7,11,5,8,6,8,6,11 +V,6,10,6,8,4,2,11,2,3,9,11,8,3,11,1,7 +F,4,7,5,5,3,5,11,4,6,11,10,5,2,10,3,5 +I,3,8,4,6,2,7,9,0,8,14,6,6,0,9,1,7 +N,4,8,4,6,2,7,7,14,2,4,6,8,6,8,0,8 +K,5,10,7,7,5,5,6,5,8,6,6,12,4,7,6,11 +I,3,10,4,7,3,8,7,0,7,13,6,8,0,8,1,8 +Z,3,4,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +I,1,3,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +Y,6,9,5,5,3,7,7,3,5,9,7,6,3,10,4,5 +V,6,10,6,7,3,3,11,3,4,10,12,8,2,10,1,8 +L,3,7,4,5,2,4,4,3,8,2,1,7,0,7,1,6 +U,3,2,3,4,1,8,5,12,5,6,14,8,3,9,0,8 +C,4,10,5,8,2,5,7,7,10,6,6,13,1,7,4,9 +O,4,9,4,7,4,8,5,7,4,10,5,10,4,8,4,7 +L,6,15,6,8,4,5,7,4,6,12,9,12,3,8,7,7 +B,6,9,8,6,5,10,6,3,8,11,3,7,2,8,5,12 +A,4,7,7,5,4,6,5,2,3,4,2,6,4,6,4,5 +S,6,13,5,7,3,11,2,1,5,10,1,8,2,8,4,12 +J,4,11,6,8,3,8,5,5,6,14,7,12,1,6,1,7 +A,2,8,4,5,2,7,6,3,1,6,0,8,2,7,2,7 +I,1,2,1,3,1,7,7,1,8,7,6,8,0,8,3,8 +T,6,8,6,6,4,5,11,3,7,11,9,5,2,12,2,4 +P,4,7,5,5,3,5,12,5,5,11,9,3,0,9,4,6 +G,5,10,7,8,8,9,6,5,2,6,6,10,8,8,5,10 +J,3,6,4,4,1,10,4,6,5,15,5,12,0,7,1,6 +B,6,13,6,7,6,7,7,4,4,9,7,8,7,6,9,8 +B,2,4,3,3,2,8,7,3,5,9,6,7,2,8,4,9 +I,2,10,2,7,2,7,7,0,8,7,6,8,0,8,3,8 +N,3,8,5,6,4,7,8,6,5,7,6,7,5,9,1,6 +B,5,8,7,6,7,8,7,6,6,9,6,6,5,10,7,9 +X,5,11,7,8,6,7,6,3,9,5,7,10,4,7,8,8 +Z,3,9,4,6,3,7,7,3,12,9,6,8,0,8,7,8 +U,6,10,5,5,4,8,6,4,4,7,7,7,5,7,3,7 +P,3,4,5,3,2,8,9,3,5,13,4,3,2,8,3,7 +R,7,9,6,5,4,7,7,5,5,9,4,9,6,5,7,11 +K,3,3,3,4,1,3,6,7,3,7,7,11,3,8,2,10 +A,2,1,4,3,2,8,2,2,1,7,2,8,2,6,2,7 +N,5,7,6,6,6,8,9,4,4,7,4,7,6,8,5,5 +N,5,9,7,6,4,8,8,7,6,7,6,4,6,9,2,6 +P,4,11,4,8,2,3,14,8,2,12,7,3,0,10,4,8 +Q,3,5,5,5,4,7,4,4,4,5,3,7,3,7,4,8 +P,7,12,6,7,4,7,10,3,5,13,5,3,3,11,5,6 +U,7,8,7,6,5,4,8,5,7,9,8,9,5,9,4,4 +B,8,11,7,6,6,7,8,3,6,9,5,7,8,4,8,7 +M,4,4,5,6,3,7,7,12,1,7,9,8,8,6,0,8 +O,4,8,4,6,4,7,8,7,4,10,7,6,3,9,3,7 +T,1,1,2,1,0,7,14,1,5,7,11,8,0,8,0,8 +A,3,7,5,5,5,8,8,7,4,6,6,8,2,8,6,5 +D,4,10,4,8,3,5,6,10,8,5,4,5,3,8,4,8 +I,1,5,1,4,1,7,7,1,8,7,6,8,0,8,3,8 +S,8,9,10,8,12,7,8,5,5,7,7,7,5,10,11,10 +G,2,3,3,2,1,6,7,5,4,9,7,10,2,9,4,10 +C,6,10,5,5,3,7,8,4,3,9,8,9,4,9,9,11 +A,8,13,7,7,4,11,4,3,2,8,4,10,5,5,4,9 +E,3,5,4,4,3,7,7,5,8,7,6,9,2,8,6,9 +B,6,9,9,7,6,9,7,3,7,10,4,6,4,6,6,9 +R,4,10,6,8,5,7,9,5,6,7,6,9,4,6,6,9 +E,4,7,5,5,4,6,7,3,7,11,8,9,3,8,4,8 +P,4,12,4,8,3,4,11,10,3,9,6,4,2,10,4,8 +K,10,14,9,8,4,8,7,3,7,9,5,7,6,10,4,7 +R,3,8,4,5,2,6,10,9,4,7,4,8,3,7,5,11 +O,3,4,4,3,2,7,7,6,4,9,6,8,2,8,2,8 +Y,5,5,6,7,6,9,11,5,4,6,7,7,5,10,7,5 +O,2,1,2,1,1,8,7,7,5,7,6,8,2,8,3,8 +X,5,10,7,8,4,4,9,2,8,10,12,9,3,9,4,5 +Y,8,10,7,6,4,8,5,3,5,8,7,6,5,9,5,5 +X,4,9,6,7,5,7,7,3,8,5,6,8,3,8,6,7 +R,5,10,7,8,9,6,8,3,4,6,6,9,8,9,9,7 +E,2,3,4,2,2,7,8,2,8,11,6,9,2,9,4,8 +Z,6,9,8,7,5,7,7,2,9,12,6,8,1,9,6,8 +Z,5,10,6,8,4,9,5,3,10,11,3,10,1,8,6,10 +U,4,7,5,5,2,7,3,14,6,7,13,8,3,9,0,8 +G,3,5,4,4,2,7,6,6,5,6,6,9,2,9,4,9 +Z,6,10,9,7,5,7,8,3,10,12,7,6,1,8,6,7 +J,7,13,6,10,4,7,10,2,3,13,6,5,2,9,8,8 +D,9,14,8,8,7,9,6,3,7,10,4,7,6,6,9,7 +Q,8,10,11,9,10,7,4,4,5,6,4,8,5,3,7,7 +E,9,15,6,9,5,7,7,4,4,11,5,9,3,9,8,11 +I,2,7,2,5,1,7,7,0,7,13,6,8,0,8,1,8 +M,3,4,4,3,3,8,6,6,3,7,7,8,7,5,2,7 +W,3,6,5,4,2,10,8,5,1,7,9,8,7,10,0,8 +S,2,3,2,1,1,8,7,6,4,8,6,8,2,8,8,8 +P,2,6,3,4,2,3,14,6,2,12,7,3,0,9,3,8 +C,3,7,4,5,2,5,8,7,8,13,9,10,2,10,3,7 +T,6,7,6,5,3,4,13,4,6,12,9,4,1,11,2,4 +R,3,1,3,2,2,7,8,5,5,6,5,7,2,6,4,8 +H,5,9,7,7,6,5,8,3,6,10,9,9,3,8,3,5 +J,7,11,5,15,4,8,8,3,3,13,4,5,3,8,7,10 +E,3,4,5,3,2,7,8,2,8,11,6,9,2,8,4,8 +P,2,1,2,1,1,5,10,8,3,9,6,5,1,9,3,8 +Y,1,3,2,2,1,6,10,1,5,7,11,9,1,11,1,8 +K,7,11,9,8,10,7,7,5,4,7,6,7,5,5,10,11 +W,4,6,6,4,3,7,8,4,1,7,8,8,8,9,0,8 +U,2,5,4,4,3,7,7,3,3,6,6,9,4,8,1,8 +T,3,3,4,4,2,7,12,3,6,7,11,8,2,11,1,8 +E,3,2,3,3,3,7,7,5,7,7,6,9,2,8,5,10 +V,4,8,6,6,3,7,9,4,2,7,13,8,3,10,0,8 +N,6,9,8,7,5,8,9,2,5,9,5,6,6,9,1,7 +C,5,9,6,6,4,7,7,8,6,6,6,11,4,8,4,9 +N,5,8,8,6,7,6,8,3,4,8,7,9,7,8,5,5 +J,0,0,1,0,0,12,4,5,3,12,5,11,0,7,0,8 +U,4,8,5,6,2,8,5,13,5,6,15,8,3,9,0,8 +K,10,15,10,8,6,5,8,3,6,10,9,10,6,9,4,7 +X,4,6,7,4,4,7,7,1,8,10,6,8,2,8,3,8 +E,5,11,7,8,6,7,8,2,8,11,7,8,3,8,4,8 +A,2,3,3,2,1,9,2,2,1,8,2,10,1,6,2,8 +B,2,1,3,2,2,7,7,5,5,6,6,6,2,8,6,9 +X,5,10,8,8,5,7,7,4,9,6,6,10,3,8,7,8 +V,2,7,4,5,1,9,8,4,2,6,13,8,3,10,0,8 +I,1,9,1,6,1,7,7,0,8,7,6,8,0,8,3,8 +Y,1,0,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +I,3,11,4,8,3,8,6,0,7,13,6,9,0,7,2,8 +K,5,9,7,7,6,9,6,1,6,9,3,8,3,7,4,10 +P,2,7,3,4,1,3,13,8,2,11,7,3,0,10,3,8 +P,7,10,9,8,7,6,8,8,5,8,7,9,3,9,8,9 +G,6,8,6,6,5,6,7,6,5,9,7,10,2,8,5,9 +K,3,5,6,4,3,6,7,1,7,10,7,10,3,8,3,8 +L,2,4,4,3,2,7,4,1,8,8,2,10,0,7,2,8 +M,10,14,11,8,5,13,1,5,3,13,1,9,6,3,1,9 +W,7,9,7,4,3,6,10,2,2,8,10,7,8,12,1,7 +W,2,1,3,2,1,8,8,4,0,7,8,8,6,10,0,8 +U,5,9,6,7,4,4,8,5,7,9,8,9,3,9,2,6 +L,2,6,3,4,2,5,4,3,7,6,2,8,1,6,2,7 +S,8,15,6,8,3,6,3,4,4,6,1,7,3,7,6,7 +X,2,1,2,1,0,7,7,4,4,7,6,8,2,8,4,8 +C,4,8,5,6,6,7,6,3,4,8,6,11,5,9,3,8 +O,3,6,4,4,2,7,8,8,7,7,7,8,3,8,4,8 +E,5,10,8,7,6,6,8,2,8,11,7,9,2,9,4,7 +F,4,7,6,5,5,8,7,6,4,7,6,8,4,10,8,11 +P,11,15,9,8,4,7,9,6,5,13,3,4,5,10,4,8 +J,1,2,2,4,1,11,6,1,6,11,3,7,0,7,1,7 +E,2,4,2,2,2,7,7,5,7,7,5,9,2,8,5,10 +F,4,6,6,4,3,5,12,4,5,13,7,4,2,10,2,6 +E,3,7,5,5,5,7,7,3,6,7,7,10,4,10,7,8 +R,3,5,5,4,3,9,7,4,5,10,4,6,3,7,4,10 +D,3,9,5,7,8,9,6,5,5,7,5,5,4,7,11,6 +V,3,6,5,4,2,7,9,4,2,6,13,8,3,10,0,8 +T,2,5,3,4,2,7,11,2,7,7,11,8,1,11,1,8 +S,2,6,4,4,4,6,6,3,2,7,5,7,2,8,9,3 +J,3,5,5,4,2,10,5,3,6,14,4,10,0,7,0,8 +K,4,5,4,7,2,3,7,7,2,7,5,11,3,8,3,10 +W,5,10,8,8,11,9,8,5,2,6,7,8,11,10,4,5 +H,3,7,5,5,4,8,7,6,6,7,6,6,3,8,3,7 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +W,8,9,8,7,8,7,11,4,3,8,6,6,10,12,4,5 +S,5,11,6,8,6,7,5,8,6,6,8,9,2,11,9,8 +K,4,4,7,3,3,8,7,2,7,10,4,8,5,9,4,9 +L,3,6,3,4,1,0,1,6,6,0,0,6,0,8,0,8 +B,4,8,6,6,5,7,9,5,5,9,6,5,3,7,8,7 +Y,3,9,5,6,1,8,10,2,3,7,12,8,1,11,0,8 +D,6,14,6,8,4,8,6,5,6,8,4,7,4,7,6,9 +B,2,1,3,1,2,7,7,4,5,7,6,6,1,8,5,9 +P,7,13,6,7,4,10,7,4,5,13,3,4,4,10,6,8 +G,3,4,4,3,2,7,6,5,5,9,7,10,2,9,4,9 +L,5,11,6,8,5,5,6,0,9,4,3,8,3,7,2,5 +V,10,14,8,8,5,8,8,7,5,6,10,7,7,13,3,7 +O,5,10,6,8,5,7,7,8,7,6,3,6,3,8,5,9 +W,5,6,7,6,8,6,8,6,5,6,6,8,7,8,8,10 +Q,5,8,7,6,6,8,5,7,4,6,7,7,4,6,7,8 +W,3,3,3,1,2,5,10,3,2,9,8,7,5,11,1,6 +U,6,10,9,8,5,4,9,7,9,9,11,10,3,9,1,7 +M,5,7,7,6,9,7,8,4,3,7,6,7,10,8,5,5 +V,4,10,6,8,4,8,11,2,3,4,10,9,3,11,1,8 +U,3,4,4,3,2,5,8,5,7,9,8,9,3,10,2,5 +F,3,10,3,7,1,0,13,4,4,12,10,6,0,8,2,6 +F,1,3,2,2,1,6,10,2,4,13,7,6,1,9,1,8 +W,3,7,6,5,4,7,11,2,2,6,9,8,7,11,1,8 +M,10,13,10,8,5,10,11,7,4,4,6,9,8,12,3,7 +R,3,7,3,4,2,5,10,8,4,7,4,8,3,7,5,11 +D,4,6,5,4,3,10,5,2,6,11,3,8,3,8,3,9 +D,4,5,5,4,4,8,7,4,6,6,4,8,3,7,5,6 +M,6,7,8,6,8,8,8,4,4,7,6,7,10,8,5,5 +P,5,11,6,8,3,3,14,8,1,11,7,3,1,10,4,8 +T,8,14,7,8,4,8,8,3,7,11,6,7,2,9,5,6 +C,2,3,3,1,1,5,9,4,6,12,8,10,1,9,2,7 +I,3,8,4,6,2,7,7,0,8,14,6,8,0,8,1,8 +L,2,5,3,4,2,6,5,1,8,7,2,10,0,7,3,8 +X,5,7,7,5,3,8,8,1,8,10,4,7,3,8,3,7 +P,3,5,5,4,3,8,9,3,4,12,4,4,3,8,4,8 +I,2,9,3,7,2,7,7,0,8,13,6,8,0,8,1,8 +U,3,3,4,2,1,7,9,6,7,7,10,9,3,10,1,8 +V,7,10,9,8,6,6,12,2,2,7,10,8,7,10,7,8 +W,11,13,11,7,5,10,11,6,3,4,10,7,10,12,1,6 +P,3,2,4,4,3,6,9,4,5,9,7,4,4,10,3,7 +K,5,8,7,6,5,6,7,1,6,10,7,10,3,8,3,8 +P,1,1,2,1,1,5,11,8,2,9,6,4,1,9,3,8 +I,1,1,1,1,0,7,7,2,7,7,6,9,0,8,2,8 +E,4,9,4,7,4,3,7,5,9,7,7,13,0,8,7,9 +Q,1,2,2,2,1,7,8,4,2,7,8,9,2,9,3,8 +O,4,5,5,4,3,7,7,8,5,7,6,8,2,8,3,8 +E,3,7,4,5,4,7,7,4,7,7,6,8,3,8,5,10 +P,5,5,7,8,8,9,8,3,3,5,8,7,6,11,7,5 +E,3,8,5,6,5,6,7,3,6,7,7,11,4,10,9,8 +K,5,9,6,6,6,6,7,4,7,6,6,10,3,8,5,9 +Q,3,3,4,5,4,8,8,6,2,5,7,9,3,8,5,10 +Q,8,14,7,8,4,8,6,4,10,10,3,10,3,6,9,9 +Y,7,10,7,8,4,3,10,2,7,11,11,7,1,11,3,5 +B,3,7,5,5,5,8,7,7,6,6,6,6,2,8,6,9 +Y,2,1,3,1,0,7,10,3,1,7,12,8,1,11,0,8 +B,5,11,6,8,7,7,9,6,5,7,5,6,3,8,6,8 +C,9,13,6,7,3,6,10,6,8,11,8,8,2,8,5,9 +G,4,9,5,7,3,5,7,6,5,10,8,10,2,8,5,9 +H,7,11,9,8,8,8,7,2,6,10,5,8,4,9,4,8 +F,5,11,5,8,4,1,13,4,3,12,10,6,0,8,2,6 +T,5,9,5,6,4,6,12,4,5,11,9,5,3,12,2,4 +V,6,7,8,6,8,8,7,4,4,7,6,8,7,9,8,4 +E,8,10,5,6,3,6,10,5,8,10,7,9,1,8,7,7 +D,5,11,6,8,5,9,7,5,7,10,4,5,3,8,3,8 +I,2,9,5,7,5,10,6,2,4,9,5,5,3,8,5,7 +X,4,10,6,8,4,7,8,3,9,6,5,6,4,10,8,6 +U,5,11,8,8,11,9,6,4,4,6,7,7,11,8,5,7 +R,3,3,3,4,2,5,10,8,3,7,4,8,2,7,6,11 +R,4,9,5,7,4,6,8,5,6,6,5,9,3,6,6,9 +S,1,1,2,2,0,8,8,4,7,5,6,7,0,8,7,8 +B,3,5,5,3,4,9,7,3,6,10,5,6,2,8,5,10 +Z,5,11,8,8,9,8,7,3,8,7,6,7,1,8,10,9 +C,6,6,7,8,3,5,6,7,11,7,5,14,1,9,4,8 +G,4,8,6,6,6,7,9,6,3,6,6,9,4,7,7,7 +L,2,3,4,2,1,7,3,1,6,8,2,10,1,6,3,8 +G,5,8,6,6,4,6,6,6,5,6,6,10,2,9,4,8 +Z,7,11,7,6,4,9,5,3,8,11,4,9,3,6,7,9 +M,4,10,5,8,4,7,7,12,2,7,9,8,8,6,0,8 +L,1,0,1,0,0,2,1,5,4,1,2,5,0,8,0,8 +T,5,10,5,7,3,5,13,3,7,12,9,3,1,11,2,4 +C,3,6,5,4,3,7,7,7,6,8,6,11,3,9,4,8 +R,3,8,5,6,4,6,8,6,6,6,4,8,3,7,5,8 +V,2,1,3,1,0,7,9,4,2,7,13,8,2,10,0,8 +W,10,10,9,8,9,4,11,3,3,9,8,7,8,12,2,6 +Y,3,4,5,5,1,7,11,2,2,9,12,7,1,10,0,8 +X,3,5,4,3,2,7,7,3,9,6,6,8,2,8,6,8 +X,7,9,6,5,3,6,8,2,9,10,9,9,4,8,4,6 +Y,7,11,8,8,6,5,8,1,7,8,9,5,5,12,6,3 +O,3,8,4,6,4,7,7,8,4,7,5,8,3,8,2,7 +C,7,10,7,7,4,3,8,5,7,11,10,13,1,9,3,7 +Z,4,3,4,5,2,7,7,4,14,9,6,8,0,8,8,8 +M,6,11,8,8,11,7,8,6,4,7,6,8,6,9,8,8 +E,3,6,4,4,3,6,7,6,8,6,4,9,3,8,6,9 +Z,4,9,6,7,6,7,8,3,7,7,6,8,1,9,12,5 +E,5,8,7,7,7,5,10,4,6,8,7,10,4,11,7,7 +Q,4,5,6,7,6,9,9,5,0,5,7,10,6,13,5,12 +R,4,9,5,6,3,5,12,8,4,7,2,9,3,7,6,11 +L,4,9,6,6,4,5,5,2,9,4,2,7,3,7,2,5 +O,1,3,2,2,1,8,7,5,3,9,6,8,2,8,2,8 +D,3,5,5,3,3,9,6,4,7,10,4,6,2,8,3,8 +S,4,11,5,8,3,7,7,6,10,5,6,10,0,9,9,8 +H,5,10,6,7,3,7,7,15,0,7,7,8,3,8,0,8 +G,4,8,4,6,3,6,6,6,7,11,7,12,2,10,3,10 +W,1,0,2,0,0,7,8,3,0,7,8,8,5,9,0,8 +R,6,10,9,8,10,8,8,7,3,8,5,6,5,8,7,11 +U,4,9,5,7,3,6,8,7,7,7,10,9,3,9,1,8 +E,1,1,1,2,1,4,7,5,8,7,6,13,0,8,6,9 +M,3,2,5,4,4,9,6,6,4,6,7,6,7,6,2,5 +I,1,3,2,2,0,7,7,0,7,13,6,8,0,8,1,8 +D,4,8,5,6,3,8,7,8,7,7,6,2,3,8,4,8 +Q,6,9,6,11,8,7,8,6,3,8,9,9,5,9,8,8 +O,5,10,6,8,4,8,7,8,5,10,6,8,3,8,3,8 +E,3,8,3,6,2,3,7,6,10,7,6,14,0,8,7,8 +M,4,8,4,6,3,8,7,12,1,6,9,8,8,6,0,8 +P,3,7,4,4,2,4,12,8,2,10,6,4,1,10,4,8 +T,2,7,3,5,1,6,14,0,6,8,11,8,0,8,0,8 +U,3,1,4,1,1,7,8,6,8,7,10,8,3,10,1,8 +W,5,10,8,8,7,4,11,2,2,9,9,9,8,12,2,8 +S,7,11,6,6,3,7,8,3,5,13,7,8,2,8,3,7 +E,2,3,3,2,2,7,7,2,8,11,7,9,1,8,4,8 +M,4,7,6,5,6,7,8,6,4,7,6,8,5,9,7,7 +R,2,4,3,2,2,7,8,4,5,6,5,7,2,6,5,8 +C,4,9,5,6,2,5,7,7,10,6,6,13,1,7,4,9 +G,5,11,7,8,5,5,6,6,7,6,6,8,4,7,4,7 +E,4,7,6,5,5,8,6,5,3,7,6,10,4,8,7,9 +E,2,3,4,2,2,7,7,2,8,11,6,9,2,8,4,8 +X,6,8,9,6,4,6,8,2,9,10,9,9,3,8,4,6 +Q,4,5,6,5,5,7,4,4,5,7,5,8,5,4,7,7 +R,4,5,5,7,3,5,10,9,4,7,4,8,3,7,6,11 +J,2,6,2,4,1,13,4,5,4,13,2,9,0,7,0,8 +O,7,11,10,8,12,8,8,6,2,7,7,8,10,9,7,11 +L,3,5,4,3,2,4,4,4,8,2,1,6,1,7,1,6 +Z,2,4,4,3,2,7,7,2,9,11,6,8,1,8,5,8 +E,5,9,4,4,2,7,8,4,7,10,5,11,1,8,7,8 +X,4,10,5,7,2,7,7,5,4,7,6,8,3,8,4,8 +U,4,7,6,6,6,7,7,5,3,6,7,8,4,7,2,7 +A,1,0,2,0,0,7,3,2,0,7,2,8,2,6,1,8 +R,3,3,3,4,2,6,11,8,3,7,3,9,2,7,5,11 +W,2,0,2,0,1,7,8,4,0,7,8,8,6,9,0,8 +H,6,10,6,5,4,7,8,3,5,10,5,8,6,6,5,7 +N,4,8,6,6,4,7,9,2,4,9,5,6,5,9,1,7 +V,6,11,5,8,3,4,11,2,4,9,11,7,3,9,1,8 +B,5,11,7,8,11,8,9,5,3,6,7,7,7,11,12,9 +L,2,4,4,3,2,7,4,1,8,8,2,10,0,7,2,8 +D,2,0,2,1,1,6,7,8,7,6,6,6,2,8,3,8 +E,3,5,6,3,3,8,7,2,9,11,5,9,3,7,5,8 +A,2,7,4,5,2,11,3,3,2,10,2,9,2,6,2,8 +L,2,5,3,4,2,4,4,4,7,2,1,6,0,7,1,6 +A,3,10,6,8,5,10,4,1,2,8,3,9,4,4,3,7 +C,3,10,5,7,3,4,9,6,6,6,8,14,1,8,4,10 +J,2,3,3,5,1,11,2,10,3,13,8,13,1,6,0,8 +X,5,9,8,6,5,7,7,0,8,10,7,8,2,8,3,7 +H,5,9,6,6,2,7,6,15,1,7,8,8,3,8,0,8 +B,4,9,6,7,5,8,7,5,6,10,6,6,3,8,7,9 +M,4,9,4,7,5,7,5,10,0,7,9,8,7,5,0,8 +N,4,8,4,6,2,7,7,14,2,4,6,8,6,8,0,8 +A,4,8,6,6,5,9,5,2,5,8,1,6,3,4,3,7 +F,5,6,7,7,6,7,9,4,5,8,6,8,4,10,7,6 +B,3,8,3,6,4,6,6,8,6,7,7,7,2,9,6,9 +Z,1,0,2,1,0,7,7,3,10,8,6,8,0,8,6,8 +N,6,10,8,8,6,4,10,2,3,9,9,9,6,7,1,7 +K,1,0,2,1,0,5,7,7,1,7,6,11,3,8,2,11 +K,4,10,5,8,4,3,6,7,4,7,7,12,3,8,3,11 +I,1,4,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +N,8,13,10,7,4,5,9,4,4,13,10,9,6,9,0,9 +Z,2,3,4,2,1,8,6,2,8,11,5,9,1,8,5,8 +O,2,7,3,5,2,7,6,8,7,7,4,8,3,8,4,8 +I,1,7,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +C,3,6,4,4,2,5,8,7,7,8,8,14,1,9,4,10 +M,6,5,8,4,7,7,8,4,4,7,5,8,11,8,5,6 +X,2,6,4,4,3,8,8,3,8,6,6,6,3,8,6,8 +F,3,4,5,3,2,6,10,2,5,13,7,5,1,10,2,7 +I,4,5,6,6,5,7,9,4,5,7,7,8,3,7,8,8 +Y,6,8,8,10,11,9,8,7,3,7,7,8,7,10,6,4 +X,4,6,5,6,5,7,8,2,5,8,6,8,3,6,7,7 +S,3,5,5,4,2,8,8,3,7,10,7,7,1,9,5,7 +R,5,5,5,6,3,5,12,9,4,7,3,9,3,7,6,11 +Z,5,5,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +F,2,3,4,2,1,6,10,3,5,13,7,5,1,9,1,7 +E,5,8,7,6,5,6,8,3,8,11,8,9,3,9,5,7 +E,4,9,6,6,5,7,7,6,9,7,6,10,3,8,6,8 +R,4,9,4,6,5,6,10,8,3,7,4,9,2,7,5,11 +W,5,8,5,6,4,2,10,2,3,10,11,9,6,10,1,7 +F,2,8,3,6,2,2,11,4,5,11,10,8,0,8,2,7 +J,3,8,5,6,5,9,7,3,3,8,4,6,4,8,6,4 +F,6,12,5,6,2,5,11,2,5,11,8,5,2,9,6,2 +A,2,7,4,4,1,5,4,3,2,5,1,7,2,6,2,7 +E,3,2,3,4,3,7,7,6,7,7,6,9,2,8,6,9 +A,2,7,4,4,1,8,4,3,2,7,2,8,3,6,2,8 +B,2,5,3,3,3,7,7,5,5,6,6,6,2,8,6,10 +K,3,5,6,4,3,5,7,2,8,11,9,11,4,7,4,7 +M,6,7,8,5,6,6,7,3,4,9,8,9,8,6,3,8 +J,3,8,4,6,2,8,7,1,7,11,5,7,1,6,2,6 +I,5,10,5,5,3,8,8,3,5,12,5,6,2,10,5,10 +S,3,5,5,4,4,8,9,4,5,7,7,8,4,11,7,10 +L,2,7,4,5,3,9,3,1,5,9,3,9,1,6,2,9 +K,5,10,8,8,9,6,6,3,4,6,5,10,8,6,8,8 +K,5,6,6,8,3,5,9,9,2,7,3,11,4,8,2,11 +Q,7,15,7,8,5,11,4,4,6,12,3,7,3,9,7,12 +C,4,8,5,7,5,5,7,4,4,7,6,11,4,9,8,10 +V,8,10,8,8,4,3,12,3,4,11,12,8,3,9,1,7 +T,6,9,6,6,3,5,12,4,8,12,10,4,2,12,3,4 +Q,7,9,10,8,7,5,4,4,5,4,3,7,4,7,7,6 +Q,4,8,6,7,4,8,7,8,5,6,5,9,2,8,4,9 +P,4,9,6,7,5,7,7,7,4,8,6,8,3,9,7,9 +Y,9,15,8,8,5,8,6,4,5,9,8,5,4,10,4,4 +K,5,7,7,5,5,8,7,1,6,10,5,9,3,8,2,9 +R,3,9,4,6,2,5,10,8,4,7,4,9,3,7,6,11 +J,4,8,6,6,2,6,8,3,7,15,6,9,1,6,1,7 +F,4,6,6,4,5,11,6,1,5,9,5,6,5,9,4,7 +G,2,5,3,3,2,6,7,5,5,9,7,10,2,8,4,9 +D,4,7,5,6,5,7,8,4,6,6,4,7,3,8,5,6 +U,7,11,9,8,5,4,9,7,8,9,11,11,3,9,1,8 +W,5,8,7,6,3,7,8,5,2,7,8,8,9,9,0,8 +E,3,8,5,6,6,7,7,3,5,6,7,10,4,10,8,8 +C,3,8,5,6,3,5,7,6,8,8,5,11,1,9,4,9 +F,2,3,3,2,1,6,10,2,5,13,7,5,1,9,1,7 +D,3,6,4,4,3,8,7,6,7,10,4,6,3,8,3,8 +O,2,0,2,1,1,8,7,7,6,7,6,8,2,8,3,8 +G,6,10,7,8,5,5,7,5,5,9,9,9,2,8,5,8 +M,3,3,4,2,3,7,6,6,4,6,7,8,7,5,2,8 +O,2,4,3,3,2,7,7,7,4,9,6,8,2,8,3,8 +Q,5,6,6,8,6,8,5,6,3,9,5,10,5,7,7,6 +Z,5,5,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +J,2,5,3,4,2,10,6,2,5,12,4,8,1,6,1,6 +X,3,3,5,2,2,6,8,2,8,11,9,9,2,8,3,6 +B,4,6,5,4,4,8,6,3,5,6,5,7,4,9,5,8 +O,4,7,6,5,4,7,9,8,5,6,8,10,3,8,3,8 +R,4,7,5,5,5,8,8,7,3,8,5,7,4,8,6,11 +C,2,3,2,1,1,4,10,5,6,12,9,9,1,9,2,7 +R,2,3,3,2,2,6,8,4,5,7,5,7,2,7,3,8 +R,4,9,6,6,6,7,8,5,5,7,5,7,3,7,5,9 +D,6,9,8,7,5,10,6,3,9,11,4,7,4,6,4,9 +X,6,10,9,8,4,8,7,1,9,10,5,8,3,8,4,8 +L,3,4,3,6,1,0,1,5,6,0,0,7,0,8,0,8 +C,4,6,5,6,5,7,8,5,4,6,7,11,6,9,9,11 +C,4,9,5,7,3,6,8,6,8,7,6,14,1,8,4,9 +F,4,7,6,5,3,8,9,3,6,13,6,5,2,10,3,8 +V,5,9,7,7,3,9,12,3,4,4,11,9,3,10,1,8 +R,3,8,4,6,4,6,10,7,3,7,4,9,2,7,5,11 +Z,9,13,9,7,5,6,8,2,10,12,8,8,4,4,8,4 +C,4,9,5,7,3,4,8,6,7,7,8,15,1,8,4,10 +I,2,6,3,4,1,6,8,1,8,14,7,8,0,8,1,7 +O,2,7,3,5,2,7,7,9,6,7,6,8,3,8,4,8 +L,5,11,7,8,5,6,5,0,9,9,3,11,0,7,3,8 +S,2,0,2,1,1,8,8,4,7,5,6,7,0,8,7,8 +I,4,8,5,6,3,6,6,2,7,7,6,10,0,9,4,8 +T,5,7,6,5,4,5,12,4,5,12,9,4,2,12,1,5 +E,6,10,8,7,7,10,6,2,7,11,4,8,5,6,5,11 +Y,3,4,5,5,1,8,10,3,2,6,13,8,2,11,0,8 +Y,4,5,5,4,2,4,12,3,7,12,10,4,1,11,2,5 +R,5,9,5,7,6,5,10,7,4,7,4,9,2,7,5,11 +S,3,7,5,5,6,7,7,3,2,8,6,7,2,7,12,3 +R,4,8,4,5,3,5,11,8,3,7,3,8,3,7,6,11 +O,4,9,5,7,4,7,7,9,5,7,5,8,3,8,3,8 +I,2,5,4,4,1,7,7,0,8,14,6,9,0,8,1,8 +T,3,8,4,6,2,7,13,0,6,7,10,8,0,8,0,8 +X,4,9,6,6,4,4,8,1,8,10,10,10,2,8,3,5 +C,5,10,4,5,3,8,5,5,3,9,9,11,4,9,7,11 +I,1,4,2,3,1,7,7,0,7,13,6,8,0,8,0,8 +J,3,7,4,5,2,8,6,3,6,15,5,9,0,7,0,7 +R,2,3,4,2,2,8,8,4,4,8,5,7,2,7,4,10 +E,5,10,4,6,2,8,7,5,7,11,6,9,2,10,7,9 +Q,5,9,5,5,3,9,4,4,7,10,4,9,3,8,8,11 +X,3,4,4,3,2,7,7,3,9,6,6,8,3,8,6,8 +O,4,8,5,6,4,7,7,8,4,7,6,8,3,8,3,8 +Q,3,7,4,7,4,8,9,6,4,6,9,9,2,8,5,9 +Y,2,3,3,1,1,4,12,3,5,12,10,5,1,11,1,5 +Q,5,12,5,6,3,10,5,4,7,12,4,9,3,8,8,12 +C,6,11,5,6,4,7,7,4,3,9,8,10,4,9,8,11 +K,7,9,9,6,7,9,5,1,7,10,3,9,8,5,7,10 +A,3,4,5,2,2,9,1,2,1,8,2,8,2,6,3,8 +E,5,10,6,8,7,6,8,6,8,6,5,11,3,8,6,9 +X,8,13,9,7,5,6,8,2,8,11,5,7,4,5,4,6 +M,4,5,7,3,4,8,7,3,4,9,6,7,8,6,2,7 +P,8,14,7,8,5,7,9,4,4,12,5,4,4,9,7,5 +R,4,7,5,5,3,9,8,4,6,9,3,7,3,6,4,11 +K,4,8,6,6,5,8,5,1,6,9,4,10,4,8,4,10 +G,3,6,5,4,2,8,6,7,8,6,5,10,2,8,5,10 +E,5,9,7,6,7,7,8,6,3,7,6,8,5,8,8,8 +T,2,2,3,3,2,7,11,2,7,7,11,8,1,11,1,8 +O,4,8,5,6,3,8,7,8,5,10,6,7,3,8,3,8 +B,1,0,2,1,1,7,7,7,4,7,6,7,1,8,6,8 +J,2,10,3,8,1,13,2,9,4,14,4,12,1,6,0,8 +Z,4,5,5,7,2,7,7,4,15,9,6,8,0,8,8,8 +F,4,7,4,5,1,1,14,5,3,12,9,5,0,8,2,6 +V,6,11,8,8,5,6,11,3,2,7,11,8,4,10,5,9 +H,3,4,4,3,3,7,7,6,6,7,6,8,3,8,3,8 +Q,3,4,4,5,3,7,8,5,2,7,9,10,3,9,5,8 +C,2,4,3,3,1,6,8,7,7,8,8,13,1,9,4,10 +L,3,6,4,4,2,7,3,2,9,7,1,9,0,7,2,8 +M,3,3,5,2,3,5,7,3,4,10,9,10,6,5,2,7 +N,1,1,2,2,1,7,8,5,3,8,7,7,4,8,1,7 +T,3,6,4,4,2,6,11,1,8,8,11,9,1,10,1,8 +O,5,8,6,7,5,6,6,5,5,8,5,7,3,6,5,7 +O,2,5,3,3,2,7,7,7,4,9,6,8,2,8,2,8 +C,3,7,4,5,2,5,8,6,8,12,9,11,1,10,3,7 +E,2,6,2,4,2,3,8,5,9,8,8,13,0,8,6,9 +Q,4,7,6,9,6,9,7,7,2,5,7,10,3,8,6,10 +T,3,9,4,6,1,7,15,0,6,7,11,8,0,8,0,8 +Z,2,3,3,2,1,7,8,2,9,11,6,8,1,8,5,7 +B,2,4,4,3,3,9,7,2,6,11,4,7,4,7,5,9 +J,1,1,1,1,0,12,3,6,4,13,4,11,0,7,0,8 +C,2,4,3,2,1,4,9,5,7,11,9,12,1,9,3,7 +P,4,8,6,6,4,8,8,2,5,13,5,5,1,10,3,9 +X,3,5,5,3,2,10,7,1,9,11,3,7,2,7,3,9 +W,3,1,3,2,1,7,8,4,1,7,8,8,7,10,0,8 +N,4,9,4,6,2,7,7,14,2,4,6,8,6,8,0,8 +B,6,10,9,8,12,8,8,5,3,6,7,7,7,10,11,10 +B,6,9,9,8,10,7,7,5,4,7,6,8,7,9,8,6 +Z,3,6,5,4,3,8,7,2,9,11,6,8,2,8,5,8 +M,6,9,9,8,11,7,7,4,3,6,6,8,10,9,5,5 +H,2,6,3,4,2,7,6,12,2,7,8,8,3,9,0,8 +B,1,0,1,1,1,7,7,7,4,6,6,7,1,8,6,9 +U,6,10,9,8,6,7,8,4,8,4,7,9,6,9,1,8 +I,0,3,1,1,0,7,7,1,6,13,6,8,0,8,0,7 +Q,3,6,4,5,4,8,7,7,5,6,6,7,2,8,4,9 +D,3,7,4,5,4,9,7,4,6,9,4,6,3,8,3,8 +H,6,11,6,8,6,8,5,14,2,7,9,8,3,9,0,8 +U,3,3,4,2,2,5,8,6,7,8,10,10,3,9,1,7 +G,2,4,3,3,2,6,6,5,4,8,7,10,2,8,4,10 +G,8,12,7,6,4,10,3,3,4,10,2,6,4,7,5,11 +R,5,10,8,8,5,9,8,4,6,9,3,7,3,6,5,11 +T,4,7,4,5,3,6,11,5,5,11,8,4,3,12,2,4 +G,3,8,4,6,2,7,6,7,7,6,6,10,1,8,6,11 +A,2,1,4,2,1,8,2,2,1,7,2,8,2,7,2,7 +J,3,7,5,5,4,9,8,3,4,9,4,7,4,8,6,5 +A,4,7,5,5,3,8,4,3,0,6,1,8,2,7,1,7 +Q,4,7,5,5,5,8,7,7,4,6,8,8,4,5,6,9 +H,4,7,6,5,5,6,6,7,4,6,5,8,3,7,6,10 +U,2,3,3,1,1,5,8,4,6,10,8,8,3,10,1,6 +W,5,10,7,7,4,6,8,5,2,7,8,8,9,9,0,8 +Z,2,5,3,3,2,7,7,5,9,6,6,8,2,8,7,8 +K,6,9,9,6,6,5,7,1,7,10,9,11,4,6,4,7 +Y,7,11,7,8,4,3,10,2,7,10,12,6,2,11,3,5 +F,2,7,2,4,1,1,12,4,5,12,11,8,0,8,2,6 +X,4,9,7,7,3,7,7,1,8,10,6,8,3,8,4,7 +K,3,6,4,4,5,7,8,3,4,6,6,8,7,8,6,8 +P,3,8,5,6,3,4,12,4,6,11,9,3,0,9,4,6 +N,3,5,6,3,2,6,9,3,5,10,7,7,5,8,1,8 +C,3,8,4,6,2,5,8,7,7,7,8,14,1,9,4,10 +W,6,11,9,8,4,11,7,5,2,6,9,8,9,9,0,8 +M,6,7,9,5,6,8,6,2,5,9,6,7,8,6,2,7 +T,5,10,6,8,5,4,12,5,5,12,9,4,2,12,1,5 +H,4,7,5,5,4,9,7,7,6,7,6,5,3,8,3,5 +L,3,8,4,6,3,5,4,2,9,3,2,7,3,7,2,5 +Y,9,11,9,8,4,5,9,1,10,10,10,4,2,13,5,3 +N,4,9,5,7,4,8,7,13,1,6,6,8,5,9,0,8 +Z,4,7,6,5,3,7,8,2,9,11,6,8,1,9,6,8 +H,3,7,4,5,4,8,7,6,6,7,6,7,3,8,3,7 +O,4,9,3,5,2,6,7,6,3,10,6,9,5,9,5,7 +P,3,8,3,6,3,3,12,6,1,11,7,4,0,9,3,8 +T,6,10,8,8,7,6,7,7,7,7,9,9,4,10,6,8 +D,6,10,9,8,8,8,8,5,6,10,5,5,4,8,5,10 +K,2,1,2,1,0,5,7,8,1,7,6,11,3,8,2,11 +U,2,1,3,1,1,7,8,6,6,7,9,8,3,10,1,8 +N,5,6,7,4,3,9,7,3,5,10,3,5,5,9,1,7 +D,6,11,6,6,4,10,6,3,6,9,4,7,5,10,6,8 +B,4,4,5,6,4,6,7,9,7,7,6,7,2,8,9,9 +P,5,10,7,7,4,7,11,4,5,13,5,3,1,10,3,8 +L,4,8,5,6,6,8,8,3,5,6,7,9,6,11,6,6 +L,2,3,3,5,1,0,1,5,6,0,0,7,0,8,0,8 +L,1,3,2,1,1,6,5,1,7,8,3,10,0,7,2,8 +V,7,13,7,7,4,8,9,4,4,8,8,5,6,14,2,8 +L,1,4,2,2,1,7,4,1,7,8,2,10,0,7,2,8 +P,5,6,6,8,7,6,9,3,2,8,8,6,5,10,5,5 +J,6,8,4,11,3,9,7,3,3,12,3,5,3,8,6,10 +R,5,5,5,7,3,5,11,9,4,7,3,9,3,7,6,11 +W,6,8,6,6,5,6,10,4,3,9,7,6,7,12,3,6 +Q,6,9,7,10,8,9,9,6,3,4,8,11,5,9,9,13 +T,7,15,6,8,4,6,10,2,6,12,7,6,3,9,5,5 +U,4,4,4,3,2,5,8,5,7,10,9,9,3,9,2,6 +K,3,5,6,4,3,5,8,2,7,10,9,10,3,8,3,7 +Y,1,0,2,0,0,7,10,3,1,7,12,8,1,11,0,8 +T,5,6,6,5,6,7,9,5,8,7,7,8,3,10,7,7 +B,5,11,8,9,9,8,6,5,6,9,5,7,3,8,6,10 +D,9,15,9,8,5,8,6,5,7,12,3,7,6,7,6,10 +S,2,7,3,5,2,8,8,7,6,8,6,8,2,8,9,8 +L,2,7,2,5,1,0,1,5,6,0,0,7,0,8,0,8 +W,1,0,2,0,0,8,8,3,0,6,8,8,5,9,0,8 +G,3,4,4,6,2,7,7,8,7,6,6,9,2,7,6,10 +P,8,15,8,9,5,8,9,4,4,12,5,3,5,10,6,6 +M,5,6,8,4,4,7,6,2,5,9,7,8,8,5,2,8 +O,5,8,6,6,4,8,9,8,4,7,7,8,3,8,3,8 +H,4,7,6,5,8,8,7,4,3,6,6,7,7,8,8,8 +O,2,4,3,3,2,7,7,6,3,9,6,8,2,8,2,8 +H,3,2,4,3,3,8,7,5,6,7,6,8,6,8,4,7 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +L,4,10,5,8,3,3,5,1,9,6,1,11,0,7,3,6 +S,5,11,5,6,3,6,8,4,3,13,8,8,3,10,3,8 +D,3,5,5,3,3,9,6,4,6,10,4,6,2,8,3,8 +X,6,12,6,6,4,7,8,2,7,11,7,7,4,12,3,7 +L,3,8,4,6,1,0,1,6,6,0,0,6,0,8,0,8 +D,2,1,3,1,2,6,7,6,6,7,6,5,2,8,2,7 +Z,9,10,6,14,6,8,4,5,4,12,7,9,3,8,12,7 +B,4,9,6,6,5,6,9,5,6,10,6,5,3,8,7,8 +D,1,1,2,1,1,7,7,6,6,7,6,5,2,8,2,7 +A,3,11,5,8,4,12,2,3,3,10,2,9,2,6,3,8 +X,4,9,7,7,6,8,7,3,6,7,4,6,5,5,8,7 +V,5,10,5,8,3,3,11,4,4,10,11,7,3,10,1,8 +B,5,9,5,7,4,6,7,9,7,7,6,7,2,8,9,9 +X,4,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +M,4,4,7,3,4,6,6,3,4,10,9,10,7,6,2,8 +O,4,3,5,4,2,7,7,8,8,7,6,8,3,8,4,8 +L,1,0,1,0,0,2,2,5,4,1,2,6,0,8,0,8 +K,4,8,6,6,5,3,8,2,6,10,10,11,3,8,3,6 +T,6,11,6,8,5,4,13,6,4,12,9,4,2,12,1,5 +M,3,6,4,4,4,8,5,10,0,6,8,8,6,5,0,7 +H,3,5,6,4,3,9,7,3,6,10,3,7,5,7,4,9 +Y,6,11,6,8,3,3,10,3,7,12,12,7,1,11,3,5 +C,3,4,4,6,2,6,7,7,9,5,6,14,1,7,4,8 +I,4,11,7,8,8,10,7,2,5,9,4,4,4,9,7,5 +U,5,8,7,6,4,5,9,6,7,8,10,10,3,9,1,8 +Z,3,9,5,7,5,8,8,3,7,8,7,7,1,9,10,9 +S,6,9,6,5,3,9,5,4,4,13,6,9,3,10,3,8 +N,5,8,8,6,3,11,6,3,5,10,1,4,5,9,1,7 +B,5,6,7,5,7,8,6,5,4,7,6,8,7,9,8,4 +F,4,7,6,5,2,7,10,2,7,14,5,4,1,10,2,8 +X,4,10,7,7,4,7,8,4,9,6,5,5,4,10,8,6 +C,1,3,2,2,1,6,8,4,6,11,8,12,1,10,3,8 +B,4,9,6,7,7,8,7,6,6,7,6,6,2,8,6,10 +J,2,9,3,7,1,13,3,8,5,14,2,11,0,6,0,8 +C,4,7,5,5,2,5,7,6,7,11,9,13,2,9,4,7 +M,4,9,5,6,5,8,6,11,1,7,8,8,7,5,0,8 +O,5,11,7,8,3,8,8,8,8,6,7,9,3,8,4,8 +W,5,5,8,8,4,5,8,5,2,7,8,8,9,9,0,8 +T,3,9,4,6,1,7,14,0,6,7,11,8,0,8,0,8 +A,3,6,5,4,2,8,4,3,0,7,1,8,2,7,1,8 +W,5,11,8,8,13,8,5,6,3,7,6,8,14,10,4,9 +B,3,3,3,5,3,6,6,9,6,6,6,7,2,8,9,10 +U,6,10,6,6,4,8,6,5,5,6,7,7,5,8,3,7 +A,3,4,5,5,1,8,6,3,1,7,0,8,2,7,1,8 +F,4,7,7,5,6,7,9,1,5,10,6,6,5,10,4,5 +L,3,3,3,5,1,0,1,6,6,0,1,6,0,8,0,8 +X,3,7,5,5,4,8,7,3,6,7,4,6,4,7,6,8 +Z,3,5,5,3,2,7,7,2,9,12,6,8,1,8,6,8 +W,7,10,7,8,5,1,10,2,3,11,11,9,7,10,1,7 +L,4,5,5,5,4,8,7,4,5,7,6,8,3,8,8,11 +N,3,6,5,4,3,7,8,6,5,7,7,6,5,9,1,6 +C,6,9,6,7,3,4,8,6,7,12,10,12,2,10,2,7 +D,6,9,5,4,3,9,5,5,6,12,3,8,5,7,5,10 +C,8,14,6,8,5,9,6,4,3,9,8,11,4,9,8,13 +V,8,10,7,5,3,8,8,7,5,7,10,6,7,12,4,8 +W,5,9,7,7,11,9,7,5,2,7,6,8,10,11,4,8 +X,2,2,3,3,2,7,7,3,9,6,6,10,2,8,6,8 +H,5,6,7,4,4,4,10,3,6,10,10,9,3,8,3,6 +B,5,9,5,4,4,9,7,3,5,9,5,7,6,6,7,9 +H,10,14,9,8,5,7,8,4,5,9,7,8,6,8,5,9 +G,3,7,4,5,2,7,6,7,8,6,5,11,1,8,6,11 +Y,5,10,7,8,3,8,9,3,2,6,12,8,2,11,0,8 +W,4,7,6,5,3,7,8,5,1,7,8,8,8,9,0,8 +T,4,10,6,8,5,7,11,2,7,7,11,8,1,12,1,7 +K,4,7,4,4,1,4,7,8,2,7,5,11,3,8,2,11 +V,3,6,5,4,2,9,9,4,1,6,12,8,2,10,0,8 +K,1,0,1,0,0,5,7,7,0,7,6,10,2,8,2,11 +Y,4,9,4,4,2,6,8,3,4,10,7,5,3,10,4,3 +T,5,10,7,8,5,7,11,1,8,7,11,8,1,11,1,8 +E,2,4,3,3,2,9,7,1,7,11,5,8,2,8,4,10 +D,4,6,5,4,4,10,5,3,6,10,3,7,3,7,3,8 +E,2,3,4,2,2,6,7,2,7,11,6,9,2,8,3,8 +L,2,6,2,4,1,0,2,5,6,0,0,7,0,8,0,8 +C,8,11,8,8,4,3,9,6,8,12,11,11,1,8,3,6 +G,6,9,8,7,8,7,8,6,2,6,5,11,6,8,10,6 +P,1,0,2,0,0,5,11,6,1,9,5,5,0,9,3,8 +Z,4,5,6,7,4,11,5,4,4,9,3,8,2,6,5,9 +N,9,12,11,6,4,5,8,3,4,13,9,9,7,8,0,7 +C,6,10,6,8,3,5,9,7,8,13,9,7,2,11,2,7 +I,4,10,6,8,4,6,9,0,7,13,7,7,0,8,1,7 +E,5,11,7,8,8,8,7,5,3,7,6,8,5,8,9,9 +E,6,11,4,6,2,7,8,5,8,9,5,12,1,8,7,9 +A,2,0,3,1,0,7,4,2,0,7,2,8,2,7,1,8 +A,3,7,5,5,3,11,3,2,2,9,2,9,3,5,2,8 +C,6,10,7,8,4,4,8,6,7,12,10,12,2,10,3,7 +F,3,5,4,4,2,5,10,3,5,10,9,5,1,10,3,6 +M,4,7,6,5,6,7,9,6,3,7,6,8,5,9,5,8 +M,7,8,9,7,10,8,7,5,4,7,6,7,10,9,6,4 +X,4,11,6,8,5,7,7,3,8,5,6,8,3,8,6,7 +K,4,6,6,4,4,5,6,4,7,6,6,10,3,8,5,9 +F,5,9,5,5,3,6,12,3,3,11,6,4,4,10,7,6 +S,4,6,5,4,6,8,10,5,4,8,5,6,4,9,8,7 +B,6,10,8,8,6,9,7,4,7,10,4,6,2,8,6,10 +L,3,7,5,5,2,6,3,2,8,7,2,7,1,6,2,7 +U,8,10,9,8,6,4,8,5,8,9,8,9,6,9,4,3 +B,3,4,5,3,3,8,7,3,5,10,5,7,2,8,4,10 +N,4,9,4,7,2,7,7,14,2,5,6,8,6,8,0,8 +Q,4,5,5,6,5,9,6,7,4,5,6,8,3,8,6,9 +P,2,2,3,3,2,6,9,5,4,9,7,4,1,10,3,7 +W,2,1,4,1,2,8,11,3,1,6,9,8,6,11,0,7 +W,4,8,6,6,7,7,8,5,3,7,9,8,6,8,3,8 +P,4,8,6,6,4,6,10,4,6,10,8,3,1,10,5,7 +M,10,14,12,8,7,9,3,3,2,9,3,10,11,0,2,8 +Y,3,3,4,2,1,5,10,2,7,11,10,4,1,11,2,5 +R,6,8,9,7,9,7,7,3,4,7,5,8,7,9,7,5 +O,5,11,4,6,3,4,9,6,4,9,9,8,3,9,4,8 +O,5,9,5,7,5,8,7,7,4,10,5,8,3,8,3,7 +V,7,11,7,8,4,2,11,4,4,11,12,8,3,10,1,8 +B,5,9,6,7,5,7,9,9,8,7,5,7,2,8,9,10 +L,6,12,5,6,3,10,2,2,5,11,4,11,2,9,4,11 +E,6,9,5,5,3,7,8,4,4,11,6,8,3,9,8,9 +T,3,3,3,2,1,5,12,3,7,11,9,4,1,10,2,5 +X,3,7,4,5,2,7,7,4,4,7,6,8,2,8,4,8 +U,3,7,5,5,3,7,8,6,6,5,9,9,3,9,1,8 +G,3,11,5,8,4,7,7,7,7,8,4,12,2,9,6,10 +I,5,9,6,7,4,7,6,2,7,7,6,9,0,9,4,8 +Q,2,2,2,2,2,8,7,5,3,8,6,8,2,9,2,7 +I,2,11,0,8,2,7,7,5,3,7,6,8,0,8,0,8 +W,6,6,6,4,4,1,12,3,2,11,10,8,6,11,1,7 +C,6,12,4,6,2,7,8,7,6,11,7,7,2,9,5,8 +B,3,5,5,3,3,7,8,3,5,10,6,6,2,8,5,8 +H,5,7,8,9,7,8,5,3,2,7,5,7,4,8,8,8 +X,2,1,3,1,1,7,7,4,9,6,6,9,2,8,5,7 +Q,7,13,6,7,5,10,4,4,6,11,4,8,3,8,8,11 +O,3,7,4,5,3,8,7,8,5,7,6,9,2,8,3,8 +O,1,0,2,0,0,7,7,6,4,7,6,8,2,8,3,8 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +R,7,13,7,7,5,10,6,4,5,10,2,7,6,7,6,8 +N,3,7,5,5,4,7,7,8,5,7,5,7,3,7,3,8 +N,5,10,7,7,5,8,8,6,5,6,6,5,6,9,2,6 +C,3,7,4,5,3,5,8,6,6,8,8,14,2,9,4,10 +V,7,13,6,7,3,8,10,6,4,8,10,5,6,13,3,8 +X,7,11,11,8,5,6,8,1,9,10,9,9,3,8,4,6 +Q,4,4,6,6,6,9,11,5,0,5,7,10,5,12,4,10 +E,4,10,6,8,6,7,7,5,8,7,7,10,3,8,6,9 +V,4,11,6,8,3,7,11,3,5,8,12,8,3,10,1,8 +I,1,9,0,6,1,7,7,5,3,7,6,8,0,8,0,8 +U,5,5,6,4,3,4,8,5,8,10,9,9,3,9,2,6 +W,4,8,6,6,5,4,11,2,2,8,9,9,6,11,1,8 +D,6,9,8,8,7,6,7,5,8,7,5,8,5,5,7,4 +C,8,11,5,6,2,7,8,6,7,11,6,9,2,9,5,9 +L,4,8,5,6,3,6,4,3,7,6,1,8,1,6,3,7 +H,4,6,6,4,5,8,8,6,7,7,6,6,6,8,3,8 +N,5,10,6,7,5,9,8,6,5,6,5,4,6,10,3,5 +P,4,7,6,10,10,8,9,5,0,8,7,6,5,11,6,10 +J,2,6,2,4,1,9,7,2,6,11,3,7,0,7,1,6 +E,2,3,4,1,2,7,7,2,7,11,7,9,1,9,4,8 +C,3,8,4,6,2,5,8,8,8,9,8,13,2,10,4,10 +E,4,8,6,6,5,5,8,5,7,11,9,9,3,8,5,5 +K,2,3,2,2,2,5,7,4,7,6,6,10,3,8,4,10 +X,6,10,7,6,4,10,6,3,7,12,2,6,3,8,4,10 +Q,5,6,6,8,3,8,6,8,7,6,6,8,3,8,5,9 +R,6,8,9,7,9,9,6,4,4,8,5,7,7,9,7,6 +T,4,11,6,8,2,8,15,1,6,7,11,8,0,8,0,8 +Y,2,3,4,5,1,8,11,2,3,4,12,8,1,10,0,8 +W,5,10,8,7,7,4,11,2,3,8,9,9,7,11,1,8 +B,4,7,4,5,3,6,7,8,6,7,6,7,2,8,9,10 +A,3,7,6,5,4,12,3,2,2,9,2,8,4,5,2,8 +A,3,7,5,5,3,7,3,2,2,5,2,8,2,6,2,6 +J,5,9,4,7,3,7,11,3,3,13,5,4,2,8,7,8 +J,2,4,4,3,1,8,6,3,6,14,7,11,1,6,1,7 +C,2,3,3,2,1,5,8,5,6,11,9,10,1,10,2,7 +L,4,9,4,4,2,8,5,3,5,12,7,11,2,8,6,8 +J,2,6,4,4,3,9,6,2,4,8,5,6,3,7,5,6 +U,5,9,5,6,4,4,8,5,7,10,9,9,3,9,2,5 +V,3,6,5,4,1,7,8,4,2,7,13,8,3,9,0,8 +N,4,7,4,5,2,7,7,14,2,4,6,8,6,8,0,8 +H,3,8,5,6,6,8,7,4,3,6,6,7,7,8,7,6 +G,6,11,6,8,5,5,6,6,5,10,8,11,2,9,4,10 +G,3,7,5,5,3,7,6,6,6,6,6,10,2,9,4,8 +N,1,0,1,1,1,7,7,10,0,6,6,8,4,8,0,8 +T,4,10,6,8,5,10,11,2,7,5,11,7,1,11,1,8 +U,3,3,4,2,2,7,8,6,7,6,9,9,3,9,1,8 +U,4,5,5,3,2,4,8,5,8,9,8,9,4,11,3,4 +N,3,2,4,3,3,7,8,5,5,7,6,6,6,9,2,5 +U,5,6,5,4,2,4,9,5,7,12,11,9,3,9,1,7 +W,4,5,7,4,4,5,11,3,2,8,9,9,8,11,1,8 +C,3,5,4,4,2,4,8,5,7,12,9,11,1,10,2,7 +U,5,10,7,7,6,8,8,8,5,5,7,9,3,7,4,7 +J,2,5,4,4,2,10,6,2,6,12,4,8,1,6,1,7 +C,4,9,5,7,6,8,6,5,3,7,7,11,5,9,3,8 +O,6,9,8,8,6,6,5,5,5,9,6,10,5,5,7,4 +L,4,9,4,7,1,0,0,6,6,0,0,5,0,8,0,8 +C,6,10,6,8,3,3,9,6,8,12,11,11,1,8,2,6 +B,3,6,5,4,4,9,6,4,6,10,5,7,2,8,5,10 +T,3,8,4,6,2,9,14,0,5,6,10,8,0,8,0,8 +Z,3,7,4,5,2,7,7,4,13,9,6,8,0,8,8,8 +F,4,10,5,8,4,6,10,3,6,10,9,5,2,10,4,6 +Q,2,1,3,2,1,8,6,7,5,6,6,8,3,8,4,9 +P,4,9,6,6,4,7,9,4,4,12,5,3,1,10,3,8 +O,6,10,8,8,6,8,5,9,4,6,5,5,5,7,4,8 +T,4,5,4,3,2,5,11,2,8,11,9,4,1,11,2,4 +D,4,8,6,7,6,7,7,5,6,7,4,8,4,6,7,4 +A,3,10,5,7,3,7,3,2,2,5,2,7,2,6,2,7 +C,6,9,6,6,3,5,7,6,8,11,8,14,2,9,4,6 +E,2,3,3,2,2,7,7,5,7,7,6,9,2,8,5,10 +K,2,1,3,3,2,6,7,4,7,6,6,10,3,8,5,8 +R,6,11,8,8,7,9,8,4,5,9,4,7,3,7,4,11 +Y,3,7,4,5,1,8,11,1,3,6,12,8,1,11,0,8 +T,9,11,7,6,3,5,9,3,9,13,7,5,2,10,3,5 +E,6,11,9,8,8,8,7,7,3,7,6,11,6,8,9,8 +H,4,8,6,6,6,7,8,5,6,7,6,8,3,8,3,8 +R,3,5,5,3,3,9,6,3,5,10,4,7,3,6,4,9 +C,1,0,1,1,0,6,7,6,8,7,6,14,0,8,4,10 +U,4,7,6,6,5,7,7,4,4,6,6,9,4,8,2,9 +U,4,10,4,7,4,7,6,12,4,7,12,8,3,9,0,8 +Z,4,9,5,7,2,7,7,4,14,9,6,8,0,8,8,8 +T,4,5,5,4,3,8,12,3,7,6,11,8,2,11,1,7 +F,5,5,5,7,2,1,13,5,5,12,10,7,0,8,2,6 +C,3,6,4,4,1,3,9,5,7,11,11,10,2,9,2,6 +C,7,13,5,7,2,6,9,6,8,11,8,9,2,8,5,9 +H,3,7,5,5,4,7,7,7,6,7,6,8,3,8,3,8 +W,7,6,9,6,10,7,8,5,5,7,5,8,10,10,9,8 +S,2,1,2,1,1,8,7,4,7,5,6,7,0,8,8,8 +I,7,14,6,8,4,8,8,2,6,13,4,5,2,8,6,9 +L,2,1,2,2,1,5,3,5,7,2,2,4,1,7,1,6 +N,3,5,4,4,3,7,8,5,5,7,7,6,5,9,2,6 +E,3,8,3,6,2,3,6,6,11,7,7,15,0,8,6,7 +U,7,12,6,6,4,9,5,5,6,5,7,7,5,9,3,7 +P,4,6,6,4,3,8,9,5,5,12,4,3,2,9,4,8 +N,4,5,6,4,3,6,10,2,4,10,7,7,5,8,1,8 +C,2,5,3,3,1,4,9,5,6,11,10,11,1,9,2,7 +M,1,0,2,0,0,8,6,10,0,7,8,8,6,6,0,8 +Q,5,9,5,4,3,12,4,3,5,10,3,7,3,9,4,12 +Y,1,1,3,2,1,7,10,1,6,7,11,8,1,11,1,8 +X,6,9,9,6,5,5,8,1,8,10,10,9,3,8,3,6 +N,4,10,4,8,3,7,7,14,2,5,6,8,6,8,0,8 +S,5,9,6,7,5,8,7,7,5,7,6,7,2,8,9,8 +R,4,11,4,8,5,6,8,9,4,7,5,7,3,8,5,11 +R,3,4,4,2,3,7,8,5,5,6,5,6,2,7,4,9 +U,9,11,10,8,4,4,8,6,10,13,11,9,3,9,1,7 +S,4,5,5,5,5,8,8,4,4,7,6,8,5,10,9,11 +Z,9,13,9,7,6,7,6,2,9,12,7,9,4,6,8,6 +H,6,9,6,4,3,7,8,4,4,9,9,9,6,10,5,9 +P,1,0,2,1,0,5,11,7,1,9,6,4,1,9,3,8 +L,3,9,4,6,3,3,5,1,8,3,1,9,0,7,1,6 +V,1,0,2,1,0,8,9,3,2,7,12,8,2,10,0,8 +R,5,9,7,7,6,7,7,6,6,6,5,7,4,8,6,10 +U,5,9,7,8,7,8,6,4,4,6,7,7,4,8,1,7 +R,7,11,9,8,9,9,8,4,5,10,4,7,3,7,5,11 +F,4,7,6,5,3,7,10,3,6,13,6,5,2,9,3,7 +N,3,4,5,3,2,6,9,3,4,10,7,7,5,8,1,8 +B,6,10,8,7,7,7,9,7,5,7,5,5,5,9,7,6 +W,6,9,6,6,5,2,11,2,3,10,10,8,5,11,1,7 +X,5,6,6,6,6,7,6,2,5,8,7,9,3,11,7,8 +Y,3,2,5,4,2,5,10,1,7,9,11,9,1,11,2,7 +M,4,4,5,6,3,8,7,12,1,6,9,8,8,6,0,8 +P,4,8,6,6,3,6,11,5,4,12,5,3,1,10,3,8 +J,2,4,4,3,1,8,6,3,7,14,5,10,0,7,0,8 +X,4,8,6,7,6,9,9,2,6,7,5,6,2,5,7,7 +D,5,10,7,7,5,8,7,7,9,6,5,4,3,8,4,7 +T,5,9,4,4,2,6,10,2,6,12,7,6,2,9,4,4 +V,6,10,8,8,6,8,12,3,2,6,10,9,7,11,7,8 +F,4,10,4,7,2,1,15,5,3,12,9,4,0,8,3,6 +M,4,7,5,5,3,8,7,12,1,6,9,8,8,6,0,8 +R,6,9,9,8,10,5,9,4,4,6,4,10,10,5,9,9 +T,7,9,6,5,2,4,12,3,6,13,8,4,2,8,4,3 +K,5,8,7,6,6,7,7,1,6,10,5,9,3,7,4,8 +H,2,6,4,4,5,9,6,4,3,6,6,7,6,9,7,7 +Q,7,9,7,11,8,8,6,7,3,8,6,11,6,8,8,6 +P,3,7,3,4,2,4,11,9,3,9,6,4,1,10,3,8 +J,4,10,4,7,3,14,3,5,4,13,2,10,0,7,0,8 +L,3,9,5,6,3,8,3,0,8,10,3,11,0,7,2,9 +O,5,9,6,7,6,7,6,8,4,7,5,8,3,9,3,7 +L,1,3,2,2,1,7,4,1,7,8,2,10,0,7,2,8 +S,4,5,5,7,3,7,7,6,9,5,6,8,0,8,9,7 +N,8,11,12,8,7,3,11,3,4,10,11,9,8,7,2,7 +D,3,7,4,5,3,8,7,7,7,9,5,4,3,8,4,7 +N,4,7,7,5,6,7,8,3,5,7,6,7,6,8,7,4 +T,8,13,7,8,3,7,8,3,9,13,5,6,2,9,5,5 +C,4,8,4,6,2,4,8,6,7,11,10,12,2,9,3,7 +T,4,6,5,4,5,7,8,4,5,6,7,9,5,8,5,7 +J,4,6,5,4,2,10,6,2,8,15,4,8,0,8,0,8 +N,4,9,5,7,3,7,7,14,2,4,6,8,6,8,0,8 +S,3,9,4,7,4,8,7,7,5,7,6,7,2,8,8,8 +G,3,4,4,3,2,7,6,7,5,6,6,10,3,8,4,9 +Q,4,7,5,6,3,8,4,8,8,6,4,8,3,8,4,8 +G,4,9,5,7,4,7,6,7,6,6,7,9,2,8,4,8 +R,3,6,5,4,3,10,7,3,6,10,2,7,3,7,3,10 +N,11,13,9,8,5,4,8,5,6,3,2,13,7,11,2,7 +W,5,9,7,7,4,10,8,5,2,6,8,8,9,10,0,8 +V,2,7,4,5,2,6,11,2,3,8,11,8,2,11,1,9 +S,5,7,6,5,4,8,6,3,7,10,7,9,2,10,5,8 +O,5,5,7,4,4,7,6,5,5,9,5,9,3,6,5,6 +V,8,11,7,8,4,3,11,4,4,10,12,8,3,10,1,8 +U,2,3,2,1,1,6,8,5,6,9,8,8,3,10,2,6 +C,4,9,5,7,3,5,8,6,8,12,9,13,2,10,3,7 +O,6,11,6,8,6,7,7,8,4,10,6,9,4,9,5,5 +R,4,6,6,4,5,8,8,7,3,8,4,7,4,6,7,8 +E,5,10,3,5,2,6,9,5,8,9,5,10,1,7,6,8 +U,8,10,8,7,6,4,8,5,8,9,8,10,6,8,4,3 +M,5,8,7,6,7,7,7,6,5,6,7,7,9,8,3,6 +A,2,4,4,5,1,5,5,3,1,5,1,8,2,7,2,7 +H,5,9,8,7,5,9,8,3,6,10,4,7,3,8,3,9 +F,4,6,6,4,2,3,15,4,3,13,8,3,1,10,2,5 +V,4,9,6,7,2,7,12,3,5,8,12,8,3,10,1,8 +I,1,4,2,3,1,7,8,0,7,13,6,8,0,8,1,7 +W,5,9,8,6,5,9,8,4,1,6,9,8,7,11,0,8 +S,4,7,5,5,3,10,7,3,6,9,4,8,2,8,5,11 +N,2,1,3,2,2,6,8,5,4,8,7,7,5,9,1,6 +O,5,10,5,8,4,7,7,8,5,10,7,7,3,8,4,8 +G,5,8,6,6,5,8,7,7,6,6,7,9,2,6,6,10 +Y,6,9,6,4,3,6,7,4,3,10,9,6,3,10,4,4 +D,7,10,9,8,8,7,7,5,7,7,6,7,7,8,3,7 +H,1,0,1,0,0,7,7,10,2,7,6,8,2,8,0,8 +F,6,12,6,6,4,9,7,3,4,10,5,6,3,9,6,9 +Z,4,6,6,4,4,8,7,2,9,12,6,8,1,8,5,8 +N,5,7,7,5,4,8,8,2,5,10,4,6,5,9,1,7 +M,4,6,5,8,4,8,7,12,2,6,9,8,8,6,0,8 +R,4,10,6,8,6,7,7,4,6,7,6,6,6,8,4,8 +W,3,8,5,6,3,11,8,5,1,6,9,8,7,10,0,8 +F,8,15,7,8,6,8,7,3,5,10,5,7,5,7,7,8 +I,2,9,2,7,3,7,7,0,7,7,6,8,0,8,3,8 +V,3,10,6,7,2,8,8,4,3,6,14,8,3,9,0,8 +H,6,10,8,8,7,6,8,3,6,10,8,8,4,8,4,6 +W,10,12,9,6,4,5,9,2,2,7,10,7,9,12,1,6 +P,3,2,4,3,3,5,10,4,5,10,8,4,1,10,4,7 +N,6,10,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +A,5,13,5,7,4,12,2,4,1,11,3,11,4,3,4,11 +A,6,14,6,8,4,11,1,3,3,12,5,13,3,6,5,11 +T,5,7,5,5,3,6,11,2,7,11,9,5,1,11,2,4 +W,3,4,5,3,3,6,11,3,2,7,9,8,7,11,0,8 +P,3,6,5,4,3,8,9,4,4,11,4,4,1,10,3,8 +X,5,8,7,6,5,7,6,3,5,6,6,9,3,8,9,9 +W,5,9,7,7,4,8,8,5,2,7,8,8,9,9,0,8 +Y,3,5,5,3,2,7,10,1,7,7,11,8,1,11,2,8 +M,5,5,6,4,4,7,6,6,5,6,7,9,9,6,2,8 +Y,2,4,4,5,1,7,10,2,2,7,13,8,1,11,0,8 +L,4,9,6,7,3,6,3,2,9,7,1,9,0,6,2,7 +F,3,7,3,4,1,1,13,5,4,12,10,7,0,8,2,6 +J,2,3,3,5,1,12,2,9,4,13,5,13,1,6,0,8 +Y,7,7,7,5,4,3,10,1,8,11,10,6,1,9,2,4 +Q,3,4,4,7,3,7,6,9,6,5,6,7,3,8,5,9 +L,4,11,5,8,3,9,2,1,7,9,2,10,1,6,3,9 +N,1,1,1,1,1,7,7,10,1,5,6,8,4,8,0,8 +C,2,7,3,5,1,5,7,7,9,7,6,14,1,8,4,9 +M,8,10,8,5,4,7,10,5,6,4,5,10,9,8,2,8 +U,4,7,6,5,3,6,8,6,8,7,9,9,3,9,1,8 +X,3,6,6,4,3,7,7,1,9,10,7,9,2,8,3,8 +S,6,8,8,7,8,9,8,5,6,7,6,7,6,10,12,12 +W,6,11,8,8,9,8,6,6,3,6,7,8,8,8,5,5 +F,3,4,3,6,1,1,12,5,5,12,11,8,0,8,2,6 +V,4,6,4,4,2,3,11,4,3,10,11,7,2,10,1,8 +P,3,8,5,6,3,6,10,5,6,10,8,4,1,10,4,7 +C,1,0,2,0,0,7,7,6,8,7,6,13,0,8,4,10 +W,4,8,6,6,7,7,8,5,3,7,8,8,5,8,3,8 +P,2,4,4,3,2,7,9,4,4,12,5,3,1,10,3,8 +M,7,8,10,7,11,8,7,5,5,7,6,7,14,8,7,3 +J,5,7,7,8,6,8,8,4,6,6,7,7,4,9,10,11 +G,4,9,5,7,4,8,7,7,6,6,6,7,2,8,6,11 +T,7,11,7,8,5,5,12,3,6,12,10,5,2,12,1,5 +T,6,10,6,8,4,7,11,4,8,11,9,4,2,12,4,5 +Z,5,11,6,8,5,6,8,6,11,7,7,10,1,9,8,7 +D,7,9,9,8,8,6,7,5,8,7,6,9,6,4,8,3 +D,2,3,4,2,2,9,6,4,6,10,4,6,2,8,2,9 +K,6,9,9,7,7,10,5,1,5,9,3,8,7,6,6,11 +D,4,7,5,5,4,6,7,8,7,7,7,5,3,8,3,7 +W,5,8,8,6,11,8,7,5,2,7,6,8,13,11,3,9 +Q,3,4,4,5,3,7,8,5,2,8,8,10,3,8,5,8 +I,1,9,2,7,2,7,7,0,8,7,6,8,0,8,3,8 +Q,7,14,6,8,5,10,5,4,7,11,4,8,3,7,9,11 +C,2,5,3,4,2,6,8,7,7,8,8,14,1,9,4,10 +T,6,9,5,5,3,7,8,2,7,12,7,8,2,9,4,5 +R,2,2,3,3,2,7,7,5,5,6,5,6,2,7,5,8 +L,2,6,2,4,0,0,2,5,6,0,0,7,0,8,0,8 +Q,2,3,3,4,2,7,8,5,1,7,8,10,2,9,5,8 +X,3,4,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +U,5,5,6,7,2,7,3,15,6,7,13,8,3,9,0,8 +O,4,3,5,5,2,7,8,8,8,7,7,8,3,8,4,8 +J,1,3,2,2,1,11,6,1,6,11,3,7,0,7,0,8 +L,3,6,5,4,2,5,5,1,9,7,2,11,0,7,3,7 +X,3,5,5,4,3,7,7,3,10,6,6,8,3,8,6,8 +F,2,3,3,1,1,5,11,2,5,13,6,4,1,9,1,8 +W,8,8,11,7,12,7,6,5,5,7,5,8,10,9,8,9 +M,6,9,8,7,9,7,9,7,5,7,6,8,10,10,8,6 +Q,2,1,2,1,1,8,6,6,4,6,6,8,2,8,3,8 +K,7,9,7,4,3,7,8,3,7,9,6,8,6,8,3,7 +T,2,3,3,2,1,5,12,3,6,11,9,4,1,10,2,5 +J,1,4,3,3,1,9,6,3,6,14,5,9,0,7,0,8 +F,3,2,4,4,3,5,11,3,6,11,9,5,1,10,3,6 +I,2,6,2,4,1,6,8,0,6,13,7,8,0,8,1,7 +T,3,4,5,6,1,6,15,1,6,8,11,7,0,8,0,8 +A,3,9,6,7,4,10,2,1,2,8,3,9,4,5,3,7 +M,8,11,11,8,8,6,6,3,5,9,8,9,8,6,2,8 +M,4,9,7,6,9,8,6,3,1,7,4,8,10,7,2,6 +O,5,11,6,8,3,7,8,9,8,7,8,8,3,8,4,8 +Y,5,9,6,6,3,2,11,4,5,12,12,7,1,11,2,6 +P,3,9,4,6,2,4,11,9,3,10,6,4,1,10,4,8 +R,4,4,4,6,3,5,11,8,3,7,4,8,3,7,6,11 +O,3,8,4,6,2,7,6,9,7,6,5,7,3,8,4,8 +A,3,7,5,5,3,8,2,2,2,7,2,7,2,6,3,6 +M,3,2,5,3,4,8,6,6,4,7,7,9,9,5,2,8 +R,3,6,4,4,4,8,8,7,2,7,4,7,4,7,7,8 +Z,4,7,5,5,4,9,7,5,3,7,5,7,3,8,9,5 +C,2,5,3,4,2,5,8,7,8,8,8,14,1,9,4,10 +D,1,0,2,1,1,5,7,8,6,7,6,6,2,8,3,8 +P,2,4,4,3,2,8,9,4,3,12,5,4,1,10,2,9 +C,4,10,5,7,3,4,8,6,6,12,10,13,1,10,3,8 +E,5,10,5,8,5,3,8,5,9,7,6,14,0,8,6,8 +M,2,3,4,2,2,8,7,2,4,9,6,8,6,5,1,7 +Z,3,5,5,4,3,7,8,2,9,12,6,8,1,8,5,7 +C,5,10,3,5,2,7,8,7,5,11,6,9,2,9,5,9 +Q,6,9,8,8,7,6,4,5,6,6,5,8,6,1,8,6 +G,3,7,5,5,5,9,7,6,2,6,7,9,5,8,3,8 +Z,3,5,6,4,3,7,8,2,10,12,6,8,1,9,5,7 +S,5,6,7,6,7,8,8,4,5,7,7,8,4,10,9,10 +S,7,15,6,8,3,7,4,5,5,8,2,7,4,6,6,7 +H,6,9,7,4,4,7,8,3,5,10,6,8,6,9,5,8 +Q,4,5,5,7,3,8,9,8,5,5,9,9,3,7,6,10 +K,6,10,8,8,10,8,8,4,5,5,7,9,9,8,9,7 +J,8,12,6,9,5,7,11,3,3,13,5,4,3,9,9,9 +Y,5,7,7,10,10,7,6,4,2,8,8,9,8,11,9,7 +Q,3,9,4,8,3,8,6,9,6,6,5,8,3,8,4,8 +S,4,11,5,8,3,9,8,6,9,5,6,5,0,8,9,7 +J,0,0,1,0,0,12,4,6,3,12,5,11,0,7,0,8 +X,1,0,2,0,0,7,7,3,4,7,6,8,3,8,4,8 +G,1,0,2,1,1,8,7,6,5,6,5,9,1,7,5,10 +W,6,9,8,7,4,6,8,5,2,7,8,8,9,9,0,8 +M,5,7,9,5,10,9,7,3,3,8,4,7,11,6,3,5 +B,2,6,3,4,3,6,6,8,5,6,7,7,2,9,6,10 +M,4,8,6,6,6,8,6,5,5,6,7,8,8,5,2,7 +N,3,6,5,4,5,8,7,4,4,7,5,7,5,10,6,4 +A,4,7,6,5,3,10,1,3,3,9,2,8,3,6,4,9 +W,6,7,6,5,5,3,11,2,2,9,9,8,6,11,2,7 +J,2,4,3,3,1,8,6,3,6,14,5,9,0,7,0,8 +E,2,4,4,3,2,7,8,2,7,11,7,9,2,9,4,8 +Q,4,6,4,7,5,8,8,6,2,7,7,11,3,9,5,8 +P,6,6,8,8,9,6,9,5,3,8,8,6,6,12,5,7 +U,6,9,5,4,3,8,6,5,5,6,6,7,4,7,3,6 +B,3,2,4,3,3,8,7,5,6,7,6,6,5,8,5,10 +N,5,11,7,8,9,9,8,5,4,7,5,5,7,11,9,4 +I,1,8,1,6,2,7,7,0,7,7,6,8,0,8,3,8 +K,3,2,4,4,3,6,7,4,7,6,6,10,3,8,5,9 +D,3,5,5,4,3,9,6,4,6,10,4,6,2,8,3,8 +J,5,11,4,8,3,7,11,3,4,13,4,4,1,7,5,6 +T,8,11,7,6,3,6,9,3,8,13,6,6,2,8,4,5 +N,1,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +S,5,10,6,8,4,7,7,3,6,10,6,8,2,8,5,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +N,5,7,7,5,4,10,8,4,6,10,1,4,5,9,1,7 +A,5,7,7,6,6,9,8,3,4,7,7,8,5,6,5,4 +T,3,3,4,2,1,5,11,3,7,11,9,4,1,10,2,5 +H,8,11,12,8,10,9,6,3,6,10,4,8,5,7,5,8 +L,1,0,1,0,0,2,1,6,4,0,3,4,0,8,0,8 +L,3,10,4,7,1,0,1,5,6,0,0,7,0,8,0,8 +Y,5,8,7,12,12,9,7,4,1,6,8,9,6,12,8,9 +L,2,7,4,5,4,7,7,3,4,7,6,10,5,10,6,5 +T,3,10,4,7,3,7,13,0,5,7,10,8,0,8,0,8 +K,4,5,5,7,2,3,7,8,2,7,5,11,4,8,2,11 +Q,3,2,4,4,3,8,8,6,2,5,7,10,3,8,5,10 +F,2,2,3,3,2,5,11,3,5,11,9,5,1,10,3,6 +K,6,8,9,6,4,5,7,3,7,10,9,11,3,8,3,7 +K,3,1,5,3,3,6,7,4,8,7,6,10,6,8,4,9 +I,0,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +Y,3,6,5,4,2,10,10,2,6,3,11,8,1,11,2,9 +X,3,8,4,6,3,7,7,4,4,7,6,8,2,8,4,8 +N,4,7,6,5,3,11,7,3,5,10,1,4,5,9,1,7 +D,3,8,5,6,5,7,7,4,6,7,6,5,3,8,3,7 +P,3,9,4,7,4,4,12,7,2,10,7,4,1,10,3,8 +K,7,10,6,5,3,5,8,3,6,9,8,9,5,9,3,7 +T,5,7,7,6,6,7,8,4,8,7,7,8,3,9,8,6 +U,5,8,5,6,2,7,4,13,5,7,15,8,3,9,0,8 +Z,2,4,2,3,2,7,8,5,8,6,6,9,2,8,7,8 +O,3,6,4,4,3,7,7,7,4,7,5,8,3,8,3,8 +H,5,8,6,6,5,7,7,7,6,7,7,8,3,8,3,8 +P,1,3,3,2,1,6,10,3,3,12,6,4,0,9,2,8 +T,5,9,7,7,7,7,8,5,5,6,8,9,7,7,8,7 +O,3,6,4,4,3,7,9,7,4,7,8,7,3,8,2,8 +I,2,5,4,4,2,7,7,0,8,14,6,8,0,8,1,7 +Y,3,6,5,4,2,7,11,1,7,7,11,8,1,11,2,8 +E,7,15,6,8,5,7,7,4,5,10,6,9,3,9,8,10 +G,6,8,8,7,8,7,10,6,2,7,7,8,6,11,7,8 +W,3,7,5,5,3,8,8,4,1,7,8,8,8,10,0,8 +R,3,4,3,3,2,7,8,4,5,6,5,6,3,6,5,8 +W,5,5,6,3,4,4,11,3,2,9,9,7,7,11,1,7 +Q,4,5,5,5,2,9,8,7,6,5,7,9,3,8,5,9 +Y,8,14,7,8,4,5,9,4,3,10,8,5,4,10,4,4 +G,4,7,4,5,3,6,7,6,6,10,7,10,2,9,4,9 +W,4,5,6,3,3,7,11,2,2,7,9,8,8,11,0,8 +R,6,9,9,8,10,7,6,3,4,7,5,8,8,9,6,7 +Y,2,3,3,2,1,8,10,1,6,5,11,9,1,11,1,8 +O,3,7,4,5,3,7,8,7,5,10,8,7,3,8,3,8 +R,4,6,5,4,4,6,8,5,6,7,5,7,3,7,5,8 +E,4,9,4,6,2,3,7,6,11,7,6,15,0,8,7,7 +L,4,9,4,7,3,0,2,4,6,1,0,8,0,8,0,8 +L,4,10,4,8,1,0,1,6,6,0,0,6,0,8,0,8 +F,4,9,6,7,3,4,13,3,4,13,8,4,1,10,2,6 +C,3,6,4,4,2,6,8,8,8,8,8,13,2,10,4,9 +X,3,7,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +F,4,5,5,4,3,5,10,4,6,10,9,5,2,10,3,6 +H,6,11,6,8,3,7,7,15,0,7,6,8,3,8,0,8 +W,3,3,4,2,2,3,10,3,2,10,10,8,5,11,1,6 +C,3,9,4,7,2,5,8,7,9,6,7,13,1,8,4,9 +P,6,9,9,7,5,8,11,8,5,10,4,3,2,10,5,7 +S,4,11,5,8,4,7,7,8,7,8,5,7,2,7,9,8 +K,5,10,8,8,8,5,6,4,7,6,6,12,5,7,7,10 +F,3,7,5,5,5,10,7,1,5,9,5,6,4,10,5,7 +Q,5,5,6,7,6,10,11,6,0,4,7,11,6,14,4,9 +R,6,10,9,9,10,8,8,4,4,7,4,7,7,9,6,4 +S,3,5,6,3,2,7,8,3,7,11,8,7,1,9,4,6 +U,7,8,8,6,3,4,9,6,9,12,11,8,3,9,1,6 +J,6,11,8,8,4,8,6,4,6,15,6,11,1,6,1,7 +F,5,8,7,10,8,7,9,5,5,7,5,7,4,8,9,7 +M,6,10,8,7,6,11,5,3,4,9,3,6,8,6,2,9 +M,5,9,7,6,7,9,7,5,5,6,7,5,8,7,3,5 +B,5,8,7,6,6,10,6,3,6,10,4,7,2,8,5,10 +X,1,0,1,0,0,7,7,3,5,7,6,8,2,8,4,7 +G,5,8,5,6,3,6,7,7,6,10,7,11,2,9,4,9 +H,3,8,4,6,4,7,8,12,1,7,5,8,3,8,0,8 +J,6,10,8,7,4,9,7,2,7,14,4,7,0,7,0,8 +F,2,3,4,2,2,8,9,2,6,13,5,4,1,9,2,8 +L,1,3,3,2,1,6,4,1,7,7,2,9,0,7,2,8 +X,9,13,9,7,5,8,7,2,8,11,4,7,4,9,4,7 +G,6,11,5,6,4,8,7,4,3,9,6,7,4,9,9,8 +I,2,10,2,8,2,8,7,0,9,7,6,7,0,8,3,7 +Z,5,7,7,9,5,11,4,3,4,9,3,8,2,7,6,9 +M,4,7,6,5,5,11,6,3,4,9,3,6,7,6,2,8 +L,4,7,5,5,3,7,4,1,8,8,2,10,0,6,2,8 +E,3,7,3,5,3,3,8,5,8,7,7,13,0,8,6,9 +W,4,4,5,3,3,7,11,3,2,6,9,8,7,11,0,8 +J,6,9,8,7,5,9,4,7,7,8,6,6,2,7,5,6 +W,4,11,7,8,11,8,6,7,3,7,6,8,14,10,5,9 +V,5,6,5,4,2,3,12,3,3,10,11,7,2,11,1,8 +J,2,2,3,3,1,9,6,3,6,12,4,10,1,6,1,6 +N,6,9,9,7,4,6,8,3,5,10,8,8,6,8,1,7 +S,4,4,5,6,3,8,8,6,9,5,6,7,0,8,9,8 +V,2,2,3,3,1,6,12,2,3,8,11,8,2,10,1,9 +A,2,2,4,3,2,7,2,2,2,6,1,8,2,6,2,7 +T,7,11,7,8,5,5,10,0,8,11,9,6,1,9,3,4 +K,6,7,8,5,6,9,6,1,6,10,3,8,7,7,6,10 +E,4,7,5,5,3,7,7,3,8,11,7,9,2,9,5,8 +H,4,7,5,4,2,7,7,14,0,7,6,8,3,8,0,8 +J,5,9,7,7,5,8,7,7,7,8,7,8,3,6,5,5 +A,3,9,6,7,5,7,5,2,3,5,2,6,4,5,5,5 +F,3,7,3,5,1,1,14,5,3,12,9,5,0,8,2,6 +D,2,6,4,4,5,9,8,4,4,7,6,6,3,8,7,4 +F,3,2,4,4,3,5,10,3,5,10,9,5,1,10,3,6 +U,7,11,7,8,4,3,8,5,8,11,10,10,3,9,2,6 +C,6,13,5,8,4,6,8,5,4,9,8,10,4,9,10,8 +E,3,5,4,7,2,3,8,6,11,7,5,15,0,8,7,7 +S,7,10,9,8,6,9,7,3,7,10,4,7,3,9,5,9 +C,1,3,2,2,1,7,8,6,5,9,7,11,2,10,3,10 +C,5,8,5,6,3,4,8,5,7,11,10,13,1,9,3,8 +S,2,2,3,4,2,8,7,7,5,7,7,8,2,9,9,8 +J,3,10,4,7,1,12,2,10,4,14,5,13,1,6,0,8 +K,3,5,5,4,3,6,7,1,7,10,7,10,3,8,2,8 +R,5,11,8,8,7,10,7,3,6,10,3,7,4,5,5,11 +J,1,1,2,1,0,11,6,2,6,12,3,8,0,7,0,8 +L,2,7,2,5,1,0,1,5,6,0,0,7,0,8,0,8 +U,5,8,5,6,4,6,7,6,8,8,6,8,6,10,4,3 +F,0,0,1,0,0,3,11,4,2,11,8,6,0,8,2,8 +R,3,7,5,5,3,8,8,4,6,9,3,8,3,7,4,11 +R,4,9,6,7,4,9,8,3,6,9,3,8,3,6,4,11 +K,4,9,5,7,7,6,7,3,3,6,5,9,6,8,8,7 +O,4,5,6,4,4,7,6,5,5,8,5,8,3,7,5,6 +E,5,8,6,6,6,8,5,6,3,7,7,9,4,8,8,10 +S,2,7,3,5,2,8,8,5,7,5,6,8,0,8,8,8 +L,5,11,4,6,2,10,2,3,4,13,4,11,2,8,5,9 +K,6,11,7,6,4,4,9,3,6,10,10,11,5,8,3,6 +P,3,5,5,4,2,8,9,4,4,11,4,3,1,10,3,8 +K,5,7,7,6,7,7,9,3,5,7,3,9,6,2,7,10 +A,3,8,5,6,3,12,2,3,2,10,2,9,2,6,3,8 +F,3,8,4,6,3,1,12,4,4,12,10,7,0,8,2,7 +J,3,11,4,8,3,8,6,3,6,11,5,10,1,6,2,5 +M,10,9,10,4,4,7,11,5,5,4,5,10,10,12,2,7 +Y,2,3,4,5,1,9,10,3,2,6,13,8,2,11,0,8 +B,3,8,4,6,4,8,8,8,7,7,5,5,2,8,8,9 +F,5,11,8,8,9,5,10,0,4,9,7,6,6,9,5,2 +H,5,10,5,7,3,7,5,15,2,7,9,8,3,8,0,8 +T,1,6,2,4,1,7,13,0,6,7,10,8,0,8,0,8 +E,4,6,6,4,5,7,9,6,3,6,6,9,4,7,7,8 +G,4,7,5,5,3,6,7,7,6,8,7,11,2,7,4,10 +J,3,9,5,7,2,8,7,2,8,15,4,7,0,7,0,8 +D,4,7,4,5,2,6,7,10,9,7,7,6,3,8,4,8 +E,5,8,7,6,5,7,7,2,7,11,6,9,3,7,5,9 +F,4,8,5,6,3,6,10,2,5,13,7,5,2,10,2,8 +K,7,10,9,8,9,8,8,6,5,8,5,6,5,7,8,11 +P,2,7,3,4,2,5,10,9,3,9,6,5,2,10,3,8 +E,5,10,7,8,7,8,7,6,3,7,6,9,4,8,8,10 +Y,3,9,5,7,3,9,10,1,6,4,11,8,2,12,2,8 +G,5,7,6,5,6,7,8,6,2,6,6,9,5,7,7,7 +A,3,7,5,5,3,10,2,2,2,9,1,8,2,6,3,8 +Q,3,6,4,5,2,8,9,7,6,5,8,9,3,8,5,10 +Z,6,10,8,7,6,7,7,2,9,12,6,8,1,8,6,8 +P,6,9,6,4,4,8,8,5,3,10,5,6,5,10,5,6 +H,2,4,4,2,2,7,8,3,6,10,6,8,3,8,2,8 +R,2,1,3,2,2,7,8,4,5,6,5,7,2,6,5,8 +S,1,0,1,0,0,8,7,3,6,5,6,7,0,8,7,8 +J,3,9,4,7,4,8,6,2,5,11,4,9,4,6,2,6 +A,2,8,4,6,2,8,4,3,2,7,1,8,3,7,2,8 +P,3,6,4,9,8,8,8,4,0,8,7,7,5,9,4,7 +L,5,9,7,7,3,6,4,1,9,8,2,10,0,7,2,8 +U,4,9,6,8,6,7,7,4,3,6,6,9,5,6,2,8 +R,2,1,2,2,1,6,9,8,3,7,5,8,2,7,5,11 +V,5,6,6,4,2,4,13,4,4,10,11,6,3,10,1,8 +C,1,0,2,1,0,6,7,6,9,7,6,14,0,8,4,10 +N,5,9,7,7,4,3,9,4,4,11,11,10,5,7,1,8 +D,5,10,6,8,7,8,7,4,8,6,5,6,6,8,3,7 +Q,6,6,7,9,4,8,10,8,6,5,9,9,3,8,6,10 +P,1,3,3,2,1,7,9,4,3,11,5,4,1,9,2,8 +B,3,6,4,4,3,10,6,3,6,10,3,7,2,8,4,11 +X,4,9,6,7,3,10,7,2,8,10,1,7,3,8,4,9 +W,6,11,10,8,7,4,11,2,3,8,9,9,8,11,1,8 +H,7,12,6,6,4,8,8,3,4,9,6,7,6,9,5,9 +K,2,3,4,2,2,4,7,2,6,10,9,11,3,8,2,7 +I,3,10,4,8,2,7,7,0,8,13,6,8,0,8,1,8 +Z,4,9,6,7,6,7,7,3,7,7,6,9,0,8,9,7 +R,5,9,5,7,6,6,9,8,3,7,5,8,3,8,6,12 +A,2,6,4,4,3,7,2,1,2,6,2,7,2,6,3,6 +M,3,1,4,2,1,7,7,11,1,7,9,8,7,6,0,8 +J,1,0,1,1,0,12,3,6,3,13,5,11,0,7,0,8 +H,3,8,4,5,2,7,7,15,1,7,6,8,3,8,0,8 +W,3,7,5,5,4,7,11,2,2,7,8,8,6,11,1,8 +R,5,11,6,8,6,6,7,5,6,7,6,7,6,8,5,8 +V,4,9,6,7,3,4,11,3,4,9,12,9,2,10,1,8 +F,3,5,4,3,2,5,10,3,6,10,9,6,1,10,3,6 +A,3,3,5,5,2,6,3,3,3,6,2,7,3,6,3,7 +X,1,1,2,1,0,7,7,4,4,7,6,8,2,8,4,7 +K,4,6,5,4,3,6,8,2,7,10,7,9,3,8,3,7 +F,3,6,4,4,2,6,11,4,5,12,7,4,2,10,2,6 +C,5,10,6,8,7,5,6,3,4,7,6,11,6,9,4,7 +T,3,6,5,4,3,6,11,3,7,8,11,7,4,11,1,7 +N,7,9,9,7,9,6,8,3,4,8,7,8,8,8,7,4 +R,1,0,2,1,1,6,9,7,3,7,5,8,2,7,4,11 +K,6,9,9,7,6,5,7,2,8,10,8,10,4,7,4,7 +N,7,9,8,4,3,10,6,3,4,13,3,7,6,8,0,8 +Y,5,11,7,8,1,8,11,2,2,7,13,8,1,11,0,8 +M,5,10,6,7,6,8,5,11,0,6,9,8,9,6,2,6 +X,3,5,4,4,2,8,7,3,9,6,6,8,2,8,6,8 +Q,5,5,7,8,9,8,7,5,1,6,6,9,9,12,7,13 +V,4,9,5,7,3,7,11,2,4,7,12,9,3,10,1,8 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +V,2,3,4,4,1,7,8,4,2,7,13,8,3,10,0,8 +B,4,9,6,7,6,9,6,4,5,9,5,7,2,8,5,9 +Y,6,11,9,8,5,6,9,0,8,8,12,9,1,11,2,7 +C,5,10,6,8,2,4,7,7,11,7,6,12,1,8,4,9 +A,2,5,4,4,2,11,2,2,2,9,2,9,2,6,2,8 +K,5,10,8,8,4,3,8,4,7,10,12,12,4,8,4,6 +G,3,8,4,6,2,7,6,8,7,6,6,9,2,7,6,11 +T,2,6,4,4,2,9,11,1,7,5,11,7,1,10,1,8 +H,4,11,5,8,3,7,7,15,1,7,6,8,3,8,0,8 +T,4,6,4,4,2,5,11,2,7,11,9,5,1,10,2,5 +R,3,7,5,5,3,9,7,4,6,10,4,7,3,7,4,10 +Z,4,10,4,8,4,7,8,3,12,9,6,8,0,8,7,7 +E,3,8,4,6,4,6,7,7,9,7,7,11,3,8,6,8 +H,5,8,8,6,6,7,6,3,6,10,7,8,3,8,3,7 +E,4,10,6,8,5,8,7,5,9,7,6,8,3,8,6,9 +X,4,7,7,5,4,9,7,1,8,10,3,7,3,8,3,9 +R,2,1,2,2,2,6,7,4,4,6,5,7,2,7,3,8 +P,3,6,4,4,2,4,12,8,2,10,6,4,1,10,4,8 +A,4,11,6,8,4,12,3,3,3,9,1,9,2,6,3,8 +B,4,9,4,7,3,6,8,9,7,7,6,7,2,8,9,10 +Q,5,7,5,8,5,8,5,7,5,9,5,9,3,8,5,7 +W,3,9,5,6,5,7,11,2,2,6,8,8,7,11,0,8 +G,3,5,4,4,2,6,7,5,6,9,7,11,2,9,4,10 +N,3,3,3,5,2,7,7,13,2,5,6,8,5,8,0,8 +W,6,10,8,8,9,7,9,6,4,7,9,7,7,7,5,10 +Q,2,1,3,2,1,8,6,7,5,6,6,8,3,8,4,8 +P,7,11,9,8,8,6,7,7,4,8,7,8,2,10,7,9 +Q,6,9,7,11,7,7,10,5,3,6,9,12,3,9,7,8 +D,3,2,4,3,3,7,7,6,6,6,6,5,5,8,3,7 +L,5,10,7,8,9,7,7,3,5,7,7,10,6,11,6,6 +L,2,7,4,5,2,9,4,1,6,9,3,10,0,6,2,10 +I,5,10,6,8,4,7,8,1,7,7,6,8,0,8,4,8 +V,3,9,5,7,1,9,8,4,3,6,14,8,3,10,0,8 +E,3,5,5,4,3,6,8,2,8,11,8,9,2,8,4,8 +D,4,9,6,7,5,7,7,7,8,6,5,4,3,8,3,7 +O,4,8,5,6,2,7,8,8,8,7,7,8,3,8,4,8 +J,6,8,4,11,3,6,10,3,4,13,5,5,3,8,7,8 +D,2,5,4,4,3,10,6,3,6,10,3,6,2,8,3,8 +M,5,10,7,6,4,13,2,5,2,12,1,9,6,3,1,8 +E,5,10,7,8,7,7,8,7,9,7,6,11,3,8,6,8 +G,3,4,4,3,2,6,7,5,5,9,7,10,2,9,4,10 +A,2,3,4,1,1,10,2,3,1,9,2,9,1,6,1,8 +R,3,6,4,4,3,10,6,3,6,10,3,7,3,7,3,10 +Q,4,9,5,8,5,8,8,7,5,6,8,9,3,8,5,10 +D,3,6,4,4,3,9,7,4,5,10,4,5,3,8,2,8 +I,3,11,4,9,2,7,8,0,8,13,6,7,0,8,1,7 +A,3,9,5,7,3,12,3,4,3,10,1,9,2,7,3,9 +L,3,6,3,4,1,0,1,6,6,0,1,5,0,8,0,8 +K,4,5,5,4,4,5,7,4,7,6,6,11,3,8,5,9 +V,7,10,7,8,3,2,11,6,5,13,12,7,3,9,1,8 +T,3,5,4,4,2,5,12,3,6,11,10,5,1,11,1,5 +P,4,6,4,8,3,5,9,10,5,8,6,5,2,10,4,8 +P,1,1,1,1,0,5,11,7,2,9,6,4,1,9,3,8 +R,1,0,1,0,0,6,9,6,3,7,5,8,2,6,3,10 +X,4,10,6,8,4,7,7,4,9,6,6,8,3,8,7,7 +F,4,9,4,7,3,1,13,4,4,12,10,7,0,8,2,6 +Q,1,2,2,3,1,7,8,4,1,7,8,10,2,9,3,8 +F,4,6,5,7,6,7,9,5,4,8,6,7,4,10,9,7 +T,5,10,7,7,6,6,7,7,7,7,10,9,4,6,8,7 +Q,4,5,6,4,4,7,4,4,5,7,4,9,4,5,6,7 +O,2,4,3,2,2,8,7,6,4,9,6,8,2,8,2,8 +O,5,8,6,6,5,8,7,7,4,10,6,7,3,8,3,8 +J,2,7,3,5,2,9,6,2,6,11,4,8,1,6,1,6 +O,7,11,5,6,3,7,9,6,5,9,5,6,4,9,5,8 +L,1,0,1,0,0,3,1,6,4,1,3,4,0,8,0,8 +C,2,4,3,3,1,4,8,4,6,11,9,12,1,9,2,8 +E,4,8,6,6,7,6,7,3,6,6,7,11,3,10,8,7 +M,9,14,11,8,7,5,4,4,3,7,4,10,10,1,2,8 +R,5,7,7,5,4,9,7,4,6,10,3,7,4,5,5,10 +I,3,10,4,8,2,6,9,0,8,13,7,7,0,8,1,7 +J,2,4,3,3,1,11,6,1,6,11,3,7,0,7,0,7 +R,3,7,3,5,3,6,10,7,3,7,4,8,2,7,5,11 +Z,2,4,4,3,2,7,7,2,9,11,6,9,1,9,6,7 +Y,3,5,5,6,1,9,12,2,3,5,12,8,1,10,0,8 +T,2,1,2,1,0,8,15,1,4,6,10,8,0,8,0,8 +T,5,7,6,5,4,6,10,1,8,11,9,5,1,10,3,4 +R,4,7,5,5,5,8,6,6,3,8,5,7,4,7,7,10 +I,1,8,1,6,1,7,7,0,8,7,6,8,0,8,3,8 +T,5,8,7,6,7,8,8,6,7,8,6,8,5,7,5,6 +I,0,0,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +Z,4,8,4,6,4,8,7,5,9,7,5,7,2,8,8,8 +Y,3,4,5,6,1,7,10,2,2,7,13,8,1,11,0,8 +U,6,10,8,8,5,5,8,6,8,7,10,10,3,9,1,8 +C,5,10,6,8,4,4,9,6,7,7,8,15,1,8,4,10 +T,3,9,4,6,1,6,15,1,6,8,11,7,0,8,0,8 +K,5,7,8,5,4,7,8,2,7,10,6,8,3,8,3,7 +Q,4,7,4,9,4,8,5,8,5,9,6,9,3,7,5,8 +Y,3,8,5,5,1,9,11,3,2,5,12,8,1,11,0,8 +H,2,4,3,3,2,7,7,6,5,7,6,9,3,8,3,8 +J,2,6,3,4,3,9,6,2,5,11,4,9,1,6,1,6 +K,4,7,5,5,6,7,9,5,4,8,5,8,4,6,6,10 +O,4,8,5,6,3,7,7,7,5,10,7,8,3,8,3,8 +Q,2,2,3,2,2,7,8,4,2,8,7,9,2,9,4,8 +B,2,3,3,1,2,7,7,4,5,7,6,6,1,8,5,9 +M,4,7,6,5,5,7,6,6,5,7,7,9,8,5,2,9 +Y,3,6,4,4,0,8,10,3,2,6,13,8,1,11,0,8 +Y,3,7,5,4,1,7,10,2,2,6,13,8,1,11,0,8 +T,2,3,3,2,1,6,11,2,6,11,9,5,1,11,2,5 +V,3,10,5,7,4,7,11,2,3,5,11,9,2,11,1,8 +S,4,8,5,6,3,7,8,4,8,11,7,7,2,8,5,6 +B,5,9,7,6,10,8,6,5,3,7,7,8,6,9,8,9 +S,2,2,3,3,2,7,7,6,5,8,6,8,2,9,9,8 +M,4,5,8,4,4,9,6,3,5,9,5,7,8,7,2,8 +Y,2,0,2,0,0,7,10,3,1,7,12,8,1,11,0,8 +N,2,1,3,1,2,7,8,6,4,7,6,6,5,9,2,6 +D,4,8,6,6,4,8,7,5,7,11,5,5,3,8,3,8 +M,3,4,6,3,3,5,6,4,4,10,10,11,8,7,3,8 +Z,4,9,6,7,4,7,9,2,9,11,7,6,1,7,6,6 +R,3,8,5,6,6,8,8,3,4,6,6,8,6,10,7,6 +V,7,11,7,8,3,4,11,3,4,9,11,7,3,10,1,8 +S,4,6,6,4,6,9,6,4,3,9,6,9,4,8,10,10 +Z,1,4,2,3,2,7,7,5,8,6,6,9,2,8,7,8 +G,4,6,4,4,2,6,7,6,6,10,8,10,2,9,4,9 +J,5,7,7,5,4,9,5,5,6,8,6,6,2,7,4,6 +L,2,2,3,3,2,4,4,4,7,2,1,6,1,7,1,6 +Z,3,6,4,4,2,7,7,3,14,9,6,8,0,8,8,8 +R,7,10,9,8,8,9,8,3,6,9,3,8,3,6,4,11 +J,2,11,3,8,2,13,3,6,4,13,2,10,0,7,0,8 +N,4,5,7,4,3,6,9,2,5,10,7,7,5,8,1,8 +X,1,1,2,1,1,8,7,3,8,7,6,8,2,8,5,8 +L,4,9,6,7,7,7,7,3,6,8,7,10,7,10,7,5 +H,7,11,9,9,9,6,7,7,4,6,5,7,3,7,7,10 +O,4,9,3,4,2,6,7,6,3,9,6,8,4,10,4,7 +M,6,10,9,8,9,7,6,5,5,7,7,11,14,6,2,9 +V,2,3,4,5,1,8,8,4,2,6,13,8,3,10,0,8 +Y,8,11,8,8,4,2,11,4,5,13,13,8,1,11,2,6 +Q,6,6,8,9,4,8,6,8,8,6,5,8,3,8,4,8 +M,4,8,6,6,5,10,6,6,4,6,7,5,7,5,2,5 +Q,3,6,5,8,7,9,7,5,1,6,6,9,7,9,4,9 +A,3,6,5,4,2,10,3,2,2,8,3,10,2,6,2,7 +U,5,7,7,5,5,8,7,8,5,6,7,9,3,8,4,6 +B,4,7,6,5,5,7,8,5,5,9,7,6,3,7,6,7 +S,7,15,5,8,3,10,3,4,4,10,3,10,4,6,5,11 +B,6,10,8,7,8,8,8,4,6,10,6,6,5,7,7,9 +K,4,7,7,5,4,3,8,3,7,11,11,11,3,8,3,5 +R,4,8,7,7,8,7,8,3,4,7,4,8,6,8,5,6 +W,5,8,7,6,4,3,11,3,3,9,10,10,7,11,1,8 +H,4,7,5,5,5,6,7,5,7,7,6,10,6,8,3,9 +H,2,1,2,1,1,7,7,12,1,7,6,8,3,8,0,8 +X,4,11,5,8,2,7,7,5,4,7,6,8,3,8,4,8 +C,2,4,3,3,1,4,8,4,7,10,9,13,1,8,2,7 +I,5,8,7,6,3,9,4,3,6,6,7,4,1,10,4,7 +G,3,3,4,4,2,7,6,7,8,6,5,10,1,8,6,11 +X,2,3,3,4,1,7,7,4,4,7,6,8,3,8,4,8 +Y,4,7,6,9,7,10,9,5,2,6,7,8,7,11,7,5 +M,5,10,8,8,6,12,6,2,4,9,3,6,8,6,2,8 +X,10,14,9,8,5,7,7,2,10,9,6,8,4,6,4,8 +M,5,7,7,6,9,5,8,5,3,6,5,8,11,7,6,8 +C,4,8,4,6,3,4,8,6,6,12,10,12,2,9,3,8 +U,8,10,9,8,4,3,9,6,8,12,11,9,3,9,1,7 +R,5,11,7,8,7,9,8,4,5,9,4,7,3,7,4,11 +I,0,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +O,4,4,5,7,2,7,8,8,8,6,8,9,3,8,4,8 +B,2,1,3,2,2,8,7,5,6,7,6,5,2,8,6,9 +E,4,6,6,4,4,6,8,2,9,11,7,10,2,9,4,8 +N,5,10,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +M,4,5,8,4,4,7,6,3,4,9,7,8,7,5,2,8 +F,1,3,2,1,1,6,10,3,4,13,7,5,1,9,1,8 +R,3,6,4,4,2,5,10,8,2,7,4,8,2,7,6,11 +D,4,10,4,7,3,6,7,11,9,6,5,6,3,8,4,8 +U,4,7,5,5,2,7,5,12,5,7,15,8,3,9,0,8 +V,3,11,5,8,4,7,11,2,3,6,11,9,2,10,1,8 +U,5,9,5,6,4,8,5,12,4,7,12,8,3,9,0,8 +I,0,1,1,2,0,7,7,2,6,7,6,8,0,8,2,8 +V,5,11,8,8,9,7,6,4,2,7,8,8,5,9,4,7 +D,4,7,4,5,2,5,7,10,8,6,5,5,3,8,4,8 +V,4,7,5,5,3,9,12,2,3,3,10,9,3,11,2,8 +O,6,10,4,5,3,6,9,7,4,9,7,10,5,10,5,7 +E,3,6,4,4,3,5,8,3,7,11,8,9,2,8,5,7 +Z,8,8,5,12,5,10,3,4,5,12,5,9,3,8,9,11 +S,6,10,7,8,4,8,7,5,9,11,4,7,2,7,5,9 +C,4,7,5,5,3,8,7,8,6,6,7,10,3,8,3,9 +W,7,11,7,8,6,3,10,2,3,10,10,8,8,10,2,6 +J,2,6,4,4,2,9,5,4,5,14,4,10,0,7,0,8 +T,3,3,4,2,1,5,11,2,7,11,9,5,1,10,2,5 +N,8,15,10,9,5,4,9,4,4,13,11,9,6,9,0,9 +X,4,9,6,6,4,3,9,2,8,11,12,10,3,8,4,4 +R,4,9,6,6,5,9,7,5,5,9,4,7,3,7,4,11 +K,6,11,9,8,6,2,9,3,7,11,12,12,3,8,4,5 +A,3,7,6,5,4,5,5,3,3,3,2,6,4,6,4,4 +S,4,9,5,7,5,7,7,7,5,7,6,7,2,8,8,8 +Z,2,1,2,1,1,7,7,5,8,6,6,8,1,8,6,8 +G,6,6,8,6,7,7,9,5,3,7,7,8,8,11,8,7 +K,5,10,6,7,2,3,8,8,2,7,5,11,4,8,3,10 +G,4,5,5,4,3,6,6,6,6,6,6,10,2,9,4,8 +W,3,6,5,4,6,10,7,4,2,7,6,8,5,10,1,5 +G,7,11,8,8,7,5,5,6,6,6,5,11,4,10,4,9 +T,4,5,5,4,2,6,11,2,8,11,9,5,1,10,3,4 +B,4,8,6,6,8,8,8,4,3,6,7,7,6,11,8,8 +X,4,7,5,6,5,6,7,2,4,7,7,10,3,10,7,8 +M,4,7,8,5,8,10,4,2,1,9,4,9,8,6,2,6 +V,4,9,6,7,1,6,8,5,3,8,14,8,3,9,0,8 +T,7,8,7,6,5,7,10,3,7,10,9,5,4,11,5,5 +A,6,10,8,8,8,7,7,8,4,7,6,8,4,8,11,2 +P,6,6,6,8,3,4,13,8,2,10,6,3,1,10,4,8 +L,3,6,3,4,1,1,0,6,6,0,1,5,0,8,0,8 +O,7,11,8,8,7,8,7,8,5,9,5,7,5,8,5,10 +T,4,11,6,8,5,9,11,1,8,6,11,8,1,11,1,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +J,4,8,5,6,2,7,6,4,6,15,6,11,1,6,1,7 +K,4,7,4,4,2,4,9,8,2,7,4,11,4,8,3,10 +Y,4,7,4,5,1,3,12,4,5,13,11,5,1,11,1,6 +E,6,9,8,7,6,9,6,1,8,11,4,9,4,8,5,10 +C,4,9,5,7,3,4,8,6,8,12,10,12,1,9,3,7 +W,9,10,8,7,8,4,11,3,2,9,8,7,7,12,3,6 +L,4,10,4,7,1,0,1,5,6,0,0,6,0,8,0,8 +P,9,15,8,8,4,6,10,6,5,14,5,4,4,10,4,8 +G,4,8,5,6,3,7,7,7,7,10,7,12,2,9,4,9 +X,4,9,5,6,3,7,7,4,4,7,6,7,3,8,4,8 +I,3,10,5,7,6,9,6,3,4,8,5,5,6,7,5,5 +F,3,6,6,4,5,5,9,2,3,10,8,7,5,9,3,4 +W,3,2,5,4,3,7,10,2,2,6,9,8,7,11,0,7 +D,5,9,5,4,3,7,7,4,6,10,6,7,5,9,6,5 +F,4,11,5,8,4,3,11,3,7,11,10,6,1,10,3,5 +I,0,3,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +J,4,6,2,9,2,12,5,2,4,9,5,7,2,9,4,11 +B,5,10,8,7,8,9,6,4,6,9,5,7,2,8,6,10 +W,5,10,8,7,6,5,8,4,1,7,9,8,7,11,0,8 +U,3,9,4,6,3,7,6,13,4,6,10,8,3,9,0,8 +F,10,15,9,8,6,6,9,3,5,10,6,7,5,7,9,6 +A,4,9,6,7,5,8,2,1,2,6,2,7,5,6,6,7 +Z,1,3,2,1,1,8,7,5,8,6,6,8,1,8,6,8 +X,6,11,10,8,5,10,7,2,9,11,1,6,4,9,4,10 +N,7,13,8,7,4,4,9,4,4,13,11,10,5,9,0,8 +U,4,8,6,7,5,8,8,5,4,5,7,8,7,8,2,7 +N,4,8,6,6,4,4,10,3,4,10,10,9,5,8,1,8 +Z,3,7,5,5,3,7,8,2,9,11,8,6,1,8,6,5 +D,5,10,6,7,3,6,7,10,10,6,5,6,3,8,4,8 +C,1,0,2,1,0,6,7,6,8,7,6,14,0,8,4,10 +Q,2,3,3,4,2,8,8,5,2,8,8,10,2,9,4,8 +M,4,9,5,7,6,7,6,10,1,7,8,8,8,5,0,8 +T,3,4,4,5,1,7,15,1,5,7,11,8,0,8,0,8 +Q,4,6,5,7,5,9,9,7,2,4,7,11,3,9,5,10 +T,8,10,8,8,5,5,11,2,7,11,10,5,2,12,2,4 +G,3,4,4,3,2,7,6,6,6,6,6,10,2,9,4,9 +O,5,8,6,6,5,8,7,7,4,9,6,7,3,7,4,9 +C,4,7,4,5,2,3,8,5,7,11,11,12,1,8,2,7 +B,6,11,8,8,7,9,7,4,6,10,5,6,3,8,6,10 +C,5,6,6,5,5,5,6,3,6,7,7,11,5,11,7,8 +Q,4,7,6,5,4,8,4,7,4,6,6,11,3,8,5,9 +U,4,5,5,4,2,5,8,5,8,9,7,8,3,9,3,5 +W,11,15,11,8,5,2,9,3,2,9,11,9,9,12,0,6 +O,2,4,3,2,2,7,7,7,5,9,6,8,2,8,3,8 +K,3,4,5,3,3,9,7,2,7,10,3,8,3,8,3,9 +C,2,5,3,4,2,6,8,7,8,9,8,13,1,10,4,10 +S,5,10,7,7,4,8,7,4,9,11,5,7,2,8,5,8 +A,3,6,5,4,3,8,5,3,0,7,1,8,2,6,1,8 +J,4,9,6,7,3,5,9,2,6,15,7,8,1,7,1,7 +N,2,4,4,3,2,7,9,2,4,10,6,6,5,8,1,7 +E,2,7,4,5,3,7,7,5,8,6,5,8,3,8,6,9 +T,5,12,5,6,3,7,9,2,6,11,6,6,2,9,5,5 +A,2,8,4,5,2,9,5,3,1,8,1,8,2,7,2,8 +T,2,8,3,5,1,9,14,1,6,5,11,9,0,8,0,8 +O,4,6,4,4,3,7,7,7,5,10,7,9,3,8,3,8 +V,1,0,2,0,0,8,9,3,1,6,12,8,2,11,0,8 +E,3,7,3,5,2,3,8,6,10,7,6,14,0,8,7,8 +F,4,7,6,5,3,7,10,3,6,13,5,4,2,10,2,7 +F,5,12,6,8,2,1,13,5,4,12,10,7,0,8,3,6 +Q,8,12,7,6,4,12,3,3,7,11,2,9,3,8,5,14 +H,6,7,8,5,5,7,7,3,7,10,7,9,3,8,3,7 +Q,3,3,4,5,3,8,8,6,2,5,7,9,3,8,5,9 +O,7,11,9,8,6,8,7,9,5,7,6,6,4,8,5,10 +Z,6,11,8,8,7,10,5,5,5,8,5,7,4,7,10,5 +L,3,3,3,5,1,0,1,6,6,0,0,6,0,8,0,8 +Y,6,8,6,6,3,2,11,3,6,12,12,6,1,11,2,5 +C,3,5,4,4,2,6,8,7,7,9,8,12,2,10,4,10 +J,2,7,2,5,1,13,4,5,4,13,2,9,0,7,0,8 +Z,3,8,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +L,2,2,3,3,1,4,4,3,7,2,1,7,0,7,1,6 +U,3,7,4,5,3,7,6,11,4,7,12,8,3,9,0,8 +R,3,8,4,5,2,5,10,9,4,7,4,8,3,7,6,11 +C,5,8,5,6,3,4,8,6,7,12,10,11,1,9,2,7 +I,2,9,2,7,3,7,7,0,7,7,6,8,0,8,3,8 +S,3,2,3,3,2,8,7,6,5,7,6,8,2,9,9,8 +R,4,5,5,4,4,7,8,5,6,7,5,6,6,7,4,8 +X,6,10,9,8,4,8,8,1,9,10,4,7,3,9,4,8 +F,3,5,5,4,2,7,9,2,6,13,6,6,3,8,3,7 +U,7,10,8,8,4,3,9,6,7,12,11,9,3,9,2,7 +K,2,3,3,2,2,5,7,4,7,7,6,11,3,8,4,9 +R,4,11,6,8,8,7,7,3,4,7,6,8,6,8,7,5 +E,3,9,4,7,4,6,7,7,8,7,6,11,3,8,6,8 +Y,9,10,9,8,5,3,10,3,6,12,12,7,2,11,2,5 +D,3,5,5,4,3,9,7,5,7,9,5,5,3,7,4,8 +G,4,10,5,8,5,5,6,6,4,8,7,12,4,8,6,7 +R,5,11,7,8,6,7,8,5,7,6,5,8,4,6,7,9 +P,4,6,6,8,8,10,8,3,3,6,8,7,6,10,6,4 +D,3,6,5,4,6,9,8,4,4,7,6,6,4,8,8,5 +T,3,5,4,4,2,6,11,2,7,11,9,5,1,11,3,4 +I,7,14,5,8,3,10,5,6,5,13,3,7,3,8,5,10 +Z,5,7,6,5,5,9,6,5,4,7,5,7,3,8,10,6 +H,5,10,8,8,7,7,8,2,6,10,7,8,3,8,3,7 +T,2,1,2,2,0,7,14,1,5,7,11,8,0,8,0,8 +H,6,9,9,6,7,10,6,3,6,10,3,7,5,6,4,9 +I,5,10,6,8,3,9,6,2,7,7,6,5,0,8,4,7 +J,3,6,5,7,4,8,8,4,5,7,7,7,3,9,9,11 +D,6,12,6,6,4,10,3,4,4,11,2,8,4,6,4,10 +I,1,1,1,2,1,8,7,1,7,7,6,7,0,8,2,7 +P,5,9,7,6,5,9,8,2,5,13,5,5,2,9,3,9 +A,5,7,7,6,6,5,8,3,5,7,8,11,7,9,3,8 +A,6,9,9,8,8,7,8,2,4,7,7,8,6,5,5,6 +V,4,7,5,5,2,6,11,3,2,8,11,8,2,9,3,8 +D,5,11,7,8,6,6,7,8,7,6,6,5,3,9,4,9 +Q,2,2,3,3,2,8,8,5,1,5,7,9,2,9,5,10 +B,2,6,3,4,2,6,7,9,6,7,6,7,2,8,8,10 +J,8,10,5,14,4,7,8,3,4,11,6,5,3,8,8,9 +E,2,2,3,4,3,7,7,6,7,7,6,9,2,8,6,10 +V,1,0,2,0,0,7,9,3,2,7,12,8,2,10,0,8 +T,2,10,4,7,1,10,14,1,6,4,11,9,0,8,0,8 +F,5,7,7,5,3,5,12,2,6,13,7,4,1,10,2,7 +R,4,9,5,6,3,5,12,8,3,7,3,9,3,7,6,11 +R,1,0,2,1,1,6,9,7,2,7,5,8,2,7,4,10 +L,8,13,7,7,3,6,4,3,7,10,4,13,3,5,6,8 +O,5,8,7,6,4,8,5,8,5,6,4,5,4,8,4,8 +I,3,10,4,7,3,9,5,0,7,13,5,9,0,7,2,9 +Y,5,7,5,5,2,3,11,3,6,12,11,5,0,10,2,5 +Z,2,1,2,2,1,7,7,3,12,8,6,8,0,8,7,8 +F,2,4,3,3,1,6,10,3,5,13,7,5,1,9,2,7 +D,3,9,4,6,7,9,8,5,4,7,6,6,4,7,7,5 +Q,5,8,6,9,7,8,5,8,4,6,5,9,3,7,6,10 +G,3,7,4,5,3,6,6,6,5,10,7,13,2,9,4,10 +L,2,7,3,5,1,0,1,4,5,1,1,7,0,8,0,8 +T,2,3,3,2,1,9,12,3,6,6,11,9,2,11,1,8 +R,2,1,3,2,2,7,7,5,5,6,5,6,5,7,3,8 +I,1,8,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +I,1,6,1,4,2,7,7,0,7,7,6,8,0,8,3,8 +R,3,5,5,4,5,8,8,4,4,8,4,7,6,7,5,4 +H,4,8,6,6,6,7,7,6,6,7,6,9,3,8,3,8 +O,2,3,3,2,1,8,7,7,4,7,6,8,2,8,2,8 +X,10,15,11,8,6,7,8,2,8,11,8,8,5,12,4,7 +W,4,6,6,4,3,8,8,4,1,7,9,8,7,10,0,8 +S,6,9,8,7,5,7,7,3,7,10,8,9,2,10,5,6 +F,2,6,3,4,2,1,11,3,4,11,10,8,0,8,2,7 +E,5,11,7,8,7,10,6,2,7,11,4,8,4,8,6,12 +P,6,5,6,7,3,4,13,9,2,10,6,4,1,10,4,8 +K,3,3,5,2,2,7,7,2,7,10,5,10,3,8,3,8 +A,6,9,6,5,3,12,3,5,2,12,3,10,5,3,3,10 +Q,3,3,4,4,3,8,8,6,2,5,7,10,3,9,6,10 +S,4,4,5,7,3,7,5,6,10,5,6,10,0,9,9,8 +F,5,9,4,5,3,8,10,3,4,11,5,4,3,10,7,7 +G,6,11,8,9,9,7,9,6,3,6,6,9,6,7,8,7 +U,3,5,4,3,2,5,8,5,7,10,9,9,3,9,2,6 +R,9,15,9,8,7,7,8,3,5,8,4,9,7,7,7,6 +X,3,8,5,6,5,9,7,2,5,7,5,6,3,9,6,8 +X,6,9,9,7,5,6,8,1,8,10,9,9,3,9,3,6 +H,5,10,8,8,7,7,7,3,6,10,7,9,3,8,3,8 +L,3,6,4,4,3,6,7,9,5,6,6,9,3,8,5,11 +D,6,9,5,5,4,7,7,4,6,10,5,7,5,9,6,6 +H,6,8,9,6,5,7,7,3,7,10,6,8,3,8,3,8 +V,5,9,6,7,4,8,11,3,2,5,10,9,2,10,3,9 +E,6,11,9,9,6,10,6,2,9,11,4,9,3,8,5,11 +F,5,9,7,7,4,6,10,2,5,13,7,5,1,10,2,7 +O,5,8,7,6,5,7,8,8,5,6,7,11,4,8,4,8 +V,3,9,5,7,3,7,9,4,2,7,13,8,2,10,0,8 +K,2,5,3,3,2,7,7,4,6,6,6,9,3,8,5,10 +P,2,2,3,3,2,6,11,5,4,10,7,2,1,10,4,6 +V,1,1,2,1,0,7,9,4,2,7,13,8,2,10,0,8 +V,4,11,6,8,5,8,11,2,3,4,10,9,4,12,2,8 +J,2,8,3,6,2,9,6,3,6,12,4,9,1,6,2,6 +I,1,4,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +K,5,9,6,7,4,4,7,7,3,7,7,12,3,8,3,11 +R,4,10,6,8,6,8,8,4,6,8,3,8,4,5,5,12 +P,4,7,6,5,4,9,8,2,6,13,5,6,1,10,3,9 +Y,2,3,4,2,1,8,11,1,6,6,11,9,1,11,1,8 +E,4,10,6,8,6,7,7,5,8,7,7,9,3,8,6,9 +K,4,7,5,5,5,5,7,5,3,7,5,9,3,5,9,8 +S,4,6,6,6,6,8,8,5,5,7,7,8,4,10,8,9 +H,4,8,6,6,4,10,5,3,6,10,2,7,3,8,3,10 +K,3,4,6,3,3,6,7,1,7,10,7,10,3,8,3,7 +Y,2,5,4,7,6,9,8,4,1,6,7,9,3,11,7,7 +S,3,5,4,4,2,8,7,3,7,10,7,7,1,9,5,8 +B,3,6,4,4,5,7,7,6,5,7,6,6,2,8,6,10 +T,4,5,5,3,2,6,11,2,8,11,9,5,3,9,3,4 +O,2,1,3,2,2,7,7,7,5,7,6,8,2,8,3,8 +A,2,2,4,3,2,8,2,2,2,8,1,8,2,6,2,7 +F,2,1,3,2,1,5,11,3,5,11,9,5,1,9,3,6 +H,6,9,9,7,7,8,6,2,6,10,5,8,4,7,4,8 +W,9,10,9,7,6,3,11,2,3,9,9,8,8,11,2,6 +L,5,11,5,8,2,0,0,6,6,0,1,5,0,8,0,8 +T,2,5,4,7,1,8,14,0,6,6,11,8,0,8,0,8 +H,4,4,5,6,2,7,6,15,1,7,7,8,3,8,0,8 +Y,1,1,2,1,0,8,9,2,2,7,12,8,1,10,0,8 +S,2,3,3,4,2,8,7,5,8,4,6,8,0,8,8,8 +S,4,7,5,5,3,7,7,4,8,11,5,7,2,8,5,8 +Q,4,5,5,6,4,8,7,5,2,8,8,10,2,9,5,7 +V,2,1,4,1,1,9,12,2,2,5,10,9,2,10,1,8 +W,5,5,7,7,4,9,8,5,2,7,8,8,9,9,0,8 +T,2,6,4,4,2,5,13,0,5,9,10,7,0,8,0,8 +D,2,1,2,1,1,6,7,8,7,6,6,6,2,8,3,8 +A,4,9,7,7,3,12,2,4,2,11,1,9,3,7,3,9 +F,6,9,8,7,3,4,14,3,5,13,7,2,1,10,2,6 +D,5,10,8,8,11,9,9,5,5,7,6,6,5,8,11,6 +J,3,6,5,4,2,7,7,3,5,15,6,9,1,6,1,7 +S,3,1,3,2,2,8,7,6,5,7,7,8,2,9,9,8 +L,5,5,5,7,1,0,0,7,6,0,1,4,0,8,0,8 +E,3,3,4,5,2,3,7,6,10,7,6,14,0,8,7,7 +M,4,8,5,6,3,7,7,12,1,7,9,8,8,6,0,8 +L,1,3,2,2,1,7,4,2,7,7,2,9,0,7,2,8 +A,3,7,5,5,3,8,2,2,2,7,2,7,2,6,3,7 +R,5,10,6,8,7,6,7,5,6,6,4,8,3,6,5,8 +S,4,9,5,6,5,8,7,5,8,5,5,8,0,8,8,7 +E,1,3,3,2,1,7,7,2,6,11,7,9,2,9,4,9 +O,5,8,6,6,4,7,9,8,5,6,7,9,3,8,3,7 +R,3,7,5,5,3,10,7,3,6,10,3,7,3,7,3,10 +O,1,0,1,1,0,7,7,7,5,7,6,8,2,8,3,8 +F,4,6,6,4,2,8,10,2,6,13,5,3,2,10,2,8 +A,4,9,6,7,5,7,5,2,4,5,1,6,3,6,4,5 +R,3,10,4,7,5,6,9,8,4,7,6,8,2,7,5,11 +T,5,8,6,6,3,4,13,4,6,12,10,4,2,11,2,4 +W,5,6,7,4,4,5,11,3,2,9,8,7,9,13,2,5 +N,5,10,7,7,5,7,8,6,6,6,6,6,6,8,1,6 +S,5,5,6,7,3,8,8,6,9,5,6,7,0,8,9,7 +A,6,11,5,6,3,8,4,3,3,7,4,11,5,6,4,7 +Y,2,6,4,4,2,8,9,1,6,5,11,8,1,11,1,8 +V,5,10,8,7,5,7,12,2,3,5,10,9,4,12,2,7 +B,1,0,2,1,1,7,8,7,5,7,6,7,1,8,6,8 +N,5,10,8,8,5,5,9,5,5,8,8,9,7,9,2,5 +R,6,10,8,7,6,8,9,4,6,8,4,8,3,6,6,11 +Y,3,5,5,7,7,9,6,4,1,6,7,8,6,10,8,9 +W,1,0,2,1,1,8,8,4,0,7,8,8,6,10,0,8 +B,3,8,3,6,4,7,6,8,5,7,6,7,2,9,7,9 +C,2,1,3,3,1,6,8,7,7,8,8,13,1,10,4,10 +Y,5,9,8,7,4,5,9,1,7,9,12,9,1,11,2,7 +I,6,15,4,8,3,12,4,3,6,11,2,7,3,8,3,12 +D,5,10,6,7,6,8,9,5,5,11,6,5,5,8,5,9 +A,3,4,5,3,2,10,1,3,2,9,2,9,3,6,2,8 +A,3,7,5,5,3,12,3,2,2,9,2,9,2,5,2,8 +X,2,7,3,4,1,7,7,4,4,7,6,8,3,8,4,8 +R,3,6,4,4,3,6,8,8,4,6,5,7,2,7,5,11 +G,1,0,2,0,0,8,7,5,5,6,5,9,1,8,5,10 +Z,4,10,5,7,4,7,8,3,12,9,6,8,0,8,8,7 +X,2,2,4,3,2,8,7,3,9,6,6,9,3,8,6,8 +J,6,7,8,9,7,8,10,4,5,7,7,8,5,6,9,7 +A,5,9,5,5,3,12,2,5,1,12,3,10,3,3,2,10 +Q,2,2,3,3,2,8,7,7,3,6,5,9,2,9,3,9 +F,6,9,8,7,5,8,9,1,7,14,5,5,2,9,3,9 +A,4,7,6,6,5,8,8,2,4,7,7,8,5,7,4,5 +M,5,10,6,8,4,7,7,12,2,8,9,8,8,6,0,8 +Y,6,9,6,6,3,3,10,3,7,11,11,6,1,11,3,5 +M,5,2,6,4,4,8,6,7,5,7,7,8,8,6,2,7 +O,5,9,5,6,5,8,8,7,4,9,6,6,4,8,4,8 +V,2,4,3,3,1,3,12,4,3,11,11,7,2,11,1,7 +T,2,1,3,3,1,6,12,3,6,8,11,7,1,11,1,7 +B,3,5,4,7,3,6,8,9,7,7,5,7,2,8,9,10 +P,4,7,5,5,3,8,9,3,5,13,4,3,1,10,3,9 +H,4,5,6,4,4,7,7,3,6,10,6,8,3,8,3,7 +N,1,0,2,0,0,7,7,11,0,5,6,8,4,8,0,8 +B,8,15,7,8,6,10,6,3,5,10,4,7,7,6,8,9 +B,4,9,4,4,3,10,6,3,4,9,4,8,6,7,7,10 +T,2,4,2,3,1,7,11,2,6,7,11,8,1,11,1,7 +P,2,1,2,1,1,5,11,8,2,9,6,4,1,9,3,8 +R,3,4,4,2,2,7,8,5,5,7,5,7,2,6,4,8 +K,2,3,4,1,2,6,8,2,6,10,7,10,3,8,2,8 +E,3,5,5,4,3,6,7,2,8,11,7,9,2,8,4,8 +J,1,1,2,2,1,10,6,3,5,12,5,9,1,7,1,7 +M,7,6,10,6,10,7,8,4,4,7,5,7,11,8,5,5 +M,5,10,7,8,8,6,6,6,5,7,7,11,11,5,2,9 +S,3,7,4,5,3,8,7,7,7,8,6,7,2,8,9,8 +Y,7,8,6,6,3,3,10,3,7,11,12,6,2,11,3,5 +P,6,10,5,5,3,6,9,6,3,10,5,6,4,9,4,7 +J,5,9,6,7,3,9,5,4,6,15,4,10,0,7,1,7 +T,3,6,4,4,2,6,12,2,7,11,9,4,1,11,2,5 +D,1,0,1,1,1,6,7,8,5,6,6,6,2,8,3,8 +J,3,7,5,5,2,8,5,4,6,14,7,12,1,6,0,7 +V,3,7,5,5,1,7,8,4,3,7,13,8,3,9,0,8 +J,3,11,4,8,4,10,7,0,7,11,3,6,0,7,1,7 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +Z,3,7,5,5,2,9,6,3,9,11,3,9,1,7,6,9 +M,3,3,6,2,3,8,5,3,4,10,7,9,7,5,2,8 +Y,7,8,6,12,4,5,8,4,1,8,10,5,4,10,6,5 +A,3,8,5,6,3,8,3,2,2,7,1,8,2,6,3,7 +R,4,9,5,6,5,9,7,4,5,9,4,8,3,7,4,11 +W,6,5,9,8,4,11,8,5,2,6,9,8,9,9,0,8 +G,10,15,9,8,5,7,6,6,6,10,6,7,5,8,6,6 +I,1,4,0,2,0,7,7,1,7,7,6,8,0,8,2,8 +T,2,2,3,3,2,7,12,3,6,7,11,8,2,11,1,7 +B,7,14,5,8,4,7,6,4,5,10,6,9,5,7,7,9 +J,0,0,1,0,0,12,4,6,3,12,5,11,0,7,0,8 +U,3,6,4,4,2,7,4,14,5,7,13,8,3,9,0,8 +P,7,10,6,5,4,7,10,4,4,12,5,3,4,10,5,6 +H,3,3,5,2,3,7,8,2,6,10,7,7,4,10,3,7 +I,1,2,1,3,1,7,7,1,7,7,6,9,0,8,3,8 +S,2,6,3,4,2,7,6,5,8,4,6,8,0,9,8,8 +Y,5,6,5,4,2,3,11,3,7,12,12,6,2,11,2,5 +B,2,7,3,5,3,6,7,7,5,6,6,7,2,8,7,9 +M,5,8,8,6,6,8,6,6,5,6,7,8,8,6,2,7 +E,3,6,3,4,2,3,8,6,10,7,6,14,0,8,7,8 +G,3,7,4,5,2,7,7,8,7,5,6,10,2,7,5,10 +B,4,9,5,7,6,7,7,9,5,7,5,6,2,8,8,10 +V,5,10,5,5,3,10,9,4,5,8,8,5,3,10,2,8 +Y,5,6,5,4,2,3,12,4,5,12,11,5,1,11,1,5 +U,4,9,5,6,2,7,4,15,6,7,13,8,3,9,0,8 +D,4,4,4,6,2,5,7,10,8,6,6,5,3,8,4,8 +V,2,1,3,2,1,7,12,2,2,7,11,8,2,10,1,8 +A,2,4,4,6,2,7,5,3,1,7,1,8,2,7,2,8 +L,4,9,6,7,4,9,4,1,7,9,2,10,3,6,4,9 +O,3,7,4,5,3,6,7,7,4,7,6,10,4,8,3,8 +Z,6,10,8,8,6,8,7,2,9,12,5,8,1,7,6,8 +C,5,9,6,6,3,3,8,5,7,11,10,14,1,8,3,7 +E,3,7,3,5,2,3,6,6,10,7,7,14,0,8,7,8 +G,6,10,7,8,5,6,6,6,6,11,6,12,4,9,5,8 +J,4,6,6,7,5,7,8,4,6,6,8,7,3,9,9,10 +O,1,1,2,1,1,8,7,7,5,7,6,8,2,8,3,8 +J,5,9,6,7,3,9,7,2,6,15,4,8,0,7,1,7 +X,4,7,6,5,5,6,7,2,6,7,6,9,4,5,7,9 +U,4,7,6,5,8,8,8,4,4,6,7,8,7,8,5,8 +J,2,4,3,3,1,9,7,2,6,14,4,8,0,7,0,8 +V,4,11,6,8,2,7,8,4,3,7,14,8,3,9,0,8 +O,5,10,6,8,5,8,8,8,4,7,7,6,5,7,4,9 +R,4,8,6,6,4,8,8,4,6,9,3,8,3,6,4,11 +R,4,6,6,4,3,9,7,5,6,9,4,7,3,7,4,11 +O,5,11,6,8,5,8,7,9,6,6,7,9,3,8,3,8 +D,5,11,7,8,6,7,8,8,7,7,7,4,4,7,5,9 +R,3,6,4,4,3,6,7,5,5,6,5,7,3,7,5,9 +F,5,8,7,6,5,7,9,3,5,13,7,6,2,10,2,7 +K,6,7,8,5,4,6,7,2,7,10,6,10,4,7,4,8 +U,4,6,5,5,5,7,6,5,4,6,7,8,4,8,1,7 +E,2,4,3,3,2,8,7,6,8,7,7,8,2,8,6,8 +G,4,6,5,4,3,7,6,6,6,10,6,11,2,10,4,10 +F,4,6,5,4,3,6,11,3,5,13,6,4,2,10,2,7 +P,4,8,4,6,2,4,12,8,2,10,6,3,1,10,4,8 +K,4,7,6,5,4,6,7,5,7,6,5,10,3,8,5,9 +P,3,5,5,3,2,8,9,4,4,12,4,3,1,10,3,8 +Y,4,9,5,6,5,9,4,7,5,8,8,7,5,8,5,5 +P,5,8,7,6,5,8,10,5,4,11,4,3,1,10,3,8 +K,3,6,5,5,4,8,7,2,4,9,3,8,4,6,4,10 +D,3,4,4,3,3,7,7,7,7,6,6,5,2,8,3,7 +M,6,10,7,8,4,8,7,13,2,6,9,8,9,6,0,8 +A,3,4,6,6,2,7,6,3,0,7,0,8,2,7,1,8 +Q,4,9,5,8,5,8,8,7,4,6,8,9,2,8,4,9 +G,5,9,6,7,5,5,6,6,7,6,5,11,2,10,4,8 +B,4,8,5,6,6,8,8,6,6,7,6,6,5,8,5,10 +R,2,3,4,2,2,8,7,4,4,9,4,6,2,7,3,9 +J,3,6,4,4,2,8,7,3,5,14,6,10,1,6,1,7 +U,7,13,7,7,3,6,5,5,6,3,9,8,5,9,2,7 +T,5,5,5,4,3,6,11,2,8,11,9,4,3,10,4,4 +W,3,1,5,2,2,7,11,3,2,7,9,8,6,11,0,8 +Y,1,0,2,0,0,7,9,3,1,7,12,8,1,11,0,8 +A,3,7,4,5,2,9,3,3,3,9,1,8,2,6,2,7 +F,4,10,5,8,6,5,9,4,6,9,10,7,2,9,3,6 +C,6,9,7,7,8,5,6,4,5,7,6,11,6,9,4,8 +O,2,0,2,1,0,7,7,6,5,7,6,8,2,8,3,8 +F,3,5,5,3,2,6,11,2,6,14,7,4,1,9,2,7 +T,7,13,6,7,4,9,7,2,7,10,5,8,3,8,5,8 +P,4,9,4,6,2,4,11,9,3,9,6,4,1,10,4,8 +C,3,7,4,5,2,4,9,6,7,12,10,11,1,10,2,7 +X,7,10,10,8,6,7,8,0,8,9,6,8,3,8,3,7 +T,7,10,6,5,3,5,11,2,7,12,7,5,2,8,4,4 +M,4,4,6,3,3,6,6,3,4,10,9,10,8,4,3,8 +K,5,10,8,8,6,4,9,1,6,10,9,10,3,8,3,6 +G,3,6,4,4,2,6,8,5,5,9,7,10,2,8,4,9 +Z,1,4,2,2,1,7,8,5,8,6,6,9,1,8,7,7 +V,6,7,6,5,2,3,12,5,4,12,12,7,3,10,1,8 +M,3,4,4,2,3,8,6,6,4,7,7,9,9,5,1,8 +O,3,6,3,4,3,7,8,7,4,9,7,10,3,8,2,9 +O,6,8,8,6,9,7,9,5,2,7,6,7,10,10,6,9 +H,4,5,6,4,4,7,8,3,6,10,7,7,5,9,4,8 +M,7,10,12,8,15,10,6,3,3,9,4,7,12,6,5,5 +B,5,10,6,8,7,9,8,3,5,7,6,7,7,7,6,9 +V,5,6,5,4,2,4,11,2,3,9,11,7,2,10,1,7 +R,2,1,2,2,2,6,8,4,5,6,5,7,2,7,4,8 +E,2,4,4,3,2,6,8,3,9,11,8,9,2,8,4,6 +G,5,11,6,8,6,8,8,8,6,5,7,9,3,5,7,11 +W,6,10,8,8,9,8,7,6,3,7,8,8,10,6,6,11 +C,2,5,3,4,2,6,8,7,7,9,8,13,1,9,4,10 +Q,2,1,2,1,1,8,7,7,4,6,6,8,2,8,3,8 +A,4,9,7,6,3,12,2,4,3,11,1,9,3,7,3,9 +V,5,8,5,6,2,3,11,3,4,10,12,7,2,10,1,8 +Z,2,4,5,3,2,7,8,2,9,11,7,7,1,8,5,6 +F,4,9,6,7,4,4,11,3,7,11,10,5,1,10,3,5 +L,6,9,8,7,6,6,6,8,6,6,6,9,6,7,5,11 +X,4,10,7,8,4,9,7,0,8,9,5,7,2,8,3,8 +V,2,3,4,4,1,9,8,4,2,6,13,8,3,10,0,8 +M,5,11,8,8,12,9,5,2,1,8,4,8,11,7,3,6 +J,2,3,2,5,1,13,3,8,4,13,4,12,1,6,0,8 +B,3,7,5,5,5,7,8,6,4,7,5,6,2,8,5,7 +O,2,4,3,3,2,7,8,6,4,9,6,8,2,8,2,7 +Y,6,9,6,6,4,5,9,1,7,8,9,5,2,11,3,4 +U,4,8,6,6,7,7,6,4,3,7,7,8,10,8,5,7 +U,6,9,6,7,4,3,8,5,7,11,10,9,3,9,2,6 +Y,3,5,5,7,6,8,8,3,2,7,8,9,3,11,7,6 +K,4,9,6,6,7,5,6,4,5,7,5,9,7,7,8,10 +A,4,5,6,7,2,7,4,3,1,7,1,8,3,7,2,8 +E,2,3,4,2,2,7,7,2,7,11,6,9,2,8,4,8 +K,5,9,7,7,4,3,8,3,7,11,10,12,3,8,4,6 +D,3,6,4,4,3,7,9,6,5,10,6,4,3,8,3,6 +M,3,5,6,3,4,5,6,3,4,10,9,10,7,6,2,8 +C,2,4,3,3,1,6,8,7,8,7,8,13,1,8,4,10 +U,4,9,5,7,2,7,5,14,5,7,14,7,3,9,0,8 +X,6,8,8,6,6,7,6,3,5,7,6,11,4,6,10,8 +F,3,9,3,6,2,1,14,4,3,12,10,5,0,8,1,6 +V,4,4,5,3,2,4,12,3,3,10,11,7,2,10,0,8 +Y,5,6,5,4,2,5,9,2,8,10,10,5,2,10,4,3 +K,6,10,9,8,5,3,7,3,7,10,11,12,4,7,4,7 +M,5,5,6,8,4,8,7,12,2,6,9,8,8,6,0,8 +V,4,9,6,7,8,7,5,5,2,8,7,8,8,8,5,8 +V,4,11,6,8,4,8,9,4,1,6,12,8,4,9,2,7 +W,3,3,4,1,2,4,10,3,2,9,9,7,5,10,1,6 +N,4,10,4,7,5,7,7,12,1,6,6,8,5,8,0,8 +V,6,11,9,8,11,8,5,5,3,8,7,8,6,9,5,9 +L,4,6,6,4,4,6,6,7,6,6,6,9,2,8,5,10 +G,2,1,2,2,1,7,7,6,5,6,6,10,2,9,4,9 +U,5,11,7,8,5,6,9,5,7,6,9,9,3,9,1,8 +X,4,9,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +U,4,9,4,7,2,7,4,15,6,7,13,8,3,9,0,8 +X,8,12,9,6,5,6,9,2,8,11,8,8,4,9,4,5 +E,5,10,8,8,9,7,8,3,6,6,7,11,4,11,8,7 +J,3,6,5,4,2,10,5,3,6,14,3,9,0,7,0,8 +A,2,2,4,3,1,6,2,2,2,5,2,8,2,6,2,6 +M,4,2,5,4,4,8,6,6,4,6,7,8,8,6,2,7 +R,5,11,7,8,5,11,7,3,7,11,1,6,6,7,4,10 +G,2,3,3,2,1,7,6,5,5,7,6,9,2,9,4,9 +A,2,5,4,4,2,11,3,3,2,10,2,9,2,6,2,8 +H,5,7,7,5,5,8,7,3,6,10,6,9,3,8,3,8 +H,4,8,6,10,7,8,4,4,2,7,4,6,5,7,8,8 +L,3,8,5,6,4,4,4,4,7,2,1,6,1,6,1,6 +B,5,9,7,7,7,8,7,5,5,9,6,6,3,9,6,9 +K,7,9,10,7,6,5,8,2,7,10,8,10,3,8,4,7 +Z,7,12,7,6,4,10,3,4,7,12,4,10,3,8,6,10 +B,6,11,8,8,11,8,6,5,4,7,7,7,9,11,11,10 +S,5,6,6,5,6,9,8,4,5,7,6,8,5,10,8,11 +Q,2,2,3,2,2,8,7,6,3,6,6,10,2,9,3,10 +F,4,7,6,5,3,5,11,4,5,13,7,4,2,10,2,7 +X,4,8,6,6,4,7,8,3,9,5,6,7,4,9,7,7 +I,2,7,3,5,2,7,7,0,6,13,6,8,0,8,1,8 +B,4,8,6,6,8,8,7,5,3,7,7,7,6,10,8,9 +H,7,11,9,8,10,8,8,6,7,7,6,6,6,8,4,7 +E,2,5,3,4,3,7,7,5,7,7,6,9,2,8,5,10 +F,3,7,4,5,3,6,10,3,5,10,9,6,2,10,3,6 +T,5,7,5,5,3,6,11,3,7,11,9,4,2,12,2,4 +O,3,8,4,6,3,7,8,7,5,9,8,8,3,8,3,8 +T,3,8,4,6,2,9,13,0,6,6,10,8,0,8,0,8 +M,6,9,9,7,7,8,7,2,4,9,7,8,8,7,2,8 +N,2,3,4,2,1,7,8,3,4,10,6,6,5,8,0,7 +E,2,3,4,2,2,7,7,2,7,11,7,9,2,8,4,8 +F,2,1,2,2,1,5,10,3,5,10,9,5,1,10,2,7 +B,3,7,3,5,3,6,8,9,7,7,5,7,2,8,8,9 +E,3,6,3,4,3,3,8,5,9,7,6,14,0,8,6,9 +R,5,7,7,5,4,9,8,4,6,9,4,7,3,7,5,11 +O,3,6,4,4,2,7,8,8,7,6,7,8,3,8,4,8 +Y,4,5,5,4,2,4,11,3,6,12,11,5,1,11,2,5 +A,4,9,6,7,4,8,2,1,2,6,2,8,2,7,3,6 +N,2,4,4,2,2,8,8,2,4,10,4,6,5,10,1,7 +U,3,3,3,1,1,5,8,5,7,10,9,8,3,10,2,6 +N,7,10,10,8,6,9,9,2,5,10,4,5,7,9,2,8 +H,6,7,9,5,4,9,6,3,6,10,3,7,6,8,5,9 +W,2,4,4,3,2,7,11,2,2,7,9,8,6,11,0,8 +J,2,6,3,4,3,9,9,4,3,8,4,6,4,8,5,4 +M,4,4,6,3,3,7,6,3,4,10,8,9,9,5,3,9 +I,1,4,2,2,0,7,8,0,7,13,6,8,0,8,0,8 +T,2,3,3,2,1,6,11,2,7,11,9,5,1,10,2,5 +Y,2,7,4,5,2,7,10,1,6,6,11,8,1,11,1,8 +Q,4,6,5,8,5,7,9,5,2,6,9,11,3,9,6,7 +O,2,1,3,2,2,7,7,7,5,7,6,8,2,8,3,8 +M,7,8,10,7,11,8,8,5,4,7,6,7,11,10,6,3 +J,5,11,4,8,4,6,11,2,3,12,6,5,2,9,8,8 +H,4,10,6,7,6,6,7,5,5,7,5,8,6,6,6,11 +A,2,3,4,2,1,10,2,3,2,10,2,10,2,6,2,8 +C,5,9,6,6,4,6,7,6,9,5,6,12,1,7,4,9 +E,1,0,2,1,1,5,7,5,7,7,6,12,0,8,7,9 +O,3,5,4,3,2,8,6,6,4,9,5,8,2,8,3,8 +X,4,7,7,5,3,7,8,1,8,10,8,8,3,8,3,7 +J,1,3,2,1,1,11,6,2,5,11,4,8,0,7,1,8 +V,7,9,10,8,11,7,6,5,5,7,6,8,7,10,8,8 +G,4,9,5,7,4,5,7,5,4,9,8,9,2,8,5,9 +P,2,7,3,5,2,4,12,8,2,10,6,4,1,10,3,8 +T,8,13,7,7,3,6,9,3,8,13,6,6,2,8,5,4 +U,2,1,3,2,2,7,9,5,6,7,9,9,3,9,1,8 +T,3,11,5,8,2,7,14,0,6,7,11,8,0,8,0,8 +T,7,10,6,5,2,5,10,3,8,13,7,5,2,8,4,4 +X,6,10,9,8,7,8,8,3,6,7,7,8,7,13,9,9 +K,4,10,6,7,6,5,7,5,7,6,6,12,3,8,6,9 +G,2,3,3,2,2,6,7,5,5,9,7,10,2,9,4,9 +V,3,7,5,5,1,7,8,4,2,7,14,8,3,10,0,8 +E,5,9,7,7,8,7,6,3,6,7,7,11,4,9,8,7 +G,2,5,3,4,2,6,7,5,5,9,7,10,2,9,4,9 +H,4,4,5,5,2,7,7,15,0,7,6,8,3,8,0,8 +N,5,6,7,4,4,11,7,3,5,10,1,4,5,9,1,7 +N,4,7,6,5,5,6,7,3,3,8,8,8,6,9,5,4 +O,5,10,6,7,4,7,7,8,5,10,6,9,3,9,4,6 +K,2,4,4,3,2,5,8,2,7,10,8,10,3,8,3,6 +Z,6,9,8,7,5,7,7,2,9,12,6,8,1,8,6,7 +L,1,3,2,1,1,6,4,1,8,8,3,10,0,7,2,8 +G,2,3,3,2,2,6,6,5,6,7,5,10,2,9,4,9 +C,6,12,5,6,4,7,9,4,5,8,7,9,4,8,8,10 +R,4,5,5,3,3,7,7,5,6,7,5,6,5,7,4,8 +Q,4,6,5,8,5,8,9,5,2,6,8,11,3,9,6,8 +P,8,12,7,6,4,9,8,4,6,13,4,4,3,10,6,7 +G,3,9,4,6,2,7,7,8,7,5,6,11,2,7,5,10 +B,4,9,4,6,3,6,7,9,7,7,6,7,2,8,9,10 +I,4,11,6,8,4,7,9,0,8,13,6,6,1,9,2,7 +A,4,7,6,5,3,9,3,2,2,8,1,8,2,6,3,7 +F,1,3,2,2,1,5,11,4,4,11,8,4,1,9,3,6 +A,3,5,6,4,2,7,1,2,2,6,2,7,4,6,4,7 +G,2,1,2,1,1,8,6,6,6,6,5,9,1,7,5,10 +B,3,3,4,4,3,6,8,8,7,7,5,7,2,8,8,9 +A,2,3,3,1,1,7,2,2,1,6,2,7,1,6,1,7 +B,3,5,3,4,3,7,7,5,5,6,6,6,2,8,6,10 +Q,4,8,6,7,3,8,6,8,7,6,5,8,3,8,4,8 +R,6,8,9,7,9,7,8,3,4,7,5,8,7,7,6,7 +X,9,13,8,8,4,6,7,3,9,9,9,9,4,8,4,6 +C,4,9,6,7,6,5,7,4,4,7,6,9,6,9,5,7 +W,7,8,7,6,5,4,11,3,3,9,9,7,7,11,2,6 +W,6,9,8,7,4,5,7,5,2,7,8,8,9,9,0,8 +Y,4,6,4,4,2,3,10,3,6,11,11,6,2,11,2,5 +G,3,2,5,3,3,7,6,6,6,6,6,10,2,9,4,9 +O,2,5,3,3,2,7,7,7,4,9,6,8,2,8,3,8 +I,1,4,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +E,2,3,2,1,2,7,7,5,6,7,6,8,2,8,5,10 +F,4,8,7,6,7,8,8,1,4,9,7,7,6,11,4,6 +Y,3,10,5,7,1,7,12,1,4,7,12,8,0,10,0,8 +Q,5,8,5,9,6,7,10,4,3,6,9,11,3,9,6,8 +O,5,9,7,8,6,6,6,5,5,7,4,7,4,8,6,7 +K,4,5,7,4,4,8,7,1,7,10,5,8,3,8,4,8 +Q,2,6,3,5,2,8,8,8,5,6,7,8,3,7,5,9 +L,4,8,5,7,5,8,5,4,4,6,7,7,3,8,8,11 +T,5,9,7,6,8,6,7,3,6,7,6,10,5,9,5,7 +W,4,7,6,5,4,5,11,2,3,8,9,9,7,11,1,8 +D,7,13,7,7,4,9,5,4,6,10,3,7,5,6,5,11 +Z,5,7,6,5,5,9,11,5,4,6,5,7,3,8,8,5 +R,3,4,5,3,3,8,7,3,5,10,4,7,2,7,4,10 +Y,4,8,6,6,3,5,10,2,8,10,12,9,1,11,2,7 +I,8,14,5,8,3,10,4,4,7,11,2,7,3,7,5,11 +Z,5,9,7,7,5,8,6,2,9,12,5,8,1,7,6,8 +N,5,7,7,5,4,10,8,3,5,10,2,4,5,9,1,7 +V,5,7,5,5,3,3,11,2,3,9,11,8,3,12,1,7 +L,4,11,6,8,4,7,4,2,7,8,2,9,2,5,3,7 +Q,5,10,6,8,6,8,4,8,4,7,5,9,4,9,4,7 +Y,3,4,5,3,2,9,11,1,7,5,11,7,1,11,2,8 +L,4,8,6,6,3,5,4,1,10,7,2,11,0,7,3,7 +B,9,15,6,8,4,9,5,6,6,10,3,9,6,6,7,11 +U,3,3,4,4,2,6,9,5,7,7,9,9,3,9,1,8 +R,5,7,7,5,5,9,7,3,5,10,3,7,3,6,4,10 +P,3,6,4,4,2,9,9,3,5,13,4,3,1,10,3,9 +O,4,6,5,4,3,8,7,8,4,7,6,5,3,8,3,7 +T,7,12,6,7,4,6,10,2,6,12,7,6,2,9,4,4 +Z,5,9,6,7,4,8,6,6,11,7,5,6,1,7,8,8 +P,2,4,3,2,1,5,11,4,4,10,8,3,1,9,3,6 +N,6,8,9,6,4,8,8,3,5,10,5,6,6,9,2,7 +T,3,10,4,8,3,9,13,0,5,6,10,8,0,8,0,8 +Z,5,9,5,4,3,5,8,2,8,11,9,9,3,9,5,5 +N,4,8,7,6,3,4,10,4,4,10,11,10,5,7,1,7 +Z,4,7,6,5,5,9,9,5,4,6,5,7,3,9,9,4 +G,3,7,4,5,3,6,7,7,6,8,7,11,2,8,4,9 +O,4,5,6,7,3,9,8,9,8,6,7,10,3,8,4,8 +Q,3,6,4,6,2,7,6,8,5,6,7,7,3,8,5,9 +A,1,1,2,1,1,7,4,2,1,7,1,8,2,6,1,7 +Z,4,9,4,7,2,7,7,4,14,9,6,8,0,8,8,8 +D,3,4,5,3,3,7,7,5,6,10,6,6,3,8,3,9 +A,2,4,4,3,1,8,2,2,2,7,2,8,2,6,2,7 +N,4,7,6,5,4,7,9,5,5,7,6,6,6,10,2,5 +W,4,10,6,8,7,7,7,6,2,7,8,7,10,7,5,9 +A,4,10,6,8,4,13,2,4,3,11,1,9,3,7,4,10 +N,8,11,12,8,6,7,9,2,5,9,6,6,6,9,1,8 +N,5,8,7,6,4,4,9,4,4,10,9,9,5,7,1,7 +H,4,8,5,6,7,8,8,5,3,7,6,6,7,9,8,8 +U,6,7,7,5,3,4,9,6,7,12,11,8,3,9,2,6 +Y,7,7,6,10,4,7,9,2,2,7,10,5,4,10,6,6 +G,7,15,6,8,4,9,3,3,3,7,3,5,4,7,4,9 +Q,1,0,2,1,0,8,7,6,3,6,6,9,2,8,3,8 +G,4,6,6,4,5,7,8,5,4,6,6,8,4,7,7,7 +H,2,3,3,2,2,7,7,5,6,7,6,8,3,8,3,8 +C,4,6,4,4,2,3,9,5,8,11,10,11,1,8,3,7 +E,1,0,1,0,0,5,7,5,7,7,6,11,0,8,6,10 +B,4,11,5,8,4,6,6,10,7,6,6,7,2,8,9,10 +S,4,7,5,5,2,8,7,4,8,11,6,7,2,8,5,8 +Z,5,11,7,9,5,8,6,6,11,7,5,6,2,7,8,8 +Y,2,3,2,2,1,4,11,3,6,11,10,4,1,11,2,5 +G,4,9,6,7,7,9,6,5,2,7,6,10,8,8,4,11 +D,6,10,8,8,6,7,7,7,8,7,7,4,3,8,3,7 +B,5,9,8,8,9,7,8,5,4,7,6,8,7,9,8,6 +G,5,11,6,8,5,5,5,6,7,7,5,12,2,10,4,9 +O,4,10,5,8,3,7,6,9,8,6,4,7,3,8,4,8 +Q,5,7,6,9,6,9,10,6,3,4,8,12,3,10,8,12 +K,2,3,3,1,1,6,7,1,6,10,7,10,3,8,2,8 +Y,4,6,4,4,2,3,11,5,5,12,12,6,2,11,1,6 +F,5,7,6,8,7,7,9,5,5,7,6,8,4,8,8,7 +S,4,6,5,4,2,6,8,4,8,11,5,7,2,6,5,8 +G,4,7,5,5,4,6,6,6,5,9,7,12,3,8,4,9 +L,2,1,3,2,1,4,4,4,8,2,1,6,0,7,1,6 +V,5,10,5,8,3,3,11,4,4,10,12,8,2,10,1,8 +D,4,7,5,5,4,7,8,8,4,8,6,4,3,8,3,7 +H,7,10,9,8,6,10,5,3,6,10,2,7,5,7,5,9 +P,4,8,6,6,4,5,13,6,2,12,6,2,0,10,3,7 +T,6,11,5,6,2,5,10,2,7,13,7,5,2,8,4,4 +P,2,7,3,4,2,4,12,8,2,10,6,4,1,10,3,8 +H,6,7,9,5,5,8,7,3,7,10,4,7,5,6,4,8 +E,6,9,8,7,7,10,6,2,7,11,4,8,4,6,6,11 +J,2,9,3,6,1,11,3,10,3,12,7,13,1,6,0,8 +B,2,1,2,2,1,7,7,8,5,6,6,7,2,8,7,10 +Y,4,11,6,8,1,6,10,2,2,7,13,8,1,11,0,8 +E,4,11,4,8,5,3,9,5,10,7,6,14,0,8,6,8 +E,4,6,5,4,4,10,6,2,6,11,4,9,2,8,4,12 +E,4,9,6,6,5,7,7,2,7,11,7,9,3,8,4,8 +X,1,0,1,0,0,7,7,4,4,7,6,8,2,8,3,8 +U,5,10,6,7,6,8,8,8,5,6,7,10,3,8,4,6 +E,3,4,3,3,3,7,8,6,8,7,5,9,2,8,6,9 +V,5,10,7,8,5,5,12,3,2,9,10,8,5,10,6,8 +G,3,7,4,5,2,8,7,7,7,6,6,10,2,7,5,11 +I,1,5,1,4,1,7,7,1,7,7,6,8,0,8,2,8 +U,6,8,7,6,5,4,8,5,7,9,7,9,4,8,3,4 +D,4,9,6,7,5,7,7,9,4,8,7,4,4,8,4,8 +Y,4,5,6,7,1,7,12,2,3,7,12,8,1,10,0,8 +P,5,8,7,11,10,9,8,4,3,6,8,7,6,10,6,4 +T,3,9,4,7,4,6,11,4,6,8,11,7,2,12,1,7 +S,5,8,7,6,4,6,8,3,7,10,6,7,3,7,5,6 +Y,6,8,6,6,3,4,10,2,8,11,11,5,1,10,3,4 +J,2,7,2,5,1,11,3,9,3,13,7,13,1,6,0,8 +E,3,8,4,6,2,3,6,6,11,7,7,14,0,8,7,7 +T,6,14,6,8,4,9,7,3,7,12,5,6,2,8,6,6 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +F,2,3,2,1,1,5,10,4,5,10,9,6,1,9,3,7 +K,4,8,4,6,2,4,7,8,2,7,7,11,3,8,3,11 +D,4,9,4,4,2,9,6,5,5,11,4,7,5,7,5,11 +A,4,9,7,7,4,12,3,2,2,9,2,9,2,6,2,8 +O,5,6,7,5,5,6,6,6,5,7,5,6,3,6,5,6 +H,4,7,6,5,4,11,6,4,6,10,2,6,3,8,3,9 +X,3,7,4,5,3,7,6,3,5,6,6,9,2,9,8,8 +B,4,10,4,8,4,6,6,9,6,6,6,7,2,8,9,11 +X,2,1,3,2,1,8,7,3,8,6,6,8,2,8,5,8 +P,2,4,3,3,1,5,11,4,4,10,8,3,0,10,3,6 +W,8,15,8,8,6,1,7,2,3,9,10,9,9,10,1,5 +U,4,4,5,6,2,7,3,14,6,7,13,8,3,9,0,8 +J,2,6,3,4,3,10,7,3,3,9,4,7,2,8,7,8 +W,3,8,5,6,8,7,5,6,2,7,6,8,8,12,3,10 +P,9,14,7,8,4,7,9,6,4,13,4,4,5,10,4,8 +P,3,1,3,2,2,6,9,5,4,9,7,4,1,9,3,7 +Q,6,8,8,7,6,7,4,4,5,6,4,8,4,5,6,7 +D,5,9,6,6,5,9,7,4,5,10,5,6,3,8,3,8 +J,4,8,6,6,2,8,5,5,5,14,8,13,1,6,1,7 +H,6,9,8,7,8,8,8,5,7,7,6,9,6,8,4,8 +S,3,4,3,3,2,8,8,6,5,7,6,7,2,8,9,8 +N,2,0,2,1,1,7,7,12,1,5,6,8,5,8,0,8 +Z,2,4,3,6,2,7,7,3,13,10,6,8,0,8,8,8 +D,4,6,6,4,5,8,7,5,6,9,4,5,3,8,3,8 +N,1,1,2,1,1,7,7,11,1,5,6,8,4,8,0,8 +J,6,13,5,10,4,7,11,3,3,13,5,4,2,9,8,9 +X,3,9,5,6,4,8,8,3,8,6,6,6,3,9,6,7 +J,2,5,3,7,1,12,3,9,4,13,5,12,1,6,0,8 +D,3,4,5,3,3,9,6,4,6,10,4,6,2,8,3,8 +E,3,4,3,6,2,3,7,6,10,7,6,14,0,8,7,8 +T,2,5,3,3,2,7,12,3,5,7,11,8,2,11,1,8 +S,3,2,3,3,2,8,8,7,5,7,5,7,2,8,9,8 +W,3,3,4,2,2,6,11,3,2,8,8,7,5,11,1,6 +M,2,1,3,2,2,6,6,6,4,7,7,10,6,5,2,9 +W,3,2,5,3,3,8,11,2,2,6,9,8,6,11,1,7 +D,5,8,7,6,6,8,8,6,6,9,5,4,5,8,4,9 +C,4,8,5,6,4,7,7,8,5,8,6,12,4,9,4,8 +E,2,3,4,2,2,6,9,2,8,11,7,8,2,8,4,7 +I,1,3,2,1,0,7,8,1,7,13,6,7,0,8,0,7 +E,4,8,5,6,6,6,7,5,7,7,6,10,3,8,5,9 +R,2,4,4,2,2,8,7,3,5,10,4,7,2,7,3,10 +U,3,4,4,3,2,6,8,6,7,7,9,9,3,9,1,8 +A,3,5,6,6,2,6,5,3,1,6,0,8,2,7,2,7 +A,4,9,6,6,2,6,3,3,3,6,2,7,3,6,3,7 +J,2,1,3,3,1,10,6,2,6,12,4,8,0,7,0,7 +O,5,9,7,7,5,7,5,9,5,8,5,11,4,8,4,8 +D,5,6,6,5,5,6,7,5,7,6,4,7,3,7,5,6 +K,3,5,4,3,3,5,7,4,7,7,6,10,6,8,4,9 +S,3,9,4,7,2,8,7,6,9,4,6,7,0,8,9,8 +Z,4,9,4,7,4,7,8,3,12,9,6,8,0,8,7,7 +U,9,11,10,8,7,4,8,5,9,9,7,9,8,10,6,1 +D,5,8,6,6,4,10,6,3,8,11,4,6,3,8,3,9 +Z,2,5,4,4,2,7,7,2,9,11,6,8,1,8,5,8 +K,5,10,7,7,9,8,8,3,4,6,6,9,10,10,7,7 +X,2,2,4,3,2,8,7,3,9,6,6,8,2,8,6,8 +O,6,11,7,8,7,7,8,8,4,9,8,8,3,8,3,8 +S,3,2,3,3,2,8,7,6,5,7,6,8,2,8,9,8 +F,2,3,2,1,1,5,10,4,4,10,9,5,1,9,3,6 +L,1,3,3,2,1,7,4,1,7,8,2,10,0,7,2,8 +M,4,6,5,4,4,8,6,6,5,7,7,8,7,5,2,8 +V,6,9,8,8,9,8,7,5,5,7,6,8,8,8,10,3 +X,3,7,4,5,2,7,7,4,4,7,6,8,3,8,4,8 +T,2,1,3,2,1,6,12,3,6,8,11,7,2,11,1,7 +H,5,8,7,6,4,7,8,3,6,10,7,8,3,8,3,7 +W,5,10,7,8,7,10,11,2,2,5,8,8,8,13,2,7 +Q,6,10,8,7,7,8,3,8,4,6,6,9,3,8,4,9 +I,2,6,3,4,1,7,7,0,8,14,6,8,0,8,1,8 +G,4,9,5,7,3,8,8,8,8,5,7,9,2,7,6,11 +P,4,7,5,5,3,6,11,8,2,10,5,3,1,10,4,7 +U,3,8,5,6,3,4,9,7,7,8,10,10,3,9,1,8 +P,4,10,5,8,5,7,9,6,6,9,7,3,2,10,4,7 +B,1,3,3,2,2,8,7,3,5,9,6,7,2,8,4,8 +U,3,3,4,1,1,5,8,4,6,10,9,9,3,10,1,6 +I,2,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +F,5,9,7,7,4,6,10,2,6,13,7,5,1,10,2,7 +Y,3,4,5,3,2,4,10,2,8,11,10,5,2,11,3,3 +F,3,5,4,4,3,4,11,3,6,11,9,6,1,10,3,6 +M,6,10,8,8,7,11,5,2,5,9,3,6,8,6,2,9 +J,2,1,3,3,1,9,6,2,6,12,4,9,1,7,1,7 +K,6,9,8,6,8,6,9,5,4,8,5,8,4,7,8,10 +Z,4,9,4,6,3,6,8,6,10,7,7,10,1,9,8,8 +U,5,11,5,6,3,6,5,5,4,7,9,10,5,6,2,9 +N,3,6,4,4,2,7,7,14,2,5,6,8,6,8,0,8 +V,4,7,6,6,6,7,8,6,4,7,6,8,6,9,7,7 +B,4,7,5,5,4,6,7,9,6,7,5,7,2,8,9,9 +J,4,6,3,8,2,9,7,3,4,10,5,5,2,9,5,9 +F,5,11,6,8,5,4,10,4,6,11,10,6,2,10,3,5 +A,1,3,2,1,1,7,2,2,1,7,2,8,1,6,1,7 +Z,3,6,5,4,4,6,7,3,7,7,6,9,0,8,8,7 +F,4,8,5,6,5,7,9,6,3,8,6,9,4,11,8,11 +M,6,10,9,8,8,11,6,2,4,9,4,6,9,6,2,8 +B,4,7,5,5,4,8,6,7,7,6,7,5,2,9,8,9 +C,3,7,4,5,2,5,9,6,7,12,9,9,2,10,3,7 +B,7,10,9,8,8,8,7,5,6,10,6,6,3,9,7,10 +V,6,9,6,7,3,1,12,4,4,12,12,8,2,10,1,7 +G,5,7,7,5,6,7,7,5,2,7,6,11,5,8,8,8 +Q,5,6,5,8,5,8,9,5,2,8,9,10,3,9,6,8 +K,4,5,6,3,3,4,8,2,7,10,9,11,3,8,3,7 +K,5,8,7,6,5,3,9,2,6,10,11,11,3,8,3,6 +V,5,11,8,8,2,6,8,5,3,8,14,8,3,9,0,8 +K,6,8,8,6,6,8,6,1,6,10,4,9,5,7,5,11 +Q,6,10,8,7,7,8,5,8,5,7,6,5,5,7,8,8 +O,7,13,5,7,4,6,6,5,5,6,4,8,5,7,5,7 +D,3,3,4,2,2,7,7,6,7,7,6,5,2,8,3,7 +K,3,3,5,2,2,6,8,2,7,10,7,9,3,8,2,7 +L,2,3,2,4,1,0,2,5,6,0,0,7,0,8,0,8 +D,3,6,4,4,4,7,7,6,6,6,6,5,3,8,3,7 +V,3,10,5,8,2,7,8,4,3,7,14,8,3,9,0,8 +B,4,6,6,6,7,7,8,5,5,8,6,9,6,9,8,8 +V,4,8,6,6,1,7,8,4,3,7,14,8,3,9,0,8 +V,2,1,4,2,1,7,12,3,3,7,11,8,2,10,1,8 +T,10,15,9,8,5,6,10,3,7,12,7,6,3,9,6,5 +L,1,3,2,1,1,6,4,0,6,8,3,10,0,7,1,8 +S,6,9,7,6,4,8,7,4,8,11,6,8,2,9,5,8 +Z,4,8,6,6,3,7,8,2,10,12,6,8,1,9,6,8 +K,4,6,4,4,1,4,7,9,1,7,6,11,3,8,2,11 +S,5,12,5,6,3,8,6,4,5,13,6,8,2,9,3,7 +L,2,7,3,5,3,4,4,4,6,3,1,7,1,6,1,6 +G,4,6,6,4,5,7,9,6,3,6,6,10,4,7,7,7 +M,5,4,6,6,3,7,7,12,2,7,9,8,9,6,0,8 +A,6,13,5,7,3,8,1,2,2,9,4,12,3,5,4,6 +C,1,1,2,2,1,6,8,6,7,8,8,12,1,9,4,10 +E,3,6,5,4,3,10,6,2,7,11,4,9,2,8,5,12 +U,8,10,9,8,5,3,9,5,7,10,10,9,3,9,2,6 +P,3,1,4,3,2,5,10,3,5,9,8,4,3,10,3,7 +J,2,8,2,6,1,14,3,5,4,13,3,9,0,7,0,8 +A,2,7,5,5,4,8,5,2,3,7,2,6,2,5,3,7 +G,5,11,6,8,5,5,6,6,6,6,6,11,2,9,4,8 +T,3,3,4,4,2,7,12,3,6,7,11,8,2,11,1,8 +K,5,9,6,7,4,6,7,4,8,7,6,9,3,8,5,9 +B,1,3,3,1,2,8,7,2,5,10,5,7,1,8,4,9 +J,2,10,3,8,1,11,3,10,3,13,7,13,1,6,0,8 +X,4,8,6,7,6,9,8,2,5,7,5,6,3,8,7,8 +D,3,8,4,6,4,8,8,6,5,9,6,4,3,8,3,6 +Z,2,2,3,3,2,7,7,5,9,6,6,8,1,8,7,8 +S,6,9,7,6,4,6,7,4,7,11,9,9,3,9,5,4 +U,5,10,6,8,3,7,4,15,6,7,14,8,3,9,0,8 +O,4,7,5,5,2,7,8,8,8,7,7,7,3,8,4,8 +K,4,5,7,4,4,6,7,1,7,10,6,9,3,8,3,7 +X,4,10,5,7,2,7,7,5,4,7,6,8,3,8,4,8 +B,3,5,5,3,3,8,7,2,6,10,5,7,2,8,4,10 +U,5,9,7,6,4,6,8,6,7,7,10,10,3,9,1,8 +B,4,9,6,6,8,9,6,4,4,7,7,8,8,8,8,7 +P,2,3,3,2,2,5,10,3,4,10,8,4,1,9,3,7 +B,7,15,7,8,8,6,8,3,6,9,6,7,8,5,8,6 +S,5,9,6,7,3,7,5,6,10,5,6,10,0,9,9,8 +O,7,12,5,7,3,8,7,6,5,9,4,7,5,9,5,8 +W,3,3,4,2,2,9,11,3,2,5,9,8,6,11,0,8 +W,4,3,6,5,3,5,8,5,1,7,8,8,8,9,0,8 +M,8,10,12,7,9,10,6,2,5,9,4,6,13,8,3,9 +H,5,8,7,6,6,8,8,7,7,7,6,7,3,8,4,7 +V,4,11,6,8,4,5,11,2,3,8,11,9,2,10,1,8 +P,7,11,8,8,7,6,9,8,6,8,7,9,3,10,8,9 +T,7,9,6,4,2,6,9,3,8,13,6,7,2,8,5,5 +S,3,7,5,5,7,8,9,4,4,7,6,7,2,7,8,1 +O,5,10,5,8,4,8,6,8,5,10,4,8,3,8,3,8 +V,2,6,4,4,1,8,8,4,2,6,13,8,3,10,0,8 +O,4,7,5,5,3,8,6,7,4,10,5,9,3,8,3,7 +K,4,3,4,5,1,4,8,9,1,7,6,11,3,8,2,11 +Z,2,3,2,1,1,7,7,5,8,6,6,8,1,8,6,8 +R,4,5,7,4,6,5,9,4,3,6,4,9,8,5,7,9 +G,1,0,2,0,0,8,6,5,5,6,6,9,1,7,5,10 +F,3,3,3,4,1,1,14,5,3,12,9,5,0,8,2,6 +M,2,1,2,2,1,7,6,10,0,7,8,8,6,6,0,8 +K,5,9,6,7,6,5,6,5,7,6,6,13,5,7,8,9 +T,3,6,4,4,3,6,11,3,5,11,8,5,3,12,2,5 +S,5,5,6,8,3,7,6,6,9,5,6,10,0,9,9,8 +H,2,4,4,3,3,7,7,3,5,10,6,8,3,8,3,8 +F,3,3,3,4,1,1,11,5,7,11,11,9,0,8,2,6 +Y,2,3,3,1,1,4,10,2,7,11,10,5,0,10,2,4 +T,6,9,5,4,3,7,9,2,6,12,7,6,2,9,4,6 +N,3,9,4,6,2,7,7,14,2,5,6,8,5,8,0,8 +G,5,11,7,8,5,5,6,6,7,6,5,9,4,9,4,7 +P,2,4,4,3,2,8,8,2,5,13,4,4,1,10,2,9 +P,8,9,6,5,3,7,10,6,5,14,5,4,4,10,4,7 +B,3,8,5,6,4,8,7,7,6,7,6,6,2,8,8,10 +W,5,11,8,8,7,10,8,5,1,6,10,7,9,13,1,5 +Z,3,7,5,5,4,7,7,2,7,7,6,8,0,9,9,7 +S,6,8,7,6,4,7,8,4,8,11,8,7,2,9,5,6 +F,6,10,9,8,4,4,14,3,4,13,7,3,1,10,2,6 +J,2,6,2,4,1,9,7,0,8,11,5,6,0,7,1,7 +O,7,11,9,8,11,8,9,6,2,7,7,8,9,9,6,12 +Q,7,8,7,9,6,8,7,6,3,8,8,11,3,8,6,8 +Y,7,9,7,6,5,5,9,1,8,10,10,6,3,11,5,3 +K,6,8,8,6,4,7,8,1,7,10,5,8,3,8,3,8 +Z,2,7,3,5,1,7,7,3,13,9,6,8,0,8,8,8 +G,5,11,6,8,3,8,7,8,8,6,6,9,2,7,5,10 +B,11,14,8,8,5,9,6,5,6,11,4,9,6,6,7,10 +M,5,10,6,8,6,7,6,6,5,7,7,9,8,5,2,9 +H,3,9,4,6,4,7,7,12,1,7,6,8,3,8,0,8 +A,1,3,2,1,1,11,3,3,2,10,2,9,1,6,1,8 +A,5,8,6,6,6,8,9,7,4,6,6,8,3,7,7,5 +W,7,9,9,8,11,9,8,6,5,7,5,8,11,10,9,4 +L,2,5,3,4,2,4,4,4,7,2,1,6,0,7,1,6 +T,5,10,6,8,6,6,6,7,7,7,6,8,4,11,7,7 +P,3,4,5,3,2,6,11,5,2,12,5,2,1,10,3,9 +J,0,0,1,1,0,12,4,5,3,12,4,11,0,7,0,8 +Y,8,11,8,8,4,4,9,1,9,10,10,5,2,9,4,3 +N,4,7,6,5,4,4,9,3,3,9,9,9,6,7,1,7 +E,3,5,5,3,2,7,7,2,8,11,5,9,2,8,4,9 +W,5,9,5,4,4,9,8,3,3,6,8,6,9,10,2,6 +Z,2,4,4,3,2,8,7,2,9,12,5,9,1,8,5,9 +V,6,9,6,7,3,2,11,3,3,10,11,8,2,10,1,8 +W,4,8,6,6,9,9,7,5,1,7,6,8,10,11,2,7 +U,8,10,8,8,7,5,7,5,8,8,6,9,8,8,6,1 +L,6,10,5,5,3,9,2,3,3,11,8,11,3,10,4,10 +A,3,11,6,8,4,12,3,3,3,10,1,9,2,6,3,8 +I,2,10,3,8,4,7,7,0,7,7,6,8,0,8,3,8 +V,5,11,8,8,9,8,8,4,2,7,8,8,8,10,6,8 +O,6,10,8,8,10,8,8,6,2,7,7,8,10,9,5,8 +W,5,10,7,8,9,8,8,5,3,7,9,8,6,8,3,7 +M,3,3,5,1,2,5,7,4,4,10,10,10,6,6,2,8 +B,4,10,5,7,7,8,8,6,6,7,6,6,6,8,6,10 +N,7,12,8,6,4,12,4,5,3,13,0,7,5,7,0,7 +P,4,8,5,6,4,5,11,4,6,11,9,4,4,10,4,7 +S,3,7,4,5,3,8,8,5,7,5,5,5,0,7,8,8 +F,4,9,6,7,4,2,12,3,6,12,11,6,1,10,2,5 +Q,4,6,6,9,3,8,7,9,6,6,6,9,3,8,5,9 +A,2,4,3,3,1,8,2,2,1,7,2,8,2,7,2,7 +B,7,11,9,8,9,9,7,4,6,9,5,6,3,8,6,9 +E,5,9,6,7,7,7,7,4,8,7,6,8,6,8,6,10 +H,5,9,8,7,5,7,7,3,6,10,6,8,3,8,3,7 +W,3,3,3,2,2,5,10,3,2,9,8,7,5,11,1,6 +B,3,9,4,6,5,8,7,6,6,7,6,5,2,8,7,9 +V,7,8,6,6,4,3,11,1,3,9,10,8,4,9,1,8 +Q,5,7,6,9,6,7,10,5,2,5,8,12,3,10,6,8 +Q,5,6,6,8,5,8,7,6,3,8,8,11,3,9,6,7 +G,5,9,5,7,4,5,7,6,6,10,8,9,2,9,5,9 +B,3,6,4,4,4,8,7,3,4,7,6,7,3,8,5,8 +F,1,3,3,1,1,8,10,2,5,13,5,4,1,9,1,8 +E,2,6,3,4,3,6,7,6,8,6,5,10,2,8,5,9 +U,5,9,6,7,4,3,8,5,6,9,8,10,3,9,2,5 +A,4,8,6,6,6,8,9,7,5,6,6,8,3,7,7,4 +Z,4,8,5,6,2,7,7,4,14,9,6,8,0,8,8,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +F,4,11,4,8,2,1,14,5,3,12,10,5,0,8,3,6 +T,4,8,5,6,3,6,11,3,7,9,11,7,5,12,1,7 +N,4,4,4,6,2,7,7,14,2,4,6,8,6,8,0,8 +V,4,9,5,7,2,5,9,5,2,8,13,8,3,10,0,8 +N,3,4,5,3,2,7,9,3,4,10,6,6,5,9,0,7 +Y,7,9,7,7,5,6,8,1,8,8,9,5,4,11,6,4 +N,4,8,5,6,2,7,7,14,2,4,6,8,6,8,0,8 +L,4,9,4,4,2,10,4,3,3,11,6,10,3,10,4,10 +S,4,11,5,8,5,8,8,8,6,7,4,6,2,7,8,8 +V,4,10,6,8,3,7,9,4,2,6,13,8,3,10,0,8 +K,4,5,4,8,2,3,7,8,2,7,5,11,4,8,2,11 +L,2,6,4,4,2,9,4,1,7,10,3,10,0,7,2,10 +B,5,10,5,8,4,6,8,10,7,7,5,7,2,8,9,10 +U,4,6,6,4,3,5,8,7,8,9,10,10,3,9,1,8 +O,4,9,6,7,8,8,8,5,1,7,7,8,8,9,4,9 +E,7,10,5,5,3,8,6,4,7,10,6,9,2,10,8,8 +J,0,0,1,1,0,12,4,5,3,12,4,11,0,7,0,8 +M,8,10,8,5,4,5,9,5,5,4,4,11,9,11,2,7 +G,3,9,4,7,2,7,6,8,8,6,5,10,2,8,6,11 +B,4,2,4,3,4,7,7,5,6,6,6,6,2,8,6,9 +S,3,7,4,5,3,8,8,5,7,5,6,8,0,8,8,8 +C,5,8,6,6,3,4,8,5,7,11,10,12,2,9,3,7 +K,4,4,4,6,2,3,7,8,2,7,6,11,4,8,2,11 +T,9,15,8,8,3,7,8,3,9,13,5,6,2,8,5,5 +A,2,4,4,3,2,8,2,2,2,7,2,8,2,6,2,7 +W,4,5,5,3,3,4,10,2,2,10,9,8,6,11,1,7 +Y,6,7,6,5,3,2,11,4,5,12,12,7,2,11,2,6 +O,3,8,5,6,2,7,8,8,7,7,7,8,3,8,4,8 +O,4,9,5,6,2,8,8,9,7,6,7,9,3,8,4,8 +X,2,2,4,3,2,8,7,3,9,6,6,8,2,8,6,8 +H,2,2,3,3,2,8,7,6,6,7,6,7,3,8,3,7 +X,2,3,4,2,1,6,8,1,8,10,8,9,2,8,3,7 +X,2,3,3,1,1,8,7,2,8,10,5,7,2,8,3,8 +H,2,1,2,2,2,7,7,6,5,7,6,8,3,8,3,8 +B,6,11,8,8,12,8,7,5,4,7,7,7,8,10,10,10 +R,3,7,5,5,5,6,7,3,3,6,6,9,5,9,7,5 +V,2,2,4,3,1,7,12,2,3,6,11,9,2,11,1,8 +E,4,10,5,8,5,7,7,6,9,7,6,10,3,8,6,8 +Y,3,5,4,8,6,9,10,3,3,6,8,9,3,12,6,6 +W,10,10,9,5,4,5,9,3,2,7,10,8,10,11,1,6 +W,9,12,9,6,5,4,7,2,4,7,10,8,10,10,2,5 +O,6,9,8,8,7,7,5,4,5,9,4,8,3,7,5,6 +D,4,4,5,6,3,5,7,10,9,7,6,5,3,8,4,8 +N,2,4,4,3,2,7,8,3,4,10,6,7,5,8,1,7 +W,4,3,4,2,2,4,10,2,2,9,9,7,5,11,1,6 +V,3,7,4,5,2,8,9,3,1,6,12,8,2,10,0,8 +O,5,10,6,8,5,8,6,9,4,7,5,8,3,8,3,8 +W,5,11,8,8,4,6,8,5,2,7,8,8,9,9,0,8 +S,4,5,6,5,6,8,7,5,5,7,6,7,5,8,9,10 +B,5,11,5,8,5,7,9,10,7,8,5,6,2,8,10,11 +X,6,11,9,8,4,4,9,3,9,11,12,10,3,9,4,5 +Q,4,5,5,7,4,9,9,6,3,4,8,11,3,9,6,10 +Q,3,6,4,5,2,8,5,8,7,7,4,8,3,8,4,8 +B,2,0,2,1,1,7,7,7,5,7,6,7,1,8,7,8 +H,9,13,8,7,5,5,8,5,4,9,10,10,7,11,5,9 +C,3,5,4,3,1,4,9,5,7,12,10,11,1,9,2,7 +J,7,11,6,8,4,8,9,3,3,13,4,5,2,9,8,9 +E,2,1,2,2,1,4,7,5,8,7,6,13,0,8,7,9 +Q,5,8,6,8,3,8,7,8,6,6,6,8,3,8,5,9 +J,5,6,4,9,3,10,5,2,6,9,5,7,3,8,4,11 +W,6,10,9,8,8,6,12,2,2,7,8,8,7,12,1,8 +U,3,7,4,5,1,8,5,13,5,7,13,8,3,9,0,8 +F,5,11,6,8,5,4,10,5,6,11,11,6,2,10,3,5 +G,3,7,4,5,2,7,6,8,9,8,4,12,1,9,5,10 +D,7,10,6,6,4,8,5,5,5,11,4,7,5,6,6,10 +N,5,10,7,7,8,7,8,3,5,7,6,7,7,8,8,2 +G,6,11,6,6,3,7,7,6,5,9,6,6,4,7,5,6 +A,3,8,4,6,3,6,4,2,0,6,2,8,2,6,1,7 +H,6,8,9,6,5,10,7,4,6,11,2,6,4,9,4,10 +O,2,3,3,2,2,8,7,6,4,9,5,8,2,8,2,8 +X,4,9,5,4,3,9,6,2,7,11,3,7,3,8,4,9 +P,6,11,6,8,3,4,14,8,1,11,6,3,1,10,4,8 +A,3,5,6,3,2,9,2,2,2,8,2,10,3,7,2,8 +B,4,9,4,7,6,7,9,8,6,7,5,7,2,7,7,10 +R,3,5,5,3,3,8,8,4,5,9,5,6,3,7,4,9 +C,5,11,7,8,8,6,7,4,4,6,7,10,7,8,7,7 +Z,5,9,7,7,5,9,11,6,5,6,5,8,3,8,10,7 +B,5,10,7,8,8,8,7,5,7,7,6,5,2,8,6,10 +M,6,4,6,7,4,7,7,13,2,7,9,8,9,6,0,8 +G,3,5,4,4,2,6,6,5,5,9,7,10,2,8,4,10 +X,2,2,4,4,2,7,7,3,9,6,6,8,2,8,6,8 +M,6,11,9,8,12,10,5,3,2,9,4,8,11,8,4,6 +Z,1,0,2,1,0,7,7,3,11,8,6,8,0,8,6,8 +R,10,14,8,8,5,8,8,6,5,9,4,9,7,5,6,11 +M,7,11,9,8,10,7,10,7,5,7,7,9,8,10,7,12 +H,6,10,8,8,11,8,9,5,3,6,7,7,8,7,11,9 +W,7,8,7,6,5,2,12,2,2,10,10,8,6,11,1,7 +N,4,6,6,4,4,8,8,6,6,6,5,4,6,10,3,5 +V,3,4,4,3,1,5,12,3,3,9,11,7,2,10,1,8 +J,1,2,2,3,1,10,6,2,6,12,4,8,1,6,1,7 +T,4,11,6,9,6,9,11,3,6,6,11,8,2,12,1,8 +N,6,9,8,7,5,6,10,2,4,9,8,8,5,8,1,8 +B,4,6,5,4,5,8,7,4,5,7,5,7,3,8,6,8 +V,3,9,5,7,1,10,8,4,3,5,14,8,3,10,0,8 +C,3,8,4,6,1,6,7,7,9,8,6,13,1,9,4,9 +A,2,1,3,2,1,9,3,2,2,8,2,8,2,6,2,8 +F,10,15,9,8,6,9,7,2,7,10,6,8,4,7,7,8 +O,5,8,6,6,4,7,6,8,5,7,5,7,3,9,3,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +L,2,6,3,4,2,4,5,1,9,3,2,8,0,7,2,5 +E,4,6,6,4,3,7,8,1,9,11,6,8,2,8,4,8 +A,4,9,6,6,2,7,4,3,1,6,1,8,3,7,2,7 +O,6,8,8,6,9,7,6,5,2,7,5,7,11,9,7,11 +Z,7,13,7,7,4,8,5,2,8,11,5,9,3,9,5,9 +E,4,11,4,8,3,3,8,6,10,7,6,15,0,8,7,7 +G,5,10,6,8,4,7,6,7,7,11,6,12,3,10,5,8 +Y,3,8,5,5,1,8,12,2,3,6,12,8,1,10,0,8 +M,6,6,8,5,8,8,9,4,5,6,6,6,9,6,6,4 +J,5,9,4,12,4,7,8,3,3,13,5,5,3,8,7,10 +G,1,3,2,1,1,7,7,5,4,9,7,9,2,8,3,10 +E,4,9,6,6,4,5,8,4,8,11,9,9,2,9,5,6 +O,5,7,6,6,5,8,4,4,4,9,3,8,3,7,5,7 +S,7,10,8,7,4,8,8,5,10,11,2,8,2,5,5,10 +J,2,2,4,4,2,10,6,2,6,12,3,8,1,6,1,7 +C,5,7,5,5,2,5,9,6,8,12,9,10,2,10,3,7 +D,4,6,6,4,4,9,7,4,6,10,4,5,3,8,3,8 +W,4,7,6,5,3,4,8,5,1,7,9,8,8,9,0,8 +G,7,11,7,8,6,6,6,6,6,10,6,14,5,8,6,7 +U,5,8,5,6,3,3,10,5,6,13,12,9,3,9,1,7 +A,2,7,3,4,1,7,6,3,1,7,0,8,2,7,1,8 +Y,5,11,7,8,4,7,10,2,7,6,12,8,2,11,2,8 +T,3,8,4,5,1,10,15,1,6,4,11,9,0,8,0,8 +S,4,9,5,6,4,9,8,5,9,6,6,5,0,7,8,8 +S,1,0,2,1,1,8,7,4,7,5,6,7,0,8,7,8 +P,4,7,6,10,9,8,9,4,0,8,7,6,5,11,5,7 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +H,4,9,4,7,4,7,9,13,2,7,4,8,3,8,0,8 +X,3,2,5,3,2,8,7,3,9,6,6,8,3,8,6,8 +K,5,7,8,5,5,7,6,1,7,10,6,10,4,7,4,9 +M,5,9,6,5,3,11,3,2,2,10,3,9,7,2,1,9 +M,2,1,3,1,2,8,6,6,4,7,7,8,6,5,1,7 +M,1,0,2,0,0,8,6,9,0,7,8,8,5,6,0,8 +N,5,10,7,7,5,6,9,6,5,7,7,8,6,9,2,6 +P,5,10,7,7,6,7,7,8,4,7,6,7,3,9,8,9 +W,3,3,4,2,2,5,10,3,2,9,9,7,5,11,1,7 +N,6,8,9,6,4,7,9,3,5,10,7,7,6,8,1,8 +J,5,10,7,8,7,9,10,4,4,9,4,6,4,8,6,4 +Y,6,11,9,8,5,9,10,0,8,4,11,7,1,10,2,9 +Z,3,9,4,7,3,7,8,3,12,8,6,8,0,8,7,7 +Y,6,8,7,10,8,10,12,5,4,6,7,7,5,11,8,5 +X,7,10,8,6,4,5,9,3,7,12,9,8,4,9,3,6 +D,6,9,8,7,5,9,6,4,7,10,5,6,3,8,3,9 +L,4,11,4,8,3,0,2,4,6,1,0,8,0,8,0,8 +Z,3,8,4,6,4,8,6,2,7,8,6,8,0,9,8,8 +W,4,4,5,3,3,5,11,3,2,9,8,7,6,11,2,6 +I,0,3,1,2,0,7,7,1,6,13,6,8,0,8,0,7 +B,2,0,2,1,1,7,8,7,5,7,5,7,1,8,7,8 +D,4,5,6,4,4,5,7,6,7,7,6,8,4,7,5,5 +M,4,5,5,8,4,8,7,12,2,6,9,8,8,6,0,8 +L,3,8,4,6,3,5,5,2,8,6,2,10,0,7,3,7 +O,5,10,4,5,3,6,7,6,3,9,7,9,5,10,5,8 +L,4,11,6,8,4,6,5,1,9,7,2,10,0,7,3,8 +E,4,8,4,6,2,3,7,6,11,7,7,14,0,8,7,7 +T,5,11,5,8,3,7,10,2,9,11,9,4,1,11,3,5 +A,2,3,3,2,1,10,2,3,1,10,2,9,2,6,2,8 +V,7,12,6,6,3,8,10,5,4,7,10,5,5,12,3,7 +V,3,2,6,4,2,7,12,2,3,7,11,9,3,10,1,8 +N,3,4,5,3,2,7,9,3,5,10,7,7,5,8,1,8 +B,8,13,7,8,7,9,7,4,5,9,5,7,7,6,9,8 +P,4,5,5,4,3,5,10,4,5,10,8,3,1,10,4,6 +Z,2,4,4,3,1,7,8,2,9,11,6,8,1,8,5,7 +K,1,0,1,0,0,5,7,7,0,7,6,10,2,8,2,11 +X,4,10,7,8,5,12,6,2,7,10,1,6,2,7,3,10 +S,4,7,5,5,3,6,8,3,6,10,8,8,2,8,5,5 +O,4,9,5,7,4,7,7,8,5,7,6,8,3,8,3,8 +G,2,4,3,3,2,6,8,5,5,9,8,9,2,8,4,9 +A,3,9,5,7,4,9,3,1,2,7,2,8,2,6,4,7 +P,5,5,6,7,3,4,12,9,2,10,6,4,1,10,4,8 +O,9,13,6,7,4,6,5,6,4,10,6,10,6,8,5,7 +B,5,10,7,7,8,8,7,6,6,6,6,6,2,8,6,10 +R,6,9,6,4,4,6,8,3,5,7,4,10,5,8,6,7 +W,5,8,7,6,5,4,11,2,3,8,9,9,8,10,1,8 +L,3,9,5,7,2,7,3,2,8,7,2,9,1,6,2,8 +L,3,6,4,4,2,5,5,1,9,6,2,10,0,7,2,7 +C,3,6,4,5,4,5,6,3,5,7,6,11,4,10,6,9 +P,3,5,5,3,2,8,9,3,4,12,4,3,1,10,3,8 +D,3,3,3,5,2,5,7,10,7,7,6,5,3,8,3,8 +A,3,11,5,8,2,9,6,3,1,8,0,8,2,7,2,8 +N,3,6,5,4,3,5,9,6,4,8,7,9,5,9,1,7 +T,4,5,5,5,5,7,8,4,7,7,6,9,3,7,7,6 +Y,3,5,5,8,7,10,10,4,2,4,8,9,4,13,6,8 +I,1,7,2,5,2,7,7,0,7,7,6,8,0,8,2,8 +V,5,10,5,8,3,3,11,3,4,10,12,8,2,10,1,8 +U,3,2,4,4,2,7,8,6,6,6,9,9,3,9,1,8 +C,4,8,4,6,2,5,7,6,7,11,9,14,1,9,3,8 +R,8,12,8,6,6,7,8,3,6,9,3,8,6,6,6,6 +C,3,5,4,4,1,3,9,5,7,12,10,11,1,9,2,7 +P,3,5,4,8,6,8,9,3,1,8,7,6,4,10,5,8 +E,4,8,4,6,4,3,8,5,9,7,6,14,0,8,6,8 +Q,2,1,3,2,1,8,6,7,5,6,6,8,3,8,4,8 +V,2,1,4,3,1,7,12,2,3,7,11,9,2,10,1,8 +T,3,6,4,4,3,8,11,2,6,6,11,8,2,11,1,8 +E,4,6,6,4,6,7,8,3,5,6,7,11,3,10,7,8 +M,6,11,9,8,12,9,7,3,3,8,4,7,12,5,4,5 +V,8,12,6,6,3,8,11,4,5,5,10,6,4,10,3,5 +R,4,7,5,5,4,10,7,3,6,10,3,7,3,7,3,10 +J,1,5,3,4,1,9,6,2,6,14,5,10,0,7,0,7 +Z,1,1,2,3,1,8,7,5,8,6,6,7,1,8,7,8 +B,6,12,6,7,5,9,7,3,5,9,5,7,6,7,8,9 +R,4,8,6,6,5,9,7,4,5,9,3,8,3,7,4,11 +V,2,1,4,3,1,5,12,3,3,9,11,8,2,10,1,8 +K,1,1,1,1,0,4,7,6,3,7,6,11,3,8,2,11 +A,3,3,5,5,2,7,5,3,1,6,1,8,2,7,2,7 +M,4,4,6,3,4,5,6,4,4,10,10,10,6,5,2,7 +Y,2,0,2,0,0,7,10,3,1,7,12,8,1,11,0,8 +X,7,10,9,8,8,8,6,3,5,6,7,7,4,10,11,8 +A,3,9,5,6,2,9,6,3,1,8,0,8,2,7,1,8 +R,4,7,4,5,4,6,10,7,3,7,4,9,2,7,5,11 +J,3,7,4,5,2,10,7,1,6,13,3,7,0,8,0,8 +A,4,10,7,8,4,13,2,4,4,12,1,9,3,7,4,10 +F,1,0,1,0,0,3,12,4,2,11,9,6,0,8,2,7 +Y,2,2,4,4,2,7,10,1,7,7,11,8,1,11,2,8 +X,4,3,5,5,1,7,7,5,4,7,6,8,3,8,4,8 +K,3,6,4,4,4,6,7,3,6,6,5,9,3,8,4,9 +D,3,7,4,5,4,7,7,7,7,7,7,5,3,8,3,7 +Y,5,7,6,5,5,8,5,6,5,5,8,8,3,9,9,6 +F,3,4,4,6,2,1,12,5,6,11,11,9,0,8,2,6 +X,5,8,7,6,3,7,8,1,8,10,6,8,3,8,4,7 +L,5,9,7,7,5,8,4,1,8,9,2,10,1,6,3,9 +W,8,11,8,8,9,6,10,4,3,9,6,6,11,10,4,5 +A,5,8,9,6,6,7,5,2,4,6,1,6,5,7,5,6 +X,3,6,4,4,3,8,5,2,5,6,7,8,2,9,8,9 +W,6,9,8,7,4,10,8,5,2,6,8,8,9,9,0,8 +A,2,3,3,2,1,8,2,2,1,8,2,8,2,6,3,8 +I,1,3,2,2,1,7,8,1,7,13,6,8,0,8,1,7 +U,4,9,6,7,8,8,6,4,4,6,7,8,8,9,5,6 +L,2,2,3,4,2,5,4,5,7,2,2,5,1,6,1,6 +X,4,6,7,4,3,5,9,3,8,11,12,9,3,9,4,5 +D,1,0,1,1,1,6,7,8,5,6,6,6,2,8,2,8 +T,3,4,3,3,2,5,11,2,7,11,9,5,1,11,2,5 +A,2,4,4,3,1,6,3,2,2,5,2,8,2,6,2,6 +D,5,11,7,9,11,9,8,5,5,7,6,6,5,7,12,6 +E,2,3,4,2,2,7,7,2,8,11,6,8,1,8,4,8 +W,4,5,5,3,3,3,10,2,2,10,10,8,6,11,1,7 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +C,2,1,2,1,0,6,7,6,9,7,6,14,0,8,4,10 +G,2,4,4,3,2,6,7,6,6,6,6,10,2,8,4,9 +H,6,8,8,6,6,10,6,3,6,10,3,7,6,7,5,11 +A,4,9,7,7,5,10,3,1,2,8,3,9,4,5,3,7 +J,1,1,2,2,1,10,6,2,6,12,4,8,1,7,1,7 +F,6,10,8,7,4,6,11,2,6,14,6,3,1,10,2,7 +Y,2,3,2,1,1,5,10,2,6,10,9,6,1,11,2,5 +U,6,9,8,7,5,4,9,6,7,7,10,11,3,9,1,8 +W,5,4,6,3,3,5,11,3,2,9,8,7,7,12,1,6 +Z,4,9,5,7,3,7,7,3,12,9,6,8,0,8,8,8 +E,5,11,7,8,5,7,7,2,9,11,6,9,3,8,5,8 +B,5,10,7,7,6,9,6,4,7,9,5,7,2,8,6,10 +V,6,9,8,8,10,7,6,5,5,7,6,8,7,10,8,9 +B,4,3,5,5,3,6,9,8,7,7,6,6,2,8,9,10 +V,7,13,7,7,4,9,8,4,4,8,8,5,6,13,3,7 +L,4,4,4,6,1,0,0,6,6,0,1,5,0,8,0,8 +K,4,9,4,6,2,3,7,7,2,7,6,11,3,8,3,10 +U,5,8,5,6,2,7,4,14,6,7,14,8,3,9,0,8 +P,1,3,3,1,1,7,10,3,3,12,5,4,1,9,2,8 +N,3,7,3,5,2,7,7,13,2,5,6,8,5,8,0,8 +D,4,8,5,6,5,7,7,5,7,7,6,5,6,8,3,7 +Q,3,7,4,6,2,10,9,8,6,4,8,10,3,8,5,9 +M,3,3,5,1,2,9,6,3,4,9,5,8,7,5,1,8 +Y,3,4,5,6,1,7,10,1,3,7,12,8,1,11,0,8 +Z,4,9,6,7,7,8,7,2,8,7,6,8,0,8,9,8 +Z,1,3,3,2,1,7,8,2,9,11,6,8,1,8,5,7 +Q,6,12,5,7,3,7,6,4,9,10,5,9,3,7,9,8 +B,4,7,5,5,4,8,6,4,6,9,5,6,2,8,6,10 +L,3,7,5,6,4,6,8,4,6,7,6,9,2,8,8,9 +P,2,6,2,4,2,4,11,8,1,10,6,4,1,10,3,8 +H,3,3,6,2,3,8,7,3,6,10,5,8,3,8,3,8 +K,1,1,1,1,0,4,6,6,2,7,6,10,3,8,2,10 +A,9,13,7,7,4,8,2,3,2,8,4,12,5,4,5,6 +G,2,3,3,5,2,8,8,8,6,5,7,9,2,7,5,11 +I,3,9,5,6,2,7,9,0,8,14,6,5,0,9,2,7 +Y,5,8,5,6,2,3,11,2,7,12,11,6,1,10,2,5 +V,2,8,4,6,1,8,8,4,2,7,13,8,3,10,0,8 +O,2,4,2,2,1,7,7,6,4,9,6,8,2,8,2,7 +J,2,7,3,5,2,8,7,1,6,11,5,8,1,6,1,6 +A,3,7,5,4,2,7,5,3,0,6,1,8,2,7,2,7 +M,6,9,7,4,4,5,9,4,5,5,4,10,8,9,2,8 +W,6,10,8,8,9,7,8,6,3,7,8,8,6,8,4,8 +C,3,7,4,5,2,6,6,6,10,8,5,12,1,9,4,8 +F,3,7,3,5,2,1,12,4,5,12,11,7,0,8,1,6 +K,4,6,6,6,5,6,7,2,4,6,4,9,4,5,8,8 +C,4,5,5,5,5,5,8,3,4,7,6,11,4,10,7,9 +T,5,8,7,6,7,7,8,4,7,8,6,9,5,8,5,6 +P,6,8,8,6,4,9,8,4,7,12,4,5,4,8,5,8 +B,3,8,3,6,4,6,7,8,5,7,6,7,2,8,7,8 +U,2,1,3,2,1,7,8,6,6,7,9,9,3,10,0,9 +X,2,5,4,4,2,8,7,3,9,6,6,8,2,8,6,9 +D,4,9,4,4,2,13,3,3,4,12,1,8,3,7,1,10 +T,6,10,5,5,2,5,9,2,7,12,7,5,2,10,4,4 +K,4,8,4,6,3,3,6,6,3,7,7,11,3,8,3,11 +P,5,7,7,5,4,7,11,4,5,13,5,3,1,10,3,8 +P,2,4,4,3,2,7,9,4,3,12,5,3,1,10,2,8 +L,4,9,6,7,3,8,4,1,8,9,2,10,0,6,2,9 +B,2,4,4,3,3,8,7,3,5,10,6,6,2,8,5,8 +N,5,5,7,5,6,8,6,5,5,8,5,7,7,9,5,4 +F,2,7,3,4,1,1,12,5,4,11,10,7,0,8,3,7 +A,2,3,3,2,1,11,2,2,1,9,2,9,1,6,2,8 +E,7,15,5,8,3,7,8,5,8,10,6,10,1,9,7,8 +P,4,6,5,4,3,7,11,5,3,12,5,2,1,10,3,8 +J,5,10,7,8,3,10,6,2,8,14,3,8,0,7,0,8 +P,5,11,6,8,6,6,6,6,4,8,6,9,5,9,7,10 +X,2,3,3,4,1,7,7,4,4,7,6,8,3,8,4,8 +S,6,8,8,6,8,8,6,4,3,9,5,8,5,9,11,10 +P,4,9,6,7,5,8,9,3,4,12,5,4,2,9,3,8 +F,5,11,7,8,5,4,11,5,4,13,9,5,2,10,2,5 +B,5,11,7,8,7,8,7,7,7,7,6,5,3,8,8,10 +Z,4,8,6,6,4,7,9,2,9,11,7,6,1,8,6,6 +P,3,5,3,4,2,6,9,5,4,9,7,4,1,10,3,7 +X,5,8,8,6,4,6,8,1,8,10,9,9,3,8,3,7 +E,5,10,5,7,3,3,7,6,11,7,6,14,0,8,8,7 +R,4,6,6,4,4,6,8,5,6,7,5,7,3,7,5,8 +E,5,11,7,9,9,7,7,3,5,6,7,10,5,9,8,8 +O,7,10,9,7,11,7,8,5,2,7,6,8,12,11,9,12 +X,6,10,9,8,5,8,7,0,8,10,5,8,3,8,3,8 +C,3,5,4,4,2,3,9,4,7,11,10,12,1,9,2,6 +K,4,7,4,5,3,3,8,7,2,7,6,11,3,8,2,11 +P,5,7,7,5,3,7,11,3,6,14,5,2,0,10,3,8 +N,6,9,9,6,5,7,9,2,5,10,6,6,6,9,1,7 +C,4,8,4,6,2,4,9,6,7,12,10,12,2,9,3,7 +B,6,11,8,8,8,8,7,7,7,7,6,6,3,8,8,11 +N,7,11,9,8,7,7,9,6,6,7,6,6,6,9,2,6 +X,3,7,5,5,4,8,6,3,5,6,7,8,2,9,8,9 +I,7,10,9,8,5,6,8,2,8,7,6,10,0,7,4,8 +N,4,7,4,5,2,7,7,14,2,5,6,8,6,8,0,8 +V,5,11,7,8,9,7,9,4,2,8,8,8,5,9,7,6 +M,6,9,7,4,3,4,8,5,5,4,2,11,8,9,2,8 +K,4,7,6,5,4,7,6,1,6,9,5,9,3,8,3,8 +P,4,2,5,4,3,5,10,5,4,10,8,4,1,10,3,7 +G,3,7,4,5,3,7,6,6,6,6,5,9,2,9,6,11 +W,4,6,6,4,5,7,7,6,3,8,7,7,6,8,4,10 +O,6,10,6,7,6,8,7,8,4,8,5,6,5,8,5,9 +V,2,0,3,1,0,7,9,4,2,7,13,8,2,10,0,8 +B,7,11,10,8,7,10,6,3,7,10,4,7,2,8,7,11 +A,2,3,4,4,1,9,5,3,1,8,1,8,2,7,2,8 +G,7,10,9,8,9,7,5,6,3,7,6,10,5,8,7,8 +U,5,4,5,6,2,7,4,14,5,7,14,8,3,9,0,8 +T,5,8,5,6,3,7,10,2,9,11,9,5,1,11,3,4 +P,4,8,4,5,2,3,14,7,1,11,6,3,0,10,4,8 +J,3,8,4,6,1,11,3,11,3,12,9,14,1,6,0,8 +F,7,10,9,8,9,7,8,6,4,8,6,7,4,11,8,11 +E,3,8,3,6,3,3,7,5,8,7,6,13,0,8,6,9 +O,5,10,7,8,8,8,10,6,3,8,7,6,10,10,6,10 +K,4,5,6,4,3,4,8,2,7,10,10,11,3,8,3,6 +M,4,6,5,4,4,6,6,6,5,6,8,10,7,5,2,9 +F,4,7,5,5,4,5,9,5,7,10,10,6,2,9,3,5 +Z,6,10,8,8,5,8,6,2,9,12,4,11,3,7,8,9 +F,2,3,4,1,1,6,10,3,5,13,7,5,1,9,1,7 +G,3,7,4,5,3,8,7,7,5,6,7,9,2,7,5,11 +V,5,9,8,6,8,8,7,4,2,7,8,8,5,10,4,8 +H,2,3,3,2,2,9,7,6,6,7,6,6,3,9,2,7 +J,6,9,9,7,6,8,5,3,6,8,6,8,4,7,4,7 +O,5,5,7,8,3,8,5,8,9,7,4,8,3,8,4,8 +D,8,12,8,6,5,7,5,4,7,8,4,6,5,7,6,9 +J,1,2,2,3,1,10,6,1,7,12,3,8,0,7,1,8 +T,4,11,5,8,4,6,11,1,8,8,11,8,1,11,1,7 +A,1,0,2,1,0,7,4,2,0,7,2,8,2,7,1,8 +S,4,7,6,5,3,8,7,4,8,11,5,7,2,8,5,8 +L,5,10,5,7,2,0,1,5,6,0,0,7,0,8,0,8 +J,4,8,5,6,3,8,4,6,3,14,8,14,1,6,1,6 +G,4,7,6,5,3,6,7,5,5,6,6,8,3,8,4,8 +P,3,3,4,4,2,4,13,8,1,11,6,3,1,10,4,8 +S,1,0,2,1,1,8,7,4,6,5,6,7,0,8,7,8 +D,2,5,4,4,3,9,6,4,6,10,4,6,2,8,3,8 +R,2,5,4,3,3,9,7,4,5,9,4,7,3,7,4,9 +T,2,4,3,2,2,7,12,3,6,7,11,8,2,11,1,8 +O,1,3,2,2,1,8,7,7,4,7,6,8,2,8,2,8 +Q,4,6,5,5,4,8,7,7,5,6,7,8,2,8,4,9 +L,3,7,4,5,1,0,0,6,6,0,1,5,0,8,0,8 +P,2,3,4,2,1,7,9,4,3,11,4,4,1,9,2,8 +W,6,10,6,5,4,2,9,2,3,10,11,9,8,10,1,6 +D,3,8,5,6,5,7,7,6,5,6,5,5,3,8,2,7 +P,3,4,4,3,2,5,10,4,4,10,8,4,1,10,4,7 +H,3,4,4,3,3,7,7,6,6,7,6,8,3,8,3,8 +R,3,5,5,4,3,9,7,4,5,9,4,6,3,7,4,10 +U,9,10,9,8,7,5,7,5,8,8,5,9,7,9,6,2 +T,5,8,6,7,6,6,8,4,8,7,7,8,3,10,7,7 +I,0,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +W,4,4,6,3,3,8,11,2,2,6,9,8,7,11,0,7 +L,4,7,5,5,3,7,4,1,8,8,2,10,0,7,2,8 +P,4,6,5,4,3,5,11,5,5,11,8,3,0,10,4,6 +N,3,3,5,2,2,7,9,3,4,10,6,6,5,8,1,7 +O,3,4,4,3,2,7,7,7,4,9,7,8,2,8,3,8 +A,4,9,6,8,6,7,8,2,6,7,8,9,5,11,3,7 +A,2,4,4,3,2,11,2,3,1,9,2,9,2,6,2,9 +G,4,10,6,7,4,7,7,7,6,5,7,8,2,7,4,8 +D,4,7,4,5,4,6,7,9,7,6,4,6,2,8,3,8 +Z,3,8,4,6,4,6,8,5,9,7,7,10,2,9,7,7 +F,4,5,6,6,5,7,9,4,5,8,6,7,4,9,8,7 +Q,8,13,7,7,5,9,5,4,7,11,5,8,4,8,10,11 +C,4,11,6,8,2,6,6,7,10,8,6,14,1,9,4,9 +H,3,4,4,3,3,8,7,6,6,7,6,7,3,8,3,6 +H,4,7,6,9,7,8,10,4,1,8,6,6,4,10,9,5 +L,3,8,5,6,3,7,4,0,7,8,3,10,0,7,2,8 +T,4,5,6,8,2,7,15,1,6,7,11,8,0,8,0,8 +D,3,6,5,4,3,10,6,4,7,11,3,6,3,8,3,9 +X,3,3,5,2,2,8,7,1,8,11,5,8,2,8,3,8 +Y,2,5,4,4,2,6,10,1,7,8,11,9,1,11,2,7 +K,6,9,8,6,5,5,9,2,7,10,8,10,3,8,3,7 +P,5,8,6,10,8,9,9,2,3,6,9,6,9,11,7,5 +I,2,8,2,6,3,7,7,0,7,7,6,8,0,8,3,8 +Y,3,5,5,4,2,7,10,1,7,7,11,8,1,11,2,8 +R,4,8,5,6,6,8,6,6,3,8,6,8,4,7,6,11 +W,7,8,9,7,10,6,9,6,7,7,7,8,8,9,8,10 +L,6,15,6,8,3,7,3,3,5,12,4,13,2,7,6,8 +J,3,8,4,6,2,8,5,4,8,13,5,12,1,6,1,7 +D,5,10,7,7,5,9,7,5,7,10,4,5,3,8,3,8 +H,3,7,3,5,2,7,7,14,1,7,7,8,3,8,0,8 +P,6,7,8,9,9,6,8,4,3,9,8,6,6,11,6,6 +V,6,8,5,6,3,4,11,3,4,9,11,7,2,10,1,8 +B,5,11,6,8,8,8,7,4,6,7,6,6,6,8,6,10 +E,5,7,7,6,7,7,6,6,4,7,6,9,8,10,10,10 +Y,1,0,2,0,0,8,10,3,1,6,12,8,1,11,0,8 +O,4,6,5,4,6,8,6,6,2,7,6,8,7,9,3,8 +R,1,0,2,0,1,6,10,7,2,7,5,8,2,7,4,9 +G,5,5,6,8,3,7,6,8,8,6,5,10,2,8,6,11 +T,2,10,4,7,1,6,14,0,6,8,11,8,0,8,0,8 +P,5,9,5,6,3,4,12,9,2,10,6,4,1,10,4,8 +K,4,6,6,4,3,3,9,3,6,10,11,11,3,8,3,6 +D,6,11,7,8,4,6,7,11,11,6,5,6,3,8,4,8 +I,1,6,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +C,3,2,4,4,2,6,8,7,8,9,8,13,1,9,4,10 +O,4,9,5,7,2,7,7,9,7,7,6,8,3,8,4,8 +F,4,7,6,5,3,5,12,3,6,14,7,4,1,10,1,7 +U,9,15,8,8,6,8,6,5,5,7,7,6,7,5,5,4 +H,5,9,5,4,3,5,9,3,6,9,8,9,5,7,3,7 +Y,4,9,5,7,2,8,11,0,4,6,11,8,0,10,0,8 +K,2,3,3,2,2,5,7,4,7,7,6,11,3,8,4,10 +M,2,6,3,4,2,7,6,11,1,7,9,8,7,5,0,8 +Y,3,5,4,4,2,4,11,2,7,11,10,6,1,11,2,5 +K,7,14,7,8,5,7,7,2,6,10,5,8,6,7,4,7 +X,7,13,8,7,4,7,8,2,8,11,6,8,4,8,4,7 +G,4,8,5,6,3,7,6,7,7,8,5,12,3,10,5,8 +Y,7,10,7,7,3,2,12,5,5,12,12,6,2,11,2,6 +T,6,15,6,8,4,6,10,2,6,12,7,6,2,8,5,4 +F,4,5,4,8,2,1,14,5,4,12,10,6,0,8,2,6 +L,2,4,3,3,1,8,3,1,7,9,2,10,0,7,2,9 +K,11,14,10,8,4,6,8,3,8,9,7,8,5,8,4,7 +P,6,10,8,8,6,8,9,3,5,13,5,3,1,10,3,9 +K,6,8,8,6,7,8,7,1,6,9,4,8,4,8,4,8 +N,2,4,2,2,2,7,8,5,4,7,6,7,4,8,1,6 +Q,4,7,5,9,5,8,6,6,2,8,6,11,3,9,6,9 +B,3,6,5,4,4,10,5,3,5,10,4,7,2,8,4,10 +T,4,6,6,4,5,7,8,4,5,6,7,9,5,9,5,7 +T,5,11,7,8,6,6,7,7,7,6,10,10,5,5,9,6 +Q,5,8,6,8,5,8,7,8,6,5,5,8,3,10,5,10 +B,4,4,4,6,4,7,5,9,7,6,7,7,2,8,9,10 +I,7,14,6,8,4,10,7,2,5,11,5,6,2,9,5,12 +D,1,0,2,1,1,6,7,8,6,6,6,6,2,8,3,8 +U,3,3,3,4,2,7,4,14,5,7,12,8,3,9,0,8 +M,6,10,8,7,9,7,6,7,5,6,5,8,9,8,9,11 +J,6,9,4,13,4,7,9,3,3,13,4,5,3,8,6,9 +Q,2,3,2,4,2,7,7,5,2,8,8,9,2,9,4,8 +T,5,8,7,7,6,5,8,4,9,8,7,9,3,9,7,6 +Y,5,7,5,5,3,6,9,1,8,9,9,5,1,9,4,4 +D,3,4,5,3,2,10,6,3,7,10,3,6,2,8,3,9 +V,3,4,4,3,1,4,12,3,3,9,11,7,2,11,0,8 +N,10,13,9,7,4,9,11,5,5,3,6,11,6,10,3,6 +J,1,1,1,1,0,13,3,6,4,12,4,11,0,7,0,8 +W,6,9,9,7,7,7,12,2,2,7,8,8,7,12,1,8 +J,1,0,1,0,0,12,4,6,3,13,5,11,0,7,0,8 +B,2,3,4,2,2,8,7,3,5,10,6,6,2,8,4,9 +N,6,9,9,8,9,7,9,5,4,7,4,7,7,7,6,5 +H,2,6,3,4,2,7,6,12,2,7,8,8,3,9,0,8 +C,5,8,5,6,2,4,9,6,8,12,9,12,1,9,3,7 +U,4,8,5,6,3,7,5,13,4,7,12,8,3,9,0,8 +X,3,3,5,2,2,9,6,2,8,10,3,7,2,7,3,8 +U,3,3,4,2,1,7,8,6,8,8,10,7,3,9,1,8 +I,4,7,5,5,3,9,5,2,6,6,7,5,0,9,4,7 +N,6,9,8,7,5,6,9,6,5,7,7,7,8,8,3,7 +S,3,10,4,8,2,8,6,6,9,5,6,10,0,9,9,8 +P,3,9,5,6,4,6,9,3,6,10,9,4,4,10,4,7 +E,5,9,7,8,8,5,9,4,4,8,7,9,5,11,9,11 +Q,5,9,7,7,6,8,5,8,4,6,7,9,4,6,7,9 +K,7,10,10,8,7,5,6,1,7,9,8,11,3,8,3,8 +N,3,5,6,4,3,7,9,2,5,10,6,6,5,9,1,7 +K,5,10,7,8,7,6,6,3,7,6,6,8,7,8,5,9 +Q,3,4,4,5,3,8,8,7,3,5,7,10,3,9,5,10 +D,5,9,5,6,5,5,7,8,6,5,4,6,3,8,4,9 +L,3,4,3,7,1,0,1,5,6,0,0,7,0,8,0,8 +K,3,2,4,4,3,6,7,4,7,6,6,11,3,8,5,10 +N,3,8,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +R,2,1,2,2,2,6,8,4,5,6,5,7,2,7,4,9 +S,4,8,6,6,7,8,8,5,3,8,5,7,4,8,10,7 +H,6,10,8,7,5,9,6,3,6,10,4,8,4,7,4,8 +B,3,5,5,4,3,10,6,2,6,10,4,7,2,8,4,10 +L,2,4,3,3,1,6,4,1,8,8,2,10,0,7,2,8 +Z,2,5,3,4,2,7,7,5,9,6,6,8,2,8,7,8 +M,5,5,8,4,5,8,6,3,5,9,7,8,9,6,2,8 +O,7,9,9,8,8,8,4,4,5,10,4,10,5,7,7,6 +B,3,4,4,3,3,7,7,4,6,6,6,6,5,8,6,10 +I,5,7,6,5,3,7,6,2,7,7,6,8,0,9,4,8 +L,5,10,7,8,3,5,3,2,10,6,1,10,0,7,3,6 +Q,3,5,4,6,4,9,10,6,2,4,8,11,3,10,5,10 +P,6,11,9,8,5,6,12,5,4,12,5,2,1,10,3,9 +M,6,8,8,6,6,11,6,2,4,9,3,6,8,6,2,8 +R,2,5,4,4,3,7,8,5,5,8,6,7,3,7,5,10 +P,2,3,3,2,1,7,10,4,4,12,5,3,1,10,2,8 +W,4,8,5,6,4,5,8,4,1,7,9,8,6,11,0,8 +E,2,3,3,5,2,3,6,6,10,7,7,14,0,8,7,8 +T,6,10,6,7,4,4,13,4,6,12,10,4,2,12,2,4 +R,2,1,2,1,1,6,10,8,2,7,5,8,2,7,4,10 +D,6,9,8,6,7,9,7,5,6,9,4,6,3,8,3,8 +K,6,9,9,8,8,8,6,2,4,7,4,9,7,4,9,12 +D,3,7,3,5,3,5,7,8,6,6,5,7,2,8,3,8 +U,4,10,4,8,4,7,6,13,4,7,12,8,3,9,0,8 +Q,5,7,5,9,6,7,10,4,3,7,10,10,3,10,6,7 +X,5,6,6,6,6,7,8,2,5,7,6,8,3,7,7,8 +L,4,10,6,7,8,7,8,3,6,5,6,10,5,11,8,8 +I,5,9,7,6,4,7,6,2,7,7,6,9,0,9,4,8 +F,3,6,4,4,3,5,11,4,4,12,8,5,2,10,2,6 +W,4,8,6,6,8,10,9,5,2,6,7,7,8,9,4,5 +Z,2,1,3,2,2,7,7,5,9,6,6,8,2,8,7,8 +N,2,1,2,1,1,7,9,5,3,7,6,7,4,8,1,7 +E,7,10,5,5,2,7,7,4,7,10,6,11,1,9,7,9 +H,5,7,8,5,6,5,9,3,6,10,9,9,3,9,3,6 +M,5,7,7,5,6,7,6,6,5,7,7,11,10,6,2,9 +P,4,8,6,6,4,9,8,2,6,13,5,6,1,10,2,9 +E,3,3,4,5,2,3,8,6,11,7,5,14,0,8,7,7 +V,2,8,4,6,1,9,8,4,3,5,13,8,3,10,0,8 +W,4,6,6,4,3,9,8,4,1,7,8,8,8,9,0,8 +V,4,4,6,7,1,9,8,4,3,6,14,8,3,9,0,8 +Y,7,9,7,6,3,3,12,5,5,13,11,5,1,11,2,6 +S,1,0,2,1,0,8,7,4,7,5,6,8,0,8,7,8 +U,2,0,3,1,1,7,5,11,5,7,14,8,3,10,0,8 +X,8,12,7,6,4,6,7,2,8,9,6,9,4,5,4,7 +O,5,10,6,7,5,7,7,8,4,9,6,8,3,8,3,8 +F,3,3,3,5,1,1,14,5,3,12,10,5,0,8,2,6 +V,5,7,5,5,2,3,11,3,3,10,11,8,3,10,1,7 +Q,7,8,7,10,7,7,8,6,3,7,9,11,4,8,7,8 +M,6,9,8,5,4,9,3,3,2,9,3,9,8,2,1,9 +A,1,0,2,0,0,7,4,2,0,7,2,8,1,7,1,8 +N,5,11,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +Z,5,10,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +M,9,12,11,7,5,13,2,5,2,12,1,9,7,3,1,9 +H,11,13,10,8,5,8,8,4,5,9,6,7,6,9,5,9 +X,4,9,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +A,2,4,4,2,1,11,2,3,2,9,2,9,1,6,2,8 +G,3,5,4,4,2,6,7,6,6,10,7,11,2,9,4,9 +F,2,1,2,3,2,5,10,4,5,10,9,6,1,10,3,7 +H,3,4,6,3,3,9,7,3,6,10,3,7,4,6,4,8 +M,5,9,6,4,3,12,3,4,2,11,2,9,6,3,1,9 +T,7,12,6,6,3,5,11,2,6,11,8,6,2,9,5,3 +W,10,15,10,9,7,5,8,2,4,7,9,7,11,10,2,5 +E,3,6,4,4,3,7,8,7,10,5,4,9,3,8,6,7 +J,3,7,4,5,4,10,5,2,5,8,5,5,3,7,5,7 +G,5,9,6,7,8,8,8,5,2,6,6,9,7,9,6,13 +H,4,4,7,3,3,8,7,3,6,10,5,8,3,8,3,8 +L,7,13,6,7,3,5,5,3,8,10,4,13,2,5,6,7 +Y,2,3,4,4,1,9,10,3,2,5,13,8,2,11,0,8 +H,1,0,2,0,0,7,7,11,1,7,6,8,2,8,0,8 +P,4,5,4,8,2,3,12,9,2,10,6,3,1,10,4,8 +Z,5,8,7,6,5,9,8,6,4,7,5,8,3,8,10,7 +T,3,4,4,6,1,7,15,1,6,7,11,8,0,8,0,8 +D,5,9,5,4,3,12,3,3,5,12,1,8,4,7,2,11 +U,1,0,2,0,0,7,6,10,4,7,12,8,2,10,0,8 +G,5,11,6,8,8,8,7,5,2,6,6,10,7,8,6,12 +E,5,10,8,7,6,6,8,3,8,11,8,9,3,8,5,6 +H,8,10,8,5,5,5,9,3,4,10,7,9,5,7,3,6 +F,2,3,2,2,1,6,10,4,5,10,9,5,1,10,3,6 +J,1,4,2,3,1,10,6,2,5,12,4,9,1,6,1,7 +A,6,11,6,6,4,11,2,4,2,11,4,12,5,3,5,11 +L,4,6,5,5,4,7,5,5,5,7,6,7,3,8,8,11 +Y,2,8,4,5,1,6,11,2,3,9,12,8,1,10,0,8 +G,5,9,4,5,3,7,7,3,2,8,6,7,4,10,8,7 +M,2,3,3,1,2,6,6,7,4,7,7,10,7,5,2,9 +K,2,4,4,3,3,6,7,1,6,10,7,10,3,8,2,8 +S,4,8,5,6,3,7,7,5,9,5,6,8,0,8,9,8 +E,0,0,1,0,0,5,7,5,7,7,6,12,0,8,6,10 +G,4,9,5,6,4,6,7,6,5,9,7,11,2,9,4,10 +T,2,4,3,5,1,5,14,1,6,9,11,7,0,8,0,8 +V,8,10,7,6,3,8,10,5,5,5,10,7,4,11,3,5 +K,3,7,5,5,3,6,7,5,7,6,6,10,3,8,5,9 +Z,3,8,4,6,3,8,7,6,10,6,6,8,1,8,8,7 +D,7,10,7,5,4,8,4,4,6,8,4,7,4,6,6,10 +Q,2,3,3,4,3,8,8,5,2,8,8,9,2,9,5,8 +H,3,4,5,3,3,6,9,3,6,10,8,8,3,8,3,7 +V,5,11,7,8,5,9,11,3,2,5,10,8,5,10,5,7 +G,2,3,3,1,1,7,7,6,5,7,6,9,2,9,4,10 +T,8,10,8,8,6,7,10,2,8,11,9,5,3,10,5,4 +J,7,11,9,9,5,7,8,3,6,15,6,10,1,6,1,6 +Q,2,3,3,4,3,8,7,6,3,8,6,9,2,9,3,9 +Y,2,4,3,3,1,6,10,1,7,8,11,8,1,11,2,7 +I,2,9,3,7,3,7,7,0,7,7,6,8,0,8,3,8 +A,3,8,5,6,5,8,8,6,4,6,6,8,5,7,6,4 +T,8,15,7,8,3,6,9,3,8,13,6,6,2,8,5,5 +Q,3,5,4,6,4,8,7,7,2,5,5,10,3,9,4,10 +N,6,10,8,8,7,6,7,9,5,6,4,6,5,7,4,10 +W,4,9,6,7,5,10,10,3,3,5,9,7,7,11,1,8 +U,6,9,6,6,4,4,8,5,7,11,10,9,3,9,2,6 +R,3,1,4,2,2,7,8,5,5,7,5,6,2,7,4,8 +H,4,9,5,7,5,8,8,6,6,7,6,9,3,8,3,8 +E,4,9,6,7,6,8,7,6,3,7,6,10,4,8,7,9 +Y,2,1,3,1,0,7,11,3,1,7,12,8,1,11,0,8 +N,2,4,3,3,2,7,8,5,4,7,7,7,4,8,1,6 +N,4,8,6,6,3,7,8,3,4,10,6,7,5,8,1,7 +S,5,10,8,7,10,7,5,3,2,7,5,7,3,7,11,3 +G,5,5,6,8,3,6,6,8,9,6,6,9,1,8,6,11 +O,5,7,7,6,5,7,6,5,6,9,5,9,4,7,5,6 +F,3,5,5,6,4,7,10,4,4,8,7,7,3,9,6,5 +M,5,11,7,8,9,6,6,5,5,7,7,11,11,6,2,9 +K,3,4,6,3,3,7,8,2,7,10,4,8,5,7,4,7 +S,6,12,6,7,3,8,6,3,4,13,6,8,2,9,3,8 +C,2,3,3,2,1,5,8,5,6,12,9,10,1,10,2,7 +F,9,15,8,8,6,7,11,3,5,12,6,3,5,9,9,6 +N,4,10,5,7,3,7,7,14,2,4,6,8,6,8,0,8 +T,5,9,5,7,4,5,11,2,7,11,10,5,1,12,2,4 +K,4,7,6,5,6,8,8,5,5,8,5,7,7,6,6,11 +R,4,7,6,5,5,7,7,4,6,7,6,6,3,7,5,9 +N,4,3,4,4,3,7,8,5,5,7,6,6,6,9,3,6 +K,8,12,8,7,4,9,7,3,7,9,2,5,5,7,4,8 +W,2,0,2,1,1,7,8,3,0,7,8,8,6,10,0,8 +M,5,10,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +F,4,6,6,4,6,7,7,5,3,7,6,9,3,9,8,11 +H,5,9,7,7,6,7,7,7,7,7,6,8,3,8,4,8 +Z,4,10,4,8,4,7,8,3,12,9,6,8,0,8,7,7 +Z,4,10,5,8,3,7,7,4,15,9,6,8,0,8,8,8 +H,3,6,5,4,4,5,9,3,5,10,9,9,3,8,3,6 +L,4,10,5,8,4,6,4,4,9,2,2,5,1,6,2,5 +S,2,7,3,5,3,8,7,5,7,5,6,6,0,8,8,8 +N,3,7,4,5,4,9,8,6,5,6,5,4,5,9,2,5 +A,2,1,4,2,2,7,2,2,2,7,2,8,2,7,3,7 +P,3,5,5,4,2,7,10,4,4,13,5,2,1,10,2,8 +C,5,8,6,6,4,7,8,8,6,5,7,12,5,8,4,8 +A,3,4,5,3,2,10,2,2,1,9,2,9,2,6,2,8 +P,4,5,5,4,3,5,10,4,5,10,8,3,1,10,3,7 +N,2,4,4,3,2,7,9,2,4,10,6,6,5,9,0,7 +J,3,9,4,7,3,9,6,2,5,11,4,9,1,6,2,5 +O,5,10,6,7,4,8,7,8,5,10,6,8,3,8,3,7 +H,2,3,3,2,2,6,7,7,5,7,6,10,3,8,3,9 +P,3,9,4,6,2,4,12,9,2,10,6,4,1,10,4,8 +G,3,7,4,5,3,6,6,5,5,6,6,10,2,9,4,8 +J,1,3,2,1,0,9,5,3,5,14,6,11,0,7,0,8 +K,4,8,6,6,4,8,6,1,7,10,4,9,4,7,5,10 +P,2,6,3,4,1,4,13,8,2,11,6,3,1,10,3,8 +L,2,3,3,2,1,4,4,4,7,2,2,6,0,7,1,6 +G,3,4,4,3,2,6,7,5,5,10,7,10,2,9,4,9 +Z,4,6,5,4,3,6,9,3,8,11,9,6,2,9,6,5 +Z,4,7,5,5,5,7,6,2,7,7,6,9,1,7,10,8 +L,3,10,4,7,1,0,1,5,6,0,0,7,0,8,0,8 +R,2,4,4,2,2,8,8,4,4,9,5,7,2,7,3,10 +D,2,4,3,3,2,9,7,4,5,10,4,5,2,8,2,8 +Z,2,4,4,3,2,8,7,2,9,11,5,9,1,8,5,8 +Q,3,4,4,5,3,8,8,6,2,5,7,10,3,9,5,10 +A,3,5,5,8,2,7,6,3,1,7,0,8,3,7,1,8 +F,2,3,3,4,1,1,11,5,6,11,10,9,0,8,3,7 +L,4,9,5,6,2,7,4,0,9,9,2,10,0,7,2,8 +N,4,6,4,4,2,7,7,14,1,5,6,8,6,8,0,8 +Y,5,8,5,6,2,3,10,2,7,11,11,6,1,11,2,4 +T,2,4,3,2,1,5,11,2,7,11,9,5,1,10,2,5 +O,3,7,3,5,2,8,7,7,5,9,5,8,3,8,3,8 +G,6,10,7,8,3,8,7,8,8,6,6,9,2,7,6,11 +G,6,8,6,6,5,6,7,6,6,9,7,11,2,9,4,9 +E,6,10,9,8,7,7,7,2,8,11,7,9,3,9,4,8 +Z,2,5,4,4,2,7,7,2,9,11,6,8,1,8,5,8 +K,6,9,9,7,5,9,6,2,7,10,3,8,4,7,5,10 +T,3,5,4,4,2,5,13,4,6,12,9,3,1,11,2,4 +C,4,9,5,7,2,6,6,7,10,8,5,13,1,10,4,9 +F,4,7,5,8,6,6,9,4,4,7,7,6,4,9,9,8 +D,6,10,6,6,5,9,6,3,6,10,4,7,5,7,8,7 +N,3,9,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +Q,3,6,4,4,2,9,7,7,6,6,6,10,3,8,5,9 +E,7,10,9,7,6,6,8,4,9,12,9,9,3,8,5,6 +H,3,5,6,4,3,7,7,2,6,10,5,8,6,8,4,7 +M,3,4,4,3,3,7,6,6,4,6,7,8,7,5,2,7 +F,4,8,6,6,3,5,11,5,5,13,8,5,2,9,2,6 +Z,3,8,4,6,4,6,7,3,7,8,6,9,0,9,9,7 +D,6,11,6,6,4,5,9,5,7,10,7,6,5,8,6,5 +W,10,11,10,8,7,4,10,3,3,9,8,7,8,11,2,6 +E,3,8,4,6,3,6,8,8,10,5,4,10,2,8,6,7 +G,3,8,5,6,3,7,6,7,6,6,5,10,1,8,5,11 +Y,5,5,7,7,8,9,7,6,3,7,7,8,6,10,6,5 +Q,4,7,6,5,5,8,6,7,4,7,7,7,5,7,6,7 +J,2,3,3,5,1,14,1,7,5,14,2,11,0,7,0,8 +F,3,8,5,6,4,6,10,3,6,10,9,5,5,10,3,6 +H,2,1,3,3,3,7,7,5,5,7,6,8,3,8,2,8 +C,6,11,7,8,4,2,8,5,9,10,10,14,1,7,3,7 +F,2,0,2,1,0,3,13,5,2,11,8,5,0,8,2,7 +O,4,8,5,6,4,8,7,7,4,7,6,6,4,8,3,8 +Z,2,7,3,5,2,6,8,5,9,7,7,10,2,9,8,7 +B,5,9,8,6,5,9,8,4,7,9,4,5,3,7,7,10 +P,4,7,6,10,9,7,12,4,0,9,7,6,5,10,6,8 +A,2,8,4,5,1,8,6,3,1,7,0,8,2,7,1,8 +Z,4,8,5,6,2,7,7,4,14,9,6,8,0,8,8,8 +Y,4,7,6,11,9,8,9,3,2,6,8,9,6,13,10,6 +O,3,4,4,3,2,7,7,7,5,9,6,8,2,8,3,8 +T,2,8,4,6,2,8,11,2,9,6,11,7,1,11,1,7 +Y,4,5,5,4,2,4,11,2,7,11,10,5,1,11,3,4 +F,9,13,8,7,5,9,7,3,5,11,4,5,4,9,7,9 +S,5,7,6,5,3,9,6,4,8,11,4,8,2,8,5,11 +J,3,6,5,4,2,10,6,1,7,14,3,7,0,8,0,8 +K,2,3,4,1,2,4,8,2,6,10,9,10,2,8,2,7 +H,1,0,1,0,0,7,7,10,2,7,6,8,2,8,0,8 +K,3,7,4,5,2,3,6,7,3,7,7,12,3,8,3,11 +W,3,2,4,3,3,5,11,2,2,8,9,9,6,11,0,8 +W,3,1,5,2,3,8,11,3,2,6,9,8,7,11,0,7 +I,7,13,6,8,4,8,9,3,6,14,5,5,2,7,6,8 +R,8,15,8,8,7,5,8,2,5,7,3,9,6,6,6,5 +I,1,5,2,4,1,7,8,0,7,13,6,7,0,8,1,7 +Q,3,5,4,5,3,8,6,7,6,7,3,9,2,8,3,8 +Q,3,7,4,6,2,8,7,8,6,6,5,9,3,8,4,8 +V,5,11,8,8,2,8,8,5,3,6,14,8,3,9,0,8 +Y,3,8,5,6,1,9,10,3,2,5,13,8,1,11,0,8 +F,3,5,5,4,2,7,9,1,6,13,5,5,1,10,2,8 +V,4,8,6,6,3,6,12,2,4,6,11,9,2,10,1,8 +W,5,8,7,6,7,8,7,6,2,6,8,8,7,8,5,4 +L,3,8,5,6,3,8,4,1,8,9,3,10,0,7,2,9 +W,8,8,8,6,5,3,11,2,3,10,10,8,7,10,2,6 +A,3,10,5,7,2,8,6,3,1,7,0,8,3,7,1,8 +T,7,10,6,5,2,4,12,3,6,13,8,4,2,9,3,4 +U,3,4,4,3,2,6,8,6,7,7,10,9,3,9,0,8 +H,6,11,8,8,7,7,7,7,7,7,6,8,3,8,4,7 +J,5,8,7,9,7,8,9,4,5,7,7,8,5,7,10,10 +F,2,4,2,3,1,6,10,4,5,10,9,5,1,9,3,7 +W,6,7,6,5,4,3,10,3,3,10,10,8,7,10,2,7 +U,4,9,4,7,2,8,5,14,5,6,14,8,3,9,0,8 +P,5,9,5,6,2,4,15,8,1,12,6,2,0,9,4,8 +L,4,7,5,5,3,6,4,5,9,2,2,4,1,6,2,5 +S,5,10,4,5,2,9,3,1,5,8,1,7,2,7,4,10 +M,5,5,7,4,7,9,8,4,4,7,6,7,8,6,6,5 +G,4,9,5,6,3,6,7,7,6,10,7,11,2,9,4,9 +O,3,7,5,5,2,7,7,8,8,7,6,7,3,8,4,8 +S,5,11,6,8,5,9,6,4,6,10,3,7,2,8,5,10 +V,2,3,3,2,1,4,12,3,3,10,11,7,2,11,0,8 +Q,5,5,7,8,10,7,5,6,2,6,6,8,11,10,9,13 +Q,2,2,3,3,2,8,7,7,3,6,6,10,2,9,3,9 +K,3,5,5,4,3,6,6,1,7,10,8,11,3,7,3,8 +M,3,6,3,4,3,8,6,9,0,6,8,8,6,5,0,8 +P,4,9,6,7,4,7,10,4,5,12,5,3,1,10,4,8 +U,2,3,2,1,1,7,9,5,5,6,9,9,3,10,1,8 +E,8,12,5,6,3,7,6,5,7,10,6,9,2,10,8,9 +F,2,7,2,5,2,1,11,3,4,11,11,8,0,8,1,7 +X,4,9,6,7,5,8,7,3,5,6,6,7,3,9,9,9 +U,5,5,5,7,2,7,5,14,5,7,15,8,3,9,0,8 +K,3,5,6,4,3,7,7,2,7,10,5,9,6,8,5,8 +L,3,9,5,7,3,7,5,1,7,8,2,10,0,6,2,8 +Q,5,9,6,11,6,9,7,8,3,5,6,11,5,8,8,8 +I,1,2,1,3,1,7,7,1,7,7,6,9,0,8,3,8 +W,6,9,8,7,8,8,6,6,2,6,7,8,6,8,5,6 +M,7,8,10,6,6,4,7,4,5,11,11,11,9,6,4,7 +Y,3,5,4,4,2,4,10,2,7,11,10,6,1,11,2,5 +K,5,9,5,5,3,3,9,4,5,10,10,11,4,9,3,6 +H,5,11,7,8,10,8,6,4,4,6,6,7,8,6,8,6 +N,1,3,2,2,1,7,8,5,4,7,6,6,4,9,1,5 +Y,1,0,2,0,0,7,9,2,1,6,12,8,1,10,0,8 +B,3,2,4,3,3,8,7,5,6,7,6,6,2,8,6,10 +C,3,10,4,8,3,5,7,6,7,7,6,13,1,8,4,10 +N,3,6,4,4,3,7,7,6,6,7,6,8,3,7,3,8 +D,4,7,5,5,3,9,7,4,7,11,5,5,3,8,3,8 +E,2,7,3,5,2,3,8,6,11,7,5,15,0,8,6,8 +V,1,0,2,0,0,7,9,3,2,7,12,8,2,10,0,8 +T,2,8,4,5,1,9,15,1,6,5,11,9,0,8,0,8 +Q,6,8,6,9,7,8,7,7,2,8,7,10,3,8,6,7 +U,6,7,7,5,4,4,8,5,7,9,8,9,3,9,3,5 +B,3,6,5,4,6,9,7,4,3,6,7,7,7,9,7,7 +Y,1,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +E,3,5,5,3,3,6,9,2,9,11,8,8,2,8,4,6 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +K,4,7,5,5,4,5,7,6,7,6,6,13,3,8,5,10 +O,4,7,4,5,3,7,7,8,5,10,6,8,3,8,3,7 +T,2,1,3,2,1,7,12,3,6,7,11,8,2,11,1,8 +M,3,6,4,4,4,8,6,6,4,7,7,8,7,5,2,7 +A,4,9,6,6,4,10,2,1,2,8,3,9,5,5,3,7 +H,3,6,3,4,1,7,8,14,1,7,5,8,3,8,0,8 +F,3,5,5,3,2,6,10,3,6,13,7,5,1,10,2,7 +W,8,11,8,8,6,4,10,2,3,10,9,8,8,11,2,6 +D,3,7,3,5,2,5,7,10,8,7,6,5,3,8,4,8 +X,4,8,5,5,1,7,7,4,4,7,6,8,3,8,4,8 +J,3,9,5,7,6,9,8,3,3,8,4,6,4,8,6,4 +K,7,11,7,6,4,7,7,3,6,10,6,9,6,10,3,8 +U,10,13,9,7,4,6,4,5,5,4,8,7,6,7,2,7 +H,5,9,8,7,5,7,7,6,7,7,6,5,6,8,4,7 +B,4,8,4,6,4,6,9,9,7,7,5,7,2,8,9,10 +R,4,11,6,8,8,7,7,3,4,7,6,8,7,10,8,6 +E,1,1,1,1,1,4,7,5,8,7,6,13,0,8,6,9 +P,5,8,7,6,6,8,9,6,4,10,4,4,3,11,4,9 +W,10,11,10,8,7,5,11,3,3,9,8,7,8,11,3,5 +N,4,5,5,8,3,7,7,14,2,4,6,8,6,8,0,8 +T,6,10,6,5,3,7,9,2,7,12,6,6,2,9,4,6 +B,4,8,6,6,5,9,7,4,6,10,5,6,2,8,6,10 +O,5,8,6,6,4,7,8,7,5,10,7,8,3,8,3,8 +A,3,8,5,6,3,12,3,2,2,10,2,9,2,6,2,8 +Y,5,9,7,6,6,9,5,7,5,6,9,7,3,9,9,4 +L,3,7,4,5,3,5,5,2,8,3,2,7,0,7,1,5 +H,3,4,5,3,3,7,7,3,6,10,6,8,3,8,3,8 +Q,2,2,2,4,2,8,7,7,3,6,6,9,2,8,5,10 +D,4,6,5,4,4,9,6,4,6,9,4,6,3,8,3,8 +L,4,10,5,8,3,5,3,6,8,1,2,4,1,6,1,5 +R,6,11,9,8,8,9,8,4,6,9,3,7,3,6,4,11 +P,2,3,3,1,1,8,9,3,3,12,4,4,1,9,2,9 +L,3,8,4,6,3,7,3,4,6,6,2,7,1,6,2,7 +P,5,11,7,8,6,6,10,6,5,10,8,3,1,10,4,7 +M,4,10,6,7,6,8,6,5,5,7,7,8,11,5,2,8 +Q,5,9,5,11,6,8,7,7,3,8,8,10,3,8,6,8 +L,4,9,6,6,3,5,4,3,9,6,1,7,1,6,3,6 +F,3,5,5,3,2,6,11,3,5,13,7,4,1,10,1,7 +Z,4,10,4,7,5,6,8,5,9,8,7,10,1,9,7,8 +V,6,8,8,6,5,6,11,3,2,8,11,8,4,9,5,9 +K,4,5,5,4,3,6,7,4,7,6,6,10,3,8,5,9 +U,3,6,3,4,1,8,5,13,5,6,13,8,3,9,0,8 +J,2,8,3,6,1,13,2,8,4,14,4,12,1,6,0,8 +V,4,6,4,4,2,3,11,2,3,9,10,8,2,11,0,8 +N,2,2,3,3,2,7,8,5,4,7,7,7,4,9,1,6 +J,5,12,4,9,4,7,10,3,2,13,5,5,2,8,7,10 +Q,5,10,6,9,6,8,8,7,5,5,8,9,3,8,5,8 +D,3,9,4,6,4,7,7,6,7,6,5,6,3,8,3,7 +P,3,4,5,3,2,7,9,4,4,12,4,3,1,10,3,8 +N,3,5,4,7,3,7,7,14,2,5,6,8,6,8,0,8 +G,5,10,6,8,6,7,6,7,8,6,4,10,2,9,6,11 +C,2,1,2,1,0,6,7,6,9,7,6,14,0,8,4,10 +V,1,0,2,1,0,8,9,3,2,7,12,8,2,10,0,8 +F,3,7,5,5,3,6,10,5,6,10,10,5,2,9,3,5 +U,7,9,7,7,4,2,8,5,7,11,11,10,3,9,2,6 +H,7,11,10,8,7,7,8,3,7,10,6,7,3,8,3,8 +A,5,10,9,8,7,11,5,1,5,9,1,5,3,7,5,9 +I,1,4,2,3,1,7,7,0,6,13,6,8,0,8,0,8 +Z,2,5,4,3,2,7,8,2,9,11,7,7,1,8,5,7 +G,4,8,5,6,2,7,6,7,8,6,6,9,1,8,6,11 +U,4,5,5,8,2,7,5,14,5,7,14,8,3,9,0,8 +X,3,4,5,2,2,7,8,1,8,10,7,8,2,8,3,7 +V,5,9,5,4,3,10,7,4,5,7,9,5,4,11,2,7 +L,7,12,7,6,4,6,6,4,6,12,9,11,3,8,7,8 +H,7,11,9,8,8,7,6,5,5,6,5,7,9,6,7,10 +D,5,9,7,7,6,10,6,3,7,10,3,6,5,7,4,9 +H,6,10,7,5,4,7,8,3,5,10,7,8,6,9,5,7 +E,4,9,3,4,2,10,5,3,4,11,4,9,2,8,6,12 +Y,2,3,3,2,1,4,10,2,7,10,10,6,1,11,2,4 +J,4,8,5,6,2,8,5,4,6,15,6,11,1,6,0,7 +R,6,9,8,6,7,8,6,6,4,8,5,7,4,7,7,11 +M,7,12,8,6,5,7,3,3,2,8,4,10,8,2,2,8 +S,3,7,4,5,2,9,7,4,8,11,4,8,2,8,5,9 +J,4,6,5,4,2,8,6,4,6,15,7,12,1,6,1,7 +Z,2,6,4,4,3,7,7,2,7,7,6,8,0,8,8,8 +E,4,11,4,8,4,2,8,5,9,7,6,14,0,8,6,8 +G,5,11,6,8,4,6,7,7,7,11,7,11,2,10,4,9 +V,3,9,5,7,1,7,8,4,2,7,14,8,3,9,0,8 +U,4,5,5,4,3,6,9,5,7,7,10,9,3,9,1,8 +J,3,9,4,7,1,13,2,9,4,14,5,13,1,6,0,8 +S,2,6,4,4,4,6,9,3,2,7,7,6,2,8,8,1 +H,3,2,4,3,3,7,8,6,6,7,6,8,3,8,3,7 +D,3,8,3,6,2,6,7,11,8,6,6,6,3,8,3,8 +D,6,10,5,5,4,8,7,4,7,10,5,7,5,9,6,6 +I,3,6,4,4,2,7,7,0,7,13,6,8,0,8,1,7 +X,5,7,8,5,4,7,7,1,8,10,6,8,2,8,3,8 +U,4,7,4,5,2,7,4,14,5,7,13,8,3,9,0,8 +H,5,9,5,6,2,7,7,15,0,7,6,8,3,8,0,8 +X,4,6,5,5,5,9,7,2,5,8,6,6,2,8,7,7 +E,3,8,5,6,3,5,8,4,8,11,9,9,2,8,5,6 +O,4,7,6,5,4,8,9,8,4,7,7,7,3,8,3,8 +U,4,4,5,3,2,4,9,5,7,11,10,9,3,9,2,7 +S,2,7,3,5,3,7,8,7,6,7,5,6,2,8,8,8 +Y,7,10,7,8,3,4,10,3,8,11,11,5,1,11,3,4 +J,3,7,4,5,2,9,6,4,7,15,5,10,0,7,1,7 +X,2,7,3,5,3,7,7,3,7,6,7,10,2,8,6,8 +M,4,4,7,3,4,7,7,3,4,9,8,9,9,7,2,9 +Q,2,0,2,1,1,9,7,6,4,6,6,9,2,8,3,8 +U,10,15,9,8,6,7,6,5,5,6,7,8,5,5,3,7 +C,9,13,6,7,3,8,7,7,7,11,5,8,2,9,5,9 +Z,7,10,9,8,5,7,8,2,10,12,6,8,1,9,6,8 +C,3,6,4,4,1,5,8,6,10,6,7,12,1,7,4,8 +T,2,7,3,4,1,5,14,1,6,9,11,7,0,8,0,8 +Q,3,6,4,5,2,8,6,8,7,6,5,8,3,8,4,8 +K,6,9,8,6,8,8,8,5,5,7,6,6,8,7,8,13 +W,6,6,6,4,4,3,11,2,3,10,10,8,7,11,2,6 +M,3,4,4,3,3,8,6,6,4,6,7,8,7,6,2,7 +F,5,11,7,8,6,9,8,1,6,13,5,5,3,8,3,9 +H,4,10,4,7,2,7,6,15,1,7,8,8,3,8,0,8 +V,6,11,4,6,2,7,10,6,3,8,10,5,5,12,3,8 +V,2,0,3,1,0,7,9,4,2,7,13,8,2,10,0,8 +X,4,8,6,6,3,5,8,2,8,10,11,9,3,8,4,6 +Q,6,7,8,10,10,8,9,5,2,5,7,9,8,15,8,14 +W,3,6,4,4,4,8,7,6,2,6,7,8,5,9,4,6 +Q,4,6,4,7,4,8,5,6,4,9,5,8,3,8,3,8 +C,4,10,5,8,3,5,8,8,8,9,8,13,2,9,4,10 +I,3,8,4,6,2,7,8,0,8,14,6,7,0,8,1,7 +Z,6,11,8,9,5,7,8,3,11,12,7,8,2,9,7,8 +N,1,1,2,2,1,7,7,11,1,5,6,8,4,8,0,8 +I,1,1,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +M,4,4,4,6,3,8,7,12,1,6,9,8,8,6,0,8 +R,1,0,2,1,1,6,10,7,2,7,5,8,2,7,4,10 +W,7,8,7,6,5,6,11,5,3,8,6,6,10,13,3,4 +M,5,9,6,6,6,7,6,6,5,7,7,10,8,5,2,8 +R,8,15,6,8,5,7,5,6,5,8,6,9,6,6,8,10 +D,4,8,4,6,2,5,7,11,8,7,6,5,3,8,4,8 +Y,4,6,6,4,3,4,11,2,7,11,10,5,1,11,3,5 +C,3,7,4,5,2,3,9,5,8,11,11,11,1,8,3,7 +S,7,11,10,8,12,8,9,5,4,8,5,7,7,8,13,9 +P,4,6,4,8,2,3,13,8,2,11,7,3,1,10,4,8 +O,3,5,4,4,3,8,7,7,5,9,6,8,2,8,3,8 +F,5,11,7,8,4,7,10,2,7,14,5,4,1,10,2,8 +E,3,7,5,5,3,4,9,3,7,11,9,9,2,9,4,6 +T,4,5,5,5,5,7,9,4,7,7,8,8,3,10,6,7 +Q,6,8,6,9,7,8,8,6,2,7,8,11,3,8,6,8 +C,5,7,6,6,5,4,8,3,6,7,6,10,3,9,7,8 +W,4,4,5,3,3,3,11,3,2,10,10,8,6,11,1,7 +O,2,3,3,2,2,8,7,7,4,9,6,9,2,8,3,8 +H,5,9,6,6,6,7,7,5,5,7,5,8,6,6,6,11 +P,12,14,10,8,4,8,9,6,5,14,3,4,5,10,5,8 +Y,6,9,6,7,4,5,9,1,7,9,9,6,3,10,5,4 +L,4,9,6,7,4,7,4,1,8,8,2,10,0,7,3,8 +X,2,3,3,2,1,7,7,3,9,6,6,8,2,8,5,7 +G,5,6,7,5,7,7,8,6,3,7,7,8,6,11,7,8 +O,6,9,8,6,9,8,9,5,2,7,7,8,9,9,6,12 +H,8,14,8,8,6,10,7,5,5,11,1,6,7,4,5,7 +V,9,15,8,9,4,9,10,6,4,6,10,6,6,13,3,6 +K,2,3,3,2,2,5,7,4,7,7,6,10,3,8,4,10 +U,3,5,4,4,2,6,8,5,6,6,8,9,6,10,0,7 +I,2,7,3,5,1,7,6,0,8,14,7,10,0,8,1,8 +Y,5,6,5,4,2,3,10,2,7,11,11,6,1,11,2,4 +R,3,6,4,4,4,8,7,7,3,8,5,7,4,7,7,8 +R,4,9,4,7,3,6,8,9,5,6,6,7,3,8,6,11 +O,8,12,6,6,3,7,8,6,5,9,5,7,4,9,5,9 +S,6,11,7,8,7,9,8,5,8,5,5,6,1,6,10,6 +L,6,12,6,7,3,7,4,3,6,11,4,13,3,6,6,8 +N,3,5,4,3,3,7,8,5,5,7,7,6,5,9,2,6 +E,7,11,10,8,6,8,7,2,9,11,6,9,5,7,6,8 +H,2,4,3,2,2,6,7,5,6,7,6,8,3,8,3,8 +A,2,7,4,5,2,11,2,3,3,10,2,9,2,6,2,8 +P,10,13,9,8,6,9,8,4,5,13,4,4,5,10,6,7 +M,6,9,7,4,3,8,10,4,5,5,5,8,8,8,2,7 +F,3,7,4,5,1,1,12,5,5,12,11,8,0,8,2,6 +O,3,6,4,4,3,7,8,6,4,9,7,8,3,8,3,8 +Y,3,5,5,7,1,9,10,2,2,5,12,8,1,11,0,8 +S,2,2,2,3,2,8,8,7,5,8,5,7,2,8,8,8 +V,4,5,5,4,2,4,12,2,3,9,11,7,3,10,1,7 +R,4,8,6,6,7,9,9,3,5,5,7,8,7,10,7,7 +N,6,11,8,6,3,8,7,2,4,13,6,8,6,8,0,8 +Q,3,4,4,4,3,7,8,5,3,8,8,9,3,8,5,8 +R,4,9,4,4,3,9,7,3,5,9,3,8,5,7,5,8 +Y,6,8,8,11,11,7,10,4,2,7,8,9,6,13,9,8 +K,5,9,7,6,5,4,7,2,7,10,10,12,3,8,3,6 +U,3,2,4,3,2,6,8,5,7,7,10,9,3,9,1,8 +F,6,10,7,8,7,6,10,6,5,9,6,8,2,10,8,10 +A,2,3,3,2,1,10,2,2,1,9,2,9,1,6,2,8 +Q,5,6,6,8,3,9,9,8,7,5,8,10,3,8,5,10 +N,2,1,3,3,2,7,8,5,4,8,7,8,4,8,1,7 +U,4,8,6,6,5,8,8,8,5,6,7,9,3,8,4,6 +M,2,3,4,2,3,7,6,3,3,9,7,8,6,5,1,8 +U,3,7,5,6,5,8,7,3,3,6,6,8,4,8,2,8 +T,2,10,4,7,1,7,14,0,6,7,11,8,0,8,0,8 +A,4,9,4,4,2,10,2,4,2,11,5,12,4,4,5,10 +R,9,13,7,8,5,8,7,5,5,9,4,9,7,5,7,11 +K,3,4,4,7,2,3,7,7,3,7,7,11,3,8,3,10 +Q,7,8,7,10,8,8,9,5,2,7,9,11,3,8,6,8 +Y,2,5,4,4,2,8,11,1,7,6,11,8,1,11,2,9 +X,3,1,4,2,2,8,7,4,9,6,6,8,3,8,6,8 +Y,5,9,5,7,3,4,9,1,7,9,10,6,1,10,3,4 +Q,5,11,5,6,4,7,7,4,8,11,5,8,3,7,9,10 +D,5,9,6,7,6,8,8,7,6,8,7,3,5,8,4,9 +T,6,7,6,5,4,6,12,5,6,10,9,4,3,13,3,4 +V,4,10,6,8,3,5,11,3,5,10,12,9,3,10,1,8 +T,2,8,4,5,1,8,15,1,6,6,11,8,0,8,0,8 +G,2,6,3,4,2,8,8,6,5,6,7,9,2,7,5,11 +A,6,10,6,5,3,12,3,6,2,12,2,10,4,3,3,10 +W,2,3,3,1,2,10,11,3,2,5,9,7,5,10,0,8 +I,1,4,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +U,4,6,6,4,4,7,8,8,6,6,6,10,3,8,5,6 +E,4,8,6,6,5,7,7,2,7,11,7,9,3,8,5,8 +T,5,9,7,7,8,7,8,4,6,7,6,9,6,8,6,6 +I,1,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +Y,7,11,8,8,4,5,9,1,9,10,10,5,3,10,5,3 +A,5,10,7,8,4,10,3,2,3,8,1,7,2,7,3,8 +Z,5,11,7,9,4,8,7,2,10,11,5,9,2,8,6,8 +Z,5,5,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +Z,5,8,7,10,6,11,4,3,5,9,2,7,2,7,6,9 +T,3,3,3,2,1,5,12,2,7,11,9,5,1,10,1,5 +Y,2,1,2,1,0,7,10,3,1,7,12,8,1,11,0,8 +N,3,5,5,4,2,7,8,2,4,10,6,6,5,9,0,7 +Q,4,3,5,5,4,8,7,7,3,5,6,9,3,8,5,8 +U,4,9,5,7,3,8,8,7,7,6,10,8,3,9,1,8 +H,3,7,3,4,2,7,8,14,1,7,5,8,3,8,0,8 +E,4,9,6,8,7,6,8,4,3,8,7,9,5,11,8,11 +S,4,8,5,6,3,9,6,5,9,11,3,8,2,7,5,10 +P,4,6,6,4,3,7,10,5,3,11,4,3,1,10,3,9 +M,5,6,7,6,8,7,7,4,4,7,6,8,10,7,5,5 +O,7,10,7,8,5,7,7,8,6,9,7,10,4,7,5,5 +K,3,2,4,4,2,6,7,4,8,6,6,11,3,8,6,9 +Z,5,11,7,8,4,7,7,2,10,12,5,9,1,9,7,8 +T,5,7,5,5,3,5,12,2,7,12,9,4,1,11,2,4 +C,4,9,5,6,3,5,8,7,7,8,8,14,2,9,4,10 +D,6,11,7,8,4,5,7,10,10,7,6,5,3,8,4,8 +I,4,8,6,9,6,8,9,4,5,7,7,8,3,7,8,7 +A,3,2,5,3,2,6,2,2,1,5,2,8,2,7,3,5 +Z,4,10,6,7,4,9,5,3,10,11,4,9,1,7,6,9 +I,3,8,5,6,3,8,6,2,7,7,6,7,0,9,4,7 +M,4,2,5,3,4,8,6,6,4,7,7,8,7,5,2,8 +M,5,10,8,7,11,9,6,2,2,8,4,8,10,5,3,6 +Z,1,0,1,0,0,8,7,2,9,8,6,8,0,8,5,8 +Y,3,5,5,4,2,8,11,1,7,5,11,9,1,11,2,9 +I,1,6,0,4,1,7,7,5,3,7,6,8,0,8,0,8 +Y,3,10,6,7,4,7,10,0,7,6,11,8,1,10,1,8 +Y,7,11,7,8,4,6,8,2,8,8,10,5,5,11,6,3 +N,2,6,2,4,2,7,7,11,1,6,6,8,4,8,0,8 +L,1,0,1,1,0,2,1,5,5,0,2,5,0,8,0,8 +Y,6,7,6,5,3,3,10,2,7,10,11,6,1,11,2,5 +D,4,9,6,6,5,7,8,7,5,8,7,6,3,8,3,7 +K,7,9,10,7,7,7,7,1,6,10,5,9,3,8,4,9 +Y,7,8,9,10,11,9,8,6,3,7,7,8,6,10,7,4 +Q,4,7,6,5,5,8,4,7,4,6,7,10,4,7,6,9 +I,3,4,4,5,3,9,9,5,4,6,6,10,3,7,7,5 +J,4,5,6,6,5,8,8,4,6,6,7,7,3,10,8,10 +R,4,11,6,8,6,8,8,4,6,9,4,8,3,6,5,11 +I,3,7,4,5,2,6,8,0,7,13,7,8,0,8,1,7 +K,2,1,3,2,2,6,7,4,7,7,6,11,3,8,4,9 +Y,4,10,7,8,4,4,9,1,8,10,12,10,1,11,2,7 +T,3,3,4,2,2,8,12,3,6,6,11,8,2,11,1,7 +W,6,9,8,7,9,7,9,6,4,7,9,8,7,7,5,10 +C,4,7,5,5,2,6,8,7,11,6,6,13,1,7,4,8 +X,4,7,5,5,3,7,7,4,9,6,6,10,3,8,6,8 +X,4,7,6,5,4,9,8,3,6,7,7,7,6,11,7,7 +S,4,9,5,6,4,8,7,5,7,5,6,8,0,8,8,8 +F,4,4,4,6,2,1,15,5,3,12,9,4,0,8,2,6 +B,2,1,2,1,2,7,7,7,5,6,6,7,1,8,7,8 +V,1,1,2,2,1,6,12,3,2,9,11,8,2,11,1,8 +V,3,10,5,7,2,9,8,4,3,6,14,8,3,10,0,8 +P,6,10,9,8,5,7,10,2,7,14,6,4,0,10,2,9 +A,4,9,6,6,2,7,7,3,0,7,0,8,3,7,1,8 +X,4,9,6,6,4,8,7,0,7,9,5,7,2,8,3,8 +G,4,7,4,5,3,6,6,6,5,10,7,13,2,9,4,10 +A,3,5,5,3,2,6,2,2,2,5,2,8,2,6,3,6 +T,2,2,3,3,2,6,12,3,6,8,11,8,2,11,1,7 +A,3,10,5,8,4,6,3,1,2,5,2,8,2,5,3,6 +M,6,6,8,4,5,10,6,2,5,9,4,7,8,6,2,8 +Q,3,4,4,5,3,7,8,5,3,7,9,10,3,8,5,8 +R,3,3,4,4,2,5,11,7,3,7,4,8,3,7,6,11 +X,3,1,4,2,2,8,7,3,9,6,6,9,2,8,6,8 +O,4,9,5,7,5,7,7,8,4,7,6,8,3,8,3,8 +J,3,8,5,6,4,9,8,3,3,8,4,6,4,9,6,4 +T,2,3,2,2,1,9,11,3,5,6,10,8,2,11,1,8 +F,2,7,3,5,2,1,12,3,4,11,10,8,0,8,2,7 +Y,4,10,7,7,1,7,10,2,2,7,13,8,2,11,0,8 +W,6,8,6,6,4,3,10,3,3,11,10,8,7,10,2,7 +D,3,2,4,4,3,7,7,7,6,6,6,5,2,8,3,7 +Q,5,11,7,8,7,8,4,8,5,6,6,6,5,7,7,10 +Z,6,7,5,11,4,7,7,5,3,11,7,7,3,9,11,6 +I,2,2,1,4,1,7,7,1,7,7,6,8,0,8,3,8 +S,1,0,2,1,0,8,7,4,6,5,6,7,0,8,7,8 +K,3,6,5,5,5,6,8,3,3,7,4,9,4,6,6,9 +L,2,4,3,3,1,7,4,1,8,8,2,10,0,7,2,8 +A,2,2,4,3,1,7,3,2,2,6,1,8,2,6,2,7 +H,5,6,6,8,3,7,8,15,0,7,5,8,3,8,0,8 +V,2,4,4,2,1,9,12,2,3,5,11,9,2,11,1,8 +O,3,3,4,4,2,7,8,8,6,7,7,8,3,8,4,8 +P,4,9,4,7,4,4,12,7,1,11,7,4,1,10,3,8 +O,3,3,4,4,2,8,7,8,8,7,6,8,3,8,4,8 +G,5,5,6,7,3,7,4,7,9,5,5,9,1,9,7,11 +W,5,7,5,5,4,4,11,2,2,9,8,7,6,11,2,6 +C,5,9,6,7,2,6,8,7,11,6,7,13,1,7,4,8 +X,3,8,4,5,1,8,7,4,4,7,6,8,3,8,4,8 +G,2,6,3,4,2,7,6,6,6,6,5,10,1,8,5,11 +S,5,9,5,5,2,5,9,4,4,13,9,7,2,9,3,7 +V,4,7,4,5,3,4,12,2,2,9,11,8,3,11,1,7 +R,3,5,5,4,3,9,7,4,5,10,3,7,5,6,4,9 +A,4,9,7,7,5,11,3,1,2,8,3,9,6,5,3,8 +U,3,3,4,1,1,5,8,4,6,10,9,9,3,10,1,6 +S,5,7,6,5,3,8,7,3,8,11,6,8,2,10,5,8 +T,2,7,3,5,2,9,12,0,5,6,10,8,0,8,0,8 +B,3,5,5,4,3,8,8,3,5,10,5,6,3,7,5,9 +D,3,8,5,6,4,7,7,7,7,7,7,5,3,8,3,7 +U,5,8,6,6,4,4,8,5,7,9,7,9,4,8,4,4 +D,5,11,7,8,8,7,7,6,6,6,6,5,6,8,3,7 +B,4,9,4,4,4,8,7,3,4,9,6,8,5,7,6,8 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +F,6,8,7,9,8,6,9,4,4,7,7,6,5,9,9,8 +Z,4,8,5,6,5,8,8,3,8,7,7,7,0,8,11,8 +B,9,11,6,6,4,8,6,5,6,11,4,9,6,7,6,10 +E,4,11,6,8,5,8,7,2,8,11,6,8,2,8,5,9 +V,2,3,3,2,1,4,12,3,2,9,11,7,2,11,0,7 +Y,1,1,3,2,1,8,11,1,5,5,11,9,1,11,1,8 +Y,5,8,5,6,3,3,10,1,7,11,11,6,1,10,3,4 +C,3,6,5,4,4,7,7,4,3,7,7,10,5,10,3,8 +B,3,1,3,2,3,7,7,5,5,7,6,6,2,8,6,10 +J,3,10,4,7,1,14,1,7,5,14,1,10,0,7,0,8 +X,3,5,4,4,2,7,7,3,9,6,6,8,2,8,6,8 +D,6,10,8,8,8,7,7,5,7,7,6,5,6,8,3,7 +W,6,9,6,7,5,4,10,3,3,9,8,7,7,11,2,5 +K,2,3,4,2,2,6,7,1,6,10,7,10,3,8,2,8 +R,5,5,6,7,3,6,11,9,4,7,3,8,3,7,6,11 +U,3,8,5,6,2,5,8,7,8,10,10,9,3,9,1,8 +Z,2,4,2,3,2,8,7,5,9,6,6,7,1,8,7,8 +N,2,1,2,2,1,7,8,5,4,7,6,6,5,9,1,5 +J,6,7,7,8,6,9,9,5,5,6,6,10,3,7,8,5 +K,2,3,3,1,1,5,7,1,6,10,8,10,3,8,2,6 +T,3,11,4,8,1,6,14,0,6,8,11,8,0,8,0,8 +F,3,3,3,4,1,1,12,4,4,12,10,7,0,8,2,6 +D,4,9,6,7,6,9,7,6,6,9,4,6,3,8,3,9 +G,3,7,4,5,2,8,8,8,7,5,7,9,2,7,5,10 +J,4,10,5,7,2,8,7,2,7,15,5,8,0,7,1,7 +B,1,3,3,2,2,8,7,2,5,10,5,7,2,8,3,9 +P,2,3,4,2,1,7,11,4,3,11,4,2,0,9,3,8 +W,6,10,9,8,7,5,8,4,1,7,9,8,7,11,0,8 +N,6,10,5,5,3,5,9,4,5,3,3,12,6,11,2,7 +U,2,3,3,1,1,5,8,5,6,10,9,9,3,10,1,6 +C,3,6,4,4,2,6,8,7,7,9,8,12,2,10,4,10 +S,5,8,6,6,3,5,9,3,9,11,6,7,2,7,5,6 +H,3,3,4,4,2,7,7,14,1,7,7,8,3,8,0,8 +A,6,10,9,8,9,8,7,7,4,7,6,9,6,8,7,4 +K,4,5,7,4,4,3,8,2,7,10,10,11,3,8,3,6 +Z,4,10,5,8,2,7,7,4,14,10,6,8,0,8,8,8 +T,6,9,7,7,8,5,8,4,7,7,6,10,5,7,5,7 +P,3,6,4,4,2,4,13,8,1,10,6,3,1,10,4,8 +O,4,8,6,6,4,7,7,8,5,7,5,8,3,8,3,8 +S,8,15,8,8,4,9,5,5,5,13,5,9,2,8,3,7 +X,6,10,9,8,8,8,7,3,7,7,7,8,6,13,8,8 +A,5,11,7,9,5,10,2,2,3,9,1,7,3,7,4,8 +I,1,4,1,3,1,7,7,1,7,7,6,8,0,8,2,8 +D,5,4,5,7,3,5,6,10,9,5,4,5,3,8,4,8 +P,2,1,2,1,1,5,11,7,2,9,6,4,1,9,3,8 +F,4,9,4,6,2,1,13,5,4,12,11,6,0,8,2,6 +E,4,8,6,6,4,9,6,2,7,11,5,9,3,7,6,10 +H,4,3,4,4,2,7,8,14,0,7,6,8,3,8,0,8 +T,4,5,5,4,3,5,12,4,6,11,9,4,2,11,1,5 +M,1,0,2,0,0,7,6,9,0,7,8,8,5,6,0,8 +G,3,6,4,4,2,6,6,5,7,7,5,10,2,10,4,8 +V,2,8,4,6,1,8,8,4,2,7,13,8,3,9,0,8 +D,5,10,5,8,3,5,7,10,9,7,6,5,3,8,4,8 +T,5,11,7,8,7,8,11,3,6,6,11,8,3,12,1,8 +D,5,10,6,8,3,5,7,10,9,7,6,5,3,8,4,8 +H,7,13,7,8,6,7,7,3,4,10,5,8,6,9,5,8 +W,6,7,9,6,10,7,8,5,5,7,5,8,10,10,8,8 +Z,5,10,7,8,4,7,7,3,11,12,7,8,2,8,7,7 +F,4,7,6,5,4,8,8,2,6,13,5,6,2,10,2,8 +B,2,3,4,2,2,8,8,3,5,10,5,6,2,8,5,9 +R,3,7,5,5,4,6,8,5,6,6,5,7,3,7,5,9 +Z,1,0,1,1,0,7,7,2,10,8,6,8,0,8,6,8 +U,6,10,6,5,4,7,5,6,5,6,8,8,5,10,3,9 +N,10,15,9,8,4,7,10,5,5,4,5,11,6,11,3,7 +B,1,3,2,2,1,7,7,4,4,6,6,5,2,8,5,9 +I,0,7,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +A,4,7,6,5,2,8,3,3,3,9,1,8,2,7,3,7 +K,5,7,8,5,4,3,7,2,7,10,11,12,3,8,4,5 +Z,3,7,4,5,3,6,8,5,10,7,7,10,2,9,8,8 +R,5,11,7,8,8,6,7,5,6,6,5,7,3,7,5,8 +R,4,2,5,4,4,7,8,4,6,7,5,7,3,7,4,8 +F,4,6,5,4,3,7,10,4,5,13,7,5,2,9,2,7 +I,4,10,5,8,2,7,9,0,8,14,6,6,0,10,2,7 +A,7,11,9,8,9,7,6,8,4,7,5,8,5,8,11,2 +I,1,3,1,2,0,7,8,0,6,12,6,8,0,8,0,7 +J,2,6,2,4,2,8,7,0,6,10,5,7,0,7,1,7 +K,5,9,5,4,3,9,7,2,6,10,4,7,5,9,3,9 +U,2,1,3,2,1,5,8,6,6,8,10,10,3,9,1,7 +T,1,0,1,0,0,7,13,1,4,7,10,8,0,8,0,8 +Y,1,3,2,2,1,5,10,2,7,10,9,5,1,11,2,4 +W,2,1,2,2,1,7,8,4,0,7,8,8,6,10,0,8 +J,4,7,6,5,4,8,6,5,5,8,7,7,3,7,4,6 +U,4,2,5,4,2,6,8,5,8,6,9,9,3,9,1,7 +N,8,15,10,8,5,5,9,3,4,13,10,9,6,9,0,8 +J,1,3,2,2,1,11,6,2,6,12,3,8,0,7,0,8 +U,1,0,2,1,0,8,6,11,4,7,12,8,3,10,0,8 +W,4,4,6,6,3,4,8,5,1,7,8,8,8,9,0,8 +F,4,7,7,5,6,8,7,1,4,10,7,7,6,9,3,6 +K,5,9,8,6,6,7,7,1,6,10,5,9,3,7,3,8 +U,7,14,6,8,5,8,6,4,5,7,7,8,6,5,4,6 +P,4,11,5,8,6,6,9,6,4,9,8,4,1,10,3,7 +A,3,6,5,4,2,8,2,2,2,7,1,8,2,6,3,7 +J,4,10,6,8,6,9,8,4,4,9,3,7,4,8,7,5 +W,6,6,6,4,5,4,11,2,2,9,8,7,7,12,2,6 +T,5,6,6,5,6,8,9,5,7,7,7,8,3,10,7,7 +M,4,6,7,4,4,6,6,3,4,9,9,9,9,6,3,9 +P,3,9,4,6,2,5,9,10,5,8,6,5,2,9,4,8 +Z,4,9,5,7,5,9,9,6,4,7,5,8,4,9,10,6 +L,3,7,4,5,3,5,5,4,7,3,2,6,4,6,1,6 +M,5,11,7,8,9,7,6,7,4,7,5,8,6,10,7,8 +I,2,8,2,6,2,7,7,0,8,7,6,8,0,8,3,8 +B,3,6,5,4,6,8,7,4,3,6,7,8,6,10,7,7 +M,3,7,5,5,5,10,6,6,4,6,7,5,7,5,1,5 +M,6,8,9,7,10,8,7,4,5,7,6,7,12,8,6,4 +C,2,5,3,3,1,4,8,5,7,11,9,13,1,9,2,7 +G,5,11,7,8,6,6,6,6,7,6,6,9,4,9,4,8 +Z,5,5,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +O,4,7,5,5,2,8,6,8,8,7,5,8,3,8,4,8 +Z,3,4,4,6,2,7,7,4,13,10,6,8,0,8,8,8 +U,5,8,7,6,6,7,8,8,5,5,7,10,4,9,4,5 +M,9,13,11,7,6,13,2,6,2,12,1,9,7,2,1,8 +M,5,5,6,8,4,7,7,12,2,7,9,8,8,6,0,8 +U,5,11,5,8,4,8,5,12,4,7,13,8,3,9,0,8 +U,7,8,8,6,4,4,8,6,8,9,9,10,3,9,3,5 +X,3,3,5,2,2,9,7,2,8,11,4,7,2,8,3,8 +Z,3,6,4,4,1,7,7,3,13,9,6,8,0,8,8,8 +V,2,3,2,1,1,5,12,3,2,9,10,7,2,11,1,8 +U,6,11,9,8,12,8,8,4,4,6,7,8,10,6,8,8 +C,4,7,5,5,2,6,6,6,10,7,6,13,1,9,4,9 +N,5,7,6,5,4,8,8,6,6,6,5,3,8,9,5,7 +H,4,2,5,4,3,9,7,6,6,7,6,8,6,8,3,7 +W,6,8,6,6,4,2,10,3,3,11,11,9,7,10,1,6 +J,6,7,4,10,3,10,6,3,4,11,3,5,3,8,7,10 +Y,8,7,6,11,5,9,7,5,5,4,12,5,4,11,5,7 +R,3,7,4,5,2,5,11,8,4,7,3,9,3,7,6,11 +Q,4,7,6,8,6,8,5,8,4,6,5,9,4,9,6,8 +O,3,6,4,4,2,7,7,7,4,9,6,8,3,8,3,8 +S,7,15,5,8,3,10,2,2,5,10,1,9,3,7,4,9 +V,4,5,6,4,2,4,12,3,3,10,11,7,2,10,1,8 +A,3,8,5,6,3,6,4,3,0,6,2,7,2,7,2,7 +A,4,7,7,5,5,7,6,2,4,6,1,6,3,5,3,7 +F,5,7,6,5,6,7,10,5,4,8,6,8,2,9,7,11 +S,4,10,6,8,7,8,8,5,3,8,5,7,4,9,11,8 +T,4,6,6,4,5,5,8,4,5,6,7,8,5,10,4,8 +I,1,3,2,2,1,7,7,1,6,13,6,8,0,8,0,8 +J,1,1,2,2,1,10,7,2,5,11,4,8,0,7,0,7 +W,6,7,6,5,4,4,11,3,3,9,9,7,7,11,2,6 +N,1,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +N,5,10,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +O,5,9,6,7,8,8,9,5,2,7,7,8,8,9,4,8 +V,5,9,4,4,2,7,10,4,4,8,9,6,3,10,2,7 +X,5,8,8,6,4,8,8,1,8,11,4,7,4,9,4,8 +L,3,11,5,8,3,4,4,4,8,2,0,6,0,6,1,5 +L,2,6,3,4,1,0,1,5,6,0,0,6,0,8,0,8 +B,6,11,8,8,8,9,6,4,5,7,6,7,4,8,6,10 +H,3,3,5,2,2,7,8,3,6,10,7,8,3,8,3,8 +O,5,8,6,6,5,6,8,7,4,9,8,8,3,8,3,8 +T,6,8,6,6,3,5,12,2,8,12,9,4,1,11,2,4 +V,3,4,5,3,2,6,12,2,3,7,11,8,2,10,1,8 +F,6,11,9,8,9,7,7,6,4,8,6,8,5,12,10,12 +Q,2,3,3,4,3,9,8,6,1,5,7,10,2,10,5,10 +N,6,5,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +R,7,13,7,7,6,8,7,3,5,9,4,8,6,6,7,6 +N,3,7,3,5,2,7,7,13,2,5,6,8,5,8,0,8 +F,4,7,6,5,6,8,8,1,4,10,6,6,5,10,4,5 +E,4,9,5,7,3,3,7,6,11,7,6,15,0,8,7,7 +T,3,3,4,2,1,5,13,3,7,12,9,3,1,10,1,5 +N,5,6,6,6,6,6,7,5,3,6,5,8,7,9,4,8 +R,6,12,6,6,5,5,9,2,5,7,5,10,4,7,6,7 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +U,4,7,6,6,5,7,7,4,4,6,6,9,4,9,1,8 +P,3,7,3,5,3,5,10,8,3,9,6,5,1,10,3,8 +F,5,7,7,5,3,5,13,5,5,13,7,3,2,10,2,6 +Q,5,5,5,6,5,8,7,6,2,8,6,11,3,9,6,8 +Z,2,3,3,4,1,7,7,3,13,9,6,8,0,8,7,8 +S,5,11,5,6,2,8,7,4,3,13,7,8,3,10,3,8 +N,4,8,4,6,2,7,7,14,2,4,6,8,6,8,0,8 +W,1,0,2,0,1,7,8,3,0,7,8,8,5,10,0,8 +M,9,12,11,6,6,6,3,3,2,7,4,11,10,1,2,8 +Q,2,3,3,4,2,7,8,5,2,7,8,10,2,9,4,8 +D,4,8,5,6,4,7,7,7,7,7,6,4,3,8,3,7 +B,1,3,3,2,2,8,7,3,5,10,5,7,2,8,4,9 +Q,5,11,5,6,3,10,4,4,7,11,3,9,3,7,8,11 +W,7,8,7,6,5,4,11,3,3,9,9,7,7,11,2,6 +Q,2,2,3,3,2,7,9,4,1,8,8,10,2,9,4,8 +N,7,10,10,7,6,4,9,3,4,10,10,9,8,7,2,7 +E,4,9,5,6,4,7,7,3,8,11,7,9,3,8,5,8 +M,5,8,8,6,9,8,6,3,2,8,4,8,12,5,2,7 +Q,3,7,4,6,2,8,7,8,5,6,7,8,3,8,5,9 +J,1,4,2,2,1,9,6,3,5,12,5,9,1,7,1,7 +U,6,6,6,4,4,5,8,5,7,8,6,9,5,9,5,3 +L,8,13,8,7,5,8,4,3,5,11,6,11,3,7,7,8 +H,5,9,7,7,6,6,6,6,4,6,5,8,6,7,6,10 +R,3,2,4,4,3,6,7,5,5,6,5,7,3,7,4,8 +X,6,10,9,8,4,5,9,2,9,10,10,9,3,8,4,6 +B,2,1,3,2,2,7,8,8,5,7,6,7,2,8,8,9 +V,6,10,6,8,3,4,11,2,4,9,11,7,3,9,1,7 +X,3,5,4,5,4,7,6,2,5,7,6,9,2,11,7,8 +R,4,9,6,7,8,8,9,3,5,5,7,8,5,9,8,7 +T,3,9,5,6,4,8,11,2,7,6,11,7,2,12,1,7 +S,3,8,4,6,4,8,7,7,5,7,7,9,2,9,8,8 +O,5,10,7,8,3,8,7,9,8,7,6,9,3,8,4,8 +K,6,9,9,7,5,9,6,2,7,10,3,9,7,7,6,9 +U,4,9,6,8,6,7,7,5,4,6,7,8,6,8,1,7 +L,2,5,4,4,2,7,4,1,8,8,2,10,0,7,2,8 +U,5,9,8,7,10,8,6,4,4,6,7,8,11,9,6,8 +Z,5,6,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +X,5,7,6,6,6,6,7,2,5,7,7,10,3,8,7,8 +I,4,9,3,5,2,6,10,2,5,13,6,4,1,9,4,8 +T,4,6,4,4,2,6,11,2,9,11,9,4,0,10,3,5 +P,5,5,6,7,8,8,6,4,3,6,7,7,6,9,4,5 +M,5,6,8,4,4,5,7,3,5,10,10,10,8,5,2,7 +Y,3,5,5,7,7,8,4,4,3,7,8,8,5,9,5,8 +W,3,1,3,2,1,8,8,4,0,7,8,8,7,10,0,8 +Z,3,2,3,3,2,7,8,5,10,6,6,9,1,8,7,8 +J,6,7,8,9,7,7,8,4,7,6,7,7,3,10,9,9 +D,2,1,2,1,1,7,7,6,6,7,6,5,2,8,2,7 +K,3,7,3,4,1,3,7,7,2,7,5,11,3,8,2,11 +O,5,9,7,8,5,6,6,6,5,8,5,8,4,6,5,6 +X,3,7,5,5,2,10,5,2,8,10,1,7,3,7,3,10 +C,6,11,4,6,2,6,8,7,6,11,7,7,2,9,5,8 +G,5,9,6,7,5,7,7,8,5,5,7,9,3,6,5,9 +B,3,4,5,3,3,8,7,3,5,10,5,7,2,8,4,9 +B,2,3,2,2,2,7,7,5,5,7,6,6,2,8,5,9 +W,5,7,7,5,3,8,8,5,1,7,8,8,8,9,0,8 +I,2,8,3,6,2,8,7,0,7,13,6,9,0,8,1,8 +C,1,0,2,1,0,7,7,6,8,7,6,13,0,8,4,10 +X,6,10,8,8,7,7,7,3,6,6,6,8,6,7,13,10 +X,4,11,6,8,5,7,7,3,8,5,6,8,2,8,6,8 +M,3,3,4,4,2,7,6,11,1,8,9,8,7,6,0,8 +P,3,6,4,9,8,7,6,6,1,7,6,7,4,10,7,11 +M,6,10,8,8,8,6,6,6,5,7,8,11,8,6,2,9 +F,4,8,6,6,4,9,8,1,6,13,5,5,2,9,3,9 +M,6,7,8,5,6,8,6,2,5,9,8,8,8,4,2,7 +S,2,3,4,2,2,8,8,2,7,10,5,7,1,9,4,8 +P,3,5,5,3,2,7,11,4,3,12,5,2,1,10,2,8 +C,3,6,4,4,2,6,7,6,7,6,7,12,1,8,4,10 +Q,3,4,4,5,3,8,7,7,2,5,7,9,2,9,5,10 +O,2,3,3,1,1,8,7,7,5,7,6,8,2,8,3,8 +G,2,1,3,2,1,8,6,6,6,6,5,9,1,7,6,10 +C,2,4,3,6,1,5,7,7,9,8,6,14,1,9,4,9 +A,4,11,8,8,6,9,5,1,4,7,2,6,3,8,6,6 +Z,3,7,5,5,3,8,7,2,9,11,5,7,1,7,6,8 +V,4,5,6,4,6,7,7,5,4,7,6,8,6,9,7,7 +E,4,7,6,6,6,6,8,3,3,8,7,8,5,12,9,9 +T,1,0,2,0,0,7,14,1,4,7,10,8,0,8,0,8 +N,5,8,6,6,5,7,6,9,5,5,4,5,5,7,4,10 +E,5,9,8,6,5,10,6,2,9,11,4,8,2,8,5,11 +A,4,9,6,7,4,8,2,2,3,7,1,8,2,7,3,6 +R,4,6,5,4,3,9,7,4,5,10,3,7,3,7,4,10 +U,2,1,3,1,1,6,9,6,6,7,10,9,3,10,1,8 +E,4,10,4,7,4,3,8,5,9,7,6,14,0,8,6,8 +V,7,10,7,8,4,2,12,2,3,10,11,8,2,10,1,8 +B,5,10,6,8,8,8,8,6,6,7,6,6,6,8,6,10 +Z,4,6,6,4,4,7,8,2,8,12,7,8,1,9,6,7 +K,4,7,6,5,3,6,7,2,7,10,7,10,3,8,3,8 +D,4,9,5,6,5,7,7,6,6,7,6,5,3,8,3,7 +X,3,5,5,4,4,9,8,2,6,8,5,6,2,6,7,7 +P,5,5,7,6,7,7,8,4,3,8,8,6,6,11,5,5 +H,7,9,10,7,8,8,7,2,6,10,6,8,3,8,3,7 +C,4,8,5,6,6,6,7,4,4,6,7,10,6,10,4,8 +D,5,11,7,8,7,9,7,4,5,9,4,6,3,8,3,8 +Q,5,7,6,9,7,9,7,7,2,5,6,10,3,9,6,9 +Y,6,10,6,7,3,4,10,1,8,10,10,5,2,12,4,3 +R,5,9,6,7,5,7,9,4,6,6,4,8,4,5,6,9 +G,3,7,4,5,2,7,8,8,7,6,7,8,2,7,6,11 +R,4,7,5,5,4,7,8,5,7,7,4,6,6,7,5,8 +F,2,4,4,3,2,6,11,2,6,13,6,4,1,10,1,7 +Q,5,9,5,5,3,10,5,4,6,12,3,8,3,8,7,11 +F,4,10,4,7,2,0,13,4,4,12,11,7,0,8,2,6 +Q,7,9,7,11,7,8,6,7,5,9,8,9,5,9,8,9 +T,2,3,3,2,1,5,12,3,6,11,9,4,1,10,2,5 +C,3,8,4,6,2,6,8,7,9,5,7,12,1,7,4,9 +N,4,10,6,7,4,7,9,6,5,7,6,7,6,8,2,6 +J,1,2,2,3,1,10,6,2,6,12,4,8,0,7,1,7 +O,2,1,3,2,1,7,7,7,6,7,6,8,2,8,3,8 +Z,2,5,3,4,3,8,7,5,9,6,6,7,2,8,7,8 +M,3,7,4,5,4,8,5,11,1,6,8,8,6,5,0,7 +V,1,0,2,0,0,8,9,3,1,6,12,8,2,11,0,8 +X,3,6,5,4,3,7,7,1,7,10,6,8,3,8,3,7 +H,4,8,4,5,2,7,5,15,1,7,8,8,3,8,0,8 +Z,3,7,5,5,3,7,8,2,9,11,6,9,1,9,6,8 +G,5,9,5,6,3,6,7,6,7,10,8,10,2,9,4,9 +V,4,5,6,4,5,7,8,5,5,7,6,8,6,9,7,6 +U,4,10,6,8,10,9,8,4,4,6,7,8,9,7,8,8 +F,0,0,1,0,0,3,12,4,2,11,9,6,0,8,2,8 +X,4,5,6,4,3,7,7,1,9,10,6,8,2,8,3,7 +A,5,11,8,8,6,6,3,2,3,4,2,7,5,5,5,5 +Y,2,1,2,1,0,8,10,3,1,6,13,8,1,11,0,8 +U,2,3,3,2,1,5,8,5,6,11,9,9,3,9,1,6 +O,2,4,3,3,2,8,6,6,3,9,5,8,2,8,2,8 +O,5,11,6,8,6,7,6,7,4,10,6,10,5,8,4,6 +C,4,8,5,6,3,4,8,5,6,9,8,14,3,7,4,8 +C,5,10,6,8,4,4,8,7,9,8,9,13,1,8,4,9 +W,5,10,7,8,8,8,9,6,4,5,9,9,7,8,4,5 +J,4,7,5,5,2,7,7,3,6,15,5,9,0,7,0,7 +T,3,10,5,7,1,7,15,0,6,7,11,8,0,8,0,8 +A,4,10,7,8,5,11,2,2,2,9,2,9,4,5,4,8 +H,4,7,5,5,5,7,7,6,6,7,6,8,6,8,3,8 +Q,3,4,4,5,3,8,8,6,2,5,7,9,3,9,5,10 +M,5,6,7,4,5,10,6,2,4,9,4,7,7,6,2,8 +O,3,4,4,6,2,7,7,9,7,7,6,8,3,8,4,8 +B,3,1,3,2,3,7,7,5,5,7,6,6,2,8,6,9 +I,2,9,5,7,5,10,7,2,5,9,4,5,3,8,6,5 +Q,7,9,10,8,8,5,4,4,5,4,4,7,4,8,6,6 +D,4,8,5,6,4,7,8,7,8,8,7,5,3,8,3,7 +M,4,7,5,5,3,7,7,12,1,7,9,8,8,6,0,8 +N,5,7,7,5,3,7,9,2,4,10,6,6,5,9,1,7 +O,4,11,5,8,5,8,7,8,4,7,7,7,3,7,3,8 +U,3,2,5,3,2,6,8,6,8,7,10,9,3,9,1,8 +N,3,5,5,4,3,7,9,2,4,10,6,6,5,9,1,7 +H,4,9,5,7,5,8,7,6,6,7,6,6,6,8,3,6 +A,2,2,4,3,2,8,2,1,1,7,2,8,2,7,3,7 +A,2,4,4,2,2,10,2,2,2,9,2,8,2,6,2,8 +N,9,12,7,7,3,9,11,5,6,3,5,9,5,8,2,7 +N,3,4,5,3,2,7,9,3,4,10,6,6,5,9,0,7 +X,2,2,3,3,2,8,7,3,8,6,6,8,2,8,6,8 +G,5,5,6,7,3,8,6,8,9,6,5,11,1,8,6,11 +G,3,3,4,5,2,7,8,8,7,6,7,8,2,7,6,11 +H,4,8,4,5,2,7,5,15,1,7,8,8,3,8,0,8 +B,4,5,4,3,4,7,7,6,6,7,6,6,2,8,6,10 +J,3,8,3,6,2,14,3,4,4,13,1,8,0,7,0,8 +H,4,5,6,7,6,7,8,4,1,8,6,6,4,10,8,5 +C,4,5,5,4,2,4,8,5,7,11,10,12,1,9,3,7 +N,5,10,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +S,3,6,4,4,3,8,6,6,5,7,7,10,2,10,8,8 +K,3,7,4,5,3,5,7,5,7,6,5,10,3,8,4,9 +Y,6,11,6,8,2,3,12,5,6,13,12,6,2,11,2,6 +X,4,9,7,7,3,7,7,1,9,10,6,8,3,8,4,7 +Y,2,4,3,2,1,4,11,2,7,11,10,5,1,11,2,5 +O,2,5,3,4,2,8,7,7,4,9,6,8,2,8,2,8 +Z,4,4,6,6,3,12,4,4,4,11,2,9,2,7,4,11 +C,2,4,3,3,1,6,8,7,7,9,7,12,1,10,4,10 +R,3,5,6,4,4,8,7,3,5,10,4,6,3,7,4,10 +Q,6,9,8,8,7,7,4,5,6,7,4,9,5,5,7,7 +Y,2,5,4,4,2,6,10,1,6,8,11,8,1,11,2,7 +A,2,4,3,3,1,11,3,3,2,11,2,9,1,6,2,9 +U,7,10,7,7,5,3,8,5,7,10,9,9,3,9,2,6 +C,3,7,4,5,1,6,8,6,9,5,6,14,1,7,4,9 +M,5,5,6,4,5,8,6,6,5,7,7,8,9,6,3,7 +B,7,11,9,8,7,10,6,4,7,10,4,7,3,8,6,11 +N,2,3,3,5,2,7,7,13,1,5,6,8,5,8,0,8 +F,2,4,4,3,1,6,12,3,5,13,7,4,1,9,2,6 +C,2,4,3,3,1,4,8,5,7,11,9,12,1,9,2,7 +G,2,4,3,3,2,6,7,5,4,9,8,10,2,9,4,9 +J,1,3,2,4,1,13,3,7,4,13,4,11,1,6,0,8 +A,5,11,5,6,4,10,3,4,2,10,5,11,5,3,5,10 +U,7,10,8,8,5,3,8,5,7,10,10,10,3,9,2,6 +C,5,10,3,5,2,5,9,6,6,11,8,8,2,9,5,8 +S,4,7,6,6,7,8,7,5,4,7,7,7,5,9,10,12 +I,0,3,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +S,3,8,4,6,3,8,8,8,8,7,4,7,2,6,9,8 +H,2,2,3,3,3,8,8,6,6,7,6,7,3,8,3,7 +B,3,5,4,3,4,7,7,5,5,6,6,6,2,8,6,10 +Z,1,0,2,1,0,7,7,2,10,8,6,8,0,8,6,8 +F,5,8,7,6,4,7,10,2,6,13,6,5,2,10,2,8 +D,5,9,7,7,6,10,7,5,6,9,3,6,3,8,3,8 +F,2,3,2,1,1,6,10,4,5,10,9,4,1,10,3,6 +K,3,4,5,3,2,7,6,1,6,10,6,10,3,8,3,8 +W,6,8,8,7,9,8,8,5,6,7,6,8,9,8,8,7 +T,0,0,1,0,0,7,13,1,4,7,10,8,0,8,0,8 +E,3,11,5,8,5,7,7,6,8,6,5,9,3,8,6,9 +L,2,3,2,2,1,4,3,5,7,2,2,5,0,7,1,6 +I,3,7,4,5,2,7,7,0,7,13,6,8,0,8,1,8 +V,6,11,6,8,3,3,12,5,4,11,12,7,3,9,1,8 +P,4,5,5,7,6,8,9,3,2,7,8,6,5,11,5,4 +H,4,6,6,4,4,7,7,3,6,10,7,8,3,9,3,7 +O,2,4,3,3,2,7,7,7,5,7,6,8,2,8,3,8 +N,5,9,8,7,4,9,7,3,5,10,3,5,6,9,1,7 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +Y,1,0,2,0,0,7,9,2,2,6,12,8,1,10,0,8 +I,1,2,1,3,1,7,7,1,7,7,6,8,0,8,3,8 +R,1,0,2,1,1,6,9,7,3,7,5,7,2,7,4,10 +J,3,10,4,7,2,10,6,0,8,11,3,6,0,7,1,7 +N,10,15,9,8,4,8,10,5,4,4,6,10,6,11,3,6 +Y,4,7,6,9,9,9,6,6,3,7,7,8,7,9,6,5 +B,1,1,2,1,1,7,7,7,5,7,6,7,1,8,6,8 +S,5,5,6,4,6,9,8,4,5,7,7,8,5,10,9,11 +H,1,0,1,0,0,7,7,10,1,7,6,8,2,8,0,8 +G,2,4,2,2,1,6,7,5,5,9,7,10,2,8,4,9 +G,6,9,5,4,3,10,6,4,6,11,3,8,4,7,5,9 +C,8,11,5,6,2,7,9,6,7,12,7,8,2,9,5,9 +N,2,1,2,1,1,7,7,12,1,5,6,8,5,8,0,8 +T,4,11,5,8,3,7,14,0,5,7,10,8,0,8,0,8 +K,4,5,7,3,3,6,8,2,8,10,8,10,4,7,3,6 +F,6,11,9,8,9,5,8,2,4,10,9,8,6,11,6,6 +X,2,3,3,2,2,8,7,3,9,6,6,8,2,8,5,8 +F,3,7,5,5,3,5,10,4,6,11,10,5,2,9,3,5 +O,6,8,8,7,6,8,4,3,4,9,3,8,4,7,5,8 +W,1,0,2,0,0,7,8,3,0,7,8,8,5,9,0,8 +Y,5,9,8,6,4,8,10,1,7,5,11,8,2,12,3,8 +J,2,6,3,4,1,10,7,1,6,12,3,7,0,7,0,7 +U,12,15,10,8,4,5,3,5,5,4,7,7,5,8,2,6 +V,3,5,4,3,1,3,12,4,3,11,11,7,2,10,1,8 +Z,7,10,9,8,5,7,8,3,10,12,7,7,1,8,6,7 +T,4,9,6,8,6,7,9,4,7,7,8,8,3,12,10,7 +E,6,11,4,6,2,7,8,5,7,8,4,12,1,7,7,8 +J,2,9,3,7,1,15,2,6,5,14,1,9,0,7,0,8 +W,10,10,10,8,6,2,10,2,3,10,11,9,8,10,1,7 +D,4,10,5,7,3,6,7,11,9,7,6,6,3,8,4,8 +M,6,9,7,4,4,10,10,6,3,5,7,9,10,13,2,6 +S,3,8,4,6,3,7,8,8,7,8,5,7,2,7,9,8 +T,3,5,4,4,4,6,8,4,7,7,7,9,3,10,6,7 +V,4,10,6,8,4,8,11,2,3,4,10,9,3,11,2,8 +O,7,10,7,8,5,8,6,8,6,10,5,9,5,9,6,5 +D,5,11,7,9,6,9,7,5,7,10,5,5,3,8,3,8 +B,2,5,4,4,3,8,8,3,5,10,6,6,3,7,6,9 +Q,2,4,3,4,3,8,8,6,3,8,6,9,2,9,4,9 +L,3,7,4,5,1,0,0,6,6,0,1,5,0,8,0,8 +S,2,1,2,2,1,8,7,4,7,5,6,7,0,8,8,8 +U,3,2,4,3,2,8,9,5,7,5,9,8,3,9,1,8 +L,3,7,3,5,1,1,1,5,5,0,1,6,0,8,0,8 +J,2,3,3,2,1,8,6,3,6,14,6,10,0,7,0,8 +Y,4,6,7,8,1,6,10,3,2,8,13,8,1,11,0,8 +E,4,7,5,5,4,9,6,2,6,11,5,8,3,8,4,11 +W,3,7,5,5,3,10,8,4,1,7,8,8,8,9,0,8 +H,6,11,9,8,7,9,7,3,6,10,5,8,3,8,3,8 +H,2,1,3,2,2,7,8,6,6,7,6,8,3,8,3,8 +G,4,8,5,6,3,8,6,6,7,11,6,11,2,10,4,9 +M,3,6,4,4,2,8,7,11,1,7,9,8,7,5,0,8 +M,15,15,15,8,8,3,9,6,6,3,2,13,10,12,2,8 +Z,3,8,4,6,3,7,7,5,9,7,6,8,2,8,7,8 +D,2,4,4,2,2,8,7,4,6,10,5,6,2,8,3,8 +Q,5,10,7,9,3,8,5,9,8,6,4,8,3,8,4,8 +O,1,0,1,0,0,7,7,6,3,7,6,8,2,8,3,8 +B,5,10,8,8,12,8,8,5,3,7,7,7,8,11,12,9 +C,4,8,5,6,3,4,9,6,7,7,8,14,1,8,4,10 +I,4,7,5,5,3,8,4,2,6,7,7,7,1,10,4,7 +N,7,11,8,6,3,9,7,2,4,13,5,8,6,8,0,8 +Y,9,10,7,14,5,9,11,2,3,7,10,5,4,10,6,9 +G,3,4,4,3,2,7,6,6,5,6,6,9,2,9,4,9 +Q,4,9,4,5,3,10,5,4,6,11,4,8,3,8,8,12 +F,2,3,3,2,1,7,9,2,5,13,6,5,1,9,1,8 +V,7,13,6,7,3,7,11,5,5,8,11,5,4,11,4,8 +F,4,6,4,8,2,0,14,4,4,12,10,6,0,8,2,6 +X,2,1,2,1,0,7,7,4,4,7,6,8,2,8,4,8 +Y,1,0,2,1,0,7,9,1,2,6,12,8,1,10,0,8 +P,7,11,10,8,6,9,8,4,6,12,3,3,2,10,4,9 +L,3,9,4,7,2,0,2,4,6,1,0,8,0,8,0,8 +U,9,12,8,7,5,7,6,5,5,6,7,8,6,8,3,7 +N,11,13,9,7,4,5,9,5,6,3,3,12,6,12,2,7 +Y,3,8,4,6,2,8,10,1,3,7,12,8,1,11,0,8 +A,2,8,4,6,2,12,2,4,3,11,2,10,2,6,4,9 +Y,2,9,4,6,1,8,10,2,3,6,12,8,1,10,0,8 +H,3,3,3,4,1,7,9,14,1,7,4,8,3,8,0,8 +U,5,9,6,6,6,8,6,8,5,7,6,9,3,8,4,5 +S,3,5,4,7,2,9,9,6,10,5,6,5,0,7,9,7 +N,3,3,5,1,1,8,8,3,5,11,5,6,5,9,0,6 +Q,5,7,7,6,6,7,4,5,5,6,5,9,5,4,7,7 +Q,3,3,4,4,3,8,8,6,2,5,7,10,2,9,5,9 +I,1,1,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +H,3,5,6,4,3,9,6,3,6,10,3,7,4,7,4,9 +O,6,12,4,6,3,7,8,5,4,8,4,7,5,8,5,8 +T,2,3,3,2,1,6,11,2,7,10,9,5,1,10,2,5 +D,6,11,8,8,8,8,7,7,6,8,5,4,8,11,7,10 +W,5,10,7,8,4,6,8,4,2,7,8,8,9,9,0,8 +R,6,10,5,5,3,7,6,5,4,9,5,9,6,5,6,11 +Z,2,4,5,3,2,7,7,2,9,12,6,8,1,8,5,8 +U,2,6,2,4,1,7,6,12,4,7,13,8,3,9,0,8 +E,1,0,2,1,1,5,7,5,8,7,6,12,0,8,6,9 +H,5,10,7,7,9,8,7,4,3,6,7,8,8,8,8,8 +K,2,3,4,2,2,6,8,2,6,10,6,9,3,8,2,8 +G,1,3,2,1,1,6,7,5,4,9,7,10,2,8,4,9 +A,2,4,3,3,1,11,3,2,2,9,2,9,1,6,2,8 +Y,6,11,6,8,4,3,9,1,7,10,10,6,1,11,3,4 +N,3,8,4,6,3,8,8,6,5,6,6,5,6,9,2,5 +E,4,7,6,6,7,7,6,4,3,7,6,9,6,11,8,12 +I,5,13,4,7,2,9,7,5,4,12,3,6,3,8,5,10 +X,1,0,1,0,0,7,7,3,5,7,6,8,2,8,4,8 +N,7,9,6,5,3,8,10,5,4,4,6,10,6,11,3,7 +H,5,5,6,6,3,7,5,15,1,7,8,8,3,8,0,8 +E,3,5,5,3,3,7,8,2,8,11,7,9,2,9,4,8 +H,4,7,6,5,4,8,7,6,7,7,6,5,6,8,3,7 +D,5,10,5,5,4,9,6,3,6,10,4,7,5,8,7,7 +M,4,7,5,5,3,6,7,12,1,8,9,8,8,6,0,8 +J,1,3,2,2,1,11,6,2,5,11,4,8,0,7,0,7 +A,3,9,6,7,4,12,3,2,2,9,2,9,2,6,2,8 +C,8,14,6,8,3,6,9,6,9,11,8,10,2,8,5,8 +K,5,8,6,6,6,5,7,5,7,6,6,13,3,8,6,9 +C,4,9,5,6,3,6,7,6,8,6,5,12,1,8,4,9 +I,1,6,2,4,1,9,7,0,7,13,5,8,0,8,1,8 +Q,4,7,5,8,5,9,9,6,2,4,7,11,3,9,5,10 +H,4,8,5,6,4,7,8,6,6,7,6,7,3,8,3,7 +A,9,13,8,8,4,10,0,3,2,10,4,12,3,5,4,8 +M,1,0,2,0,1,7,6,9,0,7,8,8,5,6,0,8 +M,1,0,2,0,0,7,6,9,0,7,8,8,5,6,0,8 +Z,9,15,9,8,6,8,5,2,9,12,6,10,3,8,6,8 +H,4,10,5,7,3,7,8,15,1,7,5,8,3,8,0,8 +Q,3,6,4,8,4,7,9,5,3,8,9,10,3,8,6,8 +U,3,3,4,2,2,5,8,5,7,10,8,9,3,10,2,5 +C,4,7,4,5,3,4,7,5,6,11,9,14,1,9,3,9 +I,1,9,0,7,1,7,7,5,3,7,6,8,0,8,0,8 +X,1,3,2,1,1,8,7,3,8,7,6,8,2,8,5,8 +S,3,9,4,7,3,8,8,5,8,5,5,6,0,8,8,8 +T,5,10,7,8,7,9,11,4,6,5,11,8,3,12,1,8 +F,4,5,4,7,2,1,12,5,6,12,11,8,0,8,2,5 +A,2,9,4,6,2,7,4,3,2,6,1,8,2,7,2,8 +R,4,8,5,6,3,6,10,9,4,7,4,8,3,8,5,10 +G,4,7,5,5,3,6,7,6,7,10,7,11,2,9,4,9 +Y,6,6,5,8,4,9,8,4,4,5,11,5,4,11,5,6 +S,8,15,8,8,4,7,7,4,3,13,8,9,3,10,3,8 +R,4,9,6,7,8,7,9,3,5,5,6,9,5,8,8,7 +F,2,3,2,2,1,5,11,4,4,11,9,5,1,9,3,7 +L,2,7,4,5,5,8,8,3,4,6,6,9,5,11,6,5 +W,4,7,6,5,4,7,11,2,2,6,9,8,8,11,1,8 +W,5,9,5,4,3,6,9,1,3,8,9,7,7,12,1,6 +P,2,6,3,4,1,4,11,8,2,10,6,4,1,10,3,8 +H,5,9,6,7,7,7,7,6,6,7,6,8,3,8,3,8 +K,3,7,4,5,3,3,7,6,3,7,6,11,3,8,3,11 +L,2,7,3,5,1,0,1,5,6,0,0,7,0,8,0,8 +S,4,7,6,5,6,8,6,4,3,8,6,8,4,8,10,10 +D,5,9,7,6,6,9,7,3,6,11,5,6,4,7,4,8 +E,4,7,5,5,3,6,8,3,8,11,7,8,2,8,4,7 +S,2,6,3,4,2,8,8,7,5,7,5,6,2,8,8,8 +L,4,7,5,5,4,7,6,8,6,5,6,8,3,7,5,11 +Z,4,8,6,6,4,8,6,2,9,11,4,10,2,7,7,10 +Y,5,9,5,4,2,5,8,3,3,10,9,6,4,9,3,4 +M,3,7,4,5,4,7,6,5,4,7,7,11,6,5,1,10 +W,4,8,6,6,6,10,12,2,2,5,8,8,6,11,0,8 +D,3,8,4,6,2,5,6,10,8,5,5,5,3,8,4,8 +A,3,3,5,5,2,6,4,3,1,6,1,8,3,7,2,7 +Q,3,3,4,4,3,8,8,7,3,5,7,10,2,9,5,10 +Y,6,10,8,8,8,8,5,6,5,8,7,8,6,9,7,3 +X,3,5,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +V,4,7,6,5,6,8,5,4,2,7,7,8,7,8,5,8 +Y,3,3,5,4,1,8,11,2,2,5,12,8,1,10,0,8 +Q,5,9,6,8,3,8,5,9,7,5,4,8,3,8,4,8 +E,4,11,4,8,3,3,8,6,11,7,5,14,0,8,7,7 +U,5,4,5,7,2,7,4,15,6,7,14,8,3,9,0,8 +H,6,10,8,8,7,10,6,2,6,10,3,7,4,8,4,10 +G,3,4,4,3,2,6,7,5,5,9,8,9,2,9,4,9 +O,3,7,4,5,2,8,6,9,6,7,5,8,3,8,4,8 +N,4,9,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +V,1,0,2,0,0,8,9,3,1,6,12,8,2,11,0,8 +U,8,10,9,8,5,4,8,6,9,10,9,9,3,9,3,5 +I,3,8,4,6,2,5,9,0,7,13,7,7,0,8,1,7 +F,7,8,8,9,9,6,9,4,5,7,7,6,5,8,11,8 +V,3,4,4,3,1,5,12,2,2,9,11,7,3,12,1,7 +Y,4,8,6,6,5,9,5,7,5,6,9,7,3,9,9,4 +H,6,10,9,8,7,6,7,5,5,6,5,8,3,7,7,10 +L,4,11,5,8,4,7,4,0,7,9,3,10,1,6,3,8 +H,4,4,5,6,2,7,8,15,1,7,5,8,3,8,0,8 +X,4,4,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +B,2,6,4,4,3,7,7,7,6,7,6,6,2,8,7,9 +X,11,13,10,8,5,6,8,2,9,9,7,9,5,7,5,7 +H,4,4,6,3,3,9,7,3,6,10,3,7,3,7,3,9 +A,3,9,4,6,3,7,4,3,1,6,2,8,2,7,3,8 +N,5,8,6,6,4,6,9,6,5,8,7,9,6,9,1,7 +P,4,11,6,8,6,6,10,4,5,10,9,4,4,10,4,7 +Z,1,1,2,1,0,8,7,2,10,9,6,8,0,8,6,8 +V,4,7,6,5,6,7,6,4,2,8,8,8,5,10,4,7 +O,5,8,5,6,4,7,9,7,4,10,8,6,4,9,4,9 +J,2,5,4,3,1,9,6,3,6,14,5,10,1,6,1,7 +Q,4,5,5,6,5,8,4,7,4,6,5,8,3,8,4,9 +J,2,4,4,3,1,8,6,3,6,14,6,11,1,6,1,7 +Z,4,7,6,5,3,7,8,2,10,12,6,8,1,9,6,8 +M,6,9,8,7,8,8,7,2,4,9,7,8,8,6,2,8 +B,5,11,6,8,5,6,8,9,8,7,5,7,2,8,9,10 +U,3,6,5,4,3,7,9,6,6,5,9,9,3,9,1,8 +X,3,7,4,5,2,7,7,4,4,7,6,8,2,8,4,8 +L,4,11,4,8,3,0,2,4,6,1,0,7,0,8,0,8 +D,3,8,4,6,4,6,7,9,6,7,7,5,3,8,3,8 +Y,3,7,5,5,2,7,11,1,3,8,11,8,1,10,0,8 +B,4,8,6,7,7,8,7,5,5,7,6,8,6,9,8,4 +L,4,10,4,5,2,10,3,2,5,12,3,11,2,9,4,10 +S,4,4,4,6,2,8,8,5,9,5,6,6,0,8,9,7 +R,5,10,6,7,7,8,7,7,4,8,5,7,4,7,7,10 +O,3,8,5,6,3,7,8,9,5,7,7,6,3,8,3,8 +L,4,8,6,7,5,7,7,4,5,6,7,9,4,8,8,8 +Q,3,6,4,5,3,8,8,7,5,6,6,9,2,8,4,8 +Y,5,8,5,6,3,6,9,1,8,8,9,4,1,11,4,5 +Y,4,5,5,4,2,4,10,1,8,10,10,5,4,11,4,3 +B,1,0,1,0,1,7,8,6,4,7,6,7,1,8,6,9 +F,4,7,5,5,3,4,12,2,5,13,7,5,1,10,1,7 +L,6,12,6,6,4,9,4,3,4,12,7,11,3,10,5,11 +I,0,3,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +J,4,10,5,8,2,6,8,2,7,15,7,9,1,6,1,7 +R,2,3,4,2,2,8,8,3,5,10,4,7,2,7,3,9 +F,5,9,8,6,4,6,11,3,6,14,6,4,2,10,2,7 +X,4,7,6,5,3,5,8,1,8,10,10,9,2,9,3,6 +D,5,11,6,8,7,9,8,6,5,9,5,4,5,8,4,10 +G,4,6,5,4,3,7,7,8,7,6,6,11,2,9,4,9 +B,4,7,4,5,3,6,7,8,6,7,6,7,2,8,9,10 +T,7,9,7,7,5,5,12,4,6,11,9,4,2,12,2,4 +G,3,4,4,3,2,6,7,5,5,9,7,10,2,8,4,9 +X,4,11,5,8,2,7,7,4,4,7,6,8,3,8,4,8 +I,2,8,5,6,5,9,6,3,5,8,5,5,5,8,5,5 +P,5,10,5,7,3,5,9,10,5,8,6,5,2,9,4,8 +G,5,7,6,5,3,7,6,7,7,10,6,11,2,10,4,9 +D,4,10,5,8,6,7,7,6,6,6,5,5,3,8,3,7 +A,4,11,6,8,3,9,3,3,3,8,1,9,3,6,3,9 +J,3,6,2,9,2,9,8,3,3,12,4,5,2,8,5,10 +K,6,10,8,8,9,6,5,5,4,6,6,8,4,5,9,10 +E,4,7,6,5,6,8,8,3,5,5,7,10,5,12,8,9 +Z,6,9,8,7,4,8,6,3,11,12,5,10,1,8,6,8 +G,4,9,5,6,7,8,7,5,2,6,6,8,8,8,7,12 +T,3,5,4,3,2,5,12,2,8,11,9,4,1,10,2,5 +E,3,7,4,5,4,8,7,2,6,11,6,8,3,8,4,10 +M,3,4,6,3,3,7,6,3,4,9,7,8,7,5,1,8 +V,4,9,6,7,7,7,8,3,2,7,8,8,8,9,6,7 +O,2,1,2,1,1,7,7,6,4,7,5,8,2,8,2,7 +Y,7,10,7,8,4,2,10,2,6,10,12,7,2,11,2,6 +D,4,7,5,5,8,9,8,4,5,7,6,6,4,6,8,7 +V,4,5,5,3,2,4,12,2,3,9,11,7,4,10,1,7 +D,5,10,6,8,6,6,8,9,8,7,6,5,2,8,3,7 +S,3,5,5,3,2,8,7,3,8,11,5,7,1,9,4,8 +P,4,7,5,5,2,7,10,3,5,14,5,3,0,10,3,8 +K,2,1,2,2,0,4,7,8,1,7,6,11,3,8,2,11 +I,3,9,5,7,5,12,5,1,6,8,4,5,1,8,5,10 +I,6,14,6,8,3,8,7,2,5,13,4,5,2,8,6,10 +H,5,6,8,4,4,6,7,3,6,10,8,10,3,8,3,7 +O,2,3,3,2,1,8,7,6,4,9,6,8,2,8,2,8 +G,5,11,6,8,4,6,6,7,8,11,6,13,2,9,4,8 +O,3,9,4,7,4,7,7,8,4,7,6,9,3,8,3,8 +P,2,1,2,2,1,5,11,4,3,10,8,3,0,9,3,7 +Z,2,2,3,3,2,7,7,5,9,6,6,8,2,8,7,8 +E,5,8,7,7,7,7,9,5,5,7,7,10,5,9,9,10 +Q,3,7,4,5,4,8,5,7,3,6,7,8,3,7,6,9 +V,7,9,9,8,10,7,8,5,6,8,6,8,7,7,8,8 +X,4,5,5,4,3,8,7,3,9,6,6,8,2,8,6,9 +P,4,5,4,7,2,3,13,8,1,11,6,3,1,10,4,8 +E,3,6,4,4,4,8,7,6,2,7,6,11,3,8,7,10 +F,4,6,6,7,7,8,9,5,5,7,5,8,5,8,8,6 +L,3,7,3,5,1,0,0,6,6,0,1,5,0,8,0,8 +W,7,9,8,5,4,7,8,3,4,6,9,6,9,11,3,5 +I,1,1,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +E,3,7,5,5,5,5,7,3,6,7,6,12,2,10,8,6 +Y,4,8,5,6,2,5,10,2,2,8,12,8,2,11,0,8 +O,3,7,4,5,3,7,7,8,5,7,7,8,3,8,3,8 +X,5,8,8,6,4,5,8,2,8,11,10,10,3,8,3,6 +V,3,8,5,6,1,6,8,4,3,7,14,8,3,10,0,8 +W,4,7,6,5,9,8,7,5,2,7,7,8,10,10,3,8 +R,3,7,5,5,3,8,8,5,5,8,5,7,3,7,5,10 +J,2,3,4,2,1,9,6,3,5,14,6,10,0,7,0,8 +Y,6,8,6,6,3,4,10,1,8,11,10,6,2,11,4,3 +O,6,10,7,8,7,8,7,9,4,7,6,8,3,8,3,7 +P,2,1,2,3,2,5,9,4,4,9,8,5,1,10,3,7 +H,1,0,2,1,0,7,7,11,1,7,6,8,3,8,0,8 +U,9,10,9,8,4,3,8,6,8,12,11,10,3,9,2,6 +T,1,6,2,4,1,7,13,0,4,7,10,8,0,8,0,8 +Q,3,5,3,6,3,8,8,5,3,8,8,10,3,9,6,8 +R,3,4,5,3,3,8,8,3,5,9,4,7,2,6,4,10 +N,3,8,4,6,4,7,7,12,1,6,6,8,5,8,0,8 +U,5,6,6,6,6,8,6,5,4,6,6,8,4,8,1,7 +O,2,1,3,2,1,7,7,7,6,7,6,8,2,8,3,8 +E,2,4,4,3,2,6,8,2,8,11,7,9,2,8,4,8 +P,7,11,7,6,4,8,9,5,3,11,5,4,4,11,6,5 +L,4,8,6,6,7,8,7,3,5,7,7,9,7,9,6,6 +S,7,10,8,8,6,7,8,3,6,10,5,7,2,8,5,8 +Y,2,3,4,4,0,7,10,1,3,7,12,8,1,11,0,8 +W,6,10,8,8,9,7,7,6,2,7,8,8,6,8,4,8 +Y,1,1,3,2,1,5,10,1,6,9,11,9,1,11,2,8 +Y,3,5,5,7,1,7,10,1,3,7,12,8,1,11,0,8 +E,2,4,3,3,2,7,7,2,7,11,7,9,2,8,4,8 +F,4,10,6,7,3,4,13,4,4,13,8,3,1,10,2,5 +D,5,9,5,4,3,8,6,4,6,8,5,7,5,9,5,7 +E,2,3,2,2,2,7,7,5,7,7,6,9,2,8,5,10 +K,2,3,4,2,2,6,7,2,6,10,8,11,3,8,2,8 +F,2,4,3,3,2,5,10,4,5,10,9,5,1,10,3,6 +Z,4,4,5,6,2,7,7,4,15,9,6,8,0,8,8,8 +B,5,8,7,6,5,9,8,3,7,10,4,5,2,8,6,10 +T,4,10,6,8,8,8,7,5,6,7,6,8,7,6,7,7 +H,6,6,6,8,3,7,8,15,0,7,5,8,3,8,0,8 +H,3,8,4,6,4,7,7,13,1,7,6,8,3,8,0,8 +U,5,8,5,6,2,4,9,5,7,12,11,8,3,9,1,6 +P,7,8,9,10,11,8,10,2,4,7,9,6,6,9,7,5 +Y,4,4,6,6,7,9,4,5,3,7,7,8,5,9,4,8 +R,6,9,6,4,4,8,7,3,5,9,4,8,6,7,6,8 +J,3,11,4,9,4,10,7,1,7,11,3,7,0,7,1,7 +M,6,8,8,7,9,7,9,4,3,7,5,8,12,8,5,7 +J,3,8,5,6,2,7,8,1,6,14,5,8,1,7,0,7 +V,4,5,5,3,2,4,12,2,3,9,11,7,4,11,1,7 +B,1,3,3,2,2,8,8,2,5,10,6,6,2,8,4,8 +A,3,11,5,8,4,8,5,3,0,7,1,8,2,7,3,8 +B,3,7,5,5,7,9,8,4,3,6,7,7,5,11,7,7 +W,5,4,7,7,4,8,8,4,2,7,8,8,9,9,0,8 +U,3,2,4,3,2,6,8,6,7,7,9,9,3,9,1,8 +K,2,1,3,1,2,6,7,4,8,7,6,10,3,8,5,8 +E,3,8,5,6,5,7,7,4,8,7,7,8,3,8,5,10 +I,1,4,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +K,6,11,9,8,5,8,8,2,7,10,4,8,3,8,3,9 +A,4,10,7,8,5,12,3,2,2,9,2,9,2,6,2,8 +K,4,11,6,8,5,5,6,5,8,6,7,12,3,8,6,10 +U,4,5,5,7,2,7,5,14,5,7,14,8,3,9,0,8 +R,3,5,6,4,3,9,8,4,6,9,5,6,3,7,4,9 +E,3,9,4,6,4,7,7,6,9,7,7,9,3,8,6,9 +Y,6,7,6,5,4,5,9,1,8,9,9,5,2,9,4,4 +L,4,11,6,8,4,5,3,3,9,6,1,8,1,6,3,6 +R,5,5,6,8,4,5,10,9,3,7,5,8,3,8,6,11 +J,4,11,5,8,2,8,6,3,7,15,5,9,1,6,1,7 +V,2,7,4,5,2,7,11,2,3,6,11,9,2,10,1,8 +F,1,0,1,0,0,3,12,4,2,11,8,6,0,8,2,7 +K,2,4,4,3,2,7,7,2,6,10,5,9,4,7,2,8 +K,2,1,3,2,2,6,7,4,7,7,6,10,3,8,5,9 +M,5,8,7,6,6,8,6,6,5,7,7,8,8,5,2,8 +X,4,8,5,6,3,7,7,4,4,7,6,8,3,8,4,8 +Z,2,6,4,4,2,8,7,2,9,11,5,9,1,8,5,8 +H,7,10,10,7,8,7,8,2,6,10,7,8,5,9,4,8 +N,3,8,4,6,4,7,7,12,1,6,6,8,5,8,0,8 +U,9,13,8,7,4,7,5,6,7,3,9,7,5,9,3,6 +L,5,10,6,8,3,2,2,5,8,1,0,6,0,7,1,6 +U,6,6,6,4,3,3,9,5,7,10,10,10,3,9,2,6 +R,4,3,4,4,2,6,9,8,4,6,5,8,2,8,5,10 +B,5,9,8,8,10,7,7,5,4,7,6,8,7,10,9,5 +K,4,8,6,6,3,4,8,3,7,11,11,11,3,8,4,5 +U,4,7,5,5,2,7,4,13,5,7,15,8,3,9,0,8 +F,5,10,7,8,5,6,11,1,6,13,7,5,1,10,2,7 +F,2,5,4,4,2,4,12,4,4,13,8,5,1,10,1,7 +O,2,0,2,1,1,7,6,7,5,7,6,8,2,8,3,8 +L,6,8,7,7,6,8,6,4,5,7,7,8,3,8,8,10 +L,1,0,1,0,0,2,1,6,4,0,3,4,0,8,0,8 +W,6,9,6,6,6,5,10,3,3,9,7,7,6,11,2,7 +W,9,10,9,7,6,2,10,2,4,11,11,9,7,10,1,7 +Y,6,9,8,6,6,8,8,6,5,5,8,8,3,8,9,6 +L,3,5,5,5,4,8,5,5,5,7,7,8,2,8,8,11 +O,5,9,6,6,5,7,7,8,4,7,6,9,3,8,4,7 +G,7,10,5,5,4,7,6,3,2,8,6,8,4,9,9,8 +E,4,11,4,8,3,3,7,6,10,7,6,14,0,8,8,7 +F,3,8,6,6,6,8,7,1,4,10,6,7,5,9,4,5 +G,3,4,4,3,2,6,7,4,4,9,7,9,2,8,5,10 +P,2,4,4,3,2,7,9,4,3,11,4,4,1,10,2,8 +C,3,5,5,3,2,4,8,5,7,12,9,11,1,9,3,7 +V,6,9,5,7,4,3,11,2,2,9,10,8,3,11,1,7 +M,4,10,5,8,6,7,6,10,0,7,8,8,7,5,0,8 +V,2,3,3,2,1,7,12,2,2,7,11,8,2,10,1,8 +R,4,8,5,6,5,8,5,7,4,7,6,8,4,7,6,10 +B,4,7,6,5,4,9,6,4,6,10,5,6,2,8,6,10 +K,5,9,7,7,8,7,7,3,4,6,6,9,7,7,8,7 +H,7,11,7,6,5,7,7,3,4,9,8,8,7,10,6,8 +A,2,7,4,5,2,12,3,4,3,12,2,9,2,6,3,9 +G,6,11,8,8,5,5,7,5,5,5,7,7,3,6,4,7 +L,4,9,6,7,3,4,2,8,7,1,2,3,1,6,1,6 +R,2,6,2,4,2,5,10,7,3,7,4,9,2,6,5,11 +T,3,10,4,7,1,7,14,0,6,7,11,8,0,8,0,8 +C,2,1,3,2,1,7,8,7,6,9,7,11,1,9,3,10 +Y,6,9,6,7,4,3,9,1,6,10,11,7,1,11,3,5 +M,5,8,8,6,5,10,5,3,5,9,4,7,8,6,2,9 +K,2,1,2,2,1,6,7,4,8,7,6,11,3,8,5,9 +F,3,6,4,4,2,5,11,1,5,13,7,5,1,10,1,7 +C,1,1,2,1,0,6,7,6,9,7,6,15,0,8,4,10 +Q,1,0,1,0,0,8,7,6,2,6,6,9,2,8,2,8 +Q,7,13,6,7,5,11,4,4,6,11,4,8,4,8,8,11 +M,4,5,4,7,4,7,7,12,2,7,9,8,8,5,0,8 +F,8,12,7,6,4,8,8,2,5,10,5,6,3,8,7,8 +O,4,3,5,4,2,7,8,8,8,7,7,7,3,8,4,8 +X,4,8,6,6,3,9,7,1,8,10,3,7,2,8,3,8 +Z,3,7,5,5,2,8,7,2,10,11,5,9,1,8,6,9 +H,3,4,4,6,2,7,6,15,2,7,8,8,3,8,0,8 +C,6,9,5,4,3,8,7,4,3,9,8,10,4,8,7,11 +G,7,10,7,8,5,6,6,7,7,10,7,11,2,9,5,9 +W,5,7,7,5,3,7,8,4,1,6,8,8,8,9,0,8 +N,4,6,6,4,3,10,7,3,5,10,2,5,5,9,1,8 +G,4,10,6,8,3,7,6,8,8,6,6,9,2,8,6,11 +L,2,7,2,5,1,0,2,5,6,0,0,7,0,8,0,8 +X,4,8,5,6,4,7,7,3,8,5,6,8,3,8,6,8 +O,5,10,6,8,5,7,7,8,6,7,6,8,3,7,4,8 +L,2,0,2,1,0,2,0,6,4,0,3,4,0,8,0,8 +I,0,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +Q,3,3,4,5,4,8,7,7,3,6,5,9,3,8,5,9 +L,1,3,2,1,1,6,5,1,7,8,3,10,0,7,2,8 +U,5,11,7,9,5,6,8,5,7,6,8,9,3,9,1,8 +M,5,11,6,9,8,7,10,6,3,7,6,8,8,10,7,8 +P,9,13,9,7,6,8,9,4,4,12,4,4,5,10,6,6 +H,3,7,4,4,2,7,6,14,1,7,7,8,3,8,0,8 +A,1,0,2,0,0,8,3,2,0,7,2,8,2,6,1,8 +X,7,10,10,8,6,4,9,2,8,10,11,10,3,9,3,5 +A,2,4,4,3,2,7,2,2,1,6,2,8,2,7,3,6 +X,7,10,10,8,5,6,7,1,9,10,8,9,3,8,4,7 +B,4,9,5,7,4,6,8,9,7,7,5,7,2,8,9,10 +G,10,14,8,8,5,8,8,5,4,9,6,6,4,9,9,8 +H,4,6,6,4,6,8,8,4,3,6,6,7,7,9,7,8 +W,8,9,8,6,7,3,10,2,3,10,9,8,7,11,2,6 +P,8,11,8,6,5,9,8,4,4,12,4,4,5,10,6,7 +F,2,3,3,2,1,8,9,2,6,13,5,4,1,9,1,8 +L,2,0,2,1,0,2,1,6,5,0,2,4,0,8,0,8 +P,2,6,3,4,2,5,10,9,4,9,6,5,2,9,3,8 +B,4,11,4,8,4,6,7,10,7,7,6,7,2,8,9,10 +B,5,9,7,7,6,8,8,4,7,10,5,6,2,8,6,10 +Z,7,10,9,7,6,7,8,2,9,12,6,8,1,8,6,8 +C,2,3,2,2,1,5,8,5,6,11,9,11,1,9,3,8 +R,1,0,2,1,1,6,10,7,2,7,5,8,2,7,4,9 +I,1,3,2,2,0,7,7,1,7,13,6,8,0,8,1,8 +V,3,7,5,5,2,8,9,4,2,6,13,8,3,10,0,8 +H,7,10,7,5,5,6,8,4,5,9,9,9,7,11,6,7 +Z,2,1,3,2,2,7,7,5,9,6,6,8,1,8,7,8 +J,1,4,3,3,1,8,6,3,4,14,6,11,1,7,0,7 +U,2,3,3,2,1,7,8,6,6,7,9,8,3,10,1,8 +J,4,9,6,7,3,7,6,4,6,15,7,11,1,6,1,7 +L,4,9,4,7,2,0,1,4,6,1,0,7,0,8,0,8 +E,6,10,4,5,3,7,9,5,5,10,6,9,3,8,6,10 +U,3,5,4,3,2,4,8,5,7,10,9,9,3,9,2,6 +T,4,6,4,4,2,5,12,3,6,12,9,5,2,11,1,5 +M,8,11,12,8,8,5,7,3,5,10,10,10,12,6,4,8 +I,4,10,5,8,3,8,6,0,8,13,6,9,1,6,3,8 +A,3,3,5,4,2,8,2,2,2,6,2,8,2,7,2,7 +V,7,11,6,6,3,7,10,6,4,10,9,5,5,12,4,9 +J,2,5,4,4,2,8,6,3,5,14,6,11,1,6,1,7 +S,4,5,5,5,5,9,8,4,6,6,8,9,4,11,7,10 +T,3,10,5,7,2,9,13,0,6,6,10,8,0,8,0,8 +K,8,12,7,6,3,6,8,2,7,9,6,8,5,7,3,7 +Z,5,10,6,8,4,8,7,6,12,7,6,7,1,8,8,8 +T,7,9,8,8,9,7,9,5,8,7,7,8,5,10,11,7 +R,5,10,7,7,6,6,7,5,6,6,5,7,3,7,5,8 +W,4,9,6,7,5,9,10,2,2,5,9,7,8,12,1,7 +F,6,12,5,7,4,7,10,3,5,11,6,4,3,10,7,6 +L,4,9,4,7,1,0,1,6,6,0,0,6,0,8,0,8 +L,2,1,3,2,1,4,4,3,8,2,1,7,0,7,1,6 +H,6,10,9,8,7,9,7,7,7,7,6,5,3,8,3,6 +Y,4,11,5,8,2,6,10,1,3,7,12,8,1,11,0,8 +M,4,8,6,6,7,7,6,5,5,7,7,10,10,5,2,8 +M,7,9,10,7,8,6,7,3,5,9,8,9,10,7,3,8 +B,3,7,5,5,4,8,8,6,6,7,6,5,2,8,7,10 +I,3,9,4,7,2,7,9,0,8,14,6,5,0,9,2,7 +N,6,9,8,5,3,8,7,3,4,13,4,8,5,8,0,7 +Y,4,6,4,4,2,5,9,2,8,9,10,5,1,11,4,4 +K,5,9,6,7,2,4,7,9,2,7,6,12,4,8,3,11 +B,6,9,8,6,6,11,5,2,7,11,3,7,4,7,5,11 +T,2,4,3,3,1,5,13,3,6,11,9,4,1,11,1,5 +F,4,7,6,5,2,6,11,2,6,13,7,4,1,10,2,7 +Q,6,7,8,6,6,7,4,4,5,7,4,8,4,5,6,7 +A,7,11,7,6,4,10,1,4,2,11,6,14,4,5,5,11 +X,4,9,7,7,5,8,8,3,9,5,6,5,5,9,8,8 +D,6,9,6,4,3,8,5,4,5,9,4,7,4,7,5,10 +B,5,11,7,8,6,9,8,4,7,10,4,6,2,8,6,10 +L,4,9,5,8,5,8,7,3,6,6,7,9,3,8,7,8 +E,5,12,4,6,3,7,7,4,5,10,6,8,3,9,8,9 +B,2,7,3,5,2,6,7,9,6,7,6,7,2,8,8,9 +S,5,8,6,6,4,9,8,4,8,10,2,7,2,7,4,10 +R,2,4,4,3,2,8,7,3,4,9,4,7,2,7,3,10 +T,5,7,5,5,3,7,10,2,8,11,9,4,1,11,3,5 +R,2,4,3,3,3,7,8,5,5,7,5,7,2,6,4,8 +X,4,9,6,7,5,8,8,3,8,5,6,5,4,10,8,7 +B,1,3,3,2,2,8,7,2,4,10,5,7,2,8,3,9 +F,1,1,1,1,0,3,12,4,3,11,9,6,0,8,2,7 +P,5,4,6,6,7,8,8,3,3,6,8,7,5,10,5,5 +K,6,7,8,5,4,4,8,3,7,11,10,11,3,8,3,6 +B,5,8,7,6,5,10,6,3,7,10,4,7,2,8,5,11 +Q,5,11,5,6,4,9,5,4,7,11,4,8,3,8,8,11 +O,3,7,4,5,3,8,7,6,4,9,5,8,3,8,3,8 +K,4,5,4,7,2,3,8,8,2,7,4,11,4,8,3,10 +U,5,9,4,4,2,7,6,4,5,4,8,7,5,8,2,7 +K,5,10,7,7,6,10,6,1,6,10,3,8,6,8,5,12 +K,7,9,10,7,6,9,6,2,7,10,3,8,7,8,6,10 +G,2,1,3,1,1,6,7,5,5,6,6,9,2,9,4,8 +O,9,14,6,8,4,7,6,5,6,8,3,8,6,8,6,8 +U,5,10,7,8,4,6,9,6,7,7,10,10,3,9,1,8 +B,4,6,7,5,6,6,9,5,6,8,7,8,6,9,7,7 +X,4,9,7,6,4,11,6,1,8,10,1,6,2,8,3,10 +U,2,7,3,5,2,7,5,12,4,7,11,8,3,9,0,8 +L,5,10,6,8,3,4,4,2,11,3,1,8,0,7,2,5 +Y,3,6,5,4,2,7,10,2,7,6,12,9,2,11,2,8 +H,5,9,7,7,6,6,8,3,6,10,8,8,3,9,3,7 +J,2,8,3,6,2,8,7,2,6,11,5,9,1,6,2,5 +I,2,6,2,4,1,7,8,0,8,14,6,8,0,8,1,7 +H,4,7,5,5,4,8,8,6,7,6,5,9,3,8,3,8 +B,8,14,6,8,5,7,8,5,6,10,5,8,6,6,8,11 +T,4,9,6,7,3,6,12,3,8,8,12,8,1,11,1,7 +R,8,12,8,6,6,7,7,3,5,8,4,8,7,8,7,8 +D,3,4,4,3,2,7,7,6,7,7,6,5,2,8,3,7 +M,4,7,5,5,3,8,7,12,1,7,9,8,8,6,0,8 +X,2,1,2,1,0,8,7,4,4,7,6,8,3,8,4,8 +N,3,5,5,3,2,6,8,2,4,11,7,7,5,8,0,7 +E,5,10,4,5,2,6,9,5,7,10,7,9,1,9,7,8 +W,7,10,7,5,3,3,9,2,1,9,10,8,8,12,1,6 +A,3,11,6,8,4,11,4,2,3,9,2,9,3,7,3,8 +C,5,9,7,6,4,7,7,8,7,7,6,9,4,8,4,9 +I,2,8,2,6,2,7,7,0,7,7,6,8,0,8,3,8 +V,5,6,5,4,3,3,11,2,3,10,11,8,2,11,1,8 +X,7,9,8,8,9,8,8,2,5,7,6,7,4,7,8,8 +A,5,9,6,7,4,7,4,3,1,7,2,8,3,8,3,8 +X,3,4,5,3,2,10,7,2,8,11,3,7,2,8,3,9 +E,7,11,5,6,3,6,9,6,8,10,7,8,1,9,7,8 +B,2,6,3,4,3,7,6,8,5,6,7,7,2,9,7,9 +X,8,15,8,8,5,4,9,3,8,11,11,9,4,9,3,5 +T,5,7,7,6,7,7,8,4,8,7,7,8,3,9,8,7 +S,3,4,4,6,2,8,7,6,9,4,6,7,0,8,9,8 +S,2,4,4,3,2,8,7,2,6,10,5,7,1,9,5,8 +E,1,3,3,2,1,6,8,2,7,11,7,9,1,8,4,9 +B,5,9,7,6,6,7,8,6,6,9,7,5,3,7,8,7 +S,6,12,5,6,3,7,3,3,5,7,2,7,3,6,5,8 +M,4,5,7,3,4,9,6,3,5,9,4,7,10,6,2,8 +J,4,10,6,8,3,8,6,3,7,15,6,10,1,6,1,7 +S,6,11,6,6,3,6,8,5,3,13,9,8,3,10,3,8 +C,5,5,6,8,2,6,7,7,11,6,6,14,1,8,4,9 +P,8,11,7,6,4,6,11,4,5,13,6,3,4,9,6,5 +F,4,7,6,5,5,7,9,6,5,8,6,8,3,10,8,10 +W,4,5,7,4,4,7,11,3,2,6,9,8,8,11,1,8 +L,4,11,6,8,9,7,7,3,5,7,7,10,7,11,8,5 +K,2,1,2,2,1,5,7,8,1,7,6,11,3,8,2,11 +L,3,9,4,6,2,0,2,4,6,1,0,8,0,8,0,8 +U,4,6,5,4,4,8,6,7,5,7,6,9,3,8,4,6 +S,7,11,10,8,11,9,3,4,4,9,6,10,6,6,11,11 +X,4,8,6,6,4,8,8,3,8,6,5,6,4,9,7,8 +N,4,5,5,4,3,7,9,5,5,7,7,7,5,9,2,6 +P,4,7,4,4,2,4,12,8,2,10,6,4,1,10,4,8 +T,3,7,5,5,4,6,7,7,6,7,10,9,3,9,4,8 +T,2,6,3,4,2,7,12,2,7,7,11,8,1,11,1,8 +U,3,5,4,4,3,8,6,4,3,5,7,7,3,9,1,7 +B,8,11,6,6,4,9,6,6,6,11,4,9,6,6,6,10 +M,5,11,6,9,4,7,7,12,2,7,9,8,9,6,0,8 +J,5,11,7,9,4,9,7,2,6,14,3,7,0,7,0,7 +W,4,9,6,7,10,8,6,6,2,7,6,8,8,11,3,9 +Q,5,10,7,9,4,8,5,9,8,5,4,8,3,8,4,8 +W,6,9,9,7,6,8,8,4,1,7,9,8,7,11,0,8 +J,2,9,3,7,1,12,2,10,4,13,6,13,1,6,0,8 +D,5,10,5,5,4,7,7,4,6,8,5,7,5,10,6,6 +O,1,3,2,1,1,8,7,5,3,9,6,8,2,8,2,8 +Q,1,0,2,1,1,8,7,6,4,6,6,9,2,8,3,8 +H,7,10,7,5,3,8,7,4,4,9,7,7,6,10,5,9 +R,2,3,2,2,2,6,8,4,5,7,6,7,2,7,3,9 +T,5,9,6,6,5,6,7,7,7,7,8,8,3,11,6,9 +U,6,6,6,8,3,7,4,15,5,7,14,8,3,9,0,8 +K,3,2,4,4,3,5,7,4,7,6,6,10,3,8,5,9 +L,6,10,5,5,2,6,5,3,7,10,4,13,2,6,6,8 +G,5,9,6,7,3,6,7,7,7,10,8,10,2,9,4,9 +X,2,6,3,4,2,7,7,4,4,7,6,7,2,8,4,8 +Y,2,4,3,3,1,4,11,2,7,11,10,5,1,11,2,5 +I,3,11,3,8,4,7,7,0,8,7,6,8,0,8,3,8 +N,4,7,6,5,3,7,8,3,4,10,6,7,5,8,1,7 +Y,4,7,6,10,10,8,5,4,2,8,8,9,5,9,6,8 +M,2,1,3,1,2,6,6,6,4,7,7,10,6,5,2,9 +E,2,1,3,2,2,7,8,5,7,7,6,9,2,8,5,10 +M,4,4,6,3,3,7,6,3,4,9,7,8,7,5,2,8 +A,3,5,5,4,2,6,3,2,2,5,2,7,3,4,3,8 +R,5,9,7,7,4,10,7,3,6,11,2,6,3,7,4,10 +H,9,12,9,7,6,10,6,4,5,11,2,7,6,7,5,8 +I,1,6,0,8,1,7,7,4,4,7,6,8,0,8,0,8 +A,2,4,3,3,1,11,3,3,2,11,2,9,2,6,2,9 +Z,4,9,5,6,5,7,7,5,9,7,6,8,1,8,7,8 +S,4,9,5,6,5,7,6,7,6,6,8,10,2,11,9,7 +C,4,7,4,5,3,4,8,5,6,9,8,14,2,7,3,8 +R,6,11,9,8,7,9,8,4,7,9,3,8,4,5,4,11 +D,7,13,6,7,4,10,4,4,5,12,2,8,5,6,4,9 +L,4,10,4,8,1,0,1,6,6,0,0,6,0,8,0,8 +V,3,7,5,5,1,7,8,4,2,7,14,8,3,10,0,8 +P,8,9,6,4,3,9,7,5,5,13,3,5,5,9,4,8 +G,2,6,3,4,2,7,6,6,6,7,3,10,1,8,4,10 +H,5,10,5,7,3,7,10,15,2,7,3,8,3,8,0,8 +U,7,11,7,8,5,4,8,5,8,10,9,9,3,9,2,6 +Z,3,5,4,7,2,7,7,4,13,10,6,8,0,8,8,8 +S,5,11,6,9,6,8,7,8,5,7,6,7,2,8,9,8 +I,4,11,5,8,3,7,7,0,8,14,6,8,0,8,1,8 +C,6,11,8,8,6,7,6,9,6,8,6,11,4,9,4,8 +C,4,9,5,7,2,5,7,7,10,7,6,14,1,8,4,9 +X,3,6,5,4,3,8,7,4,9,6,6,6,3,8,6,7 +N,6,11,9,9,5,12,7,4,5,10,0,4,6,8,2,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +O,3,5,4,3,3,7,7,7,5,9,6,8,2,8,3,8 +O,4,6,5,5,4,7,6,4,4,6,3,6,2,7,4,7 +L,2,6,3,4,2,4,3,8,7,1,2,4,1,6,1,6 +V,4,5,5,3,2,4,13,4,3,11,11,6,3,10,1,8 +G,5,9,4,4,2,11,3,2,3,9,2,6,4,7,3,10 +B,3,6,5,5,5,6,8,6,4,7,6,8,6,9,7,8 +N,2,2,3,3,2,7,8,6,4,7,6,7,4,9,2,6 +S,6,13,6,7,3,7,6,3,4,13,7,9,3,9,3,8 +Z,4,6,6,4,4,9,9,5,4,7,5,7,3,8,9,5 +B,3,5,5,3,4,8,7,3,6,9,6,6,2,8,5,9 +I,2,7,3,5,3,9,6,1,4,8,5,5,3,8,5,7 +S,1,0,1,0,0,8,7,3,6,5,6,7,0,8,7,8 +D,7,11,7,6,4,10,4,5,6,12,3,9,5,6,5,10 +O,6,9,7,7,5,7,8,8,6,10,7,9,3,8,3,8 +E,1,0,1,1,1,5,8,5,8,7,6,12,0,8,6,9 +P,3,5,6,4,3,8,10,3,4,12,4,3,1,10,3,8 +U,6,9,7,7,4,4,8,6,8,10,10,9,3,9,2,5 +X,5,5,6,8,2,7,7,5,4,7,6,8,3,8,4,8 +A,3,8,5,6,3,12,2,3,2,11,2,9,2,6,3,9 +Q,5,8,5,9,7,8,7,7,3,8,6,9,3,9,6,7 +Q,2,0,2,1,1,8,7,7,4,6,6,8,2,8,3,8 +G,8,13,7,7,4,7,3,6,2,6,5,4,4,7,5,7 +L,5,9,7,7,4,5,4,2,9,6,2,8,1,6,3,6 +K,6,9,5,4,2,8,8,3,7,8,4,7,5,7,3,7 +X,4,4,6,3,3,7,7,1,8,11,7,9,2,8,3,8 +J,2,8,2,6,1,15,4,3,5,12,1,7,0,8,0,8 +E,2,2,3,3,2,7,8,5,7,7,6,9,2,8,5,10 +W,8,11,8,6,5,5,8,2,4,8,9,7,10,10,2,5 +P,4,9,6,7,3,6,13,5,2,12,5,1,1,10,3,8 +G,6,11,6,8,5,6,6,6,6,10,6,13,4,9,6,8 +N,4,5,5,4,5,7,8,4,3,6,5,8,6,8,4,7 +P,11,15,8,8,4,8,9,7,5,14,4,4,4,10,4,8 +X,3,4,5,3,2,9,6,1,8,10,4,8,2,8,3,9 +Q,4,5,5,6,4,7,9,5,3,7,9,11,3,9,6,8 +I,1,4,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +J,2,4,3,7,1,12,3,9,4,13,5,12,1,6,0,8 +B,5,4,5,6,4,6,7,9,7,7,6,7,2,8,9,10 +D,4,11,4,8,3,5,6,11,8,5,4,5,3,8,4,8 +B,6,11,8,8,8,7,8,6,4,7,5,6,5,7,7,8 +Z,2,1,2,1,1,7,7,5,8,6,6,8,1,8,6,8 +D,2,4,3,3,2,9,6,3,5,10,4,5,2,8,3,8 +B,5,11,7,8,8,8,8,8,6,7,5,5,4,6,9,12 +F,4,7,5,5,5,7,9,5,4,8,6,8,3,10,8,10 +C,3,5,4,4,2,4,8,5,7,11,9,12,1,9,3,7 +N,4,9,5,7,5,7,7,13,1,7,6,8,5,8,0,7 +G,8,10,6,5,3,8,5,4,4,9,4,6,4,7,5,8 +R,7,11,6,6,4,8,8,5,5,9,4,9,7,5,6,11 +W,4,8,6,6,5,6,10,2,2,7,9,8,7,10,1,8 +B,2,6,4,4,3,8,8,5,7,7,6,6,2,8,6,9 +I,1,9,2,7,3,8,7,0,7,7,6,7,0,8,2,7 +X,6,8,7,7,8,6,7,2,5,8,7,10,4,10,8,6 +C,2,2,3,4,2,6,8,7,7,8,8,14,1,9,4,10 +E,2,2,3,3,3,7,7,5,7,7,7,9,2,8,5,10 +X,4,4,6,3,3,6,7,1,8,10,8,8,2,8,3,7 +U,3,6,4,4,1,7,5,13,5,7,14,8,3,9,0,8 +L,1,3,3,2,1,6,5,2,9,7,2,10,0,7,2,8 +M,4,8,4,6,3,8,7,12,1,6,9,8,8,6,0,8 +R,2,6,4,4,4,8,7,3,4,7,6,8,6,8,6,7 +F,4,7,6,5,4,6,10,2,5,13,7,5,2,10,2,7 +Y,4,8,7,6,3,7,10,1,8,6,12,9,3,9,2,8 +G,4,10,5,8,3,7,6,8,8,6,5,10,2,8,6,11 +T,2,3,3,4,1,10,14,1,6,4,11,9,0,8,0,8 +I,1,7,0,5,0,7,7,5,3,7,6,8,0,8,0,8 +X,2,3,4,1,2,6,7,2,8,11,8,8,2,8,3,7 +T,2,8,3,6,1,7,13,0,6,7,11,8,0,8,0,8 +I,4,9,5,7,3,7,8,0,7,13,6,7,0,8,1,7 +T,7,13,6,8,4,7,8,2,7,12,6,7,3,8,5,5 +V,5,9,5,7,2,3,12,4,4,10,12,7,3,10,1,8 +D,6,9,6,5,3,8,6,5,6,10,4,6,4,7,6,10 +U,3,7,4,5,4,8,6,7,5,7,6,8,3,8,4,5 +N,3,6,3,4,3,7,7,11,1,6,6,7,5,9,0,8 +T,4,11,6,8,5,7,11,3,6,7,11,8,2,12,1,8 +D,2,4,3,3,2,9,7,4,5,9,4,5,2,8,2,8 +O,5,9,7,6,4,7,7,9,4,7,6,8,3,8,3,7 +K,8,10,8,5,5,8,7,4,6,11,2,8,6,5,4,8 +W,3,8,5,6,4,6,10,2,3,7,9,8,7,11,0,8 +Q,4,7,5,6,2,8,8,7,6,5,8,9,3,7,5,10 +W,3,4,5,3,3,7,11,2,2,6,9,8,6,11,0,8 +N,8,12,9,6,4,10,5,3,4,13,2,7,5,7,0,7 +C,2,1,2,1,1,6,7,6,10,7,6,14,0,8,4,9 +X,3,6,5,4,3,7,7,1,8,10,6,8,2,8,3,7 +B,3,10,4,8,6,6,7,8,5,7,6,7,2,8,7,9 +I,4,9,4,4,2,8,8,2,4,12,5,6,1,10,5,11 +K,5,10,8,8,9,6,6,4,4,6,5,9,8,7,8,8 +L,4,8,5,6,3,4,5,1,9,7,2,11,0,7,3,7 +V,3,9,4,7,3,9,9,3,1,6,12,8,3,10,1,8 +M,4,4,5,2,3,8,6,6,4,6,7,8,8,6,2,7 +V,5,10,5,8,4,3,11,2,3,9,11,8,2,11,1,8 +T,7,9,8,8,8,6,8,3,9,8,7,9,3,8,8,6 +C,2,5,3,3,1,4,8,4,7,11,9,12,1,9,2,7 +L,2,5,3,3,1,3,4,3,8,2,1,7,0,7,1,6 +G,4,5,5,4,3,7,6,6,6,6,6,10,2,9,4,8 +Z,7,7,5,11,4,7,8,5,3,11,7,7,2,9,10,6 +S,5,7,6,5,3,8,8,4,9,11,3,8,2,6,4,10 +V,5,9,5,7,3,4,12,1,2,8,10,7,3,10,1,7 +X,5,6,6,5,6,6,7,2,5,8,7,10,3,8,7,8 +Y,6,11,10,8,5,6,10,2,8,6,12,9,5,10,4,7 +V,3,7,5,5,3,8,12,2,3,5,10,9,4,12,3,7 +M,5,11,6,8,4,8,7,12,2,6,9,8,9,6,0,8 +T,3,11,5,8,1,8,15,0,6,7,11,8,0,8,0,8 +C,4,7,5,5,4,7,7,8,5,6,7,13,4,7,4,8 +B,5,10,7,8,7,9,7,3,5,9,5,6,2,8,5,9 +M,4,4,6,3,4,6,6,3,4,10,9,9,7,6,2,9 +N,6,9,8,6,6,6,7,8,6,7,5,7,3,8,3,9 +M,5,5,6,4,4,8,6,6,5,7,7,8,8,6,2,7 +N,7,9,10,6,5,4,10,3,4,10,9,9,7,7,2,7 +L,7,15,7,8,4,7,5,4,5,12,9,11,3,9,6,9 +J,5,6,6,7,5,7,7,4,7,7,6,7,3,8,8,8 +Z,3,7,4,5,2,7,7,4,13,9,6,8,0,8,8,8 +G,2,1,2,1,1,8,6,6,6,6,5,9,1,7,5,10 +E,7,10,5,5,4,7,8,4,4,10,5,9,3,8,9,11 +O,3,6,4,4,2,7,7,7,5,10,6,9,3,8,3,8 +Q,8,12,7,7,4,8,5,4,9,10,5,9,3,7,9,10 +V,7,10,6,6,3,9,9,6,4,6,10,6,6,12,3,8 +O,5,5,6,7,3,7,7,9,8,7,6,8,3,8,4,8 +Q,5,7,6,7,5,8,8,7,4,6,6,10,3,8,4,8 +P,9,11,7,6,3,8,9,6,4,12,3,5,5,10,4,8 +N,4,8,5,6,4,7,7,12,1,6,6,8,5,8,0,8 +Q,5,7,6,8,6,9,8,6,2,4,8,10,3,9,7,10 +P,6,9,5,4,2,6,10,5,3,11,5,5,5,9,4,8 +W,3,2,5,3,3,5,11,3,2,8,9,9,8,13,1,8 +B,4,7,5,5,4,9,7,5,8,7,6,5,2,8,6,9 +X,7,10,8,5,4,6,8,2,8,11,6,9,4,7,4,6 +O,4,7,5,5,3,7,7,7,6,7,6,7,2,8,3,8 +U,5,11,5,8,2,8,5,14,5,6,14,8,3,9,0,8 +L,4,10,5,7,3,5,3,7,7,2,2,4,1,6,1,5 +Y,2,6,3,4,0,9,10,2,2,6,12,8,1,11,0,8 +J,5,11,6,8,3,8,9,1,7,14,5,6,0,9,1,8 +H,7,9,10,6,8,11,6,3,7,10,2,6,5,7,4,10 +H,1,0,1,0,0,7,8,10,1,7,5,8,2,8,0,8 +I,2,4,3,3,1,7,6,0,7,13,7,10,0,8,1,8 +V,7,10,7,8,4,4,11,2,4,8,11,7,5,11,1,7 +S,6,9,5,5,2,8,3,4,4,7,2,7,3,6,5,8 +B,4,2,4,3,4,8,7,5,6,7,6,6,5,8,6,10 +P,3,6,5,8,7,8,9,5,0,8,7,6,5,10,5,8 +U,4,7,4,5,3,7,5,13,5,7,11,8,3,9,0,8 +V,3,6,5,4,2,7,12,2,3,6,11,8,2,10,1,8 +V,5,8,5,6,2,2,11,6,4,13,12,8,2,10,1,7 +V,5,10,5,8,3,3,11,2,3,9,11,8,3,11,1,7 +A,3,8,5,6,3,12,3,3,2,11,1,9,2,6,2,9 +Z,6,9,8,7,6,9,9,5,4,6,5,7,3,9,10,5 +D,7,14,7,8,4,10,4,5,5,13,3,10,5,7,4,9 +Z,5,7,4,10,4,6,9,5,3,12,7,6,3,9,10,6 +M,5,6,7,5,8,7,7,4,4,7,6,8,10,8,5,6 +O,7,10,5,5,3,7,8,5,5,9,5,6,4,9,5,8 +H,4,7,6,5,4,10,5,4,6,10,2,7,3,8,3,9 +X,5,6,7,8,2,7,7,5,4,7,6,8,3,8,4,8 +Y,7,9,8,6,5,5,9,1,8,9,10,5,3,11,4,4 +W,2,1,4,2,2,9,11,3,2,5,9,8,5,11,0,8 +N,4,6,5,4,3,8,7,8,6,7,4,5,3,7,3,7 +K,7,9,10,7,5,5,9,2,8,10,9,10,3,8,4,5 +T,3,10,4,7,1,7,14,0,6,7,11,8,0,8,0,8 +V,2,7,4,5,2,9,9,3,1,5,12,8,2,11,0,8 +Y,4,6,4,4,2,4,9,3,6,10,11,6,2,11,2,5 +Q,5,10,6,9,6,8,7,7,5,6,6,9,3,8,5,8 +V,4,6,4,4,2,3,12,4,3,10,11,7,2,10,1,8 +P,2,1,3,1,1,5,9,4,4,9,7,4,1,9,3,7 +F,4,7,6,5,3,6,10,1,6,13,7,5,1,10,2,7 +N,4,8,6,6,5,6,8,9,5,8,6,6,4,8,3,9 +A,4,9,6,7,4,12,3,3,2,10,1,9,2,7,3,8 +Q,6,11,6,6,4,9,5,4,6,10,5,8,3,9,8,10 +X,2,3,4,2,1,7,7,1,8,10,6,8,2,8,3,8 +Z,7,10,9,8,8,9,8,5,4,7,5,7,4,8,9,4 +P,6,10,6,7,3,5,10,10,6,8,5,5,2,10,4,8 +S,7,11,9,8,5,9,6,3,8,11,5,8,2,10,6,9 +S,6,11,6,6,3,6,8,5,3,13,9,8,3,10,3,8 +N,4,5,5,8,3,7,7,14,2,4,6,8,6,8,0,8 +B,4,6,5,4,4,8,8,4,6,10,5,6,3,8,6,10 +S,7,15,5,8,3,8,3,4,4,9,2,8,4,6,5,9 +K,7,11,10,9,7,6,7,2,7,10,7,10,4,8,4,7 +C,2,4,2,2,1,4,8,5,7,11,9,12,1,9,3,8 +C,4,8,5,6,3,5,8,7,8,9,8,14,1,9,4,9 +C,2,3,3,2,1,4,8,3,6,11,9,12,1,9,2,7 +J,4,10,5,8,3,11,4,5,5,15,3,9,0,7,0,8 +I,4,10,5,8,2,7,6,0,9,14,6,9,0,8,1,8 +C,4,8,5,6,2,6,7,7,10,8,6,13,1,9,4,8 +A,2,7,4,5,2,9,3,2,2,8,1,8,2,6,3,8 +C,6,8,7,6,4,5,8,6,7,12,8,10,3,12,3,6 +P,3,7,3,4,2,4,10,9,3,9,6,5,2,10,3,8 +J,3,4,4,5,3,8,8,4,5,7,6,8,3,8,8,9 +L,5,10,6,7,5,4,4,4,8,2,1,6,1,6,1,5 +K,4,7,6,5,4,4,7,2,6,10,9,11,3,8,3,8 +X,2,3,4,2,2,9,7,2,8,11,3,7,2,7,2,8 +G,1,3,2,2,1,6,7,5,5,9,7,10,2,8,4,10 +U,4,7,6,5,7,8,8,4,4,6,8,8,8,9,5,7 +F,3,7,4,4,1,2,12,5,6,12,10,8,0,8,2,6 +P,4,9,4,6,2,5,11,10,3,10,6,4,1,10,4,8 +V,3,7,5,5,2,9,9,4,1,6,12,8,3,9,1,7 +J,2,7,3,5,2,11,7,0,7,10,3,6,0,8,1,7 +I,3,8,4,6,2,6,8,0,8,14,7,8,0,8,1,7 +N,5,10,5,7,5,7,7,13,1,6,6,8,6,9,1,6 +Q,7,9,7,10,8,8,9,7,2,7,7,11,4,10,8,6 +U,5,11,6,8,2,8,5,14,5,6,14,9,3,9,0,8 +V,4,10,6,7,3,5,9,5,2,8,13,8,3,10,0,8 +G,2,7,3,5,2,7,7,7,5,6,6,9,2,8,5,11 +S,4,6,5,5,5,8,8,4,5,7,7,8,5,9,8,11 +S,6,11,9,8,12,7,5,3,3,8,5,8,4,8,15,8 +F,6,10,5,5,4,8,10,3,5,11,5,4,3,10,7,7 +X,5,10,7,8,4,7,7,1,8,10,6,8,3,8,4,7 +T,6,8,6,6,4,4,13,5,5,11,9,4,2,12,1,5 +T,6,10,6,8,4,5,12,4,6,12,9,4,2,12,2,4 +F,7,14,6,8,3,8,8,3,6,12,4,5,2,8,7,7 +U,3,7,5,5,2,7,8,6,7,6,10,9,3,9,1,7 +A,5,9,7,7,5,8,3,1,2,6,2,7,3,5,4,7 +U,3,7,3,5,1,7,6,13,5,8,13,8,3,9,0,8 +T,4,10,5,7,4,8,10,0,8,6,11,8,0,10,1,8 +R,4,4,4,5,3,5,12,8,4,7,3,9,3,7,6,11 +Q,6,12,6,6,4,10,5,4,6,11,4,8,3,8,8,11 +J,3,6,4,4,1,7,6,3,6,14,7,11,1,6,1,7 +Z,2,6,3,4,1,7,7,3,13,9,6,8,0,8,7,8 +X,4,8,5,7,6,7,8,1,5,7,6,7,3,5,8,7 +B,9,15,9,8,8,8,7,4,5,9,5,7,8,4,10,7 +P,6,7,8,9,10,9,9,3,3,6,9,6,6,10,7,4 +S,3,5,3,3,2,8,7,7,5,8,6,8,2,9,9,8 +I,1,6,0,4,0,7,7,5,3,7,6,8,0,8,0,8 +B,4,9,5,6,6,7,7,6,6,6,6,6,2,8,6,9 +U,7,8,7,6,3,3,10,6,7,13,12,9,3,9,1,7 +H,3,6,4,4,5,9,8,4,3,6,6,7,6,9,6,6 +W,6,7,6,5,5,5,11,3,2,9,8,7,6,12,2,6 +N,9,10,8,5,3,6,10,4,5,4,5,11,6,11,2,7 +C,4,5,6,7,2,5,6,6,11,7,5,12,1,9,4,8 +D,7,13,6,7,5,6,7,5,6,8,5,7,5,10,6,5 +U,6,10,8,8,5,6,9,5,7,6,9,10,6,10,1,7 +Y,5,6,4,9,3,7,8,3,2,7,10,5,4,10,5,6 +Q,4,8,5,9,6,7,8,6,3,8,9,9,4,10,6,7 +H,2,1,2,1,2,8,8,5,5,7,6,8,3,8,2,7 +X,3,8,5,6,4,7,7,3,8,5,6,10,3,7,6,8 +T,5,10,5,7,3,6,11,3,7,11,9,4,2,12,3,4 +N,2,1,3,2,2,7,8,5,4,7,7,6,5,9,2,6 +N,6,8,8,6,4,4,10,4,4,11,11,10,5,8,1,7 +K,12,15,11,8,5,4,8,4,7,10,10,11,6,9,3,6 +L,5,8,6,7,5,8,6,5,5,7,7,9,3,9,8,8 +M,7,9,10,7,7,8,6,3,5,9,7,8,8,5,2,8 +E,1,1,2,2,1,4,7,5,8,7,6,13,0,8,6,9 +K,4,5,7,3,4,3,8,3,7,11,10,11,3,8,3,6 +D,4,7,4,5,2,5,8,10,9,8,7,6,3,8,4,8 +N,6,10,8,7,5,6,10,2,4,9,7,7,5,9,1,8 +B,7,10,9,8,8,10,6,3,7,10,3,7,5,7,6,11 +J,1,3,2,2,1,11,6,1,6,11,3,7,0,7,0,8 +I,0,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +Y,8,10,6,14,5,9,8,4,3,5,11,5,5,10,7,7 +O,7,9,9,8,7,8,4,4,5,9,4,9,4,6,5,7 +C,3,4,4,3,2,6,8,8,8,8,7,12,2,9,4,10 +D,5,11,5,8,3,5,7,11,9,6,6,5,3,8,4,8 +L,2,5,4,4,2,7,4,1,8,8,2,10,0,7,2,8 +A,3,4,5,3,2,10,2,2,1,8,2,9,4,5,2,9 +V,3,4,4,3,2,5,12,2,2,9,10,7,2,11,1,8 +F,2,4,3,3,1,6,10,2,5,13,7,5,1,10,1,7 +X,3,5,5,5,4,8,8,2,5,8,6,8,3,8,7,8 +P,5,8,7,6,4,5,13,6,3,13,6,1,0,10,4,8 +L,3,7,3,5,1,0,1,6,6,0,0,6,0,8,0,8 +R,4,10,5,8,3,5,10,9,3,7,5,8,3,8,6,11 +R,1,0,1,0,0,6,9,7,3,7,4,8,2,6,4,10 +X,2,1,2,1,0,7,7,4,4,7,6,8,3,8,4,8 +G,9,13,8,8,4,8,3,4,3,8,4,5,4,7,5,9 +Q,1,2,2,3,2,8,8,5,2,8,6,8,2,9,2,8 +Z,2,5,4,4,2,7,8,2,9,11,6,8,1,8,6,8 +K,5,9,7,7,5,9,7,2,7,10,3,8,4,9,4,10 +T,5,8,6,7,5,5,7,3,8,8,7,10,3,4,8,5 +J,1,4,3,3,1,9,5,3,6,14,5,10,0,7,0,8 +U,3,8,5,6,3,4,10,7,6,10,10,9,3,9,1,8 +R,2,4,2,3,2,7,7,5,5,6,5,7,2,7,4,8 +Q,3,4,4,5,3,8,8,6,2,5,7,10,3,9,6,10 +O,4,5,6,8,3,6,6,9,8,6,5,6,3,8,4,8 +N,3,4,6,3,2,8,9,3,5,10,4,5,5,9,1,7 +F,5,10,5,7,2,1,12,5,5,12,11,8,0,8,2,5 +M,8,8,11,7,12,8,8,4,4,7,6,7,12,7,8,3 +V,2,7,4,5,2,7,11,3,4,7,11,8,2,10,1,8 +S,3,8,4,6,3,7,7,7,5,7,6,8,2,8,8,7 +C,4,6,5,4,2,4,8,6,9,10,10,12,1,8,3,7 +U,3,6,3,4,1,7,5,13,5,7,13,8,3,9,0,8 +M,6,7,9,6,10,7,6,4,4,7,6,8,12,9,5,5 +A,3,8,5,6,5,8,8,6,4,6,6,8,3,7,6,4 +N,3,5,5,3,2,6,9,2,4,10,7,7,5,8,1,8 +M,5,8,6,6,7,7,9,6,4,6,6,8,9,9,8,10 +S,3,7,4,5,3,7,7,5,7,5,6,10,0,9,8,7 +H,6,11,6,8,3,7,5,15,1,7,9,8,3,8,0,8 +V,4,7,4,5,2,2,12,3,3,11,11,8,2,10,1,8 +M,7,11,8,8,7,7,5,12,1,8,8,8,10,5,2,10 +R,7,13,7,7,6,5,9,3,5,7,4,9,6,7,6,6 +G,3,7,4,5,3,7,7,7,6,7,5,11,1,8,4,10 +O,2,3,3,2,1,8,7,6,4,9,6,9,2,8,3,8 +J,3,7,5,8,5,9,8,4,4,7,6,9,3,7,8,6 +F,4,9,6,7,7,7,9,1,5,9,6,5,3,9,4,3 +D,2,3,2,1,1,7,7,6,6,7,6,5,2,8,2,7 +X,2,3,4,2,2,7,7,3,9,6,6,8,2,8,5,8 +T,2,4,3,2,1,8,11,2,7,6,11,8,1,10,1,8 +M,5,7,5,5,4,7,5,11,0,8,8,8,8,5,1,10 +Q,6,10,8,7,7,8,5,7,4,5,7,10,6,6,8,9 +K,2,6,3,4,1,3,7,7,3,7,7,11,3,8,2,10 +M,5,7,7,6,7,5,8,5,3,6,5,8,9,7,5,7 +E,2,5,4,3,2,6,7,1,8,11,6,9,2,8,4,8 +F,4,8,5,6,5,7,9,6,4,8,5,8,3,11,9,10 +U,10,12,8,6,4,6,5,5,6,3,8,7,5,9,2,6 +H,6,8,9,6,5,8,7,3,6,10,5,7,3,8,3,7 +P,1,1,2,1,0,5,11,7,2,9,6,4,1,9,3,8 +L,9,13,7,7,4,9,2,4,4,12,5,13,2,7,6,9 +F,3,7,4,5,4,6,9,2,6,9,9,6,1,10,4,7 +M,6,11,8,6,5,10,3,4,2,10,2,9,9,1,1,8 +K,6,10,9,8,8,10,5,2,6,9,2,7,8,6,7,12 +W,3,4,4,3,2,5,10,3,2,9,8,7,6,11,1,6 +R,5,4,5,7,3,5,10,9,3,7,5,8,3,8,6,11 +J,1,3,2,2,1,11,6,2,6,11,3,7,0,7,0,8 +G,6,9,6,6,4,6,7,6,6,9,7,12,2,9,4,9 +Z,4,9,5,7,4,9,6,6,10,7,5,6,1,7,8,8 +O,3,2,4,3,3,7,7,7,5,7,6,8,2,8,3,8 +H,2,3,3,2,2,7,8,5,6,7,6,8,3,8,2,8 +W,6,8,6,6,4,5,11,3,3,9,8,7,7,11,2,6 +G,5,9,7,7,5,5,6,7,7,7,5,13,4,9,5,8 +T,3,2,4,4,2,7,12,3,6,7,11,8,2,11,1,7 +M,1,0,2,1,1,7,6,9,0,7,8,8,6,6,0,8 +K,2,3,4,1,2,4,8,2,6,10,10,11,2,8,2,6 +X,3,7,4,5,2,7,7,4,4,7,6,8,3,8,4,8 +P,10,15,8,8,4,7,9,6,3,11,4,5,5,9,4,7 +P,4,6,5,4,3,9,7,2,5,13,4,5,1,10,3,9 +Z,2,3,2,2,2,7,7,5,8,6,6,8,1,8,6,8 +J,2,2,3,4,1,10,6,2,7,12,4,9,1,6,1,7 +N,5,9,7,7,8,9,7,4,4,7,6,6,7,12,7,6 +G,3,4,4,3,2,6,7,5,5,9,7,10,2,8,4,10 +F,6,11,9,8,5,8,9,4,7,13,6,6,5,7,4,6 +M,7,10,10,8,7,5,6,3,5,9,9,9,8,5,2,8 +K,5,10,6,8,2,4,6,9,2,7,7,11,4,7,3,11 +Y,7,9,8,6,4,4,9,1,7,10,11,6,2,11,4,3 +T,5,10,5,5,2,5,11,2,7,12,8,5,2,9,4,3 +N,5,8,7,6,4,7,8,3,4,10,6,7,5,8,1,7 +X,5,11,8,8,4,11,5,2,8,10,0,7,3,8,4,10 +Y,8,6,6,9,4,7,8,4,3,6,11,5,4,11,6,6 +B,4,10,5,8,6,8,6,7,6,6,6,6,2,8,7,9 +V,5,7,7,5,7,6,7,4,2,9,7,8,7,10,5,7 +D,4,9,6,6,8,8,9,5,4,8,7,6,7,10,10,5 +Z,6,10,8,7,5,7,8,3,10,12,7,8,1,9,6,7 +H,5,5,7,7,6,7,5,4,2,7,5,6,5,8,8,8 +L,5,9,7,7,4,5,3,3,9,6,1,9,1,6,3,7 +P,4,9,5,6,2,4,14,8,1,11,6,3,1,10,4,8 +M,4,6,5,8,4,7,7,12,2,7,9,8,9,6,0,8 +X,2,2,3,3,2,8,7,3,8,6,6,8,2,8,5,9 +D,3,7,4,5,3,6,8,9,7,7,6,5,2,8,3,7 +I,2,5,3,4,1,7,7,0,8,13,6,8,0,8,1,8 +V,5,9,5,7,3,4,11,2,4,9,11,7,3,10,1,8 +U,3,8,4,6,2,7,5,14,5,7,13,8,3,9,0,8 +O,3,5,4,3,3,8,7,7,5,9,6,7,2,8,3,8 +H,4,8,4,5,2,7,7,15,1,7,6,8,3,8,0,8 +Y,8,10,8,7,3,4,10,2,8,11,11,5,1,11,3,3 +M,5,7,6,5,7,7,9,6,5,7,6,8,8,8,5,7 +X,6,9,8,8,9,7,7,2,5,7,6,8,4,8,8,8 +D,2,3,3,2,2,9,6,4,5,9,4,5,2,8,2,8 +F,5,11,5,8,2,1,13,5,4,12,11,7,0,8,2,5 +V,1,3,3,2,1,6,11,3,3,8,11,8,2,11,1,8 +J,2,6,3,4,1,12,2,9,4,13,5,13,1,6,0,8 +Y,3,9,4,7,2,6,10,1,3,8,12,8,1,11,0,8 +P,2,7,4,5,3,4,11,5,4,11,8,4,1,10,3,7 +P,7,14,7,8,5,8,9,4,4,12,5,4,4,11,6,6 +H,4,5,6,8,5,9,9,3,1,7,6,7,3,10,8,7 +Q,4,6,4,7,5,8,5,7,4,9,6,8,3,8,4,8 +V,6,11,6,8,3,4,11,3,4,9,11,7,2,10,1,8 +T,4,7,4,5,2,5,11,1,8,11,9,5,0,10,2,4 +K,7,11,10,8,6,4,9,2,8,10,10,10,3,8,4,6 +A,2,1,3,2,1,8,2,2,1,7,2,8,2,7,2,7 +H,7,9,10,7,8,6,8,2,6,10,8,8,4,10,4,7 +L,4,11,4,8,1,0,1,5,6,0,0,7,0,8,0,8 +G,2,3,4,2,2,7,7,6,5,6,6,9,2,9,4,9 +X,3,3,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +M,5,5,7,4,5,8,6,6,5,7,7,8,9,6,3,7 +V,6,9,8,7,9,7,5,5,3,8,7,9,8,9,6,9 +W,1,0,2,0,1,7,8,3,0,7,8,8,5,10,0,8 +Q,3,4,4,5,3,8,7,6,3,8,7,9,2,9,4,9 +O,2,1,2,2,1,8,7,7,5,7,6,8,2,8,3,8 +R,9,13,9,7,6,10,6,4,5,10,2,7,6,7,6,9 +V,5,7,5,5,2,2,11,4,3,11,12,8,2,10,0,8 +N,9,10,7,5,3,9,13,6,5,3,6,10,5,8,2,8 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +N,4,7,7,5,6,7,8,3,4,8,7,8,7,10,5,4 +M,7,11,10,8,11,7,7,5,5,6,7,9,8,6,2,8 +A,5,6,7,5,5,8,8,3,5,7,8,8,5,9,4,6 +B,4,9,6,6,6,8,7,4,5,9,6,6,3,9,5,8 +U,3,6,4,4,4,8,8,6,5,6,7,9,3,8,3,7 +K,2,4,3,3,2,5,7,4,6,6,6,11,3,8,4,10 +Q,1,0,2,1,0,8,7,6,3,6,6,9,2,8,3,8 +F,7,10,6,5,3,5,11,3,4,11,7,4,2,8,6,4 +Q,5,6,7,9,10,9,5,6,2,7,6,8,8,9,4,8 +B,1,0,2,0,1,7,8,6,4,7,6,7,1,8,6,8 +O,4,9,5,7,4,7,6,9,5,7,5,8,3,8,3,8 +S,3,8,4,6,3,8,8,7,7,8,5,6,2,8,9,8 +J,4,6,5,7,4,9,8,5,6,7,5,8,3,9,8,9 +Y,7,11,7,8,4,3,10,2,7,10,12,6,1,11,2,5 +F,5,10,6,8,7,7,6,6,4,8,6,8,6,10,7,11 +Z,5,7,4,10,4,9,5,5,5,11,5,7,3,9,8,10 +T,6,11,6,8,4,5,12,2,8,12,9,4,1,11,2,4 +P,4,6,6,4,4,8,5,7,5,6,5,7,3,8,4,9 +F,4,9,5,7,4,5,11,2,7,11,9,5,1,10,3,5 +Y,4,5,5,3,2,4,11,2,7,11,10,5,1,11,2,5 +F,2,1,3,2,2,6,10,4,5,10,9,5,1,9,3,7 +I,7,14,5,8,3,9,6,6,5,13,3,7,3,8,5,11 +L,3,6,4,4,2,9,3,2,6,9,2,10,1,5,3,9 +M,5,10,6,8,6,8,6,11,1,6,8,8,9,5,2,5 +K,5,11,6,8,5,4,6,7,3,7,7,12,4,8,3,11 +P,1,3,3,2,1,7,8,4,3,11,5,4,1,9,2,8 +Q,4,8,4,9,6,7,10,5,3,6,10,11,3,9,6,8 +Y,7,7,6,10,4,9,7,6,6,4,11,7,5,10,3,7 +V,7,10,7,8,4,4,11,2,4,9,11,7,4,9,1,7 +K,4,7,6,5,4,5,7,5,8,7,6,12,3,8,5,10 +V,4,8,6,6,3,7,11,3,4,6,12,9,2,10,1,8 +B,3,5,4,4,4,7,7,5,6,6,6,6,2,8,7,10 +E,4,10,6,8,8,7,7,3,5,6,7,10,5,10,8,8 +D,5,11,7,8,7,9,8,5,5,10,5,4,4,8,5,9 +M,4,4,8,3,4,7,6,3,4,9,8,9,8,6,2,8 +Y,4,10,6,7,1,7,12,2,3,8,12,8,1,10,0,8 +K,3,7,5,6,5,6,8,3,4,7,4,9,5,3,4,9 +K,3,1,4,1,2,6,7,4,7,7,6,11,2,8,4,10 +L,6,9,5,4,2,6,5,3,7,10,4,12,2,6,6,8 +Q,5,9,6,11,7,8,6,8,4,5,6,9,3,8,6,10 +G,2,0,2,1,1,8,6,5,5,6,5,9,1,8,5,10 +L,1,0,2,1,0,2,1,5,5,0,2,5,0,8,0,8 +Q,3,7,4,6,2,7,5,9,6,5,5,7,3,8,4,8 +M,5,6,6,8,4,8,7,13,2,6,9,8,9,6,0,8 +F,1,3,2,2,1,5,10,4,4,10,8,5,1,9,3,7 +G,5,10,6,7,5,7,7,7,7,6,5,10,1,7,5,11 +J,1,3,2,1,1,10,7,2,4,11,5,9,1,7,0,7 +D,5,8,8,6,6,10,7,4,6,10,3,5,3,8,3,8 +K,5,11,7,8,7,5,6,3,7,6,6,9,4,8,6,9 +V,2,6,4,4,2,7,11,3,3,7,11,8,2,10,1,8 +O,8,11,6,6,3,8,5,4,6,8,3,8,5,7,5,8 +O,4,6,5,4,3,8,7,7,5,10,6,8,3,8,3,8 +W,4,11,7,8,7,4,10,2,3,8,9,9,8,10,1,8 +O,4,6,4,4,3,8,7,7,6,9,5,7,3,8,3,8 +R,3,4,5,3,3,8,8,3,5,9,5,7,3,6,4,10 +O,3,5,4,3,2,8,7,7,4,9,6,8,2,8,3,8 +I,3,9,4,7,3,8,6,0,7,13,6,9,0,7,2,7 +C,4,7,5,5,3,5,8,7,7,8,8,14,1,10,4,10 +J,1,3,2,4,1,11,4,9,3,12,8,13,1,6,0,8 +A,4,10,5,8,4,6,5,3,1,6,1,8,2,7,2,7 +O,4,6,5,4,3,7,8,8,6,8,8,6,3,8,4,8 +D,4,7,6,6,5,5,7,7,7,7,6,7,4,6,5,6 +W,5,10,7,7,6,4,9,5,1,7,9,8,8,10,0,8 +H,1,0,2,0,0,7,8,11,1,7,6,8,2,8,0,8 +Y,2,1,2,1,0,7,9,2,2,6,12,8,1,10,0,8 +U,4,9,5,7,4,5,8,6,7,8,9,10,3,9,1,8 +F,1,0,1,0,0,3,11,4,3,11,9,7,0,8,2,8 +S,3,5,4,3,2,8,8,2,7,10,5,6,1,9,5,8 +G,7,10,8,8,5,5,7,6,6,9,8,9,2,9,5,9 +B,5,11,5,8,4,6,6,10,7,6,7,7,2,8,9,10 +B,6,10,8,7,6,11,5,3,7,11,3,7,3,8,6,12 +M,1,0,2,0,1,8,6,9,0,6,8,8,5,6,0,8 +O,5,9,6,7,5,8,8,8,4,7,7,8,3,8,3,7 +L,3,7,4,5,2,7,4,2,8,7,2,8,1,6,3,8 +M,4,7,6,5,5,7,7,2,4,9,7,9,7,6,2,8 +T,2,1,3,1,0,7,15,1,4,7,11,8,0,8,0,8 +X,8,13,9,7,5,6,8,2,8,11,7,9,4,8,4,6 +B,2,6,4,4,5,8,8,4,2,6,7,7,6,11,7,7 +G,4,7,6,5,7,8,6,4,2,7,6,9,6,8,7,13 +B,5,10,5,5,4,7,8,3,4,9,6,7,6,7,8,6 +H,7,13,8,7,6,8,8,3,5,10,4,8,6,6,5,8 +S,4,6,6,4,5,9,4,4,4,9,6,9,4,7,9,10 +C,7,11,7,8,4,5,8,6,8,12,8,13,3,10,4,6 +U,6,10,5,5,3,5,5,5,5,4,7,8,5,9,2,7 +X,5,8,8,6,4,9,7,1,8,10,4,7,3,9,4,9 +Q,3,6,4,5,2,8,7,8,6,6,5,9,3,8,4,8 +N,10,15,11,8,5,7,7,2,4,13,7,8,6,8,0,7 +E,4,7,5,5,4,8,7,2,7,11,6,8,3,9,4,9 +Z,3,9,4,6,2,7,7,4,13,10,6,8,0,8,8,8 +V,6,9,6,6,3,3,12,3,3,10,11,8,2,10,1,7 +Q,3,6,3,7,4,8,8,6,1,8,7,10,2,9,5,8 +G,6,8,8,7,9,8,7,6,3,7,7,8,7,11,7,9 +D,2,4,4,3,2,9,6,4,6,10,4,6,2,8,3,8 +L,3,9,4,7,1,0,1,6,6,0,0,6,0,8,0,8 +J,3,10,5,8,1,14,1,8,5,14,3,11,0,7,0,8 +I,0,8,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +W,5,9,8,6,7,8,11,2,2,6,8,8,8,14,1,7 +Q,2,3,3,4,3,8,9,5,1,5,7,10,2,9,5,10 +U,9,13,8,8,5,8,5,4,6,6,7,6,6,8,4,6 +O,5,9,5,7,4,7,7,8,5,10,6,7,3,8,4,8 +I,0,7,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +L,2,5,3,3,1,6,4,1,8,7,2,10,0,7,2,8 +X,4,5,7,4,3,6,8,1,9,10,8,8,2,8,3,7 +T,3,5,4,4,2,6,11,2,7,11,9,5,1,11,3,4 +L,5,11,7,8,5,10,4,1,8,10,2,10,0,6,3,10 +A,7,15,7,8,5,10,2,5,2,11,5,12,6,3,6,10 +K,8,15,9,9,6,6,8,3,6,10,9,10,6,11,4,8 +N,4,11,6,8,5,6,9,6,5,7,7,8,6,9,1,7 +E,3,8,5,6,5,7,8,5,8,6,5,9,3,8,5,9 +E,4,8,5,6,3,3,7,6,11,7,7,14,0,8,7,7 +B,4,6,5,4,5,8,6,7,6,6,6,5,3,9,7,9 +N,5,8,8,6,8,8,6,4,4,7,6,7,7,11,7,4 +A,3,8,5,6,3,9,3,1,2,7,2,8,2,6,2,7 +B,4,8,5,6,5,8,8,6,7,7,6,6,2,8,7,10 +W,5,8,8,6,3,4,8,5,2,7,9,8,8,9,0,8 +H,6,11,9,8,9,7,7,6,7,7,6,8,6,8,4,8 +V,2,2,4,3,2,7,12,2,2,6,11,9,2,11,0,7 +B,4,7,6,5,5,10,6,2,5,10,4,7,3,7,5,11 +Y,7,6,6,9,4,9,6,5,5,5,12,6,4,11,4,6 +W,3,6,5,4,7,9,7,5,1,7,6,8,7,10,2,7 +T,6,11,8,8,9,5,8,3,7,7,6,10,5,8,7,8 +G,2,1,3,2,1,7,7,6,5,6,6,10,2,8,4,10 +G,4,6,6,4,5,7,8,5,3,6,6,8,5,7,7,7 +Z,5,7,6,5,3,8,7,2,9,12,5,10,2,9,6,9 +V,4,10,6,8,2,8,8,4,3,6,14,8,3,9,0,8 +P,5,9,5,7,5,5,10,8,3,8,5,5,1,9,6,6 +A,4,11,5,8,4,8,5,3,0,7,1,8,2,6,3,8 +K,4,8,6,6,4,9,7,2,6,10,2,7,4,7,3,10 +B,7,12,6,6,6,8,7,4,5,9,6,8,6,8,8,8 +W,5,5,6,3,4,4,11,3,2,9,9,7,7,12,1,6 +T,2,3,3,5,1,9,14,0,6,5,11,8,0,8,0,8 +Q,2,3,3,4,2,7,8,4,2,8,9,10,2,9,4,8 +Q,4,6,4,8,4,7,9,4,4,8,10,11,3,9,6,8 +O,3,6,4,4,3,7,8,8,7,7,8,7,2,8,4,8 +J,2,8,2,6,1,14,3,5,4,13,3,10,0,7,0,8 +M,11,11,11,6,5,4,9,5,6,4,2,12,9,11,2,8 +S,2,1,2,2,1,8,7,4,7,5,6,7,0,8,8,8 +D,3,4,4,7,2,5,7,11,8,6,5,5,3,8,4,8 +R,4,7,4,5,2,6,10,9,4,7,4,8,3,7,6,11 +P,1,0,1,0,0,5,10,7,2,9,6,5,1,9,3,8 +U,2,1,2,1,0,8,6,11,4,7,12,8,3,10,0,8 +L,0,0,1,0,0,2,2,5,4,1,2,6,0,8,0,8 +Y,3,5,6,4,2,7,11,1,7,7,11,8,2,11,2,8 +H,5,10,7,8,7,8,8,7,6,7,6,7,3,8,3,7 +F,4,9,6,7,4,3,12,5,4,12,9,5,2,10,2,5 +N,3,4,5,3,2,7,9,2,5,10,6,6,5,9,1,7 +X,4,9,6,6,5,7,7,3,9,5,7,9,5,7,8,8 +R,4,11,5,8,3,6,9,11,5,7,5,8,3,8,5,10 +B,2,4,3,2,2,8,8,3,5,10,6,6,2,8,5,9 +L,3,7,4,5,2,0,1,4,5,1,1,7,0,8,0,8 +V,8,10,7,7,3,3,12,4,4,10,12,8,3,10,1,8 +D,1,0,2,1,1,6,7,8,6,6,6,6,2,8,3,8 +Z,5,8,7,10,7,10,5,4,4,8,3,6,3,5,8,8 +V,5,5,6,4,2,4,12,3,3,10,11,7,3,10,1,7 +A,5,9,7,8,6,6,8,2,4,7,7,9,8,7,4,8 +Q,2,2,2,3,1,7,8,5,1,7,8,10,2,9,4,8 +U,3,8,4,6,2,7,5,14,5,7,13,8,3,9,0,8 +Y,3,5,4,7,7,7,5,4,2,7,7,9,5,10,4,8 +L,2,5,3,4,1,4,3,4,7,2,2,5,0,7,0,6 +V,3,2,5,3,1,6,12,3,4,8,11,8,2,10,1,8 +R,5,10,5,8,6,6,8,9,5,6,5,7,2,8,5,11 +S,4,9,5,7,4,8,8,8,7,8,4,7,2,7,9,8 +Q,6,7,8,6,6,7,4,4,5,7,4,9,5,4,7,7 +A,4,8,6,6,3,9,2,2,2,7,1,8,2,7,3,7 +E,1,3,3,1,1,6,8,2,7,11,8,9,1,8,3,8 +P,6,10,6,7,3,4,14,8,1,11,6,3,1,10,4,8 +W,10,10,10,8,7,2,11,2,3,10,10,8,7,11,2,7 +S,3,4,4,6,2,8,7,6,9,5,6,8,0,8,9,8 +G,2,1,3,2,1,6,6,5,5,6,6,9,2,9,4,8 +U,3,4,3,3,2,5,8,5,7,10,9,8,3,9,2,6 +Q,5,5,6,7,3,8,7,8,6,6,6,9,3,8,5,9 +W,6,9,6,7,6,3,12,2,2,10,9,8,6,11,2,7 +L,4,9,5,7,3,3,3,7,8,1,0,5,1,6,1,6 +R,4,9,6,6,4,9,7,4,6,9,4,7,3,7,5,10 +C,4,7,5,5,5,5,7,3,5,7,6,10,5,10,3,8 +D,4,7,5,5,2,5,7,10,9,7,7,6,3,8,4,8 +M,4,9,6,7,7,7,7,5,5,6,7,8,8,7,3,7 +U,2,1,3,2,1,7,8,6,7,7,10,8,3,9,1,8 +H,5,7,6,5,5,7,10,8,6,8,6,7,3,7,3,9 +Q,4,10,5,9,5,8,7,7,5,6,8,8,3,7,6,11 +D,2,4,3,3,2,8,7,4,5,9,4,5,2,8,2,8 +J,4,8,5,6,3,7,7,3,6,15,6,9,1,6,1,7 +C,4,9,5,7,3,6,8,9,8,9,8,12,2,10,4,9 +O,4,8,5,6,5,7,8,8,5,7,8,8,3,8,3,8 +B,3,5,5,3,3,9,6,2,6,10,4,7,4,7,6,9 +Z,5,11,7,8,4,7,7,2,10,12,5,9,1,9,6,8 +T,6,11,6,6,3,6,10,2,7,12,7,6,2,9,5,4 +O,4,10,5,7,2,7,7,9,7,7,7,8,3,8,4,8 +I,1,3,2,2,1,7,7,1,7,13,6,8,0,8,1,8 +U,1,0,1,0,0,7,7,9,3,7,12,8,2,10,0,8 +I,1,9,1,7,2,8,7,0,8,7,6,7,0,8,3,7 +V,3,8,5,6,1,7,8,4,3,7,14,8,3,10,0,8 +U,2,3,3,2,1,8,8,5,6,6,9,8,3,10,1,8 +J,2,6,4,4,1,7,8,2,6,15,6,9,0,7,1,7 +B,4,6,6,4,5,8,8,6,4,6,5,6,4,8,6,5 +Y,4,5,6,7,1,7,10,2,2,7,13,8,2,11,0,8 +Y,8,11,8,8,4,3,11,2,9,12,11,5,0,10,2,4 +O,6,10,4,5,3,6,8,4,4,7,4,7,4,8,5,8 +X,3,10,4,7,2,7,7,4,4,7,6,8,3,8,4,8 +L,3,7,4,5,2,6,3,1,8,8,2,11,0,7,2,8 +Y,2,2,4,3,1,6,10,1,7,8,11,8,1,11,2,7 +W,4,8,6,6,6,7,6,6,2,7,7,8,6,8,4,10 +O,4,7,5,5,4,8,8,7,4,7,7,6,4,9,3,7 +H,3,6,4,4,3,7,6,12,1,7,8,8,3,9,0,8 +X,4,7,4,4,1,7,7,5,4,7,6,8,3,8,4,8 +T,2,3,3,1,1,6,12,3,6,11,9,5,1,11,2,5 +R,4,8,6,6,6,8,6,7,3,7,5,7,4,6,7,8 +W,5,8,8,6,3,9,8,5,2,7,8,8,9,9,0,8 +M,5,10,7,8,8,9,7,6,5,6,7,5,8,7,3,5 +P,2,3,4,1,1,7,9,4,3,11,4,4,1,9,2,8 +B,4,6,4,4,3,6,7,8,6,7,6,6,2,8,9,10 +T,4,7,4,5,3,4,12,5,4,11,9,5,2,12,1,5 +O,4,8,5,6,3,7,5,8,5,6,4,7,3,8,3,8 +K,8,13,8,7,5,9,6,3,6,10,1,7,6,5,4,8 +R,3,7,3,4,2,5,11,8,4,7,3,9,3,7,5,11 +P,5,6,6,4,5,7,6,6,4,7,6,8,3,8,7,10 +I,3,9,4,6,2,6,8,0,8,14,7,8,0,8,1,7 +F,5,9,4,5,2,7,9,3,5,12,6,5,2,8,6,6 +E,5,9,4,4,2,8,7,5,4,10,5,10,3,8,7,10 +E,5,8,6,6,5,8,7,6,3,7,6,10,4,8,8,9 +R,3,7,5,5,4,10,7,3,5,10,3,7,3,7,3,10 +N,4,2,4,3,3,7,8,5,5,7,7,6,6,9,3,6 +K,3,7,4,4,1,4,8,7,2,7,5,11,3,8,3,10 +R,4,6,6,4,6,8,8,4,4,6,7,8,6,10,7,6 +N,4,9,6,7,4,7,8,6,5,7,7,7,6,9,2,6 +B,2,1,2,1,1,7,7,7,5,6,5,7,1,8,7,10 +M,5,7,7,5,4,6,6,3,5,10,9,9,7,5,2,8 +L,4,10,5,8,3,4,4,1,9,6,1,10,0,7,2,7 +W,8,14,8,8,6,3,8,1,4,9,10,8,9,11,2,5 +O,2,3,2,2,1,8,7,6,3,9,6,8,2,8,3,8 +V,4,7,5,5,6,8,6,4,1,7,8,8,7,9,4,7 +S,4,9,6,7,7,8,6,5,4,8,6,9,5,7,13,9 +P,4,9,6,7,4,6,10,3,7,10,9,4,1,10,5,7 +J,2,8,3,6,1,11,3,10,3,13,7,13,1,6,0,8 +S,4,7,5,5,4,8,7,5,7,5,6,8,0,9,9,8 +T,3,6,5,6,4,6,7,3,8,8,6,9,3,7,7,6 +X,0,0,1,0,0,7,7,3,5,7,6,8,2,8,3,8 +M,2,1,2,2,1,7,6,10,0,7,8,8,6,6,0,8 +W,8,10,8,8,7,2,12,2,2,10,9,8,6,12,2,6 +E,1,0,1,1,1,5,7,5,7,7,6,12,0,8,6,9 +T,2,10,4,7,1,7,14,0,6,7,11,8,0,8,0,8 +R,1,0,1,0,0,6,8,6,3,7,5,7,2,7,3,10 +H,4,8,5,6,5,6,7,5,4,7,5,8,3,7,6,11 +T,3,6,4,4,2,10,11,2,8,5,11,9,1,11,1,9 +U,2,3,3,2,1,4,8,4,5,11,10,9,3,9,1,6 +D,7,12,6,6,4,10,4,3,6,10,2,7,4,7,4,12 +N,8,12,7,6,3,5,9,4,6,4,4,11,5,10,2,7 +V,3,7,5,5,2,8,9,4,1,6,12,8,2,10,0,8 +D,4,8,6,6,5,10,6,4,6,9,3,6,3,9,3,8 +Z,4,9,6,6,4,7,7,2,10,12,6,10,1,9,6,8 +E,3,2,4,4,3,7,7,6,8,7,7,9,2,8,6,9 +X,4,9,6,7,5,7,7,3,8,5,6,8,3,8,6,7 +A,5,7,8,6,6,9,7,3,5,6,8,6,4,10,4,5 +L,3,8,4,6,2,0,2,4,6,1,0,7,0,8,0,8 +G,5,7,6,5,3,6,7,6,6,10,8,8,2,9,5,9 +R,6,10,8,8,7,8,8,6,6,6,5,7,3,6,6,9 +A,4,11,7,9,4,11,3,2,3,9,2,9,5,5,3,9 +Y,6,9,8,7,6,8,7,6,5,5,9,8,3,9,8,5 +M,4,1,5,3,3,9,6,6,4,6,7,6,8,6,2,5 +T,4,9,5,6,3,5,13,6,4,11,9,4,3,12,2,4 +A,3,9,6,6,2,8,4,3,2,7,1,8,3,7,3,8 +R,3,6,5,4,4,9,7,3,5,10,3,7,3,7,3,10 +B,4,9,6,6,7,8,6,6,6,6,6,5,2,8,6,10 +M,5,6,6,8,4,8,7,12,2,6,9,8,8,6,0,8 +D,3,10,5,8,8,9,8,4,5,7,6,6,4,7,8,5 +F,3,4,4,6,1,1,13,5,3,12,10,6,0,8,2,6 +M,5,6,7,4,5,12,5,3,4,9,2,6,7,6,2,8 +C,4,9,5,6,3,6,9,7,8,13,8,7,2,11,3,7 +F,10,13,8,8,4,8,8,4,7,13,4,6,2,7,7,8 +R,4,8,7,7,8,9,8,4,4,7,4,7,6,7,6,4 +V,3,7,5,5,2,6,9,4,2,8,13,8,2,10,0,8 +X,5,9,7,7,3,7,8,1,9,10,6,8,3,8,4,7 +Z,4,9,6,7,4,8,5,2,9,11,4,10,2,7,7,9 +S,3,5,4,3,2,8,7,2,7,10,6,8,1,9,5,8 +Z,3,4,4,6,2,7,7,3,13,10,6,8,0,8,8,8 +E,4,10,6,7,5,10,6,1,7,11,4,8,3,8,4,11 +H,4,8,4,6,2,7,9,15,1,7,4,8,3,8,0,8 +E,1,1,1,1,1,4,7,5,8,7,6,13,0,8,6,9 +O,7,11,9,8,12,8,5,6,2,7,6,8,11,10,8,14 +S,1,0,1,0,0,8,7,4,6,5,6,7,0,8,7,8 +W,8,8,8,6,5,4,11,3,3,9,9,7,8,11,2,6 +R,3,6,4,4,4,6,8,8,4,7,6,8,2,7,5,11 +N,5,10,6,7,3,7,7,15,2,4,6,8,6,8,0,8 +C,1,1,2,1,0,6,7,6,9,7,6,14,0,8,4,10 +Q,4,10,6,8,6,8,6,7,4,5,7,11,6,7,8,8 +W,3,7,5,5,4,5,10,2,2,8,9,9,7,11,1,8 +Q,4,9,4,4,2,8,5,4,7,8,6,8,3,9,8,11 +B,7,11,9,8,8,10,6,3,6,10,3,7,5,7,6,11 +I,4,7,5,5,3,8,8,2,8,7,6,7,0,8,4,7 +G,6,9,5,4,3,7,8,6,6,10,5,6,4,7,5,7 +Q,5,8,5,10,7,8,8,6,2,7,8,11,3,9,6,8 +A,2,3,4,4,1,10,5,3,1,8,1,8,2,7,2,8 +I,9,14,6,8,3,10,4,5,5,13,3,8,3,7,5,10 +Z,4,9,5,7,2,7,7,4,15,9,6,8,0,8,8,8 +C,5,9,6,7,4,3,8,6,7,12,10,13,1,9,3,7 +V,2,7,4,5,2,8,11,2,2,5,10,8,2,11,0,9 +K,7,15,8,8,5,9,6,3,6,11,2,7,5,7,4,9 +K,4,9,5,7,4,3,7,7,3,7,6,11,3,8,3,11 +C,4,6,6,4,3,8,6,7,7,7,6,8,4,10,4,8 +G,3,9,5,6,4,6,6,6,6,6,6,9,2,9,4,8 +M,6,10,8,8,9,7,10,6,4,7,7,8,6,8,6,8 +F,4,9,6,6,3,3,12,5,4,13,9,5,1,10,2,5 +U,5,10,8,8,10,8,5,4,5,6,7,6,10,6,6,5 +U,2,3,2,1,1,7,8,6,7,8,9,7,3,10,1,8 +S,6,11,7,8,5,9,7,3,6,10,4,7,2,9,5,9 +J,4,7,5,5,2,5,9,3,5,15,8,10,1,6,1,7 +F,4,8,5,6,5,4,10,2,5,10,10,6,1,10,3,6 +T,4,6,4,4,3,6,11,3,7,11,9,4,2,12,3,5 +Q,6,10,5,5,4,9,6,4,6,11,5,7,4,7,9,10 +B,2,4,3,3,2,8,7,3,5,9,6,6,3,8,5,9 +R,4,9,5,6,4,9,8,6,6,8,5,7,3,8,5,10 +U,5,5,6,4,2,3,9,5,7,11,11,9,3,9,1,6 +W,8,10,8,8,6,2,11,2,3,10,10,8,7,11,1,7 +V,10,14,9,8,5,8,9,4,6,8,9,5,6,12,4,8 +A,3,6,6,8,2,9,4,3,2,8,1,8,3,7,2,8 +F,3,7,5,5,4,4,10,5,5,11,10,6,2,10,3,6 +U,5,8,6,6,3,7,8,6,8,5,9,9,3,9,1,8 +E,1,3,3,1,1,6,7,2,6,11,6,9,2,8,3,9 +F,3,4,4,3,2,5,11,4,6,11,9,5,1,10,3,6 +D,3,5,4,4,3,7,7,6,6,7,6,5,5,8,3,7 +Q,2,2,3,3,2,8,7,6,2,6,6,9,2,9,4,9 +F,5,9,5,5,2,8,8,2,7,11,6,6,2,10,5,8 +M,7,11,10,8,10,8,7,5,5,6,7,7,11,8,4,6 +I,2,10,2,8,3,7,7,0,7,7,6,8,0,8,3,8 +U,3,7,5,6,5,7,7,4,4,6,6,9,4,8,1,8 +P,4,9,5,6,5,6,9,7,4,9,7,4,2,10,4,7 +H,6,8,9,6,6,10,6,3,6,10,3,8,4,8,5,10 +U,4,7,6,5,4,8,8,8,5,6,7,10,3,8,4,6 +G,4,4,6,7,3,8,8,8,8,6,7,8,2,7,6,10 +W,2,0,3,1,1,7,8,4,0,7,8,8,7,9,0,8 +X,3,6,4,4,1,7,7,6,2,7,6,8,3,8,4,8 +C,4,7,6,5,3,7,7,7,6,7,6,8,4,9,4,8 +N,5,10,6,8,6,7,7,13,1,6,6,8,6,9,0,6 +W,8,11,8,8,9,4,10,2,3,9,8,7,9,13,3,5 +W,3,7,5,5,7,8,9,5,1,7,7,8,7,9,2,8 +P,5,6,7,8,8,8,6,4,3,7,7,7,7,12,6,7 +P,1,0,1,0,0,5,10,6,1,9,6,5,0,9,2,8 +K,3,4,4,3,3,5,7,4,7,7,6,11,3,8,5,9 +B,8,15,6,8,5,8,6,5,6,10,5,9,6,7,8,10 +C,3,2,4,3,2,6,8,8,7,8,7,12,2,9,4,10 +F,5,11,7,8,5,6,11,2,5,13,7,4,2,10,2,7 +J,4,5,5,6,4,8,9,4,4,7,6,8,3,7,7,7 +V,4,9,6,6,3,4,11,3,4,9,12,9,3,10,1,8 +O,4,8,4,6,3,8,5,8,5,9,4,8,3,8,3,8 +N,4,5,4,7,3,7,7,14,2,5,6,8,6,8,0,8 +W,6,10,8,8,9,7,9,6,4,9,9,7,8,8,5,12 +L,4,8,5,6,4,8,5,8,6,5,7,8,3,6,6,11 +O,2,4,3,3,2,7,7,6,3,9,6,8,2,8,2,8 +R,3,4,5,2,3,8,8,3,5,9,5,7,3,6,4,10 +R,5,8,8,7,8,8,7,3,3,7,5,8,7,9,6,5 +P,4,10,6,7,4,8,9,2,6,13,6,5,1,10,3,9 +D,5,10,6,8,6,6,8,9,7,7,7,5,3,6,5,9 +A,3,10,5,8,4,11,3,2,2,9,2,9,3,5,3,8 +A,3,8,6,6,4,11,2,2,2,9,2,9,3,5,3,8 +O,6,10,7,8,3,6,6,9,9,6,5,6,3,8,4,8 +V,4,10,7,7,2,7,8,4,3,7,14,8,3,9,0,8 +K,5,7,8,5,5,4,9,2,6,10,9,10,3,8,3,6 +O,2,3,3,2,1,8,7,6,3,9,6,8,2,8,2,8 +D,3,6,5,4,6,9,8,4,5,7,6,6,4,8,8,5 +I,1,3,2,2,1,7,8,1,7,13,6,8,0,8,1,7 +O,2,1,3,3,2,7,7,7,5,7,6,8,2,8,3,8 +P,3,2,4,4,3,6,9,5,5,9,7,3,1,10,4,6 +E,5,9,8,7,5,6,8,4,9,12,9,9,3,8,5,6 +O,4,9,5,7,3,8,6,9,8,7,4,9,3,8,4,8 +B,3,3,4,4,3,6,8,8,7,7,5,7,2,8,9,10 +M,4,7,5,5,3,7,7,12,1,7,9,8,8,6,0,8 +G,5,10,6,7,7,7,5,6,3,7,6,11,4,8,7,7 +C,7,10,8,8,4,2,9,5,9,11,11,13,1,7,3,6 +G,4,8,6,6,6,7,9,6,4,6,6,8,5,7,7,7 +N,1,0,1,0,0,7,7,10,0,5,6,8,4,8,0,8 +O,4,7,5,5,3,8,8,8,5,7,7,6,3,8,4,8 +V,2,3,4,5,1,9,8,4,2,6,13,8,3,10,0,8 +P,2,5,4,3,2,7,9,4,4,12,5,3,1,10,2,8 +T,7,12,6,7,3,6,10,3,6,12,8,6,2,9,4,5 +Y,4,5,6,8,9,7,5,4,3,8,8,9,5,10,6,10 +P,2,4,4,3,2,7,9,4,3,11,4,4,1,10,3,8 +F,4,7,6,5,3,8,9,3,6,13,5,5,2,10,3,8 +G,7,10,7,8,4,7,6,7,8,11,5,12,3,9,5,8 +Q,2,2,3,3,2,8,8,7,3,5,6,10,2,9,5,10 +O,3,7,4,5,3,9,6,7,5,10,4,9,3,8,3,8 +N,3,2,4,3,2,7,8,5,5,8,7,6,6,10,3,5 +R,7,11,9,8,6,9,7,5,7,8,4,6,3,7,6,11 +N,2,3,4,2,2,7,8,2,4,10,6,7,5,8,0,7 +I,1,3,2,2,0,7,7,1,7,13,6,8,0,8,1,8 +P,2,1,2,1,1,5,11,8,2,9,6,4,1,9,3,8 +W,5,5,8,7,4,11,8,5,2,6,9,8,8,9,0,8 +L,2,3,2,2,1,4,4,4,7,2,2,6,0,7,1,6 +S,4,5,5,4,5,8,8,4,4,7,7,8,5,10,9,10 +D,3,5,6,4,4,9,7,4,7,10,4,6,2,8,3,8 +Y,3,4,4,3,2,5,10,2,7,10,10,5,1,11,3,5 +Z,5,10,6,8,7,8,9,3,7,8,6,8,2,10,13,7 +M,3,3,5,2,3,8,6,6,4,7,7,8,7,5,2,7 +E,3,7,5,5,5,5,6,4,6,7,6,12,2,10,8,6 +N,6,11,8,8,9,6,7,3,4,8,8,9,8,9,7,5 +G,3,3,4,5,2,7,7,7,6,6,6,7,2,7,6,11 +N,5,9,7,6,6,7,7,6,6,7,5,8,6,7,3,7 +V,4,8,4,6,3,4,11,1,2,9,10,7,2,11,1,7 +Y,1,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +D,6,11,8,8,7,10,6,4,6,9,3,6,3,8,3,9 +C,4,10,5,7,2,5,7,7,10,7,6,14,1,8,4,9 +H,4,7,4,5,2,7,7,14,0,7,6,8,3,8,0,8 +L,4,7,5,5,2,5,4,2,9,6,2,9,1,6,2,7 +S,3,4,4,3,2,9,6,3,7,10,5,8,1,9,5,9 +Q,5,6,6,8,6,8,5,8,4,6,6,8,3,9,7,11 +F,6,11,8,8,5,8,9,3,6,13,5,4,2,9,3,7 +S,3,5,5,4,2,7,7,3,8,11,5,7,1,8,4,8 +Y,3,5,5,4,2,8,11,1,7,5,11,9,2,12,3,8 +K,2,3,2,1,2,6,7,4,6,6,6,10,3,8,4,9 +G,2,1,4,3,2,7,7,6,6,6,7,9,2,8,4,9 +L,6,11,8,8,5,7,5,0,8,9,3,11,2,6,4,7 +J,6,10,9,7,5,8,5,7,7,8,6,7,2,7,5,6 +R,3,9,4,6,3,5,11,8,4,7,4,9,3,7,6,11 +P,6,11,6,8,6,5,11,9,3,9,5,4,1,10,3,8 +N,7,10,10,8,5,9,9,3,6,10,3,4,6,9,1,7 +R,8,12,8,6,6,8,7,3,5,9,3,8,6,7,6,7 +A,1,3,2,2,1,10,3,2,1,9,2,9,1,6,1,8 +M,4,8,6,6,7,9,7,5,5,6,7,6,8,7,2,6 +Z,4,10,5,7,4,6,8,6,10,7,7,10,1,9,8,8 +R,6,9,6,4,4,5,8,3,5,7,4,10,4,7,5,7 +D,4,6,5,4,7,8,8,5,5,7,6,6,6,6,7,6 +A,2,7,4,4,2,7,4,3,2,6,1,8,3,6,2,7 +X,10,15,9,9,4,6,8,3,9,9,9,9,4,10,4,6 +I,1,3,1,1,0,8,7,1,7,13,6,8,0,8,0,8 +G,5,7,7,6,7,6,10,5,3,7,7,7,9,13,8,7 +Z,5,8,7,6,4,7,8,2,10,12,7,8,1,9,6,7 +O,5,6,7,5,5,7,5,4,4,9,4,9,3,7,6,6 +J,4,6,6,7,5,7,8,4,5,7,7,7,3,9,9,10 +V,4,11,6,8,4,6,11,2,3,6,11,9,2,10,1,8 +N,2,3,2,1,1,7,8,5,4,7,6,7,4,9,1,6 +A,3,5,5,4,2,9,2,1,2,8,2,9,2,6,2,8 +R,5,7,7,5,4,10,7,3,6,10,2,6,3,6,4,10 +H,3,6,5,4,4,7,8,3,6,10,5,8,3,8,3,9 +I,3,7,4,5,2,9,6,0,7,13,5,9,0,8,1,8 +V,2,1,3,1,1,9,12,3,2,5,11,8,2,11,0,8 +Q,2,2,3,3,2,8,6,6,3,6,6,9,2,9,4,9 +D,9,15,9,8,5,10,4,4,6,12,2,8,5,6,5,10 +P,1,1,1,1,0,5,11,7,1,10,6,4,1,9,3,8 +W,6,7,6,5,4,3,10,2,3,10,10,8,6,11,2,6 +S,5,8,6,6,3,6,8,4,8,11,6,7,2,8,5,6 +L,1,3,2,2,1,7,4,1,6,8,3,10,0,7,1,9 +A,5,8,8,7,7,7,8,2,4,7,8,9,8,6,4,8 +W,6,7,6,5,4,5,10,3,3,9,8,7,7,12,2,5 +L,3,5,4,3,2,4,4,4,8,2,1,5,1,7,1,6 +F,5,10,9,8,9,7,9,1,5,9,6,5,6,9,5,2 +D,3,5,5,3,3,7,7,6,7,7,6,5,2,8,3,7 +O,4,9,3,4,2,6,9,5,3,8,5,6,4,9,5,8 +R,1,3,2,1,1,8,8,4,4,9,5,7,2,6,4,9 +L,2,6,4,4,2,9,4,1,8,10,3,10,0,7,2,10 +U,4,8,5,6,3,5,8,6,7,9,7,9,3,9,3,5 +P,3,7,3,5,3,5,11,8,2,9,7,5,1,10,3,8 +U,11,15,10,9,5,9,7,6,6,2,10,6,6,7,3,6 +E,3,5,6,4,3,7,8,2,8,11,7,9,2,8,4,8 +Z,5,10,7,8,5,8,6,2,9,11,5,10,2,7,7,8 +L,3,7,4,5,5,7,8,3,5,5,7,10,4,11,5,6 +O,4,9,4,7,3,8,7,8,5,10,5,9,3,8,4,7 +S,3,9,4,7,4,7,7,5,7,5,6,8,1,8,9,7 +V,5,10,5,7,3,3,11,3,4,10,12,8,2,10,1,8 +T,7,10,6,5,3,8,9,2,7,11,7,7,2,9,4,6 +W,8,11,8,8,6,3,10,2,3,9,9,8,8,11,2,5 +L,4,10,5,8,3,5,4,3,8,5,1,7,1,6,3,6 +Y,5,7,7,11,10,10,9,4,2,5,8,9,4,11,10,12 +P,3,3,4,4,2,5,11,9,3,9,6,5,1,10,4,8 +C,2,6,3,4,2,6,8,8,8,8,8,14,1,9,4,9 +N,3,2,4,3,2,7,8,5,4,7,7,6,5,9,2,5 +Y,2,4,4,6,1,7,10,1,3,7,12,8,1,11,0,8 +K,9,14,8,8,4,8,8,3,7,9,7,7,6,10,4,7 +I,2,5,3,3,1,7,7,0,7,13,6,8,0,8,1,7 +A,3,9,5,6,4,8,2,1,2,6,2,7,3,6,4,7 +F,5,8,7,6,3,5,12,7,5,13,7,3,2,9,2,5 +V,10,14,9,8,5,9,7,4,5,6,8,6,7,12,3,8 +F,3,8,5,6,3,8,8,2,5,13,5,6,2,10,2,9 +H,3,8,5,6,7,8,6,4,3,7,6,7,6,7,8,9 +X,2,3,4,1,1,5,9,2,8,10,9,8,2,8,3,6 +A,2,1,3,1,0,7,4,2,0,7,1,8,2,6,1,7 +R,4,8,6,6,6,7,9,5,6,8,4,9,4,5,5,10 +P,5,9,6,6,3,5,12,9,2,10,6,4,1,10,4,8 +K,6,11,8,8,10,7,7,4,4,6,6,9,8,8,8,8 +C,3,9,4,7,3,5,8,9,8,9,8,11,2,10,4,10 +G,4,9,4,4,3,7,7,3,2,8,5,7,3,10,8,7 +X,2,7,3,4,1,7,7,4,4,7,6,8,3,8,4,8 +Q,6,11,5,6,3,10,4,5,6,12,3,10,3,7,7,12 +V,4,10,6,7,2,7,8,4,3,7,14,8,3,9,0,8 +J,5,9,6,10,6,8,8,4,6,6,7,7,3,9,9,8 +Z,3,4,5,3,2,8,6,2,9,12,5,9,1,8,5,9 +C,5,10,6,7,4,7,7,8,7,6,6,9,4,8,4,8 +R,4,9,6,7,7,6,8,5,6,7,5,7,3,7,5,9 +C,4,7,5,5,2,5,8,6,8,12,9,11,2,10,3,7 +W,7,11,10,9,15,8,8,6,2,7,7,8,14,10,5,8 +O,2,5,3,4,2,8,7,7,4,9,6,8,2,8,3,8 +Z,1,0,1,1,0,7,7,2,10,9,6,8,0,8,6,8 +A,3,8,5,6,2,11,2,4,3,11,2,10,2,6,3,8 +F,5,8,6,10,7,7,9,5,5,8,6,8,4,10,7,5 +V,10,14,8,8,4,8,10,6,5,6,10,5,6,13,4,7 +L,4,9,6,7,4,6,5,0,8,8,2,11,0,7,2,8 +N,6,11,8,8,7,7,7,8,5,7,6,7,6,7,3,9 +N,4,7,4,5,2,7,7,14,2,5,6,8,6,8,0,8 +T,3,4,4,3,1,5,13,3,6,12,9,4,1,11,1,5 +X,4,10,7,8,7,7,7,2,6,7,6,8,4,8,7,7 +X,6,10,7,5,3,5,8,2,7,11,8,8,4,9,3,6 +W,5,10,7,7,7,7,7,6,2,7,8,8,6,8,4,10 +N,7,11,6,6,3,8,11,5,6,4,5,9,5,8,2,7 +C,3,4,4,3,1,4,8,5,7,11,9,12,1,9,2,7 +K,3,5,5,3,3,6,7,4,7,7,6,11,3,8,5,9 +M,3,4,5,3,3,5,6,3,4,9,9,10,7,5,2,8 +F,3,4,5,3,2,8,9,2,7,13,5,5,2,9,3,8 +J,1,6,2,4,1,12,3,8,3,13,6,12,1,6,0,8 +W,6,10,9,8,6,10,8,5,1,5,9,7,10,12,2,5 +G,4,8,5,6,3,7,6,6,7,11,6,12,2,10,4,9 +P,3,1,4,2,2,5,10,4,4,10,8,4,1,10,3,7 +M,2,0,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +B,8,11,6,6,4,9,7,6,7,10,4,8,6,6,6,10 +R,6,11,6,8,4,6,10,10,4,7,4,8,3,7,6,10 +D,3,4,5,3,3,10,6,3,7,10,3,6,2,8,3,9 +Z,4,8,6,6,6,7,8,2,7,7,6,7,1,9,9,8 +X,4,5,5,7,2,7,7,5,4,7,6,8,3,8,4,8 +T,5,8,6,6,7,5,7,3,6,7,6,9,5,8,5,7 +G,2,4,3,3,2,6,7,5,5,9,7,10,2,8,4,10 +R,3,6,3,4,2,6,9,9,4,7,4,7,2,7,5,10 +J,3,8,5,6,2,10,6,2,7,14,4,8,0,7,0,8 +R,4,9,6,7,4,10,7,3,6,11,2,7,3,6,3,9 +C,4,8,5,6,3,5,7,6,8,7,6,12,1,8,4,9 +G,5,9,6,6,4,7,6,7,7,7,5,12,2,8,5,10 +E,2,6,3,4,2,3,7,5,9,7,6,14,0,8,6,9 +B,4,7,6,6,7,8,6,5,4,7,6,8,6,9,7,7 +X,4,5,6,4,3,7,7,1,9,10,6,8,2,8,3,7 +L,4,8,5,7,5,8,7,5,6,7,6,8,3,8,8,11 +D,2,4,4,2,2,9,7,4,6,10,4,5,2,8,3,8 +B,4,9,4,6,6,6,8,8,6,7,5,7,2,7,7,9 +L,6,10,8,8,7,6,6,6,6,6,5,8,6,7,4,10 +Z,3,7,4,5,3,7,7,3,11,8,6,8,0,8,7,8 +I,2,6,3,4,2,8,6,0,7,13,6,9,0,7,2,8 +I,1,1,0,2,0,7,7,1,7,7,6,8,0,8,2,8 +B,4,10,5,8,4,6,6,10,7,6,7,7,2,8,9,9 +J,3,10,5,8,4,12,6,2,7,11,2,6,0,7,1,8 +E,7,10,9,8,7,4,9,4,8,12,10,9,3,8,5,4 +M,2,1,3,2,2,8,6,6,3,6,7,7,6,5,1,7 +J,3,9,4,6,2,14,3,5,5,13,2,9,0,7,0,8 +I,1,5,2,3,1,7,7,0,7,13,6,8,0,8,1,7 +V,2,3,3,1,1,7,12,3,3,8,11,8,2,10,1,8 +N,3,4,3,3,2,7,8,5,4,7,6,6,5,9,2,6 +Y,4,7,6,5,5,8,5,6,4,6,9,8,3,8,8,4 +B,3,6,3,4,3,6,8,9,6,7,6,7,2,8,8,10 +U,1,0,2,0,0,7,6,10,4,7,12,8,2,10,0,8 +Y,3,4,5,5,1,6,10,3,1,8,13,8,1,11,0,8 +J,3,10,5,7,2,7,8,2,7,15,5,8,0,6,1,7 +F,6,9,8,7,7,7,9,5,5,8,6,7,6,10,8,11 +A,2,1,4,3,2,8,1,2,2,8,2,8,3,6,3,7 +P,2,4,3,3,2,5,10,4,4,10,8,3,1,10,3,6 +N,7,9,9,5,3,8,6,3,4,13,6,8,6,8,0,8 +O,3,6,5,4,3,8,8,8,4,7,6,5,3,8,3,7 +V,3,6,4,4,2,7,11,3,2,7,10,9,2,10,3,8 +G,3,4,4,3,2,6,6,6,6,6,6,10,2,9,3,9 +G,4,5,5,4,3,6,6,6,7,6,6,11,2,9,4,9 +N,5,9,7,7,5,7,9,6,5,7,6,7,6,9,2,6 +P,1,1,2,1,1,5,11,7,2,10,6,4,1,9,3,8 +W,5,9,6,4,4,7,9,2,3,7,8,6,8,11,2,7 +W,6,9,6,6,4,4,10,2,3,9,9,8,7,11,2,6 +K,7,11,10,8,6,4,8,3,7,11,10,12,4,8,4,6 +C,9,13,6,7,3,6,9,6,7,12,7,7,2,9,5,9 +Y,5,9,7,6,4,10,10,1,7,3,11,7,1,11,2,9 +N,2,2,3,3,2,7,8,5,4,7,6,6,5,9,2,5 +J,1,7,2,5,1,13,3,7,4,13,3,11,0,6,0,8 +S,3,5,3,3,2,8,7,7,5,7,6,7,2,9,9,8 +C,4,10,5,8,2,5,7,7,10,7,6,13,1,8,4,9 +H,4,5,7,4,4,7,7,3,6,10,6,8,3,8,3,7 +C,4,4,5,6,2,6,7,7,11,6,6,13,1,7,4,9 +L,1,0,2,1,0,2,1,6,5,0,2,5,0,8,0,8 +V,4,8,6,7,7,8,7,4,4,7,6,8,7,7,9,5 +T,5,11,6,8,5,9,12,4,6,6,11,8,3,12,1,8 +J,4,6,5,7,5,8,8,5,7,7,5,8,3,9,9,8 +H,1,0,2,0,0,7,6,11,1,7,7,8,2,8,0,8 +V,1,0,2,1,0,7,9,3,2,7,12,8,2,10,0,8 +S,6,9,7,6,3,9,6,4,8,11,3,8,2,8,5,11 +D,6,10,8,7,7,7,7,5,6,7,7,8,7,7,3,8 +B,2,3,3,2,2,8,7,2,5,11,5,7,2,8,2,9 +C,3,3,4,4,1,5,8,6,9,6,7,11,1,7,4,9 +M,2,1,2,1,1,8,6,10,0,6,9,8,6,6,0,8 +S,3,7,4,5,2,7,6,6,9,5,7,10,0,9,9,8 +F,5,7,6,8,7,7,9,5,5,8,6,7,4,9,9,7 +R,3,7,5,5,5,6,7,5,6,6,5,8,3,6,4,8 +W,6,7,6,5,6,7,10,4,3,8,6,6,9,11,4,6 +I,1,7,2,5,1,7,7,0,8,7,6,8,0,8,3,8 +X,4,10,6,8,6,7,7,2,6,7,6,8,3,9,6,8 +N,6,9,9,7,5,7,9,2,5,9,6,7,6,8,1,7 +W,4,7,6,5,6,7,7,6,2,7,8,8,6,8,4,8 +S,1,0,2,1,1,8,7,4,7,5,6,7,0,8,7,8 +P,4,7,5,5,4,6,9,6,5,9,7,4,2,10,3,7 +N,5,10,6,8,6,7,7,6,7,7,6,8,6,8,3,7 +M,1,0,2,0,1,7,6,9,0,7,8,8,6,6,0,8 +F,5,9,7,7,3,5,13,4,5,13,7,3,1,10,2,6 +Q,5,6,7,8,8,10,9,6,0,5,7,10,7,13,5,11 +X,4,2,5,4,3,7,7,3,9,6,6,7,2,8,6,7 +S,5,8,6,6,4,7,8,3,7,10,5,7,2,8,5,8 +V,2,1,3,2,1,7,12,2,2,7,11,8,2,11,0,8 +D,5,12,5,6,4,6,8,4,6,10,6,6,5,9,6,6 +U,5,7,5,5,2,4,9,5,7,11,11,9,3,9,1,6 +S,1,3,3,2,1,8,7,3,7,11,4,8,1,8,4,9 +Z,7,10,9,8,6,6,9,3,10,12,8,7,1,9,6,6 +D,6,10,6,8,3,5,8,10,10,8,7,6,3,8,4,8 +B,4,7,6,6,7,8,6,5,5,7,6,8,8,9,7,6 +Q,5,9,4,4,2,10,4,4,6,10,4,8,3,9,7,13 +Y,2,3,4,4,0,7,10,2,2,7,13,8,1,11,0,8 +D,4,7,5,5,4,7,7,6,8,7,6,5,3,8,3,7 +O,4,9,6,7,7,8,8,5,1,7,7,9,8,9,4,9 +D,2,3,3,2,2,9,6,4,6,10,4,6,2,8,2,9 +B,5,9,5,4,4,7,8,3,4,9,6,7,6,7,8,5 +Q,1,0,2,1,1,8,7,6,4,6,6,9,2,8,3,8 +H,6,7,8,5,4,7,6,3,7,10,7,9,3,8,3,7 +P,4,10,5,7,3,5,10,10,3,9,6,4,2,10,4,8 +T,2,1,2,2,1,8,11,3,5,7,10,7,2,11,1,7 +B,8,15,8,8,7,11,5,4,5,10,4,8,7,6,8,10 +D,5,9,5,7,5,5,7,9,7,6,4,5,3,9,4,9 +G,6,9,6,6,4,6,7,6,7,10,8,9,3,8,5,9 +E,5,10,3,5,2,6,8,5,7,10,6,10,1,9,7,9 +Z,7,8,5,11,4,7,6,6,5,10,7,7,3,9,9,7 +O,2,7,3,5,3,7,7,7,4,7,5,8,3,8,2,8 +X,6,11,9,8,6,4,9,1,8,10,11,10,3,9,3,5 +U,5,9,8,7,10,8,6,4,4,6,7,8,10,9,5,8 +M,4,2,5,3,4,6,6,6,5,7,7,10,8,6,2,8 +Y,3,5,5,3,2,4,11,3,6,12,10,5,1,11,2,5 +N,3,4,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +P,4,7,6,5,3,5,12,6,3,12,5,2,1,10,3,8 +W,4,10,7,8,6,7,10,2,3,6,9,8,8,11,1,8 +R,6,9,8,6,9,7,8,3,5,5,6,9,6,9,7,6 +N,4,8,6,6,3,4,9,4,4,10,10,9,5,8,1,7 +Z,5,10,5,5,3,11,4,3,7,11,4,9,2,9,4,11 +O,4,9,5,7,4,8,7,8,5,10,6,7,3,8,3,8 +A,4,10,6,8,4,9,2,2,3,8,2,8,3,6,4,7 +U,8,12,7,7,3,5,4,5,5,4,7,8,6,8,2,7 +N,5,11,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +E,3,7,4,5,2,3,7,6,10,7,6,14,0,8,7,7 +R,4,8,4,6,4,5,10,7,3,7,4,9,2,7,5,11 +L,6,11,8,8,6,5,4,2,8,6,1,9,1,6,3,7 +N,7,10,10,8,5,4,10,4,4,11,11,10,6,8,1,7 +D,4,9,6,6,5,6,7,8,7,7,7,5,3,8,3,8 +D,4,8,4,6,4,6,7,9,7,6,5,6,2,8,3,8 +L,2,7,2,5,1,0,1,5,6,0,0,7,0,8,0,8 +E,4,5,5,4,5,6,7,4,3,7,7,9,4,11,8,11 +C,4,10,5,8,3,6,7,10,8,10,8,11,2,12,4,9 +W,6,11,9,9,4,9,7,5,2,7,8,8,9,9,0,8 +U,3,7,4,5,3,8,5,11,4,8,12,7,3,9,0,8 +M,13,14,13,8,6,5,9,5,7,4,3,11,9,9,2,8 +C,5,12,4,7,4,9,6,4,2,9,8,11,4,9,7,13 +C,4,10,6,8,7,6,6,4,3,8,7,11,6,9,3,8 +R,6,11,8,8,8,7,9,6,5,8,6,8,5,8,7,12 +C,4,9,5,7,6,5,6,3,4,7,6,9,6,9,6,7 +M,7,9,10,7,12,10,7,4,5,9,4,6,10,6,5,5 +K,6,9,5,4,2,6,8,3,6,9,9,10,5,10,3,6 +C,3,4,4,3,1,5,9,5,7,11,9,12,1,9,3,7 +T,5,7,5,5,2,4,12,3,7,12,10,4,1,10,1,5 +O,5,5,7,8,3,7,5,9,9,6,4,7,3,8,4,8 +A,2,9,4,6,3,11,2,1,2,9,3,9,2,6,3,8 +R,4,10,6,7,6,8,8,5,5,9,5,7,4,7,5,10 +M,4,5,7,3,4,9,6,3,5,9,4,7,9,7,2,8 +A,4,10,7,7,2,5,5,3,1,5,1,7,3,7,2,7 +D,3,7,4,5,2,6,6,10,9,5,5,6,3,8,4,8 +Q,4,6,5,8,5,8,5,8,5,6,5,9,3,8,5,9 +O,3,5,4,3,2,8,7,7,4,9,6,8,2,8,3,8 +C,2,4,2,3,1,6,8,6,7,8,8,13,1,10,3,10 +M,7,7,10,6,11,9,7,5,5,7,6,7,11,9,7,3 +B,8,12,6,6,4,9,6,5,6,11,4,9,6,7,7,10 +I,5,10,7,8,4,8,4,2,6,7,7,7,1,10,4,7 +N,3,3,4,4,2,7,7,14,2,5,6,8,6,8,0,8 +F,3,11,4,8,2,0,11,4,6,11,11,9,0,8,2,6 +O,6,10,7,8,6,8,5,9,5,5,5,5,5,8,5,8 +O,6,9,6,7,4,7,8,8,5,10,7,8,3,8,3,8 +C,5,11,7,8,8,7,6,4,4,8,7,11,6,9,3,8 +X,2,3,3,4,1,7,7,4,4,7,6,8,3,8,4,8 +X,9,14,9,8,5,3,10,3,8,12,11,9,4,8,3,5 +T,6,8,6,6,4,6,11,4,6,11,9,5,3,12,2,4 +F,2,4,3,3,2,5,10,4,5,10,9,5,1,9,3,6 +C,5,11,6,8,4,5,7,6,9,8,4,11,1,10,5,10 +F,6,10,6,5,4,8,10,3,5,11,5,4,4,9,7,7 +C,4,6,5,4,3,4,8,5,7,9,9,14,1,8,3,8 +X,4,7,5,5,4,8,6,2,5,6,7,7,2,9,7,9 +T,4,11,6,8,2,7,15,1,6,8,11,7,0,8,0,8 +D,4,6,5,4,3,8,8,6,7,9,6,4,3,8,4,8 +E,3,6,4,4,2,4,8,6,10,7,5,13,0,8,7,8 +W,7,11,10,9,7,10,11,3,3,5,9,7,10,13,1,7 +A,3,2,5,3,2,6,2,2,2,5,2,8,2,6,2,6 +K,4,10,5,8,2,3,7,7,3,7,7,11,4,8,3,10 +N,3,6,4,4,3,7,9,6,4,7,6,7,5,9,1,7 +C,5,8,6,6,3,7,6,6,8,13,7,12,2,10,4,7 +Q,5,5,5,7,4,7,8,5,4,8,9,9,3,9,7,8 +S,4,9,6,7,8,7,6,3,2,7,5,7,3,7,12,2 +Q,4,10,5,9,3,8,6,9,7,5,5,8,3,8,4,8 +G,6,10,5,5,3,8,7,5,6,10,4,7,4,7,5,8 +Y,4,5,6,7,1,8,10,2,2,6,13,8,1,11,0,8 +Q,4,6,4,8,5,8,8,6,2,8,8,10,3,9,5,8 +I,6,10,7,8,4,8,4,1,6,7,7,8,1,10,4,8 +U,5,8,5,6,2,4,9,6,7,11,10,8,3,9,1,7 +V,7,15,6,8,3,7,11,5,5,9,10,5,5,12,4,8 +Y,2,1,3,2,1,7,10,1,7,7,11,8,1,11,1,8 +A,5,9,6,7,7,8,8,8,4,6,6,8,3,8,8,4 +B,3,4,4,3,3,8,7,5,6,7,6,6,2,8,6,10 +D,4,9,6,6,5,7,7,7,7,6,6,5,3,8,3,7 +H,3,5,5,3,3,8,6,2,6,10,5,8,3,7,3,8 +N,2,4,3,2,2,7,8,5,4,7,6,6,4,8,1,6 +V,7,8,7,6,4,4,12,1,2,9,10,7,6,11,2,7 +I,5,9,7,6,4,6,6,3,7,7,6,12,0,8,4,9 +S,5,11,6,8,4,6,8,4,8,11,7,7,2,9,5,6 +F,2,3,4,2,1,6,10,2,5,13,7,5,1,9,1,7 +P,6,9,5,5,2,7,8,5,3,12,4,5,5,9,4,8 +F,1,0,1,0,0,3,11,4,3,11,9,7,0,8,2,8 +Y,8,10,8,8,4,3,10,3,7,12,12,7,1,11,2,5 +W,7,10,10,8,7,5,8,4,1,7,9,8,8,10,0,7 +Z,6,10,8,7,6,7,7,2,9,12,6,9,1,9,6,8 +E,2,3,3,2,2,7,7,1,7,10,5,9,1,8,4,9 +P,2,5,4,3,2,8,9,4,4,11,4,3,1,10,2,8 +O,3,6,4,4,2,8,7,7,4,10,5,8,3,8,3,7 +O,4,8,4,6,4,7,7,7,4,10,6,8,3,8,3,6 +L,2,4,2,3,1,3,4,3,7,3,1,7,0,7,1,6 +R,1,0,2,1,1,6,9,7,3,7,5,7,2,7,4,10 +A,3,5,6,6,2,8,3,3,2,7,1,8,3,6,3,8 +L,4,10,4,8,1,0,1,5,6,0,0,6,0,8,0,8 +R,4,10,5,7,3,5,11,8,4,7,3,9,3,7,6,11 +J,5,9,6,6,2,9,4,3,9,15,4,11,0,7,0,8 +Y,6,11,8,8,8,8,4,6,5,8,7,8,9,7,6,5 +S,3,7,4,5,3,8,8,7,5,7,5,6,2,8,8,8 +Y,8,10,8,8,4,5,8,2,9,9,10,4,5,11,7,3 +D,1,1,2,2,1,6,7,8,6,6,6,6,2,8,3,8 +X,7,14,7,8,4,6,8,2,7,11,7,8,4,9,4,7 +R,4,9,6,7,5,8,8,6,6,8,5,7,3,8,6,10 +Q,2,4,3,5,2,8,8,6,2,7,8,10,2,9,5,9 +Z,2,3,3,2,2,7,8,5,9,6,6,9,1,8,7,8 +C,5,9,6,7,4,5,7,6,9,6,6,10,1,6,5,10 +T,2,6,3,4,1,6,14,0,5,8,10,7,0,8,0,8 +B,3,5,5,3,3,9,6,3,6,10,4,7,4,7,6,9 +A,6,9,8,8,7,7,7,2,4,7,8,10,8,7,4,8 +W,4,5,6,5,7,7,7,5,5,6,6,8,9,9,8,8 +C,3,8,4,6,2,6,8,8,7,9,8,14,2,9,4,10 +S,2,2,3,3,2,8,7,7,5,8,6,7,2,9,9,8 +C,5,7,7,6,6,5,7,4,4,7,6,11,4,9,7,9 +V,2,6,3,4,1,7,9,4,2,7,13,8,3,10,0,8 +Y,6,11,6,8,3,3,10,3,6,12,12,7,1,11,2,6 +N,2,3,3,1,1,7,9,5,5,8,7,6,5,9,1,6 +D,2,5,4,3,3,9,6,4,6,10,4,6,2,8,3,8 +Z,5,9,7,7,4,8,7,2,10,12,5,9,1,8,6,9 +Y,2,5,4,4,2,7,10,1,7,7,11,8,1,11,2,8 +O,2,6,3,4,2,8,7,8,5,7,7,9,3,8,3,8 +C,2,1,3,2,1,6,7,6,10,7,6,14,0,8,4,9 +H,2,4,4,2,2,9,7,3,5,10,4,7,3,8,2,9 +Z,6,7,4,10,4,8,6,4,4,11,6,7,2,10,9,8 +S,4,2,4,4,3,8,7,7,5,7,6,8,2,9,9,8 +T,3,5,4,4,2,6,12,2,7,8,11,7,1,11,1,7 +H,2,3,4,2,2,7,7,3,5,10,6,8,3,8,2,7 +V,3,2,5,3,2,7,12,2,3,6,11,9,3,11,1,7 +A,2,6,4,4,2,8,4,2,1,7,2,8,2,6,2,8 +J,1,3,2,2,0,9,6,2,5,14,6,10,0,7,0,7 +F,5,10,5,5,3,7,8,3,4,10,6,7,4,8,7,6 +P,6,9,8,7,6,8,9,4,4,12,5,4,1,10,3,8 +W,3,8,5,6,5,9,11,2,2,5,8,8,6,11,1,8 +U,4,4,5,3,2,4,8,5,7,11,10,9,3,9,1,7 +B,7,10,9,8,9,9,7,4,6,10,5,6,2,8,5,10 +V,4,4,6,7,1,8,8,4,3,6,14,8,3,9,0,8 +Q,2,4,3,4,3,8,8,6,3,8,6,9,2,9,4,9 +R,4,8,5,6,3,6,13,8,4,7,2,9,3,7,6,10 +F,5,9,6,7,6,6,10,6,5,8,5,8,3,10,8,10 +N,6,10,9,8,5,10,8,3,6,10,2,4,5,9,1,7 +L,3,7,5,5,2,3,3,6,8,1,0,6,0,7,1,6 +D,4,8,6,6,5,7,6,8,6,5,5,4,4,8,4,8 +A,5,11,8,9,5,12,3,3,3,10,1,9,3,7,4,9 +S,3,5,6,3,2,7,8,2,7,11,6,6,1,9,4,6 +N,2,3,4,2,2,6,8,3,3,10,7,8,4,8,0,7 +J,3,4,4,6,1,11,2,10,3,13,8,14,1,6,0,8 +Y,5,9,4,4,2,6,8,3,4,10,8,5,3,9,4,4 +X,4,10,7,7,4,9,7,0,8,9,5,7,2,8,3,8 +G,6,5,7,8,3,7,5,8,10,7,5,12,1,8,6,11 +W,4,2,6,4,4,8,11,2,2,6,9,8,7,11,1,8 +P,2,1,3,2,2,6,9,4,4,9,8,5,1,10,3,7 +H,2,4,3,3,2,6,7,5,6,7,6,8,6,8,3,8 +A,1,3,3,2,1,6,3,2,2,5,2,8,1,6,1,7 +O,4,6,4,4,3,8,6,8,6,9,4,7,3,8,3,8 +L,3,9,4,6,3,6,5,0,8,8,3,11,0,8,2,8 +O,6,8,8,7,6,7,5,5,5,8,4,7,3,7,5,7 +V,4,6,4,4,2,3,12,4,3,11,11,7,2,10,1,7 +M,5,6,8,4,5,7,6,2,5,9,7,8,8,6,2,8 +F,5,9,7,6,4,8,9,2,6,14,5,5,2,9,3,8 +Q,7,8,10,7,8,6,4,4,6,5,4,7,5,3,7,6 +Q,3,5,4,6,3,8,6,6,4,9,6,9,3,9,4,8 +L,4,9,5,8,5,6,8,4,6,7,6,9,3,9,9,10 +G,4,6,4,4,3,6,7,5,5,9,8,11,2,8,4,10 +C,5,6,6,5,5,5,8,3,5,7,6,10,3,10,8,7 +M,2,3,4,2,2,6,7,3,4,9,9,9,5,5,1,7 +D,4,8,6,6,8,9,9,4,4,8,7,5,4,9,8,6 +M,3,3,4,2,3,6,6,6,4,7,7,10,7,5,2,9 +H,5,10,8,8,10,7,6,6,4,7,5,8,9,6,10,10 +J,6,8,8,6,5,8,8,6,6,8,7,7,4,6,4,6 +L,3,6,4,5,4,9,7,4,6,6,6,9,2,8,7,10 +X,2,6,3,4,2,7,7,4,4,7,6,7,2,8,4,7 +G,7,10,7,8,5,6,8,6,6,10,8,9,3,7,6,9 +U,6,9,6,6,4,3,9,5,6,10,10,10,3,9,2,7 +Z,5,8,6,6,4,7,8,2,9,11,7,8,1,9,6,7 +L,2,5,3,4,2,7,4,1,7,8,2,9,0,7,2,8 +M,2,0,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +D,3,9,4,7,4,6,7,10,7,7,7,6,3,8,3,8 +S,4,9,4,4,2,7,4,2,4,7,2,7,2,7,5,8 +X,5,6,6,8,2,7,7,5,4,7,6,8,3,8,4,8 +F,5,9,6,6,6,5,9,4,6,10,10,6,2,9,3,6 +S,4,9,4,4,2,7,4,4,4,8,2,8,3,7,5,8 +H,2,3,4,2,2,7,7,3,6,10,6,8,3,8,2,7 +Z,4,8,5,6,2,7,7,4,15,9,6,8,0,8,8,8 +P,8,13,7,7,3,6,10,5,3,13,5,4,4,10,4,8 +T,5,6,6,5,5,6,7,3,8,7,6,10,3,6,7,6 +A,1,3,2,2,1,10,2,2,1,9,2,9,1,6,2,8 +C,5,9,4,5,1,6,8,6,7,11,7,9,2,9,5,9 +S,3,3,4,4,2,8,9,5,9,5,6,6,0,8,9,7 +V,5,10,7,8,4,7,12,2,3,6,11,9,4,10,3,7 +T,5,8,5,6,3,4,13,5,5,12,9,4,2,12,1,5 +U,9,14,8,8,4,7,6,4,5,4,8,5,7,5,3,6 +C,2,1,2,2,1,6,8,7,7,8,7,13,1,8,4,10 +I,4,9,5,7,3,9,6,0,7,13,5,8,0,8,1,8 +I,0,3,1,2,1,7,7,1,6,7,6,8,0,8,2,8 +Y,7,11,7,8,5,5,8,0,8,9,9,5,4,10,7,4 +J,0,0,1,1,0,12,4,4,3,12,4,10,0,7,0,8 +P,9,14,9,8,6,9,7,4,5,13,4,4,5,9,7,8 +W,3,1,3,2,1,7,8,4,1,7,8,8,7,10,0,8 +W,5,7,5,5,4,4,10,3,2,9,8,7,6,11,2,6 +B,2,1,3,2,2,7,7,4,5,6,6,5,2,8,5,9 +P,6,12,5,6,4,9,8,4,4,12,4,4,4,11,5,7 +W,4,6,5,4,2,11,8,5,1,6,9,8,8,10,0,8 +U,5,10,8,8,10,8,8,4,5,6,6,8,9,5,8,10 +X,3,7,5,5,4,7,7,2,6,7,5,8,3,6,5,8 +R,5,9,5,4,4,8,7,3,4,9,4,8,5,8,6,8 +X,3,7,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +Q,5,8,6,7,6,7,4,5,4,7,4,9,5,4,7,6 +G,8,15,6,8,5,9,5,5,3,9,6,9,5,9,8,8 +Y,2,7,4,4,1,10,10,3,2,5,13,8,2,11,0,8 +J,2,7,2,5,2,9,6,1,6,11,4,8,0,7,1,6 +A,5,13,5,7,4,11,2,4,2,11,4,11,5,3,4,10 +M,3,3,4,2,3,8,6,7,4,7,7,8,7,5,1,8 +E,6,9,8,7,7,8,8,7,3,6,6,11,6,8,9,8 +L,4,8,5,7,5,8,6,4,5,6,7,8,3,9,7,9 +H,6,11,8,8,8,6,8,8,4,7,5,7,3,7,7,10 +K,4,5,6,4,3,6,8,2,7,10,6,9,4,9,3,7 +V,3,3,4,2,1,4,13,3,2,10,11,7,2,11,1,8 +M,5,10,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +I,3,11,5,8,6,9,6,3,4,8,5,5,5,8,5,5 +W,2,0,2,1,1,7,8,3,0,7,8,8,6,9,0,8 +S,5,8,7,6,8,8,6,5,3,8,5,8,4,9,10,9 +L,4,8,5,7,5,7,6,4,5,7,7,8,4,9,9,11 +Y,2,1,3,1,0,8,11,3,1,6,12,8,1,11,0,8 +O,5,10,4,5,3,5,8,7,3,10,7,8,5,9,5,7 +B,5,10,7,7,7,11,6,2,6,10,3,7,4,7,6,11 +U,5,5,6,4,3,5,8,5,8,10,8,9,3,9,3,5 +C,4,7,5,5,3,7,7,8,6,7,6,10,3,8,3,9 +O,4,10,5,7,4,7,7,8,5,6,4,7,3,9,4,9 +Y,1,0,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +O,6,9,6,7,4,6,8,8,5,10,8,7,4,8,4,9 +X,6,9,6,4,3,10,7,2,8,9,4,7,4,10,4,9 +G,4,8,6,6,6,7,7,6,3,6,6,9,4,8,7,8 +W,6,9,8,7,6,8,8,4,1,7,9,8,8,10,0,8 +I,2,11,2,8,2,7,7,0,9,7,6,8,0,8,3,8 +L,3,3,4,4,1,1,0,6,6,0,1,5,0,8,0,8 +K,6,9,9,7,5,3,9,3,7,11,12,12,4,7,4,5 +P,5,9,7,6,5,7,12,7,2,11,5,3,2,12,4,8 +I,1,10,0,7,1,7,7,5,3,7,6,8,0,8,0,8 +A,2,4,4,2,2,11,2,3,2,10,2,10,2,6,2,9 +T,4,11,6,8,4,6,14,0,5,8,10,8,0,8,0,8 +I,2,8,3,6,2,7,7,0,7,12,6,8,0,8,1,8 +P,5,11,6,8,6,4,12,8,2,10,7,4,1,10,3,8 +Q,4,9,5,11,6,8,7,8,4,5,6,9,3,8,6,10 +L,5,9,7,8,6,7,7,4,5,7,7,8,3,8,8,9 +V,7,9,7,5,3,6,10,4,3,8,8,5,5,12,3,9 +N,5,6,7,4,3,5,9,3,5,11,9,9,5,8,1,7 +U,4,9,6,7,9,9,6,4,4,6,7,7,9,8,5,7 +G,2,3,2,2,1,6,7,5,4,9,7,9,2,9,4,9 +M,3,3,4,2,3,9,6,6,4,6,7,6,7,6,2,6 +W,3,6,5,4,2,6,8,4,1,7,8,8,8,9,0,8 +G,5,11,4,6,3,7,7,4,3,9,6,7,3,10,8,7 +K,3,2,3,4,1,3,7,7,2,7,7,11,3,8,3,10 +N,3,2,4,3,2,7,8,5,4,7,6,7,5,9,2,6 +K,5,7,7,5,4,8,7,2,7,10,3,8,4,9,4,9 +R,6,10,8,8,6,7,9,5,8,5,4,10,5,4,7,9 +I,1,6,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +R,3,7,5,5,4,9,7,4,5,10,4,7,3,7,4,11 +P,4,7,5,5,4,6,10,6,5,10,8,3,1,10,4,6 +N,3,6,4,4,2,7,7,14,2,5,6,8,6,8,0,8 +X,4,9,5,6,3,8,7,4,9,6,6,6,3,8,6,7 +H,7,10,10,7,9,9,7,3,6,10,4,7,3,8,3,9 +U,9,10,9,8,5,5,7,6,9,9,8,9,5,11,5,2 +J,2,2,4,4,2,11,6,2,7,12,3,7,0,7,1,8 +X,4,9,4,7,3,7,7,4,4,7,6,8,3,8,4,8 +W,4,9,6,7,4,6,8,4,2,7,8,8,8,10,0,8 +K,3,7,3,5,1,3,7,7,3,7,6,11,4,8,2,11 +K,3,7,4,4,1,4,8,7,2,7,5,11,3,8,3,10 +R,4,11,5,8,3,6,11,10,4,7,3,9,3,7,5,11 +B,4,8,5,6,5,7,7,6,4,6,5,6,3,8,6,6 +N,5,7,7,5,4,7,9,2,4,10,5,6,5,9,1,7 +B,3,6,4,4,4,8,8,6,6,7,6,6,2,8,6,9 +V,6,10,8,7,5,6,11,3,2,8,11,8,3,10,4,8 +R,7,12,6,7,5,6,8,5,5,9,5,10,7,5,7,11 +P,3,8,3,5,2,3,14,7,2,12,7,3,0,10,3,8 +B,4,5,4,8,4,6,9,10,7,7,5,7,2,8,9,10 +T,6,8,6,6,3,5,12,3,8,12,9,4,1,11,2,4 +B,3,5,5,4,3,9,7,2,6,11,4,7,4,6,5,9 +Q,6,10,6,5,3,10,4,4,7,10,4,9,3,8,6,13 +Q,2,1,2,2,1,8,6,7,4,6,6,8,3,8,3,8 +S,1,0,1,0,0,8,7,4,6,5,6,8,0,8,7,8 +T,4,8,6,6,6,7,7,4,7,7,6,8,5,7,5,6 +F,3,8,4,6,3,4,10,3,6,10,10,6,1,10,3,6 +Y,1,3,3,2,1,7,10,1,6,7,11,8,1,11,1,8 +W,7,11,10,8,7,7,11,2,3,6,9,8,12,11,2,7 +G,4,10,5,7,3,7,7,8,7,6,6,8,2,7,6,11 +M,2,3,3,2,2,8,7,5,4,6,7,8,5,6,1,7 +W,6,8,8,6,7,8,6,6,2,7,7,8,6,8,4,7 +R,2,6,3,4,2,6,9,9,4,7,5,8,2,7,5,11 +D,5,7,6,5,4,7,8,7,5,8,6,5,4,9,3,7 +K,8,10,11,8,6,8,6,2,8,10,4,9,4,7,5,9 +B,1,3,3,1,1,9,7,2,5,10,4,7,1,8,2,9 +O,3,7,4,5,3,7,8,8,4,7,6,8,3,8,3,8 +K,3,4,4,2,2,5,7,4,7,7,6,11,3,8,4,9 +G,2,1,2,2,1,8,6,6,6,6,5,10,1,7,5,10 +X,4,11,5,8,2,7,7,4,4,7,6,8,3,8,4,8 +C,3,7,4,5,2,7,7,7,10,10,6,13,1,10,4,9 +G,3,6,4,4,3,5,7,6,5,9,7,11,2,8,4,10 +O,2,1,3,2,2,7,7,7,5,7,5,8,2,8,3,8 +I,9,14,6,8,3,11,4,5,5,12,3,8,3,7,5,10 +P,2,3,3,2,1,7,10,4,3,12,5,3,1,10,2,8 +O,2,3,3,2,1,7,7,7,5,7,6,8,2,8,3,7 +Y,6,8,9,11,11,8,11,3,4,6,8,9,5,13,11,8 +F,5,9,7,7,5,6,9,6,8,10,10,5,2,9,4,5 +G,5,7,6,5,4,5,7,5,6,9,8,9,2,9,5,9 +K,3,3,5,2,2,6,8,2,6,10,6,9,3,9,3,7 +Q,2,2,3,3,2,8,7,6,2,5,6,9,2,9,4,9 +R,13,15,10,8,6,8,7,5,6,10,3,8,7,6,6,11 +B,5,10,6,8,7,9,7,3,5,7,6,8,7,8,6,9 +B,4,11,5,8,4,6,6,9,7,6,6,6,3,8,10,11 +V,4,7,4,5,2,4,11,3,3,9,11,7,2,10,1,8 +A,5,11,8,8,4,8,2,2,3,6,2,7,5,7,6,8 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +W,6,5,7,4,4,6,10,4,3,8,7,7,9,11,3,5 +N,5,9,8,7,4,10,6,3,5,10,2,5,6,9,1,7 +M,5,10,7,8,7,8,6,5,5,6,8,7,8,6,2,7 +O,2,0,2,1,1,8,7,7,6,7,6,8,2,8,3,8 +X,5,9,8,7,4,8,7,1,8,10,5,8,3,8,4,8 +O,2,2,3,3,2,7,7,8,4,7,7,8,2,8,3,8 +P,3,7,4,5,3,4,12,4,5,11,9,3,0,10,4,7 +W,5,6,5,4,4,2,11,2,3,10,10,8,5,11,1,7 +G,4,9,5,6,3,6,7,7,7,10,8,9,2,9,4,9 +Z,1,1,2,2,1,7,7,5,8,6,6,8,2,8,6,8 +O,4,8,5,6,3,6,9,7,5,10,8,7,3,8,3,8 +S,3,8,4,6,2,8,7,5,8,5,6,6,0,8,8,8 +C,3,7,4,5,2,5,8,7,7,8,8,14,1,9,4,10 +M,3,4,5,2,3,9,6,3,4,9,4,6,8,6,2,8 +G,4,9,5,7,4,5,7,5,4,9,9,9,2,7,5,9 +U,7,13,7,7,4,8,5,4,4,6,7,7,5,7,3,7 +Q,5,9,6,8,5,8,7,7,5,6,8,8,3,8,5,10 +G,5,8,6,6,4,7,6,7,8,7,5,11,3,11,5,8 +T,3,8,5,6,4,6,11,2,7,8,11,8,2,12,1,7 +E,3,6,3,4,2,3,8,6,10,7,5,14,0,8,7,8 +R,5,9,6,6,3,6,13,9,3,7,2,9,3,7,5,10 +W,2,0,3,1,1,7,8,4,0,7,8,8,7,9,0,8 +Y,7,10,6,5,3,8,6,3,5,9,8,6,4,10,4,5 +V,5,10,7,7,8,8,7,5,2,8,7,8,5,10,5,8 +X,2,1,2,1,0,8,7,4,4,7,6,8,3,8,4,8 +Z,6,7,8,9,8,9,8,6,5,9,3,6,3,5,8,7 +U,3,4,3,6,2,7,5,13,5,7,13,8,3,9,0,8 +B,4,10,6,8,8,8,7,6,6,6,6,6,3,9,6,10 +C,7,10,8,8,8,6,6,3,5,8,6,12,6,9,5,10 +G,6,13,6,7,3,7,6,5,4,9,5,5,4,8,5,7 +G,4,9,4,4,3,8,6,4,2,9,6,8,3,9,7,7 +R,2,3,2,2,2,6,7,4,4,6,5,7,2,7,4,9 +Y,1,0,2,0,0,7,9,3,1,7,13,8,1,11,0,8 +S,6,10,7,7,4,10,5,4,8,11,4,8,2,9,5,10 +X,7,11,10,9,5,7,7,1,9,10,6,8,3,8,4,7 +Z,1,0,1,0,0,7,7,2,9,8,6,8,0,8,6,8 +P,7,12,6,7,3,9,7,5,4,12,3,6,5,9,4,8 +M,3,5,6,4,4,5,6,3,4,10,10,10,6,5,2,7 +S,6,8,7,6,4,9,6,4,8,11,4,8,2,8,5,11 +H,7,10,10,8,8,6,8,3,6,10,8,8,4,9,4,7 +Z,6,11,8,9,8,10,7,5,4,7,5,7,4,8,10,5 +C,8,13,5,7,3,6,10,6,9,11,8,10,2,8,5,9 +W,9,9,9,7,8,4,11,2,2,9,8,7,7,12,2,6 +M,2,1,3,3,3,7,6,7,3,7,7,10,6,5,1,9 +C,3,7,4,5,2,5,8,7,7,9,8,13,1,10,4,10 +D,5,9,8,6,5,9,7,5,8,10,4,5,3,8,3,8 +C,3,6,5,4,1,6,8,6,10,7,7,12,1,7,4,9 +D,4,6,6,4,4,7,6,7,5,5,5,5,3,8,3,8 +R,3,6,5,4,3,9,8,3,6,9,3,8,3,6,4,10 +Z,3,2,4,3,2,7,7,5,9,6,6,8,1,8,7,8 +G,5,11,7,8,8,7,6,7,3,7,6,10,5,8,8,8 +H,3,8,5,6,7,8,9,5,3,7,7,7,9,8,9,8 +W,6,9,6,4,3,3,9,2,2,9,11,8,7,11,0,7 +T,4,11,5,8,2,7,15,1,6,8,11,8,0,8,0,8 +R,8,13,6,8,4,10,6,6,4,10,2,9,7,5,6,10 +J,1,6,2,4,1,14,2,5,5,13,1,9,0,7,0,8 +O,5,10,7,7,8,8,9,6,2,6,7,9,11,13,5,9 +U,6,11,8,8,12,8,7,4,4,6,7,8,8,8,6,7 +S,3,5,4,4,2,8,6,3,7,11,5,9,1,9,5,9 +K,5,9,8,7,9,7,10,4,4,5,6,9,8,8,7,8 +N,3,5,4,3,3,7,8,5,4,7,7,7,5,9,2,6 +A,6,10,8,8,8,7,8,8,4,6,5,9,3,7,8,5 +K,4,7,5,5,2,4,8,9,1,7,6,11,3,8,2,11 +G,3,5,4,4,3,6,7,5,4,9,8,9,3,7,5,10 +D,1,3,2,2,1,8,7,5,5,9,5,6,2,8,3,8 +W,1,0,2,0,0,8,8,3,0,7,8,8,4,10,0,8 +J,5,10,4,8,3,10,6,2,4,12,5,7,2,10,5,11 +N,3,5,5,3,2,7,8,2,4,10,6,6,5,8,0,7 +F,5,11,5,6,4,8,8,2,4,10,5,6,4,9,7,7 +C,4,9,3,4,2,7,10,4,4,8,8,8,3,9,8,11 +F,5,9,7,7,8,10,7,1,5,9,4,5,4,10,5,8 +E,3,4,3,6,2,3,7,6,10,7,6,14,0,8,7,8 +E,5,9,7,7,6,9,6,2,7,11,4,9,3,8,5,11 +M,3,6,4,4,3,7,5,10,1,7,8,8,7,5,0,9 +U,10,11,10,8,4,3,9,6,9,12,12,9,3,9,1,7 +C,6,10,7,8,5,3,7,4,7,10,8,15,4,9,5,6 +F,5,11,6,8,7,7,8,5,4,8,6,8,9,10,7,12 +U,5,10,7,7,6,7,8,4,7,4,7,9,6,10,1,8 +E,5,8,7,6,4,10,6,2,8,11,4,8,3,8,5,11 +C,4,10,5,8,2,5,7,7,10,7,5,13,1,9,4,8 +B,5,11,5,8,4,6,8,10,7,7,5,7,3,8,9,10 +G,1,0,2,1,0,8,7,6,5,6,5,9,1,7,5,10 +K,5,9,5,6,2,5,9,9,2,7,3,11,4,8,2,11 +W,4,9,7,7,6,7,8,4,1,7,9,8,7,11,0,8 +S,3,6,4,4,3,8,8,5,8,5,6,6,0,7,8,7 +W,2,1,2,1,1,8,8,4,0,7,8,8,6,10,0,8 +Y,6,6,5,9,3,7,11,1,3,9,10,5,4,10,6,8 +S,3,9,4,7,3,8,7,5,8,5,6,7,0,8,8,8 +U,3,6,4,6,4,8,7,4,3,6,6,8,4,8,1,7 +K,5,9,8,8,7,8,6,2,3,8,3,8,6,5,8,12 +V,3,8,5,6,1,8,8,4,3,6,14,8,3,10,0,8 +V,2,7,4,5,2,7,9,3,1,8,12,8,2,11,0,8 +M,4,6,5,4,2,8,7,12,1,6,9,8,8,6,0,8 +G,4,7,5,5,3,5,8,6,6,9,8,9,2,7,4,9 +U,3,6,5,5,4,7,7,4,4,6,6,8,4,8,1,7 +Q,4,7,5,9,5,9,7,8,3,5,7,10,3,8,6,10 +O,5,9,4,4,2,9,7,5,4,9,4,8,4,9,5,9 +X,4,5,5,4,4,7,7,2,4,7,6,8,2,9,7,7 +X,3,4,4,3,2,7,7,3,9,6,6,9,2,8,5,8 +P,5,4,5,6,2,4,13,8,1,10,6,3,1,10,4,8 +X,3,4,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +I,2,11,3,8,4,8,7,0,7,7,6,8,0,8,3,7 +A,3,7,5,6,4,7,8,2,4,7,8,9,5,8,3,6 +W,5,6,5,4,4,4,10,3,2,9,9,7,6,11,2,6 +U,5,8,5,6,3,3,8,5,7,10,10,10,3,9,2,6 +V,4,5,5,3,2,4,12,4,4,11,11,7,2,10,1,8 +D,6,10,9,8,7,10,6,2,7,11,4,7,5,6,4,10 +T,4,2,5,4,3,9,12,3,7,5,11,9,2,11,1,8 +D,4,8,4,6,4,5,7,9,7,5,4,6,2,8,3,8 +D,3,8,4,6,2,5,7,10,8,7,6,5,3,8,4,8 +D,4,6,4,4,3,5,7,9,7,7,6,6,2,8,3,8 +U,7,8,7,6,3,3,10,6,8,13,12,8,3,9,1,7 +I,7,11,9,8,6,10,5,2,7,7,7,4,0,9,4,7 +N,9,15,7,8,4,6,9,4,5,4,5,11,6,11,2,7 +V,6,11,6,6,3,7,7,4,4,7,7,6,6,12,2,8 +V,4,5,6,4,2,4,12,3,3,10,11,7,3,10,1,7 +S,5,10,4,6,2,7,3,4,4,8,2,7,3,7,5,8 +Q,2,2,3,3,2,8,8,6,2,5,7,9,2,9,5,10 +C,4,8,5,6,3,3,8,5,7,10,10,13,1,8,3,7 +P,3,8,5,6,4,7,5,5,4,7,6,9,3,9,6,11 +Z,2,7,3,5,2,6,8,5,10,6,7,9,1,9,8,8 +Y,2,4,4,3,2,6,10,1,7,8,11,8,1,11,2,8 +K,9,13,9,7,4,6,7,3,7,9,9,10,6,10,3,6 +Y,4,5,5,7,7,9,8,6,3,7,7,7,6,10,6,4 +J,7,11,9,8,6,8,4,4,6,8,6,7,5,6,5,7 +B,5,11,7,9,8,8,7,5,4,7,5,7,4,8,6,8 +O,3,2,4,3,2,7,6,7,5,7,5,7,2,8,3,7 +K,5,7,7,6,6,6,7,3,4,6,4,9,5,5,9,7 +K,2,3,4,2,2,7,8,2,6,10,6,8,3,8,2,8 +V,4,10,6,8,2,7,8,4,3,7,14,8,3,9,0,8 +P,4,6,5,4,4,7,9,3,6,8,8,4,1,10,4,7 +R,6,11,9,8,6,8,8,5,6,8,5,7,4,8,6,12 +P,4,7,5,5,4,6,9,6,5,9,7,4,2,10,4,7 +Z,4,7,6,5,3,6,9,3,9,12,9,7,1,9,6,5 +E,4,10,3,5,2,8,7,5,4,11,5,10,3,8,7,11 +Q,7,9,7,10,7,7,9,5,3,7,10,11,3,8,7,7 +Q,2,5,3,6,4,9,10,6,3,3,8,11,2,9,5,10 +X,2,7,3,4,1,7,7,4,4,7,6,8,3,8,4,8 +U,7,9,7,7,4,4,8,6,8,10,10,9,3,9,2,5 +N,5,8,8,6,4,4,10,4,4,10,11,9,6,8,1,7 +T,5,5,6,5,5,6,8,4,8,8,7,9,3,8,7,5 +S,3,6,4,4,3,8,8,5,7,6,6,7,0,8,8,8 +T,5,7,6,5,6,6,8,4,5,6,7,9,6,8,5,8 +G,9,14,7,8,5,9,5,5,3,9,6,8,4,9,8,8 +G,5,10,5,8,4,5,7,6,6,10,8,10,2,8,5,9 +I,2,8,3,6,1,7,7,0,8,14,6,8,0,8,1,7 +C,2,4,3,3,1,5,9,5,6,12,9,10,1,10,2,7 +D,5,7,6,5,5,10,6,3,6,11,4,7,3,8,3,9 +J,3,7,4,5,2,8,7,1,6,14,4,7,0,7,0,7 +L,3,8,3,6,1,0,1,5,6,0,0,7,0,8,0,8 +R,7,13,6,7,5,8,6,3,5,8,5,9,6,9,6,7 +V,2,3,3,2,1,4,12,3,2,10,11,7,2,11,0,8 +M,11,12,11,7,6,6,9,5,4,4,4,11,11,14,3,8 +T,3,10,5,7,1,7,15,1,6,7,11,8,0,8,0,8 +U,6,10,8,7,5,4,8,7,8,9,11,11,3,9,1,8 +M,4,6,7,4,6,12,3,3,1,10,4,9,8,6,2,8 +J,3,10,4,8,4,8,6,2,4,11,5,10,1,6,2,6 +O,4,5,5,4,3,8,7,8,5,7,6,8,2,8,3,8 +Y,5,7,5,5,3,6,8,1,7,8,9,5,2,12,4,4 +B,6,9,5,4,4,9,7,3,5,10,5,7,6,6,7,9 +T,3,4,4,3,1,6,11,2,8,11,9,5,1,10,2,5 +Q,6,7,6,9,6,8,7,6,3,9,8,10,3,8,6,8 +O,7,8,9,7,6,5,7,6,6,8,5,6,3,7,5,7 +E,8,13,6,8,5,7,7,4,4,10,6,9,3,9,8,11 +I,3,8,5,6,3,7,7,0,7,13,6,8,0,8,1,8 +Z,3,9,4,6,2,7,7,4,13,10,6,8,0,8,8,8 +O,2,0,2,1,1,7,7,6,6,7,6,8,2,8,3,8 +V,2,8,4,6,1,9,8,4,2,6,13,8,3,10,0,8 +R,9,14,9,8,7,5,8,2,6,8,4,10,7,5,7,5 +M,5,11,6,9,4,8,7,12,2,6,9,8,9,6,0,8 +N,5,9,7,6,4,9,7,3,5,10,4,6,5,9,1,7 +S,6,11,6,6,3,6,9,3,5,13,8,7,2,9,3,7 +S,2,1,3,2,2,8,7,6,4,7,7,8,2,9,9,8 +D,4,5,5,4,4,7,7,7,7,7,6,5,2,8,3,7 +S,4,6,5,4,3,6,9,3,7,10,7,7,2,7,4,5 +M,6,9,8,8,10,8,7,4,3,7,6,7,10,8,6,5 +J,0,0,1,0,0,12,4,4,3,11,4,11,0,7,0,8 +D,4,8,6,6,4,7,8,7,6,10,6,5,3,8,4,8 +T,4,6,4,4,2,5,12,3,6,11,9,4,2,11,2,5 +R,6,11,6,8,7,5,10,8,3,7,4,8,2,7,5,11 +E,3,4,5,3,2,8,7,1,8,11,5,8,2,8,4,10 +O,9,13,6,7,4,5,6,7,4,9,7,9,5,9,5,8 +C,4,9,5,7,6,5,7,4,5,7,6,9,6,10,5,7 +G,2,1,3,2,2,7,7,5,5,6,6,9,2,9,4,9 +T,4,9,4,4,2,5,11,2,6,11,8,5,2,8,3,5 +A,3,9,6,7,4,11,3,1,2,8,3,9,4,5,3,8 +J,6,9,5,7,3,8,9,2,3,13,4,5,2,9,7,8 +B,9,11,7,6,4,10,4,5,6,11,3,9,5,7,6,11 +T,2,1,3,1,1,7,11,3,5,7,10,8,2,11,1,8 +W,5,6,5,4,4,5,11,3,2,9,8,7,6,12,2,7 +D,9,15,8,8,6,8,6,3,7,10,5,7,6,8,8,5 +E,4,8,4,6,2,3,6,6,11,7,7,14,0,8,7,7 +V,3,3,4,2,1,3,12,4,3,11,11,7,2,11,1,8 +H,10,13,11,8,7,9,6,4,5,11,3,7,6,7,5,7 +V,9,13,7,7,4,9,10,5,5,6,10,6,5,12,3,6 +M,9,13,10,8,6,11,11,7,3,4,7,9,9,13,3,6 +D,2,2,3,3,2,7,7,6,6,7,6,5,2,8,3,7 +C,5,9,6,6,3,5,8,8,9,9,8,12,2,10,4,9 +D,5,10,5,8,6,6,8,9,7,6,5,6,2,8,3,7 +R,9,13,7,7,4,9,5,5,6,9,4,9,6,6,7,11 +U,3,4,4,2,2,5,8,5,7,10,8,9,3,9,2,6 +G,7,9,7,7,5,5,7,6,6,10,8,11,2,9,4,10 +F,2,3,2,2,1,5,10,4,5,10,9,6,1,10,3,7 +K,5,8,8,7,7,9,6,2,4,9,3,8,4,6,7,11 +W,8,10,8,5,3,6,10,2,2,8,10,7,8,12,1,7 +B,5,8,7,6,9,8,8,5,3,7,7,7,6,10,9,9 +S,5,9,7,8,8,8,7,5,6,7,6,8,6,8,10,13 +P,6,11,5,6,3,8,7,5,3,12,3,6,5,9,4,8 +J,2,5,4,4,1,9,7,2,7,14,4,8,0,7,0,7 +L,2,1,2,1,0,2,1,6,5,0,2,5,0,8,0,8 +K,5,10,5,5,3,5,8,3,6,9,8,9,5,7,3,8 +K,5,8,7,6,4,5,8,2,7,10,9,10,3,8,3,7 +S,4,9,6,7,4,7,8,3,7,10,5,7,2,7,4,8 +L,3,6,4,4,2,5,3,1,8,8,2,10,0,7,2,7 +W,7,9,7,7,6,2,11,2,3,10,10,8,6,11,2,7 +Q,7,15,6,8,5,11,4,4,6,10,5,7,3,9,7,12 +E,4,9,6,8,7,6,9,5,5,7,7,11,6,10,9,10 +Z,3,8,5,6,3,7,9,2,9,11,7,7,1,9,6,6 +K,3,7,5,5,5,5,7,4,7,6,5,10,3,8,4,9 +K,3,3,5,2,2,7,6,2,7,10,6,10,4,7,3,8 +W,6,10,6,7,6,3,10,2,3,10,10,8,6,11,2,6 +B,3,7,3,5,3,6,8,8,6,7,5,7,2,8,9,10 +J,2,7,2,5,1,13,2,8,4,13,4,12,1,6,0,8 +H,5,6,8,4,5,8,7,3,6,10,5,8,4,9,4,8 +S,6,10,8,8,11,7,7,3,2,7,6,7,3,8,12,2 +V,3,3,5,5,1,7,8,4,3,7,13,8,3,9,0,8 +N,3,6,5,4,3,6,9,6,4,8,7,8,5,8,1,7 +B,6,9,8,7,8,8,7,5,6,9,6,6,4,10,6,9 +A,3,7,5,5,2,12,3,4,3,11,2,10,2,6,3,9 +H,3,5,5,4,3,7,7,3,6,10,6,8,3,8,3,8 +X,6,12,7,7,4,8,7,2,7,11,4,6,4,8,4,7 +N,6,11,8,8,5,10,8,3,5,9,3,5,6,9,1,7 +V,7,10,7,7,3,4,11,2,4,9,11,7,4,10,1,7 +Z,2,5,5,3,2,7,8,2,9,12,6,8,1,9,5,8 +S,1,0,2,1,0,8,8,4,7,5,6,7,0,8,7,8 +V,3,8,5,6,1,6,8,4,3,8,14,8,3,10,0,8 +Y,4,7,6,5,3,10,10,1,6,2,10,8,1,11,1,9 +C,1,3,2,1,1,4,8,4,6,10,9,12,1,8,2,8 +L,2,5,3,4,2,7,4,1,8,8,2,10,0,7,2,8 +Q,4,5,5,6,4,7,10,4,4,7,10,11,3,9,6,7 +X,7,10,7,5,3,5,8,3,8,10,11,11,4,11,4,5 +S,7,10,7,5,3,7,8,4,3,13,8,7,3,9,4,8 +R,10,15,8,8,5,7,7,5,5,9,5,9,7,5,7,11 +F,6,9,8,7,6,5,11,6,5,12,8,5,3,9,2,5 +M,1,0,2,0,0,7,6,9,0,7,8,8,5,6,0,8 +K,6,10,9,7,5,4,8,2,7,10,10,11,3,8,4,6 +J,5,10,4,7,3,7,11,3,3,13,5,4,2,7,6,8 +T,3,5,4,4,2,5,12,2,7,11,9,4,1,11,2,5 +C,6,8,7,7,7,6,7,5,5,6,6,11,7,10,9,8 +W,9,11,8,8,7,5,10,4,3,9,8,7,9,11,3,5 +H,4,8,5,6,5,7,6,13,2,7,7,8,3,8,0,8 +E,4,9,6,6,6,6,8,6,8,6,5,10,3,8,6,9 +W,1,0,2,1,1,7,8,3,0,7,8,8,5,10,0,8 +H,2,1,3,2,2,9,7,6,5,7,6,6,3,8,3,7 +U,6,11,8,9,5,5,8,6,7,7,9,10,3,9,1,8 +Z,1,0,2,0,0,7,7,2,10,8,6,8,0,8,6,8 +O,2,1,3,2,2,8,7,7,5,7,6,8,2,8,3,8 +F,2,3,4,1,1,6,10,3,5,13,7,5,1,9,1,7 +T,5,6,7,5,5,5,7,3,8,7,6,10,3,7,7,5 +I,1,6,2,4,1,7,7,1,8,7,6,8,0,8,3,8 +A,2,2,4,4,2,8,2,2,2,8,2,8,2,6,3,7 +J,1,1,2,1,1,10,6,2,6,12,4,8,0,7,1,7 +U,4,8,5,6,3,6,9,6,6,5,9,10,3,9,1,8 +R,5,10,6,7,6,6,9,8,4,7,5,8,2,7,5,11 +T,4,10,6,7,2,7,15,1,6,7,11,8,0,8,0,8 +J,6,7,8,9,8,8,8,4,6,6,6,7,5,9,11,11 +U,3,4,4,3,2,5,8,5,7,10,9,8,3,9,2,6 +C,5,8,6,6,4,6,8,6,9,6,6,13,1,8,4,9 +T,9,13,8,7,3,8,7,4,9,13,5,7,2,9,6,6 +V,2,6,4,4,1,8,8,4,2,6,13,8,3,10,0,8 +Q,6,7,8,6,6,8,3,4,5,7,3,9,4,5,5,7 +Q,4,5,5,6,5,8,8,6,1,7,6,11,3,9,6,8 +Q,1,0,2,1,0,8,7,6,3,6,6,9,2,8,3,8 +K,5,10,5,7,2,4,8,9,2,7,6,11,4,8,2,11 +C,7,12,5,6,4,7,6,4,3,9,8,11,4,9,8,11 +A,3,11,5,8,3,13,4,5,3,12,1,8,2,6,4,9 +Z,3,8,4,6,3,8,7,3,12,9,6,8,0,8,7,7 +U,6,10,6,7,5,4,8,5,7,9,7,9,7,9,5,3 +D,5,11,6,8,5,11,6,3,7,11,2,6,3,8,3,9 +M,5,8,7,6,6,8,7,2,4,9,7,8,7,6,2,8 +Y,5,10,8,8,4,7,10,2,7,6,12,9,2,11,2,8 +Z,2,7,3,5,3,6,8,5,10,7,6,10,1,9,8,7 +H,4,7,6,10,6,8,12,5,2,9,7,5,4,11,8,4 +B,4,7,5,5,6,8,7,6,6,6,6,6,2,8,6,9 +D,2,3,3,1,2,8,6,4,6,10,4,6,2,8,2,8 +R,5,11,6,8,3,5,10,9,4,7,4,8,3,7,6,11 +R,2,1,2,1,1,6,9,8,4,7,5,8,2,7,4,11 +U,7,9,7,6,5,4,8,5,8,9,6,9,7,9,6,2 +N,5,8,7,6,4,9,7,6,6,6,6,4,6,9,2,5 +K,6,9,8,7,6,9,5,1,6,10,4,9,5,6,5,10 +N,6,11,8,8,6,8,7,9,5,6,4,4,4,8,4,9 +S,4,10,5,7,3,8,8,6,9,4,6,7,0,8,9,7 +E,3,6,3,4,3,4,7,5,8,7,6,13,0,8,6,9 +F,5,11,5,8,4,1,13,4,4,12,10,7,0,8,2,6 +T,6,9,8,6,6,6,7,7,7,8,10,8,5,7,7,9 +K,8,14,8,8,5,10,6,3,6,11,2,6,5,8,4,9 +K,4,9,4,6,2,3,7,7,2,7,5,11,3,8,3,10 +E,3,7,3,5,2,3,7,6,10,7,6,14,0,8,7,7 +I,2,7,4,5,3,10,5,1,5,7,5,5,2,8,4,7 +L,6,11,9,8,11,7,8,3,6,5,7,10,6,12,10,6 +A,5,10,9,7,6,7,5,2,4,5,1,6,5,7,5,5 +W,11,15,12,9,8,7,8,3,4,7,9,7,12,9,3,5 +A,4,9,6,6,3,11,2,3,3,10,2,9,2,6,3,8 +Q,2,4,3,5,3,8,9,6,1,5,8,10,2,9,5,10 +D,3,1,4,3,2,7,7,7,7,7,6,5,2,8,3,7 +C,4,4,5,7,2,5,7,7,10,7,6,14,1,8,4,9 +G,4,5,5,4,3,6,7,6,6,9,7,10,2,9,4,9 +V,3,8,5,6,3,6,11,2,4,8,11,8,2,10,1,9 +T,5,6,6,5,5,6,8,4,8,8,7,9,3,8,6,6 +A,3,8,5,5,2,7,4,3,1,7,1,8,3,7,2,8 +O,5,8,7,6,8,7,9,5,2,7,6,7,10,9,6,10 +O,3,5,4,3,2,8,7,7,5,9,5,8,2,8,3,8 +D,4,9,5,7,3,5,7,10,8,7,6,5,3,8,4,8 +M,7,8,9,6,6,10,5,3,5,9,3,6,10,6,2,9 +U,3,7,5,5,4,9,6,7,5,7,6,8,3,8,4,5 +R,1,0,2,0,1,6,9,7,3,7,5,8,2,7,4,10 +W,4,7,6,5,3,5,8,5,1,7,8,8,8,9,0,8 +H,3,5,5,7,4,11,6,3,1,8,6,9,3,8,8,12 +F,4,5,5,7,2,1,14,5,4,12,10,5,0,8,2,5 +G,3,5,4,4,2,6,7,5,5,9,7,10,2,8,4,10 +T,3,11,5,8,1,7,14,0,6,7,11,8,0,8,0,8 +L,2,5,3,4,1,5,5,1,9,7,2,11,0,7,2,8 +Y,4,9,7,7,3,6,10,2,8,7,12,8,1,11,2,8 +Q,4,4,6,6,3,7,7,7,6,5,7,7,3,8,5,9 +L,4,9,6,6,3,7,3,1,8,8,2,10,2,5,4,7 +R,1,3,3,1,1,9,7,3,4,10,3,7,2,7,2,10 +T,5,9,6,7,7,6,8,3,6,7,6,10,5,8,5,7 +B,4,9,4,7,4,6,7,9,7,7,6,7,2,8,9,10 +R,3,2,4,3,3,6,7,4,6,6,5,7,3,7,5,8 +E,3,4,3,6,2,3,8,6,11,7,5,15,0,8,7,7 +D,6,10,8,8,7,7,7,7,5,7,6,6,4,8,3,7 +B,3,4,4,6,3,6,6,9,7,6,7,7,2,8,9,10 +N,7,11,10,8,12,8,7,4,5,7,6,6,8,10,10,5 +V,2,3,3,2,1,7,12,2,2,7,11,8,2,11,1,8 +G,7,12,6,6,4,6,7,7,5,9,7,6,4,8,5,6 +S,3,2,3,3,2,8,8,7,5,8,5,7,2,8,8,8 +D,5,9,7,6,4,10,6,3,8,11,4,6,4,6,4,8 +F,3,3,3,4,1,1,13,4,4,12,11,7,0,8,2,6 +S,4,8,5,6,4,7,7,5,7,5,6,9,0,9,8,8 +M,4,8,7,6,8,11,5,3,2,9,4,8,8,6,3,7 +I,2,7,3,5,2,7,7,0,7,13,6,8,0,8,1,8 +L,3,9,5,7,3,8,4,0,9,9,3,11,0,7,3,9 +C,9,12,6,7,3,8,8,6,8,12,6,8,2,9,5,9 +V,3,2,5,3,2,9,12,3,3,5,11,9,2,10,1,9 +A,3,9,5,6,3,6,3,2,3,5,2,8,2,6,3,6 +Q,4,6,6,8,6,8,7,7,2,5,6,10,3,8,5,10 +D,4,8,6,6,4,9,6,5,7,10,3,5,3,8,3,8 +U,4,5,4,7,2,7,5,15,5,7,13,8,3,9,0,8 +J,0,0,1,0,0,12,4,6,3,12,5,11,0,7,0,8 +H,6,8,9,6,7,5,8,3,7,10,9,9,4,9,4,6 +O,2,3,2,2,1,7,7,7,4,7,6,8,2,8,2,7 +Y,3,6,5,8,1,7,10,1,3,7,12,8,1,11,0,8 +K,8,10,11,8,6,8,6,2,7,10,4,9,4,8,4,9 +G,8,12,7,6,5,7,6,3,3,8,5,7,4,9,9,7 +C,3,6,4,4,1,5,8,6,10,6,7,11,1,7,4,8 +N,4,4,4,3,2,7,9,5,4,7,6,7,5,9,2,7 +X,6,8,8,6,6,7,7,2,5,6,6,7,3,9,10,9 +P,5,11,6,8,3,4,11,10,3,9,6,4,2,10,4,8 +T,3,7,5,5,3,8,12,3,7,7,11,8,2,11,1,8 +W,4,2,6,4,4,7,11,2,2,6,9,8,7,11,1,8 +N,5,4,5,6,2,7,7,15,2,4,6,8,6,8,0,8 +B,3,7,3,5,3,6,7,9,6,7,6,7,2,8,8,10 +A,7,10,9,8,9,8,6,7,4,7,6,9,6,8,8,3 +B,5,6,7,6,8,8,7,5,4,7,6,8,7,9,8,4 +B,2,7,3,5,2,6,7,8,6,7,6,7,2,8,8,10 +J,2,5,4,4,1,9,6,2,6,14,5,9,1,6,1,7 +B,3,5,5,3,3,10,6,3,6,10,4,7,2,8,4,11 +X,7,10,10,8,5,10,7,2,8,11,2,7,3,8,4,9 +F,2,3,2,2,1,5,10,3,4,10,9,5,1,9,2,7 +H,1,0,1,1,0,7,7,11,1,7,6,8,3,8,0,8 +C,5,10,6,8,2,6,7,7,10,6,6,15,1,8,4,9 +Y,5,11,6,8,3,7,10,1,3,7,12,8,1,11,0,8 +E,3,4,5,3,3,6,7,2,8,11,7,9,2,8,4,8 +K,7,13,8,7,5,7,8,2,6,10,4,8,5,5,4,7 +H,6,9,8,7,5,5,7,3,7,10,9,10,3,8,4,6 +B,3,1,3,2,2,7,7,5,5,6,6,6,2,8,6,9 +A,3,5,5,4,4,7,8,3,4,7,8,8,5,10,3,6 +R,2,3,4,2,2,9,7,2,5,10,3,6,2,7,3,9 +P,4,6,6,9,9,8,6,5,1,7,6,7,8,8,6,7 +Z,6,9,8,6,6,9,10,6,5,6,5,6,3,9,9,4 +W,8,9,8,5,3,3,11,2,3,11,11,8,7,11,0,7 +T,3,5,5,7,1,6,15,1,6,8,11,7,0,8,0,8 +Z,4,7,5,5,3,7,7,6,11,6,6,8,2,8,8,8 +K,4,10,6,7,8,9,7,3,4,5,6,8,7,9,7,6 +P,3,7,5,5,3,6,12,4,5,13,6,2,0,9,3,8 +X,5,8,8,6,4,6,8,1,8,10,8,8,3,8,4,7 +C,6,10,6,7,4,6,8,7,8,13,8,10,2,11,3,7 +U,3,1,4,2,2,6,9,5,6,7,9,9,3,9,1,8 +N,4,10,5,8,5,8,7,12,1,6,6,8,5,8,0,9 +X,2,4,4,3,2,10,7,1,8,10,3,7,2,7,3,8 +S,4,10,4,8,4,9,8,5,9,5,5,5,1,6,9,7 +F,2,1,2,2,1,6,10,4,5,10,9,5,1,10,3,6 +U,5,9,6,7,4,8,5,13,5,8,12,8,3,9,0,8 +P,2,3,2,1,1,6,10,5,4,9,7,4,1,9,3,7 +X,4,5,5,7,2,7,7,4,4,7,6,8,3,8,4,8 +Q,3,5,4,6,3,7,8,5,2,7,9,11,3,9,5,7 +K,3,3,5,2,2,8,6,2,6,10,5,10,3,8,3,9 +B,10,14,9,8,8,8,7,4,5,9,6,7,8,7,10,8 +D,3,7,5,5,7,9,9,4,4,7,6,5,4,9,8,6 +G,7,8,9,7,9,7,8,5,3,7,7,8,10,10,10,7 +B,3,6,4,4,4,6,8,7,4,7,5,6,2,8,6,6 +T,3,3,4,2,1,5,11,3,7,11,9,4,1,10,2,5 +Z,2,4,4,3,2,8,6,2,9,12,5,9,1,8,5,9 +C,4,8,5,6,2,6,9,7,10,5,7,12,1,6,4,8 +V,2,7,4,5,1,9,8,4,2,5,13,8,3,10,0,8 +G,5,10,7,8,6,6,6,7,6,6,5,12,3,10,5,7 +M,5,8,7,6,8,8,7,6,5,6,7,8,8,6,2,7 +B,4,11,5,8,4,6,7,9,7,7,6,7,2,8,9,10 +N,5,9,7,7,6,6,7,7,6,7,5,8,6,7,3,7 +W,10,10,9,8,9,5,11,4,3,8,7,7,10,12,4,5 +N,2,3,2,1,1,7,8,6,4,7,6,7,4,8,1,7 +A,4,4,6,6,2,6,7,3,0,6,0,8,2,7,1,7 +R,4,9,6,7,6,8,7,7,3,8,5,7,4,7,7,10 +U,4,4,4,3,2,4,8,5,7,11,10,9,3,9,2,6 +R,2,3,3,2,2,7,7,5,4,9,5,7,2,7,3,10 +E,2,2,3,4,3,7,7,6,7,7,6,9,2,8,6,10 +M,5,10,7,5,4,12,2,2,2,10,3,9,5,4,1,9 +I,1,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +A,5,7,7,5,7,7,8,8,4,7,5,8,4,8,9,4 +W,4,7,6,5,3,6,8,5,1,7,8,8,8,9,0,8 +J,4,10,5,8,3,8,7,2,6,14,5,9,1,7,1,7 +L,2,3,3,2,1,7,4,2,7,8,2,10,0,7,2,8 +O,4,5,5,7,3,7,8,9,8,7,8,8,3,8,4,8 +I,1,5,1,4,1,7,7,1,7,7,6,8,0,8,2,8 +K,1,0,1,0,0,5,7,7,1,7,6,11,2,8,2,11 +M,5,8,8,6,5,5,7,3,4,10,9,10,8,6,3,8 +N,10,13,9,7,4,7,10,5,5,3,5,11,6,11,3,6 +A,3,8,5,6,3,10,4,2,2,8,2,10,2,6,3,8 +G,4,6,5,4,5,9,8,6,2,5,7,9,6,10,3,8 +N,5,5,7,4,6,7,9,4,4,6,4,8,7,7,5,7 +F,4,8,4,6,3,1,13,4,3,12,10,7,0,8,2,6 +V,1,0,2,1,0,8,9,3,2,7,12,8,2,11,0,8 +G,4,5,5,4,3,6,7,5,6,9,7,10,2,8,4,9 +C,5,7,7,6,6,5,6,4,5,7,6,11,4,10,7,10 +Y,10,9,8,12,5,7,9,3,2,7,11,5,4,10,7,6 +Y,6,11,8,8,8,9,3,7,5,8,8,7,3,10,5,3 +W,4,4,5,3,3,4,11,3,2,9,9,7,6,11,1,7 +J,2,11,3,8,1,14,2,7,5,14,1,10,0,7,0,8 +F,4,6,6,4,3,8,10,2,6,14,5,4,2,10,2,8 +Q,5,7,6,6,5,7,4,4,5,6,3,7,3,7,5,7 +Y,4,9,6,7,3,5,11,2,3,8,12,8,1,11,0,8 +K,5,8,7,6,8,7,6,3,4,6,6,8,8,6,7,7 +H,4,6,5,4,4,7,9,6,5,7,4,6,3,7,7,10 +N,7,10,9,8,10,6,8,3,4,8,7,8,8,10,7,4 +B,3,9,3,7,5,7,8,8,6,7,5,7,2,7,8,9 +O,4,10,5,7,4,7,6,8,5,7,5,8,3,8,3,8 +V,3,6,5,4,2,8,9,4,2,6,13,8,3,10,0,8 +U,8,9,8,7,5,3,8,5,8,10,9,9,3,9,2,6 +F,5,7,6,5,6,7,8,6,4,8,6,8,3,10,8,10 +N,8,10,11,8,5,9,7,3,6,10,4,6,7,9,2,7 +X,2,1,4,3,2,7,8,3,9,6,6,7,2,8,6,7 +E,4,10,6,7,7,7,7,3,6,7,7,10,4,9,8,8 +L,2,3,2,5,1,0,1,5,6,0,0,7,0,8,0,8 +A,5,10,7,7,8,8,5,8,4,8,6,8,3,9,8,3 +H,2,1,3,3,2,8,7,6,6,7,6,8,3,8,3,7 +O,1,1,2,1,1,8,7,7,4,7,6,8,2,8,3,8 +F,4,11,6,8,4,9,9,2,6,13,4,4,2,10,3,9 +N,5,9,6,7,3,7,7,15,2,4,6,8,6,8,0,8 +S,2,1,2,2,2,8,8,6,4,7,5,7,2,8,8,8 +I,4,11,3,6,2,10,7,6,3,13,4,8,2,8,4,9 +L,3,7,5,5,2,4,2,7,7,1,2,4,1,6,0,6 +J,1,7,2,5,1,13,3,8,4,14,3,11,0,6,0,8 +A,4,7,6,6,5,8,8,2,4,7,7,8,5,7,4,6 +Q,6,9,8,8,8,5,4,4,6,5,4,7,4,5,6,6 +N,4,7,6,5,6,9,6,4,5,7,5,6,7,11,6,5 +W,8,8,8,6,5,2,10,2,3,11,11,9,7,10,1,7 +N,3,7,5,5,5,5,8,4,3,9,10,10,5,8,4,5 +J,5,10,6,8,5,8,6,4,5,8,6,7,3,7,4,6 +S,1,0,1,0,0,7,7,3,5,5,6,8,0,8,7,8 +D,4,8,6,6,8,9,8,5,4,7,6,6,4,8,8,6 +Y,2,4,3,3,1,6,10,1,6,8,11,8,1,11,2,7 +O,2,1,3,1,1,8,7,7,5,7,6,9,2,8,3,8 +Q,5,6,6,8,6,9,8,7,2,4,7,11,3,9,5,10 +P,4,7,6,11,11,8,6,5,1,7,6,7,7,9,7,10 +E,3,8,4,6,5,6,6,3,5,7,7,10,4,10,8,9 +E,4,7,6,5,4,9,6,2,8,11,5,8,4,7,6,10 +G,3,9,4,7,2,7,7,8,7,5,6,9,2,7,6,11 +D,4,11,6,8,5,9,7,5,7,10,5,5,3,8,3,8 +R,6,9,9,7,7,9,7,4,6,10,3,7,3,6,4,11 +V,4,8,4,6,2,3,11,3,3,10,11,8,2,10,1,7 +X,5,7,6,5,5,7,8,3,6,6,6,8,4,8,10,8 +M,6,9,8,8,10,6,8,4,3,7,5,8,10,8,5,6 +W,8,12,9,7,5,1,8,2,3,9,11,9,9,9,1,6 +E,5,10,7,8,5,10,6,2,8,11,4,8,2,8,5,11 +T,3,8,5,6,3,6,12,2,8,8,12,8,1,11,1,7 +O,3,5,4,3,2,7,7,8,5,7,6,8,2,8,3,8 +V,3,4,5,3,2,4,12,3,3,9,11,7,2,11,1,8 +E,3,7,5,5,3,9,6,2,7,11,5,8,2,9,5,11 +D,7,11,9,8,8,8,8,5,6,10,5,5,6,8,6,11 +J,2,9,3,6,2,14,3,4,4,13,1,8,0,7,0,8 +J,1,0,1,1,0,12,3,6,3,12,5,11,0,7,0,8 +S,3,9,4,7,4,8,7,7,5,7,5,6,2,8,8,8 +T,2,5,4,6,1,5,14,1,6,9,11,7,0,8,0,8 +F,5,9,7,6,7,9,7,1,5,9,5,5,5,10,4,6 +E,4,9,5,7,3,3,6,6,12,7,7,15,0,8,7,7 +U,6,10,6,8,3,4,9,5,8,11,11,8,3,9,2,6 +M,15,15,15,8,7,9,11,6,4,4,6,10,11,13,2,6 +N,2,1,2,2,1,7,9,5,4,7,6,7,4,8,1,6 +J,4,5,6,6,5,7,7,4,6,6,6,7,3,9,8,9 +H,2,3,4,1,2,5,8,3,5,10,9,9,3,8,2,6 +Z,4,7,5,5,5,8,8,2,7,7,6,8,0,9,9,9 +X,7,11,8,6,4,8,8,2,8,11,6,7,4,12,4,8 +B,5,9,8,7,7,10,6,3,6,10,4,6,2,8,5,10 +S,4,10,5,8,5,7,6,8,6,7,8,10,2,10,8,7 +A,4,9,5,6,5,7,6,7,4,7,6,9,2,8,8,4 +P,1,0,1,0,0,5,10,6,1,9,6,5,1,9,2,8 +O,5,11,6,8,9,9,9,6,2,6,7,9,12,12,6,7 +Q,2,1,2,1,1,8,7,6,4,6,6,8,2,8,3,8 +P,1,1,2,1,1,5,11,8,2,9,6,4,1,9,3,8 +R,4,7,6,5,4,10,7,3,6,11,2,6,3,7,4,10 +J,4,8,3,11,3,8,8,3,3,12,5,5,3,8,6,10 +W,3,6,5,4,5,8,9,5,4,5,9,9,5,8,2,7 +T,6,8,7,6,4,7,10,1,8,11,9,5,2,10,4,4 +E,4,5,5,5,5,7,9,5,5,7,8,11,5,9,7,9 +Z,4,9,4,7,4,7,8,3,12,8,6,8,0,8,7,7 +G,4,5,6,4,5,7,8,5,3,7,7,8,7,11,7,8 +I,4,5,5,6,4,8,9,5,5,7,6,8,3,8,9,8 +W,10,13,10,8,5,5,9,2,2,7,10,7,9,12,1,6 +D,7,13,7,7,4,10,4,3,6,10,2,7,5,7,4,12 +M,3,3,5,2,3,7,6,3,4,9,7,9,7,5,1,8 +B,3,6,4,4,4,8,7,4,5,9,5,6,2,8,5,9 +V,3,4,4,3,1,4,12,2,3,9,11,7,2,10,1,7 +H,4,7,5,5,5,7,7,5,6,7,6,10,6,8,3,8 +L,2,4,4,3,2,6,4,1,8,8,2,11,0,7,2,8 +X,2,3,3,1,1,9,6,2,7,10,4,8,2,8,3,9 +R,6,8,8,6,7,9,8,3,7,9,3,8,4,5,4,11 +M,2,3,3,2,2,7,6,6,3,7,7,8,5,5,1,8 +I,1,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +T,5,8,6,7,6,6,9,5,7,8,8,8,4,13,9,6 +N,5,8,7,6,5,7,6,10,5,6,4,5,4,7,4,9 +A,4,5,6,4,4,8,8,3,4,6,7,7,5,8,4,5 +Q,6,9,5,4,3,11,3,4,5,11,3,10,3,8,5,13 +D,4,11,5,8,3,6,7,11,9,7,6,6,3,8,4,8 +A,3,10,5,8,4,12,3,2,2,9,2,8,2,6,2,8 +B,1,0,1,1,1,7,7,7,4,6,6,7,1,8,6,9 +U,5,5,6,3,3,4,8,5,8,10,9,9,3,9,2,6 +M,5,8,5,6,3,7,7,12,2,7,9,8,8,6,0,8 +R,2,4,4,3,2,9,7,3,5,10,4,7,2,7,3,10 +S,3,1,3,3,2,8,7,7,5,7,6,8,2,10,9,8 +P,5,7,7,5,4,6,11,7,2,11,5,3,1,10,3,8 +G,7,13,6,7,4,10,6,5,6,11,4,8,5,7,5,9 +F,5,8,7,6,7,7,8,6,4,8,6,8,4,10,8,11 +F,7,11,6,6,3,7,8,2,8,11,6,6,2,10,5,6 +K,9,13,8,7,4,7,7,3,7,9,9,9,6,11,3,7 +W,5,7,5,5,5,6,10,4,2,9,7,7,6,11,2,6 +P,4,9,5,6,2,4,12,9,2,10,6,4,1,10,4,8 +I,1,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +V,6,8,6,6,2,3,12,5,4,12,12,7,3,10,1,8 +E,6,10,9,8,6,6,8,4,9,11,9,9,2,9,5,6 +W,4,4,6,3,3,7,11,3,2,6,9,8,8,11,1,8 +F,1,0,1,0,0,3,11,4,2,11,8,6,0,8,2,8 +U,9,15,7,8,4,8,6,4,6,3,9,5,6,6,2,6 +X,3,3,5,2,2,9,7,2,8,11,4,7,2,7,3,8 +Q,4,9,5,11,5,9,8,8,2,4,7,11,4,9,6,9 +I,1,8,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +P,4,5,4,7,2,4,12,9,2,10,6,4,1,10,4,8 +R,9,11,7,6,4,8,7,5,5,10,4,9,6,5,6,11 +I,1,8,0,6,1,7,7,5,3,7,6,8,0,8,0,8 +P,2,1,3,2,2,6,9,5,5,9,7,4,1,9,4,7 +G,4,6,5,4,6,8,6,4,2,6,6,9,6,8,6,11 +Z,8,14,8,8,5,11,4,5,8,12,3,10,4,4,8,12 +K,2,1,3,2,2,5,7,4,7,7,6,11,3,8,4,10 +C,6,12,4,6,2,7,7,7,6,11,6,8,2,9,5,9 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +S,5,8,6,6,3,9,6,4,8,11,4,8,2,8,5,11 +W,7,11,10,8,15,10,5,5,2,7,6,7,12,10,3,4 +K,2,6,4,4,4,7,7,3,5,6,5,8,3,8,3,9 +R,3,5,5,4,3,9,7,4,5,9,4,7,3,7,4,10 +K,4,7,5,5,5,5,6,4,6,6,6,11,3,8,5,10 +C,6,10,7,8,3,4,9,6,8,12,10,11,2,9,3,6 +B,2,5,4,4,3,8,7,3,5,10,5,6,2,8,4,9 +U,9,11,10,8,7,5,7,5,9,9,6,9,8,9,6,1 +P,4,6,6,9,9,7,8,6,0,8,6,7,6,10,6,11 +Y,3,4,4,3,1,4,11,2,7,11,10,5,1,11,2,5 +H,3,4,5,6,4,7,4,5,2,6,4,6,4,6,7,7 +Z,3,10,4,8,4,7,8,3,12,9,6,8,0,8,7,7 +K,5,8,5,6,2,4,7,8,1,7,6,12,4,8,3,11 +U,5,10,8,7,10,9,7,4,4,6,7,8,8,8,6,7 +Z,3,7,5,5,4,8,8,3,7,7,6,8,1,8,10,9 +J,0,0,1,0,0,11,4,5,3,12,4,10,0,7,0,8 +J,4,7,5,5,4,7,6,4,5,8,6,7,5,6,4,6 +K,5,11,6,8,3,4,8,9,2,7,4,11,4,8,2,11 +Y,3,4,4,2,2,4,11,2,7,11,10,5,1,10,2,4 +L,4,7,5,5,3,7,4,2,8,7,2,8,1,6,3,8 +N,1,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +M,3,2,5,3,3,7,6,6,5,6,7,7,8,6,2,7 +H,5,7,7,9,6,10,10,3,2,7,7,8,3,10,8,9 +L,4,9,4,7,2,0,2,4,6,1,0,7,0,8,0,8 +W,4,8,6,6,3,8,8,4,1,7,8,8,8,9,0,8 +W,5,10,8,8,13,9,5,5,2,7,6,8,11,10,4,8 +G,4,9,3,4,2,8,6,5,2,9,6,8,3,10,7,7 +R,4,7,5,5,5,8,6,7,3,7,5,7,4,6,6,9 +W,3,1,5,3,3,7,11,2,2,7,9,8,7,11,0,8 +Q,5,10,7,8,6,8,4,8,5,6,4,8,3,8,3,8 +D,5,11,7,8,6,6,7,8,7,5,4,5,3,9,4,9 +H,5,11,6,8,6,6,7,7,6,7,6,11,3,8,3,9 +F,3,8,4,6,4,6,9,3,6,10,9,5,2,10,3,6 +V,4,11,6,8,2,7,8,4,3,7,14,8,3,9,0,8 +O,6,11,4,6,3,6,7,6,3,9,7,9,5,10,5,8 +C,2,4,3,3,1,6,8,7,7,9,8,13,1,10,4,10 +F,4,10,6,8,6,4,10,3,5,10,10,6,2,10,3,6 +C,1,3,2,1,1,6,8,6,6,8,7,13,1,9,3,10 +V,4,7,4,5,2,3,12,4,3,11,11,7,3,10,1,7 +U,7,9,7,6,4,5,7,7,9,8,7,9,5,11,5,2 +V,3,8,5,6,3,5,11,3,4,8,12,9,2,10,1,8 +Y,3,7,5,5,2,10,11,2,2,5,12,8,1,11,0,8 +X,1,0,1,0,0,7,7,3,4,7,6,8,2,8,4,8 +F,6,9,8,6,5,10,8,2,6,13,4,5,3,9,3,9 +N,2,4,3,3,2,7,8,5,4,7,6,6,5,9,2,6 +R,4,9,5,6,4,10,6,4,5,10,3,7,3,7,4,11 +B,3,6,5,4,4,8,7,6,6,7,6,5,2,8,7,10 +H,4,8,6,6,6,7,8,6,6,7,6,10,6,8,3,8 +V,3,4,5,3,1,7,12,3,3,7,11,8,2,10,1,8 +I,3,7,5,5,4,12,5,1,6,8,4,5,2,8,4,8 +J,5,8,7,10,7,8,8,4,5,7,6,8,4,6,9,8 +Q,7,11,6,6,3,8,5,4,9,10,4,9,3,6,9,9 +W,1,0,2,1,1,7,8,3,0,7,8,8,5,10,0,8 +E,4,10,4,7,4,3,8,5,9,7,6,13,0,8,7,9 +Z,3,7,5,5,4,9,11,6,4,6,5,7,2,8,6,4 +B,2,4,4,3,3,8,7,3,5,10,6,7,2,8,4,9 +G,6,10,6,7,5,5,7,6,5,9,8,11,2,9,4,9 +W,6,6,8,8,4,11,8,5,2,6,9,8,8,9,0,8 +D,6,9,8,8,9,7,7,4,7,7,5,8,4,7,7,5 +P,8,10,7,5,3,7,10,5,3,12,4,4,4,9,4,8 +Z,7,11,9,8,6,8,6,2,9,12,5,10,2,8,7,9 +R,4,8,5,6,4,10,6,3,6,10,3,7,3,7,4,11 +T,7,11,6,6,2,5,10,3,8,13,7,5,2,9,4,3 +M,5,7,7,5,4,11,6,3,5,9,2,6,8,6,2,9 +E,8,11,5,6,3,7,9,5,8,10,6,10,1,8,7,9 +F,4,6,5,8,2,0,15,5,4,13,10,5,0,8,2,5 +Y,8,7,6,11,5,9,8,5,5,4,11,6,4,11,5,7 +Y,2,2,3,3,1,7,10,1,7,7,11,8,1,11,2,8 +H,3,7,4,5,2,7,6,14,2,7,8,8,3,8,0,8 +W,4,7,6,5,5,7,11,1,2,7,8,8,6,12,1,8 +L,4,6,5,4,4,6,6,8,6,6,6,9,2,8,4,10 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +G,6,9,6,7,5,6,6,6,5,9,6,12,4,8,6,7 +H,5,9,7,7,6,8,8,7,6,7,5,6,3,8,3,6 +G,3,6,4,4,4,7,7,5,2,7,6,10,4,9,7,7 +P,4,9,5,6,2,3,12,8,1,10,6,3,1,10,4,8 +I,6,11,4,6,2,9,6,6,5,13,5,9,2,8,4,9 +G,5,9,5,7,4,6,6,7,6,8,7,12,3,7,5,8 +P,5,9,5,5,3,5,12,4,2,12,6,3,2,10,5,6 +Z,3,9,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +R,4,8,6,6,5,7,8,6,6,7,5,7,3,7,5,8 +N,2,1,3,2,2,7,8,5,5,7,7,6,5,9,1,5 +J,0,0,1,1,0,12,4,5,3,12,4,10,0,7,0,8 +U,6,7,6,5,4,3,9,5,7,10,9,9,3,9,2,6 +U,4,7,5,5,3,4,8,5,7,10,9,9,3,9,2,6 +J,3,6,5,4,1,8,5,4,7,15,7,13,0,7,1,7 +H,3,4,5,3,3,7,7,3,6,10,6,8,3,8,3,8 +S,4,6,5,4,3,9,7,4,8,11,5,8,2,8,5,9 +N,4,8,6,6,5,6,7,7,6,7,5,7,3,7,3,8 +X,4,8,5,6,4,8,7,3,8,5,6,7,3,9,7,7 +Y,4,7,4,5,2,3,10,3,6,11,12,7,2,11,2,6 +C,5,9,5,7,4,4,8,5,7,11,9,14,2,9,3,7 +A,3,6,4,4,2,10,2,2,3,8,2,8,2,6,2,8 +B,5,8,7,6,6,10,6,3,6,10,4,7,4,7,5,10 +M,3,6,4,4,4,8,5,10,0,6,8,8,6,5,0,8 +V,5,11,8,8,2,6,8,5,3,8,14,8,3,9,0,8 +D,4,5,5,4,4,7,7,7,7,7,6,5,2,8,3,7 +K,4,6,6,4,6,7,6,5,4,6,6,8,6,6,7,12 +B,2,3,3,2,2,8,7,3,5,10,5,7,2,8,4,10 +Y,3,6,4,4,2,8,10,2,6,5,12,8,2,11,2,8 +A,1,3,3,2,1,11,2,3,2,10,2,9,1,6,2,8 +S,3,4,4,7,2,8,7,6,8,4,6,8,0,8,9,7 +E,4,4,4,6,3,3,8,6,12,7,5,14,0,8,7,7 +C,3,4,4,3,1,5,9,5,7,12,9,10,1,10,3,7 +D,5,5,5,8,3,5,7,11,9,7,6,5,3,8,4,8 +E,3,4,5,3,2,6,8,2,9,11,7,8,2,8,4,6 +M,2,1,2,1,1,7,7,10,0,7,8,8,6,6,0,8 +S,3,2,4,3,3,8,7,7,5,7,6,8,3,9,9,8 +Z,4,8,5,6,4,9,9,6,4,7,5,8,3,8,10,7 +O,6,11,6,8,6,7,6,7,4,10,5,10,5,7,4,7 +S,6,10,8,9,9,9,8,4,5,7,7,8,5,10,9,11 +X,5,8,7,6,3,9,6,2,8,11,2,7,3,9,4,9 +W,3,4,4,3,3,7,11,2,2,7,9,8,6,11,1,8 +V,3,8,5,6,1,5,8,4,3,8,14,8,3,9,0,8 +Y,3,7,5,5,3,7,10,1,5,5,11,9,2,11,1,8 +C,4,7,6,5,4,7,8,8,6,5,7,13,4,7,4,8 +E,3,5,5,3,2,8,7,2,8,11,5,8,2,8,5,10 +W,4,6,6,4,8,9,7,5,2,7,6,8,9,11,2,7 +A,2,5,4,3,2,7,3,1,2,6,2,8,3,5,2,8 +M,7,9,9,6,8,8,7,2,5,9,6,8,8,6,2,8 +O,2,6,3,4,2,7,8,7,5,7,7,7,3,8,3,7 +Q,3,6,4,7,4,9,7,7,3,5,6,10,3,8,6,10 +L,2,5,3,4,2,4,4,5,7,2,2,6,1,6,1,6 +F,3,5,3,3,2,6,10,4,5,10,9,5,2,10,3,6 +P,4,9,4,6,2,3,13,8,2,11,7,3,1,10,4,8 +G,4,7,6,5,4,6,6,5,5,6,6,7,3,7,4,7 +Z,7,10,9,8,6,6,9,3,9,12,8,6,3,10,7,6 +F,1,0,1,1,0,3,12,4,2,11,9,6,0,8,2,7 +O,3,4,4,3,2,7,7,7,4,9,6,8,2,8,3,8 +U,9,12,8,6,3,5,4,5,5,4,8,7,6,7,2,7 +J,3,8,5,6,3,12,4,4,5,14,2,9,0,7,0,8 +X,4,6,6,6,5,6,7,2,5,7,7,9,3,9,8,8 +V,8,11,7,8,5,2,11,2,3,10,11,8,2,10,1,8 +U,5,5,6,4,3,4,8,5,8,10,9,9,3,9,2,5 +J,1,7,2,5,1,11,3,9,3,12,6,13,1,6,0,8 +T,3,6,5,8,1,5,14,1,6,9,11,7,0,8,0,8 +S,4,11,5,8,4,7,8,8,8,8,4,6,2,6,9,8 +R,4,5,6,4,4,8,8,4,5,9,5,7,3,6,4,10 +W,2,3,4,2,2,9,11,3,2,5,9,7,6,10,0,8 +D,5,11,7,8,6,11,6,2,7,11,3,7,4,7,4,9 +Q,2,1,2,2,1,9,6,7,4,6,6,9,3,8,3,8 +N,4,5,6,4,5,8,8,5,4,8,6,7,6,9,6,3 +L,1,3,2,2,1,7,4,1,7,7,2,10,0,7,2,8 +M,5,5,6,4,4,8,6,6,5,6,7,7,10,6,4,6 +L,3,8,3,6,1,0,1,5,6,0,0,7,0,8,0,8 +C,2,5,3,3,1,5,9,5,7,12,9,11,1,10,2,7 +B,4,10,5,7,5,8,7,6,7,6,6,6,2,8,7,10 +Y,2,7,4,4,1,6,10,2,2,7,12,8,1,11,0,8 +Z,2,6,3,4,3,8,7,5,9,7,7,7,1,8,7,8 +J,2,7,2,5,1,13,2,7,5,14,2,11,0,7,0,8 +A,3,4,5,6,2,5,4,3,2,5,1,7,3,7,2,7 +Q,2,3,3,4,2,8,7,5,2,8,7,9,2,9,3,9 +B,3,4,4,6,3,6,9,9,8,7,5,7,2,8,9,10 +Q,2,2,3,3,2,7,9,4,1,7,8,10,2,9,4,8 +G,3,9,5,6,2,7,6,8,7,6,6,8,2,7,6,11 +A,4,5,6,8,2,7,4,3,2,7,1,8,3,6,3,8 +J,2,3,3,4,1,14,2,6,5,13,2,10,0,8,0,8 +S,2,5,4,3,2,8,7,3,7,11,5,7,1,9,4,8 +T,5,6,5,4,2,6,10,2,9,11,9,4,1,10,3,4 +O,5,11,7,8,6,7,7,8,5,6,7,11,6,7,5,7 +A,2,4,4,3,2,11,2,2,2,9,2,9,2,6,2,8 +R,4,8,5,6,4,8,9,4,6,8,4,9,3,6,5,11 +G,6,9,7,7,8,8,6,4,2,6,6,10,7,7,7,13 +R,2,3,4,2,2,8,7,4,5,9,4,7,2,7,4,10 +B,2,5,4,4,3,7,7,3,5,10,6,6,2,8,5,8 +K,4,8,6,6,4,9,5,2,7,10,3,9,4,7,5,11 +J,4,7,6,5,2,5,9,3,6,15,7,9,1,6,1,7 +Y,3,7,5,5,2,8,10,2,6,4,11,9,2,12,2,7 +I,3,9,4,6,3,6,8,0,7,13,7,8,0,8,1,7 +W,9,12,8,6,4,1,8,4,2,11,12,9,7,10,0,7 +O,5,5,7,4,4,8,5,4,5,8,4,8,3,8,4,8 +I,7,8,9,9,8,7,8,4,5,7,7,7,4,7,10,10 +K,3,4,5,3,3,4,9,2,7,10,10,10,3,8,3,6 +D,2,5,4,4,3,9,6,4,6,10,4,6,2,8,3,8 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +D,5,7,7,6,6,6,7,5,7,7,6,9,4,5,6,5 +K,3,9,4,6,2,4,8,8,2,7,4,11,4,8,2,10 +G,6,8,8,7,9,7,9,6,2,7,7,8,7,11,7,7 +Q,5,7,6,9,6,10,11,6,3,3,8,12,3,10,7,10 +P,4,8,6,6,5,6,8,6,5,9,7,4,2,10,4,7 +A,8,15,6,8,4,8,3,3,2,7,4,11,5,5,4,7 +Q,3,5,3,6,3,8,8,5,2,8,8,10,3,8,5,8 +C,2,2,3,4,2,6,8,7,8,8,8,13,1,9,4,10 +I,1,1,1,3,1,7,7,1,6,7,6,8,0,8,2,8 +U,5,9,5,7,2,7,4,15,6,7,13,8,3,9,0,8 +O,4,9,5,6,4,8,7,8,5,9,5,8,3,8,3,8 +D,2,1,3,1,2,7,7,6,7,7,6,5,2,8,3,7 +N,7,11,6,6,3,9,11,5,4,4,6,10,6,10,2,6 +Y,2,3,4,5,1,8,10,2,3,6,12,8,1,11,0,8 +Z,3,8,4,6,2,7,7,4,13,9,6,8,0,8,8,8 +L,2,5,4,3,2,7,4,1,8,8,2,10,0,7,2,8 +V,4,9,7,6,3,6,12,3,4,8,12,8,3,10,1,8 +A,2,6,3,4,2,9,4,2,0,8,2,8,2,6,1,8 +N,6,10,9,8,4,8,8,3,5,10,4,6,6,9,1,6 +G,4,7,5,5,3,6,7,7,7,10,7,11,2,9,4,9 +A,2,1,4,1,1,8,4,2,0,7,2,8,2,6,2,8 +D,6,9,8,7,5,9,7,5,8,11,5,5,3,8,4,9 +U,5,9,7,8,6,7,7,4,4,6,5,8,8,7,2,8 +M,4,3,5,5,3,7,7,12,1,7,9,8,8,6,0,8 +J,2,6,3,4,1,13,2,8,4,13,4,13,1,6,0,8 +D,5,10,8,8,6,10,6,3,7,11,4,7,4,7,3,9 +X,2,4,4,2,2,7,7,1,8,10,6,8,2,8,3,7 +U,3,7,5,5,3,8,8,6,7,5,9,8,3,9,1,8 +X,5,11,6,6,4,6,9,2,6,10,10,8,4,14,4,6 +M,4,6,4,4,2,8,7,12,1,6,9,8,8,6,0,8 +L,3,6,4,4,2,6,4,3,7,6,2,8,1,6,2,7 +F,6,9,8,7,5,9,8,1,8,14,5,6,5,8,5,9 +G,4,11,5,8,3,7,6,9,8,6,6,11,2,8,5,11 +U,5,10,7,7,5,7,9,4,6,5,8,10,6,10,1,7 +C,8,15,6,8,5,5,10,4,5,9,7,8,3,9,9,9 +Q,3,6,5,6,4,8,8,6,4,5,8,9,3,8,5,9 +I,1,4,2,3,1,7,8,0,7,13,6,8,0,8,1,7 +F,2,8,3,5,1,1,11,4,6,11,11,9,0,8,2,6 +K,6,9,6,5,4,5,8,3,5,10,9,11,5,9,3,6 +D,4,8,6,6,4,7,9,7,7,11,6,4,4,8,5,9 +R,3,2,4,3,3,7,8,4,6,6,5,7,3,5,5,8 +O,7,10,5,5,3,5,7,6,4,10,7,9,5,10,5,7 +A,3,9,5,7,3,12,3,3,3,10,1,9,2,6,2,8 +U,5,10,7,8,6,8,7,7,6,7,7,9,6,8,4,7 +V,2,2,3,3,1,5,12,3,3,9,11,9,2,10,1,8 +B,1,1,2,1,1,7,7,7,5,6,6,7,1,8,7,9 +O,1,0,2,1,0,8,7,7,4,7,6,8,2,8,3,8 +P,4,8,6,12,11,8,8,5,0,8,7,7,6,10,5,8 +Y,8,8,7,11,5,9,9,3,3,5,11,5,4,10,7,8 +C,4,9,4,5,3,6,8,4,3,9,9,10,3,9,8,9 +P,2,5,4,4,2,7,10,4,4,12,5,3,1,10,2,8 +T,5,10,7,7,8,6,8,4,6,7,6,9,5,8,5,6 +T,6,8,6,6,3,4,12,3,8,12,10,4,1,10,2,5 +M,7,9,9,6,8,6,7,2,4,9,8,9,8,6,2,8 +D,2,4,3,2,2,7,7,6,6,7,7,5,2,8,2,7 +C,3,7,4,5,1,6,8,7,10,5,7,13,1,7,4,9 +S,6,11,8,8,10,9,8,5,4,9,5,7,5,10,13,8 +N,6,11,8,8,5,7,8,2,5,10,6,7,5,8,1,7 +X,5,7,8,5,4,11,5,2,8,10,1,7,2,7,3,10 +U,4,4,5,3,2,4,8,5,7,11,10,9,3,9,2,6 +L,4,7,6,6,5,7,7,4,5,7,6,7,3,9,8,11 +A,1,0,2,0,0,8,4,2,0,7,2,8,2,7,1,8 +J,4,8,3,11,3,6,9,3,3,13,5,6,3,8,6,9 +J,5,10,6,8,4,9,4,6,5,15,5,12,1,6,1,6 +I,3,11,4,8,2,7,7,0,8,13,6,8,0,8,1,8 +Q,7,8,9,12,11,9,9,7,0,6,7,10,9,14,6,7 +N,8,15,10,8,5,6,8,2,4,13,8,9,6,8,0,7 +B,3,6,5,4,3,9,7,4,6,10,5,7,2,8,5,10 +M,2,3,4,2,2,7,6,3,4,9,7,8,6,5,1,8 +M,1,0,2,0,1,7,6,9,0,7,8,8,5,6,0,8 +L,5,11,6,8,6,6,6,6,5,6,5,8,5,7,4,10 +W,9,12,9,7,6,8,8,4,4,6,9,6,11,8,3,6 +Y,3,2,5,4,2,6,10,1,8,8,11,8,1,11,2,8 +C,1,3,2,2,1,6,8,7,7,8,7,13,1,9,4,10 +P,4,8,6,11,10,8,9,4,0,8,7,6,8,10,6,8 +X,3,6,5,4,3,7,7,4,9,6,6,6,3,8,6,7 +Y,4,10,6,7,4,4,8,2,7,10,13,10,2,11,2,6 +G,2,4,3,2,2,6,7,5,6,9,7,10,1,8,4,9 +W,4,4,6,3,3,9,11,3,2,5,9,7,7,11,1,8 +U,5,10,8,8,4,5,9,7,8,8,10,10,3,9,1,8 +V,8,11,8,8,4,4,12,2,4,8,11,7,6,10,1,7 +S,1,0,2,1,1,8,7,4,7,5,6,7,0,8,7,8 +H,4,5,8,4,4,5,8,3,6,10,8,8,3,8,3,6 +H,4,10,4,7,2,7,7,15,1,7,6,8,3,8,0,8 +Q,7,9,7,11,8,7,9,5,2,7,9,11,4,8,8,9 +K,10,14,9,8,4,8,7,3,7,9,5,7,6,9,4,7 +S,2,6,3,4,2,8,7,7,6,8,7,9,2,9,9,8 +M,3,1,4,2,3,8,6,6,4,6,7,8,7,5,2,8 +R,9,10,7,6,4,7,8,5,5,9,4,9,7,5,6,11 +S,5,8,6,6,3,7,7,4,8,11,5,8,2,8,5,8 +Z,4,7,5,5,3,7,7,2,9,11,6,7,2,8,6,7 +T,3,8,4,6,4,6,11,3,6,8,11,8,2,12,1,7 +L,3,5,4,8,1,0,1,5,6,0,0,7,0,8,0,8 +C,2,4,3,3,1,4,9,5,6,11,9,11,1,9,2,8 +Y,3,5,5,4,2,6,10,1,8,8,12,8,1,11,2,7 +N,3,2,4,4,3,7,8,5,5,7,7,6,5,9,2,5 +T,7,9,6,5,2,7,8,3,8,13,6,7,2,8,5,5 +Y,6,8,6,6,4,3,9,2,6,10,11,7,2,11,2,5 +J,5,9,6,7,4,9,5,5,5,8,6,6,2,7,4,6 +U,5,10,6,8,5,6,9,5,7,6,9,9,3,9,1,8 +I,1,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +S,4,8,5,6,6,8,5,4,4,8,6,10,4,8,8,10 +K,6,9,7,4,4,10,6,4,5,11,2,7,5,7,3,9 +F,2,2,3,3,2,5,10,4,5,11,9,5,1,10,3,6 +F,3,8,3,5,1,1,11,5,6,11,10,9,0,8,3,6 +F,4,5,6,5,5,7,9,4,4,8,7,6,4,9,8,8 +X,6,9,8,7,7,7,6,3,5,6,6,10,4,6,11,9 +F,3,6,4,4,4,7,8,4,6,8,8,6,5,9,3,7 +Y,2,7,4,5,2,10,10,3,1,6,12,8,2,11,0,8 +G,2,4,3,3,2,6,7,6,6,6,6,11,2,9,4,9 +L,3,6,4,6,4,8,6,5,4,7,7,8,3,8,7,10 +Q,6,7,9,6,6,8,4,4,5,7,3,8,3,6,5,7 +J,5,7,4,10,3,8,8,3,3,12,4,5,2,8,7,9 +L,6,11,7,8,7,6,6,9,5,6,6,8,3,7,5,12 +A,6,9,9,8,8,8,7,3,5,7,7,7,5,8,4,5 +G,4,4,5,6,2,7,6,7,8,6,6,9,2,8,6,11 +N,5,8,7,6,4,10,8,2,5,10,2,5,5,9,1,7 +K,6,7,8,5,4,4,8,3,6,10,10,11,4,7,3,6 +U,9,15,8,8,6,7,6,5,5,6,7,8,5,6,3,7 +Z,4,9,5,7,2,7,7,4,14,9,6,8,0,8,8,8 +W,3,4,4,3,2,3,11,2,2,10,10,8,5,10,1,8 +Y,3,9,5,6,2,7,11,0,4,7,11,8,0,10,0,8 +F,3,6,4,4,3,5,10,3,6,10,9,5,2,10,3,6 +V,7,10,7,8,4,2,11,3,4,11,12,8,2,10,1,8 +L,3,8,4,6,4,5,5,3,8,3,2,7,1,6,2,5 +X,5,11,8,8,6,8,7,3,9,5,6,8,3,8,7,8 +D,4,11,6,8,6,9,7,4,5,10,4,5,3,8,3,8 +S,4,9,5,7,4,7,8,8,7,8,5,6,2,8,9,8 +Y,3,8,4,6,2,5,10,1,3,8,12,8,1,11,0,8 +S,3,7,4,5,3,7,8,7,7,8,5,6,2,8,9,8 +N,5,9,7,6,5,8,8,6,6,6,6,4,8,10,5,6 +W,2,0,3,1,1,7,8,4,0,7,8,8,7,9,0,8 +F,5,8,7,6,3,7,10,3,6,14,6,4,2,10,3,7 +U,5,11,5,8,5,8,6,13,4,7,12,8,3,9,0,8 +C,5,11,5,8,4,4,7,5,6,11,9,14,2,10,4,7 +Z,5,10,6,8,6,8,7,5,10,7,6,7,1,8,7,8 +T,3,9,5,6,3,8,14,1,5,7,10,8,0,8,0,8 +Q,4,10,6,9,3,8,6,9,6,6,6,8,3,8,5,9 +P,8,12,7,6,3,7,10,6,5,14,5,4,4,10,4,8 +L,3,6,4,4,2,5,3,3,9,5,2,8,1,6,2,6 +W,5,9,7,6,5,11,11,3,2,5,9,7,9,12,2,7 +R,3,6,5,5,5,7,8,3,3,7,5,8,6,8,5,7 +T,4,8,6,6,4,9,11,2,7,6,11,8,1,11,1,8 +S,2,3,3,2,1,8,8,2,6,10,6,7,1,8,5,8 +O,4,8,4,6,4,8,7,7,3,9,6,9,3,8,2,8 +T,4,9,6,7,4,6,11,1,9,8,11,8,0,10,1,7 +B,2,6,3,4,2,6,8,9,6,7,5,7,2,8,8,9 +D,4,9,6,7,4,9,7,4,7,11,5,6,3,7,3,8 +F,2,3,4,1,1,5,12,4,4,13,7,4,1,9,1,7 +U,4,5,5,4,3,5,8,6,8,10,8,9,3,9,3,6 +O,5,11,6,8,3,8,7,9,8,7,6,8,3,8,4,8 +Y,5,10,7,7,4,7,10,2,7,6,12,9,2,11,2,8 +Z,3,4,4,6,3,11,5,3,4,9,3,7,1,7,6,9 +N,5,8,7,6,5,8,9,6,5,7,6,5,7,8,3,8 +T,3,5,4,6,1,5,14,1,6,9,11,7,0,8,0,8 +I,3,8,5,6,5,10,7,2,6,9,4,5,3,8,5,7 +A,4,9,6,8,6,7,8,2,4,7,7,8,8,6,4,7 +O,5,10,6,8,5,7,6,7,4,9,6,10,5,8,4,7 +X,2,4,4,3,2,7,8,1,8,10,6,8,2,8,3,7 +B,3,7,5,5,5,8,8,4,5,7,5,6,4,8,5,8 +I,1,8,2,6,2,7,7,0,7,7,6,8,0,8,2,8 +Z,4,7,4,5,4,7,8,5,9,7,7,9,1,9,7,8 +V,6,7,5,5,3,3,11,2,3,9,11,8,3,11,1,7 +E,2,1,2,2,2,7,7,5,6,7,6,8,2,8,5,10 +J,4,5,6,6,5,8,8,4,6,7,6,8,3,10,8,8 +Q,3,8,5,9,5,9,9,6,3,4,8,11,3,9,7,10 +G,4,5,6,4,5,8,9,5,3,7,7,10,6,10,6,9 +A,4,9,7,7,5,7,2,1,2,5,2,7,4,6,5,7 +R,5,11,5,8,6,5,10,8,3,7,4,8,2,7,6,11 +E,3,7,4,5,3,3,7,5,8,7,6,13,0,8,7,9 +G,5,8,6,7,7,7,9,5,2,7,7,8,6,11,7,8 +G,3,7,4,5,2,8,7,8,7,6,6,9,2,7,6,11 +T,5,10,6,8,4,6,12,2,9,8,12,8,1,11,1,7 +D,5,11,7,8,11,10,8,5,6,7,5,6,5,5,10,5 +H,2,6,2,4,2,7,8,12,1,7,5,8,3,8,0,8 +P,7,10,9,8,7,6,11,5,4,12,5,3,1,10,4,9 +G,5,10,6,8,4,6,6,8,7,8,5,13,2,9,5,9 +G,4,7,5,5,3,6,6,6,7,6,5,9,2,10,4,7 +W,4,8,6,6,4,5,8,5,1,8,10,8,6,11,0,8 +K,4,9,6,6,5,5,7,1,6,9,7,10,3,8,3,8 +M,5,2,6,4,4,8,6,6,4,7,7,8,8,6,2,7 +A,1,0,2,1,0,7,4,2,0,7,2,8,2,7,1,8 +G,2,3,3,1,2,7,7,6,6,6,6,9,2,9,4,9 +S,3,7,4,5,3,9,8,5,8,5,5,5,0,7,8,8 +T,6,10,5,6,2,5,11,2,7,12,7,5,2,9,4,4 +S,2,4,3,3,2,8,7,7,5,7,7,8,2,9,9,8 +R,4,10,4,8,5,5,10,7,4,7,4,9,2,7,5,11 +J,5,10,7,8,5,9,4,4,6,8,5,6,2,8,4,6 +T,5,7,6,5,6,7,8,5,5,6,8,9,6,9,6,5 +G,3,6,4,4,2,7,7,7,7,7,5,12,2,9,4,9 +I,4,9,5,6,3,8,6,1,6,7,6,7,0,9,4,7 +Q,6,7,8,11,8,10,14,5,1,3,8,12,5,15,5,10 +I,3,10,4,8,2,6,8,0,8,13,7,8,0,8,1,7 +U,4,7,6,6,5,7,6,4,4,6,6,8,7,8,1,8 +E,5,8,7,6,7,7,7,3,6,7,7,11,4,10,8,9 +S,3,7,4,5,2,7,7,5,8,5,6,8,0,8,9,8 +E,2,5,3,4,3,7,7,5,7,7,7,9,2,8,5,10 +C,3,4,4,3,2,6,8,7,8,8,8,13,1,9,4,10 +P,3,6,4,4,2,4,14,8,1,11,6,3,0,10,4,8 +C,6,12,5,6,4,6,8,4,4,10,8,9,4,9,9,9 +E,2,6,3,4,3,7,7,4,7,7,5,8,3,8,5,10 +P,4,7,5,5,3,9,8,3,5,12,4,4,2,9,3,9 +M,4,4,4,6,3,8,7,12,1,6,9,8,8,6,0,8 +I,7,13,5,7,3,9,7,6,4,13,4,9,3,8,5,10 +R,3,8,4,5,2,6,10,9,4,7,4,8,3,7,5,11 +H,3,1,4,2,3,7,7,6,6,7,6,8,3,8,3,8 +N,5,8,8,6,4,7,8,3,5,10,6,7,5,8,1,7 +W,4,5,6,7,4,8,8,4,2,7,8,8,9,9,0,8 +L,5,9,5,7,2,0,1,5,6,0,1,6,0,8,0,8 +J,4,7,6,5,3,7,5,5,4,14,9,14,1,6,1,7 +S,2,3,3,2,1,8,7,2,7,10,5,8,1,8,4,8 +M,7,11,9,8,9,9,7,2,4,9,6,7,8,6,2,8 +C,6,11,6,8,3,4,8,6,8,12,10,12,2,9,3,7 +L,1,3,2,2,1,7,4,2,7,7,2,9,0,7,2,8 +D,3,8,4,6,2,5,7,10,8,6,5,5,3,8,4,8 +P,10,15,9,8,6,7,10,4,6,13,5,3,4,9,7,5 +U,2,6,3,4,1,7,5,14,5,7,12,8,3,9,0,8 +T,4,5,6,4,5,7,9,4,8,7,7,8,3,10,7,7 +D,6,10,8,7,5,8,7,4,7,11,5,6,3,8,3,8 +F,3,6,5,4,3,7,9,3,5,12,6,5,2,9,2,7 +E,3,7,3,5,2,3,6,6,11,7,7,15,0,8,7,7 +B,2,3,3,1,2,8,7,2,5,10,5,6,2,8,4,9 +H,7,9,10,6,8,8,7,3,6,10,5,8,3,8,3,8 +M,4,8,4,6,3,7,7,12,1,7,9,8,8,6,0,8 +K,3,7,5,5,5,6,6,3,4,6,6,9,5,8,7,9 +D,4,8,4,6,2,5,6,10,8,5,4,5,3,8,4,8 +K,4,10,6,8,7,5,5,5,3,6,6,9,3,5,8,9 +L,4,9,5,7,4,3,3,5,7,1,0,7,0,6,0,6 +W,5,5,7,8,4,7,8,5,2,7,8,8,9,9,0,8 +B,3,9,5,7,5,8,7,4,7,6,6,5,6,8,5,9 +V,3,3,4,2,1,4,12,3,3,10,11,7,2,11,1,8 +D,3,4,5,3,3,7,7,5,6,10,5,6,3,7,4,9 +K,3,6,5,5,4,11,5,3,3,10,3,8,4,6,6,12 +Q,1,0,1,1,0,8,7,7,3,6,6,9,2,8,3,8 +Y,4,8,6,6,6,8,7,5,4,7,8,8,6,8,7,4 +L,8,15,8,9,5,7,4,3,4,12,7,11,4,7,7,8 +S,2,4,3,3,2,8,7,3,7,10,5,8,1,9,4,8 +V,1,3,2,2,1,7,12,3,3,8,11,8,2,11,1,8 +Z,3,5,6,4,3,7,7,2,10,12,6,8,1,8,5,7 +C,7,13,5,8,4,7,9,4,4,9,7,9,3,9,8,11 +A,5,11,8,8,5,8,2,2,3,6,1,7,3,7,4,7 +R,2,4,4,3,2,8,7,3,5,10,4,7,2,7,3,10 +B,4,5,4,8,4,6,7,9,7,7,6,7,2,8,9,10 +V,4,5,5,4,2,4,12,3,3,10,11,7,2,10,1,8 +Y,5,8,5,6,2,4,11,3,8,12,11,4,1,10,2,4 +M,5,5,5,7,4,8,7,12,2,7,9,8,8,6,0,8 +M,6,9,7,4,4,7,3,3,2,8,4,10,7,3,1,9 +Y,5,10,8,8,3,6,10,1,9,9,12,8,1,11,2,7 +U,2,4,3,2,1,7,8,6,6,7,9,8,3,9,1,8 +Z,4,8,6,6,4,8,6,2,9,11,4,10,2,7,7,9 +F,7,11,10,8,7,7,9,3,6,12,7,6,2,9,2,7 +A,4,9,5,7,4,7,5,3,0,7,1,8,2,7,1,8 +U,4,9,5,7,2,8,5,14,5,6,14,8,3,9,0,8 +F,5,11,5,8,2,1,13,5,4,12,10,6,0,8,2,5 +W,7,10,7,5,4,5,8,1,3,8,10,8,9,11,2,6 +S,4,7,5,5,3,9,7,5,9,11,3,7,2,6,5,11 +Y,5,9,8,6,4,6,9,1,7,7,12,9,1,11,2,8 +A,2,4,4,6,2,8,3,3,3,7,1,8,3,6,3,8 +K,6,10,8,8,6,6,8,5,7,6,5,10,4,8,5,9 +I,4,6,6,7,5,9,8,5,6,7,6,8,3,9,8,8 +T,6,11,8,9,6,6,7,8,7,8,9,7,3,9,6,10 +M,10,12,10,7,5,11,12,6,4,4,7,9,8,12,2,7 +U,8,12,7,6,4,5,6,5,4,7,7,10,7,8,4,10 +X,2,1,3,3,2,8,7,3,9,6,6,6,2,8,5,8 +P,8,9,6,4,3,8,8,5,4,11,4,6,5,9,4,8 +B,4,8,5,6,5,10,6,3,6,10,4,7,3,8,4,11 +E,4,6,6,4,3,6,8,2,9,11,8,9,2,8,4,7 +H,3,3,4,4,2,7,8,14,1,7,5,8,3,8,0,8 +V,1,1,2,1,0,7,9,4,2,7,13,8,2,10,0,8 +I,0,6,0,4,0,7,7,5,3,7,6,8,0,8,0,8 +D,5,10,7,7,5,11,6,3,8,12,3,7,6,8,4,9 +W,5,7,5,5,4,6,10,5,2,9,6,6,6,12,2,5 +X,5,9,5,5,2,11,6,3,7,9,3,7,3,9,4,10 +Q,4,4,5,5,3,9,10,7,6,5,8,9,3,8,5,9 +E,6,11,8,8,9,6,6,3,6,8,7,12,5,9,9,8 +Y,3,4,5,6,1,8,10,2,2,6,13,8,2,11,0,8 +T,1,0,1,0,0,7,13,1,4,7,10,8,0,8,0,8 +M,5,10,7,5,4,12,3,5,2,11,1,10,7,2,1,8 +L,5,10,7,8,5,5,4,1,8,7,2,11,0,7,3,7 +C,5,9,6,7,4,5,7,6,9,7,6,13,1,8,4,9 +L,1,0,1,0,0,2,2,5,4,1,3,5,0,8,0,8 +P,5,11,7,8,6,7,7,7,5,8,7,8,2,9,7,9 +B,5,9,8,7,6,11,6,2,7,11,3,7,4,6,6,12 +B,4,8,6,6,5,8,7,5,6,9,6,6,2,8,7,8 +F,5,6,6,7,7,7,9,5,6,8,5,7,5,8,10,5 +T,3,10,5,7,1,7,15,0,6,7,11,8,0,8,0,8 +Z,2,2,3,3,2,7,7,5,9,6,6,8,1,8,7,8 +K,4,8,5,6,4,6,7,4,7,6,5,8,7,8,5,9 +K,5,6,7,6,6,10,6,3,4,10,3,8,5,6,6,12 +M,4,7,6,5,8,11,7,3,4,8,4,7,5,5,2,6 +Z,6,7,4,11,4,8,7,4,3,11,6,7,3,9,10,6 +G,5,9,7,8,8,8,6,6,4,7,6,9,10,10,9,9 +E,3,9,4,7,2,3,8,6,10,7,6,15,0,8,7,7 +G,5,9,5,6,3,6,7,7,7,10,7,10,2,9,4,9 +C,5,9,7,8,8,5,6,4,5,7,6,11,5,11,8,11 +F,5,7,7,5,4,8,9,2,6,14,5,4,3,8,3,7 +W,8,9,11,8,12,7,8,5,6,7,6,8,10,7,9,6 +S,5,12,4,6,2,9,3,4,4,9,2,8,3,6,4,8 +W,5,8,7,6,5,8,8,4,1,7,9,8,7,11,0,8 +N,5,9,8,6,4,11,6,4,5,10,1,4,5,8,1,7 +E,5,9,5,6,3,3,8,6,11,7,6,14,0,8,8,7 +M,5,10,8,8,7,8,6,6,5,6,8,8,8,6,2,7 +M,5,6,8,4,4,7,6,3,5,9,7,8,7,5,2,8 +T,1,0,2,0,0,7,14,2,3,7,10,8,0,8,0,8 +A,3,7,5,5,3,10,3,2,2,8,2,10,3,5,2,8 +V,1,1,2,2,1,7,12,2,2,7,11,8,2,11,0,8 +L,3,6,4,4,2,5,3,6,9,2,2,4,1,6,1,5 +G,5,9,7,8,8,8,8,6,3,7,6,9,8,11,9,11 +I,3,9,4,7,3,7,7,0,6,13,6,8,0,8,1,8 +X,5,7,7,5,6,8,6,2,5,6,7,7,3,10,10,8 +I,3,11,4,8,2,7,7,0,8,14,6,8,0,8,1,8 +J,2,7,2,5,1,12,3,9,4,13,4,12,1,6,0,8 +K,4,3,4,5,1,4,7,8,1,7,6,11,3,8,3,11 +X,5,10,7,7,6,8,7,3,5,6,7,6,4,10,11,8 +S,3,4,5,3,2,8,6,3,7,10,4,8,1,8,4,10 +L,1,0,1,0,0,2,1,6,4,0,3,4,0,8,0,8 +Y,2,1,4,2,1,7,11,1,7,7,11,8,1,11,2,8 +X,5,11,8,8,5,11,7,1,8,10,2,6,4,9,4,11 +Q,3,6,4,8,4,8,8,5,2,8,8,10,3,9,5,8 +R,5,5,6,8,3,6,11,9,4,7,3,8,3,7,6,11 +E,4,4,4,6,3,3,8,6,11,7,5,14,0,8,7,7 +N,4,4,5,6,2,7,7,14,2,4,6,8,6,8,0,8 +B,3,6,5,4,5,9,7,4,3,6,7,7,5,10,7,7 +G,5,9,7,6,8,8,8,5,2,6,6,9,7,8,6,11 +K,4,4,6,3,3,6,7,2,7,10,7,10,3,8,3,7 +E,3,8,5,6,4,7,7,5,8,7,6,9,6,8,6,9 +O,5,7,7,6,5,7,5,5,5,9,5,9,3,6,5,6 +Z,5,9,6,7,4,6,8,3,10,12,7,8,1,9,6,7 +L,6,10,6,5,3,7,5,4,4,12,9,12,3,9,6,9 +G,3,7,5,5,5,9,7,5,2,7,6,10,5,9,4,10 +P,4,5,5,7,6,9,7,4,3,6,7,8,6,11,5,4 +Y,4,7,4,5,2,4,10,2,9,11,10,5,0,10,3,4 +S,5,10,8,8,9,6,7,3,2,8,6,6,3,8,11,2 +Y,5,10,6,8,6,8,7,6,5,5,9,8,3,9,10,7 +M,7,8,10,6,6,9,6,2,5,9,6,8,8,6,2,8 +J,2,5,3,3,1,10,6,2,6,12,4,8,1,6,1,7 +I,1,5,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +U,8,13,8,7,5,7,6,5,5,7,8,8,5,7,3,8 +H,4,6,6,4,3,7,7,3,6,10,6,8,3,8,3,7 +E,2,4,4,3,2,7,7,2,8,11,6,9,2,8,4,8 +N,4,9,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +D,2,3,3,2,2,9,6,3,5,10,4,6,2,8,2,8 +I,4,7,5,5,3,8,6,2,7,7,6,7,0,9,4,7 +B,6,10,9,8,9,8,7,6,6,9,7,6,6,10,9,10 +J,5,9,3,12,3,10,7,2,3,11,3,5,3,8,6,9 +E,4,7,5,5,4,7,7,5,9,7,7,9,3,8,6,8 +J,5,9,7,7,4,8,7,3,6,15,5,8,0,6,1,7 +M,3,1,4,3,3,8,6,6,4,6,7,8,7,5,2,7 +O,2,3,3,1,1,8,7,7,5,7,6,8,2,8,3,8 +U,8,11,7,6,4,7,5,5,4,6,8,8,5,6,3,8 +W,7,7,7,5,4,2,10,3,3,11,11,8,7,10,2,6 +O,3,6,4,4,2,7,7,7,5,7,5,9,3,8,3,7 +S,2,8,3,6,3,7,7,5,7,5,6,7,0,8,8,8 +F,4,7,5,5,5,6,9,2,6,10,9,6,5,10,3,7 +N,6,10,5,6,3,7,9,4,5,4,5,10,5,10,2,7 +H,3,5,5,3,3,7,8,6,7,7,5,8,3,8,3,8 +T,5,10,5,5,2,6,9,2,7,12,7,5,2,10,3,5 +G,3,2,5,4,3,7,6,6,6,6,6,10,2,9,4,9 +Y,3,7,4,5,1,7,10,2,2,7,13,8,1,11,0,8 +Z,1,0,2,1,0,7,7,2,10,9,6,8,0,8,6,8 +L,2,4,3,3,1,7,4,1,7,9,3,10,0,6,3,8 +O,4,7,5,5,4,7,9,8,4,7,8,8,3,8,3,8 +Z,5,10,7,8,4,7,7,3,11,11,6,8,1,8,7,8 +E,6,9,8,6,6,8,7,1,8,11,5,8,3,8,5,10 +O,3,6,4,4,2,7,7,7,5,10,6,8,3,8,3,8 +H,3,6,3,4,3,8,8,12,1,7,5,8,3,8,0,8 +Q,5,8,6,9,7,8,7,6,3,8,8,10,3,9,5,8 +H,6,11,8,8,9,6,8,6,7,7,6,10,6,8,4,8 +S,4,8,5,6,4,7,7,5,8,5,6,10,1,10,9,9 +Y,4,6,5,8,6,10,12,5,4,6,7,7,5,10,8,5 +A,3,8,5,5,2,10,5,3,1,8,1,9,2,7,2,9 +G,2,0,2,1,1,8,6,6,6,6,5,9,1,7,5,10 +C,4,7,5,5,2,6,9,7,7,13,8,7,2,11,2,6 +N,3,5,5,3,2,5,9,3,4,10,8,8,5,8,0,7 +S,5,6,6,8,3,8,7,6,9,4,6,8,0,8,9,8 +O,6,10,7,8,5,8,7,8,6,10,5,9,4,9,5,6 +Z,3,5,4,8,3,12,4,3,5,10,2,7,2,7,5,12 +R,4,10,6,7,5,7,8,6,5,8,5,9,3,6,6,11 +D,4,9,5,7,6,7,8,6,6,8,7,5,3,8,3,7 +I,4,5,5,6,4,8,9,4,4,7,6,8,3,7,8,7 +Q,5,8,6,9,6,8,7,6,3,9,8,10,3,8,6,8 +O,6,8,8,6,5,7,7,8,4,7,6,8,3,8,3,7 +P,6,11,6,8,3,4,13,8,1,10,6,3,1,10,4,8 +D,2,2,3,3,2,8,7,6,7,6,6,4,2,8,3,6 +L,2,6,4,4,2,6,4,2,10,7,1,10,0,7,3,7 +N,6,9,8,8,9,7,8,4,4,7,5,7,7,9,6,7 +D,2,3,4,1,2,10,6,3,6,10,3,6,2,8,2,9 +G,3,7,4,5,3,7,6,7,7,7,4,11,1,8,5,11 +N,3,7,3,5,3,8,8,12,1,6,6,8,5,9,0,8 +I,1,1,0,2,0,7,7,1,7,7,6,8,0,8,2,8 +X,4,6,5,8,2,7,7,5,4,7,6,8,3,8,4,8 +B,5,5,5,8,4,6,8,9,7,7,5,7,2,8,9,10 +C,2,3,2,2,1,4,8,4,7,10,9,12,1,8,2,7 +I,0,0,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +P,4,8,6,6,4,4,12,6,4,11,8,3,0,10,4,7 +Y,2,2,4,3,2,7,11,1,7,7,11,8,1,11,2,8 +S,4,10,4,8,2,8,7,6,9,4,6,6,0,8,9,8 +G,3,6,4,4,2,6,7,6,6,10,7,10,2,10,4,9 +L,2,4,4,3,2,6,4,1,9,7,2,10,0,7,2,8 +B,2,6,3,4,2,7,7,9,6,7,6,7,2,8,8,9 +C,5,10,6,8,5,5,7,8,7,11,8,13,3,12,5,8 +X,2,7,3,4,1,7,7,4,4,7,6,8,3,8,4,8 +A,4,11,6,8,2,8,5,3,1,7,0,8,3,7,2,8 +W,7,8,7,6,7,4,10,2,3,9,8,8,7,12,2,6 +W,7,10,7,7,6,4,10,2,3,9,9,8,7,11,2,6 +M,5,11,8,8,11,10,7,3,4,8,4,7,12,6,7,4 +S,6,11,7,8,4,7,8,4,8,11,8,7,2,10,5,6 +D,2,3,3,2,2,7,7,6,6,7,6,6,5,8,2,7 +Y,8,11,7,6,4,8,6,4,6,9,6,5,3,10,6,5 +Q,2,2,3,4,2,8,9,5,2,5,8,10,2,9,5,9 +B,6,9,8,7,7,7,8,6,5,6,5,6,4,9,7,6 +F,6,11,8,8,6,6,10,1,6,13,7,6,2,10,2,7 +R,3,5,5,4,3,9,7,3,5,10,4,6,3,7,4,9 +J,4,9,4,7,2,8,9,2,4,13,4,5,1,8,6,8 +W,7,7,10,6,10,8,7,5,5,7,5,8,10,9,8,7 +N,5,7,7,5,6,6,8,3,4,8,7,9,6,9,5,5 +U,5,11,7,8,10,9,6,4,4,6,7,7,8,7,6,5 +N,4,6,7,4,3,9,9,2,5,11,3,5,6,9,2,7 +V,4,10,6,7,3,7,9,3,2,6,12,8,3,10,0,8 +D,4,7,5,5,4,8,8,4,5,10,6,4,3,8,3,7 +A,3,6,5,4,2,11,3,2,2,9,2,9,2,6,3,9 +H,2,1,3,2,2,7,7,6,6,7,6,9,3,9,3,8 +F,2,3,3,2,1,6,11,3,5,12,7,4,1,9,1,7 +A,3,9,5,6,4,12,2,2,2,10,2,9,2,6,3,8 +O,4,10,6,8,4,8,6,9,5,7,5,8,3,8,3,8 +I,2,7,3,5,2,7,9,0,6,13,6,7,0,8,1,7 +D,2,4,4,3,2,8,7,4,6,10,4,6,2,8,3,8 +Y,5,6,6,4,3,3,10,2,7,11,11,6,1,10,2,4 +H,6,9,6,4,3,5,9,4,6,9,7,9,5,7,3,7 +K,5,9,7,6,5,9,6,1,6,10,4,8,3,8,4,10 +K,7,11,10,8,6,8,6,2,7,10,4,9,5,6,5,8 +I,0,6,0,4,0,7,7,5,3,7,6,8,0,8,0,8 +L,3,6,4,4,3,9,4,1,6,9,2,9,1,6,2,9 +D,5,10,5,5,3,12,4,3,5,11,2,7,4,7,3,12 +Q,7,10,9,8,8,8,3,8,4,6,6,8,4,8,6,9 +N,2,0,2,1,1,7,7,12,1,5,6,8,5,8,0,8 +Q,6,9,6,11,6,7,7,8,5,9,8,8,4,9,7,9 +L,3,7,5,5,2,6,4,1,9,8,2,11,0,8,2,8 +O,3,1,4,2,2,7,8,7,5,7,7,8,2,8,3,8 +F,2,3,2,1,1,5,11,4,4,10,8,5,1,9,3,7 +Y,1,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +K,2,1,2,1,0,5,7,8,1,7,6,11,3,8,2,11 +I,1,9,2,6,3,8,7,0,7,7,6,7,0,8,2,7 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +G,2,4,3,3,2,6,7,5,5,9,7,10,2,9,4,10 +H,3,3,5,1,2,6,7,3,6,10,9,9,3,8,3,6 +Q,2,5,3,7,4,8,6,7,3,7,5,11,2,9,4,10 +U,4,8,6,6,3,4,8,7,7,9,11,11,3,9,0,8 +D,2,6,4,4,3,7,7,5,6,7,6,5,3,8,3,7 +D,5,11,7,8,11,8,8,5,5,7,6,6,7,8,8,6 +M,3,6,5,4,5,7,7,6,4,7,5,8,5,9,6,8 +X,3,1,4,3,2,7,8,3,9,6,6,7,3,9,6,6 +M,5,9,7,6,7,7,7,2,4,9,8,9,7,6,2,8 +B,4,9,5,7,5,8,6,7,7,6,6,6,2,8,7,10 +R,3,8,4,5,2,5,11,8,3,7,3,8,3,7,6,11 +S,2,6,3,4,3,8,7,7,6,7,8,9,2,10,8,8 +A,4,10,7,7,2,8,7,3,0,7,0,8,3,7,2,8 +J,3,8,4,6,2,13,3,6,4,13,3,11,0,7,0,8 +D,4,9,4,7,3,6,7,11,9,6,5,6,3,8,4,8 +Y,3,10,5,7,3,7,10,1,7,6,12,8,1,11,2,8 +G,3,8,5,6,2,7,5,7,8,6,5,10,1,8,6,11 +K,5,7,7,5,4,3,9,3,6,10,11,11,3,8,3,6 +Z,3,8,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +P,3,7,5,5,2,6,11,4,4,13,5,2,0,10,3,9 +R,5,8,7,6,6,9,7,4,5,10,4,6,3,7,4,10 +F,4,5,5,6,5,7,9,4,4,7,6,7,4,9,8,8 +G,4,8,5,6,2,8,7,8,8,6,6,9,2,7,6,11 +Q,5,7,6,8,5,9,8,7,2,4,7,10,3,8,6,10 +E,4,7,6,5,5,8,5,6,3,7,6,9,4,8,8,10 +T,8,11,7,6,3,5,10,3,9,13,7,5,2,9,3,4 +M,5,11,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +B,9,15,7,9,5,7,7,5,5,10,6,8,6,6,9,10 +Q,2,2,3,3,2,8,8,6,2,5,6,9,2,9,5,10 +E,5,9,4,4,2,7,8,4,7,9,6,9,1,9,7,9 +Z,3,6,4,4,2,7,7,4,14,9,6,8,0,8,8,8 +W,5,10,7,8,8,7,9,6,4,8,8,7,10,9,4,10 +X,3,4,5,3,2,8,7,4,9,6,6,9,4,7,7,9 +O,9,15,7,8,4,8,6,5,6,8,3,8,6,9,5,8 +W,7,7,7,5,5,4,11,3,3,9,9,7,7,11,2,6 +Z,7,11,9,8,5,8,6,3,10,12,4,10,2,9,6,10 +Y,10,10,8,14,6,9,6,5,5,4,12,6,5,10,6,7 +M,6,10,9,7,7,10,6,2,5,9,3,6,9,8,2,9 +X,3,9,5,7,4,7,7,3,8,5,7,9,3,8,6,8 +N,3,7,5,5,4,7,9,6,4,7,6,7,6,8,3,8 +H,2,3,4,1,2,8,8,3,5,10,5,7,3,8,3,7 +N,5,9,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +X,5,11,6,8,4,8,7,4,4,7,6,8,3,8,4,8 +A,5,11,7,8,7,8,5,7,4,8,6,8,6,8,7,4 +P,3,4,3,3,2,5,10,4,4,10,8,4,1,10,3,7 +F,2,1,2,3,2,5,10,4,5,10,9,6,1,10,3,7 +G,3,2,4,4,3,6,7,6,6,7,6,10,3,7,4,9 +P,1,1,2,1,1,5,10,8,3,9,6,5,1,9,3,8 +T,2,6,3,4,2,7,12,3,7,7,11,8,1,11,1,7 +Y,7,9,7,7,4,4,9,2,7,10,11,6,2,12,3,4 +R,3,3,3,4,2,5,10,8,4,7,4,8,2,7,5,11 +N,3,8,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +S,4,10,5,8,5,7,7,5,8,5,6,8,0,8,9,7 +P,4,8,6,6,3,6,11,3,6,14,7,3,0,9,2,8 +F,4,10,6,7,4,4,12,4,4,13,8,5,2,10,2,6 +S,4,5,5,7,3,8,8,6,10,5,6,7,0,8,9,7 +I,7,11,6,6,3,8,8,3,6,13,4,5,2,8,6,10 +V,4,4,5,3,2,4,12,3,3,10,11,7,2,10,1,8 +T,4,11,6,8,2,7,15,1,6,7,11,8,0,8,0,8 +Z,5,11,7,8,3,7,7,4,15,9,6,8,0,8,9,8 +R,4,10,4,7,5,5,10,7,3,7,4,9,2,6,5,11 +G,3,8,4,6,3,8,8,7,5,6,6,9,2,7,5,11 +F,4,7,4,5,2,1,12,4,4,12,11,7,0,8,1,6 +B,2,4,3,2,2,9,7,3,5,10,5,7,2,8,4,9 +F,5,10,5,8,4,1,12,4,4,12,10,7,0,8,2,6 +G,5,6,5,4,3,6,7,6,5,10,8,10,2,9,4,9 +P,2,3,4,2,2,7,9,3,4,12,5,4,1,10,2,8 +G,4,7,5,5,3,7,6,7,7,11,6,11,2,10,4,9 +Q,4,6,6,4,5,8,5,7,4,7,6,6,5,7,6,9 +O,4,7,5,5,3,7,8,7,6,9,8,8,3,8,3,8 +Z,3,7,4,5,3,6,7,5,9,7,7,9,1,9,7,8 +X,5,7,8,5,4,7,7,1,8,10,7,9,3,8,3,8 +S,2,3,4,2,1,7,8,3,7,10,7,7,1,8,5,6 +O,3,6,4,4,3,8,8,7,4,7,7,7,3,8,2,8 +T,2,4,3,3,2,7,12,3,6,7,11,9,2,11,1,8 +S,3,8,4,6,3,9,7,7,6,7,6,8,2,9,9,8 +O,2,4,3,3,2,8,7,6,3,9,5,8,2,8,2,8 +P,6,10,9,8,7,8,9,5,4,11,4,4,2,10,3,8 +B,5,11,7,8,9,8,8,6,6,7,6,6,2,8,6,9 +Q,4,5,4,6,4,8,8,5,3,8,9,9,3,10,5,7 +T,2,4,3,2,1,6,11,2,7,11,9,5,1,10,2,5 +Q,8,12,7,6,4,10,3,5,7,12,3,11,3,7,8,11 +Y,4,6,6,4,5,9,5,7,5,6,9,7,3,9,8,5 +Q,8,9,11,8,9,6,4,4,6,5,4,7,4,6,6,7 +L,3,5,3,3,2,4,3,5,6,2,2,5,1,6,0,6 +V,5,10,7,8,9,8,5,6,3,7,7,8,8,7,4,7 +X,5,5,6,8,2,7,7,5,4,7,6,8,3,8,4,8 +E,4,8,5,6,5,8,7,6,3,6,6,10,3,8,7,9 +W,5,10,7,8,7,6,11,2,2,7,8,9,7,12,1,8 +B,4,7,6,5,5,9,7,4,5,9,5,6,2,8,5,9 +P,4,8,6,6,4,5,13,7,2,12,6,2,1,10,3,8 +J,7,13,6,10,4,8,9,2,3,12,5,5,2,9,8,9 +U,5,8,5,6,3,3,8,5,7,9,9,9,3,9,2,5 +X,4,8,5,5,1,7,7,4,4,7,6,8,3,8,4,8 +B,6,11,9,8,9,8,8,4,6,10,5,6,5,6,7,10 +C,6,11,7,8,3,5,7,7,11,7,6,12,1,9,4,8 +R,5,10,7,8,7,6,8,5,6,6,5,8,3,6,5,8 +O,4,9,5,7,5,8,9,8,4,7,8,7,4,7,4,9 +V,5,6,5,4,2,4,12,5,4,11,11,6,3,10,1,8 +P,7,11,10,8,6,9,9,4,6,12,3,3,2,10,4,9 +R,1,0,2,1,1,6,9,7,3,7,5,8,2,7,4,11 +I,2,5,3,4,1,7,7,0,8,13,6,8,0,8,1,8 +P,2,3,4,2,2,7,10,5,3,10,4,3,1,10,3,8 +A,5,10,7,7,4,9,5,3,0,8,1,8,2,7,1,8 +B,7,10,9,7,7,9,6,4,7,9,5,6,2,8,7,10 +C,5,10,6,8,3,3,8,5,8,11,11,13,1,8,3,7 +W,6,5,8,8,4,5,8,5,2,7,8,8,9,9,0,8 +Q,9,13,8,7,5,8,6,4,10,11,4,10,3,7,9,9 +Z,4,6,6,4,3,6,9,2,8,11,8,6,1,8,6,5 +I,1,9,0,6,1,7,7,5,3,7,6,8,0,8,0,8 +G,1,3,2,1,1,7,7,5,5,10,7,10,2,9,3,10 +T,2,1,2,2,1,8,11,4,5,6,10,7,2,11,1,7 +I,2,5,3,3,1,7,8,1,7,14,6,7,0,8,1,7 +C,6,9,6,6,4,7,8,6,8,13,7,10,3,11,4,6 +I,6,11,8,8,5,10,5,2,6,6,7,4,0,10,4,7 +N,5,10,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +V,4,8,4,6,2,4,11,4,4,10,11,7,3,10,1,8 +K,5,5,6,7,2,4,8,8,2,7,4,11,3,8,2,11 +Q,5,9,5,5,3,9,6,4,6,10,5,7,3,8,9,9 +M,5,9,6,7,6,7,5,11,1,7,9,8,9,5,2,9 +P,4,8,4,5,2,4,15,8,1,12,6,2,0,9,4,8 +V,3,5,4,3,1,4,12,3,3,10,11,7,2,11,1,8 +F,4,7,4,5,2,1,12,4,4,12,10,7,0,8,2,6 +O,5,9,6,6,3,8,6,8,8,7,5,9,3,8,4,8 +Q,4,5,5,4,4,8,4,4,5,7,4,8,4,6,4,8 +K,3,6,5,4,3,3,9,2,6,10,11,11,3,8,2,6 +R,7,9,6,4,3,8,7,5,5,9,4,9,6,5,6,11 +F,2,4,3,3,1,6,10,2,5,13,7,5,1,9,1,7 +X,3,5,6,3,3,8,6,1,8,10,5,8,2,8,3,8 +P,4,11,5,8,4,5,10,8,4,9,7,3,2,10,4,7 +M,5,6,8,5,8,9,8,5,4,7,6,7,11,9,7,5 +E,1,1,1,1,1,4,7,5,8,7,6,13,0,8,6,9 +K,5,10,6,8,5,3,8,7,3,7,5,11,3,8,3,11 +W,4,7,6,5,3,7,8,4,1,7,8,8,8,9,0,8 +P,6,9,8,7,5,6,14,6,1,11,5,2,1,11,4,7 +W,5,8,7,6,6,7,11,2,2,7,8,8,7,12,1,8 +Q,4,5,4,6,4,8,5,6,5,9,6,9,3,8,5,8 +Z,6,10,8,8,5,8,6,3,9,12,4,9,3,6,8,9 +B,1,0,1,0,0,7,7,6,4,7,6,7,1,8,5,9 +Q,3,6,4,8,4,8,6,8,4,5,6,9,3,8,6,10 +D,6,14,6,8,4,11,4,2,6,9,3,7,5,7,4,12 +E,4,7,4,5,3,3,7,5,10,7,6,14,0,8,6,8 +J,4,9,6,7,4,8,6,6,6,8,6,8,3,7,4,6 +Q,5,7,7,10,10,8,6,5,1,6,6,9,8,9,6,12 +O,4,8,5,6,4,7,7,8,4,7,6,10,3,8,3,8 +A,4,8,6,6,4,11,3,2,2,9,2,9,4,4,3,8 +G,5,10,7,8,5,6,6,7,6,6,6,10,2,8,5,8 +U,4,3,4,5,1,7,5,12,5,7,15,8,3,9,0,8 +U,6,11,6,8,4,3,8,5,7,11,11,9,3,9,2,6 +X,4,5,7,3,3,6,8,1,9,11,8,9,3,8,3,7 +W,6,8,9,7,11,9,6,5,5,8,6,8,11,12,8,6 +C,5,6,6,5,5,6,7,4,5,7,6,11,5,10,8,11 +I,2,6,3,4,2,7,7,0,7,13,6,8,0,8,1,8 +O,4,9,5,7,5,8,6,7,4,9,4,8,3,8,2,8 +X,3,4,6,3,2,7,7,1,9,11,6,8,2,8,3,8 +V,4,10,6,8,3,8,9,4,2,6,13,8,3,10,0,8 +W,4,5,6,8,4,7,7,4,2,7,8,8,9,9,0,8 +A,3,5,6,3,2,8,2,2,2,6,1,8,2,6,2,7 +E,3,4,3,3,3,7,7,5,8,7,6,8,2,8,6,9 +P,2,4,4,2,2,8,10,4,3,11,4,3,1,10,3,8 +L,3,3,3,5,1,0,1,6,6,0,1,5,0,8,0,8 +O,2,2,3,4,2,7,7,8,4,7,6,8,2,8,3,8 +P,4,10,6,8,5,6,9,6,5,9,7,3,2,10,4,6 +B,5,8,7,6,6,9,7,3,5,10,5,6,2,8,5,9 +I,4,10,6,8,7,10,8,2,6,9,4,4,4,8,7,4 +E,4,10,5,7,5,6,7,6,9,6,4,10,3,8,6,9 +V,5,11,8,8,5,8,12,2,3,4,10,9,4,12,2,8 +K,5,7,7,6,5,9,5,2,4,8,4,9,5,8,7,11 +S,6,10,8,8,9,8,9,5,4,8,5,6,4,9,11,8 +D,6,11,6,8,4,5,7,10,10,7,6,6,3,8,4,8 +B,4,11,5,8,7,6,8,9,6,7,5,7,2,7,8,10 +N,9,13,8,7,4,6,10,4,5,4,5,10,6,10,2,7 +C,2,3,3,2,1,6,8,7,7,8,7,12,1,9,4,10 +W,5,11,8,8,8,7,11,2,2,6,8,8,7,12,1,8 +A,2,6,4,4,3,8,3,2,1,7,2,8,1,7,2,8 +A,3,9,5,6,3,10,3,2,2,8,2,10,3,5,3,7 +N,3,4,4,7,2,7,7,14,2,5,6,8,6,8,0,8 +Z,4,5,5,8,2,7,7,4,14,10,6,8,0,8,8,8 +H,4,6,5,4,5,7,7,5,6,7,6,7,6,8,3,8 +A,2,8,4,5,2,7,5,3,1,6,0,8,2,7,2,7 +G,3,4,4,3,2,6,7,5,4,9,7,9,2,8,4,9 +U,3,8,4,6,2,7,5,14,5,7,13,8,3,9,0,8 +W,4,7,6,5,5,10,11,2,2,5,9,8,6,12,1,8 +M,2,3,4,2,2,6,6,4,3,9,9,10,5,6,1,7 +V,3,6,5,4,1,8,8,4,2,7,14,8,3,9,0,8 +Q,5,10,5,6,3,9,6,4,7,11,4,8,3,8,8,11 +W,6,7,6,5,4,3,11,2,2,9,9,8,6,11,1,7 +N,4,9,6,7,4,6,9,6,5,7,7,8,6,9,2,6 +D,3,4,4,3,3,7,7,6,7,7,6,5,2,8,3,7 +A,3,5,6,4,2,9,2,2,2,8,1,8,2,6,2,7 +R,2,6,3,4,3,5,10,7,4,7,4,9,2,6,5,11 +L,3,9,4,7,3,7,4,2,8,7,1,8,1,6,2,7 +U,3,3,4,2,2,6,8,5,7,10,8,8,3,10,3,6 +N,5,11,8,8,6,7,9,6,5,6,6,7,6,9,1,7 +D,4,8,5,6,4,7,7,7,7,7,6,4,3,8,3,7 +H,2,3,4,2,2,7,8,3,5,10,7,8,3,8,2,7 +V,2,6,4,4,1,6,8,4,2,8,13,8,3,10,0,8 +H,8,10,8,5,5,8,6,3,5,10,6,7,7,11,5,8 +F,4,9,6,7,4,5,11,4,6,11,10,5,2,10,3,5 +N,5,10,6,7,5,7,9,6,4,6,6,6,6,9,2,7 +Q,3,3,4,4,3,8,7,6,3,8,6,9,2,9,3,7 +L,3,7,4,5,3,9,3,1,6,9,2,9,1,6,2,9 +O,6,10,7,8,5,8,6,8,6,9,4,8,3,8,3,8 +D,2,3,3,2,2,7,7,5,5,10,5,6,3,8,3,9 +D,5,10,7,7,4,9,7,6,8,11,5,5,3,8,4,8 +F,5,7,7,5,3,6,10,3,6,13,7,4,2,10,2,7 +W,9,10,9,8,9,6,10,3,3,8,7,6,11,11,4,5 +Q,1,0,2,1,1,8,7,6,4,6,6,9,2,8,3,8 +E,5,11,5,8,3,3,8,6,12,7,6,15,0,8,7,6 +S,4,8,5,6,4,6,8,3,6,10,7,8,2,8,5,6 +W,13,13,12,7,5,1,9,5,3,12,13,9,8,9,0,7 +U,3,3,4,1,1,5,8,5,6,10,9,9,3,10,2,6 +D,2,7,4,5,4,7,7,6,5,7,6,4,3,8,2,7 +P,3,8,4,6,3,5,10,5,5,10,8,4,1,10,4,7 +A,2,4,4,3,1,12,3,3,2,10,1,9,1,6,2,9 +C,3,5,4,3,2,5,8,5,7,12,9,11,1,10,2,7 +Y,2,2,4,3,2,8,10,1,7,5,11,8,1,11,2,8 +L,1,3,2,2,1,6,5,2,8,7,3,9,0,7,2,8 +I,3,8,4,6,2,7,7,0,8,14,6,8,0,8,1,7 +A,2,5,4,3,2,8,2,2,2,8,2,8,2,6,2,7 +F,5,7,7,5,3,9,8,2,7,14,4,4,2,9,3,9 +R,6,10,8,8,6,10,7,3,6,10,2,6,5,6,5,10 +G,3,5,4,4,2,6,6,6,5,9,7,11,2,9,4,10 +Y,2,1,3,1,0,7,10,3,1,7,13,8,1,11,0,8 +N,5,4,5,6,2,7,7,15,2,4,6,8,6,8,0,8 +R,3,6,5,4,4,6,8,5,5,6,4,8,3,6,4,8 +C,2,1,3,2,1,6,7,6,10,7,6,14,0,8,4,9 +Y,7,11,8,8,6,5,8,1,8,8,9,5,5,11,7,4 +I,2,7,3,5,2,7,9,0,6,13,6,7,0,8,1,7 +F,6,11,8,8,6,9,8,2,6,12,4,6,5,8,4,9 +N,5,9,7,7,4,5,9,3,4,10,8,8,5,8,1,7 +F,7,12,6,6,3,7,8,2,7,11,6,6,2,9,6,5 +Q,6,6,7,9,4,8,6,8,7,5,7,8,3,8,5,9 +V,3,4,4,3,2,5,12,3,3,9,11,7,2,11,1,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +I,4,11,5,8,4,7,7,0,7,13,6,8,0,8,1,8 +K,4,9,5,7,2,3,6,8,3,7,7,12,4,8,3,10 +Z,3,11,4,8,2,7,7,4,14,10,6,8,0,8,8,8 +M,3,3,4,2,2,7,6,6,4,6,7,8,6,5,2,8 +D,6,11,8,8,7,7,7,7,8,7,6,5,6,8,4,7 +Q,4,5,5,7,3,8,6,9,7,6,6,9,3,8,4,8 +V,5,11,7,8,4,4,11,3,4,10,12,9,2,10,1,8 +L,3,7,4,5,2,4,3,5,8,1,1,5,0,7,1,5 +Q,3,3,4,4,3,8,8,6,2,5,7,9,3,9,5,9 +K,5,9,8,7,5,2,8,2,7,11,12,12,3,8,3,5 +W,8,9,10,8,13,6,8,6,5,6,6,8,10,10,9,9 +T,5,7,5,5,3,6,11,3,7,11,9,5,2,11,2,4 +J,3,9,4,7,2,10,6,1,9,12,3,6,0,7,1,7 +L,3,9,3,7,1,0,1,5,6,0,0,7,0,8,0,8 +J,2,10,3,7,1,13,3,8,4,14,3,11,1,6,0,8 +O,3,6,5,4,5,8,7,5,1,7,6,8,8,8,4,9 +P,2,1,3,2,2,5,10,4,4,9,7,4,1,9,3,7 +R,5,9,8,7,5,10,7,3,7,10,3,6,3,6,4,11 +F,4,9,4,6,2,1,13,5,4,12,11,7,0,8,2,6 +B,4,9,6,6,6,6,8,7,4,7,5,6,4,8,5,6 +J,4,11,5,8,3,10,6,1,7,13,3,7,0,7,0,8 +F,3,5,3,3,2,5,12,5,6,11,9,3,1,10,3,5 +D,4,9,6,6,9,9,9,4,5,7,6,6,5,8,9,5 +M,4,2,5,4,4,9,6,6,4,6,7,6,8,6,2,6 +E,3,7,4,5,4,8,7,4,7,7,6,8,6,9,5,10 +H,4,7,6,5,4,9,7,7,6,7,6,5,3,8,3,6 +Y,5,7,8,10,11,8,9,4,2,6,8,9,4,11,8,8 +S,3,7,4,5,4,8,7,7,5,7,6,8,2,8,8,8 +M,2,3,4,2,3,7,6,3,4,9,7,8,6,5,1,8 +C,4,6,5,5,4,6,7,4,4,7,6,11,4,9,8,10 +D,3,5,5,4,3,9,6,4,6,10,4,5,2,8,3,8 +B,3,5,4,4,3,7,7,5,5,6,6,6,2,8,6,10 +X,2,2,3,3,2,8,7,3,8,6,6,8,2,8,6,8 +A,2,2,4,3,2,7,2,2,2,6,2,8,2,7,3,7 +X,4,5,8,4,3,8,7,1,9,11,4,7,3,8,3,8 +N,3,4,5,3,2,9,8,3,5,10,3,5,4,9,1,7 +G,3,5,5,4,3,6,6,6,6,6,6,9,2,8,4,8 +X,2,5,4,4,2,7,7,3,9,6,6,8,2,8,6,8 +Y,2,4,4,6,4,8,11,3,3,5,8,9,2,11,5,6 +P,5,11,7,8,4,7,10,5,5,12,5,3,1,10,3,8 +F,3,5,5,6,5,7,9,4,4,7,6,7,4,9,8,9 +X,3,9,6,7,5,7,6,2,6,7,5,8,3,6,7,7 +C,2,1,2,2,1,6,7,6,10,7,6,14,0,8,4,9 +J,5,10,6,8,5,8,5,8,5,8,7,8,2,7,4,6 +U,4,9,6,8,7,7,6,5,4,6,6,8,4,8,1,7 +E,4,7,5,5,5,8,4,6,3,8,7,10,4,9,7,9 +U,7,11,6,6,3,7,6,4,6,4,8,6,6,7,3,6 +U,2,3,3,2,1,5,8,5,6,9,8,8,3,9,2,6 +Q,3,3,4,4,3,8,7,6,2,5,7,9,3,8,5,9 +H,2,3,3,1,2,8,8,3,5,10,6,8,3,8,2,8 +Z,2,5,5,3,2,7,8,2,9,12,6,8,1,9,5,7 +F,2,3,3,1,1,5,10,4,5,10,9,5,1,9,3,6 +W,7,8,7,6,4,2,10,3,4,11,11,9,7,10,1,7 +J,2,6,3,4,2,8,6,3,6,12,5,9,1,6,1,6 +B,5,9,7,6,6,10,6,2,6,11,3,8,3,8,4,12 +G,2,3,3,2,1,7,7,5,6,10,6,10,2,9,3,9 +Z,4,9,5,7,2,7,7,4,15,9,6,8,0,8,8,8 +C,4,9,5,7,3,4,7,5,6,11,9,14,2,8,3,8 +O,4,9,5,7,2,8,7,9,8,7,6,9,3,8,4,8 +O,4,8,5,6,3,7,7,8,5,10,7,8,3,8,3,8 +E,6,9,8,7,5,7,7,3,9,11,8,9,2,8,4,8 +G,3,2,4,3,2,7,6,6,6,6,6,10,2,9,4,9 +I,1,3,1,2,0,7,7,2,6,7,6,8,0,8,2,8 +P,4,7,6,5,4,8,9,4,4,12,4,3,1,10,3,8 +S,2,3,2,2,1,8,8,6,5,7,6,7,2,8,8,8 +F,4,7,6,5,4,8,8,2,6,13,5,5,2,10,3,9 +U,5,5,6,4,3,4,8,5,8,11,11,9,3,9,2,7 +O,5,9,5,7,5,7,7,8,4,9,6,8,3,8,3,8 +S,7,11,7,6,3,8,5,4,4,13,7,9,3,9,3,8 +C,2,7,3,5,1,6,8,7,8,5,6,13,1,7,4,9 +S,2,3,3,2,1,8,7,2,7,10,6,8,1,8,4,8 +T,4,6,6,8,2,6,15,1,6,9,11,7,0,8,0,8 +B,7,10,9,8,9,7,7,5,5,7,5,7,4,8,7,8 +Q,5,7,6,9,6,9,7,7,2,5,7,10,3,8,6,10 +V,5,10,5,7,3,2,11,3,3,11,11,8,2,11,1,8 +F,7,10,6,5,3,7,8,2,7,11,6,6,2,9,5,6 +V,7,13,5,7,3,7,10,6,4,9,9,4,5,12,3,8 +W,4,9,6,6,6,11,10,2,3,5,9,7,7,10,1,8 +E,3,4,4,6,2,3,8,6,10,7,6,14,0,8,7,7 +G,2,3,3,1,1,7,7,5,5,9,7,9,2,8,4,10 +L,2,5,3,4,2,4,4,4,8,2,1,7,0,7,1,6 +Q,4,5,5,5,4,7,4,5,5,7,5,9,4,5,6,7 +E,3,8,4,6,4,8,7,5,9,6,4,8,2,8,6,9 +U,1,0,1,0,0,7,6,10,4,7,12,8,3,10,0,8 +R,4,7,6,5,6,7,7,3,4,7,6,8,6,9,6,5 +P,4,7,5,5,4,5,11,8,3,10,7,3,2,11,3,7 +P,3,5,5,8,7,8,11,5,0,8,6,6,4,10,6,8 +K,3,2,4,3,3,5,7,4,7,7,6,10,6,8,4,9 +N,4,5,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +F,6,9,5,4,2,8,8,3,6,12,5,6,2,8,6,7 +A,2,1,3,1,1,7,4,2,0,7,2,8,2,6,2,8 +A,3,2,5,3,2,8,2,2,2,7,2,8,2,7,2,7 +J,3,11,4,8,2,10,6,1,8,11,3,6,0,7,1,7 +L,2,3,3,2,1,7,4,2,7,8,2,10,0,7,2,8 +G,4,7,6,5,3,6,6,6,7,6,6,10,3,7,4,8 +O,6,9,6,7,6,8,6,7,4,9,4,8,3,9,3,7 +O,3,9,4,6,3,7,7,9,5,7,6,8,3,8,3,7 +E,3,2,3,3,3,7,7,5,7,7,5,9,2,8,5,10 +K,3,2,4,4,3,5,7,4,8,7,6,11,3,8,5,9 +F,3,8,3,5,1,0,13,4,4,12,11,7,0,8,2,6 +E,5,9,7,7,7,6,7,3,6,8,7,11,5,10,9,9 +G,6,10,8,7,9,8,8,5,3,6,6,7,9,8,9,14 +U,3,4,4,3,2,4,8,5,6,11,10,9,3,9,1,6 +K,6,9,8,7,7,5,6,4,7,6,6,12,5,7,7,10 +U,6,10,8,7,4,4,9,7,8,9,11,10,3,9,1,8 +M,5,9,5,6,6,7,6,10,1,7,8,8,8,4,0,8 +O,6,11,9,8,6,8,8,9,5,7,7,5,5,8,4,9 +S,5,10,6,7,3,8,7,5,9,5,6,8,1,8,9,8 +X,3,5,5,3,2,8,7,1,8,10,5,7,3,8,3,7 +J,2,4,4,3,1,9,5,3,5,13,6,11,1,7,0,7 +V,6,8,6,6,4,4,11,1,3,8,10,8,4,11,1,7 +E,4,8,6,6,6,7,7,3,6,7,7,10,4,9,8,8 +I,0,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +L,2,3,2,1,1,4,4,4,6,2,2,5,1,7,1,6 +D,4,6,5,4,4,10,6,3,6,11,4,6,3,8,2,9 +Y,2,4,3,3,1,3,11,3,5,12,10,6,1,10,1,6 +A,1,1,2,1,0,7,4,3,0,7,1,8,2,7,1,8 +K,6,10,8,8,6,6,7,1,7,10,6,10,3,8,4,8 +X,3,5,5,3,2,7,7,1,8,10,6,8,2,8,3,8 +Y,2,3,2,2,1,3,11,3,5,11,10,5,1,11,1,6 +U,3,7,4,5,1,7,5,13,5,7,14,8,3,9,0,8 +A,2,4,4,6,2,7,3,3,3,7,1,8,3,6,3,8 +J,1,1,2,3,1,9,6,3,5,12,5,10,1,6,2,6 +X,3,4,6,3,3,7,7,1,9,10,7,8,3,8,3,7 +Y,7,9,6,13,5,5,7,5,3,7,11,6,4,10,5,6 +Z,5,9,6,7,3,7,7,4,15,9,6,8,0,8,8,8 +U,7,11,9,8,7,6,9,4,7,5,8,10,6,10,1,8 +T,5,10,6,8,5,6,10,1,8,11,9,6,1,10,3,4 +I,3,9,6,7,6,10,5,2,4,9,5,5,3,8,5,7 +A,2,7,4,5,2,11,2,3,3,10,2,9,2,6,3,8 +M,3,1,4,3,3,8,6,6,4,7,7,8,7,5,1,7 +C,2,1,3,2,1,6,8,7,7,8,7,13,1,10,4,10 +K,4,10,5,8,6,6,6,3,7,6,5,8,7,8,5,9 +J,1,2,2,4,1,10,6,2,5,12,4,9,1,6,1,7 +V,2,6,3,4,1,7,9,4,2,7,13,8,3,10,0,8 +B,4,7,5,5,5,8,6,6,7,6,6,6,2,8,7,10 +X,2,1,2,1,0,8,7,4,4,7,6,8,3,8,4,8 +J,2,2,3,4,1,10,6,2,7,12,3,8,1,6,1,7 +U,3,7,3,5,2,8,6,12,4,7,11,8,3,9,0,8 +E,2,1,3,2,2,7,7,5,7,7,5,9,2,8,5,10 +M,4,7,7,5,5,4,8,3,4,10,10,10,5,9,2,6 +M,3,4,5,3,3,7,6,3,4,9,7,8,7,5,1,8 +F,6,10,8,7,5,6,10,1,6,13,7,5,1,10,2,7 +V,5,7,5,5,3,4,12,1,2,8,10,7,3,12,1,8 +Q,3,4,4,5,3,8,7,6,2,8,7,10,3,8,5,8 +K,4,2,5,3,3,5,7,4,7,7,6,11,3,8,5,9 +B,2,1,2,1,1,7,7,7,5,6,5,7,1,8,7,10 +T,7,11,7,9,5,5,12,4,7,12,9,4,2,12,2,4 +A,3,7,4,5,3,8,3,2,2,7,2,8,2,6,3,7 +I,1,6,0,8,1,7,7,4,4,7,6,8,0,8,0,8 +C,1,0,1,1,0,6,7,6,7,7,6,13,0,8,4,10 +V,2,7,4,5,3,9,12,2,3,4,10,9,2,11,1,9 +Y,1,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +Z,2,7,3,5,3,7,7,5,9,7,6,8,1,8,7,8 +Q,2,3,3,4,3,8,8,5,2,5,8,10,2,9,5,9 +B,6,9,5,4,3,10,6,6,5,11,4,9,5,7,6,11 +X,2,4,4,3,2,7,7,3,9,6,6,8,2,8,5,8 +D,2,0,2,1,1,5,7,8,6,6,6,6,2,8,3,8 +W,7,11,8,6,5,4,7,2,3,8,10,8,10,10,2,5 +X,4,6,6,4,5,8,6,3,5,6,7,8,3,9,8,9 +V,3,2,5,4,2,7,12,2,3,7,11,9,2,10,1,8 +Z,6,10,8,7,6,10,6,5,4,8,5,7,3,7,11,7 +V,4,7,6,6,7,7,8,5,5,7,6,8,6,9,7,8 +W,6,5,7,4,4,4,11,2,2,9,9,8,7,11,1,6 +B,4,3,4,5,3,6,7,8,6,7,6,6,2,8,9,10 +N,4,7,6,5,5,6,8,3,4,8,7,7,5,9,5,3 +M,3,6,6,4,6,9,4,2,2,8,4,8,8,6,2,7 +F,5,11,6,8,5,5,11,7,6,11,10,5,2,9,2,5 +C,2,4,3,2,1,5,9,4,7,11,9,11,1,9,2,7 +G,5,10,5,7,4,6,6,6,5,10,7,13,2,9,5,9 +C,5,10,6,8,3,5,8,6,8,12,9,12,2,9,3,7 +Z,4,8,5,6,3,6,8,6,11,7,7,10,1,9,8,8 +A,4,5,6,4,4,8,7,3,5,7,8,8,5,9,3,6 +Z,3,7,4,5,2,7,8,3,12,8,6,8,0,8,7,7 +S,5,5,6,8,3,8,8,6,9,5,6,7,0,8,9,7 +L,2,4,2,3,1,4,4,4,8,2,1,6,0,7,1,6 +T,6,11,5,6,2,4,11,3,7,13,8,6,2,7,3,3 +D,8,15,7,8,5,6,7,4,7,9,6,7,5,9,7,5 +G,4,6,5,4,3,6,8,6,6,10,8,9,2,8,4,9 +J,0,0,1,0,0,12,4,4,3,12,4,10,0,7,0,8 +Z,1,3,2,2,1,7,7,5,8,6,6,8,1,8,7,8 +Z,3,8,4,6,4,6,8,3,8,7,6,9,0,8,9,7 +I,5,9,4,4,2,9,7,6,4,13,5,8,3,8,5,10 +C,3,5,4,3,2,4,8,5,7,11,9,12,1,9,3,7 +B,6,11,6,8,5,6,6,9,7,6,6,7,2,8,10,10 +N,1,0,1,1,0,7,7,9,0,6,6,8,4,8,0,8 +V,3,10,5,7,2,6,8,4,3,8,14,8,3,10,0,8 +J,5,8,6,6,2,8,4,5,6,15,7,13,1,6,1,6 +D,2,5,4,4,3,9,6,4,6,10,4,6,2,8,3,8 +E,6,9,8,7,7,8,8,6,3,6,6,10,4,8,8,9 +J,1,2,2,3,1,10,6,2,6,12,4,9,0,7,1,8 +T,2,7,4,4,1,8,14,1,6,6,11,8,0,8,0,8 +V,4,10,6,8,2,8,8,4,3,6,14,8,3,9,0,8 +F,3,9,3,6,1,1,12,5,5,11,10,8,0,8,3,6 +F,8,14,7,8,3,6,9,2,7,10,7,6,2,10,5,6 +C,5,9,5,7,3,4,10,7,8,13,10,8,2,10,2,6 +W,4,11,6,8,4,11,8,5,2,6,9,8,8,10,0,8 +U,10,14,9,8,4,6,4,4,6,4,7,6,6,5,2,7 +J,2,2,4,4,2,10,6,2,7,12,4,9,1,6,1,7 +I,1,3,2,2,1,7,8,1,7,13,6,8,0,8,1,7 +W,4,8,6,6,6,8,10,2,3,6,8,8,7,11,1,8 +B,2,3,2,2,2,7,8,5,5,7,6,6,2,8,5,9 +Y,2,2,4,3,1,7,11,1,7,7,11,8,1,11,2,8 +N,6,10,8,8,6,7,8,6,6,6,6,4,9,10,5,6 +Z,2,7,3,5,2,7,7,3,11,8,6,8,0,8,7,8 +S,4,6,4,8,3,8,8,6,9,4,5,5,0,8,9,7 +S,2,6,3,4,3,8,8,7,5,7,5,8,2,8,8,8 +F,6,13,6,7,3,7,9,2,6,12,5,5,2,9,6,6 +Y,3,3,5,4,1,5,10,3,2,8,13,8,2,11,0,8 +J,0,0,1,1,0,12,4,5,3,12,4,11,0,7,0,8 +Z,4,7,5,5,4,9,8,5,3,7,5,7,3,7,8,4 +W,6,8,6,6,7,7,10,4,3,9,6,6,8,10,4,5 +C,5,7,6,5,6,6,6,4,3,7,6,11,5,9,3,9 +W,5,11,8,8,8,4,12,2,2,8,9,9,7,13,2,8 +T,1,3,2,2,1,6,11,3,4,8,10,7,2,11,0,7 +R,3,8,4,6,4,6,10,7,4,7,4,9,2,6,5,11 +E,3,7,3,5,2,3,7,6,9,7,6,14,0,8,7,8 +B,4,9,6,6,6,8,7,5,6,9,6,6,3,9,7,8 +Z,2,2,3,3,2,7,7,5,9,6,6,8,2,8,7,8 +S,5,8,7,6,9,7,10,3,4,8,7,7,3,7,8,2 +R,3,6,4,4,3,9,7,3,5,10,4,7,3,7,3,10 +M,3,4,4,3,3,7,6,6,4,6,7,9,6,5,2,8 +E,2,3,3,1,1,5,8,2,7,11,8,10,1,8,3,7 +B,2,4,2,3,2,7,7,5,5,6,6,6,2,8,5,9 +H,3,5,4,3,3,9,7,6,6,7,6,8,3,8,3,7 +W,6,11,9,8,8,7,9,5,1,7,9,8,9,10,1,7 +J,6,7,4,10,3,6,10,3,3,13,6,5,3,8,7,9 +J,4,10,6,7,5,6,8,3,4,8,7,7,6,7,4,7 +N,6,8,9,6,4,8,8,2,6,10,5,6,6,9,1,7 +F,2,6,2,4,1,1,11,4,7,12,12,9,0,8,2,6 +D,3,8,5,6,4,10,6,3,6,11,4,7,3,8,2,9 +X,3,3,4,4,1,7,7,6,2,7,6,8,3,8,4,8 +W,7,9,7,5,3,3,9,3,2,8,11,9,10,11,0,7 +R,4,10,6,8,6,7,7,6,6,7,6,7,3,7,5,9 +W,7,11,10,8,15,10,8,5,3,7,7,8,13,10,4,6 +D,3,5,5,4,3,9,6,4,7,10,4,6,2,8,3,8 +V,3,4,4,3,1,5,12,2,3,9,11,7,2,11,1,8 +K,6,10,8,8,7,5,5,4,8,6,7,12,4,8,7,9 +O,10,15,7,8,4,7,7,5,5,8,4,7,5,9,6,8 +L,4,8,5,6,3,7,4,1,7,8,2,10,1,6,3,8 +O,4,7,5,5,3,7,8,8,5,7,7,9,3,8,3,8 +U,3,7,3,5,2,7,5,13,5,7,13,8,3,9,0,8 +O,5,6,6,6,5,6,7,6,7,9,7,9,4,7,5,5 +J,2,6,3,4,1,8,7,3,6,15,5,9,1,6,1,7 +N,3,3,4,5,2,7,7,14,2,5,6,8,6,8,0,8 +O,7,11,5,6,3,6,7,5,4,7,4,7,5,8,5,7 +N,6,11,9,8,6,11,8,2,5,10,2,4,7,10,2,8 +P,2,7,3,4,1,4,11,8,3,10,6,4,1,10,3,8 +J,3,8,4,6,2,9,6,2,8,15,4,8,0,7,0,7 +A,1,1,3,2,1,7,2,2,1,7,2,8,1,6,2,7 +C,7,10,8,8,4,6,8,7,8,13,8,9,2,11,3,7 +X,4,10,5,7,2,7,7,4,4,7,6,8,3,8,4,8 +L,2,5,3,3,2,5,4,5,6,2,2,5,1,6,1,6 +I,1,8,1,6,1,7,7,0,8,7,6,8,0,8,3,8 +E,3,6,4,4,2,4,6,6,10,7,7,13,0,8,8,8 +M,7,9,10,6,6,10,5,2,6,9,4,7,8,6,2,8 +X,4,5,8,4,3,7,7,1,9,10,6,8,2,8,3,7 +D,5,9,6,7,5,10,6,4,7,10,3,5,3,8,3,9 +D,6,12,6,6,5,9,6,3,6,10,4,7,5,8,8,7 +J,5,11,4,8,3,8,8,2,4,12,4,5,2,9,7,8 +T,2,1,3,1,0,7,15,2,4,7,10,8,0,8,0,8 +U,3,7,3,5,1,7,5,13,5,7,13,8,3,9,0,8 +K,3,7,5,5,5,6,6,3,4,7,6,9,5,7,7,9 +K,5,11,5,8,2,4,7,9,2,7,4,11,4,8,2,11 +P,2,4,4,3,2,7,9,3,4,12,5,4,1,9,3,8 +B,5,8,6,6,5,9,8,7,8,7,5,5,2,8,8,9 +K,5,8,6,6,6,5,6,4,6,6,6,10,3,8,5,10 +E,2,2,3,3,2,7,7,5,7,7,6,9,2,8,5,10 +A,3,8,5,6,3,12,3,2,2,9,2,9,3,7,3,9 +Y,4,10,6,8,6,9,5,6,4,7,8,8,6,8,8,3 +S,6,10,7,8,4,7,7,4,8,11,7,8,2,9,5,8 +H,2,2,3,3,3,6,7,5,6,7,6,8,3,8,3,8 +Y,3,4,4,2,2,4,10,2,7,10,10,5,2,11,3,4 +Z,3,8,5,6,3,8,7,2,9,11,6,8,2,8,6,8 +E,4,11,5,8,5,3,7,5,9,7,7,14,0,8,6,9 +Z,7,10,5,14,5,7,10,3,3,11,7,7,3,8,14,7 +M,6,5,7,8,4,8,7,13,2,6,9,8,9,6,0,8 +P,1,1,2,1,1,5,11,7,1,10,6,4,1,9,3,8 +T,6,8,6,6,3,4,14,5,7,12,9,3,1,11,2,4 +W,5,4,6,3,3,4,11,3,2,9,9,7,7,11,1,6 +U,5,10,6,8,3,7,4,15,6,7,14,8,3,9,0,8 +U,7,11,6,6,3,7,6,5,6,3,9,7,5,8,3,6 +E,4,10,6,7,6,7,7,5,3,7,6,8,5,8,8,9 +W,7,7,7,5,6,5,10,3,3,9,7,7,8,10,3,5 +K,3,8,4,6,3,4,8,7,3,6,4,11,3,8,2,11 +Z,5,7,7,5,3,7,7,2,10,12,7,7,1,7,6,7 +I,4,7,6,8,6,9,8,5,5,7,5,7,3,8,9,8 +W,8,10,8,8,8,6,11,3,3,9,7,7,10,12,4,5 +P,6,7,8,10,10,8,7,4,3,7,7,7,7,12,6,6 +F,3,6,6,4,3,6,10,2,6,13,6,4,1,10,2,7 +F,4,4,4,6,2,1,14,5,3,12,9,5,0,8,2,6 +R,5,8,8,7,9,8,7,4,4,8,5,7,7,8,6,5 +H,4,8,5,6,5,8,7,5,6,7,6,6,3,8,3,7 +Q,4,8,5,9,6,8,8,5,2,7,9,10,3,9,5,7 +W,10,15,11,8,7,7,8,2,4,6,9,6,11,9,3,5 +J,1,6,2,4,1,14,2,6,5,13,2,10,0,7,0,8 +R,6,11,6,8,4,5,12,9,3,7,3,9,3,7,6,11 +D,4,8,6,6,4,6,7,8,7,6,5,4,3,8,4,9 +C,7,10,7,7,4,4,10,7,8,12,10,8,2,10,3,7 +A,3,9,5,6,2,6,6,3,1,6,0,8,2,7,1,7 +Z,3,9,4,6,2,7,7,4,14,10,6,8,0,8,8,8 +B,3,6,3,4,3,6,6,8,6,6,6,7,2,8,8,9 +O,2,3,3,2,2,7,7,6,4,9,6,8,2,8,2,8 +B,1,0,2,1,1,7,7,7,5,6,6,7,1,8,7,9 +K,4,7,6,6,5,8,6,2,3,8,4,8,4,6,7,11 +S,3,5,3,4,3,8,6,7,5,7,7,9,2,10,9,8 +D,2,3,3,2,2,9,6,3,5,10,4,7,2,8,2,8 +V,5,9,6,7,4,7,11,3,2,6,11,8,3,10,3,9 +F,3,5,4,8,2,0,12,4,6,12,12,9,0,8,2,6 +O,4,9,5,6,3,9,7,9,8,7,5,10,3,8,4,8 +P,5,10,8,8,5,7,10,5,5,12,5,3,1,10,4,8 +K,3,4,6,3,3,6,7,2,7,10,7,10,3,8,3,7 +M,4,9,6,6,7,7,8,6,4,7,6,8,6,9,7,6 +W,8,9,8,6,6,2,12,2,2,10,10,8,7,11,1,7 +H,3,7,4,4,2,7,8,14,1,7,5,8,3,8,0,8 +L,3,6,5,4,3,6,4,1,8,8,2,11,0,7,2,8 +N,2,4,4,3,2,7,8,3,4,10,6,7,5,9,0,7 +T,4,8,4,6,3,6,12,4,6,11,9,4,2,12,2,4 +L,2,7,3,5,2,8,4,3,7,7,2,8,1,6,2,8 +W,7,11,10,8,4,9,7,5,2,6,8,8,9,9,0,8 +E,6,10,9,7,7,6,8,1,8,11,6,9,3,8,4,8 +H,2,4,4,3,2,7,7,3,5,10,6,8,3,8,2,8 +J,5,11,7,8,4,10,6,1,7,14,3,7,0,7,1,8 +W,5,8,5,6,5,5,10,3,3,9,7,7,7,11,2,5 +T,2,8,3,5,1,7,14,0,6,7,11,8,0,8,0,8 +U,6,11,8,8,8,8,6,8,5,7,6,9,6,8,5,6 +E,5,10,3,5,2,7,8,5,6,10,6,9,1,9,7,8 +G,2,5,3,4,2,6,7,5,5,9,7,10,2,9,4,10 +S,1,3,2,2,1,8,8,6,5,7,6,7,2,8,8,8 +U,8,15,7,9,4,4,4,5,5,4,7,8,5,9,2,8 +K,6,10,6,5,3,7,7,3,6,10,8,9,6,11,3,7 +A,2,3,3,2,1,10,2,2,1,9,2,9,1,6,2,8 +F,5,11,7,8,6,6,10,2,5,13,7,5,2,10,2,7 +O,5,9,6,7,4,7,7,9,5,7,7,8,3,8,3,8 +M,4,8,6,6,7,7,8,6,4,6,6,8,6,9,7,10 +Z,7,10,7,6,4,8,6,2,8,12,6,9,3,8,6,7 +H,5,9,5,6,2,7,8,15,0,7,5,8,3,8,0,8 +Q,9,14,8,8,4,9,3,4,7,11,3,10,3,8,8,11 +S,2,4,3,3,1,9,6,2,7,10,5,8,1,9,5,9 +B,4,8,4,6,5,6,8,8,6,7,5,7,2,8,7,9 +W,4,6,5,4,4,7,6,7,2,7,7,8,6,8,5,10 +X,7,10,10,8,5,5,8,2,9,11,10,9,3,8,4,6 +F,3,8,3,5,1,1,13,5,4,12,10,7,0,8,2,6 +G,5,10,6,7,8,8,8,5,2,6,6,8,7,8,7,13 +M,7,13,8,8,5,6,3,3,2,8,4,10,7,2,2,8 +Q,4,7,4,9,4,8,8,6,2,8,8,10,3,9,6,7 +K,4,8,6,6,4,3,8,2,7,10,11,12,3,8,3,5 +M,6,10,7,5,4,9,3,2,2,9,4,9,8,2,2,9 +S,4,9,5,6,3,8,8,5,9,5,6,7,0,8,9,7 +Z,6,9,8,7,5,8,6,2,9,12,5,10,3,7,7,9 +M,3,3,4,2,2,9,6,6,4,6,7,6,6,5,2,6 +G,3,8,5,6,2,7,7,8,7,6,6,8,2,7,6,11 +M,5,6,8,4,5,9,6,3,5,9,5,7,8,6,2,8 +M,5,8,6,6,5,8,5,11,0,7,9,8,9,6,2,7 +L,3,9,4,7,3,6,4,1,8,8,2,10,0,7,2,8 +P,5,7,7,5,3,6,14,5,2,12,4,1,0,10,3,8 +Y,4,8,6,12,11,9,7,4,2,6,7,9,5,11,8,9 +H,3,6,4,4,5,7,8,4,2,7,6,7,7,9,7,8 +X,4,11,6,8,6,8,8,2,6,7,7,8,5,11,8,8 +O,3,7,4,5,3,7,7,8,5,6,5,6,3,8,3,8 +G,3,4,4,3,2,6,7,5,5,9,7,10,2,9,4,9 +A,1,0,2,0,0,7,4,2,0,7,2,8,2,7,1,8 +W,4,9,7,6,5,8,10,2,3,6,9,8,7,11,1,8 +O,2,3,3,2,2,7,8,6,4,9,6,8,2,8,2,8 +D,5,9,6,7,5,9,7,4,7,11,5,6,3,7,4,8 +H,6,9,9,7,7,7,7,3,6,10,7,8,3,8,3,8 +W,5,9,6,4,3,5,8,2,3,7,9,8,9,11,2,6 +H,3,5,4,7,2,7,8,15,1,7,5,8,3,8,0,8 +Y,3,4,5,5,1,6,10,3,2,9,13,8,1,11,0,8 +K,4,7,4,5,2,4,7,8,1,7,6,11,3,8,2,11 +E,6,11,6,8,4,3,7,6,11,7,6,14,0,8,8,7 +S,5,11,6,8,4,8,7,5,9,11,3,7,2,6,5,9 +S,3,6,4,4,3,5,9,2,6,10,7,7,2,7,4,4 +H,5,8,7,6,6,8,6,7,7,7,7,7,3,8,3,8 +T,3,5,4,4,3,6,8,3,7,8,7,8,3,9,7,6 +J,1,6,2,4,0,13,3,7,4,13,3,11,0,7,0,8 +Y,6,8,6,6,3,4,10,3,7,11,11,6,1,11,3,4 +N,2,1,3,2,1,7,7,13,1,5,6,8,5,8,0,8 +P,2,3,2,2,1,5,11,5,3,10,7,3,0,9,3,6 +W,3,1,4,3,3,10,11,3,2,5,9,7,6,11,0,8 +Z,6,11,8,8,5,9,6,3,10,12,4,8,2,7,6,8 +X,3,1,4,2,2,7,7,4,9,6,6,8,3,8,6,8 +I,3,7,4,5,2,9,6,0,7,13,5,8,0,8,1,8 +T,4,5,5,3,2,5,11,2,9,12,9,5,0,10,2,4 +I,1,3,2,2,1,7,7,1,7,13,6,8,0,8,1,8 +A,1,0,2,0,0,8,4,2,0,7,2,8,2,7,1,8 +D,6,10,6,6,3,11,3,4,5,12,2,8,5,7,4,10 +M,3,3,5,2,2,8,6,2,4,9,6,8,7,6,2,8 +N,4,4,4,6,2,7,7,14,2,4,6,8,6,8,0,8 +F,4,8,6,6,7,9,7,1,5,9,5,5,3,10,4,6 +T,1,0,2,1,0,7,14,1,4,7,10,8,0,8,0,8 +T,4,10,5,8,5,7,11,3,7,7,11,8,2,12,1,8 +X,3,7,4,5,2,8,7,4,4,7,6,8,2,8,4,8 +R,3,9,4,6,3,5,11,8,4,7,3,9,3,7,6,11 +Z,2,3,4,2,2,7,8,2,9,12,7,7,1,8,5,7 +Z,4,9,5,7,4,7,8,3,13,8,6,8,0,8,8,7 +G,2,2,3,3,2,7,6,6,6,7,6,10,2,9,4,9 +A,1,3,2,1,1,6,2,1,1,6,2,8,1,6,1,7 +C,1,0,1,1,0,6,7,6,8,7,6,14,0,8,4,10 +E,6,9,8,8,9,7,7,5,4,8,7,9,8,11,10,12 +R,5,9,7,7,4,10,7,3,7,10,2,7,3,6,4,11 +S,5,11,6,8,3,8,8,6,10,5,6,6,0,8,9,7 +V,3,7,4,5,3,6,12,2,2,8,10,8,4,11,4,8 +Z,1,0,2,0,0,7,7,3,10,8,6,8,0,8,6,8 +Y,8,13,6,8,4,6,8,4,4,10,7,5,3,10,4,4 +G,4,6,4,4,2,6,7,6,7,10,7,10,2,10,4,9 +I,1,3,2,2,0,7,7,1,7,13,6,8,0,8,0,7 +T,2,3,3,2,1,5,12,3,6,11,9,4,1,10,2,5 +Y,6,10,6,8,4,4,9,1,8,10,10,6,1,10,3,4 +Y,1,1,2,1,0,8,10,3,1,6,12,8,1,11,0,8 +V,6,9,8,8,9,7,8,6,5,7,6,7,6,11,8,11 +L,5,9,5,4,3,7,5,3,5,12,7,11,3,8,6,8 +H,5,7,7,5,5,7,7,3,6,10,5,8,3,8,3,8 +W,4,7,6,5,3,4,8,5,1,7,9,8,8,10,0,8 +V,4,8,6,6,3,9,12,3,3,4,11,9,3,9,2,8 +C,2,4,3,3,1,6,8,7,7,8,8,13,1,10,4,10 +O,2,0,2,1,0,7,7,6,5,7,6,8,2,8,3,8 +A,4,5,6,8,2,8,4,3,2,7,1,8,3,7,2,8 +G,4,2,5,4,3,6,6,6,6,6,6,10,2,9,4,8 +D,3,3,4,2,2,7,7,6,6,7,6,5,5,8,3,7 +E,4,11,4,8,3,3,6,6,12,7,7,15,0,8,7,7 +O,4,4,6,7,3,8,6,9,8,7,5,9,3,8,4,8 +J,3,10,4,8,3,14,3,5,4,13,2,9,0,7,0,8 +I,1,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +G,1,0,1,0,0,8,6,5,4,6,6,9,1,8,5,10 +T,5,6,5,4,3,4,12,2,7,12,10,5,1,10,1,5 +I,2,10,3,8,4,7,7,0,7,7,6,8,0,8,3,8 +R,2,4,3,2,2,8,8,4,5,9,5,7,2,7,4,10 +Y,3,5,4,4,2,4,10,2,7,11,10,6,1,11,3,5 +O,4,6,4,4,3,8,6,7,4,9,5,8,3,8,3,8 +P,6,10,8,8,6,7,10,4,4,13,6,3,1,10,3,8 +Y,6,7,8,10,10,9,9,4,2,4,8,9,5,13,10,10 +W,4,3,5,2,3,4,11,3,2,9,9,7,6,11,1,7 +G,2,5,3,4,2,6,7,6,6,10,7,11,2,9,4,9 +W,5,7,5,5,4,3,11,2,2,10,9,7,5,11,1,7 +X,3,7,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +T,2,10,4,7,1,8,14,0,6,6,11,8,0,8,0,8 +G,2,5,4,3,2,7,7,6,6,6,6,10,2,8,4,9 +D,10,15,10,8,5,8,6,5,6,10,3,6,6,6,6,10 +K,5,10,7,8,8,6,8,5,3,7,5,8,4,7,7,11 +N,9,13,7,7,3,5,9,4,6,3,4,11,6,10,2,7 +J,1,3,2,2,1,10,6,2,6,12,4,8,0,7,1,7 +E,3,8,3,6,2,3,7,6,10,7,6,14,0,8,7,8 +C,7,14,5,8,4,6,9,4,4,9,8,9,4,9,9,10 +O,5,10,7,8,3,7,6,9,8,6,5,6,3,8,4,8 +E,4,11,5,8,7,7,7,5,7,7,5,9,6,8,6,10 +X,5,7,7,6,7,9,7,2,4,7,6,6,3,10,7,8 +C,9,15,7,8,5,8,7,5,3,8,8,10,4,9,8,13 +Z,4,6,6,4,3,7,8,2,8,11,7,8,1,9,5,7 +S,5,10,5,5,2,7,7,3,4,13,7,9,2,9,3,8 +O,1,0,1,0,0,8,7,6,4,7,6,8,2,8,2,8 +D,4,8,5,6,4,7,7,7,8,6,5,5,3,8,3,7 +Q,2,4,3,5,3,8,7,6,2,8,7,9,2,9,4,8 +K,6,9,9,7,4,3,8,4,8,12,12,12,3,8,4,5 +J,2,8,3,6,2,9,6,2,7,12,3,8,1,6,1,6 +U,2,3,3,2,1,8,8,5,6,5,9,8,3,10,0,8 +V,4,9,6,6,4,8,10,2,1,6,10,8,3,10,3,9 +C,6,11,8,8,9,5,6,3,5,8,6,12,6,9,3,9 +K,4,11,6,8,6,5,6,4,7,6,6,11,3,8,6,9 +Z,6,10,8,8,5,8,7,2,10,12,5,8,1,7,6,7 +T,5,8,7,6,6,7,7,7,7,6,7,9,3,10,6,7 +S,5,10,6,8,3,8,8,6,9,5,6,7,0,8,9,8 +T,3,11,5,8,1,9,15,0,6,6,11,8,0,8,0,8 +V,5,7,5,5,3,3,12,2,2,9,10,8,3,10,1,7 +T,4,8,5,6,3,7,12,3,7,7,11,8,2,12,1,7 +R,4,7,5,5,5,7,7,4,6,6,5,7,3,7,4,8 +P,4,8,5,6,4,7,10,4,4,12,5,3,1,10,2,8 +R,4,9,5,7,4,10,7,3,7,10,2,7,3,6,3,11 +I,2,11,2,8,4,7,7,0,7,7,6,8,0,8,2,8 +Y,2,3,3,1,1,8,11,1,6,5,11,9,1,11,1,8 +G,4,9,5,6,3,6,7,7,6,9,7,12,2,8,4,10 +H,8,11,11,8,9,9,6,3,7,10,4,8,6,8,5,8 +T,4,5,5,3,2,7,12,3,7,7,11,8,2,11,1,8 +E,4,8,5,6,4,5,8,3,7,11,8,9,3,8,4,7 +P,3,5,5,3,2,7,10,5,3,11,5,3,1,10,2,8 +Q,2,2,3,4,2,8,7,6,2,6,6,9,2,9,5,9 +T,3,1,4,3,2,7,12,3,6,7,11,8,2,11,1,7 +D,8,15,7,8,5,6,7,4,7,8,5,7,6,9,7,5 +M,7,12,8,7,4,12,2,4,3,12,1,8,6,3,1,9 +K,6,11,9,8,5,3,7,3,8,11,11,12,3,8,4,6 +L,5,9,7,7,5,6,4,2,7,7,2,9,1,6,3,8 +G,3,6,4,4,3,6,7,6,5,9,7,10,2,9,4,10 +U,5,6,6,4,2,4,8,5,8,11,11,9,3,9,1,6 +D,4,6,4,4,3,6,7,8,7,8,8,7,2,9,3,8 +Q,2,3,3,3,2,8,8,5,2,5,7,10,2,9,5,9 +V,2,6,4,4,2,8,11,2,3,5,11,9,2,10,0,8 +K,2,1,2,2,1,5,7,8,1,7,6,11,3,8,2,11 +P,4,9,6,6,4,5,13,5,3,13,6,2,0,10,2,8 +H,6,8,8,6,5,10,6,4,6,10,2,7,4,7,4,9 +S,4,4,4,6,2,8,9,6,9,5,5,5,0,7,9,8 +S,7,15,7,8,4,5,9,3,5,13,8,7,3,7,4,7 +H,2,1,3,1,2,7,8,6,6,7,6,10,3,8,3,9 +C,3,6,4,4,2,6,7,6,7,7,6,12,1,8,4,10 +H,1,0,1,0,0,7,8,10,2,7,5,8,2,8,0,8 +Y,2,3,3,1,1,4,11,2,6,11,10,5,0,10,1,5 +A,5,9,7,7,5,8,2,2,2,6,2,7,3,8,4,7 +T,6,9,8,7,6,6,7,7,7,7,7,8,4,10,6,9 +Q,2,4,3,5,3,8,7,6,2,8,7,9,2,9,4,8 +H,4,5,5,6,5,8,4,3,2,7,4,7,3,7,5,8 +I,4,8,5,6,3,9,5,2,7,7,7,5,0,9,4,7 +X,3,5,5,4,2,7,8,1,8,10,8,8,2,8,3,7 +V,1,0,2,0,0,8,9,3,1,6,12,8,2,11,0,8 +W,4,6,6,4,4,10,11,3,2,4,9,7,7,11,0,7 +K,4,6,6,4,3,7,6,2,7,10,5,10,4,7,4,9 +U,2,0,2,1,0,8,5,11,4,6,13,8,3,10,0,8 +U,3,5,4,4,2,6,8,6,7,7,9,9,3,9,1,8 +D,4,11,6,8,5,7,7,8,7,7,6,4,3,8,3,7 +A,2,2,4,3,2,7,2,1,2,6,2,8,2,6,2,7 +V,4,7,5,5,2,6,11,3,4,8,12,8,2,10,1,9 +A,5,10,8,8,6,6,5,2,4,4,2,7,6,7,6,4 +K,9,12,10,7,5,7,7,3,6,10,9,9,6,12,4,8 +U,3,2,4,3,2,7,8,6,8,8,10,8,3,9,1,8 +U,7,12,6,6,3,9,6,6,6,3,9,8,5,10,3,6 +V,4,9,6,7,3,8,11,3,4,5,11,8,3,10,1,8 +T,2,7,4,4,1,10,15,1,5,4,11,9,0,8,0,8 +T,3,2,4,3,2,6,12,3,7,8,11,7,2,11,1,7 +W,5,9,7,7,4,6,8,5,2,7,8,8,9,10,0,8 +V,4,6,4,4,2,2,11,4,3,12,11,8,2,11,1,7 +D,4,7,5,5,4,7,7,7,8,6,5,5,3,8,3,7 +H,3,6,5,4,4,6,7,7,6,7,6,11,3,8,3,10 +D,5,11,6,8,6,7,7,5,6,6,5,8,7,9,3,7 +M,7,9,11,7,6,9,6,2,5,9,5,7,11,7,2,8 +U,6,9,8,7,6,6,7,8,6,6,6,11,6,8,8,3 +X,4,7,6,5,3,7,8,1,8,10,7,8,2,8,3,7 +K,4,6,6,4,3,3,8,3,7,11,11,11,3,8,3,6 +B,3,8,5,6,4,8,7,7,6,7,6,5,2,8,8,9 +O,4,9,5,6,4,7,7,8,6,7,6,8,2,8,3,8 +T,2,5,3,4,2,7,12,3,6,7,11,8,2,11,1,8 +E,6,10,8,8,8,7,7,5,3,7,6,9,5,8,9,8 +W,12,12,11,7,5,6,11,2,3,7,11,7,9,12,1,7 +G,5,10,5,8,4,5,6,6,5,9,8,12,2,9,4,10 +A,2,0,3,1,0,8,4,2,0,7,2,8,2,6,1,8 +R,4,4,4,6,2,5,9,9,4,7,5,8,3,8,5,10 +M,4,8,4,6,5,8,5,10,0,6,9,8,7,5,1,6 +D,5,10,6,8,3,5,7,10,10,7,7,6,3,8,4,8 +U,2,3,3,2,1,5,8,5,6,10,9,8,3,9,1,6 +Q,4,7,6,10,8,8,11,4,2,5,8,11,5,14,8,13 +R,4,8,6,6,5,10,7,2,6,11,2,7,4,7,3,10 +W,2,1,3,2,2,10,11,3,2,5,9,7,5,11,0,8 +A,6,13,6,8,4,12,2,5,1,12,2,10,3,2,3,10 +T,5,6,5,4,3,6,11,3,6,11,9,5,2,12,2,4 +C,5,7,5,5,3,5,7,5,7,11,9,14,2,9,3,8 +P,4,7,5,5,3,5,13,5,4,13,6,2,0,9,2,7 +Z,5,9,5,4,3,6,8,2,8,11,8,9,3,9,5,5 +W,2,1,2,2,1,7,8,4,0,7,8,8,6,10,0,8 +P,4,9,4,6,4,3,14,6,1,12,7,3,0,9,3,8 +F,1,3,2,2,1,5,10,3,5,10,9,6,1,10,2,7 +O,4,10,6,8,4,7,6,9,5,7,4,8,3,8,3,8 +Z,2,4,4,6,2,11,4,3,4,10,3,9,2,7,5,9 +M,3,6,6,4,7,6,5,3,1,6,5,8,7,7,2,8 +F,5,11,5,8,2,0,13,5,4,13,11,7,0,8,2,5 +I,1,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +A,3,7,5,5,3,12,3,2,2,9,1,8,2,6,2,7 +I,2,5,1,4,1,7,7,1,7,7,6,8,0,8,3,8 +C,4,8,5,6,2,5,8,6,8,11,9,13,1,9,3,7 +G,2,1,3,2,2,7,7,5,5,6,6,10,2,9,3,9 +E,1,0,1,0,1,5,7,5,7,7,6,12,0,8,6,9 +V,4,9,5,7,3,7,10,3,2,6,11,8,2,10,3,9 +B,1,1,2,2,1,7,7,7,5,6,6,7,2,8,7,9 +I,1,5,2,4,1,7,7,0,7,13,6,8,0,8,1,8 +I,6,8,7,10,7,8,9,4,5,7,7,8,3,7,9,7 +Z,3,9,4,6,2,7,7,4,14,10,6,8,0,8,8,8 +R,6,11,5,6,3,9,7,6,4,10,3,8,6,6,5,10 +V,6,10,8,8,5,7,11,3,2,5,10,9,3,11,4,8 +W,4,3,6,5,3,7,8,4,1,7,8,8,8,9,0,8 +K,4,6,6,4,3,9,6,2,6,10,3,8,4,8,4,11 +E,5,9,7,8,8,5,6,3,3,7,6,8,5,11,10,9 +I,4,11,5,8,3,7,7,0,8,14,6,8,0,8,1,8 +L,4,10,6,7,8,8,8,3,5,5,7,10,6,12,8,8 +G,5,8,7,7,8,8,9,5,3,7,6,8,7,11,8,9 +S,4,8,5,6,3,8,7,3,7,10,4,7,2,8,5,9 +N,3,5,5,3,2,8,8,2,5,10,4,6,5,8,1,7 +M,5,9,7,4,4,6,4,3,2,8,4,10,7,3,1,8 +T,1,1,2,1,0,8,14,1,5,6,10,8,0,8,0,8 +Y,3,2,5,3,2,7,10,1,7,7,11,8,1,11,2,8 +S,2,4,3,2,1,8,8,2,7,10,5,7,1,8,4,8 +M,2,3,4,2,2,7,7,3,3,9,8,8,5,5,1,7 +T,2,7,4,5,2,7,13,0,5,7,10,8,0,8,0,8 +Y,2,1,4,2,1,7,11,1,7,7,11,8,1,11,2,8 +E,4,9,4,6,3,3,7,6,11,7,6,15,0,8,7,7 +T,6,9,7,8,7,5,8,4,8,8,8,9,3,9,8,7 +V,6,8,5,6,3,4,12,1,2,8,10,7,4,12,1,8 +G,2,0,2,1,1,8,6,6,6,6,5,9,1,7,5,10 +E,3,2,4,3,3,7,7,5,7,7,5,9,2,8,6,10 +M,7,9,10,6,8,5,7,3,5,9,9,9,10,6,3,8 +F,4,8,4,6,3,1,13,4,3,12,10,6,0,8,2,6 +G,5,10,6,8,5,6,6,6,5,9,7,12,3,8,5,9 +R,4,5,5,7,3,5,12,8,4,7,2,9,3,7,6,11 +W,4,4,5,3,3,5,11,4,2,9,8,7,6,12,2,6 +K,6,10,8,7,6,6,7,1,6,10,7,10,3,8,4,8 +T,5,9,6,7,4,6,9,0,8,10,9,5,0,9,3,4 +Y,1,1,2,1,0,7,10,2,2,7,12,8,1,11,0,8 +P,6,10,7,8,7,6,8,6,4,8,7,8,5,9,7,10 +S,2,2,2,3,2,8,7,7,5,7,6,8,2,9,8,8 +W,4,4,5,3,3,6,11,3,2,7,9,8,7,11,1,8 +X,3,7,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +R,4,3,4,4,2,6,13,8,3,7,2,9,2,6,5,10 +F,3,2,3,4,2,5,11,3,6,11,9,5,1,10,3,6 +D,1,0,2,1,0,6,7,7,6,6,6,6,2,8,3,8 +C,2,7,3,5,1,5,7,7,8,7,6,14,1,8,4,9 +F,3,4,3,5,1,1,12,5,5,11,10,8,0,8,3,6 +X,4,7,5,6,5,7,8,2,5,7,6,7,3,5,7,8 +T,2,5,3,3,2,8,12,3,6,6,11,8,2,11,1,8 +K,3,6,3,4,1,3,7,7,3,7,6,11,4,8,2,11 +Z,5,6,4,8,3,11,4,3,5,11,4,8,3,9,7,10 +G,6,9,7,7,8,9,6,5,3,7,6,10,8,8,6,10 +I,1,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +T,5,6,5,4,2,4,14,5,5,12,9,3,1,11,1,5 +L,4,11,5,8,3,6,4,0,9,8,2,11,0,7,2,8 +M,6,5,9,4,8,9,7,5,5,7,6,8,12,9,6,4 +S,9,15,7,8,4,9,5,5,6,9,2,9,4,5,5,9 +G,3,4,5,6,2,7,5,7,8,6,5,11,1,8,6,11 +X,9,15,8,8,4,9,7,2,9,9,5,7,4,11,4,9 +Y,2,1,4,2,1,8,11,1,7,5,11,9,1,11,2,8 +X,6,9,7,8,8,8,6,1,6,7,6,8,4,13,9,8 +I,4,9,4,4,2,8,8,2,5,13,5,5,2,9,4,9 +D,2,5,3,3,2,7,7,6,6,7,6,4,2,8,3,7 +A,3,7,5,5,3,11,2,3,2,10,2,9,2,6,3,9 +S,4,9,5,6,3,8,7,5,9,5,6,7,0,8,9,8 +N,4,9,4,6,4,8,7,12,1,6,6,7,6,8,0,9 +X,3,6,6,4,4,9,8,3,6,7,7,7,5,11,6,7 +P,4,8,6,11,10,7,9,6,0,8,6,6,7,12,8,9 +B,3,6,4,4,3,11,6,3,6,11,3,7,2,8,4,11 +V,3,4,5,6,1,8,8,4,3,7,14,8,3,9,0,8 +G,4,8,5,6,2,7,7,7,8,6,6,8,2,7,6,11 +R,5,9,7,7,7,8,6,7,3,8,6,7,6,6,7,10 +D,4,7,5,5,4,7,7,5,5,7,6,8,4,9,3,7 +J,2,4,4,3,1,8,6,3,6,14,6,10,0,7,0,7 +H,2,2,3,3,2,6,7,6,6,7,6,10,3,8,3,9 +K,6,9,9,6,6,2,8,3,8,11,12,12,4,7,4,4 +D,3,4,4,3,2,7,7,6,7,7,6,5,2,8,3,7 +B,3,5,4,7,3,6,7,9,6,7,6,7,2,8,9,10 +C,2,7,3,5,2,5,8,7,8,6,7,14,1,8,4,9 +D,4,7,4,5,4,6,7,9,7,6,5,6,2,8,3,8 +A,2,6,4,4,2,7,4,2,0,6,2,8,2,6,1,7 +O,5,9,6,6,5,7,8,8,4,7,8,8,3,7,3,8 +E,3,7,4,5,3,6,7,6,8,7,7,10,2,8,6,9 +W,5,5,7,4,4,7,11,3,2,6,9,8,8,11,0,8 +R,2,4,3,3,2,7,8,5,4,6,5,6,2,7,4,8 +V,3,5,5,4,2,9,12,3,3,5,11,9,3,10,2,9 +P,2,3,3,2,1,6,10,5,4,9,7,3,1,10,4,6 +X,4,9,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +H,3,3,4,4,2,7,9,14,1,7,3,8,3,8,0,8 +J,3,6,4,4,2,6,7,3,5,14,7,11,1,6,1,7 +B,8,15,6,8,4,9,6,6,5,10,4,9,6,6,7,11 +X,2,3,3,2,1,7,7,3,9,6,6,8,2,8,5,7 +V,8,10,7,7,4,3,12,3,3,10,11,8,3,10,1,7 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +N,3,6,3,4,3,8,8,12,1,6,6,8,5,8,0,8 +S,8,13,8,7,4,8,6,4,3,13,8,9,3,10,3,9 +A,3,11,6,8,2,6,6,3,1,6,0,8,2,7,2,7 +D,9,14,8,8,6,8,5,4,7,10,5,7,6,9,7,8 +U,2,0,2,1,1,8,5,11,4,6,13,8,3,10,0,8 +F,1,3,3,2,1,5,10,2,5,13,7,5,1,9,1,8 +K,3,4,5,3,2,5,7,2,7,10,9,11,3,8,3,7 +G,3,7,4,5,5,8,7,4,1,7,6,9,6,8,6,12 +Q,3,7,4,6,2,9,8,8,5,5,8,9,3,8,5,9 +P,5,10,6,7,3,4,12,9,2,10,6,4,1,10,4,8 +S,7,15,6,9,3,7,4,4,4,7,2,7,3,6,6,8 +I,3,10,5,8,3,8,6,0,7,13,6,9,1,7,2,8 +Y,3,5,4,4,2,4,11,2,7,11,10,6,1,11,2,5 +P,7,11,10,8,7,7,11,5,4,12,5,2,1,10,3,8 +J,1,4,3,3,1,9,4,4,5,14,5,12,0,7,0,8 +E,4,5,5,4,4,6,8,4,4,8,7,10,4,10,8,11 +E,4,10,6,8,7,8,7,4,7,7,7,7,6,8,5,10 +H,3,5,6,4,4,9,6,3,6,10,4,7,3,8,3,8 +M,7,8,10,7,11,8,8,4,3,6,6,7,12,7,6,7 +U,2,0,2,1,0,7,5,11,4,7,13,8,3,10,0,8 +B,1,3,2,2,2,7,7,5,5,7,6,6,2,8,4,10 +X,3,6,5,4,4,7,8,3,5,6,6,9,3,8,8,8 +W,7,9,7,6,5,4,10,3,3,9,8,7,7,11,2,6 +R,5,5,7,4,6,7,7,4,3,8,5,8,7,8,6,6 +V,4,4,5,3,2,4,12,3,3,9,11,7,2,10,1,8 +G,3,3,4,2,2,7,7,5,6,6,6,9,2,9,4,8 +K,4,4,4,6,2,3,6,8,2,7,6,11,4,8,2,11 +E,2,4,3,3,2,7,7,5,7,7,7,9,2,8,5,9 +Z,6,8,8,10,7,11,6,4,5,9,3,7,3,6,6,8 +R,4,6,6,6,7,6,8,3,3,7,5,9,6,8,5,8 +Q,4,7,5,9,6,8,6,8,3,5,6,9,3,8,6,9 +P,2,6,3,4,3,5,10,7,2,9,6,5,1,10,2,8 +G,5,9,6,7,4,6,7,6,6,10,7,10,2,9,5,9 +E,3,6,3,4,3,3,7,5,9,7,6,13,0,8,6,9 +Q,4,8,6,10,7,8,8,8,2,5,6,11,3,8,6,10 +Y,5,7,7,9,8,10,10,5,3,6,7,8,6,11,8,5 +X,4,10,5,7,1,7,7,5,4,7,6,8,3,8,4,8 +B,1,1,1,1,1,7,7,7,5,6,6,7,1,8,6,9 +E,3,5,6,3,3,7,8,2,9,12,6,8,2,8,5,8 +L,3,4,4,7,1,0,1,6,6,0,0,6,0,8,0,8 +D,4,10,4,7,5,6,7,9,7,5,3,7,2,7,3,8 +E,5,10,7,8,6,9,7,2,7,11,5,8,3,8,5,10 +V,2,6,4,4,2,7,12,3,3,6,11,8,2,10,1,8 +W,6,5,7,4,4,3,11,2,3,10,10,8,7,11,1,7 +U,4,7,5,5,4,5,8,5,6,9,7,9,3,9,3,6 +G,5,11,7,9,3,7,6,8,9,6,6,10,1,8,6,11 +Y,2,2,4,3,1,6,10,1,6,8,11,9,1,11,2,8 +M,3,1,4,2,3,7,6,6,5,6,7,7,8,6,2,7 +M,6,10,9,8,7,7,7,2,5,9,8,8,9,7,3,8 +U,2,1,3,2,1,8,8,6,6,5,9,8,3,9,1,8 +E,4,9,6,6,6,7,7,4,7,7,6,9,6,8,5,10 +A,4,5,6,4,4,9,8,3,4,6,7,7,4,9,4,6 +P,3,9,4,6,3,4,11,8,2,10,6,4,1,10,3,8 +S,5,9,6,7,4,7,8,3,7,10,4,6,2,6,5,8 +U,4,6,5,4,2,4,8,5,6,10,9,9,3,9,2,7 +A,3,8,5,5,2,8,6,3,1,7,0,8,2,7,1,8 +X,3,4,4,3,2,7,7,3,9,6,6,9,2,8,5,8 +R,4,9,5,6,5,9,7,3,6,9,3,8,3,6,4,11 +W,3,6,5,4,2,4,8,5,1,7,8,8,8,10,0,8 +F,2,3,3,2,1,5,12,3,4,13,7,3,1,9,1,7 +J,1,3,3,2,1,8,6,3,6,14,5,10,0,7,0,7 +J,1,1,2,2,1,10,7,2,5,11,4,8,0,7,0,7 +A,2,7,4,4,1,8,4,3,1,7,1,8,2,6,2,8 +R,3,6,5,4,3,9,8,4,6,10,2,7,3,6,4,11 +X,4,8,5,6,3,7,7,4,9,6,6,8,3,8,6,8 +K,4,8,5,6,4,5,6,4,8,7,7,12,3,8,6,9 +E,4,8,6,6,4,6,8,4,8,11,9,9,2,9,5,6 +H,4,5,6,8,6,7,5,5,2,6,4,6,5,7,8,8 +U,8,10,9,8,6,3,8,5,8,9,8,10,6,9,4,3 +X,5,9,8,7,4,8,8,1,9,10,5,7,3,8,4,8 +T,6,9,8,8,9,7,8,4,9,7,6,8,3,8,8,6 +Q,4,5,5,6,5,8,5,6,3,9,6,11,3,8,5,8 +A,3,7,5,5,3,11,2,3,3,10,2,10,2,6,2,8 +Z,4,10,5,8,4,6,8,6,10,7,7,10,1,9,8,8 +V,9,13,7,7,3,7,11,5,6,8,10,5,4,11,4,7 +C,3,4,4,3,2,4,9,5,8,11,9,11,1,9,3,7 +D,3,9,5,7,5,8,7,6,6,7,6,4,3,8,3,7 +Z,3,8,4,6,3,7,8,3,11,8,6,8,0,8,7,7 +B,7,13,6,8,4,9,5,5,5,11,4,9,6,7,7,11 +Y,5,11,7,8,7,8,7,5,4,7,7,8,6,8,8,3 +C,6,10,6,8,3,3,8,5,8,10,10,14,1,7,3,7 +D,8,14,8,8,5,9,5,4,6,10,3,7,5,6,5,10 +E,5,9,7,7,5,9,6,2,8,11,5,9,3,7,5,10 +B,3,9,5,6,5,8,7,6,6,7,6,5,2,8,6,9 +R,4,9,5,7,3,6,10,9,4,7,5,8,3,8,6,11 +O,1,3,2,1,1,8,7,6,4,9,6,8,2,8,2,8 +J,4,11,5,8,4,6,7,3,5,15,7,11,1,6,1,6 +P,3,7,5,5,4,5,10,4,4,10,8,4,1,10,3,7 +R,2,1,3,2,1,6,10,8,2,7,5,8,2,7,5,10 +I,1,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +L,4,8,6,6,3,10,3,2,8,9,2,9,1,6,3,9 +E,3,2,3,4,3,7,7,6,7,7,6,9,2,8,6,9 +Y,1,3,2,1,1,8,10,1,6,5,10,8,1,11,1,8 +A,9,15,7,8,4,8,2,3,2,8,4,12,5,5,5,7 +Q,3,6,5,4,4,8,5,7,4,7,7,6,3,6,5,8 +Z,1,3,2,2,1,7,7,4,7,6,6,8,1,8,6,8 +B,5,10,7,8,7,7,7,8,7,6,6,6,2,8,8,10 +F,1,0,1,0,0,3,12,4,2,11,8,6,0,8,2,7 +C,6,12,4,6,2,6,9,6,8,11,8,10,2,8,5,9 +M,3,6,5,4,4,11,5,3,4,9,3,6,7,6,2,8 +W,3,3,4,1,2,5,11,3,2,9,9,7,6,11,1,6 +O,5,10,6,8,6,8,6,7,3,10,4,8,4,9,4,6 +N,5,8,5,6,4,8,7,13,1,6,6,7,6,8,1,10 +B,4,7,6,6,7,8,8,5,5,7,6,8,7,7,9,6 +Q,5,8,6,12,10,8,10,4,2,6,8,10,7,14,9,14 +U,5,10,5,7,2,7,4,15,6,7,13,8,3,9,0,8 +Y,5,8,6,6,3,4,10,2,8,11,11,6,1,11,3,4 +E,4,10,5,8,7,7,8,3,6,5,7,10,5,10,10,11 +C,5,10,6,8,2,6,7,7,10,6,6,15,1,8,4,9 +I,2,7,3,5,1,7,8,0,7,13,6,7,0,8,1,7 +U,5,8,6,6,3,4,8,6,8,9,8,9,4,10,4,3 +N,4,5,5,4,3,7,9,5,5,7,7,6,5,9,2,5 +E,5,8,7,6,4,4,9,3,9,11,9,10,2,8,4,5 +S,2,3,3,2,1,7,7,2,7,10,5,8,1,8,4,8 +K,1,0,1,0,0,4,6,5,1,7,6,10,2,7,1,10 +U,5,9,5,6,2,7,4,14,5,7,14,8,3,9,0,8 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +S,4,6,6,4,6,8,6,4,4,8,6,9,4,8,10,8 +L,2,6,3,4,1,3,3,6,8,1,1,5,0,7,1,6 +E,1,3,3,2,1,6,7,2,7,11,7,9,1,8,3,8 +Z,5,9,6,7,5,8,7,5,10,7,6,8,1,8,7,8 +L,4,4,4,6,1,0,0,6,6,0,1,5,0,8,0,8 +X,4,4,5,6,1,7,7,4,4,7,6,8,3,8,4,8 +Q,7,12,7,6,4,9,4,4,8,11,4,10,3,7,8,11 +J,2,9,2,6,2,14,4,4,4,12,1,8,0,7,0,8 +R,2,3,3,1,2,8,8,3,5,9,5,7,2,7,4,10 +A,2,3,3,2,1,10,2,2,1,8,2,9,2,5,1,9 +C,4,8,5,6,2,5,9,7,8,12,9,11,1,10,3,7 +H,8,10,11,7,7,6,7,3,7,10,8,9,3,8,3,7 +Q,2,2,3,3,2,7,9,4,2,7,8,10,2,9,4,8 +Y,5,9,5,6,3,3,10,2,6,10,12,7,2,11,2,5 +Z,1,0,2,1,0,7,7,3,11,8,6,8,0,8,6,8 +O,3,4,4,2,2,7,7,7,5,7,5,8,2,8,3,8 +V,6,9,6,7,4,3,12,2,3,9,11,8,2,10,1,8 +W,4,10,7,8,6,7,8,4,1,7,9,8,7,11,0,8 +Y,3,5,6,7,1,6,11,2,3,9,12,8,1,10,0,8 +I,3,8,4,6,2,7,7,0,9,14,6,8,0,8,1,8 +G,3,4,4,3,2,6,6,6,6,9,7,11,2,9,4,10 +L,2,3,2,2,1,4,5,2,7,3,2,8,0,7,1,6 +E,7,12,5,6,4,8,7,4,4,10,5,9,3,9,8,11 +Y,3,8,6,6,3,7,9,1,6,6,11,8,2,11,2,8 +U,8,11,8,8,4,3,9,5,7,11,12,10,3,9,2,6 +H,4,9,6,6,5,6,7,7,6,7,6,11,3,8,3,9 +G,3,2,4,4,3,6,6,6,6,6,6,10,2,9,4,9 +S,4,4,5,6,2,7,6,5,9,5,6,10,0,8,9,8 +Y,4,6,6,8,6,10,11,5,4,6,7,7,5,10,7,4 +Z,6,10,8,8,5,7,8,2,9,12,7,6,2,8,6,7 +B,5,11,7,8,7,9,6,3,7,10,4,8,3,7,5,10 +M,4,6,5,4,2,8,7,12,1,7,9,8,8,6,0,8 +N,4,7,6,5,3,9,7,3,4,10,5,6,5,8,1,7 +Y,3,4,5,5,1,8,12,2,3,6,12,8,1,10,0,8 +L,4,9,5,7,3,3,3,6,8,1,0,6,0,6,1,6 +R,4,10,5,8,3,5,9,10,5,7,5,8,3,8,6,10 +E,1,0,2,1,1,5,7,5,8,7,6,12,0,8,6,9 +A,6,9,6,4,3,11,0,4,1,11,5,13,4,5,4,11 +F,4,10,6,7,5,3,11,3,5,11,10,7,1,10,3,6 +K,8,11,11,8,9,8,6,1,6,9,5,9,7,7,6,9 +J,3,10,4,8,5,10,6,2,4,9,4,6,3,7,6,8 +Y,5,6,7,8,1,6,11,3,2,9,12,8,1,11,0,8 +L,4,8,6,6,4,7,4,1,8,8,2,9,1,6,3,8 +F,5,7,7,5,6,7,8,5,5,7,6,8,4,11,9,10 +O,5,10,7,8,5,8,7,9,4,7,6,7,3,8,4,9 +F,2,3,4,2,1,6,10,3,5,13,6,5,1,9,1,7 +B,1,0,1,1,1,7,7,7,4,6,6,7,1,8,6,9 +K,3,5,4,4,3,5,7,4,7,6,6,11,3,8,5,9 +M,6,9,8,8,11,7,7,4,4,6,6,8,11,8,5,5 +G,3,9,5,6,4,7,6,7,5,6,6,8,2,7,5,11 +O,4,6,4,4,3,6,8,7,4,10,8,8,3,8,2,7 +L,2,5,4,4,2,6,4,1,8,8,2,10,0,7,2,8 +A,3,6,4,4,3,8,2,2,2,7,2,8,2,6,2,7 +P,3,6,5,9,7,7,11,5,0,9,7,5,4,11,5,8 +F,2,4,4,3,1,5,11,3,4,13,7,4,1,9,1,7 +V,5,7,5,5,2,4,11,3,3,9,11,7,3,10,1,7 +A,4,9,6,7,6,8,7,8,4,7,6,8,3,8,8,4 +T,5,11,5,6,2,5,11,2,7,12,8,5,2,9,3,4 +B,5,10,6,7,6,9,6,3,5,7,6,7,7,8,6,9 +W,4,3,5,2,2,5,11,3,2,9,9,7,6,11,1,6 +G,1,3,2,2,1,7,6,5,4,7,6,10,2,9,3,9 +V,3,6,5,4,1,8,8,4,2,6,14,8,3,10,0,8 +U,6,10,5,5,3,7,5,4,5,3,8,6,5,7,2,7 +C,4,8,5,6,3,6,7,6,7,12,8,11,2,10,4,7 +H,3,3,5,2,2,8,6,3,6,10,5,8,3,8,3,8 +T,4,10,6,7,4,9,11,2,8,5,12,8,1,11,1,9 +E,5,7,7,5,4,10,6,2,8,11,4,8,2,8,5,12 +O,6,10,8,8,10,8,7,6,1,7,6,8,9,10,6,11 +R,4,8,6,6,7,5,6,4,4,7,6,9,8,11,7,6 +N,6,11,8,8,5,9,7,3,5,10,4,6,6,8,1,7 +N,11,14,9,8,4,10,12,6,4,4,6,10,5,11,2,5 +S,5,8,7,7,9,7,8,5,5,7,7,7,5,10,10,11 +F,3,8,4,6,2,1,14,5,3,12,9,5,0,8,2,6 +Z,3,7,4,5,3,7,7,3,12,8,6,8,0,8,7,8 +N,7,9,8,4,3,5,9,3,4,13,9,9,5,8,0,8 +J,2,4,4,3,1,9,6,2,6,14,5,10,0,7,0,7 +W,3,4,4,3,2,7,11,2,2,6,9,8,6,11,0,8 +L,4,10,4,7,2,0,2,4,6,1,0,8,0,8,0,8 +C,9,14,7,8,5,8,6,5,3,9,8,10,6,8,9,10 +U,3,4,4,3,2,5,8,5,7,10,9,9,3,9,2,6 +K,6,10,8,8,8,6,9,6,5,8,5,8,4,7,6,11 +Z,4,11,6,8,7,8,7,3,9,7,6,7,1,7,11,9 +D,4,4,5,6,3,5,6,10,9,5,5,5,3,8,4,8 +H,5,10,7,8,7,6,8,5,5,7,6,7,6,7,6,11 +V,2,8,4,6,1,9,8,4,2,6,13,8,3,10,0,8 +R,4,4,5,6,3,6,9,10,5,6,5,8,3,8,5,10 +L,4,11,5,8,3,6,4,3,8,6,1,8,1,6,3,7 +A,3,6,5,4,3,8,2,2,2,7,2,8,2,6,2,7 +M,4,7,5,5,3,8,7,12,1,6,9,8,8,6,0,8 +H,3,3,4,2,2,7,7,6,6,7,6,8,3,8,3,8 +A,2,1,4,2,1,7,2,2,2,6,2,8,2,6,2,7 +R,4,8,6,6,4,9,7,3,6,10,3,6,3,7,4,10 +C,3,5,4,3,2,6,8,7,8,8,8,13,1,9,4,10 +B,3,2,4,4,4,7,7,5,5,6,6,6,2,8,6,9 +U,3,6,4,4,3,7,5,12,4,7,11,8,3,9,0,8 +D,6,7,8,6,6,6,7,5,6,4,3,6,3,8,5,6 +H,3,8,4,6,3,8,7,13,1,7,6,8,3,8,0,8 +U,3,3,4,2,2,5,8,5,7,10,9,9,3,9,2,6 +D,4,9,6,6,6,8,8,5,5,10,5,5,3,8,3,8 +L,3,6,3,4,2,0,2,4,5,1,1,7,0,8,0,8 +D,5,4,5,6,3,5,7,10,9,7,6,5,3,8,4,8 +G,7,9,9,8,10,7,8,6,3,7,7,8,9,11,8,9 +E,3,8,4,6,5,6,7,3,6,8,7,10,4,10,8,10 +B,6,10,9,7,7,11,6,2,7,11,3,8,4,7,5,12 +F,4,8,5,6,3,7,10,4,5,13,7,5,2,9,2,7 +U,4,4,5,3,2,4,8,5,8,10,9,9,3,9,2,5 +U,9,11,10,8,5,3,9,6,8,11,11,9,3,9,2,6 +I,4,11,5,8,3,8,6,0,7,13,6,9,2,7,3,8 +O,4,7,4,5,3,8,7,8,5,10,6,8,3,8,3,8 +D,4,6,6,4,4,8,8,5,5,9,5,4,4,8,4,8 +N,4,9,6,7,4,7,8,6,5,7,6,6,6,9,2,5 +E,2,6,4,4,3,7,8,6,8,6,5,9,2,8,6,9 +I,4,8,5,6,3,7,6,2,7,7,7,8,3,8,4,8 +N,4,8,6,6,5,7,6,8,5,6,4,7,3,7,3,8 +X,4,10,6,8,6,6,7,3,6,7,7,11,5,6,7,7 +F,8,11,7,6,5,7,12,3,4,12,6,3,4,10,8,5 +G,4,8,5,6,2,8,6,8,8,6,6,9,2,7,6,10 +Y,10,9,8,13,5,8,9,3,3,6,11,5,4,10,7,7 +X,4,8,6,6,3,7,8,0,7,9,7,8,2,8,3,7 +Q,4,7,5,9,6,10,10,6,3,3,8,12,3,9,7,10 +T,2,3,3,4,1,8,14,0,6,6,11,8,0,8,0,8 +B,4,6,5,4,4,9,7,3,6,10,4,6,2,8,5,10 +B,2,1,2,2,2,7,8,8,5,7,6,7,2,8,8,9 +G,5,10,7,7,6,6,6,7,5,5,6,10,2,8,4,8 +V,3,7,5,5,1,8,8,4,2,7,14,8,3,10,0,8 +P,7,9,6,4,3,5,12,6,1,11,5,4,4,10,4,8 +Y,4,4,6,6,6,10,9,5,3,7,7,7,5,10,6,5 +N,4,10,6,7,5,6,10,5,3,7,7,9,5,9,1,8 +V,3,8,5,6,6,6,6,5,2,8,8,9,5,9,5,8 +X,5,8,6,7,7,6,8,2,5,8,7,10,2,8,7,8 +A,4,6,7,8,2,8,6,3,1,7,0,8,3,7,2,8 +F,5,11,5,8,4,1,12,4,4,11,10,8,0,8,2,6 +S,4,10,5,8,4,8,7,8,6,8,5,7,2,8,9,8 +X,4,5,5,7,1,7,7,5,4,7,6,8,3,8,4,8 +U,3,8,5,6,8,7,6,4,3,7,7,8,7,10,5,6 +B,4,9,6,6,6,7,8,6,4,6,4,6,4,8,6,7 +K,8,15,8,8,6,6,7,2,6,10,4,9,5,5,3,7 +B,5,9,8,7,6,8,7,5,6,9,5,6,3,8,7,10 +V,3,3,4,2,1,5,13,4,3,10,11,6,2,10,1,8 +S,4,7,6,5,3,9,7,5,8,11,2,8,2,6,4,11 +M,5,7,8,5,6,3,7,4,5,11,11,10,5,8,2,6 +V,3,4,5,6,1,7,8,4,3,7,14,8,3,9,0,8 +Q,2,2,3,3,2,8,6,6,3,6,6,9,2,9,3,8 +B,5,9,8,8,9,7,8,5,4,8,6,8,7,9,8,8 +B,4,10,4,8,4,6,6,10,7,6,6,7,2,8,9,10 +F,3,4,5,3,2,6,10,2,6,13,6,5,1,9,3,7 +B,8,9,6,5,3,9,7,6,6,10,4,9,6,6,6,10 +N,1,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +B,1,3,2,2,2,8,6,2,4,10,5,7,2,8,2,9 +S,7,11,7,6,3,8,6,4,4,13,6,9,3,8,3,8 +U,8,10,8,8,5,4,8,5,9,11,10,9,3,9,2,6 +Z,2,4,4,3,1,7,8,2,9,11,7,7,1,8,5,6 +K,4,9,5,7,4,3,8,7,3,7,5,11,3,8,2,11 +E,3,3,4,5,2,3,7,6,11,7,6,15,0,8,7,7 +E,6,9,8,8,10,6,7,4,3,7,6,9,7,11,11,12 +P,5,10,7,8,4,10,7,4,6,12,3,4,2,9,3,9 +Y,2,3,3,2,1,6,10,1,6,8,11,8,1,11,2,8 +O,6,10,8,8,5,8,10,9,6,8,8,5,5,8,5,9 +C,6,11,7,8,9,7,5,4,4,8,7,11,6,10,5,8 +G,4,10,5,7,4,5,6,6,5,9,8,11,2,9,4,10 +F,6,9,8,10,8,6,10,4,4,9,7,6,5,8,9,8 +A,4,11,7,8,5,12,2,2,2,10,2,9,2,6,3,8 +O,4,6,4,4,3,7,7,7,4,10,7,8,3,8,3,8 +Q,6,8,6,9,7,7,8,6,3,8,8,10,3,9,6,7 +Q,2,1,3,2,1,8,6,7,5,6,6,8,3,8,4,8 +I,1,3,0,2,0,7,7,1,7,7,6,8,0,8,2,8 +Y,3,5,4,3,2,4,11,2,7,11,10,6,1,11,2,5 +N,5,7,7,5,3,7,7,3,4,10,7,8,5,8,0,7 +W,3,4,5,3,3,9,11,3,2,5,9,7,6,10,0,8 +I,6,10,5,6,3,7,10,3,4,12,5,4,2,9,6,9 +A,6,9,5,4,2,11,3,3,1,9,3,10,4,5,4,10 +C,4,9,6,7,4,7,8,8,6,6,6,9,4,7,4,8 +Q,6,12,5,7,4,12,4,4,5,11,2,7,4,9,5,13 +A,1,1,2,1,0,7,4,2,0,7,2,8,2,7,1,8 +U,4,8,5,6,3,4,9,5,6,9,8,9,3,9,2,6 +W,5,5,7,7,4,8,8,5,2,7,8,8,9,9,0,8 +K,2,3,3,2,2,6,7,1,6,10,7,10,3,8,1,8 +M,4,9,5,6,3,7,7,12,1,7,9,8,8,6,0,8 +X,2,4,4,3,2,10,6,2,8,10,3,7,2,8,3,9 +O,5,9,6,7,4,8,7,8,5,7,6,8,3,8,3,8 +W,3,4,4,3,3,4,10,4,2,9,8,7,5,11,1,6 +E,2,5,4,3,2,6,8,2,7,11,7,9,2,8,4,8 +E,2,3,2,2,1,7,7,5,7,7,5,8,2,8,5,10 +F,2,4,3,3,2,5,10,4,5,10,9,5,2,9,3,6 +Y,3,8,5,5,1,6,12,2,3,9,12,7,1,10,0,8 +V,8,13,7,7,4,5,10,4,5,9,9,5,4,10,2,8 +J,4,10,4,8,3,15,3,3,5,12,0,7,0,8,0,8 +X,3,3,5,2,2,5,9,2,7,10,9,8,2,8,3,6 +W,5,7,7,6,9,7,6,4,5,7,5,8,9,9,7,8 +X,2,3,3,2,2,7,7,3,9,6,6,8,2,8,6,8 +D,5,10,5,6,4,6,8,4,6,9,6,6,5,9,6,5 +G,5,11,6,8,5,6,6,6,6,10,6,13,3,8,4,9 +T,8,12,8,7,4,7,8,2,7,12,7,7,3,9,5,6 +B,2,3,3,1,2,7,7,4,5,7,6,6,1,8,5,9 +N,6,7,8,5,4,4,11,3,4,10,10,9,5,8,1,8 +Q,5,13,5,8,4,8,6,5,7,11,5,7,3,8,9,9 +A,6,10,5,5,3,12,5,4,1,8,3,9,5,6,4,10 +F,8,10,7,5,3,6,10,3,7,11,7,6,2,9,5,6 +I,2,8,3,6,2,7,7,0,6,12,6,8,0,8,1,8 +B,3,3,3,4,3,7,7,9,6,7,6,7,2,8,9,10 +Q,2,3,3,3,2,9,10,5,2,5,7,10,3,9,5,10 +J,0,0,1,0,0,12,4,4,3,11,4,10,0,7,0,8 +Y,9,14,8,8,5,4,9,4,3,11,10,6,4,11,4,5 +C,4,7,6,5,6,6,6,4,4,8,6,11,6,9,3,9 +X,5,10,8,8,7,8,6,3,6,7,4,6,6,7,9,6 +G,4,7,6,5,4,6,6,6,5,6,6,11,2,9,4,9 +K,4,9,5,6,2,3,7,8,2,7,6,11,4,8,2,11 +C,4,9,5,6,2,6,8,7,11,5,6,13,1,7,4,9 +F,1,0,2,0,0,3,12,5,2,11,8,6,0,8,2,7 +S,5,11,7,9,5,8,7,3,6,10,7,8,2,8,5,8 +R,5,9,5,4,4,9,7,4,6,10,2,6,5,5,5,6 +R,4,11,4,8,3,6,9,10,5,7,6,8,3,8,6,11 +K,3,9,4,6,2,3,7,7,2,7,6,11,3,8,3,10 +R,2,6,2,4,2,6,8,8,4,7,5,7,2,7,4,10 +E,4,8,6,6,6,8,10,6,4,6,6,9,4,6,7,9 +N,5,9,7,6,7,6,8,3,4,8,7,8,6,9,5,4 +Z,3,7,4,5,2,7,8,2,10,11,7,8,1,9,6,7 +D,4,5,5,4,4,7,7,7,7,7,6,5,2,8,3,7 +P,2,4,3,2,2,5,10,4,4,10,8,4,1,10,3,7 +E,5,6,6,6,6,7,8,5,4,8,7,10,6,10,8,11 +Z,4,9,5,7,2,7,7,4,15,9,6,8,0,8,8,8 +R,3,8,3,6,3,6,9,8,3,7,5,8,2,7,5,11 +X,2,1,2,1,0,7,7,4,4,7,6,8,2,8,4,8 +N,8,13,10,8,5,5,8,2,4,12,7,9,6,8,0,7 +S,3,10,4,8,2,9,8,6,10,5,5,5,0,7,9,7 +W,7,11,7,8,8,4,10,2,3,9,8,7,7,11,2,6 +Q,4,6,5,7,5,9,7,7,3,5,7,9,3,9,6,9 +Y,2,2,3,3,1,7,10,1,7,7,11,8,1,11,2,8 +C,2,4,3,2,1,4,9,4,7,12,10,10,1,9,2,7 +J,2,8,2,6,1,12,3,9,4,13,4,12,1,6,0,8 +M,3,7,4,5,5,8,7,6,3,7,5,8,5,9,5,8 +L,3,8,4,6,2,9,3,1,7,9,2,10,0,7,3,9 +U,5,10,5,7,2,8,5,13,5,6,15,8,3,9,0,8 +S,4,5,5,7,3,9,9,6,10,5,5,5,0,7,9,8 +A,3,5,5,8,2,7,6,3,1,6,0,8,2,7,1,8 +F,8,10,7,6,5,6,12,3,4,11,6,3,4,10,7,6 +G,6,10,8,8,5,6,6,7,8,6,5,10,2,9,4,8 +B,5,8,8,6,5,9,7,4,7,10,5,6,2,8,6,10 +U,6,10,6,8,4,4,8,5,7,10,9,9,3,9,2,6 +D,6,9,8,6,6,7,7,8,5,7,6,5,4,8,4,7 +F,8,13,7,7,4,5,9,2,7,11,7,6,2,10,5,5 +H,4,5,6,7,5,9,10,3,2,8,7,7,3,10,8,6 +P,6,9,8,7,4,9,9,3,6,14,4,3,1,10,3,9 +E,7,9,5,5,2,7,7,5,7,10,6,9,1,9,7,9 +H,3,6,4,4,2,7,7,14,1,7,6,8,3,8,0,8 +L,5,9,5,7,1,0,0,7,6,0,1,4,0,8,0,8 +X,4,8,6,6,4,9,6,1,8,10,3,7,3,9,4,9 +D,2,3,3,2,2,7,7,6,6,7,6,5,2,8,3,7 +Z,5,10,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +F,3,2,4,4,3,4,11,3,6,11,10,5,1,10,3,6 +X,7,11,6,6,3,5,8,3,9,10,9,10,4,7,4,5 +O,4,7,4,5,3,7,7,7,4,9,7,10,3,8,3,9 +T,6,11,5,6,2,5,10,3,7,13,7,5,2,8,4,4 +W,10,10,10,5,4,8,10,4,2,5,10,7,10,12,2,6 +G,1,0,2,0,1,8,7,5,5,6,6,9,1,8,5,10 +Z,3,10,4,8,5,6,8,5,9,7,7,9,2,9,7,8 +L,1,3,2,2,1,7,4,2,7,7,2,9,0,7,2,8 +I,5,8,6,6,4,7,6,2,7,7,6,8,0,9,4,8 +Q,6,7,6,9,7,8,5,6,3,9,5,11,5,7,7,5 +M,8,10,8,6,5,4,9,5,4,4,3,12,9,10,2,8 +Z,1,4,2,3,2,8,7,5,8,6,6,7,2,8,7,8 +O,9,14,6,8,5,5,7,7,4,10,7,10,5,10,5,8 +B,4,6,5,4,4,7,9,5,6,10,6,6,2,8,6,8 +J,1,3,2,2,1,10,6,2,6,12,4,8,0,7,1,7 +J,2,7,3,5,1,14,2,6,5,14,2,11,0,7,0,8 +C,5,10,6,7,3,5,9,7,8,6,8,14,1,7,4,9 +U,3,7,3,5,3,7,7,11,4,7,11,8,3,9,0,8 +B,4,2,4,4,4,7,7,5,5,6,6,6,2,8,7,11 +N,6,11,9,8,5,3,10,3,4,10,11,10,5,7,1,7 +X,3,6,4,4,2,7,7,4,4,7,6,8,3,8,4,8 +J,2,7,2,5,1,14,2,6,5,14,1,10,0,7,0,8 +N,4,4,5,6,2,7,7,14,2,4,6,8,6,8,0,8 +F,3,7,4,5,3,8,9,2,6,13,5,5,1,10,2,9 +R,4,10,5,7,3,5,11,8,4,7,4,8,3,7,7,11 +W,1,0,2,1,1,7,8,4,0,7,8,8,5,10,0,8 +K,6,8,9,6,4,3,9,3,7,11,11,11,4,7,3,6 +F,3,6,5,4,3,5,10,2,6,10,9,6,4,10,3,6 +T,5,11,7,9,5,7,12,3,7,8,12,8,2,12,1,7 +L,6,14,6,8,4,10,3,4,3,12,6,10,4,9,6,9 +H,3,7,6,5,3,4,8,3,6,10,10,9,3,8,3,6 +P,3,3,5,2,2,7,10,3,4,12,4,3,1,10,3,8 +G,9,13,7,7,5,9,6,5,4,9,5,7,3,9,8,9 +F,4,9,6,6,5,8,8,2,6,12,5,6,3,8,3,8 +B,2,3,3,2,2,7,7,5,5,7,6,6,2,8,5,9 +O,5,9,6,6,5,7,8,7,6,7,6,6,2,8,3,8 +N,10,15,12,8,5,10,6,4,4,13,2,7,7,7,0,6 +C,4,10,5,8,4,6,7,6,8,5,7,12,1,7,4,9 +P,2,4,4,3,2,8,9,3,4,12,4,4,4,10,4,8 +F,5,9,7,6,7,7,6,6,4,7,6,8,4,10,8,11 +K,3,9,4,6,2,3,7,7,2,7,7,11,4,8,3,10 +G,3,8,4,6,2,7,6,7,8,6,6,8,1,8,6,11 +A,2,4,4,3,2,8,2,2,1,7,2,8,2,7,3,6 +X,7,11,7,6,3,4,8,3,9,9,11,10,4,11,4,5 +O,1,0,1,0,0,7,7,6,4,7,6,8,2,8,3,8 +Q,5,8,6,9,6,8,6,7,3,9,7,10,3,8,6,7 +N,5,5,6,4,5,7,9,5,4,7,4,8,6,9,4,6 +J,4,11,5,8,3,7,8,2,6,14,5,8,1,8,1,8 +C,7,11,7,8,5,6,6,6,7,13,8,13,4,9,4,6 +S,4,8,6,6,8,8,8,3,3,7,6,7,3,7,13,4 +G,6,11,7,8,6,6,6,6,5,5,6,10,2,9,4,8 +T,4,8,5,6,4,6,11,2,7,11,9,5,2,11,3,4 +J,4,10,6,7,3,7,6,3,5,15,7,11,1,6,1,7 +K,5,6,7,4,5,6,7,1,6,10,7,10,3,8,3,8 +Q,4,7,4,9,4,7,7,6,3,8,8,10,3,9,6,8 +B,5,10,5,8,4,6,9,9,8,7,5,7,2,8,9,10 +D,5,9,5,4,3,8,7,3,6,10,5,7,5,8,7,6 +U,6,7,6,5,3,3,8,5,7,10,10,9,3,9,2,6 +S,3,7,4,5,2,7,5,6,9,4,6,9,0,9,9,8 +X,3,9,4,7,3,7,7,4,4,7,6,8,2,8,4,8 +W,5,7,5,5,4,6,10,4,3,8,7,6,6,12,3,6 +Z,9,10,7,14,6,8,7,4,2,12,6,8,3,9,13,6 +D,2,3,4,2,2,9,7,4,6,10,4,6,2,8,3,8 +H,2,1,3,2,2,6,8,6,5,7,6,8,3,8,3,8 +K,1,1,2,1,0,4,6,6,2,7,6,11,3,8,2,10 +P,2,5,4,3,2,7,10,3,4,12,5,3,1,10,2,8 +U,6,10,6,8,3,7,3,15,6,7,13,8,3,9,0,8 +W,7,8,9,7,11,7,8,5,5,6,5,8,10,10,9,7 +Q,4,7,6,7,3,9,6,8,7,7,5,10,3,8,4,8 +G,3,9,4,7,2,7,6,8,7,6,6,10,2,7,5,10 +I,6,10,6,6,3,8,8,3,5,13,4,5,2,9,5,11 +I,1,6,3,4,3,8,7,2,4,8,5,5,3,9,4,5 +Y,5,7,5,5,2,3,10,2,7,11,11,6,1,11,2,5 +G,5,10,6,7,4,6,7,7,7,9,8,11,2,8,5,9 +K,2,4,4,3,2,7,7,1,7,10,5,9,3,8,3,8 +A,2,1,4,2,1,9,2,2,1,8,2,8,2,6,2,7 +C,4,9,4,4,3,7,7,4,3,9,8,10,3,9,8,10 +W,9,11,9,6,5,1,10,3,4,11,12,9,8,11,1,5 +Q,5,10,7,9,4,9,9,8,6,5,9,9,3,7,5,9 +X,4,7,6,5,5,7,8,2,6,7,6,8,4,8,5,8 +K,4,5,5,4,5,8,7,2,4,8,3,8,4,4,3,9 +G,4,8,6,7,6,7,8,5,3,7,6,9,6,11,8,10 +I,1,2,1,3,1,7,7,1,7,7,6,8,0,8,2,8 +T,3,4,3,3,1,5,12,3,6,11,9,4,1,11,2,5 +X,5,5,6,7,2,7,7,5,4,7,6,8,3,8,4,8 +J,2,8,3,6,2,12,3,7,3,13,5,11,1,6,0,8 +Z,4,9,6,6,4,7,8,2,10,12,7,8,1,9,6,8 +O,6,10,8,8,5,7,7,8,4,6,6,11,5,8,5,6 +E,3,8,4,6,2,3,7,6,11,7,6,15,0,8,7,7 +N,4,7,6,5,4,12,7,3,5,10,0,4,5,9,1,7 +K,8,12,7,7,3,7,7,3,6,9,6,8,6,8,4,7 +Z,4,8,6,6,6,8,8,3,8,7,7,7,1,8,9,8 +C,3,4,5,7,2,5,8,7,10,6,7,12,1,7,4,8 +O,4,4,6,6,2,8,7,8,8,7,6,9,3,8,4,8 +Y,3,5,5,8,6,7,11,3,3,7,8,9,3,11,7,5 +R,6,10,9,7,8,9,8,6,6,8,5,7,5,9,6,12 +T,4,6,5,4,2,5,11,2,8,11,9,5,1,11,2,4 +Y,3,9,4,7,2,6,11,0,4,8,11,8,0,10,0,8 +W,8,11,8,8,7,6,10,4,3,8,7,6,11,12,4,4 +C,2,4,3,3,1,4,8,4,7,10,9,13,1,8,2,7 +G,6,10,8,8,8,9,8,6,3,5,7,10,9,8,5,9 +P,3,7,4,4,2,4,13,8,1,11,6,3,1,10,4,8 +D,6,10,8,8,6,7,7,5,6,7,6,8,7,7,3,8 +C,5,5,6,7,2,5,7,6,11,7,6,14,1,8,4,9 +V,3,8,5,6,2,6,9,4,1,8,12,8,2,10,0,8 +J,3,10,4,8,3,13,3,7,4,13,3,10,1,6,0,8 +M,5,9,8,6,10,7,7,3,2,7,4,8,15,6,3,7 +M,7,9,10,7,8,12,5,3,5,9,2,5,10,5,2,8 +A,2,4,4,3,2,11,2,2,2,9,2,9,2,6,1,8 +I,2,9,2,7,2,7,7,0,8,7,6,8,0,8,3,8 +K,2,3,4,2,2,6,7,2,6,10,7,10,3,8,2,8 +A,3,8,5,6,3,10,3,2,3,9,1,8,2,6,2,8 +Q,5,5,6,8,3,8,6,8,8,5,5,8,3,8,4,8 +Y,2,3,4,4,2,7,10,1,7,7,11,8,1,11,2,8 +X,1,0,2,0,0,7,7,4,4,7,6,8,2,8,4,8 +O,2,1,2,2,1,7,7,7,4,7,6,8,2,8,3,8 +C,5,11,6,8,2,5,7,7,11,7,6,13,1,9,4,8 +P,6,9,8,6,4,9,9,4,6,13,4,2,1,10,4,9 +Z,3,4,5,3,2,7,8,2,9,11,6,8,1,9,5,8 +L,3,5,4,4,3,7,8,4,6,7,6,8,2,8,7,10 +E,3,6,4,5,4,5,8,4,3,7,6,9,4,10,8,11 +K,5,4,5,6,2,4,9,8,2,7,4,11,4,8,3,10 +V,4,8,6,6,7,8,5,5,2,8,8,8,7,9,4,8 +D,4,10,6,7,4,11,6,3,7,11,3,7,4,7,4,9 +Q,4,5,5,7,3,8,7,8,6,6,7,9,3,8,5,9 +I,1,7,2,5,1,7,7,0,7,13,6,8,0,8,1,8 +W,12,14,12,8,5,1,10,4,2,11,12,9,8,10,0,7 +H,4,8,5,6,4,7,8,8,4,7,5,6,3,6,7,9 +N,5,10,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +I,3,6,4,4,2,6,9,0,6,13,7,7,0,8,1,7 +I,1,6,3,4,3,10,6,1,4,8,5,5,3,8,5,6 +R,5,11,5,8,6,6,8,9,5,7,6,8,3,8,5,12 +K,5,9,5,4,3,6,7,2,5,10,6,9,5,8,3,7 +A,1,0,2,0,0,8,3,2,0,7,2,8,2,6,1,8 +Z,3,5,5,8,4,12,4,2,5,9,3,7,1,8,5,10 +V,6,10,5,8,3,4,11,2,4,9,11,7,3,9,1,8 +Z,2,5,4,4,2,7,7,2,10,11,6,8,1,8,6,7 +H,3,6,4,4,4,7,7,5,6,7,6,9,3,8,3,8 +C,3,6,4,4,1,5,7,7,10,6,6,13,1,8,4,8 +M,3,6,5,4,5,10,5,2,2,8,4,8,5,7,2,6 +B,3,7,5,5,5,7,8,7,5,7,6,6,2,8,6,9 +R,5,9,7,7,8,5,8,4,5,6,5,9,7,6,10,7 +N,6,9,5,4,2,6,9,4,5,4,4,10,5,10,2,8 +T,4,5,5,4,2,5,12,3,8,11,9,4,1,11,2,4 +K,7,12,7,6,3,5,8,3,7,9,9,10,6,8,3,7 +F,4,11,7,8,8,9,7,1,5,9,5,5,5,10,6,5 +O,5,10,7,8,3,8,7,8,8,7,6,9,3,8,4,8 +A,2,1,3,1,1,7,4,2,0,7,2,8,2,7,1,7 +L,1,0,2,1,0,2,1,6,5,0,2,4,0,8,0,8 +K,4,8,6,6,4,6,7,2,6,10,7,10,3,8,3,8 +D,3,4,4,3,3,6,7,6,6,7,6,5,2,8,3,7 +O,6,11,6,8,7,8,6,8,4,9,4,8,3,8,3,8 +M,2,1,3,2,1,8,6,10,1,6,9,8,7,5,0,8 +P,4,10,5,8,4,4,12,6,5,12,9,3,1,10,4,6 +I,6,7,8,8,7,8,8,4,5,6,6,7,3,8,10,10 +B,4,8,6,6,5,7,7,6,6,9,6,6,3,8,7,8 +V,2,1,4,2,1,5,12,3,3,9,11,8,2,11,1,8 +K,2,3,3,1,2,6,7,4,7,7,6,11,3,8,4,9 +D,3,2,4,3,2,8,7,7,7,7,6,4,2,8,3,7 +R,3,6,5,4,5,7,8,3,4,6,6,9,6,9,7,6 +U,2,0,2,0,0,7,5,10,4,7,13,8,3,10,0,8 +R,4,5,6,4,3,9,7,2,6,10,3,6,2,7,3,10 +H,4,5,5,3,4,7,8,6,6,7,6,8,3,8,3,7 +A,4,9,6,6,5,10,3,1,2,7,3,9,5,5,3,7 +B,2,4,3,2,2,8,8,3,5,10,5,6,2,8,5,9 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +V,4,4,5,3,2,5,12,2,3,8,10,7,2,10,1,8 +U,2,3,3,1,1,6,9,5,6,6,9,9,3,10,1,7 +H,4,9,5,6,2,7,9,15,2,7,3,8,3,8,0,8 +V,6,7,6,5,3,4,12,3,3,9,11,7,3,9,1,7 +A,2,4,4,3,2,7,2,2,2,7,2,8,2,6,3,7 +F,3,5,5,4,2,7,9,2,6,13,6,5,4,10,3,7 +Z,3,6,4,4,3,6,8,5,10,7,7,10,1,9,7,8 +M,3,5,6,4,4,9,6,2,4,9,4,6,8,5,2,8 +S,5,10,6,7,4,7,8,3,7,10,7,7,3,7,5,6 +E,3,6,4,4,4,8,7,5,3,7,6,9,4,8,7,9 +L,5,9,5,5,3,7,5,3,5,12,7,11,3,8,6,9 +Q,3,9,5,8,3,8,7,8,5,6,6,9,3,8,5,9 +V,3,8,5,6,2,5,11,3,4,10,12,8,3,10,1,8 +B,4,10,6,7,5,11,6,3,8,10,3,7,2,8,5,12 +M,3,4,5,3,3,8,6,3,4,9,6,8,6,5,2,8 +F,4,7,6,5,3,7,10,3,5,13,6,5,2,10,2,7 +W,4,9,6,7,9,8,7,5,1,7,6,8,10,11,3,9 +S,3,7,4,5,3,8,7,7,6,7,7,8,2,9,9,8 +N,5,7,8,5,4,11,7,3,5,11,0,4,5,9,1,7 +J,2,8,3,6,1,12,2,9,4,13,5,13,1,6,0,8 +E,6,14,5,8,4,8,7,4,4,11,5,9,3,9,8,11 +J,4,9,4,7,3,9,8,2,3,12,5,6,2,9,6,9 +X,3,6,4,4,2,7,7,4,4,7,6,8,3,8,4,8 +W,3,3,4,1,2,3,11,3,2,10,10,8,5,11,0,7 +Y,5,10,8,7,4,8,10,1,8,5,12,8,1,11,2,8 +J,1,5,2,3,1,10,6,3,5,12,4,9,1,6,1,7 +S,3,9,4,7,2,8,8,6,9,5,5,5,0,7,9,8 +A,4,9,6,7,5,8,2,3,1,7,2,8,5,8,6,7 +V,9,13,9,7,4,6,10,4,3,8,8,5,5,12,3,9 +O,5,11,6,8,3,7,7,9,8,7,6,8,3,8,4,8 +H,5,9,6,7,6,6,8,7,5,7,5,7,3,7,7,10 +L,3,8,4,6,2,7,3,0,9,9,2,11,0,7,2,8 +P,4,6,4,8,3,4,11,10,3,10,6,4,1,10,4,8 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +Q,4,7,5,9,5,9,10,7,1,3,7,12,3,10,5,11 +Q,8,9,10,8,9,8,4,4,4,8,4,11,6,6,8,7 +D,5,10,5,5,3,7,7,4,6,9,6,6,5,9,7,5 +V,4,9,5,7,4,9,11,2,3,4,10,8,3,10,2,8 +N,4,10,4,8,5,8,7,12,1,6,6,7,6,8,1,10 +K,4,11,4,8,2,4,7,8,2,6,4,11,4,8,2,11 +S,4,8,4,6,2,7,6,5,9,5,6,9,0,8,9,8 +H,4,7,6,5,5,7,8,5,6,8,6,8,6,7,5,9 +I,4,8,5,6,3,7,6,2,6,7,6,8,0,9,4,8 +Q,4,7,6,9,6,9,8,6,3,4,8,10,4,8,7,11 +J,2,6,3,4,1,9,7,1,6,14,4,8,0,7,0,8 +R,4,5,5,4,3,8,7,5,6,6,5,6,3,7,6,9 +R,2,1,3,1,2,7,7,4,5,6,5,7,2,6,4,8 +I,2,6,3,4,1,7,7,0,7,13,6,8,0,8,1,8 +Q,4,7,5,9,5,7,10,3,4,7,10,11,3,9,7,7 +R,2,1,3,2,2,7,8,4,5,7,5,6,5,6,4,8 +R,4,7,6,5,5,8,7,7,6,8,6,8,3,8,6,11 +Y,2,3,2,2,1,5,10,1,6,10,9,6,1,11,2,5 +T,5,7,5,5,3,6,11,2,6,11,9,5,2,11,2,5 +V,3,8,5,6,1,6,8,4,3,8,14,8,3,10,0,8 +D,4,8,4,6,4,5,7,9,6,6,5,5,2,8,3,8 +W,3,1,5,1,2,6,11,3,2,7,9,9,6,11,0,8 +M,5,9,7,6,6,4,7,3,4,10,10,10,7,5,2,7 +X,3,6,5,4,3,8,7,4,9,6,6,8,3,8,6,8 +M,5,11,9,8,12,7,5,3,2,7,5,8,14,6,4,7 +I,6,10,5,6,3,10,6,4,6,14,3,6,2,9,4,11 +Z,5,8,7,6,6,9,9,5,4,7,5,7,3,8,9,5 +R,7,11,9,8,9,8,9,7,4,8,5,6,5,8,8,12 +C,2,3,3,4,1,5,7,6,8,7,6,13,1,8,4,9 +E,5,10,4,5,3,9,6,3,4,11,5,9,3,9,8,12 +G,7,14,6,8,5,7,6,3,3,8,6,9,4,9,9,7 +R,4,7,6,5,6,8,8,7,3,8,5,6,4,7,7,9 +Y,7,9,8,7,4,2,10,3,7,12,12,7,1,11,2,5 +N,4,7,6,5,3,8,7,7,6,6,6,4,6,9,2,5 +H,2,1,3,3,2,8,7,6,6,7,6,8,3,8,3,7 +N,2,2,3,3,2,7,8,5,5,7,6,6,5,9,2,5 +N,4,7,6,5,4,11,7,3,5,10,1,4,5,9,1,7 +A,4,11,6,8,3,7,4,3,2,6,1,8,3,6,3,8 +E,3,9,5,6,4,7,7,6,9,8,8,9,3,8,6,8 +E,4,9,5,7,6,6,7,5,8,7,6,10,3,8,6,9 +T,5,10,5,8,4,6,11,4,6,11,9,5,4,11,4,4 +T,6,13,6,7,4,7,9,2,7,12,6,6,2,9,5,5 +S,10,15,8,8,4,9,3,4,5,10,2,9,4,5,6,10 +T,6,8,8,7,7,6,8,6,6,7,8,7,4,11,9,8 +O,5,10,5,8,4,7,7,8,5,9,8,8,3,8,3,8 +D,4,7,6,5,4,9,7,5,7,10,4,5,3,8,3,8 +Y,4,9,6,6,4,10,10,1,7,3,11,8,1,11,2,9 +G,6,10,8,8,8,7,9,6,3,6,5,10,5,7,8,7 +I,1,8,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +P,5,11,5,6,3,9,9,4,3,12,5,4,4,11,5,6 +K,5,4,5,6,2,4,8,8,2,7,5,11,4,8,2,11 +B,5,10,7,8,6,9,7,7,6,6,6,5,3,9,9,11 +V,3,4,5,6,1,8,8,4,3,7,14,8,3,10,0,8 +N,6,11,9,8,6,7,9,2,4,9,6,7,6,8,1,8 +A,4,10,7,8,5,11,3,1,2,8,2,9,6,4,3,8 +X,2,6,4,4,2,7,7,4,8,6,6,10,3,8,6,8 +E,3,8,4,6,2,3,6,6,11,7,7,15,0,8,7,7 +O,4,9,4,7,4,7,7,7,3,9,7,8,3,8,3,7 +X,4,9,6,7,4,9,7,0,8,9,4,8,2,8,3,8 +X,5,9,6,5,3,9,7,2,7,11,5,7,4,11,3,8 +M,7,8,9,7,10,8,8,4,4,7,6,7,10,9,6,3 +K,2,3,4,1,2,4,9,2,6,10,9,10,3,8,2,6 +U,4,5,5,3,2,6,8,6,8,7,10,9,3,9,1,8 +F,2,3,4,2,1,5,11,2,5,13,7,5,1,9,1,7 +B,1,1,2,2,1,7,7,8,5,7,6,7,2,8,7,9 +F,4,11,5,8,5,5,10,3,5,10,10,6,2,10,3,6 +G,4,9,6,7,6,7,7,6,2,7,6,11,4,8,8,8 +M,5,9,5,6,3,7,7,12,2,8,9,8,8,6,0,8 +R,3,6,5,4,5,5,7,3,4,7,6,9,5,10,7,5 +Y,4,5,5,7,7,9,8,5,3,6,8,8,7,11,7,4 +V,3,3,4,1,1,5,13,3,2,9,11,7,2,11,1,8 +W,3,4,4,3,3,5,11,2,2,8,9,9,6,11,0,8 +H,4,7,6,5,7,8,8,4,3,6,7,7,7,9,7,7 +K,4,8,6,6,4,5,6,1,7,10,9,11,4,7,4,7 +L,4,8,5,6,3,3,5,2,9,3,1,9,0,7,1,5 +E,3,7,4,5,4,8,7,4,8,7,7,8,2,8,6,10 +S,3,1,3,3,2,8,7,6,5,7,6,8,2,9,9,8 +B,6,10,6,8,5,6,5,9,7,6,7,6,2,8,10,10 +F,4,8,4,6,3,1,11,4,6,11,10,9,0,8,2,7 +H,6,7,8,5,6,10,6,3,6,10,3,7,4,7,4,9 +X,3,8,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +N,5,10,7,7,4,10,7,3,5,10,2,5,6,9,1,7 +L,6,11,6,6,4,8,4,3,4,12,7,11,3,9,6,9 +T,2,7,3,5,2,9,12,0,5,6,10,8,0,8,0,8 +E,5,8,7,6,5,4,9,2,8,10,8,9,3,9,4,6 +W,2,0,2,1,1,7,8,3,0,7,8,8,6,10,0,8 +S,3,4,4,3,2,6,8,3,7,10,8,8,1,8,5,5 +V,3,8,5,6,1,8,8,4,3,6,14,8,3,10,0,8 +Z,7,7,5,10,5,9,4,4,3,11,6,9,3,9,11,8 +T,4,7,6,5,6,7,7,4,5,7,6,9,5,8,5,7 +P,5,11,7,8,6,8,9,5,4,12,5,4,2,10,3,8 +O,2,4,3,3,2,8,7,6,4,9,5,8,2,8,2,8 +M,5,8,6,6,3,8,7,12,2,6,9,8,9,6,0,8 +B,3,8,5,6,5,7,7,6,6,6,6,6,2,8,6,9 +C,4,8,5,6,3,6,8,8,8,9,8,13,2,10,4,9 +E,4,5,5,8,3,3,8,6,12,7,5,15,0,8,7,7 +Y,4,6,4,4,2,4,10,2,7,11,11,6,1,10,2,4 +L,4,9,6,7,3,6,3,1,9,8,2,11,0,7,2,8 +X,4,9,5,4,2,6,8,1,7,11,6,8,3,7,4,6 +V,3,5,4,3,1,4,12,4,3,10,11,7,3,10,1,8 +V,1,0,2,0,0,8,9,3,2,6,12,8,2,10,0,8 +U,4,4,5,3,2,4,9,5,7,11,10,9,3,9,2,7 +J,3,8,4,6,3,10,7,0,7,11,3,6,0,7,1,7 +L,3,8,4,6,1,0,1,6,6,0,0,6,0,8,0,8 +Q,2,2,3,3,2,8,8,5,2,7,8,10,2,9,4,9 +D,1,0,1,0,0,6,7,7,5,7,6,6,2,8,3,8 +D,2,3,3,2,2,9,7,4,6,10,4,6,2,8,2,8 +X,5,9,8,7,5,3,8,1,8,10,11,10,2,9,3,5 +P,4,8,5,5,2,4,14,8,1,11,6,3,1,10,4,8 +J,2,5,4,4,2,7,7,3,6,15,7,10,1,6,1,7 +W,9,10,9,5,4,6,11,2,3,8,10,7,8,12,1,7 +O,4,9,5,6,4,7,7,8,6,7,3,8,3,8,3,8 +U,4,8,6,6,4,5,9,5,6,7,9,10,3,9,1,8 +Y,5,8,5,6,3,3,10,2,7,11,11,6,1,11,2,5 +E,7,11,10,8,8,7,7,2,8,11,7,9,3,8,5,8 +O,5,11,6,8,4,7,8,8,5,10,8,7,4,7,5,9 +N,10,13,12,7,5,3,11,6,3,14,12,9,6,9,0,8 +D,4,11,6,8,5,8,7,6,8,7,6,5,6,8,3,7 +U,4,7,6,5,3,6,9,6,8,8,10,9,3,9,1,8 +I,1,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +B,5,10,6,7,6,8,7,6,7,7,6,5,2,8,7,10 +X,4,6,5,8,2,7,7,4,4,7,6,8,3,8,4,8 +F,4,10,4,8,3,1,13,4,4,12,10,6,0,8,2,6 +C,5,8,5,6,4,6,7,6,6,12,8,11,2,11,4,7 +D,3,8,5,6,4,8,8,4,5,9,5,4,3,8,3,7 +X,5,9,6,8,7,7,8,1,5,7,6,8,3,6,8,8 +F,3,5,4,4,2,5,10,4,6,10,9,6,1,10,4,6 +X,3,1,4,3,2,7,7,3,9,6,6,8,2,8,6,8 +L,2,7,3,5,2,5,5,2,8,3,2,7,0,7,1,6 +Y,4,10,6,8,3,6,10,2,2,7,12,8,1,11,0,8 +C,7,9,5,5,2,7,9,6,7,12,7,8,1,8,6,9 +U,7,9,8,6,4,4,8,6,8,10,10,9,3,9,2,5 +R,4,9,6,7,4,10,7,3,5,11,2,6,3,7,4,10 +F,2,7,4,5,3,5,10,2,6,10,9,6,1,10,3,7 +N,8,14,9,8,4,4,10,6,4,14,12,9,6,9,0,9 +Z,6,9,8,7,6,6,9,2,9,11,8,7,3,11,7,7 +L,5,7,7,5,5,6,6,8,6,5,6,9,2,8,4,10 +K,6,11,9,8,7,2,9,2,7,10,12,12,5,6,4,4 +K,4,9,5,7,5,5,6,3,6,6,6,10,3,8,5,10 +X,3,6,4,5,4,7,8,2,5,8,6,8,2,7,6,7 +S,4,7,5,5,3,7,7,4,8,11,8,8,2,10,5,6 +M,5,9,6,7,6,8,6,6,5,6,7,8,8,6,2,7 +K,5,11,7,8,9,7,6,3,5,6,6,8,7,7,7,7 +V,3,5,5,7,2,8,8,4,3,7,14,8,3,9,0,8 +J,2,10,3,8,2,9,6,2,6,11,3,8,1,6,2,6 +E,4,7,5,5,3,7,8,2,8,11,6,8,2,8,5,8 +Z,3,5,5,4,3,8,7,2,9,12,6,9,1,8,5,7 +F,3,9,5,7,3,4,11,3,6,11,10,5,1,10,2,5 +C,6,10,9,7,6,7,8,8,6,5,6,13,5,8,4,7 +I,2,2,1,3,1,7,7,1,7,7,6,8,0,8,3,8 +L,1,0,2,1,0,2,1,6,4,0,3,4,0,8,0,8 +W,10,12,10,7,5,2,8,3,3,10,11,9,9,10,1,6 +N,2,5,4,4,2,7,9,2,4,10,6,7,5,8,1,7 +Y,3,4,4,3,2,4,10,1,7,10,10,6,2,10,3,3 +U,3,6,4,4,1,8,5,13,5,7,14,8,3,9,0,8 +Z,2,5,2,4,2,7,7,5,8,6,6,8,2,8,7,8 +K,3,4,5,3,2,8,6,1,6,10,5,9,3,8,3,9 +W,7,8,7,6,6,5,11,3,3,9,7,7,8,11,3,5 +B,3,6,4,4,4,8,7,5,5,9,6,6,2,8,4,7 +S,6,9,8,7,11,7,6,4,2,8,5,8,3,8,13,4 +L,1,0,1,0,0,2,2,5,4,1,2,6,0,8,0,8 +L,3,10,5,8,4,7,4,2,7,7,2,9,1,6,3,8 +P,4,8,6,6,4,8,8,2,6,13,5,5,2,9,3,9 +N,2,4,4,3,2,8,8,2,4,10,5,6,4,9,1,6 +B,5,9,8,8,9,7,7,5,4,7,6,8,7,10,9,11 +T,2,3,3,2,1,7,11,3,6,7,11,8,2,11,1,8 +Z,1,4,3,3,1,7,7,2,9,11,6,8,1,8,5,8 +L,3,4,3,6,1,0,1,6,6,0,0,6,0,8,0,8 +I,1,4,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +S,4,7,5,5,3,6,8,3,6,10,7,8,2,8,4,6 +V,8,10,7,7,3,3,12,4,4,10,12,8,3,10,1,8 +B,1,3,3,2,2,8,6,2,5,10,5,7,2,8,3,9 +R,5,8,7,6,7,8,8,7,4,8,5,6,4,7,7,11 +T,3,7,4,5,2,5,13,3,6,12,9,4,1,11,2,4 +H,3,2,5,3,3,7,7,6,6,7,6,8,3,8,3,8 +Y,3,6,4,4,2,4,10,1,6,9,10,5,1,11,3,4 +A,2,3,3,2,1,9,2,1,1,8,2,9,1,6,1,8 +K,6,9,9,7,6,2,8,3,7,11,12,12,4,7,4,5 +D,5,8,7,6,5,10,6,3,6,11,4,6,3,8,3,9 +I,1,8,0,6,1,7,7,5,3,7,6,8,0,8,0,8 +F,3,9,5,7,4,4,11,6,5,11,10,5,2,10,3,5 +Q,5,9,5,4,3,8,5,4,7,10,5,9,3,8,9,10 +X,5,8,7,6,5,8,5,3,5,7,7,9,4,8,10,9 +B,3,6,4,4,4,6,6,7,5,6,6,7,2,9,7,10 +M,10,14,10,8,5,9,11,6,5,4,6,9,10,11,2,7 +X,5,11,8,8,7,7,7,3,8,5,7,10,3,8,6,8 +L,4,7,5,5,4,6,8,8,5,7,5,10,3,7,4,11 +Q,3,4,4,6,2,8,8,8,6,6,6,9,3,8,4,9 +J,1,3,2,2,1,8,6,3,5,14,6,10,1,7,0,7 +T,3,8,4,6,3,5,11,2,7,8,11,8,2,11,1,7 +P,2,3,4,2,2,7,9,3,4,12,5,4,1,9,3,8 +V,9,15,8,8,4,6,11,6,4,10,10,4,5,12,3,9 +W,5,11,8,8,7,10,10,3,3,5,9,7,8,10,1,8 +R,3,8,4,6,4,5,11,7,3,8,4,9,2,6,5,11 +G,5,11,5,8,5,5,7,6,4,9,9,10,2,8,4,10 +E,4,7,5,5,4,6,7,7,9,8,8,10,3,8,6,8 +S,4,9,5,7,3,9,7,4,8,11,6,7,2,10,5,8 +C,6,8,6,6,3,4,9,6,9,13,10,10,1,9,3,7 +L,3,9,5,7,3,6,5,0,8,9,3,11,0,7,3,8 +Y,3,7,5,5,2,7,11,1,8,6,12,8,1,11,2,8 +Y,4,6,4,4,2,2,11,3,5,11,12,7,2,11,2,5 +O,3,6,4,4,2,7,6,8,5,7,5,9,3,8,3,8 +Z,4,10,5,7,4,7,8,3,12,9,6,8,0,8,8,7 +G,8,9,10,8,11,7,8,6,3,7,7,9,9,10,9,9 +X,4,9,6,7,4,8,7,4,9,6,7,9,4,7,8,9 +N,6,10,8,7,5,11,8,3,6,10,0,3,5,9,1,7 +Y,1,3,2,2,1,8,10,1,6,5,10,8,1,11,1,8 +R,4,8,5,6,4,8,7,5,6,8,5,8,3,6,6,11 +F,1,0,1,0,0,3,11,4,2,11,8,6,0,8,2,8 +W,3,1,4,2,2,8,11,2,2,6,9,8,6,11,0,7 +A,3,5,6,4,2,8,2,2,2,7,1,8,2,7,2,7 +P,2,1,2,2,1,5,9,3,4,9,8,4,1,9,3,7 +C,1,0,2,1,0,6,7,6,9,7,6,14,0,8,4,10 +D,2,0,2,1,1,6,7,8,7,7,6,6,2,8,3,8 +I,1,4,1,3,1,7,7,1,7,7,6,9,0,8,2,8 +K,4,4,4,6,2,4,8,8,2,7,5,11,3,8,2,11 +D,4,11,4,8,3,5,8,10,8,8,8,5,3,8,4,8 +T,7,10,7,8,4,7,10,2,10,11,9,4,3,9,5,5 +F,6,13,6,8,5,7,9,3,4,10,6,6,4,9,7,7 +L,2,2,3,3,2,4,4,5,7,2,2,6,1,7,1,6 +A,2,7,4,4,1,8,6,3,0,7,0,8,2,7,1,8 +N,5,9,7,6,4,7,8,6,6,7,7,6,6,10,2,5 +T,8,11,8,8,6,6,10,1,9,11,9,5,3,9,4,4 +Q,3,5,5,6,5,10,11,6,3,3,8,12,3,10,5,10 +Q,4,7,5,8,5,8,11,5,1,5,8,12,2,10,5,8 +K,2,1,2,1,0,4,7,6,2,7,6,11,3,8,2,10 +Y,3,4,5,5,1,7,10,2,2,8,12,8,1,11,0,8 +Z,3,6,4,4,2,8,7,2,9,11,5,8,2,8,6,8 +J,4,6,5,4,2,11,5,2,7,14,3,8,0,8,0,8 +U,3,1,4,2,1,7,8,6,8,7,10,8,3,10,1,8 +R,6,8,8,6,5,10,8,4,7,10,1,7,3,6,4,11 +N,5,7,8,5,3,7,8,3,5,10,7,7,5,7,1,8 +Y,5,6,5,4,2,3,12,5,5,13,11,6,1,11,1,6 +K,11,15,10,8,5,4,8,5,8,9,12,12,6,11,3,6 +K,6,9,9,7,6,3,8,3,8,11,12,12,4,7,4,4 +N,5,8,7,6,3,10,7,3,5,10,2,5,5,8,1,7 +Y,1,0,2,0,0,7,9,2,2,6,12,8,1,10,0,8 +E,2,4,3,2,2,6,8,2,7,11,7,9,2,8,4,8 +W,9,12,9,7,4,6,10,1,3,7,10,7,8,12,1,6 +W,6,9,6,4,4,5,8,2,3,8,9,7,9,10,2,5 +G,3,10,4,7,2,7,6,8,8,6,6,11,2,8,5,11 +U,4,3,5,5,2,7,4,14,5,7,14,8,3,9,0,8 +Y,5,6,6,8,9,8,6,7,4,7,7,8,10,9,4,5 +S,7,10,8,8,5,9,8,3,7,10,3,6,3,8,5,9 +A,4,10,5,5,4,9,5,5,2,10,6,11,6,5,5,10 +Z,3,9,4,7,2,7,7,4,13,10,6,8,0,8,8,8 +Z,5,10,7,8,5,7,8,2,9,11,7,7,1,8,6,7 +M,4,7,7,5,7,9,6,2,2,8,4,7,7,5,2,6 +Q,3,5,4,7,4,8,5,6,3,9,5,11,3,8,4,8 +M,5,10,8,8,6,6,6,3,4,9,9,9,8,5,2,7 +F,1,0,1,1,0,3,12,4,2,11,9,6,0,8,2,7 +V,6,9,6,6,4,3,11,2,3,9,10,8,3,12,1,7 +J,2,9,3,6,1,12,3,10,3,13,6,13,1,6,0,8 +Y,5,8,7,6,4,9,10,1,7,3,11,8,2,12,2,9 +N,5,9,6,7,4,7,9,5,5,7,6,7,6,9,2,6 +K,4,9,6,7,7,6,6,3,4,6,6,9,8,7,8,7 +O,4,9,4,6,3,8,6,8,5,9,4,7,3,8,3,8 +J,3,10,4,8,1,13,1,9,5,14,2,12,0,7,0,8 +M,4,5,7,3,4,8,7,3,4,9,6,7,8,6,2,7 +B,5,8,7,6,10,8,8,4,3,6,7,7,7,11,9,9 +W,7,10,7,8,6,4,10,3,2,9,8,7,7,12,2,5 +N,8,12,7,6,3,7,10,4,6,3,5,9,5,9,2,7 +H,3,1,4,2,3,7,7,6,6,7,6,8,5,8,4,8 +G,4,10,6,7,8,7,5,4,3,7,5,10,8,7,8,13 +Z,5,11,6,9,3,7,7,4,15,9,6,8,0,8,8,8 +T,1,0,1,0,0,8,14,2,4,6,10,8,0,8,0,8 +T,3,4,4,3,1,5,13,3,6,11,9,4,1,11,1,5 +R,3,5,6,4,4,7,8,5,4,8,5,8,3,6,4,11 +J,1,7,2,5,1,11,3,10,3,12,7,13,1,6,0,8 +B,3,7,5,5,4,8,8,3,6,10,5,6,2,8,4,10 +M,8,9,12,8,12,8,9,4,4,7,6,7,12,7,7,3 +H,5,11,5,8,3,7,6,15,1,7,8,8,3,8,0,8 +O,5,7,7,6,5,6,6,6,7,9,6,8,3,6,5,6 +L,5,4,5,7,1,0,0,6,6,0,1,5,0,8,0,8 +H,3,7,5,5,3,6,7,3,6,10,8,9,3,9,2,6 +I,1,4,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +G,5,10,6,8,3,8,6,8,9,6,5,11,2,8,6,10 +F,5,12,5,7,4,10,8,3,5,11,4,5,3,7,7,9 +A,4,8,6,7,7,10,8,3,4,6,7,6,5,9,5,5 +V,3,8,4,6,2,7,9,4,2,7,12,8,2,10,0,8 +C,6,11,6,8,4,5,7,7,8,12,9,14,2,10,4,7 +B,4,2,4,4,4,7,7,5,5,6,6,6,2,8,6,9 +N,3,6,4,4,3,7,9,6,4,7,6,6,5,9,1,6 +G,5,9,6,7,4,7,6,7,8,11,6,11,2,11,4,9 +M,5,9,6,6,6,8,5,11,0,6,9,8,7,5,0,7 +X,5,10,6,8,4,7,7,4,4,7,6,8,3,8,4,8 +W,4,10,6,8,4,8,8,4,2,7,8,8,8,9,0,8 +K,2,7,4,5,3,5,6,3,6,6,6,10,3,8,5,9 +P,3,3,4,5,2,4,12,9,2,10,6,4,1,10,4,8 +H,4,2,5,4,4,8,7,6,7,7,6,8,3,8,4,8 +Q,3,8,4,9,5,9,7,8,3,5,6,9,3,8,6,10 +Q,4,8,5,10,6,8,6,8,5,5,6,8,4,9,7,11 +X,4,9,6,6,4,7,6,3,8,5,6,9,3,8,7,8 +V,1,1,3,2,1,6,12,2,2,8,11,8,2,10,0,8 +B,7,10,5,6,4,6,7,5,5,10,6,8,5,7,8,9 +D,4,6,5,5,5,6,7,5,6,7,4,7,4,7,6,5 +R,2,2,3,3,2,7,8,4,5,7,5,7,2,7,5,8 +C,7,13,5,7,4,7,7,4,3,9,8,11,4,9,9,11 +O,5,5,7,8,3,7,8,9,8,8,7,6,3,8,4,8 +S,3,4,5,3,2,9,7,3,7,10,4,7,1,9,5,10 +Q,4,8,5,10,6,8,5,7,4,9,5,8,3,8,4,7 +P,6,6,8,8,9,6,7,5,3,8,7,6,7,13,6,9 +G,2,3,3,4,2,7,8,8,7,5,7,9,2,7,5,11 +S,6,9,5,5,2,10,2,2,4,10,2,9,2,7,3,10 +O,8,15,6,8,4,5,7,6,3,10,7,9,5,9,5,8 +B,3,1,4,3,3,8,8,5,6,7,5,5,2,8,6,8 +H,6,9,9,6,5,8,7,3,6,10,5,8,3,8,3,7 +D,5,10,6,8,6,5,7,9,7,7,6,6,2,8,3,8 +B,1,0,1,1,1,7,7,6,4,6,6,7,1,8,6,9 +Z,5,9,6,7,3,7,7,4,15,9,6,8,0,8,8,8 +S,7,15,6,8,3,9,5,4,4,13,6,9,2,9,3,8 +Z,5,5,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +R,8,10,8,5,5,8,9,3,6,9,2,6,7,4,6,6 +N,2,0,2,1,1,7,7,12,1,5,6,8,5,8,0,8 +G,5,10,6,8,3,7,6,8,8,6,6,9,2,7,6,10 +D,8,13,8,7,4,11,3,5,5,13,2,11,5,7,4,9 +H,5,6,7,4,4,5,8,4,6,10,8,9,3,8,3,7 +H,3,8,4,6,3,8,7,13,1,7,7,8,3,8,0,8 +S,9,15,7,8,4,7,5,5,6,8,2,8,4,6,6,8 +Z,3,7,4,5,4,9,9,5,3,7,5,7,3,8,9,4 +Q,4,6,5,8,4,7,8,5,2,8,9,10,3,9,6,8 +X,3,8,4,6,3,7,7,4,4,7,6,8,3,8,4,8 +I,1,8,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +W,3,9,5,6,3,4,8,5,1,7,8,8,8,10,0,8 +I,2,7,4,5,4,10,7,2,4,8,5,5,3,9,5,7 +J,2,7,3,5,1,12,2,9,4,13,5,13,1,6,0,8 +S,7,10,9,8,12,8,6,5,4,8,6,8,7,8,15,10 +F,3,6,3,4,1,2,13,5,3,11,9,6,0,8,3,6 +Q,5,6,6,8,6,7,10,4,2,7,9,11,3,9,5,8 +Y,1,3,3,1,1,7,11,1,6,7,11,8,1,11,1,8 +K,1,0,1,0,0,4,6,5,2,7,6,11,2,8,2,10 +O,3,9,4,7,4,7,6,8,4,7,5,11,3,8,3,9 +H,4,4,4,6,2,7,10,15,2,7,3,8,3,8,0,8 +B,1,0,2,1,1,7,7,7,4,7,6,7,1,8,6,8 +Q,3,7,5,5,4,7,4,7,4,7,5,10,2,8,3,9 +Z,5,10,6,8,6,9,6,5,9,8,5,7,1,7,7,8 +P,8,12,8,6,5,9,8,4,5,13,4,4,4,10,6,8 +W,5,9,8,7,7,6,11,2,2,7,8,8,8,11,1,8 +J,1,4,3,3,1,9,6,2,6,14,4,8,0,7,0,8 +V,3,3,4,2,1,4,13,3,2,10,11,7,2,11,1,8 +T,2,3,3,2,1,5,12,2,7,11,9,4,1,10,2,5 +L,7,13,6,7,3,8,3,3,5,11,4,13,2,7,6,8 +F,4,8,6,6,3,7,10,4,6,13,7,5,2,9,2,7 +O,5,7,6,5,4,7,10,8,5,5,8,11,5,9,4,7 +N,5,8,7,6,4,7,8,6,5,7,6,5,7,11,3,5 +V,4,10,6,8,3,6,11,3,4,7,12,9,2,10,1,9 +K,5,9,7,7,7,6,9,5,4,7,4,8,4,7,7,9 +X,4,8,6,6,5,7,6,2,6,7,7,9,5,9,7,7 +X,2,6,4,4,2,7,8,3,8,6,6,6,3,8,7,7 +Y,5,9,5,6,3,3,10,2,7,11,11,6,0,10,2,4 +A,7,12,6,7,3,12,2,3,1,10,4,11,4,4,4,9 +K,4,7,4,5,2,4,6,8,2,7,7,11,3,8,3,11 +P,4,5,4,8,2,3,13,8,2,11,7,3,1,10,4,8 +Z,5,9,5,4,3,6,7,2,8,11,8,9,3,8,5,5 +J,2,4,3,6,1,14,2,7,5,14,2,11,0,7,0,8 +X,3,7,4,5,2,7,7,4,4,7,6,8,3,8,4,8 +W,7,12,7,7,4,1,9,2,3,9,11,9,8,10,1,6 +S,4,9,4,6,4,8,8,5,8,5,5,6,0,7,9,7 +W,6,6,7,4,4,6,11,4,2,8,7,6,9,12,2,5 +Q,4,6,5,8,5,7,10,4,3,6,9,11,3,8,6,8 +P,4,7,5,5,3,6,11,4,4,13,6,3,1,10,3,9 +S,1,0,1,1,0,8,7,4,6,5,6,8,0,8,7,8 +X,4,6,7,4,3,5,8,2,8,11,10,9,3,8,3,6 +C,4,8,5,6,3,8,7,7,6,6,7,9,4,8,3,9 +W,10,11,10,8,6,2,11,2,3,10,11,9,8,10,2,6 +W,5,11,8,8,4,10,8,5,2,7,9,8,9,9,0,8 +D,5,3,6,4,4,7,7,7,7,7,6,4,3,8,3,7 +X,9,15,10,9,6,8,7,2,8,11,5,7,5,9,4,7 +D,4,9,6,6,8,9,8,4,5,7,7,6,4,9,8,5 +D,6,11,6,6,3,11,3,4,5,12,2,8,5,7,3,10 +U,3,3,4,2,2,7,8,5,6,6,9,9,5,10,0,7 +A,4,7,5,5,3,7,5,3,0,7,1,8,2,7,1,8 +O,1,3,2,1,1,8,7,6,4,9,5,8,2,8,2,8 +Q,3,7,4,7,3,7,6,8,5,5,6,8,3,8,5,9 +T,4,5,4,4,2,6,11,2,7,11,9,4,1,11,2,4 +A,3,2,5,3,2,8,2,2,2,6,1,8,2,6,2,7 +T,6,8,6,6,4,6,11,4,5,11,9,5,3,12,2,4 +Z,7,8,5,11,5,7,7,5,3,11,7,8,3,9,11,6 +C,2,3,3,4,1,6,7,7,9,9,6,13,1,9,4,9 +Y,7,8,7,6,4,3,11,2,7,12,11,6,0,10,2,5 +H,5,10,5,7,3,7,6,15,1,7,7,8,3,8,0,8 +T,2,7,3,4,1,7,14,0,6,7,11,8,0,8,0,8 +T,1,0,2,0,0,8,14,2,4,6,10,8,0,8,0,8 +A,3,5,4,4,3,8,8,2,4,7,8,8,4,9,3,6 +H,1,1,2,1,1,7,7,11,1,7,6,8,3,8,0,8 +F,7,11,6,6,3,6,10,2,6,11,7,5,2,9,6,5 +O,3,5,4,4,3,8,7,7,4,9,5,8,2,8,2,8 +Z,6,7,5,11,4,7,8,4,2,11,7,7,3,9,11,6 +G,6,9,8,6,7,7,8,5,3,6,6,9,5,7,7,7 +O,7,9,5,5,3,6,8,5,4,8,4,6,5,9,5,7 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +E,7,10,9,8,9,8,7,6,2,7,6,10,5,8,8,10 +Z,5,9,6,5,3,10,3,4,6,12,4,10,3,8,7,10 +P,2,4,4,2,2,7,10,4,3,12,5,3,1,10,2,8 +H,7,11,10,8,8,5,9,3,6,10,9,8,6,11,5,6 +V,4,9,6,7,1,8,8,5,3,6,14,8,3,9,0,8 +J,4,7,5,5,3,7,5,5,4,14,8,13,1,6,1,6 +D,5,10,6,7,5,5,7,9,7,6,5,4,3,8,5,10 +G,2,1,2,1,1,8,6,6,6,6,5,9,1,7,5,10 +N,3,4,5,3,2,8,8,3,5,10,4,6,5,9,1,6 +A,4,9,6,6,5,6,5,3,3,4,1,6,4,5,4,6 +Y,5,6,6,4,2,4,10,2,7,10,11,5,2,11,3,4 +M,8,9,11,8,13,8,7,5,5,7,6,7,13,9,8,2 +U,4,5,5,4,2,5,8,5,8,10,8,9,3,9,2,6 +T,3,11,5,8,1,9,15,0,6,6,11,8,0,8,0,8 +N,6,11,7,8,6,8,7,13,1,6,6,7,7,7,1,10 +A,3,10,6,7,2,7,3,3,3,7,1,8,3,6,3,7 +N,4,9,5,6,4,7,8,6,5,7,6,6,6,9,1,6 +Y,2,3,3,2,1,8,10,1,6,6,11,8,1,11,2,7 +L,6,12,5,7,4,5,6,3,6,12,8,12,3,7,7,8 +T,5,9,6,6,5,6,7,7,7,8,9,8,3,9,6,9 +N,4,7,5,5,4,7,6,7,5,6,4,7,3,7,3,7 +O,5,10,6,8,5,7,8,8,6,7,8,8,2,8,3,8 +W,6,7,6,5,5,3,11,2,2,10,10,8,6,11,2,7 +B,3,6,4,4,4,7,7,5,4,6,5,7,3,8,5,7 +R,5,5,5,8,3,5,10,10,4,7,5,8,3,7,6,11 +J,2,9,3,7,1,14,2,7,5,14,2,10,0,7,0,8 +S,6,8,7,6,4,7,8,3,8,10,5,6,2,6,5,8 +F,2,1,3,2,2,5,10,4,5,11,9,5,1,10,3,6 +I,4,10,5,7,3,7,7,0,7,13,6,8,0,8,1,8 +L,4,9,6,6,7,6,7,3,6,7,7,11,6,11,6,5 +S,6,11,6,6,3,9,6,4,3,13,7,9,3,10,3,8 +L,3,8,5,6,6,6,7,3,6,8,7,11,6,10,5,6 +Y,8,13,7,7,4,7,7,5,3,10,8,5,4,9,5,4 +E,4,8,6,6,5,7,8,6,9,6,4,9,3,8,6,8 +D,4,8,6,6,5,7,7,7,6,6,6,4,3,8,3,7 +A,2,4,4,3,2,11,2,3,2,11,2,10,2,6,2,9 +T,5,7,5,5,3,7,11,4,7,11,8,4,3,12,3,5 +Y,4,9,7,7,3,7,11,1,8,6,12,8,1,11,2,8 +C,6,10,5,5,3,7,8,4,3,9,8,10,4,9,8,10 +V,6,7,5,5,2,4,12,4,4,11,11,7,3,10,1,8 +D,5,5,6,8,3,5,7,10,10,7,6,6,3,8,4,8 +W,5,5,7,5,7,7,8,5,5,7,5,8,9,8,8,6 +C,4,7,5,5,5,5,7,3,5,8,6,11,6,9,4,9 +U,5,8,7,6,6,8,8,8,5,6,7,9,3,8,4,6 +Q,5,10,6,9,3,8,7,8,6,6,7,8,3,8,5,9 +V,3,6,5,4,2,7,12,2,3,6,11,9,2,10,1,8 +T,2,9,4,6,1,9,14,0,6,5,11,8,0,8,0,8 +Z,2,4,3,3,2,8,7,5,9,6,6,7,1,8,7,8 +Z,10,15,10,9,7,8,6,3,9,12,6,9,4,5,8,7 +T,7,9,7,7,4,4,13,5,6,12,9,3,2,12,2,4 +N,11,15,14,8,5,10,5,4,4,14,1,7,6,6,0,7 +S,4,8,5,6,3,6,8,4,7,10,8,7,2,8,5,5 +N,2,4,2,2,2,7,8,5,4,7,6,6,5,9,1,5 +F,3,7,4,5,3,3,11,3,5,11,10,6,1,10,2,6 +I,1,3,2,2,0,7,8,1,6,13,6,8,0,8,0,8 +X,2,3,3,1,1,8,7,3,8,6,6,8,2,8,5,8 +Q,3,5,3,6,3,9,6,6,3,8,6,11,3,9,5,8 +E,4,9,6,7,5,9,7,2,7,11,5,8,3,7,6,10 +T,6,7,6,5,4,6,10,1,10,11,9,5,0,10,3,4 +U,4,8,5,6,2,7,3,15,6,7,13,8,3,9,0,8 +V,4,6,5,4,2,7,11,3,3,8,11,8,3,10,3,8 +A,3,7,5,4,2,7,4,3,1,6,1,8,3,6,2,7 +V,3,6,3,4,2,4,11,1,3,9,10,7,2,11,0,8 +Z,4,8,6,6,5,9,10,6,5,7,5,8,3,9,10,7 +Q,4,8,5,6,5,8,5,7,3,6,7,8,3,7,6,9 +U,1,0,2,1,0,7,5,10,4,7,12,8,3,10,0,8 +A,2,3,3,1,1,11,2,3,1,9,2,9,1,6,2,8 +G,4,8,5,6,4,5,8,5,5,8,8,9,2,7,4,10 +D,6,10,6,5,4,7,7,4,7,10,5,6,5,9,7,5 +Y,6,9,5,4,3,6,8,4,5,10,7,5,3,9,4,4 +O,4,9,6,6,7,8,7,5,1,7,6,8,8,8,5,10 +M,4,4,7,3,3,7,7,3,5,9,7,8,9,7,2,7 +K,3,5,4,4,3,5,6,4,7,7,7,11,3,9,5,10 +V,3,7,4,5,3,7,11,1,2,6,10,8,3,12,1,8 +R,2,4,4,3,2,8,7,4,5,8,5,7,2,7,4,11 +R,4,9,6,6,5,9,8,3,6,9,3,8,3,6,4,11 +L,2,4,2,3,1,5,4,5,7,2,2,4,1,7,1,6 +A,3,4,5,3,2,8,2,2,2,7,2,8,2,6,3,6 +Q,5,5,7,4,5,7,5,5,5,7,5,9,5,4,7,7 +P,4,8,5,6,4,3,13,6,2,11,8,4,0,9,3,8 +H,7,11,10,8,9,8,7,3,6,10,4,7,4,9,4,9 +I,2,9,2,7,2,8,7,0,9,7,6,7,0,8,3,7 +J,5,10,6,8,4,8,7,3,6,14,5,9,1,6,1,7 +F,8,14,7,8,3,5,10,3,5,12,6,5,2,8,6,4 +K,1,0,1,0,0,4,6,6,2,7,6,11,3,7,2,10 +Q,5,9,6,8,3,8,7,8,6,6,7,9,3,8,5,9 +C,4,9,5,7,4,6,7,6,8,5,8,11,1,7,4,9 +T,3,4,4,2,2,5,12,3,6,11,9,4,2,11,2,5 +B,6,9,8,7,8,8,7,5,5,9,5,6,4,8,7,11 +J,3,9,4,7,1,12,2,9,4,14,5,13,1,6,0,8 +K,3,5,5,3,3,6,7,1,6,10,7,10,3,8,3,8 +X,3,4,4,3,2,8,7,3,9,6,6,8,2,8,6,8 +N,3,3,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +W,3,1,4,2,2,5,11,3,2,8,9,9,6,11,0,8 +H,3,4,4,2,3,8,7,6,6,7,6,8,6,8,4,7 +Z,2,4,4,3,2,7,8,2,9,11,7,7,1,8,5,6 +W,7,9,7,4,4,5,8,2,4,8,10,8,10,10,2,6 +I,8,14,7,8,4,7,9,3,7,14,5,4,3,7,6,8 +W,5,9,7,7,6,5,11,2,2,7,8,9,7,12,1,8 +Y,5,9,6,7,2,9,11,2,2,6,12,8,1,11,0,8 +N,3,7,5,5,3,7,8,6,4,7,6,7,5,9,1,6 +S,3,5,5,4,2,8,7,2,8,11,6,7,1,9,4,8 +W,4,9,6,7,6,7,5,6,2,7,7,8,6,8,4,8 +Y,3,4,4,3,2,4,10,2,7,10,10,6,2,11,4,3 +S,5,9,5,4,2,8,7,4,3,13,7,7,3,10,3,7 +E,5,6,5,8,3,3,7,6,11,7,6,15,0,8,7,7 +X,4,10,5,7,2,7,7,5,4,7,6,8,3,8,4,8 +V,6,7,6,5,3,4,11,1,3,8,10,8,5,11,2,7 +M,3,7,5,5,5,7,9,6,3,7,7,9,5,9,5,10 +L,2,0,2,1,0,2,0,6,4,0,3,4,0,8,0,8 +J,2,4,3,7,1,14,2,6,5,14,1,10,0,7,0,8 +H,5,5,6,6,3,7,6,15,0,7,8,8,3,8,0,8 +P,5,8,7,6,5,9,7,2,5,13,4,6,2,9,3,9 +S,1,3,3,2,1,8,7,3,7,10,7,8,1,9,5,8 +C,5,9,5,7,3,3,8,5,8,11,10,13,1,9,3,7 +T,2,1,2,2,1,7,11,1,6,7,10,8,1,10,1,8 +D,4,7,4,5,4,5,7,8,7,6,5,6,2,8,3,8 +Q,5,11,4,6,3,11,4,3,6,9,4,8,3,9,6,13 +D,2,5,4,4,3,9,7,5,6,10,4,6,2,8,3,8 +A,1,1,2,1,0,8,4,2,0,7,1,8,2,7,1,8 +V,6,9,6,4,2,6,9,4,2,9,7,5,5,12,2,7 +R,4,4,4,6,3,6,9,9,4,7,5,8,3,8,5,10 +O,3,3,4,5,2,7,7,9,6,7,7,7,3,8,4,8 +S,3,10,4,7,4,8,7,7,5,7,7,8,2,8,8,8 +E,3,5,4,5,4,5,9,4,4,8,7,8,4,11,7,7 +P,5,8,7,6,4,9,8,3,7,13,4,5,4,10,5,10 +V,9,12,7,7,3,7,11,6,4,10,10,4,5,12,3,9 +N,5,11,5,8,5,7,7,13,1,6,6,8,6,9,1,6 +G,7,11,7,8,6,6,6,6,6,10,7,12,2,9,4,10 +H,3,8,4,5,2,7,9,15,2,7,3,8,3,8,0,8 +G,2,3,2,2,1,7,6,6,5,7,6,9,2,9,4,9 +Y,3,9,5,7,2,7,10,1,3,7,12,8,1,11,0,8 +K,6,8,9,7,7,10,4,2,3,10,3,8,6,6,7,13 +Q,5,9,5,11,7,8,7,7,3,8,7,9,3,8,6,8 +O,6,12,4,6,3,6,7,7,3,10,7,9,5,10,5,7 +A,6,8,8,7,7,6,7,3,5,7,8,10,8,11,4,7 +L,5,11,7,8,5,7,4,1,8,8,2,10,0,6,3,8 +E,2,3,4,2,2,7,8,2,7,11,7,8,2,8,3,8 +F,5,11,5,8,2,1,15,5,3,12,8,3,0,8,3,6 +W,3,2,5,3,3,8,11,3,2,6,9,8,7,11,0,8 +Z,2,7,3,5,1,7,7,3,13,9,6,8,0,8,8,8 +E,4,11,6,8,6,8,7,5,9,6,5,9,3,8,6,9 +E,7,10,9,8,7,7,7,2,8,11,7,9,3,8,5,8 +R,3,5,5,4,4,8,7,4,5,9,4,7,3,7,4,10 +A,3,5,5,8,2,8,5,3,1,7,0,8,2,7,2,8 +W,4,2,6,3,3,7,11,3,2,7,9,8,8,10,1,8 +V,5,6,5,4,3,2,12,3,3,10,11,8,2,11,1,7 +S,5,10,6,8,3,10,6,4,8,11,3,8,2,8,5,11 +U,6,10,8,8,5,5,8,6,8,7,10,10,3,9,1,8 +B,4,9,4,7,5,6,8,8,6,7,5,7,2,8,7,9 +J,1,2,2,3,1,11,6,2,5,11,3,8,0,7,1,7 +X,1,1,2,1,0,8,7,3,4,7,6,8,2,8,4,8 +W,8,11,8,6,5,8,8,4,4,6,9,6,10,10,3,6 +X,4,8,5,6,3,7,7,4,4,7,6,7,3,8,4,8 +B,5,9,5,5,5,8,8,3,5,9,5,6,6,4,6,8 +L,4,9,5,7,2,2,4,2,9,2,0,8,0,7,1,5 +O,3,4,4,3,2,7,7,7,4,9,6,8,3,8,3,8 +W,5,10,8,8,8,8,11,2,3,6,8,8,8,10,1,8 +E,5,5,5,8,3,3,8,6,12,7,6,15,0,8,7,6 +R,1,1,2,1,1,6,9,8,4,7,5,8,2,7,4,11 +M,5,10,5,8,4,8,7,12,2,6,9,8,8,6,0,8 +D,5,10,7,7,7,9,7,4,6,9,4,6,3,8,3,8 +U,7,9,8,7,5,6,6,6,9,8,6,8,4,8,4,3 +F,8,12,7,6,3,5,10,2,5,12,6,4,2,9,6,4 +H,3,6,4,4,3,7,8,12,1,7,4,8,3,8,0,8 +C,6,9,6,7,3,5,8,7,8,13,9,9,2,11,3,6 +C,2,1,3,2,1,6,8,7,7,9,7,12,1,10,3,9 +O,2,1,2,1,1,8,7,6,5,7,6,8,2,8,3,8 +A,4,11,6,8,4,12,2,3,3,11,1,9,3,7,3,9 +A,6,11,8,8,8,8,7,6,5,6,6,9,6,8,7,3 +W,8,9,8,7,6,5,10,3,3,9,7,7,10,12,3,4 +N,4,4,5,6,2,7,7,14,2,4,6,8,6,8,0,8 +F,3,9,5,6,4,4,10,4,5,11,10,6,2,10,2,6 +J,2,8,3,6,1,9,5,4,7,12,4,11,1,6,1,7 +G,4,8,5,6,3,6,6,7,7,10,7,11,2,11,4,9 +H,3,7,4,5,4,6,6,7,6,6,7,9,3,9,3,8 +S,4,7,5,5,3,8,7,3,6,10,6,8,2,8,4,8 +U,2,0,2,0,0,7,5,10,4,7,13,8,3,10,0,8 +O,5,10,6,8,4,7,7,8,5,10,6,8,3,8,3,8 +N,4,5,5,4,3,7,8,5,5,7,7,6,6,9,2,5 +H,5,4,5,6,2,7,7,15,0,7,6,8,3,8,0,8 +V,3,6,4,4,2,9,11,3,3,4,11,9,2,10,1,8 +T,7,10,6,5,2,4,12,3,7,12,8,4,2,8,3,3 +U,6,10,8,8,11,7,6,4,5,7,7,8,11,9,7,10 +B,2,5,4,3,3,9,7,2,5,10,5,6,2,8,4,9 +R,4,6,6,4,4,9,8,4,6,9,3,7,3,6,4,11 +S,4,10,5,8,5,7,7,7,5,7,7,9,2,8,8,7 +F,3,4,5,3,2,4,12,4,4,13,8,4,1,10,1,7 +M,6,10,7,5,4,13,2,5,2,12,1,9,6,3,1,8 +H,3,3,4,4,2,7,5,14,1,7,9,8,3,9,0,8 +B,2,0,2,1,1,7,8,7,5,7,6,7,1,8,7,8 +K,3,5,5,3,3,5,7,2,7,10,9,11,3,8,3,7 +E,6,12,4,6,2,7,9,6,7,9,6,10,1,9,8,9 +J,4,11,5,8,3,8,9,0,7,14,5,6,1,9,1,8 +A,3,8,5,6,4,11,3,1,2,8,3,9,3,5,2,8 +R,4,4,5,6,3,6,10,9,3,7,5,8,3,8,6,11 +S,5,9,5,5,2,5,9,2,5,13,8,8,2,8,2,6 +K,3,6,4,4,1,4,7,8,1,7,6,11,3,8,2,11 +W,4,4,5,3,3,4,10,2,2,9,9,7,6,11,1,7 +J,6,10,8,8,4,5,9,3,6,15,7,9,2,7,2,6 +U,3,7,5,5,3,8,8,5,7,4,8,8,3,9,0,7 +Z,3,8,4,6,2,7,7,4,13,10,6,8,0,8,8,8 +F,5,9,4,4,2,5,11,3,4,12,7,4,1,8,5,4 +L,3,4,3,3,2,4,3,4,6,2,2,6,0,7,0,6 +L,3,10,4,8,2,0,2,3,6,1,0,8,0,8,0,8 +D,4,6,5,4,4,7,7,6,5,6,5,6,3,8,3,7 +U,6,10,6,8,3,8,4,15,6,7,15,8,3,9,0,8 +S,6,9,5,4,2,11,2,3,4,11,2,10,3,7,3,11 +U,3,2,4,4,2,6,8,5,6,6,8,9,6,10,1,7 +L,3,8,3,6,1,0,1,5,6,0,0,6,0,8,0,8 +K,7,11,6,6,3,7,8,3,6,9,7,8,6,9,3,7 +Q,2,2,3,3,2,7,9,4,2,7,8,10,2,9,4,8 +T,2,7,3,4,1,7,14,0,6,7,11,8,0,8,0,8 +U,2,4,3,3,1,4,8,5,6,11,9,9,3,9,1,7 +H,3,3,5,2,2,7,8,3,6,10,6,7,3,8,3,8 +Y,3,5,4,3,2,4,10,1,7,10,10,6,1,11,3,4 +I,2,5,1,4,1,7,7,1,7,7,6,8,0,8,3,8 +V,3,5,5,8,2,7,8,4,3,7,14,8,3,9,0,8 +I,2,9,3,7,2,7,7,0,8,13,6,8,0,8,1,8 +E,3,3,3,4,2,3,8,6,9,7,6,14,0,8,7,8 +Q,1,2,2,3,1,8,7,5,2,8,7,9,2,9,3,9 +K,5,8,7,6,5,7,7,1,6,10,5,9,3,8,3,9 +C,5,10,5,8,3,4,10,7,8,12,10,9,2,9,2,6 +W,2,1,3,1,1,7,8,4,0,7,8,8,7,9,0,8 +Z,2,2,3,3,2,7,8,5,9,6,7,9,1,9,7,8 +M,6,6,9,6,9,9,8,5,4,7,6,7,11,9,6,3 +N,4,9,5,6,2,7,7,15,2,4,6,8,6,8,0,8 +G,2,5,3,3,2,7,7,7,6,6,6,10,2,8,4,9 +F,5,8,7,6,4,6,10,2,5,13,7,5,2,10,2,7 +Y,4,5,5,7,6,9,9,6,3,6,8,8,5,10,6,4 +K,4,5,7,4,3,6,6,2,7,10,8,11,4,7,4,7 +E,2,3,3,2,2,7,7,2,7,11,7,8,2,9,4,8 +F,2,4,3,3,2,5,10,4,6,10,9,6,1,10,3,6 +G,2,3,2,2,1,7,6,6,5,6,6,9,2,9,4,9 +P,7,10,10,8,6,8,10,7,5,9,4,3,3,10,5,9 +H,3,3,3,5,2,7,9,14,3,7,3,8,3,8,0,8 +Z,3,7,4,5,3,6,8,5,9,7,7,10,1,9,7,8 +O,3,9,4,6,3,7,7,8,6,7,8,8,2,8,3,8 +B,4,8,5,6,5,7,8,5,4,7,5,7,3,8,6,8 +M,3,4,5,3,3,10,6,3,4,9,4,7,6,5,1,8 +L,3,10,4,7,1,0,1,5,6,0,0,7,0,8,0,8 +W,6,7,6,5,4,7,11,4,2,8,7,6,7,12,3,6 +M,12,12,12,6,6,8,10,6,4,5,5,10,11,13,2,7 +L,5,9,7,7,5,5,5,1,8,7,2,11,2,9,3,7 +E,4,10,5,8,3,3,9,6,12,7,5,14,0,8,8,7 +U,4,7,5,5,2,8,4,14,5,6,14,8,3,9,0,8 +X,7,9,6,4,3,8,7,2,8,9,7,8,4,12,3,7 +Q,1,2,2,2,1,8,8,5,2,8,7,9,2,9,3,9 +M,5,10,8,7,7,9,6,2,4,8,5,7,7,6,2,8 +B,4,9,6,6,8,9,7,4,3,6,7,7,6,10,7,6 +U,4,10,6,8,10,7,7,4,4,7,6,8,11,7,8,8 +P,10,13,8,7,4,8,8,6,4,13,3,5,5,9,4,8 +V,6,10,6,8,3,2,11,4,4,11,12,8,2,10,1,8 +X,3,4,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +C,4,11,5,8,3,6,8,9,8,10,8,11,2,12,4,9 +B,5,7,8,6,9,9,6,4,4,7,6,8,7,9,8,7 +N,5,9,8,7,8,7,8,4,5,7,6,7,6,8,7,5 +Y,2,3,4,4,1,9,10,2,2,6,12,8,2,11,0,8 +X,1,3,2,1,1,8,7,4,8,7,6,8,2,8,5,8 +X,4,8,6,6,6,7,7,3,5,6,5,10,2,7,8,8 +G,7,11,6,6,3,9,4,4,3,8,3,5,4,7,4,9 +C,4,7,5,6,5,6,7,4,4,7,6,10,4,10,7,11 +C,2,5,3,3,2,6,8,7,8,8,7,13,1,9,4,10 +V,3,10,5,7,2,7,8,4,3,7,14,8,3,9,0,8 +Q,3,4,4,6,2,7,7,7,6,6,7,7,3,7,6,9 +D,3,2,4,4,3,7,7,7,6,6,6,5,2,8,3,7 +I,7,14,6,8,4,8,7,2,5,11,6,6,2,9,6,11 +U,4,4,4,6,2,7,5,14,5,7,13,8,3,9,0,8 +B,4,6,4,8,4,6,7,10,7,7,6,7,3,8,9,10 +U,7,11,8,8,5,3,8,5,7,10,9,9,3,9,2,6 +E,5,8,7,6,5,7,7,2,7,11,6,9,3,8,4,9 +C,4,7,5,5,3,6,7,6,8,7,6,11,1,9,4,9 +V,6,9,4,5,3,8,9,6,3,7,9,6,6,12,3,8 +A,2,6,3,4,2,11,3,3,3,11,2,10,2,6,3,8 +W,4,10,7,7,5,5,10,2,3,7,9,9,8,11,1,8 +J,3,10,4,7,2,13,3,7,4,13,4,11,1,6,0,8 +N,11,13,9,7,4,5,9,5,6,3,3,12,6,11,2,7 +S,2,4,4,2,2,8,8,2,7,11,6,7,1,8,5,8 +O,3,7,4,5,3,8,8,8,6,7,5,8,2,8,3,7 +F,4,7,5,5,2,5,12,4,6,12,9,3,1,10,3,4 +M,5,3,5,5,3,7,7,12,1,7,9,8,8,6,0,8 +D,4,8,4,6,3,6,7,10,10,7,6,6,3,8,4,8 +X,6,11,8,8,8,7,6,3,5,6,6,9,4,7,11,10 +P,7,10,10,8,5,6,13,7,2,11,5,2,1,11,4,8 +W,7,7,7,5,6,4,10,2,3,10,9,8,7,11,2,6 +J,2,6,2,4,1,13,2,8,4,13,4,12,1,6,0,8 +S,4,6,5,4,5,9,7,4,3,9,5,8,4,8,10,10 +A,2,7,4,5,3,10,3,1,2,7,3,9,1,5,1,7 +M,5,8,8,6,5,3,7,4,5,11,12,11,5,8,2,7 +H,1,1,2,1,1,7,8,11,1,7,5,8,3,8,0,8 +T,2,7,4,4,1,9,15,1,5,6,11,9,0,8,0,8 +N,2,2,3,3,2,7,8,5,4,7,6,7,4,8,1,7 +L,3,8,4,6,1,0,1,6,6,0,0,6,0,8,0,8 +G,5,10,7,8,6,8,7,7,6,6,7,7,2,7,8,13 +L,2,3,3,2,1,7,4,1,8,8,2,10,0,7,2,8 +D,5,10,7,7,5,10,6,4,7,11,3,6,4,6,4,8 +L,3,2,3,3,2,4,4,3,8,2,1,7,0,7,1,6 +U,5,7,6,5,3,4,8,5,7,9,8,9,3,9,2,5 +T,2,6,3,4,2,7,13,0,5,7,10,8,0,8,0,8 +P,4,10,5,8,4,5,11,3,7,11,9,4,0,10,4,7 +Z,5,9,7,6,4,6,9,3,10,11,9,5,2,8,6,5 +X,4,7,6,5,3,11,6,2,8,10,0,6,3,7,3,10 +L,2,5,4,3,2,6,4,1,8,8,2,10,0,7,2,8 +E,3,7,4,5,3,7,7,6,10,6,5,9,2,8,6,8 +A,3,8,5,6,3,12,2,3,2,10,2,9,2,6,2,8 +W,5,11,7,8,9,8,7,6,3,5,8,8,9,8,6,2 +P,5,9,7,7,4,9,7,3,6,13,4,5,5,10,5,10 +W,3,3,5,5,3,5,8,5,1,7,8,8,8,10,0,8 +W,8,8,11,7,11,6,8,6,6,6,6,7,10,9,9,9 +J,2,7,2,5,1,11,7,1,7,11,3,6,0,7,1,7 +F,4,8,6,6,3,4,12,4,5,13,8,4,2,10,2,6 +Y,6,11,6,8,3,3,10,2,7,11,12,6,2,11,3,5 +F,4,8,5,6,5,7,9,6,3,8,6,8,3,10,7,11 +T,3,5,4,4,2,5,12,3,7,11,9,4,1,11,2,5 +N,3,7,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +I,3,10,4,8,3,7,7,0,7,13,6,8,0,8,1,8 +M,6,7,9,5,6,5,7,3,4,10,10,10,10,6,4,8 +L,3,8,5,6,3,3,5,1,8,3,1,9,0,7,1,6 +Q,4,8,6,7,3,8,7,7,6,6,7,8,3,8,5,9 +V,4,11,6,9,4,7,11,2,4,6,11,9,3,9,2,8 +M,6,8,8,7,10,8,7,4,4,7,6,7,11,8,5,5 +Y,3,4,4,6,1,6,12,2,3,9,12,8,0,10,0,8 +Q,4,9,6,8,3,8,5,9,7,6,4,8,3,8,4,8 +A,3,3,5,4,2,6,3,3,2,6,2,8,3,6,3,7 +F,7,12,6,6,4,6,10,3,4,10,7,5,4,9,8,6 +R,4,8,6,6,4,10,8,3,7,10,1,7,3,6,4,10 +X,6,9,9,7,5,7,7,0,8,10,6,8,3,8,3,7 +X,4,6,7,4,3,9,7,1,8,10,4,7,3,8,3,8 +B,2,3,3,2,2,10,6,2,6,10,4,7,2,8,4,10 +N,3,6,3,4,2,7,7,13,1,5,6,8,5,8,0,8 +F,2,3,2,2,1,5,10,3,5,10,9,5,1,10,3,6 +I,5,12,5,7,3,9,8,3,6,13,4,5,2,8,5,10 +Y,5,6,5,4,3,4,9,1,7,10,10,6,1,10,2,4 +A,8,15,6,8,4,9,3,3,2,8,4,11,6,4,5,8 +Z,4,7,6,5,3,7,7,2,9,12,6,9,1,9,6,8 +F,6,10,5,5,4,10,8,4,6,11,3,4,2,9,6,9 +G,2,4,3,2,1,7,8,5,6,9,7,10,2,9,4,10 +L,3,9,5,7,3,8,4,2,7,8,2,8,1,6,2,9 +T,5,5,5,4,2,5,11,3,7,12,9,4,1,11,2,4 +J,6,11,8,8,6,7,7,7,6,8,7,8,3,7,4,6 +F,3,5,5,4,2,4,11,4,6,13,9,6,1,9,2,6 +S,3,9,4,7,2,7,6,6,9,4,6,10,0,9,9,8 +V,3,2,5,3,2,7,12,2,3,7,11,8,3,10,1,8 +E,6,13,5,7,4,7,8,4,4,11,5,9,3,9,8,11 +P,4,11,5,8,3,5,10,11,5,9,6,5,2,10,4,8 +R,5,11,7,8,5,8,9,5,6,8,5,8,3,7,6,11 +K,3,3,3,4,1,3,7,8,3,7,6,11,4,8,2,11 +A,4,7,5,5,3,8,2,2,2,7,2,8,2,7,3,6 +L,1,0,2,1,0,2,1,6,4,0,2,5,0,8,0,8 +R,2,1,3,2,2,6,7,4,5,6,5,7,5,7,3,8 +P,6,9,8,6,7,6,8,7,4,8,7,9,2,9,7,9 +N,4,8,5,6,2,7,7,15,2,4,6,8,6,8,0,8 +E,5,9,4,4,2,8,7,3,4,10,5,9,3,9,8,11 +K,5,7,8,5,5,3,8,2,7,10,11,11,3,7,3,5 +E,3,7,5,5,4,7,8,5,8,6,5,9,3,8,6,9 +I,4,7,5,8,5,8,9,4,4,7,7,9,4,7,7,6 +D,5,11,7,8,7,7,7,5,7,7,7,5,6,8,3,7 +V,3,9,5,6,3,7,9,3,1,7,12,8,3,9,1,8 +X,2,1,2,1,0,8,7,4,4,7,6,8,3,8,4,8 +X,4,11,5,8,4,7,7,4,4,7,6,7,2,8,4,8 +W,3,3,4,2,2,4,11,3,2,9,9,7,6,11,1,7 +O,5,9,6,7,3,9,9,9,9,5,8,10,3,8,4,8 +B,5,8,7,6,6,7,9,5,6,10,6,5,3,7,7,8 +T,8,12,7,7,2,5,11,3,7,13,7,4,2,8,4,4 +I,3,11,3,8,4,8,7,0,7,7,6,8,0,8,3,8 +H,3,4,5,2,2,7,7,3,6,10,6,8,3,8,3,8 +B,4,8,6,6,5,8,9,4,6,10,5,5,2,8,6,9 +V,3,3,4,2,1,5,12,2,2,9,11,7,3,12,1,7 +P,4,8,5,6,2,4,13,8,1,11,6,3,1,10,4,8 +S,5,10,6,8,3,9,8,6,9,5,6,5,0,8,9,7 +M,9,9,13,8,14,6,6,5,4,6,5,8,15,11,7,9 +G,1,0,1,1,0,7,7,6,5,6,5,9,1,7,5,10 +P,3,7,5,5,3,6,10,3,6,10,8,4,4,10,4,7 +N,4,7,5,5,4,7,7,7,5,8,6,6,3,7,3,8 +J,2,11,3,8,2,11,6,1,8,11,2,6,0,7,1,7 +D,5,9,5,5,3,5,8,4,6,9,6,6,4,10,6,5 +L,4,11,6,9,3,3,4,2,10,2,0,8,0,7,1,5 +P,8,13,7,7,5,10,7,4,5,12,4,5,4,11,5,8 +M,7,11,11,8,8,4,7,4,5,10,11,11,9,7,4,8 +V,7,9,7,7,3,3,11,4,4,10,12,7,3,10,1,7 +N,6,5,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +S,2,1,3,2,2,8,8,6,5,7,5,7,2,8,8,8 +I,5,6,7,7,6,7,9,4,5,7,7,7,3,8,8,8 +E,6,14,5,8,4,8,8,4,5,11,5,9,3,9,8,11 +F,3,3,3,4,1,1,12,5,4,11,10,7,0,8,3,7 +F,5,10,8,7,6,9,8,2,6,12,4,5,4,8,4,9 +W,8,8,8,6,6,3,11,2,3,10,9,8,7,11,2,6 +K,7,10,6,5,3,9,8,3,6,9,4,6,5,8,4,7 +S,3,7,4,5,5,8,8,5,3,8,5,8,3,8,10,7 +A,2,3,4,2,1,8,2,2,2,7,2,8,2,6,2,7 +Y,4,8,6,6,6,9,4,7,4,7,9,7,3,9,8,4 +Y,3,4,4,2,2,4,11,2,7,11,10,5,1,11,2,5 +H,4,9,5,6,2,7,6,15,1,7,7,8,3,8,0,8 +D,5,11,6,8,7,8,7,5,5,10,5,5,3,8,3,8 +O,6,10,5,5,3,7,5,6,3,10,6,10,5,9,5,8 +M,5,2,6,3,4,7,6,7,5,7,8,10,8,5,2,9 +H,4,9,6,6,8,7,6,5,3,6,6,8,7,7,8,8 +U,2,3,3,2,1,6,9,5,5,7,9,9,3,10,1,8 +W,1,0,1,0,0,8,8,3,0,7,8,8,3,9,0,8 +N,5,5,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +F,5,10,6,7,6,5,10,3,6,10,10,6,2,10,3,6 +R,4,7,4,5,4,6,8,8,4,6,5,7,2,7,5,11 +V,5,9,7,7,3,5,9,4,1,9,13,8,5,10,2,9 +A,3,8,5,6,3,6,5,3,0,6,1,8,2,6,1,7 +A,3,2,5,4,2,8,2,2,2,7,1,8,2,6,2,7 +R,4,8,6,6,5,7,8,5,6,7,5,7,3,7,5,8 +T,2,0,2,0,0,7,15,2,3,7,10,8,0,8,0,8 +F,4,6,4,8,2,1,14,5,3,12,9,5,0,8,3,6 +T,3,4,4,3,2,7,12,3,5,7,11,8,2,11,1,8 +I,4,10,5,8,3,7,7,0,8,14,6,8,0,8,1,8 +N,4,6,4,4,2,7,7,14,2,5,6,8,6,8,0,8 +X,3,7,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +M,3,7,4,5,3,7,7,11,1,7,9,8,8,6,0,8 +E,4,11,4,8,3,3,7,6,11,7,6,15,0,8,7,7 +N,4,7,4,5,2,7,7,14,2,5,6,8,6,8,0,8 +U,6,8,7,6,4,4,8,5,7,9,8,9,3,9,2,5 +F,3,9,4,7,4,5,10,1,7,10,9,7,1,10,3,6 +V,4,5,5,4,2,4,13,4,4,10,11,7,3,10,1,8 +J,4,10,5,7,3,9,7,2,6,14,4,8,0,7,1,7 +E,4,9,6,7,4,4,10,5,8,11,10,9,2,8,5,3 +M,6,11,9,8,11,7,8,6,4,7,6,8,6,9,9,8 +R,5,9,8,6,5,11,6,3,6,11,1,6,4,5,4,10 +L,5,10,6,8,5,3,4,5,7,2,0,7,1,6,1,6 +V,6,9,6,6,3,3,11,4,4,10,12,8,2,10,1,8 +R,1,0,2,0,1,6,10,7,2,7,5,8,2,7,4,9 +L,2,5,3,4,2,4,4,4,7,2,1,6,0,7,1,6 +C,4,10,5,7,3,6,8,7,7,13,8,8,2,11,3,7 +F,3,7,4,5,2,1,13,4,3,12,10,6,0,8,2,6 +F,2,3,3,1,1,7,9,2,5,13,6,5,1,9,1,8 +Q,3,6,4,8,4,9,7,7,3,5,7,10,3,9,5,10 +P,2,3,2,1,1,5,10,3,4,10,8,4,0,9,3,7 +V,5,11,7,8,2,8,8,5,3,6,14,8,3,9,0,8 +G,2,0,2,1,1,8,6,6,5,6,5,9,1,8,5,10 +I,1,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +W,7,12,7,6,5,4,8,1,3,8,9,8,9,10,2,5 +A,7,10,9,8,8,7,7,7,4,7,6,9,4,8,11,1 +M,5,6,7,4,5,11,6,3,4,9,2,6,7,6,2,8 +C,5,9,4,5,3,7,6,4,4,9,9,11,4,10,9,10 +Z,2,5,4,3,2,7,7,2,9,11,6,8,1,8,5,8 +P,3,8,5,6,4,7,8,5,6,8,7,4,2,10,4,7 +I,5,9,4,5,2,8,8,3,6,13,4,6,1,7,4,9 +P,6,10,8,7,7,7,8,7,4,8,7,9,3,9,8,9 +J,2,10,3,7,1,12,3,10,4,13,5,13,1,6,0,8 +L,3,9,5,7,4,5,5,1,8,4,2,8,3,7,2,6 +C,4,7,5,5,3,3,8,5,7,10,9,14,1,8,3,8 +S,5,8,6,6,4,9,7,4,6,10,3,6,2,7,5,10 +V,3,3,4,2,1,4,12,3,3,9,11,7,2,11,1,8 +L,3,9,3,6,1,0,1,5,6,0,0,7,0,8,0,8 +V,6,11,6,6,3,5,10,4,3,10,8,5,4,11,2,8 +S,4,10,4,5,2,9,3,3,4,9,2,9,3,6,4,9 +F,3,7,4,4,1,2,12,5,5,12,10,8,0,8,2,6 +N,4,9,5,7,5,7,7,13,1,7,6,8,5,8,0,7 +Y,3,4,4,3,2,4,11,2,7,11,10,5,1,11,2,5 +B,3,5,5,3,4,9,7,3,5,10,5,7,2,8,5,9 +W,6,11,9,8,14,9,7,5,2,7,6,8,14,11,3,6 +J,5,10,4,8,3,9,8,2,3,11,6,7,2,10,6,12 +L,2,2,3,3,2,4,4,4,7,2,1,6,1,7,1,6 +U,4,9,6,7,3,7,9,6,7,6,10,9,3,9,1,8 +Z,3,9,4,7,4,8,6,5,9,7,6,6,2,7,7,8 +Q,6,10,8,7,7,8,6,8,4,7,7,7,6,6,8,8 +G,4,5,5,8,2,7,6,8,9,6,5,11,1,8,6,11 +Y,5,10,7,8,4,4,9,1,8,11,12,9,1,11,2,6 +L,3,6,4,4,2,7,3,2,7,7,2,8,1,6,2,7 +J,6,8,4,12,3,10,6,3,4,11,3,5,3,8,7,10 +W,9,10,9,7,9,4,10,2,3,9,8,8,8,11,2,6 +P,2,3,4,2,2,7,10,4,3,11,5,3,1,9,2,8 +R,3,7,5,5,3,10,7,4,6,10,2,7,3,7,4,10 +S,4,6,5,4,3,8,7,3,7,10,6,8,2,8,4,8 +B,6,9,8,7,7,8,8,5,5,7,5,6,4,8,6,7 +P,3,5,6,4,3,7,10,4,4,12,5,3,1,10,3,8 +Z,1,0,1,1,0,7,7,2,10,8,6,8,0,8,6,8 +S,4,8,5,6,3,8,8,6,9,5,6,7,0,8,9,7 +D,3,6,3,4,2,5,8,10,8,8,7,5,3,8,3,8 +B,2,3,3,1,2,8,7,2,5,10,5,7,1,8,4,9 +W,5,9,7,7,7,8,5,7,2,6,7,8,7,7,5,3 +Q,3,6,4,6,2,7,7,7,5,6,7,8,3,7,5,9 +E,3,10,4,7,5,7,7,6,8,8,8,9,3,8,6,9 +W,4,7,6,5,3,9,8,5,1,7,8,8,8,9,0,8 +A,3,11,6,8,2,9,5,3,1,8,1,8,3,7,2,8 +F,3,9,5,7,4,6,10,2,6,10,9,5,1,10,3,6 +T,6,14,5,8,3,6,10,2,6,11,7,6,2,9,5,4 +K,4,6,5,8,2,3,7,8,2,7,5,12,3,8,3,10 +A,3,5,5,3,2,8,2,2,2,7,1,8,2,6,2,7 +K,6,9,9,6,5,5,7,2,8,10,9,11,4,7,4,7 +P,10,15,9,8,6,8,9,4,4,12,4,3,5,10,6,6 +P,3,5,5,4,2,7,10,4,4,12,5,3,1,10,2,8 +R,2,4,4,3,3,8,7,5,4,8,5,7,3,7,4,11 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +Z,4,9,6,6,5,9,10,5,4,6,5,7,3,9,9,4 +J,3,7,5,5,2,7,4,5,4,14,9,14,1,6,1,6 +O,7,11,7,8,7,7,8,8,4,10,7,7,5,8,5,10 +J,4,8,5,6,2,9,6,2,8,15,4,8,0,7,0,8 +T,3,6,4,4,3,6,11,4,5,10,8,5,3,12,2,5 +W,5,7,5,5,5,4,9,2,3,9,8,8,6,11,2,6 +R,5,9,8,8,9,9,7,4,4,8,5,7,9,9,7,5 +P,5,10,5,5,3,9,8,3,5,13,4,4,3,10,6,7 +F,4,10,6,8,4,6,10,3,6,13,7,5,2,10,2,7 +N,7,9,6,5,2,5,9,4,6,3,3,10,5,9,2,7 +J,3,7,4,5,3,8,7,1,6,11,5,8,0,7,1,6 +N,7,10,9,9,9,8,9,4,4,7,4,7,9,6,7,6 +S,3,4,4,6,2,9,8,6,9,5,5,6,0,8,9,7 +A,4,8,7,6,5,9,5,2,5,10,2,6,2,6,3,8 +S,7,13,6,7,3,9,2,2,5,8,1,8,3,7,5,10 +U,7,11,6,6,4,8,6,5,5,6,7,8,5,7,3,7 +A,1,3,2,2,1,9,2,2,1,8,2,8,1,6,1,8 +O,7,10,5,5,3,9,6,5,6,9,3,8,5,8,5,8 +W,5,5,6,3,4,4,11,3,2,9,9,8,7,11,1,7 +Q,4,5,5,7,3,9,9,8,6,5,8,9,3,7,6,10 +K,8,12,9,6,5,10,5,4,6,11,2,7,5,8,4,10 +H,6,7,8,9,7,9,8,3,1,8,6,8,4,9,9,9 +V,2,1,4,2,1,8,12,3,3,5,11,9,2,10,1,8 +C,2,1,3,2,1,6,7,6,9,7,6,14,0,8,4,9 +O,6,10,6,7,4,9,6,8,6,10,3,8,4,8,4,6 +I,1,7,1,5,1,8,7,0,8,7,6,7,0,8,3,7 +I,7,12,5,7,3,10,5,4,5,12,3,7,3,8,5,10 +T,2,2,3,3,2,6,11,3,6,8,11,8,2,11,1,7 +Z,4,5,5,7,4,11,5,4,5,10,3,9,2,6,6,10 +R,4,7,5,5,3,6,9,9,5,6,5,8,2,8,5,10 +I,2,11,2,9,2,7,7,0,8,7,6,8,0,8,3,8 +O,7,10,7,7,6,8,6,7,5,10,5,11,5,7,5,6 +S,4,5,5,4,5,8,7,4,5,7,6,8,5,8,8,11 +L,4,4,4,6,1,0,0,6,6,0,1,5,0,8,0,8 +D,4,8,5,6,4,8,7,6,7,10,4,5,3,8,3,8 +E,5,11,7,8,6,6,8,4,7,11,9,8,3,8,4,6 +Z,4,6,5,4,3,9,6,2,9,11,4,9,1,7,6,10 +L,8,14,6,8,4,5,5,3,8,10,4,13,3,6,6,7 +K,4,6,6,4,4,8,6,1,6,10,5,9,4,7,5,8 +E,4,6,6,4,4,6,8,2,8,11,7,9,2,9,4,8 +K,4,5,5,3,3,5,7,4,7,6,6,11,3,8,5,9 +C,4,7,5,6,6,6,5,4,5,7,5,11,5,10,7,11 +Z,1,3,2,2,1,7,7,5,8,6,6,8,1,8,7,8 +W,4,4,6,6,3,11,8,5,1,6,8,8,8,9,0,8 +M,11,15,10,8,6,8,11,5,5,4,5,9,9,9,2,7 +H,2,1,2,2,2,8,7,6,5,7,6,7,3,8,3,6 +E,2,7,4,5,3,6,7,7,9,8,8,9,2,9,6,8 +D,4,2,5,4,4,7,7,7,7,6,6,5,2,8,3,7 +X,5,8,7,6,3,9,7,2,8,10,4,7,3,8,4,8 +T,5,10,7,8,6,7,11,3,7,7,11,8,2,12,1,8 +D,3,5,5,3,3,10,6,3,6,10,3,6,2,8,2,8 +Q,3,5,3,6,3,8,6,6,4,9,6,9,2,9,4,8 +Q,5,8,6,7,3,8,8,8,7,5,7,9,3,7,5,10 +O,2,3,3,2,2,8,7,6,4,9,5,8,2,8,2,8 +W,6,8,6,6,5,4,10,3,3,9,8,7,7,11,2,6 +E,4,11,6,8,5,7,7,2,8,11,6,10,3,7,5,8 +X,9,14,10,8,5,3,9,4,8,12,11,9,4,8,3,5 +B,4,8,4,6,3,6,7,9,7,7,6,7,2,8,9,10 +U,8,11,9,8,6,4,8,6,8,9,7,9,7,9,6,1 +M,4,7,4,5,3,8,7,12,1,6,9,8,8,6,0,8 +R,2,3,4,2,2,8,8,3,5,9,4,7,2,6,3,10 +P,3,5,5,4,3,7,10,4,4,12,4,3,1,10,3,8 +H,4,11,5,9,5,7,7,13,1,7,6,8,3,8,0,8 +V,4,6,5,6,6,7,8,5,5,7,6,8,6,8,6,6 +Z,2,5,3,4,2,7,7,5,9,6,6,8,2,8,7,8 +F,1,1,2,1,0,2,12,4,3,11,9,6,0,8,2,7 +C,7,10,8,8,5,4,8,6,7,12,10,12,2,11,3,7 +R,3,4,3,3,3,7,7,5,5,6,5,7,3,7,4,8 +D,4,6,6,6,5,6,7,5,6,6,5,7,4,7,5,5 +V,3,7,5,5,1,5,8,5,3,9,14,8,3,10,0,8 +Y,6,8,6,6,3,4,10,3,7,11,11,5,1,11,3,4 +O,3,9,4,7,4,7,6,8,5,6,4,8,3,8,3,7 +P,9,14,7,8,3,8,8,7,4,14,3,5,5,10,4,8 +I,2,6,3,4,2,7,7,0,8,13,6,8,0,8,1,8 +Q,6,9,7,11,9,8,4,8,4,6,5,7,5,8,7,11 +E,6,13,5,7,4,6,8,5,5,10,6,9,3,8,8,11 +K,6,11,9,9,6,8,7,2,7,10,4,8,4,7,4,8 +F,3,5,5,4,2,6,11,2,6,14,7,4,1,10,2,7 +G,3,4,4,3,2,6,7,5,5,9,7,10,2,9,4,9 +A,4,10,6,7,2,9,4,3,2,8,1,8,3,7,3,8 +R,1,0,1,1,0,6,8,7,3,7,5,8,2,7,4,11 +L,5,11,5,6,3,6,6,3,6,11,6,11,3,7,6,8 +O,5,10,6,7,5,8,6,8,7,8,4,10,4,9,5,6 +U,3,6,5,4,2,7,9,6,7,5,10,9,3,9,1,8 +P,2,4,2,2,1,5,10,4,4,10,8,4,1,10,3,7 +J,2,4,2,6,1,11,3,10,3,13,7,13,1,6,0,8 +X,4,11,7,8,6,8,8,2,6,7,6,6,6,10,9,8 +N,3,5,5,3,2,5,9,2,4,11,8,8,5,8,0,7 +M,6,10,9,7,6,11,6,2,5,9,3,6,9,8,2,9 +Z,4,9,5,7,5,7,8,5,9,7,7,8,1,8,7,8 +X,3,5,5,4,2,9,6,1,8,10,4,8,2,8,3,9 +M,4,7,5,5,4,9,6,6,5,6,8,6,8,5,2,7 +C,3,9,4,7,3,6,8,8,7,10,7,12,2,10,4,10 +T,2,5,3,4,2,7,12,3,6,7,11,8,2,11,1,8 +A,2,4,4,3,2,10,2,2,2,9,2,9,2,6,2,8 +Z,3,6,5,4,5,7,8,2,7,7,6,8,0,8,8,8 +F,3,7,4,5,3,4,10,3,5,10,10,6,1,10,3,6 +Z,8,12,8,6,5,10,3,4,7,12,3,11,3,6,7,11 +S,3,7,5,5,6,6,6,3,1,7,5,6,2,8,10,3 +O,5,7,6,5,7,8,7,5,1,7,6,8,8,8,5,10 +P,1,3,3,1,1,7,9,4,3,11,5,4,1,9,2,8 +E,3,4,3,7,2,3,7,6,10,7,6,15,0,8,7,7 +L,8,14,7,8,3,8,3,3,5,12,4,13,3,7,6,8 +I,7,15,5,8,3,10,5,6,4,13,3,7,3,8,5,10 +Y,6,6,5,9,3,7,9,2,2,7,10,5,4,10,5,6 +D,2,4,3,3,2,9,6,4,5,10,4,5,2,8,2,8 +K,7,10,10,8,8,4,8,1,7,10,8,10,3,8,4,7 +W,4,5,5,4,4,4,10,3,2,9,8,7,6,11,1,7 +M,5,9,8,7,8,8,7,6,5,6,7,8,8,6,2,8 +S,6,10,6,5,3,11,3,4,3,12,5,9,2,10,2,9 +Z,3,3,4,5,2,7,7,4,14,9,6,8,0,8,8,8 +V,3,7,5,5,2,7,12,3,4,6,11,9,2,10,1,8 +F,4,9,6,6,5,7,9,3,6,12,6,6,3,9,3,7 +I,5,11,4,6,2,10,6,2,5,11,4,6,2,9,4,11 +Z,3,7,5,5,5,8,8,6,3,6,4,6,3,9,8,3 +I,3,5,5,6,4,8,7,4,6,6,6,7,3,9,8,9 +C,6,11,8,8,9,8,6,5,3,8,7,11,10,8,6,5 +G,2,1,2,2,1,7,7,6,5,6,6,10,2,9,4,9 +Q,7,8,9,12,13,8,10,5,1,5,7,10,7,14,8,13 +D,5,10,6,7,3,5,7,10,9,7,6,5,3,8,4,8 +X,3,6,5,4,3,8,7,3,8,6,6,8,2,8,6,8 +R,9,11,7,6,4,8,7,5,5,10,3,8,6,6,6,11 +I,1,8,2,6,2,7,7,0,7,7,6,8,0,8,2,8 +T,7,11,7,8,6,6,12,5,5,11,8,4,3,12,2,4 +V,5,9,5,7,2,2,11,5,4,12,12,8,2,10,1,8 +N,2,4,3,3,2,6,8,5,4,7,7,7,5,9,1,6 +Y,8,10,8,8,4,2,12,5,5,13,12,6,1,11,2,5 +T,4,11,5,8,3,9,14,0,5,6,10,8,0,8,0,8 +U,3,4,4,3,2,7,8,5,6,5,9,9,5,10,1,7 +X,3,3,5,2,2,7,8,1,8,10,7,8,2,8,3,7 +I,1,8,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +M,6,10,8,8,9,8,7,5,5,6,7,7,11,7,4,6 +N,3,8,4,6,2,7,7,14,2,5,6,8,5,8,0,8 +N,5,9,8,7,5,4,10,3,3,9,9,9,6,7,2,7 +C,7,11,9,8,6,7,7,8,6,6,7,11,4,7,4,9 +B,4,10,6,8,7,8,7,4,7,6,6,6,6,8,6,10 +P,2,6,2,4,2,5,11,8,2,10,6,4,1,10,3,8 +O,4,9,6,7,4,7,7,8,4,7,6,11,3,8,4,7 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +K,6,9,9,7,5,3,9,3,7,11,11,11,3,8,3,5 +T,6,9,7,8,7,6,8,4,9,8,8,8,3,10,8,7 +P,6,11,6,8,3,4,13,9,2,10,6,3,1,10,4,8 +G,4,9,5,7,3,6,7,7,8,9,8,10,2,10,4,9 +U,12,15,10,8,5,5,3,4,5,4,7,6,6,6,2,7 +K,4,8,6,6,5,4,7,1,6,10,9,11,3,8,3,6 +D,5,8,6,6,5,7,8,4,7,7,6,8,7,8,3,7 +E,4,9,6,7,4,5,8,3,9,10,8,10,2,8,4,6 +I,6,15,4,8,3,11,5,4,5,12,2,7,3,8,5,10 +V,4,6,4,4,2,3,12,4,3,11,11,7,2,10,1,7 +V,5,9,7,7,5,8,11,3,2,5,10,9,5,10,5,8 +U,4,9,6,7,3,6,8,6,7,7,10,9,3,9,1,8 +D,4,8,5,6,4,7,7,7,7,7,6,4,3,8,3,7 +U,7,9,8,7,3,3,10,6,7,13,11,8,3,9,1,7 +O,5,10,7,8,3,9,6,9,8,7,5,10,3,8,4,8 +P,3,5,5,3,3,8,10,3,4,12,4,2,1,10,3,8 +D,4,10,5,8,5,7,7,6,7,7,7,5,6,8,3,7 +J,3,11,5,8,5,8,7,1,6,11,5,9,1,6,1,6 +G,4,5,5,8,3,8,7,8,7,6,7,8,2,7,6,11 +O,5,5,6,7,3,8,7,8,8,6,7,9,3,8,4,8 +Z,3,4,5,6,4,10,7,5,5,8,3,7,3,6,6,7 +C,5,7,6,5,6,5,6,4,4,7,7,9,5,10,4,8 +H,7,10,9,8,6,10,6,3,6,10,3,7,5,6,5,9 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +D,3,3,3,5,2,5,7,10,7,7,6,5,3,8,3,8 +H,6,8,9,10,9,7,5,4,3,6,4,7,7,7,10,9 +A,5,10,5,5,3,11,2,4,1,11,4,11,4,3,4,10 +D,3,4,4,3,2,7,7,7,7,7,6,5,2,8,3,7 +H,3,6,4,4,4,8,7,6,6,7,6,8,3,8,3,8 +R,4,9,5,6,5,7,8,5,5,8,5,8,3,6,6,9 +O,2,1,3,2,2,7,7,7,4,7,6,8,2,8,2,8 +O,7,10,7,8,5,7,7,8,6,10,7,9,3,8,4,7 +E,4,9,4,6,3,3,7,6,11,7,6,15,0,8,7,7 +F,4,11,5,8,2,1,12,5,4,11,10,7,0,8,3,6 +T,2,0,2,1,0,8,15,2,4,6,10,8,0,8,0,8 +B,4,6,5,4,5,7,6,6,7,6,6,6,2,9,6,10 +G,2,5,3,3,2,6,7,6,6,6,6,11,2,9,4,9 +F,3,3,3,4,1,1,14,5,3,12,10,5,0,8,2,6 +Q,9,15,8,8,6,12,4,3,6,10,4,7,4,9,6,12 +A,6,9,5,5,3,8,3,3,2,7,4,12,5,5,4,7 +B,4,9,4,7,3,6,7,9,7,7,6,7,2,8,9,10 +Q,3,3,4,4,3,8,8,6,3,5,7,10,3,8,5,9 +T,1,1,2,1,0,7,14,1,4,7,10,8,0,8,0,8 +A,3,7,5,5,3,6,3,2,2,4,2,7,2,5,2,6 +M,4,10,5,8,6,8,5,11,1,6,8,8,8,5,1,5 +V,4,6,5,4,6,8,6,4,2,8,7,9,7,9,4,8 +E,4,7,5,5,5,7,7,5,8,6,5,9,3,8,6,9 +H,7,11,10,8,9,9,7,3,6,10,4,7,5,6,4,9 +Q,2,4,3,5,2,8,7,5,2,8,7,9,2,10,3,9 +G,5,9,4,5,3,7,9,4,3,8,6,5,3,10,9,7 +H,2,3,4,2,2,6,9,3,6,10,7,8,3,8,3,8 +H,4,6,4,4,2,7,5,14,1,7,9,8,3,9,0,8 +M,6,9,9,6,7,9,6,2,5,9,5,7,8,6,2,8 +O,6,10,8,8,9,7,8,6,2,7,6,7,10,9,6,10 +J,2,3,3,5,1,11,2,10,3,13,8,14,1,6,0,8 +Z,5,10,6,7,3,7,7,4,15,9,6,8,0,8,8,8 +F,4,8,6,6,4,6,10,3,7,10,9,5,2,10,4,5 +B,5,10,7,8,7,8,7,7,6,6,6,5,2,8,7,9 +T,6,10,6,6,2,6,9,3,8,13,6,5,2,9,4,5 +T,3,7,4,4,1,8,15,1,5,6,11,9,0,8,0,8 +O,4,8,4,6,3,7,7,8,5,9,7,10,3,8,3,7 +I,5,10,6,8,4,6,6,2,7,7,6,10,0,9,4,8 +D,3,6,3,4,2,6,8,9,8,8,7,6,3,8,3,8 +D,4,6,5,4,4,8,7,5,5,10,5,5,3,8,3,8 +Q,2,3,3,3,2,8,8,6,2,5,7,10,2,9,5,10 +W,6,10,6,7,6,3,11,2,2,10,9,8,6,11,2,7 +A,4,9,6,7,6,8,9,8,5,6,5,8,3,6,7,5 +I,2,8,3,6,2,6,8,0,6,13,7,7,0,8,1,7 +M,4,5,5,8,4,7,7,12,2,7,9,8,8,6,0,8 +L,4,9,6,6,6,5,7,3,6,8,7,11,7,11,6,7 +O,4,8,5,6,4,8,7,8,5,7,7,9,3,8,3,8 +I,4,8,5,6,3,9,8,2,8,7,6,5,0,8,4,7 +Q,4,8,5,9,5,8,7,7,3,8,7,10,3,9,6,8 +G,4,6,4,4,2,6,7,6,6,9,8,10,2,8,4,9 +Q,2,3,3,4,2,8,8,5,2,8,8,10,2,9,4,8 +C,4,11,5,8,2,5,7,7,10,7,7,13,1,8,4,9 +H,2,4,3,3,2,8,8,6,6,7,5,7,3,8,3,7 +R,1,0,1,0,0,6,10,6,1,7,5,8,1,7,4,10 +Z,2,5,3,4,2,7,8,5,9,6,6,9,2,9,7,8 +A,3,6,6,4,3,7,5,2,3,6,2,6,2,6,3,5 +D,3,6,4,4,4,7,7,4,7,7,6,6,3,8,3,7 +Y,3,10,5,7,1,7,10,2,2,7,13,8,1,11,0,8 +A,7,11,5,6,3,10,0,2,2,10,4,12,3,4,3,8 +P,6,11,8,9,6,8,9,3,5,13,5,3,1,10,3,8 +Z,2,4,4,3,2,7,8,2,9,11,6,8,1,9,5,8 +O,3,5,4,3,2,7,7,7,5,9,7,8,2,8,3,8 +I,2,10,2,7,2,7,7,0,8,7,6,8,0,8,3,8 +R,4,8,6,6,6,7,7,3,7,7,6,6,6,8,4,9 +J,3,8,4,6,3,9,6,2,6,12,3,8,1,6,2,6 +F,3,7,5,5,3,9,9,2,6,13,5,4,1,10,3,9 +X,4,10,5,8,3,7,7,4,4,7,6,8,3,8,4,8 +E,2,5,4,3,2,6,7,2,8,11,7,9,2,8,4,8 +L,2,5,3,4,1,7,3,1,7,8,2,10,0,7,2,8 +S,3,6,4,4,2,7,7,5,8,5,6,9,0,9,9,8 +H,3,2,5,4,4,8,7,6,6,7,6,7,3,8,3,7 +E,5,10,7,9,8,7,7,5,3,7,7,9,6,10,10,12 +E,4,5,5,8,3,3,7,6,11,7,6,15,0,8,7,7 +U,3,7,4,5,3,6,8,6,6,6,9,9,3,9,0,8 +I,0,3,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +B,3,2,4,3,4,7,7,5,5,7,6,6,2,8,6,9 +T,2,3,3,4,1,8,13,0,6,6,11,8,0,8,0,8 +B,2,4,4,3,3,9,7,2,6,11,5,6,2,8,4,9 +Q,4,7,6,7,3,8,8,7,6,5,7,8,3,8,5,9 +Y,4,8,6,6,2,4,10,2,8,10,13,9,1,11,2,7 +H,5,9,7,7,9,8,9,5,3,7,6,6,9,8,9,7 +L,1,4,3,3,1,7,3,1,7,8,2,10,0,7,2,8 +B,2,3,2,1,2,7,7,5,5,7,6,6,1,8,5,9 +R,4,6,6,4,5,8,7,7,3,8,5,7,4,7,7,10 +Q,2,4,3,5,3,8,9,6,2,5,8,10,3,9,5,10 +X,2,3,3,2,1,8,7,3,8,6,6,8,2,8,5,8 +M,3,6,4,4,2,7,7,11,1,7,9,8,8,6,0,8 +I,4,6,6,7,5,8,8,5,6,7,6,8,3,8,8,7 +O,4,6,5,4,6,7,9,5,2,7,7,8,8,9,4,9 +B,6,10,5,6,3,8,6,4,5,10,5,8,6,7,7,10 +V,5,9,7,8,9,7,6,5,4,6,5,8,7,10,7,9 +Z,2,4,3,3,2,8,7,5,9,6,6,7,2,8,7,8 +K,6,10,8,8,6,5,6,1,7,10,8,10,3,8,4,8 +M,4,8,6,6,6,7,7,2,4,9,7,8,7,6,2,8 +L,3,5,4,4,3,8,9,4,5,6,6,9,3,8,7,10 +R,5,8,7,6,5,8,7,6,6,8,6,8,3,8,6,11 +G,2,1,3,2,2,7,6,6,5,6,6,10,2,9,4,9 +X,4,9,6,7,4,7,7,4,9,6,6,8,3,8,7,8 +N,5,9,8,7,5,7,9,2,4,10,5,6,5,9,1,7 +P,1,3,3,1,1,7,9,4,3,11,5,4,1,9,2,8 +L,6,9,5,4,2,8,3,3,4,11,4,13,2,6,6,8 +Z,4,6,6,8,4,11,4,3,5,10,2,8,2,7,5,11 +Z,5,8,7,6,5,8,7,2,9,11,5,8,1,7,6,8 +S,3,7,4,5,3,8,7,7,6,8,6,8,2,8,9,8 +F,3,4,5,3,2,7,9,2,6,13,6,5,1,9,2,7 +Y,3,2,5,3,2,5,10,1,7,9,12,9,1,11,2,7 +L,3,7,3,5,1,0,1,6,6,0,0,6,0,8,0,8 +E,5,11,7,8,6,7,7,2,7,11,7,9,3,8,4,8 +L,3,6,5,4,5,7,8,3,5,6,7,10,5,11,5,6 +X,3,7,5,5,3,4,8,1,7,10,11,9,2,9,3,5 +Q,7,12,6,6,5,11,4,4,6,10,4,7,3,9,7,12 +S,8,13,6,8,3,9,3,4,5,9,2,9,4,6,5,9 +D,7,11,9,8,7,7,7,5,6,7,6,8,7,8,3,7 +Z,5,9,6,7,3,7,7,4,15,9,6,8,0,8,8,8 +Q,4,6,4,8,5,8,10,5,1,5,8,11,2,10,5,10 +M,7,11,11,8,15,9,7,3,3,8,5,7,12,4,5,5 +M,3,6,4,4,2,8,6,12,1,5,9,8,7,6,0,8 +F,4,7,5,5,3,6,10,3,5,13,7,5,2,10,2,8 +E,2,3,2,4,1,3,8,6,10,7,5,15,0,8,6,8 +W,3,6,4,4,4,8,7,6,2,6,8,9,5,8,3,7 +W,4,2,6,3,3,7,11,2,2,6,9,8,7,11,0,8 +B,3,7,5,6,6,7,7,5,4,7,6,8,6,9,7,7 +A,2,9,4,6,2,6,5,3,1,6,0,8,2,7,2,7 +V,6,9,6,7,3,4,11,3,4,9,11,7,2,10,1,8 +L,4,9,5,7,4,7,4,1,7,8,2,9,1,6,2,8 +T,4,6,5,4,2,6,12,3,7,12,9,4,2,11,2,4 +Z,1,3,3,2,1,7,7,2,9,11,6,8,1,8,5,7 +J,4,7,6,8,5,9,9,5,4,6,6,9,3,7,8,6 +P,4,10,6,7,4,5,11,7,4,10,7,3,1,10,4,7 +M,4,1,5,2,3,7,6,7,4,7,7,10,7,6,2,8 +T,4,9,6,7,4,8,10,1,8,6,11,7,0,10,1,7 +G,4,10,5,7,4,7,7,7,6,6,5,8,1,7,6,11 +E,4,6,6,4,4,10,6,1,7,11,4,8,3,8,4,11 +G,3,7,4,5,3,7,7,7,6,6,5,9,1,8,5,11 +G,3,9,4,6,4,7,6,7,6,6,5,8,1,7,6,11 +V,4,8,6,6,7,7,7,4,1,8,7,9,7,10,4,7 +F,2,1,3,2,2,6,9,3,5,10,9,5,4,10,3,7 +K,4,6,6,4,5,8,8,5,4,7,6,7,7,6,6,11 +I,3,11,4,8,2,6,8,0,8,13,7,8,0,8,1,7 +Q,2,2,3,3,2,8,8,5,2,7,7,10,2,9,4,9 +U,6,10,5,5,3,4,4,4,5,4,7,7,4,6,2,8 +X,4,5,5,5,5,9,7,2,4,8,5,7,3,8,7,8 +G,3,5,5,5,4,7,10,5,2,7,7,8,6,11,7,8 +K,8,10,11,8,8,7,7,1,7,10,5,9,5,7,4,7 +J,1,3,2,1,0,8,7,2,4,14,6,9,0,7,0,7 +R,3,8,5,6,4,6,7,5,6,6,5,7,3,7,5,8 +A,4,11,6,8,2,7,6,3,1,7,0,8,3,7,1,8 +G,5,8,7,7,7,7,10,5,2,7,7,8,6,11,6,8 +Y,8,8,7,12,5,6,5,6,5,6,11,7,5,10,4,7 +G,2,5,3,3,2,6,7,5,5,10,7,10,2,9,4,9 +M,5,11,5,8,7,7,5,11,1,8,8,8,9,5,2,10 +D,4,11,6,8,7,8,7,5,6,7,7,4,3,8,3,6 +Y,9,8,8,12,5,10,11,1,4,7,10,5,4,10,5,10 +L,4,9,5,7,4,4,5,3,9,3,1,9,0,7,2,6 +A,4,10,7,7,2,7,7,3,0,6,0,8,2,7,2,8 +R,3,7,4,5,2,6,12,8,4,7,2,9,3,7,5,10 +Y,5,7,6,5,5,8,5,7,6,5,8,8,3,9,9,5 +S,4,8,5,6,2,8,7,5,8,5,6,8,0,8,9,8 +C,5,8,7,6,4,7,8,8,6,4,7,13,5,8,4,8 +B,2,0,2,1,1,7,8,7,5,7,6,7,1,8,7,8 +B,3,5,4,4,4,8,7,5,6,7,6,6,5,8,5,9 +F,4,9,5,6,5,6,10,6,4,8,6,8,2,10,7,10 +R,6,9,8,7,6,10,7,3,6,11,3,7,5,6,5,10 +H,4,6,6,8,6,8,12,4,2,8,7,6,3,11,7,5 +D,2,4,4,3,3,9,6,4,6,10,4,6,2,8,3,8 +S,6,9,7,6,4,9,7,4,8,11,5,8,2,8,5,9 +A,3,5,5,4,2,7,2,1,2,6,2,8,3,5,3,7 +R,2,7,3,4,2,5,10,8,4,7,4,9,3,7,5,11 +P,3,2,4,4,2,5,10,4,4,10,8,4,1,10,3,6 +D,4,8,4,6,2,5,8,10,8,8,7,5,3,8,4,8 +T,8,10,8,8,4,6,13,5,6,12,8,2,2,12,2,4 +L,2,3,2,2,1,4,3,4,6,2,2,5,0,7,0,6 +D,5,10,5,6,4,9,6,3,5,8,5,7,6,9,5,8 +Y,6,9,6,7,3,4,9,2,8,10,11,6,2,10,4,3 +F,3,5,5,4,2,5,10,2,6,13,7,5,1,9,2,7 +Y,2,5,4,4,2,7,10,1,6,7,11,8,1,11,2,8 +F,4,4,4,6,2,1,14,5,3,12,9,5,0,8,3,6 +G,5,8,6,6,5,7,7,7,5,4,7,9,3,6,5,8 +U,5,7,5,5,2,4,8,6,8,9,9,9,3,9,2,4 +Q,4,7,5,6,2,8,7,8,6,6,7,8,3,8,5,9 +B,8,12,7,6,6,8,7,5,5,9,7,8,7,8,9,7 +Q,2,3,3,4,3,8,7,7,3,6,7,9,2,8,5,9 +Z,3,7,5,5,3,8,7,2,9,11,5,8,1,7,6,8 +T,3,7,5,5,5,7,8,4,5,7,7,9,5,9,5,7 +S,3,9,4,6,2,8,9,6,10,5,5,5,0,7,9,7 +U,6,8,7,6,3,4,8,7,8,9,9,9,3,9,3,5 +D,4,8,4,6,3,6,7,10,9,7,6,6,3,8,4,8 +X,3,8,5,6,4,7,7,3,8,6,7,10,3,7,7,8 +R,4,9,6,7,6,7,9,5,6,8,4,8,3,6,5,11 +U,6,10,7,7,5,3,8,5,7,9,8,10,5,8,3,4 +D,4,9,5,7,5,5,7,9,6,6,6,6,2,8,3,8 +C,6,8,6,6,3,5,8,6,8,13,9,9,2,11,2,7 +H,4,9,4,7,4,7,8,13,1,7,5,8,3,8,0,8 +I,1,4,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +L,4,9,5,7,4,9,4,1,7,9,2,10,1,6,3,9 +Y,3,4,5,6,6,9,7,5,3,7,7,7,6,9,6,4 +X,4,8,7,6,4,6,7,1,8,10,8,9,3,8,3,7 +L,3,8,3,6,1,0,1,6,6,0,0,6,0,8,0,8 +I,2,8,5,6,5,11,6,1,6,9,4,5,1,7,5,8 +G,4,5,5,4,3,7,7,6,7,9,6,11,2,10,5,9 +T,8,11,9,8,6,7,9,2,9,10,9,5,2,9,5,5 +E,3,5,5,4,3,5,8,3,9,11,8,10,2,8,4,7 +R,2,0,2,1,1,6,10,7,2,7,5,8,2,7,4,10 +M,4,7,5,5,4,8,6,10,0,6,8,8,7,5,0,8 +T,6,10,8,7,9,8,8,5,6,6,7,9,8,7,9,5 +X,4,8,6,6,3,7,7,1,8,10,6,8,3,8,4,7 +I,3,7,4,5,2,7,9,0,7,13,6,6,0,9,2,7 +C,4,7,5,5,3,5,8,7,7,8,8,14,2,9,4,10 +U,5,8,6,6,2,7,4,13,6,8,15,8,3,9,0,8 +M,7,9,10,6,7,5,6,3,5,9,10,10,8,5,2,7 +O,3,1,4,3,2,7,7,7,5,7,6,8,2,8,3,8 +J,2,9,2,6,2,13,4,5,4,13,2,9,0,7,0,8 +W,3,4,4,3,3,6,10,4,2,8,7,7,6,12,1,6 +A,2,7,4,5,2,8,4,2,1,7,1,8,2,6,1,8 +C,1,0,1,0,0,7,7,5,7,7,6,13,0,8,4,10 +I,2,7,3,5,2,8,6,0,7,13,6,9,0,8,1,8 +D,8,15,7,8,6,10,5,4,7,10,4,7,6,7,9,8 +O,2,3,3,2,2,7,7,6,4,9,6,8,2,8,2,8 +U,6,10,9,8,11,9,7,4,5,6,7,7,9,7,6,6 +A,4,11,7,8,4,12,4,3,3,9,1,9,3,8,3,9 +N,2,5,4,3,2,7,8,2,4,10,5,6,5,9,0,7 +J,2,8,3,6,2,14,4,4,4,13,2,9,0,7,0,8 +G,4,5,5,8,2,8,6,9,8,6,6,12,2,8,5,10 +V,4,11,6,8,8,7,5,5,2,8,7,8,6,9,5,8 +A,3,11,5,8,4,11,4,2,3,9,2,9,3,7,3,7 +D,4,10,6,8,5,8,7,7,7,9,4,5,3,8,4,9 +D,3,8,4,6,2,5,7,10,8,6,5,5,3,8,4,8 +L,3,8,4,6,3,8,4,1,7,9,2,10,1,6,3,9 +A,6,11,6,6,4,12,3,5,2,11,3,10,6,4,4,10 +Q,3,7,4,6,2,8,6,9,6,6,4,8,3,8,4,8 +D,2,5,3,3,2,9,6,3,5,10,4,7,3,7,2,8 +R,4,7,7,6,7,7,7,3,3,7,5,8,6,8,6,6 +E,3,6,4,4,4,6,7,5,7,7,6,9,3,8,5,10 +O,3,3,5,5,2,8,6,8,8,7,4,8,3,8,4,8 +W,3,2,5,3,3,8,11,3,2,6,9,8,7,11,1,7 +T,2,1,3,1,0,8,15,2,4,6,10,8,0,8,0,8 +Z,3,6,4,4,3,8,7,5,10,7,5,8,2,9,8,8 +S,6,8,7,6,4,7,8,4,8,10,7,7,2,9,5,7 +G,2,5,3,3,2,6,7,5,5,9,7,10,2,9,4,9 +R,4,4,5,6,3,5,12,8,4,7,3,9,3,7,6,11 +H,1,1,2,1,1,7,8,11,1,7,5,8,3,8,0,8 +E,5,9,7,7,7,8,10,7,4,6,6,11,5,8,8,9 +Y,4,6,6,4,5,8,5,6,5,8,7,8,5,8,4,6 +E,3,7,3,5,3,3,8,4,8,7,6,13,0,8,6,9 +K,6,9,9,6,5,9,6,2,7,10,3,8,6,8,6,10 +B,4,4,4,6,3,6,7,9,7,7,6,7,2,8,9,10 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +K,4,5,6,4,3,4,8,2,8,10,10,11,4,7,3,6 +D,3,6,4,4,6,8,8,5,4,7,6,6,3,7,8,5 +I,2,11,2,8,4,7,7,0,7,7,6,8,0,8,3,8 +H,3,7,4,5,3,7,7,13,1,7,7,8,3,8,0,8 +L,3,6,5,4,3,6,4,0,8,8,3,11,0,8,2,8 +E,3,10,4,8,2,3,8,6,11,7,5,15,0,8,7,7 +W,5,11,8,8,8,5,11,2,2,7,8,8,7,12,1,8 +S,3,5,5,4,2,8,7,3,8,11,5,7,1,9,5,8 +N,2,6,3,4,3,7,7,11,1,6,6,8,5,9,0,8 +V,5,10,5,7,3,3,11,3,4,10,12,8,2,10,1,8 +W,5,4,7,6,3,6,8,5,1,7,8,8,9,9,0,8 +W,4,6,7,4,4,7,9,4,0,7,9,8,7,12,0,8 +Z,6,8,8,10,7,11,5,4,5,8,2,6,2,7,7,8 +B,8,12,7,6,6,8,8,4,5,9,5,7,7,5,8,7 +L,2,7,3,5,2,5,5,2,8,3,2,7,0,7,1,5 +L,2,5,3,3,1,7,4,1,6,8,2,10,1,6,2,8 +B,4,7,7,6,7,8,8,4,4,7,6,8,6,8,8,5 +F,1,0,1,0,0,3,12,4,2,11,9,6,0,8,2,7 +I,2,10,5,8,5,10,7,2,5,9,5,5,3,8,6,7 +G,9,13,8,7,4,11,3,3,4,10,2,6,4,7,4,11 +F,6,10,9,7,9,8,6,1,6,9,7,7,6,10,4,7 +B,4,6,4,4,3,6,6,8,7,6,6,7,2,8,9,10 +G,3,4,4,3,2,6,6,6,6,6,6,11,2,9,4,9 +U,4,5,5,4,2,6,8,6,8,6,10,9,3,9,1,7 +P,4,6,6,9,8,6,6,5,3,7,6,6,9,13,6,10 +W,9,10,9,7,6,6,10,5,3,8,6,6,11,12,4,4 +A,3,8,5,6,3,11,2,2,2,9,2,9,2,6,3,7 +P,5,9,7,7,5,7,11,6,3,11,5,2,2,11,3,8 +T,8,11,8,8,4,5,14,7,4,11,8,3,2,12,1,4 +U,5,7,5,5,2,4,9,5,7,12,11,8,3,9,1,7 +J,1,6,2,4,2,9,7,0,6,10,5,7,0,7,0,7 +F,6,10,9,7,5,4,12,5,5,13,8,4,2,10,2,5 +O,5,7,6,5,7,8,7,5,2,7,6,8,8,9,4,9 +P,6,11,9,8,7,8,9,4,5,12,5,3,4,10,4,7 +O,6,10,7,8,3,7,10,9,9,8,8,6,3,8,4,8 +A,2,1,3,1,0,7,4,2,0,7,2,8,2,7,1,8 +R,7,13,7,8,5,10,5,2,5,9,4,8,6,8,6,9 +N,4,10,4,8,3,7,7,14,2,5,6,8,6,8,0,8 +R,12,14,9,8,5,9,7,6,5,10,2,8,7,5,6,10 +T,2,7,4,4,1,7,15,1,5,7,11,8,0,8,0,8 +O,2,0,2,1,1,8,7,7,5,7,6,8,2,8,3,8 +M,5,6,8,4,4,9,5,3,5,9,4,7,8,6,2,8 +V,1,0,2,1,0,7,9,3,2,7,12,8,2,10,0,8 +U,1,0,2,0,0,7,5,10,4,7,13,8,3,10,0,8 +T,3,4,4,3,2,5,11,2,7,11,9,5,1,11,2,5 +N,1,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +Y,5,8,5,6,2,3,11,3,7,13,11,6,1,10,2,5 +G,2,3,3,1,1,7,7,5,5,9,6,9,2,9,4,10 +K,2,3,4,2,2,5,8,2,7,10,8,9,3,8,2,7 +I,3,9,4,7,2,7,7,0,8,14,6,8,0,8,1,8 +L,2,1,3,3,1,5,2,6,7,1,3,2,1,7,1,5 +R,4,9,6,7,6,9,7,4,5,10,4,7,3,6,4,10 +V,7,9,7,5,3,6,9,5,3,8,7,5,5,12,3,9 +I,3,7,4,5,1,8,5,0,8,14,6,10,0,7,1,8 +K,6,11,6,8,3,4,8,9,2,7,5,11,4,8,2,11 +Q,5,5,7,5,5,7,4,4,5,7,3,8,4,5,4,8 +P,4,8,5,6,2,4,11,9,4,9,6,5,2,10,4,8 +T,5,10,5,7,4,5,11,2,8,11,10,5,1,11,3,4 +W,5,10,8,7,12,7,7,6,2,7,7,8,13,12,4,10 +B,5,8,7,6,6,9,6,4,6,10,5,7,2,8,5,10 +U,3,2,5,3,2,7,8,5,7,5,9,9,5,10,1,7 +A,6,14,5,8,4,9,4,3,2,8,4,11,6,6,4,8 +Q,5,6,6,9,7,10,13,4,2,4,8,12,4,14,5,10 +E,5,11,5,8,6,3,7,5,9,7,7,14,0,8,6,8 +L,3,9,5,6,3,8,3,3,6,8,2,8,1,6,2,8 +M,14,14,14,8,7,7,10,5,5,4,4,11,11,13,2,7 +U,4,9,4,6,2,7,5,14,5,7,14,8,3,9,0,8 +I,2,6,4,4,3,10,7,2,4,8,5,5,3,9,5,7 +D,3,5,5,4,3,9,6,4,6,10,4,6,2,8,3,8 +H,9,15,8,8,5,11,7,4,5,9,3,4,6,8,4,8 +D,3,8,5,6,5,8,7,7,6,8,4,5,4,9,4,8 +P,3,9,4,6,2,4,11,9,3,9,6,4,1,10,4,8 +H,9,12,8,6,4,6,6,6,4,9,11,10,7,11,5,9 +Q,4,10,6,9,3,8,7,8,6,6,7,9,3,7,5,9 +G,2,3,3,2,1,7,7,6,6,6,6,10,2,9,4,9 +Z,2,3,4,2,2,8,7,2,9,12,6,8,1,8,5,8 +Z,3,6,4,4,2,7,7,3,14,9,6,8,0,8,8,8 +Z,4,11,5,8,2,7,7,4,14,10,6,8,0,8,8,8 +J,5,10,7,8,4,6,8,3,6,15,7,10,3,7,3,7 +N,9,12,8,6,3,7,10,5,6,3,4,10,5,9,2,7 +X,4,5,6,3,3,7,7,1,9,10,6,8,2,8,3,7 +Z,4,6,6,8,4,12,4,3,5,11,2,8,2,7,5,12 +Y,5,8,5,6,3,3,10,3,6,12,12,7,1,11,2,5 +Z,3,10,4,8,2,7,7,4,14,10,6,8,0,8,8,8 +N,5,10,6,7,4,6,8,6,5,7,7,9,6,8,2,6 +C,2,3,2,1,1,5,8,5,6,11,9,11,1,9,3,8 +B,4,7,6,5,6,9,6,4,6,10,5,7,2,8,5,10 +O,1,3,2,2,1,8,7,6,3,9,6,8,2,8,2,8 +P,3,6,4,4,3,4,10,4,5,10,9,4,1,10,3,7 +C,3,3,4,5,2,6,6,7,9,9,5,13,1,9,4,8 +M,4,8,5,6,5,8,6,6,4,6,7,8,8,5,2,7 +A,4,10,6,8,4,7,5,3,1,7,1,8,2,7,2,8 +A,3,9,5,6,3,10,3,2,2,8,3,10,2,6,3,7 +D,5,9,6,7,6,9,7,3,5,11,5,5,3,8,3,8 +M,3,4,5,3,3,7,6,3,4,9,7,8,7,5,1,8 +T,4,11,5,8,5,7,11,4,6,7,11,8,3,12,1,8 +N,8,14,9,8,4,4,9,3,4,13,11,10,6,8,0,8 +S,5,6,6,4,3,6,7,4,7,10,10,9,2,10,4,5 +P,3,2,4,3,2,5,10,4,4,10,8,3,1,10,3,6 +P,4,11,5,8,3,3,13,8,2,11,6,3,1,10,4,8 +H,6,8,8,6,5,10,6,3,7,10,3,7,4,9,4,10 +I,4,9,4,5,2,8,8,2,5,13,5,5,1,9,5,10 +S,7,11,9,8,11,8,8,5,3,8,5,8,6,8,13,8 +N,4,5,6,3,2,7,8,2,5,10,6,6,5,8,1,7 +Z,4,8,6,6,3,7,7,2,10,12,5,9,2,10,6,9 +Y,1,1,2,1,1,9,11,1,6,6,11,7,1,11,1,8 +L,1,3,3,1,1,7,4,1,7,8,2,10,0,7,2,9 +O,8,12,5,6,3,8,7,6,5,9,4,7,5,9,5,8 +W,4,7,6,5,3,6,8,4,1,7,8,8,8,10,0,8 +A,7,10,10,9,8,6,8,3,6,7,8,10,6,8,4,8 +U,6,10,8,8,8,8,7,9,5,6,6,9,3,8,5,5 +G,7,9,10,8,11,7,7,6,3,7,7,8,8,10,9,9 +N,2,1,3,3,2,7,9,5,4,7,6,6,4,8,1,6 +N,4,8,5,6,4,7,7,7,5,7,5,6,3,7,3,8 +W,3,2,5,3,3,8,11,2,2,7,9,8,6,11,0,7 +C,4,6,4,4,2,5,9,6,8,12,10,11,1,9,2,7 +G,3,5,4,4,2,6,7,5,5,9,7,10,2,9,4,10 +Q,3,6,4,7,4,9,5,6,3,9,5,11,3,9,5,9 +D,4,8,6,7,5,5,6,6,7,8,6,8,4,5,6,5 +H,2,1,3,2,2,7,7,5,5,7,6,8,3,8,2,8 +J,2,5,4,4,2,8,6,3,5,14,6,10,1,6,0,7 +B,2,1,2,1,1,7,7,7,5,6,5,7,1,8,7,10 +O,2,3,3,2,2,8,7,6,4,9,5,8,2,8,2,8 +A,3,7,5,5,3,12,3,3,2,10,1,9,2,6,2,8 +C,4,6,6,4,5,7,6,4,4,8,7,11,5,9,3,8 +F,3,5,3,4,2,6,10,4,5,10,9,4,2,10,2,6 +O,3,5,4,4,3,7,7,7,5,9,6,8,2,8,3,8 +J,2,10,3,7,2,12,3,6,3,12,5,11,1,6,0,8 +M,5,8,9,6,10,8,6,3,2,8,4,8,14,6,3,7 +F,6,10,8,7,8,7,6,6,4,7,6,8,5,10,8,12 +K,11,13,10,8,4,8,8,3,8,9,4,6,5,7,4,7 +F,3,8,4,5,1,1,12,5,5,12,10,8,0,8,2,6 +P,3,4,5,3,2,7,10,4,4,12,5,3,1,10,3,8 +L,4,9,6,7,7,7,7,3,5,6,7,11,6,11,6,5 +T,5,7,5,5,2,5,11,2,9,12,9,4,0,10,2,4 +S,4,7,6,5,3,8,8,3,7,10,5,6,2,8,5,8 +A,3,8,5,6,3,11,3,2,2,8,2,9,2,5,2,8 +C,8,12,5,7,2,6,8,7,8,10,7,12,2,9,5,9 +Q,4,8,5,7,3,8,6,9,7,6,4,8,3,8,4,8 +R,5,7,6,5,5,8,7,6,3,8,5,6,4,7,7,8 +Q,1,0,2,1,1,8,7,6,3,6,6,9,2,8,3,8 +D,4,8,6,6,5,10,6,2,6,11,3,7,3,8,3,10 +K,1,0,2,1,0,5,7,7,1,7,6,11,2,8,2,11 +K,8,15,8,8,4,6,8,3,7,9,7,9,6,9,3,7 +L,3,6,5,4,2,6,4,2,9,7,2,10,0,7,3,8 +L,3,11,5,8,2,2,2,5,10,0,0,6,0,7,1,5 +F,2,3,4,2,1,4,12,4,4,13,8,5,1,9,1,6 +U,5,6,5,4,2,4,8,6,8,9,9,9,3,9,3,5 +A,6,11,8,9,9,8,7,8,3,7,6,8,3,8,9,3 +G,3,7,4,5,2,8,7,8,7,6,6,9,2,7,5,11 +M,5,10,8,8,6,8,6,2,4,9,6,8,8,6,2,8 +O,3,7,4,5,3,7,7,7,3,9,6,9,3,8,3,8 +T,1,0,2,0,0,7,14,2,4,7,10,8,0,8,0,8 +U,4,5,5,4,2,5,8,6,8,8,10,10,3,9,1,7 +Y,4,11,6,8,2,9,10,1,3,6,12,8,1,11,0,8 +S,3,6,6,4,3,9,7,4,8,11,3,7,1,8,5,10 +U,3,8,5,6,3,4,8,7,7,9,10,11,3,9,0,8 +H,5,9,5,5,4,7,8,3,4,10,6,8,6,8,4,8 +M,4,7,6,5,6,6,6,5,5,7,7,11,10,5,2,9 +P,3,5,4,3,2,6,9,5,4,9,7,3,1,10,4,6 +W,5,5,8,4,8,7,7,5,5,6,6,8,8,10,7,10 +W,3,3,4,4,2,7,8,4,1,7,8,8,8,10,0,8 +U,2,0,2,0,0,7,5,10,4,7,13,8,3,10,0,8 +N,4,3,4,5,2,7,7,14,2,5,6,8,6,8,0,8 +O,4,11,5,8,3,8,8,9,8,6,8,8,3,8,4,8 +L,3,8,5,6,6,7,7,3,5,7,6,10,6,11,6,5 +R,1,0,1,0,0,6,8,6,3,7,5,7,2,7,4,11 +M,6,10,9,8,7,6,6,7,6,7,8,11,9,6,2,9 +S,2,7,3,5,3,8,7,7,5,7,5,7,2,8,8,7 +T,1,0,2,1,0,7,14,1,4,7,10,8,0,8,0,8 +D,10,15,9,8,6,9,5,4,7,9,5,7,6,10,6,8 +J,3,11,4,8,1,14,2,8,5,14,2,11,0,6,0,8 +L,5,10,5,8,3,0,1,5,6,0,0,6,0,8,0,8 +Y,3,4,5,6,4,9,10,7,4,7,7,6,4,10,5,5 +I,1,8,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +A,3,9,5,6,4,8,2,1,2,7,2,7,2,7,3,6 +R,7,9,10,8,11,7,7,4,4,7,5,7,7,9,7,5 +D,4,10,6,8,5,7,7,9,7,7,6,5,3,8,4,8 +A,4,11,6,8,4,12,2,4,3,11,1,9,3,7,3,9 +A,3,7,5,5,3,11,2,2,2,8,3,9,3,5,3,8 +T,5,10,7,8,8,5,8,4,7,7,6,9,5,8,5,6 +H,5,10,6,7,3,7,7,15,0,7,6,8,3,8,0,8 +B,3,5,4,3,3,7,7,5,5,6,6,6,2,8,6,10 +C,3,8,4,6,2,5,8,7,8,7,8,14,1,8,4,10 +P,2,4,3,3,2,6,10,5,4,9,7,2,1,10,4,6 +N,4,5,4,3,3,7,8,5,5,7,6,6,5,10,2,5 +J,2,8,3,6,2,10,7,0,7,11,3,6,0,7,1,7 +S,6,12,6,7,3,7,7,3,5,14,7,8,2,9,3,8 +U,5,10,5,7,2,7,4,15,6,7,14,8,3,9,0,8 +K,4,4,5,3,3,6,7,4,7,7,6,11,3,8,5,9 +Y,5,7,6,5,3,5,9,2,9,9,10,4,1,11,4,4 +W,5,7,5,5,4,3,11,2,2,10,8,7,5,11,2,6 +G,3,7,4,5,3,6,6,6,5,9,7,13,2,9,4,10 +R,2,3,3,2,2,8,7,3,5,9,4,7,2,7,4,10 +H,4,5,4,7,2,7,7,15,1,7,6,8,3,8,0,8 +W,10,10,10,8,7,6,10,5,3,8,6,6,10,12,4,4 +O,4,10,6,8,4,8,6,9,5,7,4,8,3,8,3,7 +B,3,4,4,3,3,7,7,5,6,7,6,6,2,8,6,9 +W,7,11,9,8,7,10,8,5,1,6,10,7,10,12,2,5 +A,4,8,6,6,3,9,3,2,3,8,1,8,2,6,3,7 +L,2,5,3,3,1,6,4,1,8,7,2,10,0,7,2,8 +Q,4,7,5,9,6,8,6,6,4,9,6,9,2,9,4,8 +F,2,4,2,3,2,6,10,4,5,10,9,5,2,9,3,6 +V,5,11,8,8,5,8,12,2,3,4,10,9,6,11,5,8 +O,8,11,8,9,8,8,6,8,4,9,5,8,3,9,3,8 +Y,8,9,8,7,5,5,8,1,8,8,9,5,4,11,6,4 +S,5,7,6,5,4,7,7,3,7,10,8,8,2,9,5,6 +C,3,6,4,6,4,4,8,3,5,7,6,11,3,10,7,7 +I,2,11,2,8,3,7,7,0,7,7,6,8,0,8,3,8 +A,3,10,5,8,3,13,4,5,3,12,0,8,2,6,3,9 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +O,4,6,6,6,4,8,4,4,4,9,3,9,3,7,4,9 +J,2,4,4,3,1,8,7,2,6,14,5,8,2,8,1,8 +Z,3,8,4,6,2,7,7,4,13,9,6,8,0,8,8,8 +S,4,8,5,6,4,8,7,7,7,7,6,8,2,9,9,8 +R,2,4,4,2,2,8,8,3,5,10,4,7,2,6,3,10 +S,3,6,5,4,5,9,7,4,3,8,5,8,4,8,10,9 +L,2,6,3,4,2,8,3,3,6,7,2,7,1,6,2,8 +Q,6,10,6,5,4,9,6,4,7,11,4,9,3,7,8,11 +Q,2,2,3,4,2,8,7,7,3,6,5,9,2,9,3,9 +V,3,8,5,6,2,9,9,4,1,6,12,8,2,10,0,8 +R,3,5,4,6,3,6,11,9,4,7,2,9,3,7,5,11 +O,5,8,7,6,8,8,7,5,1,7,6,8,9,9,6,11 +R,3,4,5,3,3,8,7,3,5,9,4,7,2,7,4,10 +F,7,13,7,7,5,8,10,3,5,11,5,4,4,9,8,7 +N,4,4,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +J,3,11,4,8,3,9,6,2,7,12,3,8,1,6,2,6 +P,4,8,5,6,2,4,15,8,1,12,6,2,0,9,4,8 +B,4,7,4,5,3,6,8,9,8,7,5,7,2,8,9,9 +E,5,10,4,5,3,7,10,5,5,10,5,9,3,8,6,10 +S,3,7,4,5,2,8,7,5,8,5,6,8,0,8,9,8 +N,4,7,6,5,6,7,8,4,4,7,6,7,5,9,5,4 +L,3,11,5,8,3,4,3,5,8,1,0,6,0,6,1,5 +I,5,8,6,9,6,8,9,5,6,6,6,7,3,9,9,8 +C,7,10,7,8,5,3,8,5,7,10,10,14,3,9,4,6 +D,2,5,4,4,3,8,7,5,6,9,5,5,2,8,3,8 +D,3,4,5,3,3,9,6,4,6,10,4,5,2,8,3,8 +R,3,6,4,4,4,8,6,7,3,8,6,7,4,6,7,8 +S,4,8,6,6,4,7,8,3,7,10,4,7,2,7,4,8 +N,5,6,7,4,4,4,10,3,3,9,9,8,5,8,1,7 +N,4,9,6,7,4,9,7,6,5,6,6,4,5,8,2,5 +O,5,10,7,7,8,9,7,6,1,7,7,9,10,9,4,6 +C,3,6,4,4,2,3,9,5,7,11,11,11,1,8,2,7 +I,4,9,4,4,2,7,10,2,5,13,5,4,1,8,5,8 +X,5,9,7,8,8,7,8,2,5,8,6,8,4,6,8,9 +R,6,9,8,7,8,8,8,6,5,8,6,7,7,8,6,12 +J,8,13,6,10,5,11,5,2,5,12,4,8,2,9,6,13 +Z,5,9,7,7,4,7,8,2,10,12,6,9,2,10,6,8 +Z,1,3,2,2,1,7,7,5,8,6,6,8,1,8,7,8 +R,2,1,3,2,2,7,8,4,5,6,5,7,2,6,4,8 +M,5,9,6,7,6,7,5,11,1,7,9,8,9,5,2,8 +C,4,10,5,8,2,6,8,7,10,4,6,13,1,7,4,8 +N,2,1,3,3,2,7,8,5,4,7,6,7,4,8,1,7 +B,4,8,6,6,5,8,7,5,6,9,5,6,3,8,7,9 +Z,6,9,8,7,5,9,5,3,9,11,3,11,3,6,7,9 +N,6,10,9,8,6,5,10,2,4,9,9,8,7,7,2,7 +I,5,10,6,8,4,7,7,0,8,13,6,8,0,8,1,8 +I,1,7,0,5,1,7,7,5,3,7,6,8,0,8,0,8 +O,4,7,6,5,6,9,6,5,1,7,6,9,10,9,4,8 +D,5,11,8,9,12,9,9,5,5,7,6,6,5,8,9,6 +P,7,11,10,8,5,8,11,7,3,11,4,2,2,11,4,9 +N,5,8,7,6,4,7,8,3,5,10,6,7,5,8,1,7 +Q,2,4,3,5,3,8,7,7,3,6,6,9,3,8,5,10 +I,2,7,5,5,4,11,6,1,5,8,4,5,3,8,5,9 +D,5,9,7,7,7,9,6,4,6,9,3,6,3,8,3,8 +P,5,8,5,6,2,4,13,8,1,11,6,3,1,10,4,8 +C,2,1,3,2,1,6,7,6,10,7,6,14,0,8,4,9 +J,5,10,7,8,3,6,7,3,7,15,8,11,1,6,1,7 +K,3,2,4,3,2,5,7,4,7,6,6,11,3,8,5,9 +T,1,0,1,0,0,8,13,1,4,6,10,8,0,8,0,8 +M,6,5,7,8,4,8,7,13,2,7,9,8,9,6,0,8 +K,9,13,10,7,6,4,9,4,6,10,10,11,5,8,4,6 +G,4,9,4,6,3,6,7,7,6,10,8,10,2,9,4,9 +D,2,6,4,4,5,10,7,4,5,7,5,6,3,6,6,5 +J,1,4,2,3,1,10,6,2,5,11,4,9,1,7,1,7 +F,1,3,3,1,1,5,10,2,5,13,7,5,1,9,1,7 +H,6,7,8,5,5,5,9,3,6,10,9,9,4,9,4,7 +Q,3,5,4,6,3,8,7,7,5,8,7,8,2,9,4,9 +X,9,14,10,8,5,5,9,3,8,11,9,8,4,9,4,6 +U,7,9,8,7,5,4,8,5,8,10,9,9,3,9,2,6 +E,5,9,7,6,6,8,7,7,2,7,6,11,5,8,8,9 +K,1,1,2,1,0,4,6,6,2,7,6,11,3,8,2,10 +R,4,11,6,9,5,7,8,5,7,6,5,7,4,5,7,9 +R,4,7,5,5,4,7,8,6,6,6,5,8,3,6,6,9 +R,4,8,6,6,5,9,8,4,6,8,3,8,4,5,5,11 +R,2,4,4,3,2,9,7,2,6,10,3,6,2,7,3,10 +V,3,8,6,6,1,6,8,4,3,7,14,8,3,9,0,8 +X,3,8,4,6,3,7,7,3,8,6,6,10,3,8,6,8 +F,4,9,6,7,7,6,8,1,4,10,8,7,6,11,4,5 +B,3,7,4,5,5,9,6,5,4,7,7,8,6,9,7,7 +L,3,6,5,4,3,6,4,2,6,7,2,9,1,7,3,7 +U,4,2,5,3,2,6,9,6,7,7,10,9,3,9,1,8 +O,3,6,4,4,3,8,7,7,5,7,6,8,2,8,3,8 +Y,4,8,5,6,2,6,10,2,2,7,12,8,2,11,0,8 +Z,2,3,4,2,1,7,7,2,9,11,6,8,1,8,5,7 +P,6,8,8,6,5,7,11,7,3,9,5,3,3,11,4,8 +U,3,4,4,6,2,8,5,13,5,6,14,8,3,9,0,8 +C,6,9,4,4,2,7,9,6,6,11,7,8,2,9,5,9 +L,2,6,3,4,2,4,5,1,8,6,2,10,0,7,3,6 +R,3,5,4,6,3,6,11,10,4,7,3,9,3,7,5,10 +P,4,8,5,6,5,6,9,6,5,9,7,4,2,10,3,7 +R,4,11,5,8,3,6,10,10,4,7,4,8,3,7,5,11 +C,1,0,2,0,0,7,7,5,7,7,6,13,0,8,4,10 +Q,2,1,2,2,1,8,7,7,4,6,6,8,3,8,3,8 +R,2,1,2,2,2,7,8,5,5,6,5,7,2,7,4,8 +E,6,9,8,7,5,7,7,2,9,11,5,9,3,8,5,8 +E,3,7,4,5,4,7,8,6,9,6,4,9,3,8,6,8 +A,2,5,4,4,2,10,2,2,2,9,2,9,2,6,2,8 +L,3,7,4,5,2,7,4,2,6,7,2,8,1,6,2,8 +F,5,6,6,7,6,7,10,5,6,8,6,8,4,8,7,6 +E,2,3,4,2,2,5,8,2,8,11,8,9,2,8,4,6 +V,1,1,2,1,0,8,9,4,2,7,13,8,2,10,0,8 +E,2,6,3,4,3,6,7,6,8,7,6,10,3,8,6,8 +U,4,10,4,7,2,7,6,14,5,7,13,8,3,9,0,8 +A,3,8,6,5,2,8,5,3,1,7,1,8,2,7,2,8 +A,4,11,7,8,6,10,3,1,2,8,3,9,5,5,3,7 +Y,3,5,4,6,5,9,9,5,3,6,7,8,5,10,7,6 +N,2,3,4,2,1,5,10,3,3,10,8,8,4,8,0,8 +U,4,5,4,7,2,7,5,14,5,7,14,8,3,9,0,8 +G,4,8,5,6,3,6,7,6,6,10,8,10,2,9,4,9 +L,2,8,3,6,2,3,5,2,8,3,0,9,0,7,1,6 +O,5,11,6,9,6,7,7,8,3,10,6,8,3,8,3,8 +L,3,7,4,5,2,7,4,1,7,8,2,9,1,6,2,8 +Y,5,10,8,8,4,10,11,2,8,3,11,8,1,11,2,9 +K,3,4,4,6,2,3,7,7,2,7,5,11,3,8,3,10 +G,7,14,5,8,4,8,6,4,3,9,5,9,4,9,8,8 +F,3,9,4,7,4,5,10,3,5,10,9,6,2,10,3,6 +P,4,5,5,8,2,3,13,8,2,11,7,3,1,10,4,8 +U,3,4,4,3,2,6,9,6,6,7,9,9,3,9,1,9 +M,4,11,5,8,7,7,6,10,1,7,8,8,8,4,0,8 +L,3,10,3,8,2,0,2,3,6,1,0,8,0,8,0,8 +F,3,6,5,4,2,6,10,2,6,13,7,5,1,10,2,7 +W,4,3,6,4,2,4,8,5,1,7,9,8,8,10,0,8 +Z,4,10,5,8,3,7,7,4,15,9,6,8,0,8,8,8 +U,7,11,9,8,5,6,10,6,8,7,10,9,3,9,1,8 +H,3,7,5,5,4,8,7,6,6,7,6,9,6,8,3,8 +V,6,9,5,7,2,2,12,5,4,11,12,7,3,10,1,8 +E,4,10,3,5,2,9,6,5,4,11,4,10,3,8,8,13 +O,5,10,6,8,6,8,8,8,4,7,7,6,5,7,4,9 +Q,1,0,2,1,1,8,7,6,3,6,6,9,2,8,3,8 +J,2,6,3,4,1,14,2,5,5,13,2,10,0,8,0,8 +R,3,6,4,4,3,8,8,5,6,7,5,6,3,7,5,8 +E,4,7,6,5,4,7,7,2,7,11,6,9,3,8,4,9 +W,6,9,6,5,4,3,9,2,3,9,10,8,8,11,1,5 +T,2,9,3,6,1,7,14,0,6,7,11,8,0,8,0,8 +B,2,3,3,2,2,8,7,3,5,10,5,6,2,8,3,9 +G,2,0,2,1,1,8,6,6,5,6,5,9,2,8,5,10 +S,4,9,6,6,4,7,6,3,7,9,9,9,2,10,4,6 +B,4,7,6,5,6,9,6,4,6,9,5,6,2,8,6,9 +S,4,9,6,7,4,9,8,4,7,10,4,6,2,8,5,9 +M,2,1,3,2,1,7,6,10,1,7,9,8,7,6,0,8 +D,3,7,5,5,7,10,8,4,5,7,6,6,4,7,7,5 +P,4,11,6,8,5,6,8,5,6,9,8,4,2,10,4,7 +V,4,10,6,7,4,8,9,4,2,6,13,8,2,10,0,8 +E,1,3,3,2,1,7,7,2,6,11,6,9,2,9,4,10 +Z,2,4,4,3,2,7,8,2,9,11,6,8,1,8,5,7 +Q,3,4,4,7,2,7,6,8,6,5,5,8,3,8,4,8 +F,4,8,4,5,2,1,12,5,5,12,10,8,0,8,2,6 +Q,2,3,3,4,3,8,7,7,3,6,6,9,3,8,4,9 +O,3,4,4,3,2,7,7,6,4,9,6,8,2,8,3,7 +L,4,10,5,8,4,6,4,1,7,8,2,10,0,6,3,8 +L,4,10,5,7,3,7,4,0,9,9,2,11,0,7,3,8 +J,2,7,3,5,1,14,3,4,5,12,1,8,0,7,0,8 +A,3,6,5,4,3,8,3,2,2,6,2,7,2,6,2,6 +M,5,9,6,4,4,6,4,2,2,8,4,10,7,3,1,9 +H,7,11,10,8,7,4,9,4,6,10,9,9,3,8,4,7 +Q,4,10,5,9,5,8,7,8,5,6,7,8,3,8,4,9 +H,4,9,5,7,4,7,8,13,1,7,5,8,3,8,0,8 +V,5,11,7,8,4,7,9,4,1,7,13,8,5,9,2,9 +L,3,8,4,6,3,4,4,4,7,2,1,7,1,6,1,6 +M,5,11,7,8,9,8,7,6,5,6,7,8,8,6,2,8 +X,6,10,8,8,7,7,6,3,5,6,6,8,3,9,10,9 +Z,5,8,7,6,4,6,9,3,10,11,9,5,1,8,6,5 +I,3,9,4,7,3,7,8,0,7,13,6,8,0,8,1,8 +R,2,4,4,3,2,8,7,4,5,9,5,7,2,7,4,10 +O,7,10,7,8,6,8,7,7,4,9,5,6,5,9,5,10 +U,5,9,7,8,7,7,7,4,4,6,6,9,4,8,2,9 +J,2,3,2,4,1,10,3,10,3,12,8,13,1,6,0,8 +D,6,9,6,4,3,10,4,6,5,13,4,11,5,6,4,8 +K,5,7,7,5,5,4,7,2,7,10,9,11,4,7,4,6 +R,3,5,5,3,3,8,7,5,4,8,5,7,3,7,4,11 +G,5,11,4,6,3,7,9,4,4,9,6,5,3,9,8,7 +O,6,11,7,8,5,7,7,9,6,7,5,8,3,8,4,8 +A,1,0,2,0,0,7,4,2,0,7,2,8,2,7,1,8 +F,2,4,3,3,2,5,10,4,5,10,9,5,1,10,3,6 +U,5,9,6,6,4,3,9,5,7,10,10,9,3,9,2,6 +B,3,8,5,6,4,9,6,4,6,10,5,6,2,8,6,9 +F,5,9,6,7,6,6,10,5,4,9,6,8,5,9,7,11 +Q,4,8,4,9,5,8,8,6,2,6,8,11,3,9,6,7 +Q,3,8,4,7,4,8,7,8,5,6,5,8,2,9,4,8 +T,3,4,3,2,1,6,11,2,7,11,9,5,2,9,3,4 +S,4,8,5,6,2,7,6,6,9,5,6,10,0,9,9,8 +C,2,1,3,2,1,6,7,6,10,7,6,14,0,8,4,9 +Q,7,12,6,7,3,8,4,4,7,11,4,10,3,7,8,11 +L,4,10,5,8,3,0,2,4,6,1,0,8,0,8,0,8 +F,4,9,6,6,6,11,6,2,5,10,5,6,5,9,4,7 +P,4,6,5,8,8,8,9,5,0,8,7,6,5,10,5,9 +C,4,6,5,4,2,5,8,5,7,12,9,12,2,10,3,8 +V,2,6,4,4,2,6,11,3,3,8,11,8,2,11,1,9 +Q,7,9,7,11,9,8,7,6,2,8,7,11,5,9,8,6 +T,1,6,2,4,1,7,13,0,5,7,10,8,0,8,0,8 +N,5,10,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +Z,4,11,6,8,7,8,7,2,8,7,6,7,1,7,11,7 +S,2,1,2,2,1,8,8,6,4,8,5,7,2,8,8,8 +G,5,10,5,7,4,6,7,7,6,10,8,11,2,9,4,9 +M,9,14,11,8,7,6,4,3,2,8,4,10,10,1,1,8 +R,6,9,6,4,4,5,8,3,5,7,4,10,5,7,6,6 +T,4,7,4,5,3,5,11,3,6,11,9,5,2,11,2,5 +D,5,11,5,8,3,6,7,11,10,6,5,6,3,8,4,8 +X,3,4,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +M,2,3,3,4,2,8,6,11,1,6,9,8,7,5,0,8 +R,4,9,6,6,6,7,7,4,6,7,5,7,3,7,5,8 +P,3,5,5,4,3,8,8,4,4,12,4,4,2,9,3,8 +F,8,13,7,7,3,6,9,3,6,12,5,5,2,8,6,6 +Q,2,2,3,3,2,8,7,7,3,6,6,9,2,9,3,9 +J,1,4,2,3,1,10,6,2,6,12,4,9,0,7,1,7 +Y,3,5,5,7,5,9,10,5,4,7,7,7,5,11,6,5 +I,2,9,2,7,2,7,7,0,8,7,6,8,0,8,3,8 +S,3,8,4,6,3,8,8,7,5,7,6,7,2,8,8,8 +B,4,9,6,6,7,9,6,4,4,6,7,7,7,9,8,6 +Y,3,7,5,5,2,8,10,1,2,6,12,8,1,11,0,8 +I,4,10,5,8,3,5,9,0,7,13,7,6,2,9,3,6 +W,5,9,8,7,4,7,7,5,2,6,8,8,9,9,0,8 +I,5,12,4,6,3,10,6,3,5,13,3,6,2,8,5,10 +B,6,9,9,8,10,7,7,5,4,8,6,8,7,9,9,6 +T,3,8,5,6,2,7,14,1,5,7,10,8,0,8,0,8 +Y,2,9,4,6,1,7,10,1,3,7,12,8,1,11,0,8 +Z,5,8,7,6,4,7,8,2,10,12,6,7,2,8,6,8 +L,6,12,5,7,3,10,2,4,4,13,4,12,2,7,6,9 +Y,2,3,2,1,1,5,10,2,7,10,9,4,1,11,2,5 +M,3,4,5,3,3,8,5,3,3,9,6,8,7,5,1,8 +I,5,15,5,8,3,10,6,2,5,11,4,6,2,9,5,12 +R,2,2,3,3,2,6,7,4,5,7,6,7,5,7,3,8 +U,4,8,6,6,4,5,9,5,6,7,9,9,3,9,1,8 +D,6,12,5,7,4,7,6,4,6,9,5,6,5,9,7,6 +Y,8,11,6,15,5,4,11,2,4,11,10,6,4,10,6,6 +E,5,9,7,6,5,7,8,1,8,11,6,9,2,8,4,9 +L,1,0,1,0,0,2,2,5,4,1,2,6,0,8,0,8 +A,5,11,7,8,5,7,4,3,0,7,1,8,3,8,3,7 +C,4,6,5,4,5,6,6,4,4,7,6,11,5,9,3,8 +O,3,9,5,7,4,7,8,8,6,7,9,7,3,8,4,9 +U,2,6,3,4,1,7,5,13,5,7,12,8,3,9,0,8 +A,3,5,5,5,4,8,8,2,4,7,7,8,5,9,4,7 +E,3,5,6,3,3,5,8,2,9,11,7,9,2,8,4,8 +L,3,6,3,4,1,1,0,6,6,0,1,5,0,8,0,8 +P,4,7,6,11,10,8,10,4,0,9,7,6,7,10,5,8 +K,4,8,6,7,5,9,6,2,3,8,3,8,5,7,6,11 +R,4,9,6,7,6,9,7,4,5,10,4,7,3,7,4,11 +I,5,11,4,6,2,8,8,2,5,13,4,5,2,9,5,9 +K,3,3,5,2,2,6,7,1,7,10,7,10,3,8,2,8 +P,11,15,9,8,4,6,10,6,3,11,4,4,5,10,4,7 +W,7,11,7,6,4,4,8,2,2,8,10,8,9,11,1,6 +Y,5,9,5,5,3,6,7,4,5,9,7,5,3,10,5,4 +C,5,9,4,4,3,7,10,3,4,9,7,9,3,8,6,10 +K,5,10,8,7,5,6,7,3,8,7,6,8,4,8,5,8 +P,4,11,5,8,4,5,11,4,6,11,9,4,0,10,4,7 +R,4,8,5,6,5,8,8,6,5,8,6,7,3,7,5,9 +M,3,7,4,5,3,8,6,11,1,6,9,8,7,6,0,8 +F,1,0,1,0,0,3,11,4,3,11,9,7,0,8,2,8 +J,3,9,4,7,1,11,2,11,3,13,8,14,1,6,0,8 +F,4,8,4,6,3,1,12,4,4,12,10,7,0,8,2,6 +K,5,8,7,7,6,8,5,2,4,8,4,8,4,8,7,11 +U,3,3,4,5,2,8,4,14,5,7,12,8,3,9,0,8 +J,1,3,2,2,1,10,6,2,5,12,4,9,0,7,1,7 +R,5,11,6,8,7,5,9,8,3,7,5,8,2,7,5,11 +Q,5,8,6,10,7,7,10,4,2,6,9,11,3,9,6,8 +W,4,6,6,4,3,6,8,4,1,7,8,8,8,9,0,8 +K,7,11,9,8,5,6,7,2,7,10,7,10,4,8,4,8 +R,6,10,5,6,3,7,7,5,4,9,4,9,6,5,6,11 +M,7,9,9,5,4,12,2,5,2,11,1,9,7,2,1,8 +Q,7,14,7,8,5,12,4,4,6,12,3,9,4,8,7,12 +J,5,10,3,14,4,10,7,2,4,10,5,6,3,8,6,10 +X,4,9,7,7,5,7,7,3,9,5,6,10,3,8,6,8 +G,3,5,4,4,2,6,7,6,6,10,7,10,2,9,4,10 +N,3,7,5,5,3,5,9,6,4,7,7,9,5,9,1,7 +M,2,1,3,3,3,8,6,6,4,7,7,8,6,5,2,8 +Y,3,8,5,6,2,7,10,0,3,7,11,8,1,10,0,8 +N,5,9,6,4,3,2,11,3,3,12,11,9,4,9,0,8 +M,8,9,11,7,8,10,6,2,5,9,3,6,10,8,3,9 +K,5,7,7,6,6,10,5,3,3,10,3,8,5,7,6,12 +Y,4,10,6,8,6,9,3,7,5,7,8,8,3,10,5,4 +X,7,13,8,7,5,9,6,3,8,11,3,7,4,8,4,8 +F,4,9,6,6,4,6,10,1,6,13,7,6,1,10,2,8 +Z,2,1,2,2,2,8,7,5,8,6,6,7,1,8,6,8 +E,3,8,3,6,2,2,8,6,10,7,6,15,0,8,6,7 +S,4,8,5,6,4,8,6,7,7,7,8,9,2,10,9,8 +T,3,6,4,8,1,10,14,0,6,5,11,9,0,8,0,8 +V,3,5,5,3,2,7,12,3,3,7,11,9,2,10,1,8 +G,2,0,2,1,1,8,7,6,5,6,6,9,1,7,5,10 +M,5,10,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +L,2,4,3,3,1,7,4,1,8,8,2,10,0,7,2,8 +M,8,9,11,8,13,8,7,4,4,7,6,7,11,8,6,4 +D,9,13,8,8,6,7,6,4,7,10,5,7,6,8,8,5 +B,3,5,3,4,3,7,7,5,5,6,6,6,2,8,6,10 +V,7,11,7,8,5,2,12,2,3,9,11,8,3,9,2,6 +S,7,10,8,7,4,8,7,4,9,11,4,8,2,8,5,9 +U,6,11,9,8,5,8,8,5,9,4,10,8,4,7,2,7 +N,5,9,7,6,5,6,8,7,7,7,6,7,3,7,3,8 +H,2,0,2,0,0,7,8,11,1,7,5,8,3,8,0,8 +A,2,4,4,3,2,9,2,2,2,9,2,8,2,6,3,8 +S,4,9,5,6,5,8,8,7,5,7,5,7,2,7,8,7 +X,5,7,7,6,7,8,7,2,5,7,6,8,3,9,8,8 +J,3,10,4,8,1,11,2,11,3,12,8,14,1,6,0,8 +I,5,9,3,4,1,10,6,5,4,13,3,7,2,8,5,10 +B,4,7,4,5,5,6,7,8,5,7,6,7,2,8,7,9 +L,4,5,5,4,4,8,6,4,5,7,7,8,2,8,7,10 +U,5,5,6,4,3,4,8,5,8,10,9,9,3,9,2,5 +F,5,10,7,8,4,5,11,4,7,11,10,5,2,10,3,5 +V,4,7,6,5,6,7,7,4,2,8,7,8,7,10,5,7 +A,5,11,8,8,5,12,2,3,3,10,1,9,3,7,4,8 +N,4,6,4,4,2,7,7,14,2,5,6,8,6,8,0,8 +C,5,9,6,6,3,5,8,8,9,9,8,13,2,10,4,9 +J,2,5,4,3,2,11,6,2,7,12,3,7,0,7,1,8 +U,3,3,3,4,1,7,6,13,5,7,13,8,3,9,0,8 +D,6,12,6,6,4,6,8,5,7,9,6,6,5,9,7,5 +U,6,11,6,6,4,8,5,5,5,6,8,8,4,9,3,8 +A,4,11,7,8,4,11,2,2,3,9,2,9,5,6,3,9 +A,2,6,3,4,2,9,5,2,0,8,2,8,2,6,1,8 +I,4,11,5,8,3,7,7,0,9,14,6,8,0,8,1,8 +E,4,10,4,8,4,3,9,5,10,7,6,14,0,8,6,8 +E,5,10,7,7,6,10,6,1,7,11,4,8,4,8,5,11 +L,3,7,4,5,2,5,2,7,8,1,2,2,1,6,1,5 +Y,2,8,4,5,1,9,10,2,3,6,12,8,1,11,0,8 +M,4,4,5,3,3,6,6,6,5,7,7,10,7,6,2,8 +K,3,7,5,5,6,6,8,4,4,6,5,9,5,7,7,7 +K,4,7,5,5,4,7,6,1,6,10,5,10,3,8,4,9 +U,5,8,6,6,3,3,9,6,7,12,11,9,3,9,1,7 +J,1,3,2,2,1,10,7,1,5,11,4,8,0,7,0,7 +F,2,6,3,4,2,1,10,3,5,11,11,9,0,8,2,7 +X,3,4,4,3,2,7,7,3,9,6,6,9,2,8,6,8 +J,4,10,4,8,3,15,3,3,5,12,0,7,0,8,0,8 +P,6,12,5,7,4,6,11,5,2,11,6,3,3,12,5,5 +F,6,9,9,7,8,7,7,5,4,7,6,8,5,11,9,11 +A,6,10,7,7,7,8,8,6,5,6,5,8,5,7,7,5 +D,4,5,5,8,3,5,7,10,8,7,6,5,3,8,4,8 +Q,3,7,4,5,2,8,7,8,6,6,8,9,3,7,5,10 +V,3,4,5,7,1,8,8,4,3,6,14,8,3,9,0,8 +O,2,3,3,2,2,8,7,6,4,9,6,8,2,8,2,8 +P,4,7,5,5,4,5,10,3,6,10,9,5,4,10,3,7 +A,2,3,4,5,1,8,6,3,1,7,0,8,2,7,1,8 +U,7,12,6,6,3,9,7,6,6,3,10,7,5,9,2,6 +D,2,5,4,3,3,9,6,4,6,10,4,6,2,8,3,8 +E,3,2,4,3,3,7,7,5,8,7,6,9,2,8,6,9 +G,1,3,2,1,1,7,7,4,5,9,7,10,1,9,3,10 +G,4,7,4,5,3,7,6,6,6,10,7,11,2,10,4,10 +Z,3,9,4,7,2,7,7,4,14,9,6,8,0,8,8,8 +W,5,5,8,7,4,7,7,5,2,7,8,8,9,9,0,8 +Q,4,9,5,8,5,8,8,8,5,6,6,9,3,8,4,9 +Y,4,10,6,8,4,5,9,0,7,8,12,9,1,11,2,7 +U,3,6,4,4,1,8,4,13,5,7,13,8,3,9,0,8 +N,4,5,6,4,3,7,9,2,5,10,6,6,5,9,1,7 +Y,5,4,6,6,6,9,10,5,3,6,7,7,5,11,7,4 +S,2,4,4,2,1,10,7,2,7,10,5,8,1,9,5,10 +A,2,4,4,3,2,10,2,2,2,9,2,9,2,6,2,8 +Y,5,10,5,7,2,3,11,4,6,12,12,6,1,11,2,6 +M,5,10,7,8,10,8,8,7,4,7,6,8,8,9,9,4 +G,1,0,2,1,1,8,6,6,5,6,5,9,1,8,5,10 +A,5,11,8,8,5,9,3,2,3,8,1,8,2,7,3,7 +U,5,9,6,8,7,7,7,4,4,6,6,8,5,7,2,7 +I,1,3,1,2,0,7,7,1,7,13,6,8,0,8,0,8 +X,2,3,4,1,1,6,8,2,8,11,8,8,2,8,3,7 +D,4,8,5,6,3,9,7,4,7,11,4,5,3,8,3,8 +D,2,3,3,2,2,7,7,6,6,7,6,6,2,8,3,7 +A,5,9,6,7,4,9,4,3,1,8,1,9,2,7,3,8 +F,4,8,4,5,1,1,11,5,7,11,11,9,0,8,2,6 +D,5,8,6,6,5,8,8,5,6,10,5,4,4,9,4,9 +V,3,9,5,7,2,8,8,4,3,6,14,8,3,10,0,8 +D,9,14,8,8,6,9,5,4,6,10,4,7,6,8,9,7 +A,7,11,6,6,3,11,2,3,1,9,4,11,4,4,4,9 +U,6,10,7,8,4,3,9,5,7,11,10,9,3,9,2,6 +Q,5,9,7,11,7,8,6,8,4,5,6,10,3,8,6,10 +M,5,7,8,5,6,9,7,2,4,9,5,7,7,6,2,8 +O,4,10,5,8,5,8,6,8,4,7,4,8,3,8,3,8 +X,6,9,9,7,5,5,8,1,8,10,10,9,4,7,4,6 +B,6,10,9,8,7,9,6,4,7,9,5,7,3,8,7,10 +H,3,7,4,4,2,7,6,14,1,7,7,8,3,8,0,8 +C,3,4,4,6,1,5,7,6,9,7,6,14,1,9,4,9 +K,3,4,5,3,2,5,7,2,7,10,8,10,3,8,3,7 +X,4,4,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +W,4,9,6,7,10,9,7,5,2,7,6,8,13,10,3,6 +L,3,11,5,8,3,5,3,6,7,2,2,4,1,6,1,5 +V,4,8,4,6,2,3,11,3,3,10,11,7,2,10,1,7 +S,5,8,7,6,8,6,7,3,2,8,6,6,3,8,11,1 +I,1,11,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +G,3,6,4,4,2,7,6,6,6,6,6,10,2,9,4,8 +W,3,4,4,3,3,6,10,5,2,9,7,6,5,11,2,6 +T,6,10,5,8,2,4,13,3,7,12,10,4,0,10,1,5 +O,2,3,3,2,1,7,7,7,4,7,6,8,2,8,2,8 +V,5,9,5,6,3,2,12,4,3,11,12,8,3,10,1,7 +M,6,12,7,6,5,7,3,2,2,8,4,10,8,1,2,8 +Z,4,6,6,8,4,13,4,3,7,10,2,7,2,7,5,12 +P,4,10,5,7,3,5,10,10,4,9,6,5,2,10,4,8 +A,3,8,5,6,2,7,6,3,1,7,0,8,2,7,1,8 +S,7,10,9,8,11,8,8,5,3,9,5,7,5,8,12,8 +P,5,9,7,6,6,5,10,5,5,10,8,3,1,10,3,7 +E,3,8,3,6,2,3,7,6,10,7,6,14,0,8,7,8 +P,5,10,6,7,5,5,11,5,5,11,9,3,1,10,4,7 +O,1,0,1,0,0,8,7,6,4,7,6,8,2,8,2,8 +J,1,4,2,3,1,9,6,2,6,12,4,9,1,7,1,7 +M,3,4,6,3,3,7,6,3,4,9,8,9,7,5,2,9 +M,6,10,8,8,9,8,7,7,5,6,5,8,10,8,10,12 +G,4,8,6,6,4,7,7,7,6,6,6,9,2,8,4,8 +T,2,1,2,1,0,8,15,2,4,6,10,8,0,8,0,8 +E,3,7,3,5,2,3,7,6,10,7,6,14,0,8,7,8 +U,3,6,4,4,1,7,5,13,5,7,13,8,3,9,0,8 +J,3,7,4,5,2,8,6,2,6,14,5,9,0,7,0,7 +W,5,7,7,6,9,6,8,6,5,6,6,8,8,9,8,8 +S,3,4,4,6,2,8,7,6,9,4,6,7,0,8,9,8 +M,9,12,12,7,5,10,2,3,2,10,2,9,8,1,1,8 +Z,2,1,2,2,1,7,7,3,12,8,6,8,0,8,7,8 +V,3,8,6,6,1,7,8,4,3,7,14,8,3,9,0,8 +X,4,7,6,5,3,7,8,1,8,10,7,8,2,8,3,8 +Y,3,6,5,9,8,9,7,4,1,6,7,9,4,11,7,8 +Y,3,6,5,4,1,8,10,2,2,7,13,8,2,11,0,8 +H,6,8,9,10,9,7,4,4,2,6,4,6,8,6,11,7 +O,4,7,5,5,3,7,6,8,4,8,5,10,3,8,3,8 +C,6,10,7,7,4,5,7,6,8,11,9,14,2,9,4,5 +S,5,7,6,5,4,9,6,3,7,10,6,9,2,10,5,9 +Q,4,10,4,5,3,10,6,4,7,11,3,9,3,6,7,11 +V,4,6,4,4,2,3,12,5,4,11,12,7,3,10,1,8 +K,8,15,8,8,4,7,6,3,6,9,9,10,6,12,3,7 +G,6,11,7,8,6,6,7,7,5,8,7,11,5,7,6,6 +N,6,9,8,7,5,7,9,6,5,7,6,6,7,8,3,8 +C,3,4,4,3,2,4,8,4,7,10,10,13,1,9,2,7 +Q,6,8,6,10,6,8,6,7,4,9,6,10,4,9,7,6 +A,1,0,2,1,0,8,4,2,0,7,2,8,1,7,1,8 +U,4,5,5,4,2,4,8,5,7,11,10,9,3,9,2,6 +X,9,12,8,6,4,7,7,2,9,9,7,9,4,9,4,7 +I,1,4,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +O,3,8,4,6,3,8,7,8,6,7,5,9,3,8,3,7 +P,5,11,5,8,3,4,10,10,4,9,6,4,2,10,4,8 +L,4,10,5,7,7,7,7,3,5,7,7,10,6,10,6,6 +A,2,3,3,2,1,10,2,2,1,9,2,9,1,6,1,8 +D,1,0,1,0,0,6,7,6,5,7,6,6,2,8,2,8 +S,2,4,4,2,2,8,8,2,7,10,4,7,1,8,4,8 +U,5,9,7,6,6,8,8,8,5,6,7,9,3,8,4,5 +F,6,11,8,8,4,4,14,4,5,13,7,2,1,10,2,5 +Q,4,5,5,7,3,8,6,8,6,6,5,8,3,8,4,8 +E,3,7,3,5,2,3,8,6,10,7,6,14,0,8,7,8 +B,6,10,8,8,7,7,8,6,4,6,4,5,5,8,7,7 +B,1,0,2,1,1,7,7,7,5,6,6,7,1,8,7,9 +P,4,6,5,4,4,7,5,6,5,7,6,9,5,7,4,8 +B,1,0,1,0,1,7,7,6,4,7,6,7,1,8,6,9 +B,3,4,4,6,3,6,8,9,7,7,6,7,2,8,9,9 +Y,2,6,4,4,1,9,11,1,7,4,11,8,1,10,1,8 +Y,6,8,6,6,4,4,9,1,8,10,10,6,0,10,3,4 +R,5,10,6,7,3,5,11,9,4,7,4,8,3,7,6,11 +Y,6,7,8,9,8,10,10,5,3,6,7,8,6,11,8,4 +P,2,3,3,2,1,7,9,4,3,11,4,3,1,10,2,8 +G,6,10,8,7,5,6,6,6,6,6,6,8,4,7,4,8 +V,3,6,4,4,3,8,11,2,2,6,10,9,2,10,2,9 +K,4,5,7,3,4,6,8,1,7,10,7,10,3,8,3,7 +D,4,8,6,6,5,7,7,7,6,6,5,5,3,8,3,7 +Z,3,6,4,4,3,7,7,3,12,8,6,8,0,8,7,8 +N,9,10,8,6,3,5,8,5,7,3,3,11,6,10,3,7 +W,7,8,7,6,5,3,11,2,2,10,9,8,6,12,2,6 +V,7,8,9,7,10,8,7,4,5,7,6,8,7,10,8,5 +M,1,0,2,1,1,8,6,9,0,7,8,8,6,6,0,8 +S,4,9,5,6,3,9,9,6,10,5,5,5,0,7,9,7 +C,2,4,3,3,2,6,8,7,7,8,8,13,1,10,4,10 +K,2,4,3,2,2,5,7,4,7,7,7,11,3,9,5,10 +M,5,5,8,4,4,6,6,3,4,10,9,10,10,5,3,9 +L,6,9,5,5,2,7,4,3,5,10,4,12,2,7,6,7 +T,3,6,5,8,1,6,14,0,6,8,11,8,0,8,0,8 +N,8,11,11,8,5,6,9,3,5,10,8,8,6,8,1,7 +R,4,9,6,7,6,9,8,4,5,9,4,7,3,7,3,11 +G,6,10,7,8,9,8,6,4,4,6,5,9,7,7,8,13 +X,5,9,8,6,4,4,9,3,8,11,12,9,3,9,4,5 +O,4,7,6,5,6,8,7,5,2,7,6,8,8,9,4,7 +S,4,6,5,4,3,6,8,3,8,11,6,7,2,7,5,7 +R,4,10,5,8,5,5,10,8,3,7,4,9,2,7,5,11 +U,5,9,7,7,8,10,6,5,5,6,7,6,10,6,6,5 +J,2,5,3,7,1,13,2,9,4,14,4,12,1,6,0,8 +G,4,7,6,5,5,7,7,6,3,7,6,10,4,8,7,7 +E,2,3,4,1,2,6,8,2,7,11,7,8,1,8,3,7 +S,5,9,6,7,3,6,9,4,9,11,6,7,2,6,5,7 +W,3,3,4,1,2,5,11,3,2,9,8,7,5,11,1,6 +P,2,4,2,2,1,6,10,5,4,9,7,4,1,10,3,7 +G,2,3,4,2,2,7,6,6,5,6,6,9,2,9,4,9 +Q,2,4,3,5,3,8,7,6,3,8,6,9,2,9,4,9 +B,2,4,4,2,3,9,7,2,6,11,5,7,4,7,5,9 +B,4,10,6,8,6,9,7,3,5,10,4,6,2,8,5,9 +Q,1,1,2,1,1,8,7,6,4,6,6,8,2,8,3,8 +L,4,11,6,9,4,5,4,6,7,2,2,5,1,6,1,5 +G,4,9,5,7,4,5,6,6,5,9,7,12,2,8,4,10 +E,4,9,5,7,4,4,8,4,8,11,10,10,2,8,4,5 +E,6,9,8,7,5,9,7,2,10,11,4,9,2,8,5,9 +X,5,11,7,9,6,8,7,3,5,6,7,7,4,10,11,9 +Q,3,4,4,5,3,7,8,5,2,7,9,10,3,9,4,9 +N,10,13,8,7,4,7,10,4,7,3,4,9,5,7,2,7 +K,4,7,4,5,3,4,7,7,3,7,6,11,3,8,2,11 +O,3,3,4,5,2,8,7,9,7,7,5,9,3,8,4,8 +T,4,9,4,6,2,4,12,2,8,12,10,5,0,10,2,5 +P,1,3,3,2,1,7,9,3,4,12,5,4,1,9,2,9 +V,4,5,6,4,5,7,8,5,5,8,6,8,6,9,6,9 +E,4,5,5,7,3,3,7,6,11,7,7,15,0,8,7,7 +U,4,8,4,6,2,8,5,13,5,6,14,8,3,9,0,8 +Z,4,8,6,6,3,8,6,3,10,12,4,10,1,8,6,9 +D,7,10,9,8,8,7,8,6,6,8,7,6,7,8,3,7 +D,2,5,4,3,3,9,7,5,6,9,5,5,2,8,3,8 +N,5,7,6,6,7,7,8,5,3,7,5,7,8,7,5,7 +Q,1,2,2,3,2,8,7,6,3,5,6,9,2,9,3,9 +A,6,10,9,8,9,8,8,8,4,6,6,8,3,8,8,4 +J,2,8,3,6,3,7,7,1,6,11,5,9,1,6,1,6 +Z,5,8,7,10,6,11,5,3,5,9,2,7,2,7,6,9 +V,4,4,6,7,1,9,8,5,3,6,14,8,3,9,0,8 +S,3,5,5,4,2,9,7,3,8,11,3,6,1,9,4,10 +F,4,11,6,8,4,2,13,4,4,12,9,5,1,10,2,5 +D,4,7,6,5,4,8,7,4,7,11,5,7,3,7,4,8 +T,2,3,3,4,1,8,14,0,6,6,11,8,0,8,0,8 +K,2,3,4,2,2,6,8,1,6,10,6,8,3,8,2,7 +Y,3,3,5,4,1,7,11,2,2,7,12,8,1,11,0,8 +V,4,6,5,4,6,7,7,4,2,8,7,9,7,10,3,8 +X,3,8,5,6,3,7,8,4,9,6,6,7,3,9,7,7 +I,1,1,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +A,3,9,6,7,5,8,5,0,4,6,3,7,2,7,4,5 +Z,2,4,4,3,2,8,6,2,9,11,5,9,1,8,6,9 +J,2,4,3,3,1,9,5,4,6,14,6,12,0,7,0,8 +Q,5,11,7,8,7,8,4,7,4,5,7,11,6,6,8,8 +E,4,7,6,5,4,9,6,1,7,11,4,8,3,8,4,11 +F,2,3,3,1,1,6,11,3,5,13,6,4,1,9,1,7 +Q,4,7,4,9,4,8,8,6,3,8,9,11,3,9,6,7 +X,3,3,5,2,2,10,6,2,8,11,3,7,2,8,3,9 +F,3,6,3,4,2,1,13,3,3,12,10,6,0,8,2,7 +J,5,9,7,6,4,7,8,2,6,14,5,7,1,8,1,7 +F,3,3,4,4,1,1,15,5,3,12,9,4,0,8,2,6 +P,4,8,6,6,5,4,11,4,5,11,9,5,0,10,3,7 +L,4,9,4,6,1,0,0,6,6,0,1,5,0,8,0,8 +R,4,6,6,4,6,8,6,7,3,7,5,7,4,7,7,7 +G,8,14,7,8,4,8,4,5,3,8,4,5,4,7,5,8 +E,4,7,5,5,3,7,7,2,9,11,6,9,2,8,5,8 +C,2,1,3,2,1,6,8,7,7,8,8,13,1,9,4,10 +U,4,10,6,7,9,9,6,4,3,6,7,7,9,8,5,6 +N,6,9,8,4,3,8,7,3,4,13,5,8,6,8,0,8 +V,6,9,8,8,10,7,7,5,4,7,6,8,7,9,7,10 +I,5,6,6,4,3,7,6,2,7,7,6,9,0,9,4,8 +N,5,9,7,6,4,9,7,3,5,10,4,6,5,8,1,7 +H,5,8,8,6,6,5,8,3,6,10,8,8,4,8,4,6 +E,0,0,1,0,0,5,7,5,6,7,6,12,0,8,6,10 +Y,1,0,2,0,0,7,10,3,1,7,12,8,1,11,0,8 +G,5,9,7,7,5,6,7,7,5,5,6,11,4,8,4,8 +E,2,4,4,3,2,7,8,2,8,11,7,9,2,8,4,8 +N,5,4,5,6,2,7,7,15,2,4,6,8,6,8,0,8 +B,1,3,2,1,1,8,7,3,4,10,5,7,1,8,3,9 +G,4,7,5,5,3,7,6,7,7,7,5,11,2,9,4,8 +L,4,9,4,6,2,0,2,4,6,1,0,7,0,8,0,8 +E,4,7,6,5,5,8,9,7,3,6,6,11,4,7,7,10 +G,6,8,8,7,9,7,6,6,4,7,7,9,10,8,9,9 +M,4,10,6,8,6,7,6,6,5,7,7,9,8,5,2,8 +D,2,4,4,3,3,9,7,4,6,10,4,6,2,8,3,8 +Y,6,7,6,5,2,3,12,5,5,13,12,6,2,11,2,6 +R,5,5,5,6,3,5,12,8,3,7,2,9,3,7,6,11 +P,4,7,6,10,9,8,11,5,0,9,7,6,4,10,5,8 +D,3,9,5,7,5,8,7,5,7,7,6,5,3,8,3,7 +E,4,9,4,7,3,3,6,6,12,7,7,15,0,8,7,7 +W,4,5,6,4,3,7,11,2,3,7,9,8,7,11,1,8 +D,4,2,5,4,3,7,7,7,7,6,6,5,2,8,3,7 +Q,8,13,7,7,4,7,5,4,8,10,5,9,3,7,9,9 +R,4,7,5,5,5,7,8,5,6,6,4,8,3,6,5,9 +G,4,6,4,4,3,6,7,5,5,9,7,10,2,9,4,10 +Y,3,7,4,5,2,8,10,2,2,6,12,8,2,11,0,8 +R,5,8,7,6,7,7,10,3,5,5,6,9,6,7,7,7 +D,2,0,2,1,1,6,7,8,6,7,6,6,2,8,3,8 +J,4,11,5,8,5,9,6,2,5,11,4,9,1,6,2,5 +C,4,7,5,5,3,6,7,6,8,5,6,13,1,6,5,9 +I,3,7,4,5,1,6,8,1,8,14,7,8,0,8,1,7 +T,6,10,8,8,6,6,7,7,8,7,6,8,5,11,8,8 +C,1,0,1,0,0,7,7,5,7,7,6,14,0,8,4,10 +N,3,4,5,3,2,7,8,2,5,10,6,6,5,9,0,7 +M,5,5,6,4,4,8,6,6,5,6,7,8,10,6,4,6 +B,2,3,2,2,2,7,8,5,5,7,5,6,2,8,5,9 +H,3,7,5,5,4,7,7,5,6,7,6,9,6,8,3,7 +R,4,7,4,5,2,6,10,9,4,7,5,8,2,8,5,10 +Q,6,9,9,8,7,7,4,4,4,7,4,9,5,4,7,7 +A,3,6,5,4,1,9,4,3,1,7,1,8,3,6,2,8 +G,3,8,4,6,3,8,8,7,5,6,7,8,2,7,5,11 +Q,5,12,5,7,4,11,4,4,6,12,3,9,3,8,7,12 +H,3,3,4,4,2,7,8,14,1,7,5,8,3,8,0,8 +K,4,11,4,8,2,4,8,8,2,6,3,11,4,8,2,11 +G,4,10,5,8,3,7,5,8,9,8,4,13,1,9,5,10 +A,4,6,5,4,5,7,6,7,4,7,6,9,2,9,8,4 +A,4,9,6,7,4,10,3,2,2,8,2,10,5,5,3,8 +J,3,11,4,8,3,14,4,4,5,13,1,8,0,7,0,8 +K,4,6,5,4,5,6,5,4,4,6,6,9,3,6,7,11 +W,5,7,5,5,5,4,10,2,3,9,8,8,6,11,2,6 +N,2,1,2,3,2,7,8,5,4,7,6,7,4,8,1,6 +H,4,7,4,4,2,7,5,14,1,7,8,8,3,8,0,8 +L,5,10,4,5,2,9,3,4,4,12,4,13,2,6,6,9 +B,6,9,6,4,5,8,8,4,4,9,6,7,6,7,8,6 +E,5,11,5,8,3,3,8,6,11,7,6,15,0,8,7,7 +Y,5,8,5,6,3,5,9,1,7,9,9,5,1,11,3,5 +J,3,9,5,7,2,8,6,3,6,15,5,9,1,6,1,6 +N,1,0,1,0,0,7,7,10,0,6,6,8,4,8,0,8 +L,6,8,7,7,6,8,7,4,6,7,6,8,3,8,8,11 +S,3,6,5,4,6,6,9,3,3,8,7,6,3,8,9,1 +Q,5,9,6,8,6,8,7,7,5,6,7,8,3,8,4,9 +D,5,11,5,6,4,10,5,3,5,10,4,7,5,8,7,7 +E,6,10,8,8,5,5,9,2,10,10,8,9,3,8,5,5 +L,2,7,4,5,2,7,4,2,7,7,2,8,1,6,2,8 +G,6,10,7,8,5,6,6,6,5,9,6,12,4,8,5,8 +P,4,6,4,8,3,5,9,11,5,8,6,5,2,10,4,8 +K,3,6,4,4,2,3,7,6,3,7,6,11,3,8,3,11 +W,3,2,4,3,3,6,11,2,2,7,9,9,6,11,1,8 +O,3,9,5,6,4,8,8,8,4,7,8,8,3,8,3,8 +W,4,7,7,5,4,4,10,3,3,9,10,9,8,11,1,8 +A,4,9,3,4,2,11,5,4,1,8,4,9,4,6,4,9 +H,2,6,3,4,1,7,7,14,1,7,6,8,3,8,0,8 +T,2,8,4,6,3,7,12,3,6,7,11,8,2,12,1,8 +I,1,1,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +F,3,8,5,6,3,4,11,6,5,11,10,5,2,9,2,5 +I,1,9,1,6,2,7,7,0,7,7,6,8,0,8,3,8 +D,1,3,3,2,1,9,7,4,5,10,4,5,2,8,2,8 +T,5,6,5,4,3,5,10,1,8,11,9,5,1,9,3,4 +P,4,8,6,6,6,6,7,6,4,8,6,8,5,8,6,10 +Z,5,11,6,8,6,7,8,5,9,7,7,9,1,9,7,7 +I,0,4,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +D,4,9,6,7,6,9,7,4,6,10,5,5,3,8,3,8 +F,3,5,5,3,2,5,12,3,5,13,7,4,1,10,1,6 +G,5,7,6,5,3,8,6,6,7,11,6,12,2,10,4,8 +T,6,14,6,8,4,9,7,3,7,11,4,6,2,8,6,6 +C,5,9,6,6,3,4,8,6,8,12,10,12,2,9,3,7 +B,2,1,3,2,2,7,7,5,5,7,6,6,2,8,5,9 +H,2,6,4,4,5,9,6,3,3,6,6,7,5,9,6,7 +N,10,14,9,8,4,8,10,5,5,4,5,10,6,10,3,7 +E,1,3,3,2,1,6,7,2,7,10,7,9,2,8,4,9 +R,5,11,8,8,5,10,7,3,7,11,2,6,3,7,4,10 +U,5,7,6,5,5,8,7,8,5,6,7,9,3,8,4,6 +L,1,3,2,2,1,5,4,4,6,3,3,5,1,7,1,6 +P,3,8,3,6,3,5,9,8,3,9,6,5,2,10,3,8 +C,4,8,4,6,3,6,8,6,7,12,8,12,2,10,3,8 +N,3,2,4,3,2,7,8,5,4,8,7,7,5,8,3,6 +F,2,4,4,2,2,6,10,3,5,13,6,5,1,9,1,7 +I,0,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +Z,3,7,4,5,2,7,7,3,12,8,6,8,0,8,7,8 +F,3,4,4,6,2,1,12,5,6,12,11,9,0,8,2,6 +D,3,8,4,6,2,6,7,10,8,6,6,6,3,8,4,8 +G,3,7,4,5,3,7,7,7,6,6,6,9,1,8,5,11 +B,3,7,4,5,4,7,7,8,5,7,6,7,2,8,7,9 +S,4,11,4,8,4,8,6,7,7,7,8,9,2,10,10,7 +T,6,10,5,7,3,6,11,1,9,11,9,4,0,10,3,4 +Q,4,9,5,8,3,9,8,8,5,5,8,9,3,7,5,10 +V,3,10,5,8,2,8,8,4,3,6,14,8,3,9,0,8 +E,4,8,5,6,5,6,8,7,9,6,4,10,3,8,6,8 +A,6,7,8,6,6,7,7,3,6,7,8,9,5,10,3,6 +W,2,0,3,1,1,7,8,4,0,7,8,8,7,9,0,8 +K,7,11,9,8,9,8,7,5,5,7,6,7,7,6,9,14 +Y,4,7,6,9,7,9,10,7,4,7,7,6,5,11,6,3 +K,5,8,7,6,8,6,9,4,5,6,5,9,8,7,7,10 +L,5,10,5,5,2,7,4,3,6,11,4,13,2,6,6,8 +Q,2,0,2,1,1,8,7,6,4,6,6,8,2,8,3,8 +B,4,4,4,7,4,6,8,9,7,7,6,7,2,8,9,10 +S,4,7,5,5,3,8,8,3,7,10,3,6,2,6,5,9 +F,2,2,3,4,2,6,9,3,5,10,9,5,4,10,3,8 +S,3,7,4,5,3,8,7,7,7,7,7,8,2,9,9,8 +Q,6,9,7,11,7,9,5,7,4,9,5,11,4,8,6,6 +L,2,1,2,2,1,4,4,4,7,2,1,6,0,7,1,6 +T,5,10,7,8,4,5,12,3,8,8,12,8,1,12,1,7 +P,6,10,8,8,5,7,10,5,4,12,5,3,1,10,3,8 +A,2,6,4,4,2,8,3,2,2,7,1,8,2,7,3,7 +K,3,5,5,4,3,5,7,1,7,10,8,11,3,8,3,8 +F,2,3,3,2,1,6,10,3,5,13,6,4,1,9,1,8 +D,2,3,3,2,2,7,7,6,6,6,6,4,2,8,3,7 +Q,4,4,6,6,6,9,10,5,0,5,7,10,6,13,4,10 +L,3,6,4,4,2,4,3,7,6,1,2,4,1,6,1,6 +G,6,11,7,8,6,8,7,7,6,6,5,9,2,7,5,11 +C,5,9,7,7,5,7,7,8,6,7,6,13,6,8,5,7 +N,5,9,7,7,4,7,9,6,5,7,7,7,6,8,2,7 +K,5,7,7,5,5,7,6,1,6,10,5,9,3,7,3,9 +I,0,8,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +P,5,10,7,7,6,7,10,5,3,11,5,3,1,10,3,8 +R,3,3,3,4,2,6,9,9,4,7,5,7,3,7,5,11 +O,6,10,6,7,4,9,6,8,6,9,4,7,3,8,4,8 +X,2,3,3,1,1,6,8,2,8,10,8,9,2,8,2,7 +V,4,10,6,8,3,8,12,3,4,5,11,9,3,10,1,7 +H,6,11,8,8,8,7,8,6,8,8,6,8,9,7,4,8 +A,3,5,6,4,2,10,2,2,2,8,2,9,4,6,2,9 +R,2,4,4,3,2,9,7,3,5,10,4,6,2,7,3,9 +Y,4,11,6,8,3,6,10,1,7,7,12,9,1,11,2,8 +K,3,6,5,4,5,6,7,4,4,7,6,8,4,6,8,13 +S,9,14,9,8,4,7,6,4,3,13,9,9,3,10,3,9 +X,5,10,7,8,4,9,6,1,8,10,3,7,3,8,4,8 +E,4,11,5,8,7,5,7,6,8,6,5,11,3,8,5,9 +T,3,4,4,3,1,5,13,3,6,11,9,4,1,11,1,5 +D,3,6,5,4,3,9,7,4,5,11,5,6,3,8,2,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +I,2,9,2,7,2,7,7,0,8,7,6,9,0,8,3,8 +W,4,2,6,4,4,5,11,3,2,8,9,9,10,13,1,8 +X,1,1,2,2,1,8,7,3,8,6,6,8,2,8,6,8 +B,4,8,6,6,6,9,6,4,6,10,4,7,3,8,5,10 +I,4,9,6,6,3,9,8,2,8,7,6,6,0,8,4,7 +H,2,3,3,2,2,7,7,5,5,7,6,8,3,8,2,8 +F,4,6,6,4,3,6,11,4,5,12,7,5,2,9,2,6 +S,4,4,5,6,3,8,6,5,9,5,6,8,0,8,9,8 +J,4,8,5,6,2,10,6,2,8,14,3,8,0,7,0,8 +M,8,11,11,8,7,12,5,3,6,10,2,6,10,9,2,9 +N,5,6,7,4,6,5,9,3,4,8,7,9,6,8,4,4 +A,4,9,7,7,4,9,3,2,3,6,1,7,2,6,2,7 +R,2,4,4,3,2,9,8,3,5,10,3,6,2,6,3,10 +J,3,6,5,4,2,7,9,1,6,14,5,6,0,7,0,7 +S,5,10,8,8,10,7,6,3,2,7,5,7,3,8,15,5 +N,3,5,3,4,2,7,9,5,4,7,6,7,5,8,2,7 +K,4,4,4,5,2,3,7,8,2,7,5,11,4,8,2,11 +P,4,7,6,5,3,8,10,3,6,13,4,2,1,10,3,9 +J,5,9,4,6,3,9,8,2,3,12,4,5,2,9,6,9 +N,2,7,3,5,3,7,7,11,1,6,6,8,5,8,0,8 +W,8,11,8,9,8,4,11,2,2,9,8,7,7,12,2,6 +W,1,0,2,1,1,7,8,4,0,7,8,8,5,10,0,8 +G,6,11,8,8,5,6,6,6,7,6,6,8,3,8,4,7 +G,3,4,4,6,2,7,6,8,7,6,6,9,2,7,5,11 +V,6,7,6,5,2,3,11,4,4,10,12,7,2,10,1,7 +N,4,9,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +E,3,7,5,6,5,7,6,5,3,7,6,10,5,10,6,11 +P,4,10,6,8,6,6,10,5,5,10,8,3,1,10,4,6 +H,3,4,5,6,5,8,11,4,2,8,7,6,4,11,8,4 +J,1,3,2,1,0,9,7,2,6,14,5,9,0,7,0,7 +X,2,6,4,4,3,8,8,2,5,7,5,7,3,8,5,7 +L,5,10,5,8,2,0,0,6,6,0,1,5,0,8,0,8 +G,3,5,4,3,2,6,6,6,5,8,7,11,2,8,4,10 +V,3,5,6,4,2,7,12,2,3,6,11,9,4,12,2,7 +Q,3,8,5,7,4,8,7,7,5,6,6,9,3,8,4,10 +Z,3,7,4,5,3,7,7,3,12,8,6,8,0,8,8,7 +D,8,13,7,7,6,9,6,4,6,10,4,7,6,7,9,7 +H,3,7,3,5,3,8,6,12,2,7,8,8,3,9,0,8 +K,3,3,3,4,1,3,6,7,2,7,6,11,3,8,2,11 +T,3,7,4,5,2,4,13,4,6,12,9,4,1,11,1,5 +U,7,8,8,6,3,2,10,6,7,12,12,9,3,9,1,7 +Q,7,15,6,8,5,11,5,4,6,11,4,7,3,9,7,13 +W,6,10,10,8,8,7,11,2,2,6,8,8,8,12,1,8 +E,4,7,6,5,4,7,7,3,8,11,7,9,2,9,5,8 +R,3,6,3,4,2,5,11,7,4,7,3,9,2,7,6,11 +F,3,7,5,5,2,3,12,4,4,13,9,5,1,10,2,6 +K,5,9,7,7,5,6,7,5,7,6,6,10,4,8,5,9 +H,4,8,5,6,4,7,7,13,1,7,6,8,3,8,0,8 +H,4,7,7,5,5,5,9,3,5,10,9,8,3,8,3,5 +W,3,4,4,2,2,5,11,2,2,9,8,7,6,11,1,6 +L,4,8,6,6,7,7,7,3,5,7,7,10,6,10,6,6 +S,8,14,8,8,4,8,6,4,4,13,7,8,3,10,4,8 +R,4,9,6,6,5,9,7,6,3,8,5,6,4,7,7,9 +F,5,10,6,8,4,4,11,4,6,11,10,5,2,10,2,5 +U,8,9,9,7,5,3,9,5,8,10,10,10,3,9,2,6 +X,4,6,6,4,3,7,7,1,8,10,7,9,2,8,3,7 +P,2,1,2,1,1,5,11,8,1,9,5,4,1,9,3,8 +K,3,6,4,4,3,6,7,4,7,6,6,10,3,8,5,9 +U,3,5,4,4,2,6,8,6,7,7,10,9,3,9,1,8 +P,3,6,5,4,3,5,11,4,5,11,8,3,1,10,4,7 +K,7,10,10,8,7,4,7,2,7,10,10,11,3,8,3,6 +W,4,6,6,4,4,10,11,3,2,5,9,7,6,11,1,8 +W,5,10,7,8,6,8,8,4,1,7,9,8,8,11,0,8 +M,2,0,3,1,1,8,6,10,0,7,9,8,7,6,0,8 +U,4,8,5,6,2,7,4,14,5,7,14,8,3,9,0,8 +M,4,6,6,4,5,6,6,3,4,10,8,9,7,5,2,7 +J,5,8,6,6,3,7,6,3,6,15,6,10,1,6,0,7 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +C,7,10,9,8,6,6,8,8,6,5,6,13,6,8,5,6 +U,4,7,6,6,6,7,6,4,4,6,6,8,7,7,1,7 +P,6,10,6,5,4,7,10,4,3,12,5,3,4,11,5,7 +B,4,10,6,8,7,7,8,5,5,9,7,6,4,8,7,8 +N,6,9,8,7,7,6,7,8,6,7,5,6,3,8,3,8 +U,5,10,7,8,5,5,9,6,8,8,10,9,3,9,1,8 +Z,4,8,5,6,4,8,6,2,9,11,5,9,1,8,5,9 +H,7,8,10,10,9,6,4,5,3,6,3,6,6,5,11,7 +A,2,8,4,6,2,7,6,3,1,6,0,8,2,7,1,7 +Q,6,6,8,9,9,9,11,4,1,5,8,11,6,14,7,13 +W,9,12,9,6,5,2,10,3,3,10,11,9,7,10,1,6 +B,4,6,5,4,4,9,7,3,6,9,5,6,2,8,5,8 +B,8,12,6,6,4,10,5,5,5,11,3,9,6,7,6,10 +W,4,3,5,2,2,4,11,3,2,10,9,7,6,11,1,7 +A,4,5,6,4,5,7,8,3,5,7,8,9,7,10,3,7 +X,1,3,2,1,1,7,7,3,7,6,6,9,2,8,5,8 +W,2,3,3,2,2,9,10,3,2,5,9,7,5,11,0,7 +O,10,14,6,8,4,6,6,7,4,10,6,10,5,9,5,8 +V,5,6,5,4,2,2,12,5,4,12,11,7,2,10,1,7 +V,3,7,5,5,1,9,8,4,2,6,14,8,3,10,0,8 +U,3,7,4,5,2,7,5,12,4,6,12,8,3,9,0,8 +G,3,5,4,4,2,6,7,6,6,10,7,10,2,9,4,9 +O,4,5,5,4,4,7,6,5,5,9,5,10,4,6,5,6 +A,2,7,4,4,1,7,6,3,1,6,0,8,2,6,1,8 +Z,8,7,6,11,5,4,13,4,2,12,8,5,2,8,8,6 +I,7,10,9,8,5,9,5,3,7,6,7,4,0,9,4,7 +Y,8,11,8,8,5,3,10,2,7,11,11,6,1,11,3,4 +L,4,9,4,4,3,8,5,3,5,11,5,10,3,5,6,8 +G,3,6,4,4,2,6,7,5,5,5,7,8,2,8,4,8 +R,7,10,7,5,5,6,8,3,4,7,4,10,6,8,6,7 +V,4,9,6,7,4,5,11,3,2,9,10,7,4,10,6,8 +Y,4,8,6,6,3,7,9,1,7,6,12,9,2,11,2,8 +L,3,7,4,5,3,4,4,4,8,2,1,7,4,6,1,6 +P,3,8,3,6,2,5,9,10,5,8,6,5,2,9,4,8 +L,2,1,2,2,1,4,4,5,6,2,2,6,1,7,1,6 +I,4,7,6,5,3,8,8,2,8,7,6,7,0,8,4,7 +O,5,8,5,6,5,8,7,7,4,9,5,8,3,8,3,8 +O,1,3,2,2,1,8,6,6,3,9,5,7,2,8,2,7 +K,4,8,4,5,2,4,7,8,2,7,6,11,4,8,2,11 +Z,6,11,8,8,5,6,9,3,11,11,9,6,2,8,6,5 +Q,7,10,9,8,8,8,5,8,4,6,7,8,4,6,7,8 +D,3,9,5,7,8,9,8,5,4,7,6,6,4,7,8,6 +M,7,10,10,8,6,5,7,3,5,10,10,10,8,5,3,7 +J,2,11,3,8,3,7,7,1,6,11,5,9,1,6,2,5 +N,3,7,5,5,3,6,9,3,4,10,8,8,5,8,1,7 +A,4,11,6,8,3,5,4,3,3,5,1,7,3,6,3,7 +H,5,8,7,6,6,7,7,5,5,7,6,8,9,7,5,10 +K,5,7,7,6,6,6,7,3,4,6,4,9,6,5,9,8 +E,5,7,7,5,5,8,6,1,8,11,4,9,3,8,5,10 +G,2,4,4,3,2,7,7,6,6,6,6,10,2,9,4,9 +K,3,5,4,4,3,5,7,4,7,7,6,11,3,8,5,10 +E,4,9,4,7,4,3,8,5,9,7,6,14,0,8,6,9 +Y,4,6,6,9,9,8,4,5,3,7,8,8,7,8,5,8 +D,4,8,5,6,7,9,8,4,5,7,6,6,4,7,7,4 +L,2,2,3,3,1,4,3,5,6,2,2,5,1,7,0,6 +W,6,9,6,6,5,4,10,2,3,9,8,7,7,11,2,6 +J,2,2,3,4,2,10,6,2,5,12,4,8,1,6,1,6 +T,2,3,3,2,1,7,12,3,6,7,11,8,1,11,1,8 +Y,3,7,6,5,2,9,10,2,7,3,12,8,2,11,2,9 +F,3,5,5,4,2,4,12,4,4,13,8,5,1,10,1,7 +X,4,7,5,5,1,7,7,6,2,7,6,8,3,8,4,8 +J,0,0,1,0,0,12,4,5,3,12,5,11,0,7,0,8 +T,7,9,7,7,5,6,11,4,6,11,9,4,2,12,2,4 +Q,2,2,3,3,2,8,7,6,2,6,6,9,2,9,3,10 +J,2,4,3,3,1,10,6,2,6,12,3,8,0,7,0,7 +L,1,0,1,1,0,1,1,5,5,0,1,6,0,8,0,8 +N,3,7,4,5,3,7,8,5,4,7,6,6,5,9,1,6 +H,4,5,7,4,4,6,7,3,7,11,9,9,5,8,5,6 +Z,3,6,5,4,3,8,7,2,10,11,5,9,1,8,6,9 +Q,2,1,3,2,1,8,7,7,5,6,6,8,3,8,4,8 +N,4,10,6,7,5,7,8,10,5,8,5,5,4,8,4,10 +U,6,7,6,5,3,4,8,6,8,10,10,9,3,9,2,5 +L,8,11,7,6,3,11,1,3,4,12,3,11,2,9,4,10 +G,4,6,5,4,5,9,9,5,2,6,7,8,6,9,4,9 +P,5,9,7,7,7,5,9,6,4,8,7,9,5,9,7,10 +Q,4,6,6,9,3,8,9,7,6,6,9,9,4,7,6,10 +L,4,8,6,6,3,7,4,1,8,8,2,10,0,6,3,8 +R,4,7,4,5,4,5,10,7,3,7,4,9,2,7,5,11 +O,4,7,6,5,4,7,6,8,5,7,4,8,3,8,3,8 +M,3,7,5,5,5,8,7,5,4,6,7,8,7,6,2,7 +F,1,0,1,0,0,3,12,4,3,11,9,6,0,8,2,8 +M,6,8,8,6,8,7,8,7,5,6,6,8,7,9,8,11 +Q,4,9,4,4,3,11,4,4,5,12,3,9,3,8,7,13 +E,5,11,6,8,7,6,7,5,8,7,6,10,3,8,6,9 +Q,4,5,5,8,7,9,7,5,0,6,6,10,7,10,4,9 +G,2,4,3,2,2,6,7,5,5,9,7,10,2,8,4,10 +L,5,9,6,6,4,4,5,2,8,6,2,10,0,7,3,6 +H,8,10,11,8,9,8,7,2,6,10,5,8,3,8,3,8 +A,2,2,4,3,2,8,3,2,3,8,1,8,2,6,2,7 +D,3,1,4,2,2,7,7,6,6,7,6,5,2,8,3,7 +S,4,6,6,4,7,7,7,3,2,8,6,7,2,8,12,3 +U,2,3,3,2,1,5,8,5,6,10,9,8,3,9,2,6 +B,10,13,7,8,5,10,5,5,6,11,3,9,6,7,7,11 +J,4,11,6,8,4,10,5,4,5,14,4,10,0,7,1,6 +X,7,10,10,8,6,4,8,2,8,10,11,10,3,9,3,5 +G,2,2,4,4,2,7,6,6,5,6,6,9,2,9,4,9 +Z,4,11,6,8,4,7,8,2,10,11,8,6,2,7,6,6 +D,5,9,7,7,6,7,7,5,6,7,6,8,7,7,3,7 +M,2,0,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +Q,4,5,4,6,4,8,6,7,4,9,8,9,3,9,6,8 +V,4,11,6,8,3,7,9,4,2,7,13,8,2,10,0,8 +P,4,8,5,6,3,8,8,1,6,13,5,5,1,10,2,9 +X,5,10,6,8,4,7,7,4,4,7,6,8,3,8,4,8 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +I,7,12,5,6,3,11,4,5,5,13,3,8,3,7,4,9 +L,4,3,4,5,1,1,0,6,6,0,1,4,0,8,0,8 +N,3,6,4,4,2,7,7,14,2,5,6,8,6,8,0,8 +H,5,6,7,4,5,9,6,3,6,10,4,7,3,8,3,9 +R,4,7,6,5,5,8,9,6,5,8,5,8,4,7,5,11 +G,5,12,4,6,4,7,6,4,2,8,6,8,4,9,9,7 +A,4,11,6,8,4,7,5,3,0,6,1,8,2,7,1,8 +O,5,10,6,8,5,7,7,9,4,7,6,9,3,8,4,6 +S,6,12,5,6,3,8,3,2,5,8,1,7,3,7,5,8 +O,5,9,7,7,5,8,6,8,4,6,4,7,3,9,4,9 +R,5,9,5,7,5,6,8,8,4,6,5,7,3,8,6,13 +B,4,11,4,8,6,6,6,9,6,7,7,7,2,9,7,10 +K,5,9,8,7,9,8,6,3,5,6,6,8,8,6,9,5 +S,4,7,4,5,2,7,6,5,9,5,6,9,0,9,9,8 +O,3,8,4,6,3,8,8,7,5,7,6,9,2,8,3,8 +I,1,10,0,8,1,7,7,5,3,7,6,8,0,8,0,8 +K,4,9,6,8,7,8,5,2,3,8,4,8,5,6,7,11 +O,3,7,4,5,2,7,9,9,7,8,8,7,3,8,4,8 +E,3,6,5,6,5,6,9,4,4,7,7,11,4,9,7,10 +E,5,11,7,9,6,5,7,7,9,7,6,12,3,8,6,8 +A,5,11,8,8,4,10,2,2,3,9,1,8,3,7,4,8 +Q,6,11,6,6,4,10,5,4,6,10,4,8,3,9,7,12 +A,4,10,6,8,5,12,3,2,2,9,2,8,2,6,2,8 +P,4,9,6,7,4,7,10,4,4,12,5,3,1,10,3,8 +N,4,6,5,4,3,7,8,6,5,7,6,6,5,9,1,6 +K,3,4,5,3,2,4,9,2,7,10,9,11,3,8,3,6 +X,6,11,9,9,6,7,7,0,8,9,6,8,3,8,3,7 +C,4,9,6,8,6,6,7,4,4,7,6,10,5,9,9,11 +D,4,7,6,5,5,8,8,6,5,9,5,4,5,8,5,9 +D,2,4,4,2,2,9,6,3,6,11,4,6,2,8,3,8 +A,5,11,7,8,7,8,7,7,4,7,6,9,3,8,8,3 +E,5,11,7,8,8,8,5,7,3,8,6,11,5,8,8,10 +H,3,5,5,7,5,9,10,3,1,8,6,7,3,10,8,7 +H,3,7,4,5,4,8,7,5,6,7,6,9,3,8,3,8 +S,1,3,2,2,1,8,6,6,5,7,7,9,2,10,8,7 +V,5,10,5,5,3,6,9,4,3,9,7,5,5,12,2,8 +Y,8,10,8,7,5,2,11,2,7,12,12,7,0,10,1,5 +E,1,3,2,1,1,5,8,2,7,10,8,9,1,8,3,7 +Y,1,0,1,0,0,7,10,2,2,7,12,8,1,11,0,8 +Y,1,0,2,0,0,7,10,1,3,7,12,8,1,11,0,8 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +T,3,9,5,6,1,7,15,1,6,7,11,8,0,8,0,8 +Q,1,0,1,1,0,8,7,6,3,6,6,9,2,8,2,8 +A,2,4,4,6,2,7,3,3,3,7,1,8,3,6,3,8 +U,4,7,4,5,3,7,5,13,4,7,11,8,3,9,0,8 +S,2,6,3,4,3,8,8,7,6,7,4,6,2,6,8,8 +U,4,6,5,4,3,6,8,6,8,7,10,9,3,9,1,8 +C,3,6,4,4,1,6,7,6,10,7,6,13,1,8,4,9 +X,4,11,6,8,4,7,8,3,9,6,5,6,4,10,8,6 +Z,4,6,5,4,3,8,6,2,10,12,5,10,1,9,6,9 +D,3,4,5,3,3,8,7,4,6,9,5,6,2,8,3,8 +G,2,0,2,1,1,8,6,6,5,6,5,9,1,8,5,10 +D,2,4,4,3,2,9,6,4,6,11,4,6,2,8,3,8 +A,3,4,5,3,2,10,2,2,2,9,2,9,2,6,2,8 +U,4,7,5,5,4,9,7,7,5,7,6,8,3,8,4,6 +O,6,10,7,8,6,7,7,8,4,7,6,8,3,8,3,8 +C,5,8,6,6,6,5,6,3,5,8,6,12,6,9,4,9 +B,2,4,4,3,3,8,7,3,6,10,5,6,2,8,4,10 +K,6,12,6,6,4,7,7,3,6,10,3,8,5,5,3,8 +J,5,10,6,7,7,9,6,3,4,7,5,5,5,6,6,5 +Z,4,8,4,6,4,9,7,5,9,7,5,6,1,7,7,8 +W,4,5,6,7,4,7,8,5,2,6,8,8,8,9,0,8 +J,2,8,3,6,2,10,6,1,7,11,3,7,0,7,1,7 +X,5,10,7,8,6,8,5,3,5,6,7,7,3,10,9,9 +E,2,6,3,4,2,3,8,5,9,7,6,14,0,8,6,9 +H,5,11,6,8,3,7,5,15,2,7,9,8,3,8,0,8 +M,4,1,5,3,3,9,6,6,4,6,7,5,8,6,2,6 +R,4,8,6,6,8,7,7,3,5,7,6,8,6,9,7,5 +D,3,6,4,4,3,7,7,6,5,7,7,6,3,8,3,7 +U,4,7,6,5,7,8,7,4,3,6,7,8,7,9,5,7 +N,3,7,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +X,5,5,6,7,2,7,7,5,4,7,6,8,3,8,4,8 +S,2,3,4,2,1,9,7,3,7,11,4,8,1,8,4,10 +H,4,8,6,6,6,7,7,5,6,7,6,8,3,8,3,7 +P,3,6,5,4,4,6,9,5,4,9,7,4,1,10,3,7 +G,1,3,2,1,1,7,7,4,4,9,7,10,2,8,4,10 +J,4,8,3,6,2,9,6,2,4,11,6,8,2,10,6,11 +J,1,7,2,5,1,14,2,6,5,13,1,10,0,7,0,8 +C,4,8,6,6,5,6,6,3,4,8,6,11,6,9,3,9 +R,3,5,5,4,5,7,8,3,3,7,5,8,6,8,5,7 +Y,6,9,8,6,7,8,4,6,5,8,7,8,8,9,4,6 +K,5,10,8,7,5,3,8,2,7,10,11,12,4,7,4,5 +N,3,9,4,6,2,7,7,14,2,5,6,8,5,8,0,8 +Z,4,6,6,4,4,9,10,5,5,6,5,7,3,8,6,5 +P,2,3,2,2,1,4,11,3,4,10,8,4,0,9,3,6 +L,5,7,6,5,5,7,8,7,6,6,5,8,6,7,4,10 +Z,4,8,6,6,4,7,8,2,9,11,6,8,1,8,6,8 +X,3,5,4,3,2,8,7,3,9,6,7,9,3,7,7,9 +Z,4,4,5,6,2,7,7,4,14,9,6,8,0,8,8,8 +W,3,3,4,5,3,10,8,4,1,6,8,8,7,10,0,8 +P,5,10,8,8,6,8,10,4,5,13,5,3,1,10,3,8 +D,1,0,2,1,1,6,7,8,6,7,6,6,2,8,3,8 +K,3,5,5,4,3,8,7,2,7,10,4,9,5,10,4,9 +L,2,5,4,4,2,7,4,1,8,8,2,10,0,7,2,8 +K,4,7,6,5,3,8,6,2,7,10,3,9,3,8,4,10 +C,1,0,1,1,0,6,7,6,8,7,6,14,0,8,4,10 +Z,2,5,3,3,2,7,8,5,9,6,6,9,2,8,7,8 +Y,4,7,6,5,2,5,10,2,8,10,12,8,1,11,2,7 +E,2,5,4,3,2,7,7,1,8,10,6,9,2,8,4,8 +I,6,14,5,8,3,7,9,2,6,14,5,6,1,8,5,8 +A,2,7,4,5,2,10,3,2,2,9,2,9,2,6,2,8 +M,6,10,8,7,9,7,10,6,4,7,7,9,8,10,7,11 +A,3,11,6,8,3,11,2,3,3,10,1,9,3,7,3,8 +V,7,10,9,8,5,6,11,3,3,7,11,8,3,10,4,8 +P,3,8,4,6,4,6,9,6,4,9,7,4,2,10,3,7 +N,8,12,9,7,4,8,6,2,4,13,5,8,6,8,0,7 +S,5,10,6,8,4,8,7,5,8,11,3,8,2,7,5,9 +Z,4,9,6,7,5,9,11,6,5,6,5,7,3,9,8,5 +Q,5,10,6,9,5,8,8,7,4,5,8,9,3,8,5,10 +U,4,9,5,7,2,8,5,13,5,6,14,8,3,9,0,8 +M,4,5,7,4,4,8,7,2,4,9,6,8,7,5,2,7 +D,4,4,5,6,3,5,7,10,9,6,6,5,3,8,4,8 +Z,1,1,2,3,1,7,8,5,8,6,6,9,1,9,7,8 +Y,1,0,2,0,0,7,10,3,1,7,12,8,1,11,0,8 +D,1,0,2,1,1,6,7,8,6,7,6,6,2,8,3,8 +J,1,4,2,3,1,10,6,2,6,12,4,8,0,7,1,7 +V,5,7,5,5,2,3,12,5,4,12,12,7,2,10,1,8 +U,4,9,6,6,9,8,7,4,3,6,7,8,7,10,5,7 +J,2,10,3,8,1,12,3,10,3,13,7,13,1,6,0,8 +N,5,11,8,8,9,6,7,3,4,8,8,9,7,10,7,6 +G,6,9,6,6,4,5,7,6,6,9,8,10,2,8,5,9 +O,4,8,6,6,5,8,7,8,4,7,6,7,3,8,3,7 +D,5,11,6,8,3,5,7,11,9,7,7,5,3,8,4,8 +D,2,1,2,1,1,7,7,6,6,7,6,5,2,8,2,7 +M,6,9,7,7,6,8,5,11,0,7,9,8,12,4,4,8 +N,7,8,9,7,8,7,8,5,5,7,5,7,6,9,5,4 +Q,3,6,4,5,3,8,7,7,5,6,4,9,2,8,4,9 +I,4,11,5,8,3,7,7,0,7,13,6,8,0,8,1,8 +P,5,10,7,8,6,7,11,6,3,11,5,3,2,11,3,9 +V,3,9,5,7,1,6,8,4,3,7,14,8,3,9,0,8 +E,3,7,4,5,2,3,8,6,11,7,6,15,0,8,7,7 +F,2,8,3,5,1,1,13,4,3,12,10,5,0,8,3,7 +J,4,7,5,5,2,7,7,3,6,15,6,10,1,6,1,7 +S,3,10,4,8,4,8,6,8,5,7,7,9,2,9,8,8 +S,5,6,6,6,6,8,9,4,5,7,7,8,4,10,9,10 +B,2,3,4,2,2,8,7,3,5,10,5,6,2,8,4,9 +P,5,9,6,7,6,7,5,7,4,7,6,8,3,8,7,10 +Q,1,0,2,1,0,8,7,6,3,6,6,9,2,8,3,8 +B,3,8,5,6,4,7,8,5,6,9,7,5,2,8,7,6 +K,4,9,6,8,6,9,6,2,4,9,3,8,5,6,7,11 +G,5,7,7,6,6,8,10,5,3,6,7,10,8,11,7,8 +E,5,5,5,7,3,3,7,6,12,7,6,15,0,8,7,6 +Y,2,4,4,3,1,7,11,1,7,7,11,8,1,11,2,8 +O,1,3,2,1,1,8,7,6,4,7,6,8,2,8,2,8 +K,6,8,9,6,5,7,5,2,8,10,4,10,5,5,5,9 +N,8,11,11,8,7,4,11,3,4,10,10,8,6,8,1,7 +X,5,10,6,7,2,7,7,5,4,7,6,8,3,8,4,8 +J,6,11,7,8,3,9,5,4,7,15,4,11,1,6,1,7 +A,3,7,5,5,3,12,2,2,2,10,2,9,2,6,3,8 +Z,4,7,5,5,3,8,6,2,10,11,5,10,2,8,6,9 +R,2,1,2,2,2,6,8,4,5,6,5,7,2,6,4,9 +E,2,1,2,1,1,4,7,5,8,7,6,13,0,8,7,9 +D,4,7,5,5,4,10,6,3,6,11,4,7,3,8,3,9 +X,7,15,8,8,5,11,7,2,7,11,3,5,3,11,4,9 +O,5,9,5,7,4,7,7,8,5,10,7,8,3,8,3,8 +A,2,6,4,4,2,12,3,4,2,11,1,8,2,6,2,9 +F,4,8,4,6,2,1,11,5,7,12,11,9,0,8,2,6 +S,7,13,5,7,3,8,2,1,5,7,2,7,3,7,4,10 +N,1,1,2,2,1,7,7,11,1,5,6,8,4,8,0,8 +F,6,10,6,6,4,10,7,3,5,11,4,5,3,9,6,9 +Y,2,1,4,3,2,8,11,1,7,5,11,8,1,11,2,8 +K,7,10,11,8,7,2,8,3,7,11,12,12,4,7,4,4 +W,3,6,5,4,4,7,11,2,2,7,8,8,6,11,1,8 +U,4,5,5,3,2,6,8,5,8,6,10,9,3,9,1,7 +A,3,8,6,6,3,11,2,2,3,9,2,9,3,5,3,8 +V,11,14,9,8,4,8,9,6,5,7,10,5,7,13,3,8 +U,4,8,5,7,6,7,7,5,3,6,7,8,4,8,1,7 +X,2,3,3,2,1,7,8,1,7,10,7,8,2,8,2,7 +K,5,10,6,7,2,4,8,8,2,7,4,11,4,8,2,11 +Y,9,10,7,14,6,6,6,6,4,6,12,6,5,10,6,5 +T,8,13,7,7,4,6,10,3,7,12,7,6,3,9,5,4 +S,5,9,6,6,4,7,7,4,7,10,9,9,2,10,5,6 +Q,5,8,6,7,3,8,9,8,6,5,8,9,3,7,6,10 +Q,5,6,5,8,6,8,6,6,3,9,6,9,3,8,5,8 +L,5,5,5,8,1,0,0,6,6,0,1,5,0,8,0,8 +A,3,3,5,5,2,9,4,3,1,8,1,8,2,7,2,8 +R,3,7,5,5,5,5,8,3,4,6,5,9,4,7,6,5 +F,6,7,8,8,8,7,9,4,4,7,6,7,4,9,9,8 +P,4,8,6,6,5,6,9,7,4,9,7,4,2,10,3,7 +X,3,5,4,4,4,8,8,2,5,8,6,7,2,7,6,7 +O,1,0,2,0,0,7,6,6,4,7,6,8,2,8,3,8 +W,7,7,7,5,5,6,10,4,3,8,7,7,9,13,3,4 +P,8,9,6,4,3,8,7,5,4,11,3,6,5,8,4,8 +U,5,8,6,6,5,8,8,8,5,6,7,9,3,7,4,6 +V,7,10,9,8,6,9,10,4,2,4,10,9,6,10,5,10 +S,4,10,4,7,2,8,7,6,9,5,6,7,0,8,9,8 +O,1,3,2,2,1,8,7,6,3,8,6,8,2,8,2,8 +O,3,5,4,4,3,7,7,8,5,7,6,8,2,8,3,8 +R,3,3,4,2,2,7,8,5,5,7,5,7,2,7,4,8 +S,4,9,4,7,3,8,7,8,7,8,6,8,2,9,9,8 +Q,4,6,5,5,4,5,4,4,5,5,4,7,4,4,6,6 +H,3,5,4,4,4,7,8,6,6,7,6,8,3,8,3,8 +Z,5,9,6,7,7,8,7,3,8,8,6,8,1,7,12,9 +F,3,6,3,4,1,1,13,5,4,12,10,7,0,8,2,6 +P,5,9,7,6,4,9,8,4,6,12,4,4,2,9,4,9 +N,2,3,2,2,1,6,8,5,4,8,7,7,4,8,1,6 +T,7,9,7,7,4,5,11,2,8,11,10,5,1,11,2,4 +F,5,7,7,5,3,7,9,2,7,14,5,5,2,8,3,8 +M,5,9,7,7,6,7,6,3,4,10,8,9,11,5,3,9 +S,3,7,4,5,2,7,6,5,9,5,6,10,0,9,9,8 +S,3,5,5,3,2,8,6,2,7,10,7,9,2,9,5,8 +S,7,10,8,7,5,8,7,3,6,10,5,7,2,8,5,9 +X,4,10,5,7,2,7,7,5,4,7,6,8,3,8,4,8 +D,2,3,2,2,2,7,7,6,6,7,6,5,2,8,2,7 +L,1,0,1,0,0,2,2,5,4,1,2,5,0,8,0,8 +I,1,6,2,4,1,7,7,0,7,13,6,9,0,8,1,8 +Z,2,6,3,4,1,7,7,3,13,9,6,8,0,8,8,8 +Q,4,9,5,8,5,8,6,8,6,5,4,7,2,8,4,8 +F,3,8,3,5,1,0,13,4,4,13,11,7,0,8,1,6 +A,3,8,5,6,2,8,5,3,1,7,0,8,2,7,2,8 +E,2,4,2,2,2,7,7,5,8,6,5,8,2,8,6,9 +Y,3,8,5,6,1,4,10,3,2,9,13,8,2,11,0,8 +S,4,3,5,5,2,8,10,6,10,5,5,5,0,7,8,9 +J,5,9,6,7,3,9,7,2,6,14,3,7,0,7,0,8 +X,4,10,7,7,4,9,7,0,8,9,4,7,3,8,3,8 +C,1,0,2,1,0,6,7,6,8,7,6,14,0,8,4,10 +L,5,5,5,8,1,0,0,6,6,0,1,4,0,8,0,8 +T,3,4,4,2,1,5,11,2,7,11,9,4,1,10,2,5 +R,5,10,6,8,6,5,8,6,6,6,4,10,4,6,6,10 +L,2,2,2,4,1,0,1,5,6,0,0,6,0,8,0,8 +Y,7,9,7,7,3,3,10,4,7,12,12,6,2,11,2,6 +E,3,7,4,5,2,3,7,6,11,7,6,15,0,8,7,7 +J,4,5,6,5,5,8,9,4,5,7,6,8,3,7,8,8 +E,5,9,7,7,7,7,7,3,7,7,7,11,5,10,8,9 +P,5,10,7,8,7,6,9,6,5,9,7,4,2,10,4,7 +T,2,3,3,1,1,5,12,3,5,11,9,5,1,10,1,5 +S,4,9,5,6,3,6,9,5,8,11,8,7,2,9,5,5 +V,5,5,6,4,2,5,12,2,3,8,11,7,3,10,1,7 +J,4,11,4,8,3,14,3,5,5,13,1,9,0,7,0,8 +H,8,13,8,7,4,11,7,4,5,9,4,5,6,9,4,8 +C,2,1,3,2,1,6,8,7,8,8,7,13,1,9,4,10 +U,6,8,6,6,4,4,8,5,7,10,8,9,3,9,2,5 +F,3,4,5,3,2,6,10,2,6,13,6,4,1,10,3,7 +F,4,3,4,4,3,5,11,3,6,11,9,5,1,10,3,6 +R,4,7,6,5,4,10,7,4,6,10,3,6,3,7,4,10 +X,7,15,7,8,4,10,7,2,8,9,4,7,4,10,4,10 +E,4,7,6,5,3,4,9,3,9,11,9,10,2,8,4,5 +K,4,9,4,7,2,3,7,7,3,7,7,12,3,8,3,10 +O,5,12,4,6,3,6,6,6,3,10,6,9,5,9,5,7 +L,3,5,4,4,3,6,8,4,5,6,6,9,2,8,7,9 +K,4,4,6,3,3,5,8,2,7,10,8,9,3,8,2,7 +Y,6,7,6,5,3,5,9,1,9,10,10,5,1,10,4,3 +L,3,6,3,4,1,1,0,6,6,0,1,5,0,8,0,8 +K,3,8,5,6,4,5,6,4,7,7,7,11,3,8,5,9 +T,2,3,3,2,1,5,12,3,6,11,9,5,1,11,2,5 +J,3,6,5,4,2,9,7,1,6,14,4,6,0,8,0,8 +I,7,14,6,8,4,10,6,4,6,14,3,6,2,8,6,10 +A,5,11,7,8,3,9,3,3,3,7,2,9,3,7,3,9 +F,3,5,6,4,2,6,12,3,5,13,7,3,1,10,2,6 +U,7,10,8,8,5,5,7,6,8,9,7,9,5,11,5,3 +P,4,4,5,6,5,9,10,2,3,7,9,5,4,10,5,5 +J,2,4,4,3,1,9,6,3,6,14,5,10,0,7,0,8 +A,1,1,2,1,0,7,4,3,0,7,1,8,2,7,1,8 +R,2,3,4,1,2,9,7,4,5,9,4,7,2,6,4,10 +G,4,11,5,8,4,7,7,7,6,6,5,9,2,7,5,11 +K,5,10,7,8,7,7,7,3,7,6,6,7,7,8,6,10 +T,5,7,6,5,5,6,7,7,7,7,8,8,3,10,5,9 +O,1,0,2,1,0,7,7,6,5,7,6,8,2,8,3,8 +P,3,4,5,2,2,8,10,4,3,11,4,3,1,10,2,8 +G,3,4,4,3,2,6,7,5,5,9,7,10,2,9,4,9 +R,4,10,4,7,3,5,11,9,4,7,3,9,3,7,6,11 +L,3,8,4,6,2,2,4,3,9,2,0,8,0,7,1,6 +U,5,10,6,8,2,7,4,15,6,7,14,8,3,9,0,8 +M,6,9,9,6,7,9,6,2,5,9,5,7,8,6,2,8 +N,4,5,5,5,5,7,8,4,3,6,4,8,6,8,4,7 +R,3,6,4,4,4,8,6,6,3,7,5,7,4,6,6,7 +D,3,1,4,2,2,7,7,6,7,7,6,5,2,8,3,7 +E,5,7,6,5,5,8,9,6,3,6,6,10,4,8,7,9 +J,1,3,3,2,1,7,7,3,5,14,6,9,1,7,1,7 +Z,3,5,4,7,2,7,7,4,14,10,6,8,0,8,8,8 +D,1,3,3,2,1,9,6,4,6,10,4,6,2,8,2,8 +N,6,10,8,8,5,7,8,6,6,7,7,6,6,9,2,6 +S,5,10,7,7,8,9,5,5,4,8,6,9,5,7,12,8 +B,2,1,3,3,2,7,7,5,5,6,6,6,2,8,5,9 +H,5,8,8,6,5,10,7,4,6,10,3,6,3,8,3,8 +I,1,5,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +A,3,2,5,3,2,8,2,2,2,7,1,8,2,6,2,7 +U,4,5,5,3,2,6,8,6,7,7,10,9,3,9,0,8 +P,7,11,9,8,8,6,8,7,4,8,7,9,3,9,7,9 +I,3,9,4,6,3,7,7,0,7,13,6,8,0,8,1,8 +G,1,3,2,2,1,7,6,5,4,7,6,10,2,9,3,9 +O,3,2,5,4,3,8,7,8,5,7,6,8,2,8,3,8 +W,6,8,6,6,6,4,9,2,3,9,8,8,7,11,2,6 +B,4,8,4,6,5,6,7,8,6,6,6,7,2,8,7,9 +A,2,8,4,6,3,13,3,4,2,11,1,8,2,6,3,9 +W,6,5,9,8,4,8,7,5,2,7,8,8,9,9,0,8 +U,6,10,6,8,5,8,5,12,4,7,13,8,3,8,0,7 +Q,4,6,5,7,5,10,10,6,3,4,8,11,3,10,6,9 +I,2,10,3,8,2,9,6,0,7,13,5,8,0,8,1,8 +F,6,9,8,6,5,9,8,2,7,13,4,5,4,9,4,9 +P,2,1,3,2,1,6,10,5,4,10,7,3,1,9,4,6 +E,6,11,8,9,7,9,6,1,8,11,4,9,4,7,6,10 +M,4,4,6,3,4,8,6,2,4,9,6,8,7,5,2,8 +C,6,10,8,7,5,7,7,8,7,7,6,11,4,8,4,9 +V,2,1,4,2,1,7,12,2,2,6,11,9,4,11,2,7 +D,4,8,6,6,8,9,8,4,5,7,6,6,4,6,7,5 +J,2,8,2,6,1,15,3,5,5,13,0,8,0,7,0,8 +L,2,1,2,2,1,4,4,4,8,3,2,6,0,7,1,6 +J,1,1,2,3,1,10,6,3,5,11,4,9,1,7,1,7 +F,4,10,4,7,2,1,13,5,3,12,9,6,0,8,3,6 +Q,3,6,4,8,4,8,6,7,5,9,6,7,3,8,5,7 +G,3,6,4,4,2,6,7,6,5,10,8,11,2,9,4,10 +S,7,10,8,8,4,8,7,4,8,11,6,7,2,9,5,8 +Z,4,10,5,8,3,7,7,4,15,9,6,8,0,8,8,8 +O,3,1,4,3,2,7,7,7,4,7,6,7,2,8,3,7 +I,4,8,6,9,6,9,8,6,7,7,4,7,3,10,9,9 +O,3,5,4,3,3,7,7,7,4,9,5,8,2,8,3,7 +Q,2,3,3,4,2,8,8,4,2,7,8,10,2,9,4,8 +U,5,11,8,8,6,7,8,4,7,4,7,9,6,9,1,8 +M,7,9,11,6,8,4,7,3,5,11,10,11,10,9,5,7 +M,5,8,8,6,7,9,7,2,4,9,5,7,7,7,2,8 +X,4,8,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +V,9,11,7,6,3,7,11,6,5,8,10,4,5,12,3,9 +V,3,7,4,5,2,5,11,3,4,9,12,8,2,10,1,8 +D,4,7,5,5,5,7,7,5,7,7,6,6,6,8,3,7 +F,7,10,6,6,4,9,7,3,5,11,5,6,4,9,6,9 +X,1,0,2,0,0,7,7,4,4,7,6,8,2,8,4,8 +L,4,8,6,6,6,7,7,3,5,7,7,9,6,10,6,6 +K,4,8,4,5,2,3,8,8,2,7,5,11,4,8,3,10 +J,2,1,3,2,1,10,6,2,7,11,4,8,1,7,1,7 +H,8,11,12,8,7,9,7,3,6,10,4,7,3,8,3,8 +D,2,3,3,2,2,9,6,4,6,10,4,6,2,8,2,9 +C,3,6,4,4,2,5,9,6,7,12,9,11,2,10,3,7 +C,5,9,6,7,4,4,7,5,7,10,8,14,3,8,4,7 +P,3,6,3,4,2,4,12,7,1,10,6,4,1,10,3,8 +P,5,5,6,7,7,8,7,4,3,7,7,7,6,10,5,6 +L,2,0,2,1,0,2,0,6,4,0,3,4,0,8,0,8 +B,1,1,2,1,2,7,7,4,5,7,6,6,1,8,4,9 +L,4,8,6,6,3,5,4,3,10,5,1,7,1,6,3,5 +S,3,10,4,7,2,7,7,6,9,4,6,8,0,8,9,7 +O,3,5,4,4,3,8,7,7,4,9,6,8,3,8,3,8 +D,2,4,4,3,2,10,6,3,7,10,3,6,2,8,3,9 +L,3,7,4,5,2,3,4,3,9,2,1,7,0,7,1,5 +I,4,11,5,8,2,9,5,0,8,14,5,10,0,8,1,9 +H,7,9,6,4,3,11,7,4,5,8,3,5,5,9,4,8 +Y,3,9,5,6,1,7,10,2,3,7,13,8,1,11,0,8 +J,1,1,2,2,1,10,6,2,5,11,4,8,1,7,1,7 +U,2,4,3,3,1,7,8,7,7,8,10,7,3,9,1,8 +D,2,1,2,2,1,6,7,8,7,6,6,6,2,8,3,8 +H,3,7,4,5,5,7,8,6,6,7,5,8,3,8,3,7 +K,6,11,6,8,5,3,6,7,4,7,8,12,3,8,3,11 +J,2,7,4,5,1,7,6,4,6,15,7,12,1,6,0,7 +R,2,1,3,2,1,6,10,8,2,7,5,8,2,7,5,10 +N,4,7,6,5,4,6,7,6,7,7,5,9,6,7,3,7 +A,4,11,7,8,3,7,4,3,2,7,1,8,3,6,3,8 +K,8,13,7,7,4,10,7,3,7,9,3,6,6,8,4,8 +A,3,9,5,7,4,12,3,2,2,10,2,9,2,6,3,7 +N,2,3,4,2,1,9,7,3,4,10,3,6,5,9,0,7 +U,5,11,6,8,5,7,5,13,5,7,12,8,3,9,0,8 +B,4,6,4,4,3,7,6,9,7,7,7,7,2,8,8,9 +R,2,1,2,2,2,7,7,5,5,6,5,7,2,7,4,8 +G,1,3,2,2,1,7,7,4,4,9,7,10,2,8,3,10 +N,5,10,6,8,6,7,7,13,1,6,6,8,5,8,0,8 +W,8,9,8,7,7,5,11,3,3,9,8,7,7,12,3,6 +L,3,7,5,5,4,7,6,7,5,6,6,8,3,8,4,10 +L,4,7,4,5,2,1,1,5,5,1,1,6,0,8,0,8 +U,3,2,4,4,1,7,5,12,5,7,14,7,3,9,0,8 +I,3,8,4,6,2,7,7,0,8,14,6,8,0,8,1,8 +Y,7,10,8,8,4,3,11,2,8,11,11,5,1,11,3,4 +P,4,3,4,4,2,4,14,7,1,11,6,3,1,10,4,8 +I,4,11,7,9,8,10,8,2,6,9,4,5,4,7,8,4 +U,8,11,8,8,6,3,8,5,8,10,8,10,5,10,4,4 +U,4,4,5,3,2,4,8,5,8,10,9,9,3,9,2,6 +G,6,11,8,8,9,8,4,5,4,7,5,11,7,9,6,13 +L,4,9,6,7,4,4,4,3,8,2,1,8,0,6,1,6 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +W,8,9,12,8,13,7,7,5,5,6,5,8,10,9,9,8 +K,5,8,8,7,7,10,7,4,4,10,2,8,5,5,4,10 +N,4,7,4,5,2,7,7,14,2,4,6,8,6,8,0,8 +L,3,8,4,6,2,7,3,1,8,9,2,11,0,7,2,9 +W,8,9,8,6,6,5,11,3,3,9,8,7,8,11,3,6 +E,6,10,8,8,5,5,8,4,9,12,9,9,3,8,5,6 +D,1,3,3,2,1,8,7,5,6,9,5,5,2,8,3,8 +J,6,13,5,10,4,7,10,2,3,13,5,5,2,8,7,8 +Y,1,3,2,1,1,7,10,1,5,7,11,8,1,11,1,8 +B,5,11,6,8,8,8,7,5,6,7,6,5,3,8,6,9 +B,2,3,4,2,2,8,7,3,5,10,5,6,2,8,4,9 +B,6,9,5,5,5,8,8,3,5,9,5,7,6,5,7,7 +D,1,0,1,1,0,6,7,8,5,7,6,6,2,8,2,8 +S,6,9,7,6,4,9,6,3,8,10,6,8,2,10,5,8 +T,5,10,7,8,6,8,11,2,7,6,11,8,1,12,1,8 +H,5,10,5,7,3,7,7,15,1,7,6,8,3,8,0,8 +A,3,8,5,6,5,8,7,7,4,7,6,9,5,7,7,4 +V,4,9,6,7,3,6,11,2,4,7,12,9,3,10,1,8 +A,4,8,6,7,6,9,8,3,4,6,7,7,5,8,5,5 +Z,3,6,5,9,4,11,3,2,6,8,2,6,1,8,6,9 +A,4,10,5,7,4,7,5,3,0,7,1,8,2,7,3,8 +R,4,10,5,7,3,5,12,9,4,7,2,9,3,7,6,11 +W,8,9,8,7,6,2,12,2,3,10,10,8,7,11,2,7 +T,3,4,4,3,2,6,10,2,7,11,9,5,2,10,3,4 +L,3,10,3,8,1,0,1,5,6,0,0,7,0,8,0,8 +C,2,5,3,3,2,6,8,7,7,8,7,13,1,9,4,10 +U,5,7,5,5,3,4,8,5,7,10,9,9,3,9,2,6 +Y,2,7,4,4,1,8,11,1,3,6,12,8,1,10,0,8 +E,1,0,1,0,1,5,8,5,7,7,6,12,0,8,6,9 +R,2,6,4,4,3,8,7,3,5,9,4,7,3,7,4,10 +C,5,9,5,7,3,4,8,6,8,12,10,12,1,9,3,7 +L,3,8,5,6,3,6,4,1,8,8,2,10,0,7,2,8 +K,4,10,6,8,7,6,6,5,3,7,6,9,4,5,10,8 +M,4,5,5,3,4,8,6,6,4,7,7,8,8,5,2,7 +N,2,5,3,4,2,7,8,5,4,7,6,7,4,8,1,7 +J,6,8,8,9,7,9,8,5,6,7,5,8,4,8,9,7 +P,1,3,3,2,1,6,10,6,2,10,5,4,1,9,3,7 +J,1,8,2,6,2,9,6,3,5,11,4,9,1,6,1,6 +G,5,9,4,4,3,8,6,4,2,9,6,8,3,9,8,8 +H,5,8,7,6,7,7,7,6,6,7,6,8,3,8,3,7 +B,2,1,3,1,2,7,7,5,5,7,6,6,1,8,5,9 +I,3,7,4,5,2,8,6,0,7,13,6,9,0,7,2,8 +D,1,0,1,1,1,6,7,8,6,7,6,6,2,8,3,8 +O,4,4,5,6,2,8,8,9,8,5,8,10,3,8,4,8 +B,4,5,4,7,4,6,7,10,7,7,6,7,2,8,8,9 +M,6,8,9,6,5,10,6,3,5,9,4,6,8,6,2,8 +T,2,1,3,2,1,7,12,2,6,7,11,8,1,11,1,8 +V,3,7,4,5,2,7,12,3,4,7,11,8,2,10,1,8 +Z,7,14,7,8,4,10,4,3,8,12,4,10,3,9,4,11 +S,4,9,3,4,2,7,3,1,5,6,2,7,2,8,5,9 +Q,6,8,6,10,8,8,5,7,3,9,6,9,3,8,5,8 +Y,4,10,7,7,1,7,10,3,2,7,13,8,2,11,0,8 +E,6,10,8,8,6,4,10,4,8,11,10,8,3,8,4,4 +G,3,3,4,5,2,7,7,8,7,6,5,11,2,8,5,10 +Q,5,8,5,10,6,8,7,6,3,8,9,11,3,8,6,8 +F,3,7,3,4,1,1,11,5,6,11,10,9,0,8,2,6 +H,4,5,4,7,3,7,8,15,1,7,5,8,3,8,0,8 +V,2,4,4,3,1,7,12,2,3,6,11,9,2,10,1,8 +M,14,15,14,8,7,6,10,5,5,4,4,11,11,13,2,8 +L,5,9,6,7,5,6,6,8,5,6,5,9,3,7,5,11 +U,3,5,4,3,2,6,8,6,7,6,9,9,3,9,1,7 +S,2,8,3,6,3,7,7,7,5,7,6,8,2,9,8,8 +Z,4,10,5,8,2,7,7,4,15,9,6,8,0,8,8,8 +U,5,7,5,5,3,4,8,6,7,9,9,9,3,9,2,5 +W,5,10,7,8,4,5,8,5,2,7,8,8,8,9,0,8 +H,1,0,1,0,0,7,7,10,1,7,6,8,2,8,0,8 +T,4,10,5,8,3,7,13,0,6,7,10,8,0,8,0,8 +N,5,10,6,8,6,7,7,6,6,7,6,8,6,7,3,8 +G,6,8,8,7,8,7,10,6,2,7,7,8,6,11,7,8 +T,3,4,4,3,2,7,12,4,6,7,11,8,2,11,1,7 +D,5,6,6,6,5,5,7,6,7,6,5,6,4,7,5,6 +D,3,2,4,3,2,7,7,6,7,7,6,5,2,8,3,7 +R,4,10,5,7,6,6,7,5,6,6,4,8,3,6,5,9 +E,3,7,4,5,4,8,8,4,7,7,5,8,3,8,5,10 +J,5,9,6,7,3,8,4,5,6,15,7,14,1,6,1,7 +Q,3,5,4,6,4,8,8,5,2,7,7,12,2,9,5,9 +K,4,5,5,4,4,5,7,4,7,6,6,10,3,8,5,8 +N,6,11,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +X,8,12,8,6,4,10,6,3,9,9,2,5,4,6,4,10 +H,3,3,5,1,2,9,6,3,5,10,4,8,3,8,2,9 +A,5,9,7,7,4,8,5,3,0,6,1,8,2,7,1,8 +L,4,9,5,6,4,5,5,1,8,7,2,10,1,7,3,7 +I,2,7,2,5,1,7,7,0,7,13,6,8,0,8,1,8 +H,6,8,8,6,7,6,8,7,6,8,5,7,6,7,5,10 +G,5,8,5,6,4,7,6,6,7,10,7,11,2,10,4,9 +R,5,5,6,7,3,6,11,9,3,7,3,8,3,7,6,11 +X,4,10,6,8,6,6,7,2,6,7,7,9,3,7,6,8 +D,4,8,4,6,4,5,7,9,7,7,7,6,2,8,3,8 +R,3,10,4,7,3,6,9,11,5,7,5,8,3,8,5,10 +F,5,8,8,6,4,6,10,3,6,13,7,4,2,10,2,7 +C,3,6,5,5,4,6,6,4,5,7,6,11,4,10,7,10 +O,2,4,3,3,2,7,7,7,4,7,5,8,2,8,3,8 +V,2,6,4,4,2,9,11,3,4,4,11,8,2,10,1,8 +M,7,10,9,8,9,8,7,6,5,6,7,8,8,6,2,7 +R,4,7,5,5,3,11,7,3,6,11,2,6,3,7,3,10 +O,4,8,6,6,5,7,7,8,4,7,7,9,3,8,3,7 +H,1,0,2,1,0,7,7,11,1,7,6,8,3,8,0,8 +W,6,6,6,4,4,2,11,2,2,10,10,8,5,11,1,7 +Q,3,4,4,5,3,8,8,5,1,8,8,10,2,9,4,8 +Y,3,5,4,7,7,8,5,4,2,7,7,9,5,10,4,7 +Q,1,3,2,4,2,7,7,5,2,8,8,10,2,9,4,9 +H,5,10,8,8,7,8,6,7,7,7,7,5,3,8,4,6 +A,3,9,5,6,3,10,3,2,2,8,2,10,3,5,3,7 +S,4,8,5,6,4,8,8,7,5,7,6,8,2,8,8,8 +P,6,11,5,6,3,5,11,5,4,13,6,4,3,9,4,8 +K,8,12,7,6,4,9,8,3,7,9,4,6,6,9,4,8 +Y,2,2,4,4,2,6,10,1,7,8,11,8,1,11,2,7 +B,8,10,7,6,6,7,9,4,5,9,6,7,6,6,7,6 +W,4,9,6,7,3,5,8,5,1,7,8,8,8,9,0,8 +O,4,9,5,7,2,7,6,9,7,6,5,7,3,8,4,8 +G,5,11,7,8,4,6,6,8,8,8,5,13,3,11,5,8 +I,1,10,2,8,2,7,7,0,8,7,6,8,0,8,3,8 +P,8,11,6,6,3,7,10,5,3,12,4,4,5,10,4,8 +Q,2,5,3,6,3,8,6,7,3,5,6,9,2,9,5,10 +A,4,9,3,4,2,13,3,4,1,10,3,10,3,5,3,10 +O,4,7,5,5,4,7,7,8,6,7,6,6,3,8,4,8 +Q,10,15,9,9,5,7,5,4,9,10,4,10,4,6,9,9 +I,1,3,2,1,0,7,7,1,7,13,6,8,0,8,1,8 +L,1,0,1,1,0,2,1,5,5,0,2,5,0,8,0,8 +W,6,5,8,5,8,9,8,5,5,7,5,8,9,9,8,6 +V,5,9,7,7,4,7,12,2,3,5,10,9,4,12,2,7 +N,3,3,4,2,2,7,8,6,4,7,7,6,5,9,2,6 +G,5,11,7,8,8,7,7,6,2,7,6,11,7,9,10,6 +N,6,9,8,7,9,8,7,4,4,7,6,6,7,10,7,5 +I,3,7,5,5,2,8,6,2,7,7,6,7,0,9,4,7 +F,5,11,7,8,5,5,11,2,8,10,9,5,4,10,4,6 +R,8,11,7,6,5,10,6,3,5,9,4,8,6,8,6,9 +V,2,1,3,1,0,7,9,4,2,7,13,8,2,10,0,8 +R,5,11,7,8,5,8,9,4,6,8,4,9,4,6,6,11 +H,4,9,4,7,4,7,7,13,1,7,6,8,3,8,0,8 +Q,6,10,8,8,7,8,3,8,5,6,5,9,4,9,4,7 +R,3,6,3,4,3,6,9,8,4,7,5,8,2,7,4,11 +P,3,7,4,5,3,6,10,6,5,10,8,4,1,10,4,7 +Y,4,6,6,8,7,9,9,6,3,7,7,8,6,11,7,4 +F,5,7,7,5,4,6,11,5,6,12,8,5,2,9,2,6 +Z,5,9,5,4,3,8,6,2,8,11,6,9,3,7,6,7 +O,7,13,5,7,3,9,7,7,5,9,4,8,5,9,5,9 +W,5,8,8,6,5,7,8,4,1,7,9,8,7,11,0,8 +C,4,9,5,7,4,4,8,6,7,9,9,15,1,9,4,10 +R,2,4,4,3,3,8,8,3,5,10,4,7,3,6,3,9 +Y,4,6,4,4,1,3,11,3,7,11,11,5,1,11,2,4 +I,1,4,1,3,1,7,7,1,8,7,6,9,0,8,3,8 +V,7,10,7,8,3,3,11,4,4,10,12,8,2,10,1,8 +Q,4,6,5,8,4,8,7,6,3,8,7,10,3,8,6,8 +G,4,6,4,4,3,7,6,6,5,9,6,13,2,8,4,10 +W,4,10,6,8,4,10,8,5,2,7,8,8,8,9,0,8 +Q,2,1,3,2,1,8,6,7,5,6,6,8,3,8,4,8 +G,9,14,8,8,5,7,4,6,3,8,5,4,4,8,6,6 +S,4,8,6,6,7,6,9,3,3,8,7,6,3,8,11,1 +S,3,4,3,2,2,8,8,6,5,7,6,7,2,8,9,8 +D,5,6,6,6,5,6,6,5,7,7,6,8,4,6,6,5 +W,8,12,8,6,4,1,9,3,2,11,12,9,7,10,0,6 +A,3,1,5,3,2,8,2,2,2,7,1,8,2,7,2,7 +C,4,6,5,4,3,6,7,5,6,11,8,13,2,10,3,9 +Q,1,2,2,3,1,8,8,5,1,5,7,9,2,9,4,9 +R,5,10,7,7,6,7,8,5,7,7,5,6,6,6,5,9 +L,3,2,4,4,2,4,4,4,7,2,1,6,0,7,1,6 +D,5,10,6,7,5,7,7,8,8,6,5,5,3,9,4,8 +P,8,12,7,6,4,8,9,3,4,12,5,4,3,10,6,6 +U,4,7,5,5,5,8,7,8,5,6,7,9,3,8,4,6 +Z,2,4,4,3,2,7,7,2,9,12,6,8,1,8,5,7 +S,4,9,4,7,2,8,7,6,9,4,6,8,0,8,9,7 +D,4,7,5,5,2,5,8,9,9,7,6,6,3,8,4,8 +S,4,9,6,7,7,5,9,3,3,8,7,5,4,8,12,0 +C,9,13,7,7,5,7,9,4,4,9,8,9,3,9,8,11 +R,3,4,4,3,2,7,7,5,5,6,5,6,2,7,4,8 +A,1,0,2,0,0,7,3,2,0,7,2,8,2,6,1,8 +U,5,6,5,4,2,4,9,6,7,10,10,9,3,9,2,5 +H,3,6,4,4,3,7,8,7,5,8,5,7,3,7,5,11 +J,2,6,3,4,2,10,5,3,5,12,3,8,0,7,2,7 +Y,3,8,5,6,1,9,12,2,3,4,12,9,0,10,0,8 +E,4,5,6,4,3,7,7,2,8,11,7,9,2,8,4,8 +J,3,9,5,7,3,9,5,3,6,15,4,10,0,7,1,7 +M,5,6,5,8,4,7,7,12,2,7,9,8,8,6,0,8 +S,6,12,6,6,3,8,7,4,3,13,8,8,3,10,3,8 +U,4,6,4,4,1,7,5,13,5,7,15,8,3,9,0,8 +L,2,7,3,5,2,4,4,4,7,2,1,6,1,6,1,6 +R,6,11,9,8,7,7,8,5,7,7,5,6,3,6,6,9 +D,4,7,6,6,6,7,8,5,6,6,4,7,4,7,7,5 +X,5,9,8,7,4,8,7,1,8,10,4,7,3,8,4,8 +V,2,3,4,4,1,5,8,4,2,8,13,8,3,10,0,8 +H,2,2,3,3,2,8,7,6,6,7,6,8,6,8,3,7 +R,3,5,6,4,5,8,7,3,4,8,5,7,6,9,5,5 +M,3,6,3,4,2,8,6,11,1,6,9,8,7,6,0,8 +L,3,7,4,5,2,6,3,1,8,8,2,11,0,7,2,8 +H,2,4,4,3,3,7,7,3,5,10,6,8,3,8,2,7 +Z,6,9,8,7,8,9,8,4,4,6,4,6,4,8,10,4 +F,2,4,2,2,1,5,10,4,4,10,9,5,1,10,3,7 +G,2,1,3,2,1,8,6,6,6,6,5,9,1,7,5,10 +M,4,5,5,3,4,8,6,6,4,6,7,7,8,6,3,6 +Y,7,6,6,9,4,7,10,2,3,7,10,4,4,10,6,7 +O,4,8,5,6,2,7,7,8,8,7,6,7,3,8,4,8 +E,6,11,4,6,3,6,9,4,5,10,6,8,3,8,7,8 +D,3,5,4,3,3,7,7,7,7,6,6,5,2,8,3,7 +O,3,5,4,4,3,7,7,8,5,7,6,8,2,8,3,8 +C,6,11,6,8,3,5,8,7,8,13,10,11,2,10,3,7 +X,4,8,6,6,3,6,8,1,8,10,8,9,3,8,3,7 +L,7,13,6,8,3,10,2,4,4,13,4,13,2,8,6,9 +T,3,1,4,3,2,7,12,4,6,7,11,8,2,11,1,8 +B,6,9,8,7,6,10,6,3,7,10,3,7,6,8,7,11 +M,1,0,2,0,0,7,6,9,0,7,8,8,5,6,0,8 +U,4,6,5,4,4,7,8,8,6,5,7,11,3,8,4,7 +S,6,8,8,7,9,8,7,4,5,7,7,8,5,10,9,11 +J,3,5,5,4,2,9,5,3,6,14,5,10,0,7,0,7 +Q,5,9,6,8,3,7,5,9,8,5,4,7,3,8,4,8 +T,3,7,5,5,3,6,12,3,7,8,11,8,1,11,1,7 +Y,6,8,6,6,3,5,9,0,8,10,9,6,0,10,3,4 +M,4,6,7,4,8,6,5,4,2,6,4,8,12,6,3,7 +Q,6,10,8,8,7,8,4,8,4,6,6,8,4,7,6,9 +S,3,9,4,7,4,8,6,8,5,7,7,9,2,9,8,7 +J,2,8,3,6,1,11,3,10,3,12,8,13,1,6,0,8 +A,2,3,4,2,2,9,1,2,1,8,2,10,2,6,2,7 +H,6,11,8,8,8,7,8,7,6,8,6,7,7,8,5,9 +M,5,10,5,7,4,7,7,12,2,7,9,8,8,6,0,8 +Y,5,11,6,8,7,9,5,6,5,7,8,7,3,9,8,3 +C,4,7,5,5,2,5,8,7,8,7,8,14,1,8,4,9 +J,2,6,3,4,1,15,3,3,5,12,1,8,0,8,0,8 +K,5,8,8,7,7,6,8,3,4,6,3,9,8,3,10,9 +Y,5,9,5,6,2,3,11,3,6,12,11,5,1,11,2,5 +M,5,10,6,8,4,7,7,12,2,7,9,8,8,6,0,8 +X,3,8,5,6,3,8,7,4,9,6,6,6,3,8,7,7 +J,6,9,4,12,4,11,6,2,4,10,4,6,3,9,6,10 +H,4,4,5,5,2,7,10,15,2,7,2,8,3,8,0,8 +H,3,4,5,3,3,5,9,3,5,10,8,8,3,9,3,7 +G,4,6,5,4,2,7,6,6,7,11,6,12,2,9,4,9 +R,5,6,7,6,7,5,7,4,4,6,5,9,7,9,6,9 +J,1,4,2,2,1,8,6,3,6,14,6,10,1,7,1,7 +V,3,5,4,4,1,4,12,3,3,10,11,7,2,10,1,8 +X,7,9,8,5,4,8,7,3,8,12,4,7,4,9,4,8 +F,2,7,3,4,1,1,11,4,6,11,11,10,0,8,2,6 +S,2,3,3,2,2,8,7,6,4,7,7,8,2,9,9,8 +R,4,9,4,6,3,5,11,8,4,7,4,9,3,7,6,11 +Y,3,7,5,5,2,7,10,2,2,7,12,8,1,11,0,8 +Y,4,5,5,3,2,4,10,2,8,10,10,5,3,11,4,3 +N,9,14,8,8,4,10,11,6,6,3,6,9,5,10,3,6 +Z,4,9,6,7,4,9,5,2,9,11,4,10,1,8,6,10 +L,4,9,6,8,5,8,7,4,5,7,6,8,3,8,8,11 +W,4,8,6,6,4,7,10,2,3,7,9,8,8,11,1,8 +N,2,1,2,1,1,7,7,11,1,5,6,8,4,8,0,8 +H,7,9,10,7,7,9,7,3,7,10,4,7,5,8,5,9 +J,0,0,1,0,0,12,4,6,3,12,4,11,0,7,0,8 +N,6,8,8,7,9,8,6,5,5,7,6,7,8,11,7,3 +I,7,13,5,8,3,10,4,5,4,13,3,9,3,8,4,9 +C,1,0,2,0,0,7,7,6,8,7,6,13,0,8,4,10 +O,3,7,4,5,3,7,7,8,5,7,6,8,3,8,3,8 +U,5,10,6,7,2,7,4,14,5,7,14,8,3,9,0,8 +R,8,14,6,8,5,8,7,5,5,9,4,9,7,5,6,11 +E,2,3,3,5,2,3,7,6,10,7,6,14,0,8,7,8 +B,10,15,10,8,8,9,7,4,5,9,5,7,7,5,9,8 +U,5,7,5,5,3,3,9,5,6,10,10,9,3,9,2,7 +D,1,0,2,1,1,6,7,8,6,7,6,6,2,8,3,8 +R,1,0,2,0,1,6,10,7,2,7,5,8,2,7,4,9 +N,8,10,10,5,3,4,10,5,4,14,11,9,5,9,0,8 +C,2,3,3,2,1,4,8,4,6,10,9,12,1,9,2,8 +E,3,10,4,8,2,2,8,6,11,7,6,15,0,8,7,7 +D,5,10,8,7,7,9,7,3,6,11,5,6,3,8,3,8 +G,5,10,4,5,3,9,5,4,3,9,4,5,4,7,5,8 +K,3,7,4,5,2,3,8,7,2,7,5,11,3,8,3,11 +Y,9,8,7,12,5,8,6,6,6,4,11,7,5,9,3,8 +X,3,8,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +Z,4,8,6,6,6,8,8,3,7,7,7,7,1,9,10,8 +X,4,6,5,4,4,7,6,3,5,6,6,9,2,8,8,8 +F,3,5,3,3,2,5,11,3,6,11,9,5,1,10,3,6 +N,4,11,5,8,5,8,7,13,1,6,6,7,6,8,1,10 +K,3,6,5,4,3,6,7,1,7,10,7,10,3,8,3,8 +R,4,3,5,5,3,5,11,8,3,7,4,8,2,7,6,11 +O,4,8,6,6,4,7,8,8,6,7,7,8,2,8,3,8 +V,5,9,5,6,3,3,10,3,4,10,12,8,3,10,1,7 +J,3,7,5,5,2,8,4,6,4,14,8,14,1,6,1,7 +M,2,1,2,1,1,7,6,10,0,7,8,8,6,6,0,8 +P,7,11,9,8,7,9,7,2,6,11,4,6,4,8,4,9 +Y,7,9,7,7,2,3,12,6,6,14,11,5,2,11,2,6 +D,5,11,7,8,11,8,8,6,4,7,6,6,7,8,9,6 +S,4,9,5,7,4,10,7,4,6,10,3,7,2,8,5,10 +X,4,10,5,7,1,7,7,5,4,7,6,8,3,8,4,8 +S,4,7,5,5,2,6,9,4,7,10,7,7,2,8,5,5 +Y,8,11,8,8,5,3,11,2,6,11,11,6,1,11,2,5 +Q,5,9,6,8,5,8,8,8,5,6,6,10,3,8,4,9 +T,5,6,6,4,3,5,11,3,7,11,9,5,2,11,2,4 +A,3,9,4,7,3,6,4,2,1,6,1,8,2,6,2,7 +R,4,5,4,3,3,7,7,5,6,7,5,6,5,7,4,7 +U,2,6,4,4,2,7,9,6,6,6,10,9,3,9,1,7 +I,4,9,4,5,2,6,11,3,4,13,6,4,1,9,5,8 +D,1,0,1,0,0,5,7,7,5,6,6,6,2,8,2,8 +E,2,3,4,2,2,7,7,2,7,11,7,9,2,8,4,8 +V,6,8,8,6,5,6,12,3,2,8,10,8,6,11,6,8 +D,5,11,5,6,4,8,6,3,5,9,5,7,5,9,5,8 +G,6,6,8,6,7,7,10,5,3,7,7,8,6,11,7,8 +D,9,15,8,8,6,8,6,3,7,10,5,7,6,8,9,6 +K,5,9,5,4,3,10,7,2,5,10,5,7,5,10,3,9 +T,6,11,6,8,4,4,12,3,7,12,10,4,1,11,2,4 +K,4,11,4,8,2,3,7,8,2,7,5,11,3,8,3,10 +Z,3,6,5,4,4,8,8,2,7,7,6,7,0,8,8,9 +N,5,11,6,8,6,8,8,13,1,6,6,8,6,8,1,10 +N,6,8,8,7,8,7,8,4,4,7,5,6,7,8,7,2 +M,2,4,4,3,3,10,6,3,4,9,4,6,6,5,2,8 +O,6,11,6,9,5,8,6,8,5,10,5,9,4,9,5,6 +T,3,6,5,5,5,6,9,3,7,8,7,9,3,8,7,5 +A,3,6,5,8,2,7,6,3,1,7,0,8,3,7,1,8 +R,3,2,4,3,3,7,7,5,5,6,5,6,3,7,4,8 +A,3,8,5,6,3,8,3,2,2,6,1,8,2,6,2,7 +J,3,4,4,6,1,11,2,11,3,12,9,14,1,6,0,8 +D,4,4,5,6,3,5,7,9,9,6,5,5,3,8,4,8 +B,4,10,5,7,7,8,7,6,5,7,6,6,6,8,6,10 +J,4,4,5,5,4,7,9,4,5,7,7,8,3,7,6,6 +V,3,7,5,5,2,9,9,4,1,6,13,8,2,10,0,8 +B,5,8,7,6,7,7,7,5,4,7,5,7,4,9,6,7 +I,1,9,0,6,1,7,7,5,3,7,6,8,0,8,0,8 +U,5,8,6,6,3,5,8,7,9,10,11,9,3,9,1,7 +M,4,8,5,6,5,8,5,11,1,6,9,8,8,5,1,6 +W,6,9,8,7,4,4,8,5,2,7,9,8,9,9,0,8 +C,5,11,6,8,4,3,8,6,6,12,10,13,2,9,3,7 +N,6,10,8,8,4,7,8,2,5,10,7,8,5,8,1,8 +R,5,10,8,9,9,6,9,3,3,7,5,9,8,6,7,9 +D,6,10,8,8,6,9,6,5,8,10,3,6,3,8,4,8 +B,2,1,2,1,1,7,7,7,5,6,6,7,1,8,7,8 +Z,2,1,3,2,1,7,7,5,9,6,6,8,1,8,7,8 +T,7,10,7,8,6,6,11,3,6,11,9,5,2,12,2,4 +T,5,9,7,8,8,7,7,4,8,7,6,9,5,4,11,5 +T,9,12,8,6,3,4,12,3,8,13,8,4,2,8,4,3 +W,7,10,7,7,6,5,10,4,3,9,7,7,9,13,3,4 +U,3,8,5,6,2,6,9,7,7,8,10,9,3,9,1,7 +F,2,2,3,3,2,5,11,3,5,11,9,5,1,10,3,6 +H,2,3,3,2,2,7,7,6,5,7,6,8,3,8,2,7 +U,4,8,4,6,3,7,6,11,4,7,13,8,3,9,0,8 +Z,2,1,3,2,2,7,7,5,9,6,6,8,2,8,7,8 +Z,5,9,6,7,5,7,7,5,10,7,6,8,1,8,7,8 +M,4,6,5,4,3,8,7,12,1,6,9,8,8,6,0,8 +D,6,10,8,7,5,9,7,5,8,10,3,5,3,8,4,8 +C,6,11,8,9,6,7,8,8,6,4,7,12,5,6,4,8 +C,3,5,4,7,2,5,7,7,10,7,5,14,1,8,4,9 +G,6,10,8,8,8,7,10,6,3,5,6,10,4,7,7,7 +B,3,5,3,3,3,7,7,5,5,6,6,6,2,8,6,10 +E,4,7,6,5,4,9,7,2,7,11,5,8,3,9,4,11 +F,4,7,6,5,3,6,10,1,6,13,7,5,1,10,2,8 +G,4,9,6,6,2,7,6,7,9,7,5,11,1,8,5,10 +O,5,10,7,8,5,7,6,9,4,7,5,9,3,9,4,6 +M,5,5,8,3,4,10,6,3,5,9,5,7,10,6,2,8 +R,5,7,7,5,4,9,8,4,7,9,3,7,3,6,4,11 +M,6,10,10,8,13,9,6,3,2,8,4,8,11,7,3,7 +M,4,5,7,3,4,5,7,3,4,10,10,10,9,7,3,8 +V,1,3,3,1,1,7,12,2,2,7,10,8,2,10,1,8 +Y,7,9,8,7,4,3,10,2,7,10,12,7,2,11,2,6 +T,7,12,6,6,4,5,11,2,7,12,7,5,2,9,5,4 +V,2,0,3,1,0,8,9,4,2,6,13,8,2,10,0,8 +W,5,6,5,4,4,4,10,3,2,9,9,7,7,11,2,6 +G,4,9,5,7,6,9,5,5,2,7,6,10,7,8,5,10 +T,4,8,5,6,4,6,7,8,6,6,6,8,4,9,6,10 +C,2,7,3,5,1,5,7,6,8,6,6,12,1,7,4,9 +D,2,3,4,2,2,8,7,5,6,9,5,5,2,8,3,7 +P,4,9,4,4,3,8,9,3,3,11,5,5,4,11,5,7 +V,3,8,5,6,2,6,11,2,4,8,12,8,2,10,1,8 +L,4,8,5,6,3,2,4,2,8,2,0,9,0,7,1,6 +P,5,5,5,7,3,4,13,9,2,10,6,3,1,10,4,8 +S,5,10,7,8,5,7,7,4,7,10,9,9,3,9,5,6 +P,6,12,6,6,4,6,10,3,4,12,6,4,3,11,5,6 +G,4,8,5,6,4,8,7,7,6,6,6,9,2,7,5,11 +G,5,10,6,7,3,8,7,8,8,6,7,9,2,7,5,10 +V,3,7,4,5,2,5,11,3,3,9,11,8,2,11,1,8 +L,3,2,4,4,2,4,4,5,8,2,1,6,0,7,1,6 +Y,7,9,7,7,3,5,9,1,9,9,10,5,1,11,4,3 +L,4,10,6,8,4,7,4,1,7,8,2,10,1,6,3,8 +X,2,3,3,2,2,7,7,3,8,6,6,8,2,8,5,8 +K,6,9,9,7,9,6,8,5,4,7,5,8,4,6,10,9 +A,6,8,8,7,7,8,7,4,6,7,9,6,5,11,4,5 +Q,5,8,5,9,7,8,6,7,4,9,7,8,4,9,5,7 +X,5,10,8,8,5,7,7,4,10,6,6,8,3,8,7,8 +E,2,5,4,3,2,7,7,2,8,11,7,9,2,9,4,8 +G,4,8,6,6,3,8,8,8,8,6,7,8,2,7,6,11 +F,4,8,5,6,5,6,9,5,4,8,6,8,5,10,6,12 +R,2,3,2,2,2,7,7,4,5,6,5,6,2,7,4,8 +S,5,10,6,8,8,8,8,5,3,8,5,7,5,9,12,8 +K,6,11,8,8,5,4,7,2,7,10,9,11,4,7,4,6 +B,6,9,8,6,7,9,7,4,6,9,5,6,3,7,6,10 +R,2,3,3,2,2,9,7,3,4,10,4,7,2,7,3,10 +L,4,10,5,8,4,7,4,2,8,7,2,8,1,6,3,8 +V,6,11,8,9,4,8,9,5,2,6,13,8,3,10,0,8 +R,6,9,9,8,10,9,7,4,4,8,4,7,8,10,7,4 +I,1,1,1,3,1,8,7,1,7,7,6,7,0,8,2,7 +M,3,3,4,2,2,9,6,7,3,6,7,6,6,6,1,5 +P,1,1,2,1,1,5,11,8,2,9,6,4,1,9,3,8 +D,3,7,4,5,4,8,8,6,5,9,6,4,3,8,3,6 +D,5,11,8,8,7,10,6,3,6,11,4,7,4,8,4,9 +O,2,3,3,2,1,8,7,6,4,9,6,8,2,8,2,8 +V,3,11,5,8,2,9,8,4,3,6,14,8,3,10,0,8 +X,2,2,4,4,2,7,7,3,9,6,6,8,2,8,6,7 +T,8,12,7,6,4,5,11,2,7,12,7,5,2,7,4,4 +J,3,10,4,8,4,9,6,2,5,11,4,9,1,6,2,6 +F,2,4,4,3,1,5,12,3,5,13,7,3,1,10,1,6 +I,0,0,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +L,4,11,5,8,3,3,3,5,9,1,0,7,0,7,1,6 +E,2,5,4,3,2,6,8,2,8,11,7,9,2,8,4,8 +R,3,1,3,2,2,7,8,5,5,7,5,7,2,6,4,8 +S,3,6,5,4,5,6,5,3,2,6,5,6,2,8,7,4 +R,3,6,5,4,3,10,7,3,5,11,2,6,3,7,2,10 +V,2,3,3,2,1,5,12,4,3,10,11,7,2,10,0,8 +P,4,8,6,6,5,6,7,5,4,7,6,9,5,8,6,10 +L,2,8,4,6,3,7,4,1,6,8,2,9,1,6,2,8 +F,4,9,5,7,5,6,8,6,4,8,6,8,3,11,8,10 +N,3,7,4,5,3,9,8,6,4,6,5,5,5,9,2,6 +X,3,4,5,3,2,10,7,2,8,10,3,7,2,7,3,9 +Q,3,5,4,6,4,8,7,7,3,5,7,10,3,8,5,10 +A,4,9,6,6,2,7,6,3,1,7,0,8,3,7,2,8 +N,6,10,9,8,9,6,8,3,5,8,7,7,9,8,8,4 +X,7,11,8,6,4,7,8,2,8,11,7,8,5,11,4,7 +R,5,10,7,8,6,7,8,6,5,8,5,9,4,6,6,12 +Y,5,6,4,9,3,9,9,2,3,6,10,5,3,10,5,8 +M,4,6,7,4,5,4,7,3,4,11,10,10,5,7,2,6 +S,3,7,4,5,2,8,7,5,9,5,6,8,0,8,9,7 +J,2,4,4,3,1,8,6,3,6,14,6,10,0,7,0,7 +B,4,8,5,6,6,6,7,8,5,7,6,7,2,8,7,9 +N,7,9,9,7,4,7,8,3,5,10,7,7,6,9,1,7 +Q,7,12,7,6,4,11,3,4,5,12,3,9,3,9,7,12 +Y,2,4,3,3,1,4,10,2,6,10,10,6,1,11,2,5 +Z,3,7,4,5,3,7,7,3,11,9,6,8,0,8,7,8 +C,3,6,4,4,2,6,8,8,8,9,8,13,2,10,4,9 +C,3,2,4,4,2,6,8,7,8,8,8,14,1,9,4,10 +W,2,0,2,0,1,7,8,4,0,7,8,8,6,9,0,8 +R,1,0,2,1,1,6,9,7,3,7,5,7,2,7,4,10 +P,4,6,6,4,4,9,7,2,6,13,5,6,1,10,3,10 +P,5,8,6,6,5,4,11,4,5,11,9,4,0,10,4,7 +D,5,8,6,6,4,8,8,7,7,10,5,4,3,8,4,8 +B,4,8,5,6,5,8,8,4,4,7,5,7,4,8,5,7 +Q,4,6,5,8,5,7,8,5,3,7,9,11,3,8,6,8 +B,4,7,5,5,5,7,7,7,6,7,6,7,2,8,6,10 +S,1,3,3,2,1,8,8,2,6,10,6,8,1,8,5,8 +O,6,12,4,6,3,6,8,5,5,9,5,6,5,9,5,8 +H,5,11,7,8,7,6,6,6,5,6,5,8,6,6,7,10 +I,1,4,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +I,5,8,6,6,3,7,5,2,7,7,7,9,1,10,4,8 +G,2,1,2,2,1,8,6,6,6,6,5,10,1,7,5,10 +W,3,3,5,5,3,7,8,4,1,7,8,8,8,10,0,8 +A,1,1,2,1,0,7,4,2,0,7,2,8,2,7,1,8 +J,2,6,2,4,1,15,4,3,5,12,1,7,0,8,0,8 +Q,5,7,7,10,11,8,6,5,2,6,6,8,11,12,10,15 +L,1,4,2,3,1,7,4,1,7,7,2,10,0,7,2,8 +I,0,6,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +D,7,11,10,8,6,8,7,7,8,9,5,4,4,8,6,11 +N,8,15,10,8,5,12,5,2,5,12,3,7,5,6,0,8 +I,1,3,1,4,1,7,7,0,7,7,6,8,0,8,2,8 +U,3,5,4,3,2,5,8,5,7,10,9,9,3,9,2,6 +I,1,5,2,4,1,7,7,0,7,13,6,8,0,8,1,7 +D,5,9,8,6,6,9,8,4,6,11,5,5,4,7,4,9 +E,3,6,5,4,4,8,7,5,2,7,6,9,4,8,7,10 +G,6,8,8,7,8,7,8,5,3,7,7,9,7,11,7,8 +V,4,7,5,5,2,9,12,2,3,4,11,9,3,12,1,7 +S,3,5,3,4,2,8,7,7,5,7,6,7,2,8,9,8 +R,3,6,5,4,4,8,9,4,5,8,4,8,3,5,4,11 +E,2,3,3,1,1,6,8,2,7,11,7,8,1,8,4,8 +M,5,9,5,6,6,8,5,11,0,6,8,8,8,6,1,6 +Y,6,7,6,5,3,4,9,1,8,10,10,6,1,10,3,4 +I,3,7,4,5,2,7,7,0,8,14,6,8,0,8,1,8 +E,5,10,7,8,5,10,7,2,9,11,3,8,3,8,5,12 +Q,5,7,6,9,6,8,5,8,4,6,5,9,4,8,6,9 +Z,1,3,2,2,1,7,7,5,8,6,6,8,2,8,6,8 +S,2,6,3,4,2,9,9,5,9,5,5,5,0,7,8,8 +W,7,11,7,8,7,2,10,2,3,10,10,8,7,11,1,7 +G,5,11,4,6,3,8,7,5,3,9,6,7,3,9,8,8 +T,5,7,6,5,3,4,13,4,5,12,9,4,2,12,2,5 +Q,5,9,7,11,7,8,7,8,4,5,6,10,3,8,7,10 +X,4,6,5,5,5,6,8,2,4,8,7,9,2,8,7,8 +A,3,7,5,5,3,11,3,2,2,9,1,9,3,5,2,8 +A,2,6,4,4,2,10,3,1,2,8,3,9,2,6,2,8 +W,4,5,6,8,4,4,8,5,2,7,8,8,8,10,0,8 +A,2,5,4,4,2,7,2,2,2,6,2,8,2,7,2,7 +Y,3,8,5,6,2,5,10,1,3,8,11,8,1,11,0,8 +L,4,9,5,6,4,6,4,4,8,3,2,5,4,6,2,5 +Z,6,7,4,11,4,8,5,4,4,11,6,8,3,9,10,8 +B,2,1,3,1,2,7,7,5,5,7,6,6,1,8,5,9 +X,4,5,7,4,3,9,6,1,9,10,4,7,2,8,3,8 +E,3,8,4,6,4,6,7,6,8,7,6,10,3,8,6,8 +J,2,10,3,8,1,12,3,10,3,13,6,13,1,6,0,8 +G,4,8,6,6,6,8,5,4,3,7,5,11,6,8,4,11 +X,5,10,6,8,4,7,7,4,4,7,6,7,3,8,4,8 +G,4,9,5,7,6,7,7,6,2,7,6,11,4,9,8,7 +Q,4,5,5,7,3,9,7,8,6,6,6,10,3,8,5,9 +Q,4,5,5,7,3,9,8,8,6,5,8,10,3,8,5,9 +Y,8,13,6,7,4,9,7,5,6,9,5,4,4,10,6,5 +U,4,9,4,6,2,8,5,14,5,6,14,8,3,9,0,8 +I,6,12,6,7,4,9,8,2,5,11,5,6,3,9,6,11 +A,2,7,4,5,3,11,2,2,2,9,2,9,2,6,2,7 +W,8,8,8,6,5,3,10,3,4,11,10,8,8,10,2,6 +Z,4,4,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +O,5,10,6,7,3,8,8,9,8,7,7,8,3,8,4,8 +X,4,8,6,6,3,9,7,1,8,10,2,7,3,8,4,9 +T,4,10,6,7,2,8,15,1,6,7,11,8,0,8,0,8 +O,8,14,5,8,4,6,6,6,3,9,7,9,5,9,5,8 +H,2,0,2,0,0,7,8,11,1,7,5,8,3,8,0,8 +V,6,11,9,8,5,7,11,3,2,6,11,9,3,10,3,9 +E,2,3,3,5,2,3,7,6,10,7,6,15,0,8,7,8 +K,1,0,1,0,0,4,6,6,2,7,6,11,3,7,2,10 +O,6,10,7,8,3,7,9,9,9,7,8,8,3,8,4,8 +W,4,3,5,5,3,8,8,5,1,7,8,8,8,9,0,8 +D,4,10,6,8,4,9,7,5,7,9,4,4,3,8,4,8 +P,6,10,5,5,3,6,10,6,2,11,5,5,4,10,4,8 +F,4,9,5,6,4,5,10,5,6,11,10,5,2,9,2,5 +M,1,0,2,0,1,7,6,9,0,7,8,8,5,6,0,8 +Y,3,3,4,2,1,4,11,2,7,11,10,5,1,11,2,5 +J,2,9,3,6,2,9,6,2,7,12,4,8,0,6,2,6 +Q,3,6,4,5,2,9,6,9,6,7,5,9,3,8,4,8 +M,8,9,11,7,7,6,7,3,5,9,9,9,8,6,2,8 +K,5,9,6,7,7,7,9,5,4,7,5,7,5,7,8,11 +T,4,9,5,7,3,5,14,1,6,9,10,7,0,8,0,8 +Y,3,6,4,4,1,8,11,2,2,5,12,8,1,11,0,8 +J,3,5,4,6,4,9,9,5,6,7,5,8,3,10,8,9 +J,3,11,4,8,3,9,6,3,7,12,4,9,1,6,2,6 +A,6,12,6,6,5,9,4,5,3,10,5,12,7,3,6,11 +F,9,13,7,7,4,6,11,3,5,13,6,4,2,8,6,6 +W,5,9,7,7,11,10,7,5,2,7,7,8,13,10,3,6 +N,5,10,5,8,6,7,7,13,1,6,6,8,5,9,0,7 +W,7,7,7,5,4,3,11,3,3,10,10,8,7,10,2,6 +G,7,9,7,7,5,6,7,6,6,10,8,11,2,9,4,10 +S,2,7,3,5,3,8,7,7,5,7,6,8,2,8,8,8 +D,3,1,4,3,3,7,7,6,7,7,6,5,2,8,3,7 +G,7,9,6,5,3,10,5,4,5,11,3,7,4,7,5,9 +H,6,7,9,5,6,9,7,3,6,10,4,7,5,7,4,9 +P,4,9,6,7,5,7,10,4,4,12,5,3,1,10,3,8 +M,3,3,5,2,3,7,6,3,4,9,8,9,6,5,2,9 +C,5,11,6,8,5,5,7,6,9,8,5,13,1,9,4,9 +G,6,9,8,7,8,7,10,6,3,5,5,11,5,7,8,7 +R,4,2,5,3,4,6,7,5,6,6,5,7,3,7,4,8 +H,4,5,7,4,4,8,8,3,6,10,6,8,3,8,3,8 +S,3,4,4,3,2,6,8,3,7,11,7,8,1,9,4,5 +W,4,9,6,7,3,8,8,5,2,6,8,8,8,10,0,8 +W,6,9,6,7,5,2,10,2,3,10,11,9,6,10,1,7 +M,3,2,4,3,3,8,6,5,4,7,7,8,7,5,2,7 +A,2,6,3,4,2,12,4,3,2,10,1,9,2,6,1,8 +N,6,11,7,9,3,7,7,15,2,4,6,8,6,8,0,8 +W,6,9,6,7,7,4,9,2,3,9,8,8,7,11,2,6 +Y,6,9,8,7,7,9,8,6,4,5,9,7,3,8,10,5 +H,8,13,8,7,6,9,6,4,5,11,3,7,7,8,5,8 +Z,5,6,4,9,4,9,4,4,3,11,6,9,2,10,8,8 +X,3,5,6,4,3,8,7,1,9,10,4,8,2,8,3,8 +C,4,7,5,5,3,7,9,8,6,5,6,12,4,8,3,8 +A,2,5,4,4,2,5,3,2,2,5,2,8,2,6,2,6 +N,3,7,5,5,5,7,8,3,4,8,7,8,6,9,5,4 +J,1,3,3,2,1,8,6,3,6,14,6,10,0,7,0,8 +D,4,6,5,5,5,7,8,4,7,6,4,8,4,8,5,5 +D,4,8,6,6,5,7,8,6,5,10,6,5,5,9,5,10 +E,4,8,4,6,4,3,6,5,9,7,7,14,0,8,6,9 +B,4,7,6,5,5,8,6,5,6,9,6,7,3,8,7,9 +U,4,8,5,6,3,6,9,5,6,7,9,9,3,9,1,8 +K,7,9,10,7,6,6,8,2,7,10,7,9,3,8,3,7 +P,1,0,2,1,0,5,11,7,1,9,6,4,1,9,3,8 +D,4,10,6,8,7,8,7,5,7,6,5,6,6,8,3,7 +H,2,1,3,2,2,8,8,6,5,7,6,8,3,8,3,8 +C,9,14,6,8,3,5,11,6,9,12,8,7,2,8,6,8 +P,3,6,4,4,3,5,11,7,3,10,7,2,1,10,3,6 +C,4,7,5,5,5,5,7,4,4,7,6,10,6,9,5,9 +U,7,10,7,8,4,4,8,6,8,10,10,9,3,9,2,5 +V,2,3,3,2,1,4,12,3,2,10,11,7,2,11,1,8 +N,6,7,8,6,7,7,8,5,4,7,5,7,7,9,6,3 +D,2,1,2,2,1,6,7,9,6,6,6,6,2,8,3,8 +M,5,11,6,8,4,8,7,12,2,6,9,8,8,6,0,8 +W,4,4,5,2,3,4,11,3,2,9,9,7,6,11,1,6 +H,7,11,9,8,6,7,7,6,7,7,6,6,6,8,4,7 +N,5,11,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +S,4,5,6,3,3,8,7,2,8,10,5,7,1,8,5,8 +I,5,12,4,6,2,12,4,3,5,12,2,7,2,8,2,11 +L,4,11,6,8,3,4,4,3,9,5,1,9,1,6,3,6 +Q,2,3,3,4,3,8,9,6,1,5,8,10,3,9,5,10 +O,3,5,4,3,3,8,7,7,5,7,6,8,2,8,3,8 +F,4,8,4,6,3,1,11,3,4,11,11,8,0,8,2,7 +M,11,15,11,8,6,7,10,4,5,4,5,10,10,11,2,7 +S,3,6,4,4,2,8,7,5,8,5,6,8,0,8,9,8 +M,6,8,8,6,8,8,9,6,4,7,7,8,6,9,6,7 +U,4,6,5,4,3,5,9,5,6,6,9,10,3,9,1,7 +L,5,12,5,6,3,9,3,3,5,11,4,11,2,8,5,9 +M,5,8,7,6,6,9,7,6,5,6,7,4,10,7,4,5 +L,1,0,1,1,0,1,1,5,5,0,1,6,0,8,0,8 +I,1,3,1,2,0,7,7,1,7,7,6,9,0,8,2,8 +U,6,8,7,6,3,3,9,6,8,12,12,9,3,9,1,7 +I,1,2,1,4,1,7,7,1,7,7,6,8,0,8,2,8 +X,5,11,7,8,4,5,8,2,8,10,11,10,3,8,4,5 +A,4,10,6,7,2,5,4,3,2,5,1,7,3,7,3,7 +M,7,7,10,5,7,5,7,3,5,10,10,10,11,8,4,8 +J,3,9,4,7,1,12,2,10,4,13,6,13,1,6,0,8 +M,4,8,5,6,5,7,6,6,5,7,7,10,7,5,2,8 +A,4,7,5,5,5,7,7,7,4,6,6,9,2,8,7,4 +M,4,7,7,5,4,4,6,4,4,11,11,11,6,6,2,7 +I,1,5,2,4,1,7,7,0,7,13,6,8,0,8,1,8 +P,4,9,6,7,4,10,7,3,5,12,4,5,3,8,4,9 +C,3,6,4,4,1,6,7,6,9,6,6,13,1,7,4,8 +Y,3,5,4,4,2,4,10,2,7,11,11,6,1,11,2,5 +Y,6,9,6,4,3,7,6,4,4,9,9,5,3,10,4,4 +O,4,4,6,6,3,6,8,9,8,7,6,6,3,8,4,8 +Z,6,9,6,4,4,9,5,4,8,11,4,9,3,6,6,9 +R,4,5,4,6,3,6,10,10,4,7,4,8,3,7,5,10 +L,2,4,4,3,2,7,3,2,7,8,2,10,0,7,2,8 +N,1,0,2,1,0,7,7,11,0,5,6,8,4,8,0,8 +P,3,7,5,5,3,7,10,3,5,13,5,3,1,10,3,9 +Q,3,6,4,4,3,8,5,7,4,6,6,8,3,8,3,8 +H,5,9,7,6,6,4,9,3,6,10,10,9,4,9,4,5 +J,8,12,6,9,4,10,6,2,5,12,5,7,2,10,6,12 +Z,7,14,7,8,5,6,7,2,9,12,7,8,4,6,7,6 +S,4,6,5,5,5,10,7,5,5,7,6,9,4,8,8,11 +H,8,10,8,5,4,9,8,4,5,8,3,5,6,7,4,8 +Z,3,9,4,6,3,7,7,6,11,6,6,8,1,8,8,8 +W,10,10,10,5,4,2,10,4,2,11,12,8,8,10,0,7 +D,3,8,5,6,4,10,6,3,6,10,3,5,3,8,3,8 +Y,6,8,8,11,12,8,9,4,2,7,8,9,4,11,9,8 +S,3,6,4,4,4,8,10,5,4,8,5,6,3,9,7,7 +F,5,10,8,8,8,10,6,2,5,9,5,6,5,9,4,7 +I,2,2,1,3,1,7,7,1,8,7,6,8,0,8,3,8 +U,6,10,9,8,12,8,8,4,4,6,7,8,10,5,9,8 +C,5,11,4,6,3,5,9,4,4,9,7,9,3,9,8,8 +F,1,1,2,2,1,6,10,4,4,10,8,5,1,9,3,7 +C,3,7,4,5,2,5,8,6,7,11,8,13,1,9,3,8 +I,2,9,2,7,2,7,7,0,9,7,6,8,0,8,3,8 +U,8,9,9,7,5,5,6,6,9,8,6,8,5,9,5,2 +K,5,5,5,8,2,4,6,9,2,7,7,11,4,7,3,11 +X,5,9,6,6,5,7,6,3,5,6,6,9,3,7,10,9 +C,4,7,5,5,2,5,8,7,10,6,7,11,1,7,4,8 +X,3,1,4,2,2,8,7,3,9,6,6,8,3,8,6,8 +F,1,3,3,2,1,8,9,2,5,13,5,5,1,9,2,9 +M,10,13,12,8,6,10,2,2,2,9,3,9,7,2,1,9 +W,2,1,4,3,2,9,10,3,2,6,9,7,5,11,0,8 +I,2,7,3,5,1,8,6,0,7,13,6,9,0,8,1,8 +H,2,1,3,2,2,7,7,6,6,7,6,8,3,8,4,8 +S,4,4,5,6,3,7,5,6,9,6,6,11,0,9,9,8 +F,4,8,6,9,7,7,8,4,4,7,6,7,5,9,10,8 +Q,6,9,6,5,4,12,4,3,5,10,3,8,3,9,6,12 +W,6,11,6,6,4,4,9,1,3,9,9,8,8,12,1,6 +R,4,3,4,4,2,5,11,8,3,7,4,8,2,7,6,11 +I,1,9,0,6,1,7,7,5,3,7,6,8,0,8,0,8 +X,4,9,6,6,5,7,7,3,9,5,6,8,3,8,6,8 +P,4,6,6,4,4,9,7,3,5,11,4,5,2,9,4,9 +D,1,0,1,1,0,5,7,7,5,6,6,6,2,8,2,8 +Z,2,4,4,3,2,7,8,2,9,11,7,7,1,8,6,6 +B,2,3,3,2,2,8,7,2,5,10,5,7,2,8,3,9 +B,2,5,4,3,3,9,7,2,6,10,5,6,2,8,5,9 +Y,4,6,5,8,7,10,9,5,3,6,7,8,6,11,7,5 +A,4,9,6,6,2,8,4,3,2,7,1,8,3,6,3,8 +F,2,1,2,2,1,6,10,5,5,10,9,5,1,9,3,6 +M,3,7,4,5,4,9,6,5,4,6,7,6,7,5,2,6 +C,7,14,5,8,5,6,6,4,4,10,9,12,4,9,9,8 +N,6,9,9,7,4,7,8,3,5,10,6,7,6,9,1,7 +P,6,8,8,6,5,5,14,6,2,12,6,2,1,10,3,7 +O,4,2,5,4,3,8,7,8,5,7,6,8,2,8,3,8 +O,4,8,5,6,4,7,8,7,4,10,7,9,3,8,3,7 +B,5,8,7,6,6,10,6,3,6,10,4,7,3,8,5,10 +G,6,8,8,6,7,7,10,6,5,6,6,8,5,6,7,7 +S,3,10,4,7,4,8,6,8,6,7,8,10,2,10,9,7 +Z,6,10,6,5,3,9,5,2,8,11,5,9,2,9,5,9 +H,8,11,11,8,6,10,6,4,7,11,1,7,6,8,5,10 +Q,4,7,5,8,5,9,7,7,3,5,7,10,3,8,6,10 +L,3,7,4,5,3,9,3,1,7,9,2,10,0,6,2,10 +Z,4,6,5,4,3,9,5,3,8,11,4,9,2,7,6,10 +Q,3,3,4,5,3,8,7,7,3,5,6,9,3,8,5,9 +Q,2,5,3,6,3,9,10,6,1,3,7,11,2,10,5,11 +Y,6,8,6,6,4,4,9,1,8,11,10,6,1,10,2,4 +F,1,0,1,0,0,3,12,4,2,11,8,5,0,8,2,7 +M,3,7,4,5,4,8,6,5,4,7,7,8,7,5,2,7 +U,2,1,3,1,1,7,5,11,5,7,14,8,3,10,0,8 +F,3,4,3,5,1,1,12,5,4,11,10,7,0,8,3,6 +H,4,9,6,6,7,7,8,6,7,7,5,8,3,8,3,8 +F,4,10,6,8,5,7,9,3,5,12,7,6,2,9,2,7 +V,6,8,6,6,3,3,12,4,4,10,12,7,2,10,1,8 +X,3,4,5,3,2,7,8,1,8,10,7,8,2,8,3,7 +I,1,3,0,2,0,7,7,1,7,7,6,8,0,8,2,8 +E,5,9,4,4,2,9,6,4,4,11,4,10,3,8,6,11 +E,6,9,8,8,9,7,7,5,4,7,7,10,9,12,11,12 +E,4,8,6,6,4,5,8,5,8,11,10,9,3,8,5,5 +I,4,6,6,4,3,6,7,3,8,7,6,11,0,8,4,8 +X,3,9,4,7,3,8,7,4,4,7,6,9,2,8,4,8 +H,5,7,7,5,5,7,7,2,6,10,6,8,3,8,3,7 +U,2,1,3,2,1,7,9,5,6,7,10,9,3,9,0,8 +H,8,10,11,8,9,5,8,3,7,10,10,9,7,11,6,6 +S,5,8,7,6,8,8,5,4,4,9,6,10,4,8,9,9 +O,4,10,5,8,3,8,7,9,7,7,6,8,3,8,4,8 +Q,6,7,6,9,5,7,10,5,3,7,10,11,4,10,7,8 +Z,6,11,7,8,6,7,8,3,13,9,6,8,0,8,8,7 +N,3,5,4,4,3,7,8,5,5,7,7,6,5,9,2,6 +Z,1,0,2,1,0,7,7,2,10,8,6,8,0,8,6,8 +I,0,8,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +Q,5,11,5,6,4,11,5,4,6,10,4,7,4,9,6,12 +U,9,12,8,7,3,6,5,4,6,3,8,6,6,7,2,7 +T,6,8,6,6,3,5,14,5,6,12,9,2,2,12,2,4 +C,4,9,5,6,2,6,8,7,10,4,6,14,1,7,4,9 +I,1,5,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +Z,7,8,5,11,5,8,5,5,5,11,7,8,3,9,10,7 +I,1,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +C,3,5,4,3,2,6,7,7,7,8,7,14,2,9,4,10 +Y,9,10,8,8,4,3,10,4,7,13,12,6,2,11,3,6 +V,7,9,5,4,3,9,7,6,4,7,9,7,7,12,3,7 +R,5,11,6,8,4,6,9,10,5,6,5,8,3,8,6,11 +Q,4,8,6,6,5,8,4,8,5,6,6,8,3,8,3,8 +C,2,1,2,2,1,6,8,6,7,8,7,13,1,9,3,10 +M,9,10,13,8,10,3,8,4,5,10,11,11,12,8,6,6 +Q,5,12,5,6,4,10,5,4,6,11,4,8,3,8,8,11 +Y,3,3,4,1,1,4,10,2,7,10,10,5,1,10,3,4 +T,3,5,5,4,4,6,8,5,6,8,8,8,3,10,6,7 +E,5,11,5,8,3,3,8,6,12,7,6,15,0,8,7,6 +U,4,7,5,5,4,6,8,8,5,5,6,11,4,9,5,5 +Z,4,7,6,5,3,7,7,2,10,11,6,8,1,8,6,8 +R,5,9,6,7,6,7,7,4,6,6,5,7,3,7,5,9 +W,6,11,8,8,4,5,8,5,2,7,8,8,9,9,0,8 +I,5,7,7,8,6,9,8,5,5,6,5,8,3,8,9,7 +W,2,3,3,1,2,5,10,4,2,9,8,7,5,10,1,6 +F,3,7,6,5,5,8,8,1,4,9,6,6,3,10,4,4 +K,3,5,5,4,3,5,8,1,6,10,8,10,3,8,3,8 +G,4,8,4,6,3,7,7,6,7,11,6,10,2,10,4,9 +Y,3,8,6,6,3,5,9,2,6,8,12,10,2,11,2,7 +N,2,1,2,2,1,7,8,6,4,7,6,7,4,8,1,7 +R,6,10,8,7,8,8,8,7,5,7,5,8,5,9,7,12 +B,5,8,8,6,6,11,5,2,6,10,3,7,5,7,6,12 +R,2,4,4,3,2,8,8,3,5,9,4,7,2,6,3,10 +Z,1,3,2,1,1,8,7,1,8,11,6,8,1,8,5,8 +K,6,11,8,8,6,4,7,2,7,10,10,12,3,8,4,7 +F,3,5,5,3,2,7,9,2,6,13,6,5,4,9,3,7 +N,3,2,4,4,3,7,9,5,4,7,7,7,5,9,2,6 +L,2,0,2,1,0,2,1,6,5,0,2,4,0,8,0,8 +P,2,1,2,2,1,5,11,5,3,10,7,3,0,9,3,6 +G,4,4,5,7,2,7,7,8,8,6,6,11,1,8,5,11 +Z,4,11,6,8,7,8,7,2,8,7,6,8,0,8,9,8 +Q,1,0,1,0,0,8,7,6,2,6,6,9,2,8,2,8 +X,1,1,2,1,0,7,7,4,4,7,6,8,2,8,4,7 +Y,1,0,2,1,0,7,9,1,2,6,12,8,1,10,0,8 +F,4,6,6,4,3,7,9,3,6,13,6,5,2,9,2,7 +S,5,9,8,7,9,5,7,3,2,7,6,5,3,8,9,2 +P,12,13,9,8,4,7,9,6,4,12,3,4,5,10,5,8 +Z,4,10,5,8,2,7,7,4,14,10,6,8,0,8,8,8 +N,6,10,8,5,3,12,4,5,3,13,1,7,5,7,0,8 +Z,8,12,8,6,5,8,5,2,8,12,6,10,3,7,7,8 +K,4,9,6,6,6,7,6,5,4,6,6,7,7,6,8,12 +I,1,3,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +H,5,9,6,6,3,7,10,15,2,7,3,8,3,8,0,8 +I,0,4,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +D,7,12,7,7,5,9,6,4,7,10,5,7,6,8,8,6 +O,3,7,5,5,6,8,6,5,2,7,6,8,8,9,5,10 +J,2,8,3,6,2,14,4,4,4,13,2,8,0,7,0,8 +D,2,3,2,2,1,7,7,6,6,7,6,4,2,8,3,6 +T,3,7,5,5,3,6,11,4,6,8,11,8,2,12,1,7 +V,3,9,5,6,1,7,8,4,3,7,14,8,3,9,0,8 +B,4,10,5,8,7,6,8,8,5,7,5,7,2,8,7,9 +J,2,8,3,6,1,13,3,8,4,14,3,11,0,7,0,8 +P,5,10,7,7,4,8,9,2,7,14,5,4,3,9,4,9 +O,6,10,7,7,5,8,6,8,6,10,6,9,4,8,5,5 +G,6,11,6,8,4,6,7,7,6,9,8,11,3,7,6,8 +Y,3,7,5,5,4,8,6,5,4,6,8,7,2,8,8,4 +C,2,4,3,3,1,6,8,7,7,8,8,13,1,10,4,10 +Y,7,11,8,8,5,3,9,2,7,9,11,7,2,11,3,5 +Y,5,7,7,11,10,8,11,3,3,6,8,9,4,11,11,7 +G,5,11,6,8,9,7,5,4,4,7,5,11,7,8,9,14 +I,1,3,0,2,0,7,7,1,7,7,6,8,0,8,2,8 +E,3,2,3,4,3,7,7,5,8,7,6,8,2,8,6,9 +T,2,4,2,2,1,8,12,3,5,6,10,8,2,11,1,8 +C,4,9,5,7,2,5,7,7,10,7,7,12,1,8,4,8 +H,11,14,10,8,5,8,7,4,5,9,6,7,7,10,5,9 +K,4,10,6,8,7,7,7,5,4,7,6,7,7,6,8,13 +Z,3,8,4,6,2,7,7,4,13,9,6,8,0,8,8,8 +U,8,13,8,7,5,6,6,4,5,6,7,8,5,6,3,7 +A,3,5,5,4,2,10,2,2,2,9,2,9,2,6,2,8 +K,4,9,6,7,6,5,6,4,7,6,6,10,3,8,6,10 +Q,3,6,4,5,3,9,8,7,4,5,7,10,2,8,4,9 +M,3,6,4,4,2,8,6,11,1,6,9,8,7,6,0,8 +F,6,10,8,7,4,5,13,2,6,13,6,2,1,10,2,6 +H,4,5,5,4,4,7,7,6,6,7,6,8,3,8,3,7 +Y,3,8,5,6,2,8,10,2,2,6,12,8,1,11,0,8 +S,1,3,2,2,1,8,7,6,5,7,6,7,2,8,8,8 +Y,3,9,5,6,1,7,10,3,2,7,13,8,2,11,0,8 +K,4,8,6,6,5,8,5,1,6,10,4,9,3,8,4,10 +Y,3,9,5,6,1,7,11,1,3,7,12,8,1,10,0,8 +J,3,6,5,4,2,7,4,5,3,13,9,14,1,6,1,6 +W,5,11,7,8,4,7,7,5,2,7,8,8,9,9,0,8 +O,4,7,6,6,4,8,4,3,4,9,3,8,3,7,4,9 +N,11,15,9,8,4,7,10,5,5,4,5,11,6,11,2,6 +Q,7,12,7,6,5,9,6,4,7,11,5,8,4,8,9,10 +E,4,10,4,7,3,3,8,6,11,7,5,15,0,8,7,7 +P,3,4,5,6,5,8,9,3,2,7,8,6,5,10,5,5 +K,6,8,8,6,4,3,9,3,7,11,11,11,4,7,4,5 +Q,7,15,6,8,4,10,4,4,7,10,4,8,3,9,7,13 +P,5,8,7,11,12,7,11,5,0,9,7,6,5,10,6,8 +Z,3,8,4,6,3,9,6,5,10,7,5,6,1,7,8,8 +S,6,10,7,8,4,8,7,4,8,11,6,7,2,8,5,8 +P,3,7,3,4,2,3,13,7,2,11,6,3,1,10,4,8 +U,4,4,4,6,2,7,5,13,5,7,14,8,3,9,0,8 +Z,3,2,4,4,2,7,7,5,10,6,6,8,1,8,7,8 +O,4,7,6,6,4,8,5,3,4,8,3,7,3,7,5,9 +D,3,7,5,5,4,8,8,5,5,9,6,4,3,8,3,7 +Q,4,6,4,8,5,8,5,6,4,9,5,9,3,8,5,7 +R,4,8,4,5,2,5,12,8,4,7,3,9,3,7,6,11 +A,3,5,6,4,3,11,1,2,2,9,2,9,3,7,3,9 +A,2,2,4,4,2,8,2,2,2,8,2,8,2,6,3,7 +G,3,4,4,2,2,6,7,5,5,10,7,9,2,9,4,9 +N,5,10,6,8,6,6,7,8,5,7,5,6,3,7,3,8 +E,7,10,9,8,6,7,8,2,10,11,6,9,2,8,5,8 +V,3,1,5,3,1,7,12,3,3,6,11,9,2,10,1,8 +Y,5,7,7,11,10,8,9,3,2,5,8,10,6,13,9,9 +C,5,10,4,5,3,8,7,4,2,8,8,10,3,9,7,13 +R,4,6,4,8,3,5,12,9,4,7,2,9,3,7,6,11 +F,2,3,3,1,1,7,9,2,5,13,6,5,1,9,2,8 +O,5,11,6,8,6,7,8,7,3,10,8,8,4,7,5,10 +D,3,8,4,6,4,5,7,9,6,7,6,5,3,8,3,9 +H,4,7,5,5,4,6,7,6,4,6,5,8,3,7,6,10 +C,4,9,4,4,3,7,8,4,3,9,8,10,3,9,8,11 +V,2,3,3,2,1,8,12,2,2,5,10,9,2,11,0,8 +O,2,0,2,1,0,7,7,6,5,7,6,8,2,8,3,8 +X,3,4,5,3,2,7,7,1,8,10,6,8,2,8,3,8 +M,8,10,12,8,9,10,6,2,5,9,5,7,8,7,2,8 +L,1,4,3,2,1,6,4,1,7,8,2,11,0,7,2,9 +E,4,7,6,5,3,8,7,2,9,11,5,8,2,8,5,10 +O,4,8,6,6,2,8,5,8,8,7,4,9,3,8,4,8 +Z,3,3,4,5,2,7,7,4,13,9,6,8,0,8,8,8 +X,4,5,6,4,3,7,7,1,9,10,6,8,2,8,3,7 +F,5,10,7,7,4,7,10,3,6,13,7,5,2,10,2,7 +D,3,4,4,3,3,7,7,7,6,7,6,4,2,8,3,7 +J,2,8,2,6,1,13,3,8,4,13,3,11,1,6,0,8 +V,4,6,5,4,2,4,12,3,3,10,11,7,2,10,1,8 +N,4,6,4,4,2,7,7,14,1,5,6,8,6,8,0,8 +P,5,10,7,8,6,5,11,7,4,10,7,2,2,11,4,7 +L,2,6,4,4,2,6,4,1,9,8,2,11,0,7,2,8 +N,4,7,6,5,3,11,6,4,5,10,1,5,5,9,1,7 +M,7,6,7,8,4,8,7,13,2,6,9,8,9,6,0,8 +J,3,11,4,8,2,9,4,5,8,12,4,12,1,6,2,6 +Z,2,6,3,4,1,7,7,3,13,9,6,8,0,8,8,8 +V,6,9,5,7,3,3,11,3,4,10,12,8,2,10,1,8 +X,3,2,4,3,2,7,7,3,9,6,6,8,3,8,6,7 +C,4,10,6,8,5,8,6,9,6,8,6,11,4,9,4,8 +M,6,5,8,4,7,9,8,5,4,7,6,7,9,8,5,3 +Z,2,2,3,4,2,8,7,5,9,6,6,8,1,8,7,8 +G,5,7,6,5,6,7,6,5,3,7,6,9,5,8,7,7 +I,4,11,5,8,3,9,6,0,8,14,5,8,0,8,1,8 +G,5,9,7,7,4,6,7,7,7,6,6,12,3,9,5,7 +E,4,10,4,7,4,3,7,5,9,7,7,13,0,8,7,9 +D,3,2,5,3,3,7,7,6,7,7,6,5,2,8,3,7 +B,5,7,7,5,6,8,6,6,6,9,7,7,3,8,7,9 +R,6,9,8,7,8,8,6,7,3,8,5,7,4,6,7,10 +U,4,5,5,4,2,4,8,5,7,10,9,8,3,9,2,6 +D,2,4,4,3,2,9,6,4,6,10,5,6,2,8,2,9 +S,1,3,3,2,1,7,8,3,7,10,7,8,1,8,4,6 +A,5,11,4,6,3,10,2,3,1,9,4,11,3,4,4,8 +K,6,9,8,6,7,9,6,1,6,10,3,8,6,7,5,9 +L,1,0,1,1,0,2,1,5,5,0,2,5,0,8,0,8 +F,3,2,4,3,2,5,11,4,6,11,9,5,1,10,3,6 +C,3,4,4,6,2,6,7,7,9,8,5,13,1,9,4,9 +T,2,5,4,4,3,7,8,4,7,7,7,8,3,9,6,7 +Q,3,7,4,6,2,8,8,8,5,5,8,9,3,7,6,10 +M,3,2,4,3,4,8,6,6,4,7,7,8,7,6,2,7 +M,11,14,11,8,6,9,11,6,4,4,6,9,11,12,3,7 +C,3,4,4,3,2,4,7,5,7,10,8,13,1,9,3,8 +O,3,5,4,4,3,7,7,7,4,9,5,7,2,8,3,7 +B,5,10,7,8,7,8,8,4,5,7,6,7,7,7,6,9 +U,5,8,5,6,2,7,4,14,6,7,14,8,3,9,0,8 +O,4,7,6,5,4,7,5,8,5,8,5,11,3,8,4,8 +O,4,6,6,5,4,7,5,5,4,8,4,7,3,7,4,8 +C,5,10,6,7,4,5,7,7,10,7,6,11,2,8,5,11 +K,6,10,9,7,7,4,8,2,7,10,10,11,4,7,4,6 +E,3,2,4,4,3,7,7,5,8,7,5,9,2,8,6,10 +C,3,7,4,5,2,3,7,5,6,9,8,14,1,8,3,9 +H,3,6,5,4,6,9,7,4,4,6,6,8,7,8,6,7 +A,4,9,6,6,2,6,4,3,1,6,1,8,3,7,2,7 +R,4,7,4,4,2,5,10,8,3,7,4,8,3,7,6,11 +E,3,6,4,4,4,7,7,5,8,7,7,9,3,8,6,9 +S,6,9,7,7,5,7,8,3,7,10,7,8,2,8,5,6 +E,2,7,3,5,3,3,8,5,9,7,6,13,0,8,6,9 +B,5,9,8,8,9,7,7,5,4,7,6,8,7,9,9,6 +S,7,12,7,7,3,7,7,5,3,13,9,10,3,10,3,8 +Z,2,5,4,4,2,7,8,2,9,11,7,7,1,8,5,7 +H,6,11,9,9,8,10,6,3,6,10,3,7,6,8,5,10 +V,8,11,8,8,5,3,12,2,3,9,10,7,5,11,2,6 +K,5,8,8,6,4,4,8,3,7,10,10,11,4,8,4,6 +O,3,7,5,5,3,8,6,7,4,7,5,8,3,8,3,7 +K,4,9,6,7,8,7,7,3,4,6,6,8,7,8,8,7 +A,9,15,7,8,4,8,1,2,2,9,4,12,4,5,5,6 +M,7,10,9,8,11,8,6,6,5,7,5,8,6,9,8,8 +S,4,6,5,4,2,8,7,3,8,11,6,7,2,8,5,8 +X,2,3,3,4,1,7,7,4,4,7,6,8,2,8,4,8 +C,2,6,3,4,1,4,7,7,9,7,6,11,1,9,4,9 +E,4,9,4,7,3,3,7,6,10,7,6,14,0,8,8,7 +B,4,9,4,7,3,6,6,9,7,6,6,7,2,8,9,10 +W,2,1,3,2,2,8,10,2,2,6,9,8,5,11,0,8 +K,4,10,6,8,6,7,7,5,4,7,5,8,4,7,9,10 +Z,4,9,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +C,6,10,6,8,4,4,9,7,7,13,10,8,2,10,2,7 +A,3,4,6,6,2,7,5,3,1,7,0,8,2,7,2,8 +K,2,3,4,2,2,5,9,1,6,10,8,9,3,8,2,8 +P,4,7,6,5,4,7,10,2,6,13,6,4,0,10,3,9 +E,5,9,7,7,8,6,7,3,6,7,7,11,4,10,8,7 +V,6,12,6,7,3,5,11,4,3,10,8,5,4,11,2,8 +V,4,8,5,6,3,7,9,4,1,7,13,8,2,10,0,8 +S,3,9,4,7,2,7,6,6,10,5,7,10,0,9,9,8 +S,4,10,5,8,4,7,7,5,8,5,6,9,0,8,8,8 +X,4,8,7,6,3,8,6,1,8,10,4,8,3,8,3,8 +K,3,4,4,6,2,3,7,8,3,7,6,11,4,8,2,11 +I,1,4,2,3,1,7,8,0,7,13,6,8,0,8,1,7 +P,3,4,3,5,2,4,11,8,3,10,6,4,1,10,3,8 +L,3,7,4,5,2,8,4,1,7,9,3,9,1,6,2,9 +L,3,8,5,6,6,7,7,3,5,6,7,10,6,11,6,6 +F,5,10,5,6,4,7,10,2,5,11,6,5,4,10,7,7 +R,2,1,2,1,1,6,9,8,3,7,5,7,2,7,4,10 +H,4,4,6,3,3,8,7,3,6,10,6,8,3,8,3,8 +B,2,3,2,1,2,7,8,5,5,7,5,6,1,8,5,9 +Q,2,4,3,5,3,7,8,5,1,7,8,10,2,9,4,8 +Y,2,5,4,4,2,6,10,1,7,7,11,9,1,11,2,9 +V,4,7,6,6,6,6,8,5,5,8,6,8,6,9,8,7 +H,4,8,4,5,2,7,8,15,1,7,5,8,3,8,0,8 +I,1,9,0,6,0,7,7,4,4,7,6,8,0,8,0,8 +N,2,3,2,2,2,7,9,6,3,7,6,8,4,8,1,7 +N,1,0,2,1,1,7,7,11,1,5,6,8,4,8,0,8 +U,4,9,6,6,3,4,9,7,7,10,11,9,3,9,1,8 +U,4,7,5,5,2,7,3,14,6,7,13,8,3,9,0,8 +F,2,3,3,1,1,6,12,3,4,13,7,3,1,9,1,7 +J,1,1,2,2,1,10,6,3,5,12,4,10,1,7,1,7 +L,6,11,8,9,6,10,3,1,7,10,2,10,3,6,4,10 +P,3,4,3,6,2,3,14,8,2,12,7,3,0,10,4,8 +W,11,11,10,6,4,6,11,2,3,7,10,6,8,12,1,7 +W,9,10,13,9,15,8,7,5,5,7,6,8,12,10,10,4 +P,2,4,4,3,2,6,10,3,4,12,5,3,1,10,2,8 +I,0,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +T,6,9,5,4,2,5,10,2,7,13,7,5,2,8,4,4 +Z,5,8,7,6,4,8,7,2,10,12,6,7,1,7,6,7 +F,4,8,6,6,4,6,10,2,5,13,7,5,2,10,2,7 +I,2,2,2,4,2,7,7,1,8,7,6,8,0,8,3,8 +H,6,10,7,6,5,8,7,3,5,10,7,7,7,11,5,8 +S,3,6,5,4,5,8,7,4,3,8,5,8,4,9,10,10 +N,8,12,10,6,4,3,11,6,3,14,12,9,6,10,0,8 +E,6,11,4,6,3,7,8,4,4,10,5,9,3,9,7,10 +U,5,10,5,7,4,7,5,13,5,7,12,8,3,9,0,8 +K,1,0,2,1,0,5,7,7,1,7,6,11,3,8,2,11 +O,2,0,2,1,0,7,7,6,5,7,6,8,2,8,3,8 +X,4,9,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +V,2,1,3,3,1,7,12,2,2,7,11,8,2,10,1,8 +X,1,0,1,0,0,7,7,3,5,7,6,8,2,8,4,8 +R,3,7,4,5,4,6,8,8,4,7,5,7,2,7,4,11 +A,6,8,8,6,7,6,7,7,5,7,5,9,4,8,11,3 +L,2,4,3,3,1,4,4,4,7,2,2,6,0,7,1,6 +J,1,1,2,2,0,10,6,2,5,12,4,9,0,7,1,7 +F,4,9,7,7,7,5,8,2,4,10,8,7,8,10,4,4 +C,3,9,4,7,2,5,7,7,9,6,6,13,1,7,4,8 +C,6,9,8,8,8,5,9,4,6,6,6,11,4,11,8,9 +X,6,11,8,8,7,8,6,3,6,6,7,7,4,8,10,10 +R,5,7,7,5,4,10,6,2,6,11,2,7,3,6,3,10 +M,7,8,9,7,10,7,9,4,4,7,6,7,10,7,6,5 +E,2,0,2,1,1,5,8,5,8,7,6,12,0,8,7,9 +W,6,9,6,4,3,2,8,2,3,9,11,9,7,9,1,6 +Y,9,14,8,8,4,6,8,4,4,10,9,5,5,10,5,4 +G,4,6,5,4,3,5,9,5,5,10,8,7,2,8,5,9 +P,6,11,9,8,7,8,10,4,4,12,5,3,1,10,3,8 +B,5,9,6,7,5,6,8,9,8,7,5,7,2,8,9,9 +V,4,8,6,6,3,5,11,3,4,8,12,9,2,10,1,8 +L,4,8,5,6,2,4,5,2,9,5,1,9,1,7,3,6 +V,3,7,5,5,5,7,7,4,2,8,8,8,5,10,4,8 +L,3,10,5,8,3,9,3,1,8,10,2,10,0,6,3,10 +X,4,3,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +N,5,8,7,6,5,7,9,5,5,7,6,6,7,8,3,7 +Y,7,10,7,8,4,5,9,2,9,10,11,5,4,9,6,3 +X,5,7,7,5,3,7,7,1,8,10,5,8,3,8,3,7 +J,3,5,4,8,2,11,3,11,3,12,8,13,1,6,0,8 +E,1,3,3,2,1,6,7,2,7,11,7,9,1,8,4,9 +C,5,7,5,5,3,6,8,6,8,12,8,12,2,10,3,7 +L,3,10,5,7,3,6,4,1,8,7,1,9,0,6,2,8 +R,4,10,5,8,3,5,9,9,4,7,6,8,3,8,6,11 +F,5,7,7,5,3,7,10,2,7,14,5,4,2,9,4,7 +D,4,7,4,5,2,5,8,10,9,8,7,5,3,8,4,8 +K,5,11,5,8,5,3,7,7,3,7,6,11,3,8,3,11 +R,2,1,3,3,2,6,7,4,5,6,5,7,2,6,4,8 +T,2,6,3,4,2,8,12,2,8,5,11,9,1,11,1,8 +Q,5,7,6,9,7,9,8,7,2,5,7,10,3,8,6,10 +F,5,11,7,8,5,7,9,1,6,13,6,5,1,10,2,8 +T,3,4,4,2,1,5,12,2,7,11,9,4,1,10,2,5 +X,3,7,4,4,1,7,7,5,4,7,6,8,3,8,4,8 +U,6,10,7,8,4,4,8,6,8,9,9,9,3,10,2,5 +B,4,7,6,5,4,7,8,6,5,9,6,6,3,8,6,8 +P,3,9,4,6,2,5,10,10,3,9,6,4,2,10,4,8 +E,3,8,3,6,2,3,7,6,11,7,6,15,0,8,6,7 +H,5,9,7,7,7,7,7,5,7,7,6,7,6,8,4,7 +H,5,4,6,6,2,7,7,15,0,7,6,8,3,8,0,8 +S,5,5,6,7,3,7,6,6,10,5,6,10,0,9,9,8 +U,7,9,7,7,4,4,7,6,8,9,9,9,3,9,3,5 +K,4,11,4,8,2,3,7,8,2,6,5,11,4,8,2,11 +K,1,0,1,0,0,4,6,5,2,7,6,10,2,7,1,10 +R,3,8,4,5,2,6,10,9,4,7,4,8,3,7,5,11 +P,6,11,8,8,5,7,12,8,3,11,4,2,1,10,5,7 +M,6,7,9,6,9,6,8,5,3,6,5,8,12,8,5,8 +Y,5,6,7,9,10,8,4,5,3,7,8,9,8,8,6,8 +H,4,7,5,5,4,6,6,6,4,6,5,8,2,7,6,9 +X,6,11,9,8,5,8,6,1,9,10,4,8,3,8,4,8 +P,8,11,6,6,3,9,7,6,4,13,3,6,5,9,4,8 +B,4,9,6,6,6,8,8,4,5,10,5,6,3,8,5,10 +I,1,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +U,3,4,4,3,2,4,8,5,7,9,8,9,3,10,2,5 +I,2,9,3,7,4,7,7,0,7,7,6,8,0,8,3,8 +Z,5,5,6,8,3,7,7,4,15,9,6,8,0,8,9,8 +Z,4,5,5,8,2,7,7,4,14,10,6,8,0,8,8,8 +K,2,3,4,2,2,6,7,2,6,10,7,10,3,8,2,7 +H,3,7,4,5,4,7,7,7,6,7,7,8,3,8,3,7 +B,5,7,8,6,8,7,7,5,4,7,6,8,6,9,8,6 +G,4,4,5,6,2,8,5,7,9,8,4,12,1,9,5,10 +B,2,4,4,2,2,9,7,2,5,10,5,6,2,8,4,9 +Z,2,7,3,5,1,7,7,3,12,9,6,8,0,8,8,8 +L,5,11,6,8,5,4,4,4,8,2,1,6,1,6,1,5 +X,6,12,6,6,3,10,6,3,8,9,2,6,4,6,4,10 +T,2,7,3,5,2,6,13,0,5,8,10,8,0,8,0,8 +C,4,4,6,7,2,5,7,7,10,7,6,12,1,9,4,9 +B,3,6,5,5,5,6,9,6,6,8,7,7,5,9,7,8 +L,2,8,3,6,1,0,1,5,6,0,0,7,0,8,0,8 +U,6,10,9,8,11,8,5,4,4,7,7,7,11,8,6,10 +V,2,6,4,4,2,8,12,2,2,5,10,9,2,11,0,9 +O,6,10,8,8,5,7,7,9,4,7,6,8,3,8,4,8 +K,2,1,2,2,2,5,7,4,6,7,6,10,3,8,3,10 +Z,2,4,3,3,2,7,7,5,9,6,6,8,2,8,7,8 +N,5,10,5,8,5,7,7,13,1,6,6,8,6,9,0,6 +R,2,0,2,1,1,6,10,8,2,7,5,8,2,7,4,10 +T,4,9,6,7,5,6,11,2,7,8,11,8,1,12,1,8 +P,3,8,5,6,4,6,9,3,6,9,8,5,4,10,4,7 +S,1,3,3,2,1,8,7,3,6,10,6,7,1,8,5,8 +A,5,9,5,5,3,10,2,4,2,11,5,12,5,3,5,10 +Y,2,1,3,3,1,8,11,1,7,6,11,7,1,11,2,7 +A,4,11,7,8,2,7,5,3,1,6,1,8,3,7,2,7 +D,6,12,6,6,5,8,6,3,6,10,5,7,5,8,8,6 +R,4,8,6,6,7,5,6,3,4,7,5,9,6,10,7,5 +U,5,7,7,5,8,7,7,4,4,7,7,8,10,9,6,8 +L,3,3,3,5,1,0,1,6,6,0,0,6,0,8,0,8 +H,5,7,8,5,6,9,7,3,7,10,3,7,5,8,4,9 +L,2,7,2,5,1,0,1,5,6,0,0,7,0,8,0,8 +T,6,7,6,5,4,7,10,2,7,11,9,5,3,11,4,4 +V,3,8,4,6,3,7,11,2,3,6,11,9,2,10,1,9 +X,3,4,5,3,2,7,8,4,9,6,6,7,4,9,7,7 +D,4,8,4,6,3,5,8,10,9,8,7,6,3,8,4,8 +M,2,1,3,2,2,8,6,6,3,7,7,9,6,5,1,8 +D,4,6,5,4,4,9,7,4,6,10,4,5,3,8,3,8 +D,4,11,6,8,7,9,7,4,5,10,4,6,4,7,3,8 +H,3,3,5,2,2,5,9,3,5,10,9,8,3,9,3,6 +R,4,9,6,7,5,10,7,3,6,10,3,7,3,6,4,10 +U,2,3,3,2,1,4,8,4,6,11,10,9,3,9,1,7 +K,3,5,5,4,3,5,7,4,8,7,6,11,3,8,5,9 +X,8,11,8,6,4,4,10,4,8,11,10,9,4,9,3,5 +C,4,7,4,5,2,4,7,6,7,9,8,15,1,8,3,8 +J,2,8,3,6,2,14,4,4,4,12,2,9,0,7,0,8 +D,3,7,4,5,4,10,6,3,6,10,4,7,3,8,3,9 +N,1,0,1,1,0,7,7,10,0,5,6,8,4,8,0,8 +U,4,5,5,4,2,3,8,4,6,11,11,9,3,9,1,6 +S,4,9,4,5,2,7,8,4,3,13,8,8,2,10,3,8 +C,2,1,2,2,1,7,8,7,6,8,7,11,2,9,3,10 +Q,4,8,5,9,5,8,6,7,4,9,7,9,3,9,6,9 +Q,5,8,7,9,6,8,5,8,5,6,6,9,3,8,6,10 +B,5,9,5,7,7,6,7,8,6,6,6,7,2,8,7,10 +Q,4,9,5,10,5,9,8,8,2,5,7,11,4,9,6,8 +K,3,1,4,2,3,6,7,4,7,7,6,10,6,8,4,9 +I,2,7,3,5,1,9,6,0,7,13,5,8,0,8,1,8 +M,3,3,4,5,3,7,7,12,1,8,9,8,8,6,0,8 +O,3,6,4,4,3,7,7,7,5,7,6,8,2,8,3,7 +F,3,7,5,5,3,9,8,2,6,13,4,5,2,10,3,9 +B,4,8,6,6,4,8,8,4,7,10,5,6,2,8,6,10 +Q,2,4,3,5,3,8,7,6,3,8,6,9,2,9,3,9 +T,2,6,3,4,1,7,12,0,5,7,10,8,0,8,0,8 +D,1,0,2,0,0,6,7,7,6,7,6,6,2,8,3,8 +F,3,7,3,5,1,1,11,4,6,11,11,9,0,8,2,6 +W,7,9,7,7,6,5,10,3,2,9,7,7,9,13,3,4 +S,4,7,5,5,6,9,4,5,3,8,6,9,3,8,10,11 +X,5,11,8,8,6,7,8,3,9,5,5,7,4,9,8,7 +M,5,9,7,6,7,7,7,5,5,6,7,9,8,6,2,8 +E,3,6,5,4,4,6,7,3,7,11,8,9,3,8,4,8 +P,9,14,8,8,4,9,8,7,5,13,3,5,5,10,4,8 +W,4,7,6,5,4,10,8,4,1,7,9,8,7,10,0,8 +B,1,1,2,1,1,7,7,7,5,6,6,7,1,8,6,8 +B,2,5,4,4,3,8,7,3,5,10,5,7,2,8,4,10 +D,7,12,6,6,4,8,5,4,6,8,4,7,5,6,6,10 +P,8,12,6,7,3,8,8,5,4,12,4,6,5,9,4,8 +J,3,5,4,8,1,11,2,11,3,13,7,14,1,6,0,8 +U,5,5,6,7,2,8,4,14,6,6,15,8,3,9,0,8 +M,4,5,6,3,4,8,6,6,5,6,7,8,9,6,3,7 +B,5,9,7,7,10,9,9,5,4,7,8,6,6,10,10,10 +P,3,5,5,7,7,8,10,4,0,8,7,6,7,10,4,7 +V,3,5,4,4,2,5,12,2,3,8,11,7,2,11,1,8 +H,6,7,9,5,6,10,6,3,6,10,3,7,3,7,3,9 +B,5,11,7,9,8,8,7,5,6,6,6,5,3,8,6,10 +A,2,5,4,4,3,9,8,3,4,6,7,8,4,8,4,6 +T,4,7,5,5,1,4,14,4,7,12,9,3,0,10,1,5 +G,1,0,2,1,0,8,6,6,5,6,5,9,1,7,5,10 +S,5,11,6,8,3,7,6,6,9,4,6,9,0,9,9,8 +Y,4,6,6,8,1,8,12,2,3,7,12,8,1,10,0,8 +V,4,5,5,4,2,4,12,3,3,10,11,7,2,10,1,8 +S,5,8,6,6,4,8,8,4,7,10,3,7,2,6,5,9 +H,9,15,8,8,5,6,8,4,6,9,8,9,6,8,6,10 +O,6,9,6,7,5,7,7,7,5,10,6,10,5,8,4,6 +U,10,14,9,8,5,6,6,5,5,6,8,9,7,7,4,10 +N,3,7,5,5,4,7,6,6,5,7,5,9,4,8,3,7 +N,3,3,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +P,4,10,6,7,4,6,9,7,5,9,7,3,2,10,4,7 +T,5,10,5,7,3,4,14,5,5,12,9,3,1,11,1,5 +J,2,3,4,4,2,10,6,2,6,12,4,9,1,6,1,7 +Q,4,6,5,8,4,8,7,6,3,8,8,10,3,8,6,8 +J,5,10,5,8,4,9,8,2,4,11,6,7,2,10,6,12 +K,8,11,11,8,6,8,6,2,8,11,4,8,4,8,5,10 +X,4,9,6,7,4,7,7,4,9,6,7,11,4,6,8,9 +I,4,11,5,8,3,7,7,0,8,14,6,8,0,8,1,8 +Z,5,8,7,6,6,9,7,5,4,7,5,7,4,8,10,5 +Q,5,5,7,8,3,8,8,7,7,6,8,9,3,7,6,9 +T,6,10,5,5,3,7,9,2,7,12,7,6,2,9,4,6 +D,5,10,7,8,10,9,8,5,5,7,6,6,4,7,7,5 +E,3,5,4,4,3,7,7,5,7,7,6,9,2,8,6,10 +A,3,8,5,5,2,9,6,3,1,7,0,8,2,7,1,8 +D,4,7,6,5,4,8,7,6,7,10,5,5,3,8,3,8 +D,5,9,5,5,3,10,5,4,5,11,3,7,4,7,4,10 +Q,5,9,7,7,6,8,3,8,4,6,6,7,3,8,3,8 +D,3,3,3,4,2,5,7,9,8,6,5,5,3,8,4,8 +I,1,2,1,3,1,7,7,1,8,7,6,8,0,8,3,8 +S,2,4,3,3,1,7,8,3,7,10,7,7,1,9,5,7 +L,4,10,6,9,5,8,6,4,4,6,7,8,3,9,8,10 +I,1,1,1,1,0,7,7,2,6,7,6,8,0,8,2,8 +Q,2,3,3,4,2,8,9,6,1,5,7,10,2,10,5,10 +O,4,4,5,6,2,8,9,8,8,6,8,9,3,8,4,8 +F,3,2,4,4,2,5,10,4,6,11,9,5,1,10,3,6 +R,4,8,5,6,3,6,9,9,4,6,5,8,3,8,6,11 +P,5,10,7,8,7,6,9,5,5,9,7,3,2,10,4,6 +J,6,10,7,8,3,9,3,6,6,15,7,15,1,6,1,7 +Q,1,0,1,1,0,8,7,6,2,6,6,8,2,8,2,8 +J,2,8,3,6,1,11,3,10,3,12,8,13,1,6,0,8 +L,2,5,4,3,2,7,3,1,7,8,2,10,0,7,2,8 +Z,4,7,6,10,6,10,5,4,4,8,3,7,2,6,7,8 +D,5,10,5,8,5,6,7,9,8,6,4,6,3,8,3,8 +X,8,12,9,7,5,6,8,2,8,11,7,8,5,8,4,6 +N,5,11,5,8,3,7,7,15,2,4,6,8,6,8,0,8 +Q,4,11,6,9,3,9,8,9,6,5,7,10,3,8,5,9 +G,6,10,8,7,6,6,6,6,6,6,6,10,4,8,5,9 +A,3,8,4,6,3,8,3,2,2,7,1,8,2,6,2,7 +P,1,0,2,0,0,5,11,6,1,9,6,5,1,9,3,8 +T,5,9,5,7,3,6,11,2,8,11,9,4,1,11,3,4 +N,4,9,6,6,4,7,9,2,5,9,5,6,5,8,1,7 +Q,3,6,4,7,4,9,9,7,2,4,7,11,3,10,5,10 +Q,3,7,4,9,5,8,5,8,4,6,5,8,3,7,5,9 +P,8,10,7,5,3,7,9,5,4,12,4,5,4,9,4,8 +I,1,5,1,3,1,7,7,1,8,7,6,8,0,8,3,8 +C,5,4,6,7,2,6,9,7,11,5,7,12,1,6,4,8 +M,8,10,10,6,5,9,3,3,2,9,3,10,8,1,2,9 +P,4,11,6,9,6,7,9,5,5,9,8,3,2,10,4,6 +N,10,13,11,7,5,7,7,3,5,13,9,9,6,8,0,8 +L,1,3,2,1,1,6,4,1,7,7,2,9,0,7,2,8 +I,1,5,2,4,1,7,9,0,7,13,6,6,0,8,1,7 +I,2,6,4,4,3,11,6,1,5,9,4,5,1,8,5,9 +P,2,1,3,1,1,5,11,8,2,9,5,4,1,9,3,8 +N,11,13,9,7,4,6,9,4,7,3,4,11,6,10,2,7 +V,4,8,6,7,7,8,8,5,4,7,6,8,7,7,10,4 +Q,4,8,5,6,5,8,4,7,4,6,6,11,2,8,3,9 +S,5,9,4,5,2,9,3,2,5,8,1,7,3,7,4,10 +Q,3,7,4,9,5,9,8,7,2,4,8,11,3,9,6,10 +C,4,8,5,6,5,5,7,4,5,7,7,9,7,9,5,9 +Z,3,8,4,6,2,7,7,4,13,9,6,8,0,8,8,8 +Q,3,5,5,7,5,8,12,3,3,5,8,11,3,13,4,9 +W,5,5,8,8,4,9,7,5,2,6,8,8,9,9,0,8 +G,6,10,6,8,4,6,7,6,7,10,8,11,2,9,5,9 +X,3,6,5,5,4,5,8,2,5,8,6,9,3,6,7,8 +C,4,4,5,6,2,6,6,7,10,9,6,14,1,9,4,8 +P,4,9,4,4,3,9,8,4,3,11,5,5,4,11,5,7 +X,5,11,9,8,8,9,6,3,6,7,5,5,6,10,8,9 +D,6,9,5,5,4,6,7,5,6,9,6,7,5,9,6,5 +G,3,8,5,6,4,8,7,7,5,6,6,9,2,7,5,11 +G,3,4,4,2,2,6,7,5,6,6,6,9,2,8,3,8 +H,2,4,4,2,2,7,7,3,5,10,6,8,3,8,2,7 +J,4,8,6,6,3,8,4,5,4,14,6,13,1,6,0,7 +P,4,10,5,8,5,6,9,6,5,9,7,4,5,10,4,7 +D,4,6,6,5,5,6,8,5,7,6,5,7,4,7,5,5 +G,2,0,2,1,1,8,7,6,5,6,6,9,1,7,5,10 +Z,2,5,3,3,2,7,7,5,9,6,6,8,2,8,7,8 +T,5,8,5,6,4,5,12,4,5,12,9,5,2,12,1,5 +W,4,6,4,4,4,3,10,2,2,10,9,7,5,11,2,6 +T,7,12,6,6,2,5,11,3,7,12,8,4,2,9,4,3 +I,1,6,0,4,1,7,7,5,3,7,6,8,0,8,0,8 +C,3,6,5,4,4,6,6,3,4,8,6,11,5,9,3,8 +Q,2,2,2,3,2,8,8,5,3,8,7,8,2,9,2,7 +M,1,0,1,0,1,8,6,8,0,6,8,8,5,7,0,8 +T,2,8,3,6,2,6,12,0,6,8,10,8,0,8,0,8 +A,6,10,6,5,4,12,3,6,2,12,2,10,5,3,3,10 +B,3,6,4,4,3,6,6,8,6,6,6,7,2,8,9,10 +X,6,9,9,7,5,7,7,0,8,10,7,9,2,8,3,7 +O,7,11,9,8,6,7,7,9,5,6,7,11,5,8,5,7 +W,6,7,6,5,5,6,11,4,2,8,7,6,9,12,4,5 +F,6,9,9,7,4,7,10,2,8,14,6,3,1,10,3,8 +E,0,0,1,1,0,5,7,5,7,7,6,12,0,8,6,10 +Q,4,6,4,8,5,8,6,6,2,8,6,10,3,8,5,9 +X,5,10,8,7,6,7,8,2,6,7,6,7,6,9,8,7 +S,2,2,2,3,2,8,7,6,5,8,6,7,2,8,8,8 +V,7,10,7,6,3,6,9,4,3,9,8,5,5,12,2,8 +R,3,6,4,4,3,7,7,4,5,7,6,6,3,7,4,9 +S,4,9,4,7,4,7,7,5,8,5,6,10,1,10,9,9 +F,6,8,8,10,9,7,9,5,5,8,6,7,4,9,8,8 +E,5,11,7,8,7,6,7,7,10,6,4,11,3,8,6,8 +J,2,6,3,4,2,10,6,1,8,12,3,7,0,7,0,8 +M,5,7,8,5,5,8,6,2,5,9,6,8,8,6,2,8 +H,4,8,4,5,2,7,9,15,1,7,4,8,3,8,0,8 +N,8,11,11,8,5,7,8,3,5,10,6,7,7,7,2,7 +H,4,8,4,6,4,7,7,12,1,7,6,8,3,8,0,8 +F,3,6,4,4,3,5,10,3,4,12,8,6,2,10,1,7 +F,5,8,7,6,3,7,10,2,7,14,5,4,1,10,2,8 +Z,3,7,4,5,2,7,7,3,12,8,6,8,0,8,7,7 +I,5,9,6,6,4,5,7,3,7,7,6,12,0,8,4,9 +G,5,7,5,5,3,6,7,6,6,9,7,10,2,8,4,9 +J,1,6,2,4,1,12,3,9,3,13,6,12,1,6,0,8 +G,3,8,4,6,4,8,7,7,5,6,6,8,2,8,5,11 +G,4,8,5,6,6,8,7,4,2,6,6,8,7,8,7,11 +B,1,0,2,0,1,7,7,6,4,6,6,7,1,8,6,8 +M,6,10,9,8,8,8,7,2,4,9,7,8,8,6,2,8 +Z,5,9,6,4,3,10,3,3,7,12,4,10,2,9,4,11 +R,3,8,4,6,4,5,10,7,3,7,3,9,2,6,4,11 +I,1,8,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +Q,3,4,4,5,3,8,8,7,2,5,7,10,3,9,5,10 +W,4,6,6,4,2,5,8,4,1,7,9,8,8,9,0,8 +Z,7,11,7,6,4,8,6,2,8,11,6,9,3,9,5,8 +F,3,3,4,4,1,2,12,5,5,12,10,8,0,8,2,6 +A,3,4,5,3,2,10,1,3,2,10,2,10,2,6,3,8 +S,4,11,5,8,5,8,7,8,5,7,6,8,2,8,8,8 +W,9,10,9,5,4,3,10,3,2,10,11,8,9,12,1,6 +W,4,6,5,4,4,4,10,3,2,9,8,7,6,11,1,7 +I,1,2,1,4,1,7,7,1,7,7,6,9,0,8,3,8 +W,8,12,8,6,6,9,9,4,4,6,9,6,10,9,3,6 +S,4,9,5,6,3,10,6,3,6,10,4,8,2,9,5,10 +E,4,8,6,6,4,7,7,3,8,11,7,9,3,8,5,8 +A,3,7,5,5,2,9,3,3,3,7,2,8,3,6,3,8 +Z,4,11,5,8,6,6,8,5,8,8,8,9,1,10,7,8 +S,5,9,5,5,2,10,5,4,4,13,5,8,2,9,2,8 +B,2,3,3,2,2,8,8,5,6,7,5,5,2,8,7,8 +I,1,4,2,2,1,7,7,1,7,13,6,8,0,8,1,8 +U,3,5,4,3,2,5,8,5,7,10,9,9,3,9,2,6 +Q,6,9,7,11,7,8,7,7,4,9,7,9,3,8,6,8 +J,3,11,4,9,3,9,7,2,7,11,3,7,1,6,2,6 +Y,2,6,4,4,1,7,9,2,2,7,12,8,2,11,0,8 +H,3,6,4,4,5,9,9,4,3,6,7,7,6,9,5,6 +P,5,9,6,6,3,5,10,10,5,8,5,5,2,10,4,8 +S,5,11,7,8,7,8,7,7,5,6,6,8,3,8,9,7 +N,5,8,7,6,4,6,9,2,4,9,8,8,6,7,2,7 +I,4,7,6,8,6,8,9,4,5,7,7,9,3,6,8,7 +G,4,5,5,3,3,7,6,6,7,7,6,10,2,9,3,8 +D,5,9,7,6,6,8,7,5,6,10,6,5,3,8,4,9 +W,3,4,5,3,3,9,11,3,2,5,9,8,6,11,1,8 +A,5,10,5,5,3,11,4,4,2,11,3,10,6,4,4,10 +Y,9,13,8,7,5,8,7,4,6,9,5,5,4,9,6,5 +E,2,5,4,3,2,6,8,2,7,11,7,9,2,8,4,8 +Z,4,10,5,7,4,7,8,6,11,7,6,9,1,9,8,7 +V,4,8,6,6,7,7,7,4,1,8,7,9,7,10,4,8 +O,4,8,4,6,4,6,8,7,4,9,8,8,3,8,2,7 +E,3,7,4,5,5,6,8,3,5,6,7,11,4,11,8,8 +R,3,10,4,7,3,6,9,10,5,7,5,8,3,8,5,11 +Q,4,6,5,7,5,9,9,6,2,4,7,11,3,9,6,10 +F,4,9,5,6,3,8,9,2,6,14,5,4,2,10,3,8 +V,4,7,4,5,2,3,12,5,4,12,11,7,3,10,1,8 +G,7,10,7,7,5,7,6,7,8,11,6,11,2,11,5,9 +G,5,6,6,6,7,7,9,6,2,7,7,7,9,12,9,7 +K,5,7,8,5,4,7,6,2,7,10,5,10,4,7,5,9 +U,4,5,5,4,3,6,9,5,7,6,10,9,3,9,1,8 +K,6,10,8,7,6,8,7,1,7,10,4,8,4,7,4,8 +Z,8,15,8,8,6,7,7,2,9,12,7,8,6,5,8,5 +I,2,4,3,3,1,7,7,0,7,13,6,8,0,8,1,7 +C,4,7,4,5,2,4,8,6,8,10,9,14,1,8,3,8 +P,5,8,7,10,10,7,8,4,3,7,7,7,6,11,5,6 +R,4,9,6,6,4,9,7,4,6,9,4,7,3,7,5,10 +O,3,3,4,4,2,7,7,8,6,7,6,8,3,8,4,8 +B,4,8,6,6,8,8,7,5,3,7,7,7,6,10,8,9 +K,2,1,3,2,2,5,7,4,6,6,6,10,3,8,4,9 +O,2,4,3,2,2,7,7,7,5,7,6,8,2,8,3,8 +V,4,11,6,8,2,7,8,4,3,7,14,8,3,9,0,8 +A,2,3,4,2,2,7,2,1,2,7,2,8,2,7,2,7 +H,3,4,3,5,2,7,9,14,3,7,3,8,3,8,0,8 +G,5,10,6,7,5,6,5,6,7,6,6,10,3,9,4,7 +F,3,6,4,4,4,6,9,5,4,8,6,8,2,9,7,12 +B,2,2,3,3,2,7,7,5,5,6,6,6,2,8,6,10 +P,4,7,5,5,3,10,7,3,5,12,4,5,2,9,3,9 +S,8,14,8,8,4,11,4,3,3,12,6,9,3,10,3,9 +G,3,7,4,5,2,6,6,6,6,10,8,11,2,10,4,9 +E,4,9,4,7,4,2,7,5,8,7,6,14,0,8,6,9 +S,4,7,5,5,2,8,7,5,9,5,6,8,0,8,9,8 +U,5,10,5,8,4,7,5,14,5,7,11,8,3,9,0,8 +X,7,11,11,8,5,7,7,1,9,10,6,8,3,8,4,7 +I,2,10,2,8,2,7,7,0,8,7,6,8,0,8,3,8 +T,8,11,8,8,5,7,11,4,8,12,9,4,2,12,4,4 +X,3,9,5,7,4,8,7,3,8,6,7,8,3,8,7,9 +D,3,10,5,8,9,9,9,4,4,7,6,6,4,8,7,5 +E,3,8,5,6,5,7,7,3,5,6,7,10,4,10,8,8 +W,4,6,6,4,2,7,8,4,1,7,8,8,8,9,0,8 +U,5,6,5,4,2,4,9,5,7,12,11,8,3,9,1,6 +D,5,4,5,6,3,5,7,10,9,6,6,5,3,8,4,8 +T,2,3,3,1,1,5,11,1,7,11,9,5,0,9,2,5 +S,3,6,5,5,5,9,8,5,5,7,6,8,5,8,9,11 +Y,6,11,6,8,3,2,11,4,5,12,12,7,2,11,2,6 +N,2,1,2,2,1,7,7,11,1,5,6,8,4,8,0,8 +S,6,9,5,4,2,11,2,2,5,10,2,9,2,8,3,11 +H,4,11,5,8,3,7,7,15,1,7,7,8,3,8,0,8 +S,4,7,5,5,5,9,6,4,3,8,5,8,3,9,9,9 +G,4,11,5,9,3,8,8,9,7,5,7,9,2,7,5,11 +G,4,6,6,4,3,6,6,5,7,6,5,9,3,9,4,8 +S,10,15,10,8,5,8,6,4,6,13,6,8,4,7,4,8 +H,6,11,6,8,6,7,9,14,2,7,4,8,3,8,0,8 +C,3,10,4,8,3,5,8,7,8,7,8,14,1,8,4,10 +A,2,1,3,1,1,7,4,2,0,7,2,8,3,6,1,8 +Q,6,11,5,6,3,10,3,4,6,10,3,9,3,8,6,13 +I,2,7,3,5,1,7,5,0,7,14,7,10,0,7,1,8 +A,2,4,4,3,2,7,2,2,2,5,2,8,2,5,2,7 +Q,3,5,5,4,3,6,4,4,4,5,4,7,3,5,5,7 +N,7,10,9,8,10,6,8,3,4,8,7,8,8,10,7,4 +H,5,6,8,8,6,9,11,4,2,8,7,6,3,10,8,6 +K,7,12,7,7,5,8,7,2,6,10,4,8,5,8,4,8 +Y,3,8,5,6,3,10,10,1,6,3,11,8,1,11,2,9 +Q,6,9,8,8,7,5,4,4,4,4,3,7,4,8,6,5 +V,4,9,6,7,3,6,12,3,4,8,12,8,3,10,1,9 +S,7,11,5,6,3,7,3,2,5,7,2,7,3,7,5,9 +B,5,7,7,5,5,10,6,3,7,11,3,6,4,6,6,11 +U,2,0,2,1,0,8,5,11,4,7,13,8,3,10,0,8 +K,8,10,8,6,3,4,7,5,7,9,12,12,6,11,3,6 +F,6,9,9,7,9,6,8,1,5,10,8,7,8,9,4,6 +G,6,10,7,7,5,5,7,6,5,9,8,11,2,8,4,10 +Q,3,4,4,5,3,8,8,6,2,8,6,9,2,9,3,8 +F,4,7,5,8,6,7,9,5,4,8,6,7,4,9,8,7 +H,8,14,7,8,4,8,8,4,6,8,5,6,6,8,5,8 +I,3,10,4,8,3,6,8,0,7,13,7,8,0,8,1,7 +F,7,10,9,8,6,9,8,2,6,13,5,5,5,9,4,9 +L,1,0,1,1,0,1,1,5,5,0,1,6,0,8,0,8 +P,4,4,6,6,6,9,11,2,3,7,9,6,4,10,5,5 +Z,3,10,4,8,5,8,7,5,9,7,5,7,1,7,7,8 +P,5,8,6,10,9,8,9,3,2,6,8,7,6,10,6,4 +M,3,5,5,3,4,7,6,3,4,9,7,8,7,6,1,8 +V,8,11,7,8,5,3,11,1,3,8,10,7,6,11,2,7 +Y,4,5,5,4,2,4,12,3,6,12,10,4,1,11,2,5 +X,3,4,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +V,1,0,2,1,0,8,9,3,2,6,12,8,2,10,0,8 +J,2,5,4,4,2,10,6,2,6,12,4,9,1,6,1,7 +O,2,3,2,2,1,7,7,6,3,8,6,8,2,8,2,7 +M,5,6,7,4,5,9,6,2,4,9,6,7,7,6,2,7 +V,5,5,6,4,2,4,12,3,3,10,11,7,2,10,1,8 +Q,5,8,7,7,5,7,4,4,4,5,3,8,3,7,5,8 +N,3,7,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +L,4,7,5,5,3,7,4,1,7,8,2,9,1,6,2,8 +X,7,13,7,7,4,7,7,2,9,9,5,8,4,7,4,8 +E,6,11,9,8,5,5,9,3,11,11,8,8,2,8,5,5 +A,4,10,7,7,6,10,5,2,5,10,2,5,3,6,6,8 +L,2,7,4,5,2,6,4,3,8,6,1,7,1,6,2,7 +Z,2,3,4,2,1,7,7,2,9,11,6,8,1,8,5,7 +O,3,9,4,6,4,7,7,8,6,7,7,8,2,8,3,7 +Y,7,13,6,7,4,8,7,4,6,9,6,5,3,9,5,5 +K,5,9,7,7,5,6,7,5,8,6,5,10,3,8,5,9 +C,2,4,3,3,1,4,8,4,6,11,9,11,1,9,3,7 +X,4,8,4,6,3,7,7,4,4,7,6,8,3,8,4,8 +M,5,7,7,6,8,6,8,5,3,6,5,8,10,8,5,7 +C,3,7,4,5,2,4,8,7,7,7,8,14,1,8,4,10 +J,2,6,2,4,1,11,3,10,3,12,8,13,1,6,0,8 +H,4,9,5,7,4,7,7,13,1,7,6,8,3,8,0,8 +S,5,8,7,6,3,5,9,3,9,11,7,6,2,7,5,5 +H,3,6,5,4,4,6,7,5,5,7,5,8,3,7,6,12 +F,4,8,5,6,5,7,9,3,6,9,9,6,5,10,3,7 +T,9,12,7,7,3,7,8,4,9,13,6,8,2,7,5,6 +B,6,9,5,5,3,7,8,5,6,10,5,9,6,6,6,9 +U,6,10,7,8,4,5,7,6,8,9,7,9,4,9,3,3 +N,7,9,9,8,10,8,7,6,5,7,6,7,9,9,8,0 +K,5,6,5,9,2,3,6,8,2,7,7,12,3,8,3,11 +D,3,4,4,6,2,5,7,10,8,7,6,5,3,8,4,8 +B,5,10,5,8,4,7,8,9,7,7,5,6,2,8,9,10 +R,4,9,4,7,5,6,9,8,3,7,4,8,2,7,5,11 +Q,5,9,6,8,3,9,6,9,8,7,4,9,3,8,4,8 +N,3,7,4,5,3,7,8,6,5,7,6,7,5,8,1,6 +V,4,10,7,8,2,7,8,4,3,7,14,8,3,9,0,8 +C,0,0,1,0,0,6,7,5,6,7,6,13,0,8,3,10 +W,8,8,10,7,12,7,7,5,5,6,6,8,10,9,9,8 +M,1,1,2,1,1,8,6,10,0,6,8,8,6,6,0,8 +G,1,3,2,1,1,7,7,5,5,6,6,9,2,8,3,9 +T,3,11,4,8,1,6,14,0,6,8,11,8,0,8,0,8 +I,2,5,3,3,1,7,7,0,7,13,6,8,0,8,1,7 +C,5,9,7,7,8,7,5,4,3,7,7,11,8,9,4,7 +U,4,3,4,4,1,7,5,13,5,7,14,8,3,9,0,8 +H,8,11,11,8,7,7,6,3,7,10,5,8,5,6,5,7 +D,4,6,4,4,2,5,8,9,8,8,7,5,3,8,4,8 +L,4,8,6,6,4,8,4,1,8,9,3,10,1,6,3,9 +D,2,3,4,2,2,9,6,4,6,10,4,6,2,8,3,8 +X,1,0,1,0,0,8,7,3,5,7,6,8,2,8,3,7 +U,5,9,4,4,2,6,6,4,5,4,8,7,5,8,2,6 +D,4,4,5,6,3,6,8,10,9,8,7,6,3,8,4,8 +P,2,7,3,4,1,3,13,8,2,11,7,3,0,9,3,8 +B,3,4,5,3,4,7,8,3,5,10,6,6,2,8,5,8 +M,4,8,4,6,5,8,6,10,1,6,8,8,7,5,0,7 +F,5,9,7,7,4,4,11,1,5,13,7,5,1,10,1,7 +G,4,11,5,8,5,7,7,8,6,5,7,9,2,7,6,10 +X,5,10,7,8,4,10,7,1,8,10,2,6,3,9,4,10 +I,4,10,5,8,2,7,7,0,9,14,6,8,0,8,1,8 +B,3,6,5,4,4,7,9,4,5,9,6,6,2,8,5,6 +Z,2,5,4,6,4,9,6,5,4,7,3,6,2,7,7,6 +J,3,8,5,6,2,8,5,4,5,14,7,12,1,6,0,7 +D,3,8,5,6,4,8,7,7,6,6,5,3,3,8,3,6 +U,3,8,5,6,7,8,5,4,3,7,7,8,7,8,4,7 +H,3,2,4,4,3,8,7,6,6,7,6,8,3,8,3,8 +E,2,7,2,5,3,3,6,4,8,6,6,13,0,8,6,10 +Z,2,1,2,2,1,7,7,3,12,8,6,8,0,8,7,8 +T,2,4,3,5,1,7,14,0,6,7,11,8,0,8,0,8 +Q,2,2,2,3,2,7,8,4,2,8,8,9,2,9,4,8 +K,6,11,7,6,4,11,7,2,6,10,3,6,5,10,3,10 +R,4,8,6,6,4,10,7,4,7,10,1,7,3,6,4,11 +G,4,7,4,5,3,5,7,5,4,8,7,11,2,8,4,10 +S,3,4,3,3,2,8,8,6,5,7,6,7,2,8,9,8 +Z,4,5,6,7,5,11,5,3,5,9,3,7,2,7,6,9 +Q,1,0,1,0,0,8,8,6,3,6,6,9,2,8,3,8 +U,5,10,6,8,2,7,5,13,6,8,15,8,3,9,0,8 +K,6,9,8,7,6,6,6,1,7,10,7,10,3,8,4,8 +V,2,3,3,2,1,5,12,2,2,8,10,7,2,11,0,8 +C,3,4,4,3,1,4,8,5,7,11,9,12,1,9,2,7 +A,5,10,7,8,5,7,3,2,3,4,2,7,2,6,2,6 +Q,5,6,8,6,6,8,4,4,4,7,4,10,6,6,7,7 +T,6,13,5,7,3,8,7,3,7,11,5,7,2,9,5,6 +J,1,2,2,3,1,10,6,2,6,12,4,8,1,6,1,7 +R,2,3,4,2,2,8,7,3,4,9,4,7,2,7,3,10 +R,4,8,5,6,3,6,10,9,4,7,5,8,3,8,6,11 +C,3,7,4,5,2,7,7,7,10,8,6,14,1,9,4,9 +I,3,8,4,6,2,7,7,0,7,13,6,8,0,8,1,8 +Z,4,9,6,6,3,7,8,2,10,11,7,9,1,9,6,8 +K,3,4,5,3,2,6,6,1,7,10,7,10,3,7,3,8 +F,5,11,6,8,6,5,10,5,6,10,10,6,2,9,3,5 +P,3,5,3,4,2,5,10,5,4,10,8,4,1,10,3,7 +B,6,9,8,6,8,7,8,5,5,7,5,7,4,9,6,7 +L,4,11,5,8,4,7,4,1,7,8,2,10,1,5,3,8 +P,2,7,3,4,1,4,12,8,2,10,6,3,1,10,3,8 +F,5,8,6,6,6,7,8,6,4,8,6,8,3,11,8,11 +X,5,10,8,8,6,10,7,3,7,7,6,6,6,12,8,9 +R,2,4,4,3,2,8,7,3,5,10,4,7,2,7,3,10 +U,4,5,5,4,2,4,8,5,7,11,10,9,3,9,2,7 +K,3,5,4,3,3,5,7,4,7,6,6,11,3,8,4,10 +D,1,0,1,0,0,6,7,6,4,7,6,6,2,8,2,8 +V,5,10,7,7,4,5,10,3,2,9,11,7,4,9,5,8 +B,3,9,4,7,3,6,6,9,7,6,7,7,2,8,9,10 +X,1,1,2,1,0,8,7,3,4,7,6,8,2,8,4,8 +P,6,6,6,8,3,5,10,10,6,8,6,5,2,10,4,8 +R,4,7,4,4,2,6,11,8,3,7,4,8,3,7,6,11 +U,3,9,4,7,2,7,6,14,5,8,13,7,3,9,0,8 +W,7,8,7,6,6,2,10,2,3,10,10,8,7,11,2,7 +R,3,4,5,3,3,8,7,4,5,9,4,7,2,7,4,10 +A,5,10,7,8,8,8,7,8,4,6,6,8,3,8,8,3 +Q,5,9,5,4,3,10,5,4,6,11,4,8,3,8,7,11 +B,6,6,6,8,5,6,6,9,7,6,6,7,3,8,10,10 +E,2,5,3,4,3,7,7,6,7,7,6,9,2,8,6,10 +L,5,6,6,6,5,8,9,3,6,6,6,9,3,9,7,9 +N,5,8,8,6,4,10,7,3,5,10,2,4,5,9,1,7 +D,3,7,5,5,6,8,8,5,4,7,6,6,6,8,7,6 +J,2,5,5,3,2,9,5,4,5,14,6,12,1,6,0,7 +T,1,1,2,2,1,7,12,3,6,7,10,9,1,11,1,8 +F,3,3,4,4,1,2,13,5,4,12,10,6,0,8,2,6 +E,3,6,4,4,3,8,7,2,6,11,6,9,3,8,4,10 +I,0,7,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +D,3,3,4,2,2,7,7,6,7,7,6,5,2,8,3,7 +U,5,10,8,8,11,9,6,4,4,7,7,7,8,8,5,7 +T,2,3,3,2,1,6,11,4,5,8,10,7,2,11,1,7 +F,3,8,3,5,1,1,13,5,3,12,10,6,0,8,2,6 +K,7,10,10,7,7,4,8,1,7,9,8,11,3,8,3,6 +T,5,10,7,8,8,8,8,5,6,6,7,9,7,7,8,3 +S,4,11,5,8,5,7,7,6,8,5,6,11,1,11,10,9 +M,3,7,4,5,3,7,7,11,1,7,9,8,8,5,0,8 +H,9,15,9,8,7,4,10,3,5,10,8,10,5,8,4,6 +Z,4,5,6,7,5,10,5,3,5,7,3,6,3,7,6,7 +Y,2,7,4,5,2,7,10,2,2,7,11,8,1,11,0,8 +N,3,4,5,3,2,6,9,2,4,10,7,7,5,8,1,8 +K,4,10,6,8,6,5,6,3,7,6,6,10,4,7,7,11 +J,5,7,6,5,4,8,6,8,6,7,7,8,2,7,4,6 +M,7,9,10,7,6,8,6,2,5,9,6,8,10,8,3,8 +G,4,9,6,7,6,7,5,6,3,8,6,11,4,8,7,8 +Z,4,7,4,5,2,7,7,4,14,9,6,8,0,8,8,8 +I,2,8,3,6,2,7,7,0,8,13,6,8,0,8,1,7 +U,9,11,10,8,4,3,9,6,9,12,12,9,3,9,2,7 +J,3,7,5,5,5,10,8,3,4,8,4,6,4,8,6,5 +I,2,6,2,4,1,5,8,0,7,13,7,8,0,8,1,7 +T,2,3,3,2,1,5,11,3,6,11,9,5,1,11,1,5 +R,5,9,7,7,5,10,6,3,6,10,3,7,4,6,5,10 +K,3,3,4,5,1,3,7,7,2,7,6,11,3,8,2,10 +D,7,10,7,5,3,10,4,4,5,11,3,8,5,7,5,11 +F,1,0,1,0,0,3,11,4,3,11,9,7,0,8,2,8 +Q,3,4,4,5,4,8,7,6,3,8,8,9,3,8,4,8 +R,2,3,3,1,2,8,8,3,5,9,4,7,2,6,3,10 +G,3,4,4,2,2,6,7,5,5,9,7,10,2,8,4,9 +H,3,7,5,5,6,9,8,4,3,6,7,8,7,8,7,7 +L,9,15,7,8,4,7,4,3,6,11,3,12,2,7,6,7 +L,7,13,7,7,4,8,4,3,4,11,8,12,3,10,5,10 +U,4,8,6,6,7,9,6,5,5,6,7,6,6,8,5,6 +I,1,8,2,6,2,7,7,0,7,7,6,8,0,8,2,8 +D,4,11,6,8,4,8,8,8,8,8,7,2,3,7,4,8 +P,4,6,6,9,8,6,13,5,1,10,8,5,4,11,4,9 +Z,6,7,5,10,4,8,5,5,4,11,6,7,3,9,10,7 +J,4,8,3,12,3,8,7,3,3,11,4,5,3,8,6,10 +W,6,8,6,6,4,2,10,2,3,11,11,9,6,10,2,6 +N,5,9,8,7,4,3,10,3,4,10,10,9,5,8,1,7 +G,9,15,8,8,5,10,3,3,3,9,3,6,4,7,5,9 +D,3,7,4,5,4,6,7,9,7,8,8,6,2,9,3,8 +O,2,4,3,2,2,8,7,7,4,7,6,8,2,8,2,8 +U,4,5,5,4,3,6,8,6,7,7,9,10,3,9,1,8 +G,6,11,7,8,6,7,7,8,7,6,5,10,2,7,5,11 +R,1,1,2,1,1,6,9,7,3,7,5,8,2,7,4,10 +G,2,1,3,2,2,7,6,6,5,6,6,9,2,9,4,9 +X,8,13,7,7,4,8,8,2,9,9,6,7,4,10,4,8 +M,3,6,4,4,4,7,5,10,0,7,8,8,6,5,0,8 +U,4,2,5,3,2,7,8,6,8,7,10,9,3,9,1,8 +E,1,3,3,2,1,7,7,2,6,11,6,9,1,8,4,9 +M,4,7,6,5,4,6,6,7,5,7,8,11,8,5,2,9 +A,3,9,5,7,4,6,4,3,1,6,1,8,2,6,2,7 +G,4,9,5,7,4,5,7,6,5,10,8,11,2,9,4,10 +P,5,8,7,6,6,8,5,7,5,7,6,6,4,8,6,10 +F,3,5,6,4,2,6,11,2,6,13,7,4,1,10,2,7 +I,1,6,0,4,1,7,7,5,3,7,6,8,0,8,0,8 +R,3,2,4,3,3,7,7,5,5,6,5,6,3,7,4,8 +K,5,9,5,6,2,4,7,9,2,7,5,11,4,8,2,11 +W,5,8,8,6,5,9,11,2,3,5,9,7,10,13,1,6 +S,3,3,4,4,2,7,6,5,9,5,6,9,0,9,9,8 +C,4,10,5,8,3,5,8,7,8,7,8,15,1,8,4,9 +N,7,11,9,6,4,5,8,2,4,12,7,9,6,8,0,7 +P,5,6,5,8,3,3,14,8,1,11,7,2,0,10,4,8 +P,5,9,7,7,4,9,8,3,5,12,4,4,2,9,4,8 +N,4,9,6,7,7,9,7,4,4,7,6,6,5,10,6,5 +Y,8,8,7,12,5,5,5,7,4,6,12,6,5,10,4,8 +J,6,9,8,7,5,9,4,7,6,8,6,5,2,7,4,6 +M,7,7,10,6,10,6,9,5,3,7,5,8,12,5,6,8 +A,6,9,9,8,8,8,8,3,5,7,7,8,5,8,4,5 +S,9,15,7,8,4,9,2,2,5,8,1,8,3,7,5,10 +Z,8,13,9,7,6,5,9,2,9,12,8,8,6,5,8,2 +O,3,7,5,5,3,7,7,8,5,6,5,6,3,8,3,8 +R,3,8,4,6,2,5,11,8,4,7,3,9,3,7,6,11 +I,1,7,0,5,1,7,7,5,3,7,6,8,0,8,0,8 +U,1,0,2,0,0,7,6,10,4,7,13,8,2,10,0,8 +K,10,12,9,6,4,5,9,3,8,9,7,9,6,6,3,6 +E,5,10,7,7,7,8,9,6,3,6,6,9,4,7,7,9 +F,5,11,5,8,4,1,12,4,5,12,11,8,0,8,1,6 +J,2,2,3,3,1,10,6,2,6,12,4,9,0,7,1,7 +Z,4,6,6,4,3,6,9,3,9,11,9,6,1,9,6,5 +I,3,6,5,7,4,8,8,4,5,7,6,8,3,8,8,8 +U,1,0,1,0,0,8,7,9,3,7,11,8,2,10,0,8 +Q,9,14,8,8,5,7,5,4,9,10,4,9,3,7,9,9 +V,8,10,8,8,5,3,12,2,3,9,11,8,4,12,2,7 +E,6,11,8,8,6,8,7,3,9,12,6,9,2,9,5,8 +L,5,5,6,8,2,0,0,7,6,0,1,4,0,8,0,8 +B,3,7,4,5,4,6,7,8,5,7,6,7,2,8,7,9 +O,6,11,6,8,5,8,6,8,5,10,5,8,3,8,3,7 +X,5,10,7,7,6,7,6,3,5,6,6,8,3,9,9,9 +X,6,11,6,6,3,11,7,3,8,10,3,6,4,11,4,10 +J,4,11,5,9,3,7,8,2,7,15,5,8,1,6,1,7 +N,5,6,8,4,4,8,8,2,5,10,4,6,5,9,1,7 +K,6,10,8,8,5,6,6,2,7,10,6,10,4,8,4,8 +U,7,15,6,8,5,7,6,4,5,7,7,8,5,7,3,7 +A,3,3,5,4,1,7,5,3,0,7,1,8,2,7,2,8 +Z,3,10,4,8,4,7,7,6,10,6,6,8,1,8,8,8 +A,5,10,5,6,3,10,2,4,2,11,6,13,5,4,5,10 +O,4,8,4,6,4,8,7,8,3,10,6,8,3,8,3,8 +P,7,8,9,10,11,8,8,3,3,7,8,7,7,11,7,7 +A,1,1,2,1,0,7,4,2,0,7,2,8,2,7,1,8 +G,4,11,6,8,6,7,6,7,5,4,7,9,3,6,5,9 +M,6,9,8,7,6,8,6,2,5,9,6,8,8,6,2,8 +V,5,6,5,4,2,3,12,3,3,10,11,8,2,11,1,8 +J,3,7,4,5,4,9,8,3,4,9,4,7,4,8,6,5 +A,3,8,4,6,3,11,3,2,2,9,1,8,2,6,3,8 +F,5,11,5,8,2,1,11,5,7,11,11,9,0,8,2,6 +J,4,9,6,7,6,9,8,4,4,8,5,6,4,8,6,4 +U,5,7,5,5,2,4,9,5,8,12,10,8,3,9,1,6 +G,6,10,7,8,6,7,7,8,7,6,6,9,2,7,5,11 +D,3,7,4,5,3,8,7,6,6,10,4,5,3,8,3,7 +H,4,4,6,6,4,9,8,3,1,7,6,8,4,9,9,7 +I,4,9,5,7,3,9,6,0,7,13,5,8,0,8,1,8 +E,3,5,6,3,3,7,7,2,8,12,7,9,2,9,4,8 +K,4,6,6,5,5,8,7,2,3,8,3,8,4,5,6,10 +L,4,9,5,7,3,4,4,5,10,2,0,6,0,6,2,5 +L,1,0,2,1,0,2,1,6,5,0,2,4,0,8,0,8 +P,5,5,6,7,7,8,8,3,2,7,8,7,5,10,5,5 +X,4,11,6,8,4,8,7,4,9,6,6,6,3,8,7,7 +M,3,4,4,3,3,8,6,6,4,6,7,8,7,6,2,8 +L,3,6,3,4,1,1,0,6,6,0,1,5,0,8,0,8 +T,4,5,5,3,2,6,11,2,8,11,9,5,4,10,4,4 +S,6,11,6,6,3,9,5,4,4,13,6,9,3,10,3,8 +N,6,11,8,8,5,7,9,6,5,7,7,8,6,9,1,7 +E,5,9,7,7,5,10,6,2,9,11,4,8,2,8,5,12 +C,5,7,6,5,6,8,4,6,3,8,6,11,8,8,4,7 +Q,9,14,8,8,5,7,4,4,8,9,5,9,3,8,9,9 +Y,5,8,7,12,11,8,8,4,2,7,8,9,4,11,8,8 +G,2,2,3,4,2,7,6,6,5,6,6,9,2,9,4,9 +M,4,9,5,7,6,7,5,10,1,7,8,8,6,5,0,8 +D,3,2,4,3,3,7,7,6,7,6,6,5,2,8,3,7 +K,2,3,4,2,2,5,8,2,6,10,8,10,3,8,2,8 +W,2,3,4,2,2,8,11,3,1,6,8,8,6,12,0,7 +P,3,3,3,2,2,5,10,4,4,10,8,4,1,10,3,7 +H,5,10,8,8,5,8,8,3,7,10,6,7,3,8,3,8 +C,5,9,6,7,2,6,7,7,12,7,6,15,1,8,4,9 +S,6,9,7,6,4,8,7,4,8,11,6,8,2,9,5,8 +Q,1,2,2,3,1,7,8,4,1,7,8,10,1,9,3,8 +I,2,8,3,6,2,7,7,0,7,13,6,8,0,8,1,8 +L,3,7,5,5,5,7,8,3,4,6,6,9,5,11,7,5 +I,3,9,4,6,2,7,7,0,8,14,6,9,0,8,1,8 +F,5,7,6,9,7,7,9,5,5,8,6,8,3,9,7,6 +A,4,10,7,7,3,12,3,4,3,11,1,9,2,7,3,9 +N,2,4,4,3,2,7,9,2,4,10,6,7,5,9,0,7 +J,2,7,4,5,3,10,6,2,5,8,4,5,3,8,6,7 +L,3,6,5,5,4,7,8,3,5,7,6,8,3,9,7,11 +U,7,13,6,7,5,9,6,5,6,6,7,6,5,8,4,6 +O,3,6,4,4,3,7,8,6,4,10,7,6,3,9,3,8 +P,8,11,6,6,3,8,7,5,4,11,4,6,5,8,4,8 +N,4,5,6,5,5,7,8,5,3,6,5,8,6,8,4,7 +P,7,11,9,8,5,6,11,4,6,14,6,2,0,10,3,9 +W,4,5,7,4,4,7,11,2,2,6,9,8,7,11,0,8 +O,4,9,5,7,4,7,7,8,5,10,6,7,3,8,3,8 +F,3,2,4,3,2,5,10,4,6,11,9,5,1,10,3,6 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +R,3,7,4,5,4,7,8,5,6,6,5,7,3,7,5,8 +D,2,4,4,3,2,9,6,3,5,10,4,6,3,7,3,8 +W,3,8,5,6,4,5,10,2,3,8,9,9,7,11,1,7 +M,5,9,8,7,8,5,7,3,4,9,9,9,7,5,2,7 +P,10,13,8,8,4,7,10,6,3,12,4,4,5,10,4,8 +T,2,9,3,6,1,9,14,0,6,6,11,8,0,8,0,8 +P,4,8,5,6,3,7,10,2,7,14,6,4,0,10,2,9 +A,2,4,3,3,1,10,2,2,1,8,2,9,1,6,1,8 +Y,3,5,5,8,6,7,10,3,2,7,8,9,3,11,8,5 +F,3,7,4,5,3,5,11,4,6,11,10,4,2,10,2,5 +P,9,14,9,8,6,10,8,4,4,12,4,4,5,10,5,8 +G,4,8,6,6,5,7,6,6,4,7,7,9,5,9,7,8 +U,3,7,4,5,1,7,5,13,5,7,13,8,3,9,0,8 +S,3,5,5,4,2,8,7,3,7,10,6,7,1,9,5,8 +Y,2,6,4,4,1,6,10,3,2,7,13,8,2,11,0,8 +P,6,10,6,8,6,4,11,8,3,9,6,5,1,10,3,8 +U,7,11,6,6,4,6,5,5,4,7,9,10,6,7,3,10 +A,3,10,5,7,2,6,6,3,1,6,0,8,2,7,1,7 +H,4,2,5,4,4,7,8,6,6,7,6,8,3,8,3,8 +R,2,4,3,3,2,8,7,4,5,9,4,7,2,7,3,10 +R,3,4,5,2,3,9,8,3,5,9,4,6,2,6,4,10 +X,6,10,9,8,5,3,9,2,8,11,12,10,3,9,3,5 +J,1,3,2,5,1,11,3,9,3,13,7,13,1,6,0,8 +S,2,3,4,2,2,8,8,2,6,10,6,7,1,9,5,8 +N,3,8,3,6,3,7,7,12,1,6,6,8,5,8,0,8 +Y,5,6,8,9,10,8,8,4,2,7,8,9,6,12,8,8 +A,3,5,5,3,2,11,2,3,2,10,2,9,2,6,2,8 +D,8,14,7,8,6,7,7,4,7,10,6,7,6,7,8,4 +U,6,10,9,7,6,6,7,7,6,6,6,12,6,8,8,2 +L,4,8,5,7,4,6,7,4,6,7,6,8,3,9,8,10 +F,3,7,4,4,1,2,13,5,3,12,9,6,0,8,2,6 +G,4,7,4,5,2,7,6,6,6,11,6,12,2,10,4,10 +F,2,3,4,2,1,6,10,2,5,13,6,4,1,9,1,7 +V,7,10,7,7,3,3,11,3,4,9,11,8,4,12,1,7 +P,4,7,4,5,2,4,12,8,2,10,6,4,1,10,4,8 +S,5,10,6,7,4,6,8,3,6,10,7,7,3,7,5,6 +F,3,1,3,2,2,5,10,4,5,11,9,5,1,10,3,6 +T,3,5,4,4,2,6,12,3,6,7,11,9,2,11,1,8 +C,2,4,3,3,1,4,9,5,7,11,9,12,1,9,2,7 +K,3,3,4,5,2,3,6,7,3,7,7,12,3,8,3,10 +G,3,3,4,4,2,7,8,7,6,6,6,7,2,7,6,11 +H,5,10,8,8,5,8,5,3,6,9,5,8,4,7,4,8 +W,2,0,2,1,1,7,8,4,0,7,8,8,6,10,0,8 +O,6,10,7,8,7,7,8,9,4,7,7,8,3,7,3,7 +V,4,8,6,6,3,6,12,3,3,6,12,9,3,10,1,8 +L,3,5,4,4,2,4,4,4,8,2,1,7,0,7,1,6 +I,2,6,3,4,2,7,7,0,6,13,6,8,0,8,1,8 +B,1,3,3,2,2,7,8,2,4,10,6,6,2,8,4,8 +J,6,10,7,8,3,10,6,2,9,15,3,8,0,7,0,8 +V,7,12,6,6,4,8,9,3,3,8,8,5,5,12,2,8 +V,3,10,5,8,2,7,8,4,3,7,14,8,3,10,0,8 +B,4,7,6,5,4,9,7,3,7,10,4,7,2,8,5,11 +P,4,7,6,5,3,9,8,3,5,13,4,4,1,10,3,9 +T,2,7,3,4,1,7,13,0,6,7,11,8,0,8,0,8 +B,3,8,5,6,5,8,8,5,4,7,5,5,3,8,6,5 +Y,8,11,7,6,4,7,8,4,6,10,6,4,4,10,5,5 +Z,7,11,9,8,6,6,9,3,10,12,8,6,1,8,6,6 +G,2,3,2,1,1,7,7,5,5,7,6,9,2,9,4,9 +D,2,4,4,3,2,9,6,3,6,10,4,6,3,7,3,8 +F,2,1,2,2,1,5,10,4,5,10,9,6,1,9,3,7 +T,3,3,4,2,1,7,12,2,7,7,11,8,1,11,1,7 +T,3,6,4,4,3,6,12,4,6,8,11,8,2,12,1,8 +P,6,11,8,8,6,6,13,6,3,12,6,2,1,11,3,8 +B,1,0,2,0,1,7,8,6,4,7,6,7,1,8,6,8 +N,5,11,7,8,6,7,6,8,5,6,4,7,4,8,3,7 +S,5,8,6,6,3,7,8,4,9,11,4,7,2,6,4,8 +B,5,10,7,8,6,10,6,3,6,10,4,7,3,7,5,11 +S,5,9,8,6,9,6,7,3,2,8,6,6,3,8,11,1 +C,2,5,3,4,2,6,9,7,8,9,8,13,1,10,4,10 +R,4,9,5,6,7,7,8,3,4,7,6,8,6,9,7,5 +O,3,7,4,5,3,8,7,7,3,9,6,8,3,8,3,8 +R,5,9,8,6,9,7,7,3,4,6,6,9,6,9,7,6 +N,5,9,8,7,5,6,9,5,5,7,7,7,6,9,1,6 +G,4,9,5,7,3,8,8,8,8,6,7,8,2,7,6,11 +W,1,0,2,0,0,7,8,4,0,7,8,8,5,9,0,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +H,4,7,6,5,4,4,9,4,5,10,10,9,3,8,3,5 +Z,4,7,6,5,4,7,9,2,9,11,8,5,1,8,6,5 +G,7,10,7,8,6,5,7,6,5,8,8,11,2,7,5,10 +U,6,9,6,6,3,4,9,5,7,13,11,9,3,9,1,7 +Z,1,0,1,1,0,7,7,2,9,9,6,8,0,8,6,8 +R,4,7,6,5,6,8,6,6,3,8,6,8,4,7,7,10 +D,4,7,6,5,5,7,7,5,6,7,6,8,6,8,3,7 +B,3,3,4,4,3,6,6,8,7,6,6,7,2,8,9,10 +Z,6,9,5,12,5,5,11,3,3,12,8,6,3,8,11,6 +U,5,9,5,6,4,7,5,14,5,7,11,8,3,9,0,8 +T,8,11,8,9,7,6,11,2,8,11,9,5,4,10,4,4 +H,1,0,1,0,0,7,7,10,2,7,6,8,2,8,0,8 +O,6,10,4,5,3,6,8,6,5,9,7,9,5,10,5,8 +E,2,3,4,2,2,6,8,2,8,11,8,9,2,9,4,7 +Y,6,9,6,6,3,2,11,4,6,13,12,6,1,11,2,5 +M,4,2,5,3,3,8,6,6,4,6,7,8,7,6,2,6 +E,5,5,5,8,3,3,8,6,12,7,6,15,0,8,7,6 +A,2,3,4,2,1,11,2,3,1,9,2,9,1,6,2,8 +J,2,8,2,6,1,14,3,6,5,14,0,9,0,7,0,8 +F,5,8,7,6,7,7,9,1,4,10,7,6,5,10,3,5 +X,4,9,5,6,1,7,7,4,4,7,6,8,3,8,4,8 +H,3,8,4,6,3,7,7,12,1,7,6,8,3,8,0,8 +A,1,3,2,2,1,12,2,3,1,11,2,9,2,6,2,8 +X,4,7,5,6,6,9,8,2,5,8,5,6,2,6,7,8 +K,2,1,2,2,2,5,7,3,6,7,6,10,3,8,4,10 +U,4,9,6,6,7,10,7,5,4,6,7,7,7,9,5,5 +T,4,7,4,5,2,6,11,4,5,11,9,4,2,12,2,5 +Z,3,8,4,6,4,9,6,5,9,7,5,6,1,7,7,8 +V,4,4,5,3,2,5,12,2,3,9,11,7,4,11,1,7 +I,1,4,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +F,5,8,8,6,7,7,9,1,4,10,6,6,5,11,3,5 +S,3,4,3,3,2,8,7,7,5,7,6,8,2,8,9,8 +B,3,7,4,5,4,8,7,6,6,7,6,5,2,8,7,9 +J,1,3,2,5,1,15,3,5,5,13,0,9,0,7,0,8 +C,2,1,2,1,1,6,8,6,7,8,8,12,1,9,3,10 +T,3,6,5,8,2,5,15,1,6,9,11,7,0,8,0,8 +M,5,8,7,6,5,8,6,6,6,6,7,6,9,7,3,6 +O,4,9,5,6,3,7,5,9,8,6,4,7,3,8,4,8 +N,3,5,5,3,2,9,7,3,5,10,3,5,5,9,1,7 +N,3,5,6,4,3,7,9,2,5,10,6,6,5,9,1,7 +N,4,6,5,4,3,7,8,6,6,7,7,6,6,9,2,6 +U,5,7,5,5,2,4,8,6,7,9,10,9,3,9,2,5 +P,9,12,7,7,3,6,10,6,4,13,6,4,4,10,4,8 +L,4,8,6,6,4,8,4,1,6,9,2,9,1,6,3,9 +W,4,9,6,7,3,9,8,4,1,7,8,8,8,9,0,8 +L,3,4,3,3,1,4,4,4,8,2,1,6,0,7,1,6 +M,7,8,10,6,7,12,6,3,5,9,2,5,9,6,2,8 +N,2,5,3,3,2,7,8,5,4,7,6,6,5,9,1,6 +O,4,10,5,8,5,8,7,7,4,9,5,6,3,8,3,7 +W,5,7,5,5,5,5,10,3,2,9,8,7,6,11,2,6 +L,1,3,2,1,1,7,5,1,7,8,3,10,0,7,2,9 +F,1,0,1,0,0,3,12,4,2,11,8,6,0,8,2,7 +U,6,7,6,5,3,3,9,6,7,11,11,9,3,9,1,6 +Y,5,10,8,7,4,8,10,1,7,4,11,9,2,12,3,8 +J,1,4,3,3,1,9,6,2,6,14,4,9,0,7,0,7 +Q,7,9,8,11,7,8,5,7,5,9,6,9,3,7,6,8 +K,5,9,7,7,6,5,7,1,6,9,8,10,3,8,3,8 +L,5,10,7,7,4,5,4,3,8,6,2,8,1,6,3,6 +H,8,12,7,6,4,7,8,5,4,9,10,9,7,11,5,9 +R,4,7,6,5,4,7,8,5,7,7,4,7,3,6,5,8 +H,8,11,12,8,10,10,6,3,7,10,3,7,5,7,5,10 +S,6,10,8,8,5,8,8,3,6,10,4,7,2,7,5,9 +L,2,6,2,4,1,0,1,5,6,0,0,7,0,8,0,8 +W,2,0,2,1,1,8,8,4,0,7,8,8,6,9,0,8 +F,1,0,1,0,0,3,11,4,3,11,9,7,0,8,2,8 +T,4,10,6,8,4,9,14,0,5,6,10,8,0,8,0,8 +I,0,8,0,5,0,7,7,4,4,7,6,8,0,8,0,8 +Y,5,6,7,9,9,8,10,4,3,6,8,9,5,13,8,8 +U,4,4,4,3,2,4,8,5,7,10,9,9,3,9,2,6 +K,3,5,5,3,2,5,8,1,7,10,8,10,3,8,3,7 +G,5,10,6,8,6,6,5,7,6,7,5,11,3,10,4,9 +K,5,8,7,7,7,7,7,2,4,8,4,8,6,4,9,11 +B,2,7,3,5,4,6,7,7,5,7,6,7,2,8,6,9 +R,2,0,2,1,1,6,10,7,2,7,5,8,2,7,4,10 +T,6,9,6,7,4,6,11,3,7,11,9,5,1,12,2,4 +F,5,10,7,8,6,4,10,2,6,11,10,6,1,10,3,6 +N,6,9,9,6,5,7,9,2,5,10,5,6,6,9,1,7 +U,5,9,7,8,7,7,6,4,4,6,7,8,4,8,1,8 +U,2,4,3,3,1,7,8,6,6,7,9,8,3,9,1,8 +A,3,4,5,3,2,10,2,3,1,9,2,9,2,6,2,8 +L,3,7,4,5,2,3,4,3,8,2,1,7,0,7,1,5 +V,2,2,4,4,1,8,9,4,2,7,13,8,3,10,0,8 +S,8,13,7,7,3,6,2,3,4,6,2,6,3,7,6,7 +R,5,8,8,6,6,10,7,3,6,10,2,7,5,7,5,10 +M,6,11,9,8,7,7,6,6,6,6,7,7,10,8,3,6 +F,4,8,4,6,3,1,12,3,4,11,10,7,0,8,2,6 +V,5,11,7,9,4,9,9,4,2,5,13,8,3,10,0,8 +I,4,8,5,6,3,8,9,1,7,7,6,7,0,7,4,7 +J,9,14,7,11,6,9,9,2,4,12,4,5,2,9,8,9 +Y,4,11,6,8,1,8,10,3,2,6,13,8,2,11,0,8 +W,2,3,3,1,2,5,10,4,2,9,8,7,5,11,1,6 +Z,1,3,3,2,1,8,7,2,9,11,6,9,1,8,5,7 +Z,7,9,5,13,5,7,8,5,3,11,7,7,3,9,11,6 +R,3,5,5,3,3,8,7,4,5,9,4,7,3,7,3,11 +C,3,4,4,2,1,5,8,5,7,10,8,13,1,9,3,8 +X,3,4,5,3,2,5,8,2,8,10,10,9,3,8,3,5 +R,2,3,3,2,2,7,8,5,5,6,5,7,2,6,5,8 +E,4,8,5,6,6,8,7,4,7,7,5,8,6,8,6,10 +J,1,4,2,3,1,10,6,2,6,12,4,9,0,7,1,7 +M,6,9,7,4,3,12,2,3,2,10,3,9,6,4,1,9 +T,6,10,8,8,9,6,7,4,6,7,7,10,7,7,7,6 +E,4,8,5,6,5,7,7,5,8,6,5,9,3,8,6,9 +Q,4,5,6,7,6,9,12,4,2,4,8,12,4,13,5,12 +N,3,4,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +G,3,1,4,2,2,7,7,5,6,7,6,9,3,7,4,8 +F,2,6,3,4,1,1,13,4,3,12,10,6,0,8,2,6 +K,3,8,4,6,2,3,7,8,3,7,6,11,4,8,3,11 +J,2,7,3,5,1,12,2,9,4,14,5,13,1,6,0,8 +C,3,7,4,5,1,5,7,6,9,6,6,14,1,8,4,9 +W,5,9,7,7,5,7,8,4,1,7,9,8,8,10,0,8 +Y,3,5,5,7,1,7,10,1,3,7,12,8,1,11,0,8 +Q,4,7,5,6,3,9,7,8,6,6,6,10,3,8,5,9 +G,6,8,6,6,4,7,6,6,7,10,6,12,2,10,4,9 +M,14,15,14,8,7,10,11,7,4,4,6,10,10,13,3,6 +D,4,9,6,7,4,9,6,5,7,9,3,6,3,8,3,8 +A,3,8,5,6,3,11,3,3,2,10,2,9,2,7,3,9 +J,2,7,4,5,1,9,6,3,6,15,4,9,0,7,1,7 +M,5,7,7,6,8,5,8,5,4,6,5,9,11,9,4,8 +F,5,9,7,6,4,5,12,2,6,13,7,4,1,10,2,7 +K,4,8,6,6,6,7,7,4,4,7,5,7,4,6,9,10 +M,2,1,3,2,2,7,6,6,4,6,7,7,7,6,2,7 +S,7,9,9,8,9,10,7,4,7,7,6,8,5,9,8,12 +D,7,10,9,8,6,11,5,3,8,11,3,6,4,6,4,9 +E,3,10,5,8,5,7,7,5,8,7,7,10,3,8,6,9 +C,4,9,6,7,6,6,6,3,4,8,7,11,6,9,3,9 +I,5,13,4,8,2,9,6,5,4,12,4,7,3,8,5,10 +T,3,5,4,4,3,9,12,3,6,6,11,8,2,11,1,8 +Z,1,3,2,2,1,8,7,5,8,6,6,7,1,8,7,8 +M,4,9,5,6,5,7,6,10,1,7,8,8,8,4,1,7 +T,10,14,8,8,3,4,12,3,8,12,8,4,2,9,3,4 +Q,2,3,2,3,2,8,8,5,2,5,7,10,2,9,5,9 +H,5,11,8,8,7,8,7,3,6,10,5,8,3,9,4,8 +E,2,4,3,3,2,7,7,5,7,7,6,9,2,8,5,10 +V,4,5,5,4,5,7,7,5,4,6,5,7,6,9,6,11 +Z,1,3,2,2,1,7,7,1,8,11,6,8,1,8,5,8 +W,12,13,12,7,5,2,10,3,3,10,12,8,9,10,0,7 +V,3,2,5,4,2,7,12,2,3,7,11,9,2,10,1,8 +F,4,6,4,8,2,0,12,4,5,12,11,8,0,8,2,6 +T,4,10,5,7,3,5,14,1,5,9,10,7,0,8,0,8 +R,4,9,6,6,5,6,8,6,6,6,4,9,3,6,6,9 +G,5,8,6,6,4,6,6,7,6,6,6,11,2,8,4,9 +L,3,7,3,5,2,0,2,4,5,1,1,7,0,8,0,8 +Y,8,11,8,8,5,3,11,3,7,12,11,6,1,11,2,5 +A,3,6,5,4,1,9,4,3,1,8,1,8,3,6,2,8 +N,1,0,2,1,1,7,7,11,1,5,6,8,4,8,0,8 +M,8,10,12,8,9,4,8,3,5,10,10,10,13,8,5,8 +P,3,6,4,4,2,7,11,7,3,11,5,3,1,10,4,7 +V,8,12,6,7,3,8,10,5,5,8,10,5,5,12,3,7 +V,5,10,5,8,4,3,11,2,3,9,11,8,3,10,1,7 +G,7,10,9,8,9,9,4,6,3,8,5,10,11,6,5,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +F,3,7,4,5,3,7,9,2,5,13,6,5,2,10,2,8 +A,1,0,2,1,0,7,4,2,0,7,2,8,2,7,1,8 +Z,4,5,5,8,2,7,7,4,14,9,6,8,0,8,8,8 +V,8,10,8,8,3,4,12,5,5,12,12,7,3,9,2,8 +O,1,1,2,2,1,7,7,6,4,7,6,8,2,8,2,8 +S,7,13,6,7,3,10,3,3,5,10,1,9,3,6,5,10 +Z,4,10,6,7,6,8,8,2,8,7,7,7,1,8,10,8 +X,3,7,5,5,4,7,7,3,8,5,6,9,3,7,7,9 +G,6,10,6,8,5,7,6,6,5,10,7,13,4,8,6,7 +O,4,7,4,5,4,8,7,7,4,9,5,8,3,8,3,8 +N,3,4,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +O,5,8,5,6,4,7,9,7,4,10,7,6,4,9,4,8 +L,4,9,6,8,6,7,6,5,4,7,7,8,3,8,8,10 +Z,3,8,4,6,3,7,8,3,12,8,6,8,0,8,7,7 +I,5,9,4,4,2,7,10,2,5,13,5,4,1,9,5,8 +P,8,12,7,6,4,9,8,4,5,13,4,4,4,10,6,7 +G,3,5,4,3,2,6,7,5,5,9,7,10,2,9,4,9 +P,4,10,5,7,2,3,13,8,2,11,7,3,1,10,4,8 +O,4,8,6,7,5,8,4,5,5,9,4,10,4,7,5,7 +Y,4,10,6,7,1,9,10,3,2,6,13,8,2,11,0,8 +Y,6,11,5,6,3,7,8,4,5,10,7,5,3,9,4,4 +O,1,3,2,2,1,8,6,6,3,9,6,8,2,8,2,8 +E,5,7,6,6,7,7,8,5,4,7,7,10,7,10,9,10 +X,3,7,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +T,2,3,3,2,1,6,12,2,6,11,9,4,1,10,2,5 +S,7,10,6,5,3,7,3,4,4,7,2,7,3,6,5,8 +I,2,6,3,4,2,7,8,0,7,13,6,8,0,8,1,8 +C,4,8,5,6,3,5,8,7,7,8,8,14,2,9,4,10 +O,6,10,7,7,6,7,7,7,4,9,6,10,5,8,5,6 +F,3,6,5,4,4,8,8,1,4,9,6,6,5,10,4,5 +Y,5,8,5,6,2,3,11,2,7,12,11,6,0,10,2,5 +A,3,7,5,4,2,7,4,3,1,7,1,8,2,7,2,8 +E,3,7,3,5,3,3,6,5,9,7,7,13,0,8,7,9 +E,3,5,5,4,3,8,7,2,8,11,5,8,2,8,4,10 +C,3,7,4,5,1,6,7,7,9,7,6,13,1,8,4,9 +O,3,6,4,4,3,7,8,7,5,8,8,6,3,8,3,8 +J,4,10,5,7,5,10,6,3,4,9,3,6,3,7,6,7 +X,5,10,6,7,1,7,7,5,4,7,6,8,3,8,4,8 +T,3,3,4,2,1,5,11,2,7,11,9,5,1,10,2,5 +D,4,9,6,7,4,9,7,5,7,10,4,5,3,8,3,8 +X,4,6,5,5,5,7,8,2,4,7,6,8,2,7,7,7 +Z,2,3,4,2,1,7,7,2,9,11,6,8,1,8,5,7 +P,3,6,4,4,3,3,13,5,1,11,7,4,0,9,3,8 +P,2,4,3,3,1,7,9,3,4,12,5,3,1,10,2,8 +Y,5,8,5,6,3,3,10,2,7,11,11,6,1,11,2,5 +A,2,6,3,4,2,11,3,2,2,9,2,9,2,6,2,8 +P,3,7,3,4,2,4,12,8,2,10,6,4,1,10,4,8 +U,6,10,9,8,12,8,6,4,4,7,7,8,11,9,6,8 +P,4,5,6,7,6,8,10,2,3,8,9,6,5,10,5,5 +G,2,3,3,2,2,7,7,5,5,6,6,9,2,9,4,9 +C,3,4,4,3,1,4,8,5,8,11,9,12,1,9,3,7 +E,2,1,2,2,1,4,7,5,8,7,6,13,0,8,7,9 +W,12,13,11,7,5,8,11,3,3,5,10,7,8,12,1,6 +R,10,15,10,8,8,6,8,3,6,8,4,9,8,4,7,6 +U,4,6,5,4,2,4,9,5,6,12,11,9,3,9,1,7 +V,5,11,8,8,4,7,12,3,4,6,12,9,3,10,1,8 +N,6,8,8,7,8,7,7,5,4,7,5,8,8,8,6,6 +I,5,12,5,6,3,6,11,3,5,13,6,4,1,8,5,8 +Q,6,7,8,10,11,9,7,6,1,6,6,9,9,11,6,9 +M,5,9,8,7,7,10,6,2,4,9,5,7,7,6,2,8 +V,7,11,6,6,3,9,9,6,4,6,10,6,6,13,3,6 +X,2,3,3,2,1,7,7,3,8,6,6,8,2,8,5,8 +C,6,8,6,6,3,3,8,4,7,10,10,13,1,7,3,7 +A,5,12,6,6,3,13,1,4,1,12,3,11,2,3,3,11 +R,8,15,8,8,6,8,6,3,5,9,4,8,6,8,6,7 +G,4,6,5,4,3,6,7,6,6,10,7,11,2,9,4,10 +L,3,6,4,4,2,5,5,1,9,7,2,11,0,8,3,7 +B,4,3,5,5,4,6,7,9,7,7,6,7,2,8,9,9 +W,3,4,5,3,3,7,11,2,2,7,9,8,7,11,1,8 +V,9,13,9,7,4,6,10,4,3,8,8,5,5,12,3,8 +X,6,10,6,6,3,7,7,2,7,11,6,8,4,9,4,7 +A,3,10,5,8,4,12,3,1,2,9,2,9,3,6,2,8 +Z,5,11,7,8,4,7,7,2,11,11,6,8,1,8,6,7 +R,5,10,6,8,7,8,6,6,4,8,6,8,7,7,6,11 +B,2,1,3,2,2,8,7,5,5,7,6,5,2,8,6,9 +C,4,7,6,5,3,7,7,8,6,6,6,10,3,8,4,9 +V,3,3,4,2,1,4,12,3,3,9,11,7,2,10,0,8 +E,4,7,5,5,4,6,8,7,9,6,4,10,2,8,6,8 +R,3,8,5,6,4,8,7,5,7,7,6,6,3,8,5,8 +V,3,5,5,3,2,4,12,3,3,9,11,7,2,11,1,8 +V,5,9,5,7,3,3,11,2,3,10,11,8,2,11,1,8 +N,5,10,7,8,6,6,8,8,6,8,6,7,3,7,3,8 +P,4,8,6,11,10,9,6,6,2,7,6,7,7,9,8,11 +P,7,11,9,8,5,6,12,3,6,14,6,2,0,10,3,9 +H,5,6,7,4,4,8,8,3,6,10,5,7,3,8,3,8 +F,3,7,4,5,3,5,10,4,5,10,10,6,2,10,3,6 +A,5,11,9,8,7,8,4,1,4,6,2,6,5,8,6,6 +U,3,7,3,5,2,7,5,14,5,7,12,8,3,9,0,8 +Z,2,2,3,4,2,8,7,5,9,6,6,8,1,8,7,8 +W,4,2,6,3,3,9,11,3,2,5,9,8,8,11,2,8 +Z,4,9,5,7,4,7,7,3,12,9,6,8,0,8,8,8 +S,5,11,7,8,9,6,5,3,2,6,5,6,5,8,15,3 +B,5,6,6,8,5,6,6,9,8,6,7,7,3,8,10,10 +F,4,9,4,4,3,7,9,2,4,11,6,5,3,10,6,6 +B,5,9,7,7,5,9,7,4,6,10,5,6,2,8,6,10 +E,4,7,6,5,5,10,6,1,7,11,4,8,3,8,5,11 +C,5,10,6,8,2,5,7,7,11,7,6,14,1,8,4,9 +K,2,4,4,3,2,6,7,2,6,10,7,10,3,8,2,8 +I,1,4,2,2,1,7,7,1,7,13,6,8,0,8,1,8 +Z,8,12,8,7,5,8,6,2,9,12,6,9,3,7,7,7 +J,1,1,2,2,1,11,6,2,5,11,4,8,0,7,1,7 +P,6,11,5,6,3,5,11,5,3,13,6,4,4,10,4,8 +P,9,11,7,6,4,6,10,6,3,11,5,5,5,9,4,8 +C,2,4,3,2,1,6,8,7,8,8,8,13,1,9,4,10 +S,7,11,9,8,5,7,8,4,9,11,5,7,2,7,5,8 +R,2,3,3,2,2,9,6,4,5,9,4,7,2,7,4,10 +Z,4,8,5,6,4,8,6,2,9,11,5,9,2,8,6,9 +N,6,7,8,5,3,5,9,3,5,11,9,9,6,8,1,8 +B,3,7,4,5,4,6,6,8,6,6,7,7,2,9,7,9 +G,4,4,5,6,3,7,6,8,7,6,6,7,2,8,6,11 +K,6,10,8,8,8,6,7,4,7,6,6,10,3,8,6,10 +A,4,9,6,7,4,12,2,3,3,10,2,9,2,6,4,8 +U,3,3,3,5,1,8,5,13,5,6,13,8,3,9,0,8 +E,3,7,4,5,4,7,7,5,8,6,5,10,2,8,5,9 +X,2,7,4,5,4,7,6,2,6,7,5,8,3,7,5,9 +K,3,6,4,4,1,3,6,7,3,7,7,11,3,8,2,10 +X,4,9,6,6,4,7,7,3,8,5,6,7,3,9,7,6 +T,3,4,4,3,1,5,11,2,7,11,9,4,1,10,2,5 +N,5,8,7,6,7,6,8,3,4,8,7,9,6,9,5,5 +V,6,11,6,8,4,3,11,3,4,9,11,8,3,11,1,7 +U,3,5,4,3,2,7,9,6,7,7,9,9,3,9,1,8 +U,4,11,6,8,4,8,8,6,7,4,8,9,6,10,1,8 +Z,3,5,5,7,4,9,5,4,4,7,3,6,2,8,7,6 +S,5,10,6,7,3,9,6,5,8,11,3,7,2,8,5,11 +V,4,6,4,4,2,1,11,5,3,12,12,8,2,10,1,7 +N,3,6,4,4,3,8,8,6,5,6,6,5,5,9,2,5 +I,1,3,1,1,0,8,7,1,7,13,6,8,0,8,0,8 +G,4,9,4,6,3,6,7,6,5,10,8,10,2,9,4,9 +V,2,3,4,5,1,7,8,4,2,7,13,8,3,10,0,8 +Z,10,10,7,14,6,7,8,4,2,11,7,7,3,8,13,5 +B,4,10,4,8,4,6,7,9,6,7,6,7,2,8,9,10 +Z,3,5,4,4,3,7,7,5,9,6,6,8,1,8,7,8 +C,2,1,2,2,1,6,7,6,9,7,6,14,0,8,4,9 +H,5,10,6,7,3,7,6,15,1,7,8,8,3,8,0,8 +C,3,8,4,6,2,5,8,7,7,8,8,14,2,10,4,10 +X,3,8,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +F,1,0,2,1,0,3,12,5,2,11,8,6,0,8,2,7 +X,4,5,7,4,3,5,8,2,9,11,10,9,3,7,4,5 +L,5,8,6,6,5,6,6,6,6,6,5,8,5,8,4,9 +I,3,8,4,6,2,6,9,0,7,13,7,7,0,8,1,7 +S,3,5,4,3,3,8,8,7,5,7,6,8,2,8,9,8 +E,5,4,5,6,3,3,7,6,11,7,6,15,0,8,7,7 +W,3,8,5,6,9,7,7,6,1,7,6,8,8,12,2,11 +R,2,1,2,2,2,6,7,4,4,6,5,6,2,7,3,8 +L,4,7,5,5,2,8,3,2,8,9,2,9,1,6,3,9 +Y,6,9,8,7,7,9,3,7,5,7,9,7,3,8,8,3 +X,3,9,4,7,3,7,7,4,4,7,6,8,3,8,4,8 +U,9,14,8,8,5,6,5,5,5,6,8,9,6,8,4,9 +O,7,14,5,8,4,5,8,7,4,10,8,9,5,10,5,8 +X,4,10,7,8,4,10,6,2,8,10,1,7,3,8,4,9 +A,3,10,5,7,2,7,5,3,1,6,0,8,3,7,2,7 +A,4,10,7,8,5,7,3,1,2,5,2,8,4,5,4,6 +N,3,9,4,7,4,7,7,12,1,6,6,8,5,8,0,7 +P,7,9,9,7,5,8,11,7,4,11,4,3,2,10,4,8 +E,4,9,6,7,5,6,8,3,7,11,8,8,3,8,5,6 +K,3,6,5,4,3,5,6,6,7,7,7,12,3,8,5,11 +Q,4,7,5,6,2,8,8,8,6,5,8,9,3,8,5,10 +G,7,10,6,5,4,8,4,4,3,8,6,10,4,9,6,7 +K,6,10,8,8,5,5,8,2,7,10,8,11,3,8,3,7 +B,4,8,6,6,5,10,6,2,6,10,3,7,4,8,5,11 +H,7,9,10,7,7,6,8,3,7,10,9,9,8,9,6,6 +D,3,8,5,6,3,11,6,3,7,11,3,6,3,8,3,9 +A,2,7,4,5,3,11,3,2,2,9,2,9,1,6,2,8 +T,2,3,3,2,2,8,11,3,6,6,10,8,2,11,1,8 +I,1,6,2,4,1,7,7,1,8,7,6,8,0,8,3,8 +B,3,5,4,4,3,8,7,6,6,6,6,5,2,8,7,8 +O,6,11,7,8,5,7,7,8,5,10,6,8,3,8,3,8 +Z,4,9,5,7,5,8,8,3,8,7,7,7,1,8,11,7 +Q,3,3,4,4,3,7,8,5,3,8,8,10,3,9,5,8 +K,9,15,9,8,6,2,9,3,6,9,9,12,4,7,3,6 +N,6,10,9,7,5,10,7,3,5,10,3,5,6,9,1,7 +X,3,4,5,3,2,7,7,4,9,6,6,8,2,8,6,8 +U,8,14,7,8,5,7,6,5,5,6,7,8,5,7,3,7 +T,6,11,6,8,5,4,12,3,6,12,10,5,2,12,2,4 +X,3,6,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +D,4,6,6,4,4,9,7,3,6,11,4,6,3,8,3,8 +P,6,9,8,7,4,7,10,5,4,12,5,3,1,10,3,9 +N,4,5,6,4,3,7,8,2,5,10,6,6,5,9,1,7 +K,8,14,8,8,4,7,7,3,6,9,9,9,6,11,4,7 +W,8,8,11,7,12,7,7,5,5,6,5,8,10,9,9,8 +Z,2,5,4,3,2,8,7,2,9,11,6,8,1,7,6,7 +H,3,5,5,4,3,7,8,5,7,7,6,8,6,8,3,8 +G,2,3,3,2,1,7,7,6,6,7,5,10,2,9,4,9 +K,4,9,4,6,2,3,8,7,2,7,5,11,3,8,3,10 +W,4,9,7,7,5,9,10,2,3,6,9,8,7,11,1,8 +U,2,1,2,1,1,7,8,6,5,7,9,9,3,10,0,8 +E,5,9,5,7,3,3,7,6,11,7,6,14,0,8,8,7 +T,3,3,3,2,1,5,11,2,6,11,9,5,1,10,2,5 +Z,1,3,3,2,1,8,7,1,9,11,6,8,1,8,5,7 +R,4,10,5,7,3,5,11,9,4,7,3,9,3,7,6,11 +S,7,10,9,8,5,7,8,4,9,11,5,6,2,6,5,8 +L,5,11,7,8,4,6,4,0,9,8,2,11,0,7,2,8 +X,5,8,7,6,5,8,6,3,5,6,7,8,2,9,8,9 +C,6,11,7,8,5,5,7,7,9,8,6,13,2,11,5,8 +M,5,9,8,7,11,8,6,3,2,8,4,8,13,6,3,7 +Z,4,8,5,6,5,9,6,5,9,7,5,7,1,7,7,8 +J,5,7,7,9,6,9,8,5,5,6,5,8,3,8,9,7 +A,3,6,5,5,4,9,7,4,5,6,8,5,4,10,4,5 +F,5,11,7,8,7,5,9,4,6,10,10,6,2,9,3,6 +X,3,5,4,4,3,8,7,3,9,6,6,8,2,8,6,8 +C,4,9,5,7,4,5,7,8,7,10,8,13,2,11,4,10 +E,9,14,7,8,5,7,9,5,5,10,6,10,3,8,7,10 +H,3,6,5,4,4,5,9,3,6,10,8,8,3,8,3,6 +S,4,6,5,4,3,8,7,3,7,10,6,8,2,9,4,8 +I,1,4,1,3,1,7,7,1,7,7,6,8,0,8,2,8 +X,5,11,6,6,3,4,9,3,7,11,10,9,4,10,3,5 +O,7,15,5,8,4,6,7,7,4,9,7,9,5,10,5,8 +Q,5,10,7,8,4,8,9,8,7,5,9,9,3,7,6,10 +F,2,3,4,2,1,6,11,3,5,13,7,4,1,9,1,7 +S,3,4,3,2,2,8,8,6,5,7,6,7,2,8,9,8 +E,7,11,10,8,6,9,7,2,9,12,4,8,5,7,7,10 +W,4,6,6,4,5,8,7,6,3,6,8,8,6,8,3,7 +Y,4,11,7,8,1,9,10,3,2,6,13,8,2,11,0,8 +O,7,11,8,8,6,8,6,8,6,10,4,8,4,9,5,6 +W,4,3,6,4,2,11,8,5,1,6,9,8,8,10,0,8 +Z,6,7,5,10,4,8,5,5,5,11,6,7,3,9,9,8 +N,2,3,4,1,1,5,9,3,4,11,8,8,5,8,0,7 +V,4,8,4,6,3,4,11,2,2,9,10,8,3,12,1,8 +N,9,13,8,7,4,5,9,4,6,3,4,11,6,10,2,7 +P,9,10,7,5,3,7,9,7,5,14,4,4,4,10,4,8 +K,1,0,1,0,0,4,6,6,2,7,6,11,3,7,2,10 +F,5,10,8,8,5,6,10,3,6,13,7,5,2,9,3,7 +R,5,9,5,4,3,8,8,3,5,9,2,6,5,6,5,7 +D,4,7,6,5,4,9,7,4,6,10,5,5,3,8,3,8 +Z,3,3,4,4,3,7,7,5,10,6,6,8,2,8,7,8 +E,4,9,6,7,7,7,8,3,6,5,7,10,5,11,7,8 +V,3,11,5,8,4,8,11,2,3,5,10,8,3,12,1,8 +I,5,7,6,8,6,8,10,4,5,6,7,9,3,6,8,6 +L,3,3,4,5,1,0,0,6,6,0,1,5,0,8,0,8 +G,2,1,3,2,2,7,7,5,4,7,6,9,3,6,4,9 +G,4,5,5,8,2,7,6,8,9,6,5,11,1,8,6,11 +F,3,6,5,4,4,7,10,1,4,9,6,6,4,9,2,5 +U,5,5,6,7,2,7,4,14,6,7,15,8,3,9,0,8 +D,5,8,5,6,4,6,7,9,8,7,7,6,2,8,3,8 +W,8,9,8,4,3,7,10,3,2,7,10,7,9,12,1,6 +D,5,5,6,8,3,5,7,10,9,7,6,5,3,8,4,8 +I,2,2,1,3,1,7,7,1,8,7,6,8,0,8,3,8 +L,2,2,3,3,1,4,4,4,7,2,1,6,0,7,1,6 +T,5,8,7,7,7,6,7,3,8,7,6,9,4,6,9,4 +M,8,11,10,8,13,7,7,7,4,7,5,8,7,11,9,8 +D,4,11,4,8,3,5,7,11,8,7,6,5,3,8,4,8 +F,6,9,8,7,4,5,11,1,6,13,7,4,1,10,2,7 +D,2,4,4,3,2,8,7,4,6,10,5,6,2,8,2,8 +Z,2,4,4,3,2,7,8,2,9,12,6,8,1,8,5,7 +F,3,4,5,3,2,5,11,3,5,13,7,5,1,9,1,7 +H,4,9,6,6,5,7,6,7,7,7,7,9,3,8,3,9 +Q,3,5,4,6,2,8,8,7,5,5,8,9,3,8,5,9 +X,2,2,4,3,2,8,7,3,9,6,6,8,2,8,6,8 +A,4,8,6,7,6,7,8,2,4,7,8,8,5,8,5,6 +G,4,6,6,4,5,7,7,5,3,6,6,10,4,8,7,8 +V,9,13,7,7,4,7,8,7,4,8,9,6,7,13,3,9 +Y,7,8,5,12,4,10,10,1,4,7,10,5,3,9,5,10 +M,4,7,5,5,5,8,6,6,4,7,7,8,8,5,2,7 +G,3,9,5,6,4,6,6,6,6,7,5,12,2,9,4,9 +V,1,0,2,1,0,7,9,3,2,7,12,8,2,10,0,8 +A,2,1,4,2,1,8,2,2,2,8,1,8,2,6,2,7 +A,3,5,5,4,2,11,2,2,2,9,2,9,2,6,2,8 +O,4,9,6,6,4,7,6,8,5,7,4,8,3,8,3,8 +I,1,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +M,4,4,5,3,3,7,6,6,5,6,7,7,8,6,3,7 +W,4,7,6,5,5,7,9,6,4,8,8,7,6,8,3,8 +W,5,7,7,5,3,6,8,5,1,7,8,8,8,9,0,8 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +L,4,10,6,8,3,5,4,1,9,7,2,11,0,7,3,7 +U,6,9,8,8,8,7,6,4,5,6,6,8,7,9,2,8 +I,2,9,3,7,2,9,7,0,7,13,5,8,0,8,1,8 +I,1,3,1,2,0,7,7,1,8,7,6,8,0,8,3,8 +Q,3,8,4,7,2,8,7,8,5,6,7,8,3,8,5,9 +U,4,4,5,3,2,4,7,5,8,10,8,9,4,11,3,4 +G,3,6,4,4,4,7,8,5,3,6,6,9,3,7,6,8 +L,4,9,5,8,5,7,6,5,5,7,7,8,3,9,8,11 +A,2,7,3,5,2,12,3,2,2,10,2,9,2,6,2,8 +I,1,5,2,3,1,7,7,0,7,13,6,8,0,8,1,8 +U,2,3,3,2,1,5,8,5,6,10,9,9,3,10,2,6 +B,5,9,7,7,6,9,7,3,7,10,4,6,2,8,5,10 +I,0,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +O,6,11,6,8,5,8,7,8,5,10,5,8,4,9,4,6 +C,5,11,6,8,3,6,7,7,11,5,6,14,1,7,4,8 +G,4,9,5,7,3,8,7,8,7,6,6,9,2,7,6,10 +D,4,8,6,6,4,6,8,7,7,11,7,5,3,8,4,8 +C,4,8,5,6,3,5,8,7,8,8,8,14,2,9,4,9 +M,4,7,6,5,4,4,7,4,5,10,11,10,6,5,2,6 +S,4,11,5,8,4,8,8,8,7,8,4,7,2,7,9,8 +R,3,4,4,2,3,7,7,5,5,7,5,7,2,7,4,8 +Q,5,6,7,9,10,8,9,5,2,6,7,9,9,14,10,14 +B,7,11,10,8,7,11,6,3,8,11,3,7,3,8,5,12 +O,1,0,2,0,0,7,7,6,4,7,6,8,2,8,3,8 +U,5,8,5,6,4,8,6,12,4,7,12,8,3,9,0,8 +I,3,8,4,6,2,7,7,0,7,13,6,8,0,8,1,7 +M,8,12,9,6,5,3,8,5,6,4,2,11,8,8,2,8 +K,5,6,7,4,3,9,7,2,7,11,3,7,3,8,3,9 +C,1,0,1,1,0,6,7,6,7,7,6,13,0,8,4,10 +W,2,0,3,1,1,8,8,4,0,7,8,8,6,10,0,8 +A,3,9,5,6,3,12,2,4,2,11,2,9,3,7,3,9 +J,2,6,3,4,2,7,7,3,5,14,6,10,1,6,0,7 +E,7,10,5,5,2,7,8,5,7,10,6,8,1,9,7,8 +H,5,9,8,7,8,7,7,6,6,7,6,8,3,8,3,8 +S,2,3,3,1,1,7,9,3,7,11,7,7,1,9,4,6 +T,4,7,5,5,4,8,10,3,6,10,8,5,2,12,3,5 +P,12,13,9,8,4,7,9,6,4,11,4,5,5,9,5,8 +T,2,3,3,2,1,7,12,3,5,7,10,8,2,11,1,8 +F,3,9,4,6,1,1,14,5,3,12,10,5,0,8,2,6 +O,2,2,3,4,2,7,7,7,4,7,6,8,2,8,3,8 +N,5,11,5,8,5,7,7,13,1,6,6,8,6,8,1,9 +Q,4,8,5,8,3,8,6,9,7,7,4,9,3,8,4,8 +E,4,7,5,6,5,6,7,4,4,7,7,9,4,11,8,11 +V,8,11,7,8,4,4,11,3,4,9,11,7,2,10,1,8 +D,4,11,5,8,5,8,7,6,7,7,6,5,6,8,3,7 +T,5,10,5,5,3,7,9,2,6,11,6,7,2,9,4,6 +P,4,9,6,6,4,7,11,7,3,11,5,3,2,10,4,8 +J,5,10,7,8,3,7,7,3,6,15,6,10,3,8,2,8 +T,3,4,4,3,1,5,11,2,7,11,9,5,1,10,2,5 +I,2,9,2,6,2,7,7,0,8,7,6,8,0,8,3,8 +B,3,5,5,4,5,7,8,4,4,7,6,8,6,9,7,8 +R,5,8,7,6,7,7,6,3,5,7,6,8,6,9,6,7 +T,3,10,5,7,1,10,15,1,6,4,11,9,0,8,0,8 +K,3,8,5,6,3,5,7,5,7,6,6,11,3,8,5,9 +C,4,8,5,6,3,6,8,7,8,8,8,14,2,10,4,9 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +I,0,6,0,4,0,7,7,5,3,7,6,8,0,8,0,8 +F,4,10,4,8,3,1,13,4,3,12,10,6,0,8,2,6 +I,4,10,6,8,7,8,9,3,5,9,5,4,6,9,7,2 +W,3,2,5,4,3,7,10,2,2,7,9,8,7,11,0,8 +S,4,10,5,7,4,7,7,5,8,4,6,10,1,10,9,9 +U,3,5,4,4,2,7,8,5,6,5,9,9,5,10,1,7 +V,5,9,7,7,4,7,12,2,3,5,11,9,4,10,2,7 +Y,1,1,2,1,1,7,10,1,5,7,11,8,1,11,1,8 +L,5,10,8,8,9,7,7,3,6,6,7,11,6,12,6,6 +I,0,0,0,0,0,7,7,4,4,7,6,8,0,8,0,8 +E,4,9,5,7,4,4,9,3,8,10,8,10,2,8,4,6 +M,3,4,4,3,3,7,6,6,4,6,7,8,7,5,2,8 +G,4,9,5,7,2,8,6,8,8,6,6,12,2,8,5,10 +E,6,9,8,7,8,8,10,6,3,6,6,9,5,7,7,9 +D,3,6,5,4,6,9,9,4,4,7,6,6,3,8,7,5 +H,5,10,8,8,8,7,7,5,7,7,6,8,6,8,4,8 +Y,3,8,5,5,1,8,10,2,3,7,12,8,1,11,0,8 +B,4,6,6,4,3,10,7,3,8,11,3,6,2,8,5,10 +G,6,9,7,7,4,6,7,7,8,10,7,11,2,9,4,9 +N,4,9,5,4,2,7,8,3,3,12,9,9,5,9,0,8 +P,4,7,4,5,2,4,14,8,1,11,6,3,0,10,4,8 +L,5,9,7,8,6,7,8,3,6,6,7,9,3,8,8,8 +T,4,7,5,5,4,7,7,7,6,7,8,8,3,10,5,9 +U,6,11,6,8,3,8,4,14,6,6,15,8,3,9,0,8 +K,4,5,5,4,3,5,6,4,8,7,7,11,3,8,5,10 +K,5,11,6,8,5,4,8,8,3,6,3,11,3,8,2,11 +I,0,7,0,4,0,7,7,4,4,7,6,8,0,8,0,8 +B,2,5,3,4,3,7,7,5,5,6,6,6,2,8,5,9 +J,5,11,7,8,8,8,6,4,4,8,5,5,6,6,6,3 +S,4,10,5,8,2,7,7,6,9,4,6,8,0,8,9,8 +Q,3,5,4,6,4,7,8,5,2,7,8,11,2,9,5,8 +L,4,10,5,7,3,0,2,4,6,1,0,8,0,8,0,8 +K,6,10,6,5,4,9,6,3,6,11,2,8,5,6,4,9 +Z,1,3,2,2,1,7,7,1,8,11,6,9,1,9,5,8 +K,5,5,5,8,2,4,6,8,2,7,7,12,3,8,3,11 +L,3,6,4,4,2,6,5,1,9,7,2,10,0,7,3,8 +S,2,3,4,1,1,8,8,2,7,10,6,7,1,9,4,8 +H,1,0,1,0,0,7,8,10,1,7,6,8,2,8,0,8 +N,4,8,5,6,5,6,6,7,5,6,5,7,3,7,3,8 +H,9,11,12,8,8,7,7,3,6,10,7,9,3,8,4,8 +K,4,9,6,7,7,7,6,5,5,6,5,7,7,6,8,14 +C,4,9,6,7,2,6,6,7,11,9,5,13,1,10,4,9 +S,2,3,3,1,1,8,8,2,7,10,6,7,1,9,4,8 +S,4,7,6,5,7,7,8,3,3,8,6,7,3,7,12,2 +H,1,1,2,1,1,7,7,11,1,7,6,8,3,8,0,8 +Z,9,10,6,14,6,6,9,5,2,12,8,7,3,8,12,5 +B,3,7,4,5,4,8,8,6,6,7,5,6,2,8,6,9 +Q,5,8,6,7,3,9,7,9,7,6,6,10,3,8,5,9 +D,3,6,4,4,3,8,7,5,7,10,5,6,3,8,3,9 +G,7,12,6,6,4,7,8,4,3,9,5,6,3,9,10,7 +D,3,6,4,4,4,8,7,5,8,7,7,5,3,8,3,7 +S,5,11,6,8,4,8,7,3,6,10,7,9,2,10,5,8 +U,4,9,6,6,5,8,8,8,5,6,7,9,3,8,4,6 +E,4,9,3,4,2,8,7,3,4,10,5,8,3,9,8,11 +B,1,3,3,2,2,9,6,3,5,10,5,7,2,8,4,9 +I,3,7,4,5,2,6,8,0,7,13,7,8,0,8,1,7 +Z,2,4,3,2,2,7,7,5,9,6,6,8,2,8,7,8 +C,3,7,4,5,2,5,8,7,8,7,8,14,1,8,4,10 +H,6,8,9,6,5,5,8,4,7,10,10,10,5,10,4,6 +O,3,6,4,4,2,9,9,8,7,5,8,10,3,8,4,8 +Z,2,3,4,2,1,7,7,2,9,12,6,9,1,9,5,7 +F,6,11,6,6,4,10,7,2,5,10,5,6,4,8,6,9 +X,4,8,4,6,3,7,7,4,4,7,6,8,3,8,4,8 +W,7,9,8,4,4,4,8,2,3,8,10,8,9,11,2,5 +Z,5,7,4,11,4,7,8,4,2,12,7,7,3,9,11,5 +A,4,9,6,8,6,10,7,4,6,6,9,5,5,11,4,4 +A,4,11,7,8,4,12,2,3,3,10,2,9,3,7,4,9 +N,3,5,6,4,3,6,9,2,4,10,7,7,5,8,1,8 +C,5,5,6,8,3,5,7,7,11,7,6,12,1,8,4,9 +R,4,7,5,5,4,8,9,6,6,8,5,8,3,7,6,11 +R,5,5,5,8,3,6,10,10,4,7,5,8,3,8,6,11 +U,7,11,10,8,8,8,7,8,6,6,7,9,4,9,5,6 +G,5,4,6,6,3,8,8,8,8,6,7,8,2,7,6,11 +B,4,8,5,6,5,10,7,3,6,10,4,6,2,8,4,10 +M,2,3,3,2,2,8,6,6,4,7,8,8,6,5,2,8 +R,2,4,4,3,3,8,7,4,5,8,5,7,3,7,4,11 +X,10,13,9,7,4,6,7,2,9,9,7,9,4,6,4,6 +N,4,7,6,5,4,8,8,6,5,7,6,5,5,9,2,6 +H,3,2,5,3,3,8,7,6,6,7,6,7,3,8,3,7 +W,5,9,8,6,3,4,8,5,2,7,9,8,8,9,0,8 +E,4,9,4,6,4,3,9,5,10,7,6,14,0,8,6,8 +L,3,7,5,5,3,4,3,8,6,1,3,3,1,6,0,6 +I,7,13,6,8,3,10,7,2,5,11,5,6,2,10,5,11 +X,4,6,6,4,4,7,7,2,6,7,5,8,3,6,6,8 +E,4,6,5,4,5,7,7,3,6,7,7,11,4,9,7,8 +L,2,5,4,3,2,6,4,1,8,8,2,10,0,7,2,8 +B,2,1,2,2,2,7,7,4,4,6,6,6,2,8,4,10 +K,4,7,6,6,6,10,6,2,3,9,3,8,5,6,6,13 +R,2,4,3,3,2,10,6,3,5,10,3,7,2,7,3,10 +O,4,11,5,8,4,7,7,9,5,7,6,8,3,8,3,8 +C,7,10,5,6,2,5,10,5,8,11,8,9,2,8,5,8 +D,5,8,6,6,5,8,7,6,9,7,6,5,6,8,3,7 +V,2,7,4,5,2,9,11,3,3,3,11,9,2,10,1,8 +Z,1,0,2,1,0,7,7,2,10,8,6,8,0,8,6,8 +Q,4,8,5,9,5,8,7,7,4,9,6,9,3,8,6,8 +L,7,13,7,7,5,9,3,4,3,11,6,10,4,8,7,9 +L,5,10,7,8,3,8,3,2,8,9,2,9,1,6,3,8 +O,4,5,6,7,3,9,6,9,8,8,4,9,3,8,4,8 +N,6,11,8,8,5,7,8,6,6,7,7,5,7,10,3,4 +U,1,0,2,1,0,7,5,10,4,7,12,8,3,10,0,8 +D,6,11,6,6,4,6,8,4,7,10,6,7,5,8,6,5 +A,2,6,4,4,2,8,3,2,2,7,1,8,2,6,2,6 +L,4,10,6,7,4,9,3,2,7,8,2,9,3,4,4,9 +Z,3,5,6,4,3,7,7,2,10,12,6,8,1,8,6,8 +E,2,1,2,3,2,7,7,6,6,7,6,8,2,8,5,10 +E,2,4,2,3,2,7,7,5,7,7,6,8,2,8,5,10 +N,1,0,2,1,1,7,7,11,1,5,6,8,4,8,0,8 +W,4,9,6,6,3,7,8,4,1,6,8,8,8,9,0,8 +B,5,9,6,7,6,8,8,6,7,7,6,6,6,8,7,11 +Q,5,9,7,11,8,9,8,8,3,5,6,10,3,9,6,10 +V,4,9,6,7,2,8,8,5,3,6,14,8,3,9,0,8 +G,4,8,5,6,4,8,7,8,6,6,7,9,2,7,5,10 +X,6,9,10,7,4,8,8,1,9,10,5,7,3,8,4,8 +J,6,9,8,10,7,7,8,4,6,7,7,7,4,8,10,10 +R,3,2,4,4,3,7,7,5,5,6,5,6,3,7,4,8 +E,3,6,5,4,3,5,8,3,8,11,8,9,2,8,4,7 +M,7,13,8,7,5,9,3,2,2,9,4,9,6,2,1,9 +W,6,9,6,5,3,2,10,2,3,10,11,9,6,11,1,6 +K,8,11,11,8,7,5,7,2,7,10,8,11,3,8,3,7 +C,3,6,5,4,1,6,6,6,10,7,5,13,1,9,4,9 +D,2,5,4,3,3,9,6,3,5,10,4,6,3,7,3,8 +I,1,2,1,3,1,7,7,1,7,7,6,8,0,8,2,8 +J,3,5,5,4,2,8,6,3,7,15,5,10,1,6,1,7 +T,5,7,6,5,4,7,9,1,9,10,9,5,0,9,3,5 +J,3,6,4,4,1,8,6,5,6,15,7,12,1,6,1,7 +L,3,11,5,8,4,3,5,2,8,3,1,9,0,7,1,6 +F,7,10,6,5,4,8,9,3,4,11,6,5,3,9,6,7 +Z,2,4,5,3,2,8,7,2,9,12,6,8,1,8,5,8 +E,3,7,5,5,3,8,7,2,9,11,5,8,2,8,5,9 +V,9,14,8,8,5,6,9,4,4,8,8,5,5,13,3,7 +E,4,11,6,8,5,10,6,2,7,11,4,9,3,7,6,12 +X,6,8,8,7,8,8,8,2,5,8,6,8,4,8,8,8 +D,3,5,4,4,3,7,7,7,7,6,6,5,2,8,3,7 +K,7,9,10,6,7,9,7,1,6,10,3,8,6,7,5,10 +B,2,5,4,4,3,9,7,2,6,11,5,7,4,7,5,9 +K,4,8,6,6,6,6,8,5,4,7,5,8,4,6,9,9 +I,5,12,5,6,3,9,8,2,5,12,4,5,2,10,5,11 +L,6,10,8,8,9,6,7,3,6,7,7,11,6,12,6,7 +X,5,5,6,8,2,7,7,5,4,7,6,8,3,8,4,8 +Q,8,13,7,7,6,9,6,4,7,10,6,7,4,8,10,9 +W,8,9,8,6,5,1,10,2,3,10,11,9,7,10,1,7 +G,5,11,6,8,3,7,6,8,9,5,5,10,1,8,6,11 +P,3,7,3,4,2,4,12,8,2,10,6,4,1,10,3,8 +D,3,5,4,4,3,7,7,7,6,6,6,5,2,8,3,7 +G,4,4,5,6,2,7,5,7,8,6,5,11,1,8,6,11 +U,4,6,5,4,4,7,8,7,5,5,7,11,4,9,5,5 +Z,4,6,5,4,3,7,7,2,9,11,6,8,1,9,6,8 +U,3,7,3,5,2,8,6,10,4,7,12,9,3,9,0,8 +M,4,6,6,4,4,11,7,2,4,9,3,6,7,6,2,8 +A,2,1,3,1,1,7,4,2,0,7,2,8,3,6,1,8 +V,5,11,8,8,5,7,12,2,3,5,10,9,4,11,2,7 +K,5,9,8,6,4,3,8,3,8,12,12,12,3,8,4,5 +A,1,0,2,0,0,7,4,2,0,7,2,8,2,6,1,8 +W,5,8,7,6,3,10,8,5,1,7,8,8,8,9,0,8 +R,3,8,5,6,4,8,7,4,5,9,3,8,3,7,4,11 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +D,5,9,6,7,7,7,7,7,6,7,6,4,3,8,3,8 +W,4,5,6,4,6,8,7,4,4,6,5,8,9,8,6,9 +E,5,9,6,8,7,6,8,4,4,8,7,9,5,10,9,11 +G,5,11,7,8,9,8,7,5,2,6,6,10,7,8,6,12 +O,4,10,6,7,3,8,7,9,8,7,6,8,3,8,4,8 +C,4,7,5,5,2,6,7,6,7,12,8,13,2,10,3,8 +J,5,8,6,6,3,7,6,3,5,15,7,11,1,6,1,7 +O,4,4,5,6,2,7,7,8,8,6,5,7,3,8,4,8 +I,3,10,6,8,6,9,6,2,4,8,5,5,5,8,5,6 +A,5,9,8,6,6,9,5,2,5,8,1,6,3,7,4,7 +S,2,3,2,1,1,8,8,6,4,7,6,7,2,8,8,8 +P,7,12,6,6,4,8,9,4,4,12,5,4,4,10,6,6 +V,2,3,3,2,1,5,12,2,2,8,10,7,2,11,0,8 +V,4,11,6,8,4,6,11,2,3,6,11,9,2,10,1,8 +T,7,13,6,7,4,7,8,2,7,11,6,7,3,8,5,5 +M,6,8,9,7,10,9,8,5,4,7,6,7,13,10,7,5 +G,3,8,4,6,3,6,6,5,4,5,6,9,2,8,4,8 +D,5,10,8,8,5,9,6,3,7,11,4,6,3,8,3,9 +O,7,10,5,6,3,10,5,6,5,9,3,8,5,9,5,9 +T,1,0,2,1,0,7,14,1,4,7,10,8,0,8,0,8 +B,3,5,5,4,3,9,7,2,6,11,5,7,2,8,4,10 +L,2,6,2,4,1,0,1,5,6,0,0,6,0,8,0,8 +C,4,8,5,6,2,6,8,6,10,6,6,13,1,8,4,8 +X,6,11,9,8,5,7,7,1,9,10,6,8,3,8,4,7 +Y,2,6,4,4,0,9,10,2,2,6,12,8,1,11,0,8 +P,3,7,4,5,3,4,12,6,4,12,8,3,1,10,3,6 +B,5,11,5,6,5,8,7,3,4,9,6,7,6,7,8,7 +K,2,6,3,4,1,3,7,7,2,7,6,11,3,8,2,11 +Y,4,11,6,8,3,6,11,2,3,8,12,8,1,11,0,8 +Q,2,3,3,4,2,7,9,5,2,7,9,10,2,9,5,8 +P,7,13,6,7,4,9,8,4,5,13,4,4,4,10,6,6 +U,2,3,3,2,1,6,8,5,7,9,7,8,3,9,3,6 +R,4,8,6,6,5,6,8,5,6,7,5,7,6,7,5,8 +S,7,11,8,9,6,9,7,3,6,10,5,8,3,10,6,9 +X,5,10,7,8,6,8,7,3,5,6,7,6,4,10,10,9 +B,4,10,6,8,7,8,8,4,5,10,5,6,3,8,5,10 +A,5,11,8,8,4,10,2,2,3,9,1,8,2,7,3,7 +P,3,2,3,4,3,6,9,4,4,9,8,4,4,10,3,7 +K,4,2,5,3,3,5,7,4,8,7,6,11,3,8,5,9 +K,3,4,5,3,3,9,6,2,6,10,4,9,4,7,4,9 +A,2,4,4,5,2,8,6,3,1,7,0,8,2,7,2,8 +Y,4,11,6,8,4,7,9,2,6,6,12,9,2,11,2,8 +Q,7,9,7,11,8,7,10,4,4,7,10,11,5,11,10,9 +E,4,11,5,8,6,7,7,5,8,7,6,9,3,8,6,9 +W,5,8,5,6,4,1,10,3,3,11,11,9,5,11,1,7 +J,5,10,7,7,3,6,8,3,6,15,7,10,1,6,1,6 +C,7,9,7,7,3,3,8,4,9,10,10,13,1,7,3,7 +U,4,6,4,4,2,7,4,14,5,7,13,8,3,9,0,8 +H,3,4,5,2,2,7,6,3,5,10,6,9,3,7,3,8 +F,3,6,5,4,2,6,11,2,5,13,7,4,1,10,2,8 +S,5,10,6,8,5,7,7,5,8,5,6,11,1,10,10,9 +M,5,9,6,7,4,8,7,13,2,6,9,8,8,6,0,8 +G,7,10,7,8,5,5,7,6,6,9,7,12,2,9,4,10 +C,4,9,6,6,2,7,8,7,10,5,6,13,1,7,4,9 +W,4,7,6,5,3,5,8,4,1,7,9,8,8,9,0,8 +R,6,10,8,7,8,8,5,6,4,8,6,8,7,6,6,11 +R,5,8,7,6,6,6,7,6,6,6,5,7,3,8,5,8 +D,2,1,3,3,2,7,7,6,6,6,5,5,2,8,3,7 +T,3,9,4,6,1,8,15,1,6,6,11,8,0,8,0,8 +E,6,11,9,8,6,6,7,2,9,11,6,9,2,8,5,8 +O,5,6,7,5,4,7,5,4,5,9,5,8,3,6,5,7 +D,3,4,4,2,2,7,7,7,7,7,6,5,2,8,3,7 +R,4,6,5,4,4,7,7,5,7,7,6,6,3,7,5,8 +A,4,9,6,7,6,7,8,8,4,6,6,9,3,7,8,5 +M,4,5,7,4,4,6,6,3,4,9,9,10,7,5,2,8 +G,3,5,4,4,2,6,6,5,5,9,7,11,2,8,4,10 +X,3,10,5,7,4,7,7,3,8,6,6,8,3,8,7,7 +G,3,7,4,5,3,6,6,5,4,6,6,9,2,8,3,8 +Y,2,7,4,5,1,8,11,0,3,6,11,8,0,10,0,8 +N,8,11,11,8,5,7,8,3,5,10,6,7,7,9,2,7 +P,2,3,3,2,2,6,10,6,2,11,5,4,1,9,2,9 +D,5,10,5,5,3,9,5,4,5,12,3,8,5,7,5,10 +L,5,10,7,8,5,7,4,1,8,8,2,10,0,6,3,8 +G,5,5,6,7,3,7,7,8,7,6,6,7,2,7,7,11 +A,2,7,4,5,3,12,4,3,2,9,2,9,2,6,2,8 +Q,3,3,4,4,3,8,7,6,2,8,7,10,2,8,4,9 +N,3,4,4,6,2,7,7,14,2,5,6,8,6,8,0,8 +A,3,2,5,4,2,8,2,2,2,7,2,8,2,7,2,7 +C,2,3,2,2,1,4,8,4,6,11,9,11,1,9,2,7 +Z,2,3,2,1,1,8,7,5,8,6,6,7,1,8,6,8 +A,4,8,7,6,5,6,5,2,3,4,2,6,2,6,3,4 +I,3,9,5,6,3,7,7,0,7,13,6,9,0,8,1,8 +Y,3,5,4,4,2,5,9,1,8,10,9,5,2,10,4,4 +O,3,5,5,4,3,6,6,6,5,9,5,8,3,6,4,7 +S,4,9,4,4,2,8,3,3,4,8,2,8,3,6,5,8 +K,7,11,10,8,8,10,6,1,6,10,3,8,6,8,6,11 +D,2,1,3,2,2,7,7,6,6,7,6,5,2,8,2,7 +H,4,7,4,5,4,7,8,12,1,7,4,8,3,8,0,8 +K,2,6,3,4,1,3,7,7,3,7,7,11,3,8,2,10 +H,1,0,1,0,0,7,8,10,1,7,6,8,2,8,0,8 +Q,2,3,3,5,3,8,7,7,3,6,6,9,3,8,5,10 +S,5,9,7,6,3,8,8,4,8,11,6,7,2,8,5,7 +N,3,1,3,3,2,7,9,5,4,7,6,7,4,8,1,7 +X,5,6,7,4,3,7,8,1,8,10,6,8,3,8,3,7 +O,5,9,7,7,5,7,7,9,4,7,6,8,3,8,3,8 +A,1,0,2,0,0,7,4,2,0,7,2,8,2,7,1,8 +C,4,9,5,6,2,6,6,7,10,9,5,14,1,10,4,9 +X,4,10,7,8,6,6,8,2,6,7,6,10,4,6,7,7 +Q,5,10,7,8,7,8,5,8,3,6,7,8,4,7,7,8 +O,5,10,4,6,3,6,7,6,3,9,7,9,5,9,5,8 +S,4,6,5,4,3,7,7,3,7,10,5,7,2,8,5,8 +E,4,6,6,6,6,6,8,4,4,8,7,9,4,11,8,10 +I,1,6,2,4,2,7,7,1,8,7,6,9,0,8,3,8 +L,4,6,5,5,4,8,5,5,6,6,7,8,3,8,6,9 +X,5,9,8,7,6,6,8,3,6,7,7,11,5,6,8,6 +D,4,9,5,7,5,10,6,4,5,10,3,6,3,7,3,8 +C,5,10,6,8,2,6,7,7,10,7,6,15,1,8,4,9 +N,8,10,9,6,4,8,6,3,4,13,4,8,6,8,0,7 +Y,2,7,4,5,1,9,10,1,3,6,12,8,1,11,0,8 +T,5,7,5,5,3,7,10,1,10,11,9,5,1,9,4,4 +T,5,6,7,6,6,8,10,5,8,7,6,8,3,10,7,7 +M,5,11,9,8,12,10,6,3,3,8,4,7,11,6,5,4 +J,7,11,6,8,4,10,6,2,5,11,6,8,2,9,7,12 +J,2,5,3,3,1,10,5,2,6,14,4,9,0,7,0,8 +G,4,8,4,6,3,7,7,6,6,10,7,11,2,9,4,9 +I,2,8,3,6,1,7,7,0,7,13,6,8,0,8,1,8 +J,6,10,9,7,6,8,6,4,6,8,6,7,3,6,4,7 +E,4,10,6,8,4,7,7,3,8,11,7,9,3,8,5,8 +R,4,8,5,6,4,6,8,5,5,6,5,8,3,7,5,9 +X,4,9,7,7,5,8,7,3,8,5,6,8,2,8,6,8 +X,5,10,8,7,5,4,7,1,8,10,10,10,4,7,4,5 +Q,2,0,2,1,1,8,7,7,4,6,6,9,2,8,3,8 +K,2,7,3,4,1,4,8,8,2,6,4,11,3,8,2,10 +C,3,7,4,5,2,6,8,9,8,9,7,10,2,11,4,9 +N,5,6,7,6,6,6,9,4,3,6,5,9,8,7,5,9 +J,1,3,2,1,0,8,6,3,5,14,7,11,1,7,0,7 +U,4,8,5,6,5,8,8,7,6,5,8,9,6,8,3,7 +Q,2,3,3,4,2,8,8,5,2,7,8,10,2,9,4,8 +Z,4,6,5,4,3,6,9,3,9,11,8,6,1,8,6,6 +A,5,11,8,8,5,10,1,2,3,8,2,8,4,8,4,9 +N,6,5,6,8,3,7,7,15,2,4,6,8,6,8,0,8 +V,3,7,4,5,2,9,9,4,2,5,13,8,2,10,0,8 +S,3,2,3,3,2,8,8,7,5,8,5,7,2,8,8,8 +T,2,3,3,1,1,5,12,2,7,11,9,4,0,9,1,5 +X,4,6,6,4,3,7,7,1,8,10,8,8,3,8,3,7 +Y,5,10,7,7,4,4,10,2,8,11,12,9,3,9,2,6 +Q,6,14,6,8,4,10,3,4,7,11,3,8,3,9,6,13 +Q,4,9,5,8,3,8,9,8,6,6,9,9,3,7,6,10 +B,4,8,5,6,5,7,6,5,4,6,5,7,4,9,6,7 +L,9,14,8,8,4,10,2,4,4,13,5,13,2,7,6,9 +J,4,9,4,7,3,7,10,2,3,13,5,5,2,8,7,9 +P,6,9,8,7,7,6,7,7,5,8,7,8,3,9,7,9 +F,3,7,6,5,6,10,7,1,5,9,5,6,4,10,5,7 +S,5,8,6,6,7,8,9,5,4,8,5,6,4,10,9,7 +L,3,5,4,4,3,8,5,5,5,7,7,7,4,9,6,10 +D,2,4,4,3,2,8,7,4,6,10,4,5,2,8,2,8 +O,5,8,7,6,8,8,10,5,3,7,7,8,7,9,4,9 +B,2,3,3,1,2,7,8,5,5,7,6,6,1,8,5,9 +C,5,8,7,7,7,5,7,4,5,7,7,11,4,9,7,9 +D,6,9,8,7,5,10,6,4,9,11,3,6,3,8,3,9 +J,4,8,5,6,3,9,7,2,6,14,3,7,0,7,0,8 +T,2,4,3,3,2,7,12,3,6,7,11,8,2,11,1,8 +Y,3,3,4,2,1,4,11,2,7,11,10,5,1,11,2,5 +V,2,3,3,2,1,4,12,3,2,10,11,7,2,11,0,8 +V,4,11,6,8,9,7,6,5,2,8,7,9,8,10,4,9 +K,3,8,4,6,3,3,7,6,2,6,5,10,3,8,2,11 +C,3,9,4,7,2,5,7,7,10,7,6,13,1,9,4,9 +B,5,8,6,6,6,8,8,7,6,7,6,5,3,7,7,9 +Z,2,2,3,3,2,8,7,5,9,6,6,7,2,8,7,8 +W,8,8,8,6,5,4,11,3,3,9,9,7,8,11,2,6 +T,4,5,5,4,2,6,11,2,8,11,9,5,1,11,3,4 +Y,2,4,3,3,1,4,12,3,6,12,10,5,1,10,1,5 +A,2,6,4,4,2,11,3,2,2,9,2,9,2,6,2,8 +W,6,10,9,8,14,9,7,5,2,7,6,8,11,11,4,8 +J,5,10,7,8,4,10,2,6,5,15,5,13,0,7,0,7 +N,5,9,6,5,3,2,10,5,3,13,12,9,4,9,0,8 +R,2,3,2,1,1,7,7,4,5,6,5,7,2,7,4,8 +J,1,0,1,1,0,12,3,5,3,12,5,11,0,7,0,8 +Y,4,11,6,8,1,10,10,2,2,6,13,8,1,11,0,8 +X,4,9,5,7,3,7,7,4,4,7,6,7,3,8,4,8 +B,4,8,5,6,4,6,7,9,7,7,6,7,2,8,9,9 +W,2,3,4,2,2,7,11,2,2,7,9,8,5,11,0,8 +V,8,10,8,7,3,3,11,5,5,12,12,7,3,10,1,8 +M,7,9,10,7,6,4,7,3,5,10,10,10,8,5,2,7 +M,9,9,12,8,13,8,8,4,4,7,6,7,12,9,7,3 +D,4,8,6,6,8,9,8,5,6,7,6,6,4,7,8,8 +G,6,10,6,7,5,5,7,6,5,9,7,12,2,9,5,8 +O,3,7,3,5,2,8,7,8,5,9,4,6,3,8,3,8 +W,3,2,4,3,3,5,10,2,2,8,9,9,6,11,0,8 +B,3,2,4,3,3,8,7,5,6,7,6,6,2,8,6,10 +U,5,10,6,8,4,6,8,6,7,6,10,9,3,9,1,7 +A,6,11,11,8,8,7,5,2,5,5,1,6,6,8,6,6 +A,3,8,5,6,3,12,3,3,2,11,2,9,2,6,2,9 +Y,3,8,5,6,2,8,10,1,7,5,12,8,1,11,2,8 +H,4,7,5,5,4,8,6,13,1,7,7,8,3,8,0,8 +M,4,8,6,6,5,8,6,2,4,9,6,8,7,6,2,8 +N,5,7,6,6,6,8,6,5,4,7,5,8,7,9,6,3 +Q,3,6,4,5,3,8,7,7,5,6,7,9,2,8,4,9 +Z,5,11,7,8,4,9,6,3,10,12,4,8,1,7,6,9 +L,5,9,7,7,7,6,6,3,7,8,7,11,7,10,6,7 +R,4,8,5,6,6,7,7,7,3,8,5,7,4,7,7,10 +P,2,3,3,2,1,7,9,3,4,13,5,4,0,9,2,9 +V,4,9,6,7,1,7,8,4,3,7,14,8,3,9,0,8 +C,7,12,5,7,4,7,7,4,3,9,9,11,4,10,9,11 +Q,5,7,6,6,5,8,4,3,5,7,3,8,4,8,4,8 +L,2,1,2,3,1,4,4,4,6,2,2,6,0,7,1,6 +B,11,13,8,7,5,7,8,5,7,10,5,8,6,6,8,11 +S,5,8,6,7,7,8,8,4,5,7,7,8,5,10,10,9 +Y,8,15,7,8,4,6,8,5,3,10,9,5,4,10,4,4 +K,2,4,3,3,2,5,7,4,7,6,6,11,3,8,5,9 +B,3,7,3,5,4,6,6,8,5,6,7,7,2,9,7,10 +B,9,12,8,7,7,10,7,4,6,10,3,6,7,4,8,8 +K,4,6,6,4,4,7,6,1,6,10,6,9,3,8,3,8 +K,6,11,8,8,10,7,7,4,5,6,6,9,8,9,8,7 +N,8,12,10,7,4,12,4,3,3,13,1,7,5,7,0,8 +M,5,7,7,5,5,8,7,2,4,9,7,8,7,6,2,8 +S,5,7,7,6,8,7,8,5,5,7,7,7,5,9,11,12 +E,5,9,7,6,6,8,8,6,3,6,6,10,5,8,9,8 +U,6,13,6,7,5,6,6,5,5,7,8,8,5,8,3,9 +M,6,12,8,7,5,13,2,5,2,11,1,9,7,2,1,8 +D,5,10,6,8,7,7,7,6,6,7,6,5,3,8,3,7 +R,6,11,7,8,4,6,10,9,4,7,5,8,3,8,6,11 +I,1,6,0,4,0,7,7,5,3,7,6,8,0,8,0,8 +O,5,8,5,6,5,8,6,7,3,9,5,7,3,8,3,7 +M,5,10,7,8,9,7,9,6,5,7,6,8,7,9,6,10 +R,1,1,2,1,1,6,9,7,3,7,5,8,2,7,4,11 +T,2,1,2,1,0,8,15,1,4,6,10,8,0,8,0,8 +E,4,8,6,6,6,6,8,6,8,6,4,11,3,8,6,9 +H,5,5,6,7,3,7,7,15,0,7,6,8,3,8,0,8 +W,4,3,4,1,2,3,11,3,2,10,10,8,6,11,1,7 +U,3,2,4,4,2,6,8,5,7,6,9,9,3,9,1,7 +A,4,10,7,8,4,14,3,4,3,12,0,8,2,6,2,9 +L,5,9,6,8,5,8,8,3,6,6,6,9,3,8,7,9 +T,3,6,3,4,2,5,12,4,5,11,9,5,2,12,1,5 +V,8,11,8,8,5,3,12,2,3,9,11,8,6,11,3,6 +T,2,1,3,2,2,7,12,3,6,7,10,8,2,11,1,8 +T,7,10,7,8,6,6,11,4,6,11,9,5,3,12,2,4 +J,2,5,4,4,2,9,7,2,6,14,5,9,1,6,1,8 +E,3,5,4,4,3,7,7,6,8,7,6,9,2,8,6,9 +N,5,4,5,7,3,7,7,15,2,4,6,8,6,8,0,8 +B,6,9,8,6,7,9,8,3,6,10,5,5,3,7,5,9 +R,5,10,7,8,7,7,8,5,6,7,5,6,6,7,5,8 +H,4,5,4,8,3,7,8,15,1,7,5,8,3,8,0,8 +F,4,8,4,5,1,1,15,5,3,13,10,5,0,8,2,5 +F,7,10,9,8,4,6,11,3,6,14,6,3,2,10,2,7 +P,4,9,4,4,3,8,8,3,4,12,5,4,3,11,5,7 +P,3,6,3,4,2,4,12,7,1,10,6,4,1,10,3,8 +N,7,9,6,4,2,7,10,4,5,4,5,10,5,9,2,7 +Z,2,6,3,4,2,7,7,3,12,8,6,8,0,8,7,8 +F,1,0,1,1,0,3,12,4,3,11,9,6,0,8,2,7 +B,1,0,1,0,0,7,7,6,4,7,6,7,1,8,5,9 +U,1,0,1,0,0,7,6,10,4,7,12,8,3,10,0,8 +H,3,5,4,4,4,9,7,6,6,7,6,6,3,8,3,7 +D,3,8,4,6,2,6,7,10,9,6,6,6,3,8,4,8 +P,3,8,3,6,3,5,11,8,2,9,5,4,1,9,3,7 +M,5,8,5,6,5,8,5,11,0,7,8,8,7,5,0,8 +O,3,6,5,4,5,8,6,5,2,7,6,8,7,9,3,9 +D,5,8,6,7,6,6,7,5,6,7,5,9,5,4,8,4 +B,8,12,6,6,4,8,6,5,5,11,5,9,6,6,7,11 +N,4,2,5,4,3,7,8,5,6,7,6,5,6,9,2,6 +T,2,7,4,5,2,6,11,2,8,8,11,8,1,10,1,7 +D,1,4,3,2,2,9,6,3,5,10,5,6,2,8,2,8 +E,2,1,2,2,2,7,7,5,7,6,5,8,2,8,6,10 +G,4,7,5,5,3,5,7,5,5,9,8,10,2,8,4,9 +Y,3,10,5,7,1,7,10,2,2,7,13,8,2,11,0,8 +H,3,4,4,6,4,11,5,2,2,8,5,9,3,8,5,11 +E,4,9,3,5,3,8,6,3,5,10,5,8,3,9,8,11 +J,4,10,6,8,5,7,8,4,5,8,7,7,3,7,4,6 +X,4,7,5,5,4,8,7,3,8,6,5,6,3,9,6,8 +M,6,9,9,7,11,6,5,4,2,6,4,9,14,6,4,6 +C,3,4,5,7,2,5,7,7,10,7,6,12,1,9,4,9 +G,5,11,6,8,5,5,7,6,5,8,7,12,4,7,5,8 +I,2,10,2,8,3,7,7,0,8,7,6,8,0,8,3,8 +W,4,8,7,6,6,7,11,2,2,6,8,8,7,12,1,8 +W,3,8,5,6,4,9,10,2,2,6,8,8,7,11,1,8 +L,4,8,5,7,5,8,5,5,5,7,7,8,3,8,7,11 +T,3,4,4,2,1,5,13,3,6,12,9,3,1,10,1,5 +Z,3,8,4,6,3,7,8,3,11,8,6,8,0,8,7,7 +E,3,4,4,6,2,3,8,6,11,7,5,15,0,8,7,7 +P,5,11,5,8,4,3,13,7,1,11,6,3,0,10,3,8 +I,0,1,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +S,7,11,8,8,4,7,8,4,8,11,7,8,2,9,6,6 +D,6,11,6,8,4,5,7,10,10,7,6,6,3,8,4,8 +H,4,7,6,5,4,6,8,3,6,10,8,9,3,8,3,7 +H,7,10,10,8,6,10,6,3,6,10,3,7,5,7,5,9 +U,4,9,6,6,5,6,8,8,5,6,5,12,5,8,7,4 +N,2,2,3,3,2,7,9,5,4,7,6,6,4,9,1,6 +O,2,4,3,2,2,7,7,7,4,9,6,8,2,8,3,8 +D,5,9,6,6,5,5,8,9,7,7,7,6,2,8,3,8 +M,4,6,5,4,4,7,5,11,0,7,9,8,8,6,1,8 +Z,4,5,6,7,4,11,4,4,4,10,3,9,2,7,5,10 +E,5,7,7,5,4,6,8,2,9,11,6,9,2,8,4,8 +Q,4,5,5,6,4,8,8,5,2,8,8,10,3,9,5,7 +N,5,8,7,6,5,8,8,6,6,6,5,3,8,10,5,8 +T,5,10,7,7,8,6,7,3,6,7,7,10,5,8,5,6 +R,2,3,3,2,2,8,8,3,5,9,4,7,2,7,3,10 +R,6,10,8,8,6,7,9,5,7,5,4,9,4,4,7,8 +C,7,9,8,8,8,5,7,4,5,7,6,11,5,9,8,9 +L,5,11,6,9,5,4,3,8,7,1,2,4,1,6,1,6 +G,4,7,6,5,3,7,6,7,8,8,5,12,2,10,4,8 +N,4,8,6,7,6,6,8,5,3,6,5,9,8,7,5,9 +N,4,8,5,6,4,7,7,13,1,6,6,8,5,8,0,8 +G,4,8,4,6,3,6,7,6,5,9,8,10,2,7,4,9 +C,6,10,8,8,5,8,7,8,7,7,6,9,4,8,4,9 +D,5,8,6,6,6,10,6,5,6,9,3,6,3,8,3,8 +R,9,15,9,8,7,9,7,4,6,9,2,7,6,5,7,7 +B,4,10,4,8,6,7,6,9,6,6,7,7,2,9,8,10 +W,7,9,9,7,6,7,8,4,1,7,9,8,8,10,0,8 +F,3,2,4,3,2,6,10,4,6,10,8,5,4,9,3,7 +D,2,4,3,3,2,8,7,5,6,9,5,5,2,8,3,7 +L,4,11,6,8,3,4,4,4,9,2,0,6,0,7,1,5 +R,2,0,2,1,1,6,10,7,2,7,5,8,2,7,4,10 +W,5,11,7,8,4,5,8,5,2,7,8,8,8,10,0,8 +B,4,9,4,7,4,7,7,10,7,7,6,7,2,8,9,9 +A,4,7,6,5,6,8,5,7,4,8,6,8,5,9,7,4 +W,4,9,7,6,5,7,8,4,1,7,9,8,7,11,0,8 +C,5,10,6,8,4,5,8,9,9,9,9,12,2,10,4,9 +Y,3,6,4,4,2,3,11,2,7,11,10,6,1,11,2,5 +A,4,10,7,8,5,12,3,2,2,9,2,8,2,6,2,8 +M,6,11,10,8,14,8,7,3,3,8,4,7,12,4,4,6 +Z,4,8,5,6,4,7,8,2,9,11,7,8,1,9,6,7 +Y,5,7,5,5,3,3,10,2,7,11,11,7,1,11,2,5 +H,4,2,5,4,4,9,7,6,6,7,6,6,3,8,3,7 +R,4,9,6,7,6,6,7,3,4,7,6,8,6,10,7,5 +S,3,9,4,7,2,7,6,6,9,4,6,9,0,9,9,8 +B,2,0,2,1,1,7,7,7,5,7,6,7,1,8,7,8 +F,5,5,5,8,2,1,14,5,3,12,10,5,0,8,2,5 +T,8,11,8,8,7,6,11,3,7,11,9,5,5,11,4,3 +H,5,9,8,7,8,8,7,5,7,7,6,9,6,8,4,8 +C,2,3,3,2,1,5,9,5,7,12,9,10,1,10,2,7 +D,5,11,5,8,3,5,8,11,9,7,7,5,3,8,4,8 +T,3,5,4,4,2,7,12,2,8,7,11,8,1,11,1,7 +A,1,0,2,0,0,8,3,2,0,7,2,8,2,6,1,8 +I,1,1,1,3,1,7,7,1,7,7,6,8,0,8,2,8 +A,4,9,6,7,4,13,2,4,2,11,1,8,3,7,3,9 +H,7,9,7,4,4,7,8,3,5,11,7,8,6,9,4,8 +T,6,8,7,6,8,6,8,4,6,8,6,9,5,8,5,7 +T,5,10,7,8,6,6,7,7,7,6,8,9,4,10,7,6 +F,4,10,4,7,2,1,11,5,6,11,11,9,0,8,2,6 +Q,2,5,3,6,3,8,8,7,2,4,6,10,3,9,5,9 +U,5,9,5,5,3,8,6,4,5,6,7,8,4,8,3,7 +O,6,5,7,8,3,7,6,8,9,6,5,7,3,8,4,8 +M,3,4,5,3,3,8,6,2,4,8,5,7,8,7,2,8 +V,4,10,6,8,4,7,11,1,3,6,10,9,3,11,1,8 +R,3,4,4,6,3,5,11,8,4,7,2,9,3,7,6,11 +S,2,1,2,2,1,8,7,6,5,7,7,8,2,9,8,8 +R,7,11,9,8,7,9,8,6,6,8,5,7,4,8,6,12 +K,8,10,8,5,3,10,7,4,7,8,1,5,5,7,4,9 +R,5,9,8,6,8,6,6,3,4,7,5,8,7,10,7,6 +W,6,8,6,6,5,4,10,2,3,9,9,8,7,11,2,6 +X,7,10,9,8,8,7,6,3,5,6,6,10,5,5,12,10 +A,3,10,5,7,4,11,3,2,2,9,2,10,3,7,3,8 +Y,3,7,4,5,2,7,10,1,7,6,12,8,1,11,2,8 +P,5,7,6,9,8,7,8,4,3,7,7,7,7,12,6,7 +U,4,6,5,4,4,7,7,8,6,7,6,10,3,9,5,5 +S,3,4,4,7,2,9,8,6,9,4,6,7,0,7,9,8 +P,1,0,1,0,0,5,11,6,1,9,6,5,0,9,2,8 +U,3,2,4,4,2,5,8,6,6,8,10,10,3,9,0,8 +D,7,11,7,6,4,10,4,6,6,13,4,10,5,7,5,9 +Y,7,7,9,10,9,10,12,6,4,6,7,6,5,10,8,5 +H,3,4,5,3,3,8,7,3,6,10,4,8,3,7,3,8 +G,3,4,4,7,2,6,5,8,8,6,5,10,1,8,6,11 +V,5,7,7,6,7,6,9,6,6,8,7,8,5,9,6,11 +G,2,0,2,1,1,8,6,6,5,6,5,9,1,8,5,10 +X,9,12,8,6,4,7,7,2,9,9,5,8,4,5,4,8 +R,7,10,9,8,7,8,8,5,6,9,5,7,4,7,6,12 +U,4,10,5,8,2,7,5,14,5,7,15,8,3,9,0,8 +C,5,10,7,8,8,7,5,4,4,8,6,11,7,9,4,8 +O,5,9,6,7,3,7,7,9,8,7,6,8,3,8,4,8 +V,9,12,8,7,4,5,10,4,4,10,8,5,4,11,2,8 +M,3,7,4,5,3,7,7,11,1,7,9,8,8,5,0,8 +W,6,5,7,4,4,5,11,4,2,9,8,7,7,11,2,6 +R,5,11,6,8,4,6,9,10,6,6,5,8,3,8,6,10 +V,4,9,6,7,2,7,8,4,3,7,14,8,3,9,0,8 +M,4,4,5,6,3,7,7,12,1,7,9,8,8,6,0,8 +Y,2,1,4,2,1,7,11,1,7,7,11,8,1,11,2,8 +V,5,7,5,5,3,3,11,2,3,10,11,8,2,11,1,8 +C,6,9,7,7,3,3,9,5,8,10,10,12,1,8,3,7 +F,0,0,1,0,0,3,12,4,2,11,9,6,0,8,2,8 +T,4,5,5,4,3,6,11,2,8,11,9,5,3,10,4,4 +Z,3,7,4,5,4,6,6,3,7,7,6,10,1,7,10,7 +W,3,7,5,5,5,7,11,2,2,6,8,8,6,11,1,8 +E,4,9,6,6,5,8,7,1,7,11,5,9,3,8,5,10 +X,4,6,6,4,4,9,8,3,5,7,7,7,4,11,6,7 +X,3,3,5,2,2,5,8,2,8,11,9,9,2,9,3,6 +S,5,10,6,7,4,6,8,3,6,10,8,7,2,8,5,5 +F,6,9,8,7,4,3,13,4,5,13,9,4,1,10,2,6 +X,3,4,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +B,4,8,6,6,6,8,7,4,5,7,6,7,4,8,6,9 +T,5,7,5,5,2,5,12,2,8,12,9,4,1,10,2,4 +G,3,6,3,4,2,7,7,6,6,10,7,11,2,9,4,10 +T,2,6,3,4,2,9,11,3,7,5,11,8,2,11,1,8 +J,2,5,4,3,1,7,7,3,6,14,6,10,1,6,1,7 +M,5,5,7,4,6,9,8,4,5,6,6,7,8,6,6,5 +Y,5,8,6,6,6,9,6,5,4,7,9,7,3,8,8,4 +E,6,9,8,8,8,5,8,4,4,8,7,9,4,10,9,10 +Q,6,11,8,8,8,8,6,8,3,6,8,9,5,5,8,9 +K,7,12,6,7,3,9,7,3,6,9,6,7,6,10,4,7 +Z,4,8,6,6,4,8,7,2,9,12,6,7,1,7,6,8 +U,4,7,5,5,2,4,8,5,6,11,11,10,3,9,1,7 +W,10,11,10,8,7,1,11,3,3,11,11,9,8,10,1,7 +N,4,8,6,6,6,7,9,3,4,7,6,7,6,8,6,4 +F,4,10,4,7,2,1,14,5,4,13,10,5,0,8,2,5 +Q,3,5,4,5,2,8,8,7,5,6,7,8,3,8,5,9 +D,8,11,8,6,4,10,3,6,5,13,4,11,5,7,5,9 +N,4,6,5,4,3,11,7,4,5,10,1,4,5,9,1,7 +P,7,11,10,8,7,9,7,3,6,12,4,5,5,9,5,9 +C,3,6,4,4,1,5,6,6,9,7,5,11,1,9,4,8 +K,6,11,6,8,3,4,8,8,2,7,4,11,4,8,2,11 +Q,1,2,2,3,2,8,8,5,2,8,7,9,2,9,3,9 +O,4,7,5,5,6,9,7,6,1,7,7,9,7,9,3,9 +T,4,6,5,4,5,7,8,4,6,7,6,8,5,7,5,6 +Z,3,10,4,7,3,7,8,3,11,9,6,8,0,8,7,8 +G,3,3,4,5,2,7,8,8,7,6,7,8,2,7,5,10 +Q,5,9,6,11,6,8,7,6,3,8,8,11,3,8,6,8 +X,4,9,6,7,5,8,6,3,5,6,7,7,2,8,9,9 +Q,3,3,4,5,4,8,7,7,3,5,7,9,3,8,5,10 +L,3,2,4,4,1,5,2,7,8,1,3,2,1,6,1,5 +I,3,9,5,6,5,9,5,3,5,7,6,5,6,6,5,6 +U,9,13,8,7,5,8,5,5,5,6,9,8,5,9,3,8 +U,3,1,4,2,2,6,8,6,7,7,9,9,3,9,1,8 +B,4,8,5,6,6,8,7,7,6,7,6,5,2,8,7,9 +D,4,8,6,6,4,9,6,3,7,11,4,6,3,9,4,9 +S,3,5,5,4,2,8,7,3,7,10,6,7,1,9,5,8 +Z,1,0,1,0,0,8,7,2,9,8,6,8,0,8,5,8 +R,6,11,6,8,4,5,13,8,3,7,2,9,3,7,6,11 +B,5,11,7,8,8,7,8,6,4,6,4,6,5,7,7,7 +U,5,8,5,6,3,3,8,4,6,10,10,9,3,9,1,7 +Q,6,7,6,8,5,7,7,7,5,9,9,9,4,8,7,9 +G,6,10,7,8,5,6,7,7,7,5,7,10,2,7,4,8 +Y,4,10,7,7,3,7,10,1,8,7,12,8,1,11,2,8 +N,2,3,3,1,1,8,8,2,4,11,5,6,4,8,0,7 +Z,4,6,6,4,3,8,6,2,9,11,5,9,1,8,5,9 +N,3,8,4,6,4,7,7,12,1,6,6,8,5,8,0,8 +R,3,8,5,6,3,9,8,4,6,9,3,8,3,6,4,11 +B,2,3,3,2,2,8,7,2,5,10,5,6,2,8,4,9 +I,3,9,4,6,3,7,7,0,7,13,6,8,0,8,1,8 +E,1,1,1,1,1,4,8,5,7,7,6,12,0,8,6,10 +X,2,3,3,2,1,5,8,2,7,10,10,9,2,9,2,6 +F,7,13,6,7,4,8,9,2,5,11,5,4,3,10,7,7 +N,4,7,6,5,3,5,9,3,4,10,8,8,5,9,1,7 +T,9,15,8,8,5,8,8,3,9,12,5,6,3,7,6,6 +U,9,10,9,8,7,5,7,5,9,8,6,9,8,9,6,1 +I,4,9,5,7,3,7,8,2,8,7,6,8,0,7,4,8 +P,4,5,5,6,6,6,8,5,2,7,7,6,6,11,5,7 +H,3,5,4,3,3,7,7,6,6,7,6,8,3,8,4,8 +F,3,6,5,4,4,6,8,6,3,8,6,9,3,10,8,11 +S,4,5,5,7,3,7,6,6,9,5,6,10,0,9,9,8 +A,4,9,7,7,5,8,5,2,4,6,1,5,3,5,4,5 +X,6,9,9,7,4,10,5,2,8,11,1,7,3,8,4,9 +X,2,8,4,6,3,7,7,4,8,6,6,8,3,8,6,8 +A,4,9,6,7,6,8,6,6,4,7,6,9,5,8,7,3 +M,5,9,7,7,8,8,7,6,4,6,7,8,8,6,2,7 +R,4,6,5,4,3,8,9,5,6,8,5,8,3,7,5,10 +L,3,7,4,5,2,5,4,4,9,3,2,6,1,6,2,5 +G,2,4,3,3,2,6,7,5,5,9,7,10,2,8,4,9 +U,9,11,9,8,6,3,8,5,8,11,10,10,3,9,2,6 +U,5,7,5,5,3,4,8,6,6,9,8,9,3,9,3,5 +R,5,11,7,8,5,9,8,4,6,10,3,7,3,7,4,11 +M,6,10,7,8,4,7,7,13,2,7,9,8,9,6,0,8 +J,3,5,5,4,2,9,6,3,6,14,5,10,1,6,0,7 +C,5,9,6,7,3,5,8,7,8,7,8,14,2,9,4,9 +C,1,0,2,0,0,7,7,6,8,7,6,13,0,8,4,10 +O,4,8,5,6,3,8,7,8,4,7,6,6,3,8,3,7 +H,4,6,5,4,3,10,6,4,6,10,3,7,3,8,3,10 +N,6,9,5,5,3,8,11,5,4,4,6,10,6,11,2,6 +C,6,9,7,7,7,6,7,3,4,6,7,10,7,8,6,7 +G,5,7,6,6,7,7,9,5,2,7,7,8,6,11,7,8 +L,5,11,6,8,5,8,4,0,8,9,2,11,2,5,4,9 +I,1,10,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +Q,4,6,6,5,4,7,4,3,4,5,3,7,3,6,4,7 +H,4,2,5,4,4,8,7,6,7,7,6,8,6,8,4,7 +E,3,1,3,3,2,7,7,5,8,7,7,8,2,8,6,9 +V,3,4,4,3,1,4,12,3,3,10,11,7,2,11,1,8 +Y,4,5,6,7,8,7,8,3,2,8,8,9,4,11,8,5 +H,5,5,5,7,3,7,7,15,1,7,7,8,3,8,0,8 +V,6,8,5,6,3,3,12,3,3,10,11,8,2,11,1,8 +J,5,9,6,7,4,10,4,6,5,8,6,5,2,8,4,6 +U,4,4,5,3,2,4,8,5,7,10,9,9,3,9,2,5 +C,3,5,5,4,4,6,7,4,4,6,6,11,4,10,7,11 +V,3,9,5,7,2,7,11,3,4,9,12,8,3,10,1,9 +I,4,7,6,8,6,8,8,5,6,7,5,8,3,9,8,9 +T,1,0,2,0,0,7,14,2,3,7,10,8,0,8,0,8 +F,3,5,5,3,2,6,12,4,5,13,6,2,1,10,2,6 +V,9,14,8,8,5,6,8,4,4,8,8,5,6,12,3,8 +S,1,0,1,1,0,8,7,4,6,5,6,7,0,8,7,8 +W,6,5,8,5,9,8,7,5,5,7,5,8,9,9,7,9 +W,6,9,8,7,7,8,4,6,2,7,6,7,7,7,6,5 +J,2,8,2,6,1,14,3,4,5,12,1,9,0,7,0,8 +T,1,0,2,0,0,7,15,2,4,7,10,8,0,8,0,8 +I,0,0,0,1,0,7,7,4,4,7,6,8,0,8,0,8 +R,6,11,9,8,8,10,7,3,6,10,3,6,3,7,4,10 +I,1,3,2,2,1,7,7,1,7,13,6,8,0,8,1,8 +S,3,3,4,4,2,8,8,6,8,5,6,7,0,8,9,7 +W,5,8,5,6,4,7,10,4,2,8,6,6,6,11,2,6 +F,2,1,3,2,2,5,11,3,5,11,9,5,1,10,3,6 +C,2,0,2,1,0,6,7,6,9,7,6,14,0,8,4,10 +F,3,5,5,4,2,7,10,1,6,13,6,5,3,8,3,7 +U,4,9,5,7,2,7,5,13,5,7,14,8,3,9,0,8 +J,3,9,4,7,1,11,2,11,3,12,9,14,1,6,0,8 +T,3,4,4,6,1,6,15,1,6,8,11,7,0,8,0,8 +N,5,9,7,7,5,4,9,3,4,9,10,9,6,7,1,8 +X,3,8,5,6,3,5,8,2,8,10,10,9,3,9,3,6 +J,5,9,6,6,2,8,3,6,4,14,9,15,1,6,1,6 +O,3,8,4,6,2,7,6,8,7,7,4,8,3,8,4,8 +J,2,4,4,3,1,9,4,4,5,14,6,12,0,7,0,8 +Z,4,5,6,7,4,11,4,4,5,10,3,9,2,7,6,10 +N,7,9,10,7,5,10,8,3,6,11,1,3,5,9,1,7 +P,2,4,4,3,2,7,8,3,4,12,5,4,1,10,2,8 +S,1,3,3,2,1,7,7,3,7,10,5,8,1,8,4,8 +H,4,4,6,3,3,7,7,3,6,10,7,8,5,9,4,8 +T,1,0,2,0,0,7,14,2,3,7,10,8,0,8,0,8 +Y,2,3,4,5,1,7,10,1,3,7,12,8,1,11,0,8 +X,6,10,10,8,5,9,6,1,8,10,3,7,3,8,4,9 +P,4,4,4,6,2,4,12,8,2,10,6,4,1,10,4,8 +A,4,7,5,5,5,7,6,8,4,7,5,8,4,8,10,2 +P,4,6,6,4,3,6,11,5,3,11,5,3,1,10,3,8 +F,2,5,4,4,2,8,9,2,6,13,5,5,1,9,2,8 +Z,1,1,2,2,0,7,7,2,11,9,6,8,0,8,6,8 +C,4,5,5,4,2,4,9,5,8,12,10,12,1,8,2,7 +H,6,7,9,5,5,9,6,3,7,10,5,8,3,8,3,8 +M,10,11,10,6,5,7,11,5,5,4,4,10,9,10,2,7 +N,4,5,5,8,3,7,7,14,2,4,6,8,6,8,0,8 +R,2,6,3,4,3,5,10,7,3,7,4,9,2,6,4,11 +X,4,9,5,6,1,7,7,5,4,7,6,8,3,8,4,8 +W,4,7,7,5,5,9,12,2,2,6,8,8,8,13,1,7 +P,4,9,6,6,3,4,13,5,4,13,6,2,0,9,4,7 +P,6,6,6,8,3,3,14,8,1,11,6,3,1,10,4,8 +S,6,10,8,7,5,8,8,3,7,10,5,7,2,8,5,8 +F,3,8,3,6,2,1,11,3,4,11,11,9,0,8,2,7 +Z,3,5,5,4,3,7,8,2,9,12,6,8,1,8,5,7 +M,6,10,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +K,7,13,7,8,4,6,7,3,6,9,9,10,6,10,3,7 +I,6,8,7,6,4,5,6,3,7,7,6,12,0,9,4,8 +V,3,5,4,3,1,4,12,3,3,10,11,7,2,10,1,8 +J,6,10,5,7,3,7,10,2,3,12,5,5,2,8,7,9 +R,4,8,7,7,7,6,8,4,3,6,5,9,8,7,6,9 +U,5,4,6,7,2,7,4,14,6,7,15,8,3,9,0,8 +Z,5,10,5,5,3,5,8,2,9,11,8,8,3,6,6,5 +W,4,2,5,3,3,5,11,3,2,8,9,9,7,10,1,8 +W,7,7,7,5,4,4,10,3,3,10,9,8,7,11,2,6 +Q,4,7,6,5,5,8,5,7,4,6,7,9,3,7,6,9 +P,6,9,5,4,2,5,12,5,1,12,6,4,4,10,3,8 +M,3,1,4,3,3,6,6,6,4,7,7,10,7,5,2,9 +E,3,5,5,4,5,7,6,4,3,7,6,9,5,10,7,12 +U,5,7,5,5,3,4,8,5,7,9,8,9,4,8,3,4 +G,4,7,4,5,2,6,7,6,5,9,8,10,2,8,4,9 +Z,4,10,6,8,4,6,9,2,9,11,8,7,2,10,7,6 +L,5,8,7,7,6,7,7,4,5,6,7,9,3,9,8,7 +F,3,5,5,3,2,6,12,3,5,13,7,3,1,10,2,6 +M,2,3,3,1,2,8,7,6,3,6,7,8,6,5,1,7 +J,4,11,5,8,3,9,7,2,7,15,4,8,0,6,1,7 +D,2,6,3,4,2,5,7,10,7,7,6,5,3,8,3,8 +X,4,9,6,7,4,8,7,4,9,6,7,8,4,6,8,9 +U,3,5,4,4,4,8,6,5,4,6,6,8,3,9,1,7 +V,4,6,6,5,6,7,7,5,4,7,6,8,6,9,7,8 +Q,4,9,5,11,7,8,6,8,4,5,6,7,4,8,6,10 +J,2,7,4,5,4,8,8,3,3,8,5,6,4,8,5,4 +S,2,7,3,5,2,6,7,5,8,6,7,11,0,9,8,7 +B,2,3,4,2,2,9,7,2,5,11,5,7,2,8,4,9 +N,4,7,4,5,2,7,7,14,2,5,6,8,6,8,0,8 +F,2,5,4,4,2,5,12,3,5,13,7,4,1,9,2,6 +Z,4,7,6,9,4,11,4,2,6,9,2,6,1,8,6,9 +S,5,9,6,6,4,6,8,4,6,10,9,8,2,8,5,5 +P,2,1,2,1,1,5,11,7,2,9,6,4,1,9,3,8 +H,4,5,7,4,4,8,6,3,6,10,5,8,5,7,4,8 +O,3,4,4,3,2,8,7,7,4,9,6,8,2,8,3,8 +H,5,7,8,5,5,7,7,3,6,10,7,8,3,9,3,7 +Q,5,10,6,9,5,8,8,8,5,5,8,10,4,7,6,8 +L,5,10,7,8,5,8,4,1,7,9,2,9,1,6,3,9 +X,4,6,7,4,3,7,7,2,8,10,7,9,3,8,3,7 +F,4,8,6,6,4,4,11,2,6,11,10,6,1,10,3,6 +Q,2,6,3,5,3,7,7,8,6,5,4,6,2,8,3,7 +L,1,0,1,0,0,2,1,6,4,0,3,4,0,8,0,8 +P,5,10,7,8,6,8,10,7,4,10,4,3,3,11,4,8 +Z,2,4,4,3,1,8,6,2,10,11,5,9,1,8,6,9 +J,0,0,1,0,0,12,4,4,3,11,4,11,0,7,0,8 +D,1,1,2,1,1,6,7,8,6,6,6,6,2,8,3,8 +K,4,6,6,4,4,7,8,4,8,7,5,7,3,8,5,8 +T,3,9,5,6,1,5,15,1,6,9,11,7,0,8,0,8 +C,6,9,7,7,7,8,5,6,3,7,8,11,8,9,5,4 +U,2,3,3,2,1,6,8,6,6,7,9,9,3,9,0,8 +Z,4,4,4,6,2,7,7,4,14,9,6,8,0,8,8,8 +F,6,11,10,8,10,6,10,1,5,10,7,5,6,10,5,2 +M,4,4,5,3,4,9,6,6,4,6,7,5,9,5,3,6 +Y,1,0,1,0,0,8,10,1,3,6,11,8,1,11,0,8 +Q,4,8,5,10,7,8,6,8,3,6,5,9,3,9,5,10 +O,7,10,7,8,7,7,8,8,4,10,7,8,3,8,3,8 +X,7,9,7,5,3,8,7,2,8,9,6,8,4,10,4,8 +B,3,7,4,5,4,9,7,3,5,7,6,7,3,9,4,8 +O,9,13,6,7,4,6,6,7,4,10,7,9,5,9,5,8 +U,4,11,5,8,4,7,6,12,4,7,12,8,3,9,0,8 +U,5,11,6,8,5,6,9,5,6,6,9,10,5,11,1,8 +Y,6,11,9,8,5,7,10,1,8,6,12,9,4,10,3,7 +B,1,3,2,2,1,8,7,3,5,10,5,7,2,8,4,9 +D,5,11,7,8,5,11,5,4,7,10,2,6,3,8,3,9 +Q,4,9,6,8,5,8,9,7,4,6,9,9,3,8,7,10 +Y,3,5,6,7,1,9,10,3,2,6,13,8,2,11,0,8 +G,2,6,3,4,2,7,7,7,6,6,6,8,2,7,6,11 +E,4,8,6,7,7,5,8,4,4,8,7,9,5,11,9,11 +N,3,4,5,3,2,7,9,2,4,10,6,7,5,8,0,7 +V,4,8,6,6,3,8,12,2,3,5,11,9,5,11,3,6 +U,1,0,2,1,0,8,6,11,4,7,12,8,3,10,0,8 +K,5,9,7,7,6,10,6,1,6,10,3,8,4,9,4,11 +V,3,8,5,6,2,7,11,3,4,6,12,8,3,10,1,8 +L,8,13,8,8,5,7,4,3,5,11,6,12,4,6,7,8 +F,4,10,4,7,2,1,13,5,3,12,10,6,0,8,3,6 +Z,2,1,2,1,1,7,7,3,11,8,6,8,0,8,6,8 +I,2,7,3,5,1,6,8,1,8,14,7,7,0,8,1,7 +D,6,8,8,6,5,7,9,8,6,9,7,5,5,9,4,9 +X,3,7,4,5,2,7,7,4,4,7,6,8,2,8,4,8 +X,3,6,5,4,3,8,7,3,8,5,6,8,2,8,6,8 +G,2,1,4,3,2,6,7,6,6,6,6,10,2,8,3,9 +Y,5,10,7,8,3,8,10,3,2,6,12,8,2,11,0,8 +E,2,1,2,3,2,7,7,5,6,7,6,9,2,8,5,10 +D,3,7,5,5,6,9,8,4,4,7,6,5,4,9,7,5 +X,3,7,4,4,1,7,7,4,4,7,6,8,3,8,4,8 +N,6,7,8,6,8,8,8,5,5,8,5,6,6,9,7,3 +P,3,6,5,9,7,8,13,3,1,9,8,6,4,11,2,7 +F,5,9,8,7,8,10,7,1,5,9,5,5,6,10,5,8 +F,4,7,6,5,6,6,9,1,4,10,7,7,5,10,3,4 +R,1,3,2,1,1,7,8,4,4,7,5,6,2,7,3,8 +P,5,9,6,6,6,7,9,4,6,8,7,4,5,10,4,7 +A,1,0,2,0,0,7,4,2,0,7,2,8,2,7,1,8 +X,3,5,4,3,2,7,7,3,9,6,6,8,3,8,6,7 +A,7,14,7,8,6,10,3,5,2,10,5,12,7,1,6,11 +L,3,9,3,7,2,0,2,3,6,1,0,8,0,8,0,8 +Y,4,11,6,8,3,10,10,1,3,6,12,8,1,11,0,8 +P,5,10,7,8,6,6,9,2,7,9,8,4,4,10,4,7 +W,1,0,2,0,0,7,8,3,0,7,8,8,5,9,0,8 +B,4,3,4,5,3,6,9,8,7,7,5,6,2,8,9,9 +Y,4,5,5,3,2,4,11,2,7,12,10,5,1,11,2,4 +K,5,9,7,6,6,5,7,1,6,9,8,10,4,7,3,8 +I,4,11,3,6,2,10,5,4,4,12,3,7,3,8,5,10 +S,4,8,5,6,4,8,7,5,8,5,6,7,0,8,8,8 +I,1,5,0,8,0,7,7,4,4,7,6,8,0,8,0,8 +J,2,11,3,8,3,10,7,1,6,11,3,7,1,6,2,6 +X,3,1,5,3,2,8,7,4,9,6,6,8,2,8,6,8 +H,11,14,11,8,8,6,9,3,5,10,5,9,7,6,5,6 +G,7,11,7,8,6,6,6,6,6,10,7,12,2,10,4,10 +Y,5,7,5,5,2,2,12,4,5,13,11,6,1,11,1,6 +Y,1,0,2,0,0,8,10,3,1,6,12,8,1,11,0,8 +N,9,15,8,8,4,8,10,5,4,5,6,10,7,12,2,6 +D,5,9,6,7,5,7,7,8,8,6,5,4,4,9,4,9 +Q,5,5,7,8,9,8,8,5,1,6,6,10,7,13,7,13 +T,4,10,5,8,4,7,12,5,6,7,11,8,3,12,1,7 +Q,2,6,3,4,2,8,8,8,5,5,8,9,3,8,5,10 +O,6,9,8,8,7,6,6,5,4,6,3,6,4,9,7,7 +A,10,14,8,8,4,11,1,3,0,10,4,11,3,4,4,10 +O,3,4,4,6,2,7,7,9,6,7,6,8,3,8,4,8 +E,5,11,7,8,5,7,7,1,9,10,6,9,2,8,5,8 +C,4,6,5,4,5,7,6,4,3,7,7,11,5,9,3,9 +A,7,11,7,6,5,10,3,5,2,10,5,11,7,2,6,10 +C,4,11,5,8,4,5,8,8,6,10,8,13,3,12,5,8 +F,5,7,6,5,6,8,6,5,4,7,6,8,6,9,6,10 +A,3,8,5,6,4,11,2,2,2,9,2,9,3,6,3,8 +F,3,9,4,6,1,1,13,5,4,12,10,6,0,8,2,6 +D,4,8,5,6,4,10,5,2,6,11,4,7,3,7,3,9 +L,1,0,2,1,0,2,1,6,4,0,2,5,0,8,0,8 +F,4,7,5,5,3,6,10,4,5,12,7,5,2,9,2,6 +U,5,9,5,6,2,7,4,14,6,7,14,8,3,9,0,8 +P,5,9,8,7,4,7,9,6,5,11,5,4,2,10,4,8 +C,3,8,4,6,3,5,8,8,7,10,8,13,2,10,4,9 +Q,5,9,5,4,3,11,3,3,6,11,3,9,3,8,6,13 +J,3,7,5,5,3,8,6,4,5,8,6,7,2,7,4,6 +K,4,8,6,6,6,7,8,5,4,7,6,7,7,7,6,11 +P,8,10,6,5,3,6,11,5,3,12,4,4,4,10,4,8 +V,5,11,8,8,4,6,11,2,4,8,12,9,3,10,2,8 +G,3,2,4,4,3,7,7,6,6,7,6,10,3,8,4,9 +E,1,1,1,2,1,4,8,5,8,7,6,13,0,8,6,9 +T,2,6,3,4,2,6,12,3,6,8,11,8,2,11,1,7 +N,4,6,6,6,6,6,9,5,3,6,4,8,7,8,4,9 +Z,4,11,6,8,4,6,9,3,10,11,9,6,1,9,6,6 +U,5,9,5,4,3,7,6,4,5,6,7,8,5,6,3,7 +Y,3,9,5,6,1,6,10,2,2,8,12,8,1,11,0,8 +Z,6,10,9,8,7,9,9,5,4,7,5,7,3,9,10,5 +Y,2,4,3,2,1,4,11,2,6,11,10,5,1,11,2,5 +H,9,12,9,6,4,7,8,5,4,9,10,9,7,10,5,9 +B,5,10,8,8,6,9,7,3,7,10,4,6,2,8,6,11 +Z,4,8,5,6,2,7,7,4,15,9,6,8,0,8,8,8 +J,5,10,6,7,2,8,6,3,7,15,5,9,0,6,1,7 +Z,5,8,7,6,4,8,7,2,9,12,5,8,2,8,6,8 +X,4,4,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +R,2,3,3,2,2,6,7,4,5,6,5,6,5,7,3,8 +T,5,7,6,5,6,7,8,4,6,7,7,9,5,8,6,5 +B,3,6,4,4,4,7,7,4,6,7,6,6,2,8,5,10 +T,8,11,8,8,6,7,11,4,8,11,9,4,6,12,6,5 +Z,4,7,6,5,4,6,9,2,9,11,8,6,1,8,6,6 +Z,5,6,4,9,4,6,11,3,3,12,7,6,2,7,9,3 +Z,2,0,2,1,1,7,7,3,11,8,6,8,0,8,7,8 +H,2,6,4,4,5,7,9,5,2,7,6,7,5,6,6,6 +B,6,11,6,8,7,7,8,9,6,6,5,7,2,8,8,9 +J,4,11,6,8,4,9,6,3,6,14,4,9,0,6,1,7 +R,3,3,4,4,2,5,10,8,4,7,4,8,2,7,6,11 +O,4,8,6,7,5,7,6,5,5,9,5,8,3,6,5,6 +F,3,8,3,6,2,1,11,3,5,11,11,9,0,8,2,7 +M,2,0,2,0,1,7,6,10,0,7,9,8,6,6,0,8 +L,4,7,5,5,6,7,7,3,5,6,7,11,6,11,6,5 +N,3,6,5,4,3,8,9,3,4,10,5,6,5,8,1,7 +T,3,4,4,6,1,8,15,1,6,6,11,9,0,8,0,8 +L,6,13,5,8,3,8,3,3,5,12,4,12,2,7,6,8 +O,5,8,7,7,5,7,5,4,5,8,4,8,3,7,4,7 +M,7,7,9,5,7,5,7,3,5,10,9,10,9,5,4,8 +N,1,0,1,1,0,7,7,10,0,5,6,8,4,8,0,8 +H,3,4,5,3,3,6,8,3,5,10,9,9,3,7,3,6 +V,1,1,2,1,0,7,9,4,2,7,13,8,2,10,0,8 +A,4,8,5,6,4,8,3,1,2,6,2,8,2,6,2,6 +C,2,5,3,3,1,4,8,5,6,11,9,12,1,9,2,7 +W,12,14,12,8,7,4,8,2,4,8,10,8,10,11,2,5 +P,4,7,6,5,3,7,10,3,6,14,5,2,0,10,3,9 +B,3,1,3,2,3,7,7,5,6,7,6,6,4,8,5,10 +Y,1,1,3,1,1,8,11,1,6,6,11,8,1,11,1,8 +O,6,10,6,8,5,7,7,8,5,10,6,8,3,8,3,8 +T,3,9,4,6,3,10,11,3,7,4,12,8,2,12,1,8 +I,1,5,1,4,1,7,7,1,8,7,6,8,0,8,3,8 +F,3,6,4,4,4,6,8,5,4,7,5,9,3,10,8,10 +W,5,7,6,5,6,7,8,6,3,8,8,7,7,9,4,9 +K,6,8,8,6,4,8,7,2,7,10,3,8,4,7,4,9 +Q,4,7,5,6,2,8,6,8,6,6,6,8,3,8,4,8 +E,5,10,7,8,6,7,8,2,7,11,6,9,3,8,4,9 +O,4,8,6,6,4,8,7,8,4,7,7,8,3,8,3,8 +G,3,4,4,6,2,8,8,8,7,6,7,8,2,7,6,11 +H,5,9,7,6,5,7,6,7,5,5,4,9,3,7,6,9 +P,6,7,8,9,10,9,9,3,2,6,8,7,6,10,6,4 +O,2,2,3,3,2,8,7,7,4,7,6,9,2,8,3,8 +R,3,8,5,6,4,10,7,3,6,10,3,7,3,7,2,10 +O,1,0,1,0,0,7,7,7,4,7,6,8,2,8,3,8 +R,5,9,7,6,7,9,7,6,3,8,5,6,5,6,8,10 +W,4,8,6,6,3,7,8,4,1,7,8,8,8,9,0,8 +X,3,4,4,5,1,7,7,4,4,7,6,8,3,8,4,8 +N,3,5,5,4,2,6,8,3,4,10,7,8,5,8,1,8 +A,5,10,7,8,4,8,2,2,3,6,2,7,5,7,5,8 +X,1,0,1,0,0,7,7,3,5,7,6,8,2,8,4,7 +I,2,7,4,5,4,10,6,2,5,8,5,5,3,8,5,6 +K,3,8,4,6,3,3,8,6,3,6,4,11,3,8,3,11 +Z,4,6,6,4,4,9,11,6,5,6,5,9,3,8,9,6 +T,2,3,4,4,1,9,15,1,5,5,11,9,0,8,0,8 +E,3,9,3,7,2,2,7,6,10,7,7,15,0,8,7,7 +N,7,12,8,6,4,5,9,5,4,13,11,9,6,9,0,9 +B,8,15,8,8,8,7,8,5,5,9,7,8,8,5,10,7 +C,2,3,2,2,1,6,8,6,7,8,7,13,1,9,3,10 +R,3,6,5,5,6,6,8,3,3,6,5,9,6,7,5,9 +I,6,12,4,6,2,11,3,4,6,11,2,7,3,8,3,12 +X,4,11,5,8,4,7,7,4,4,7,6,8,2,8,4,8 +E,3,8,3,6,4,3,7,5,9,7,7,14,0,8,6,9 +T,4,7,4,5,3,6,11,4,5,11,9,5,2,12,2,5 +X,3,7,5,6,5,9,7,2,4,8,6,6,3,9,7,7 +D,5,11,5,8,3,6,7,11,10,7,6,6,3,8,4,8 +W,8,9,12,8,13,7,7,5,5,7,5,8,10,9,9,7 +X,5,11,8,8,4,10,7,2,9,11,1,6,3,8,4,9 +H,3,2,4,3,3,6,7,6,6,7,6,8,6,8,3,8 +V,1,0,2,0,0,8,9,3,1,6,12,8,2,11,0,8 +H,5,9,6,5,4,8,7,3,5,10,4,8,5,7,4,7 +O,5,10,6,8,9,7,8,5,1,7,6,7,11,11,9,12 +R,3,7,4,5,2,5,10,8,4,7,4,8,3,7,6,11 +X,3,10,4,7,1,7,7,4,4,7,6,8,3,8,4,8 +O,3,6,4,4,3,7,7,7,4,6,5,7,3,8,3,7 +D,5,8,7,6,5,7,7,8,5,7,7,4,4,8,4,8 +F,3,8,3,5,1,1,13,4,3,12,10,6,0,8,2,6 +A,3,7,6,5,3,12,3,3,3,11,1,8,2,6,2,9 +P,3,6,6,4,3,9,8,3,5,12,4,4,1,10,3,9 +E,4,10,4,7,3,3,6,6,11,7,7,15,0,8,7,7 +O,4,3,5,4,2,8,7,8,7,6,6,9,3,8,4,8 +L,3,2,4,4,2,4,4,4,8,2,1,7,0,7,1,6 +O,5,9,6,7,3,7,6,9,8,7,5,8,3,8,4,8 +T,2,1,3,2,1,7,12,3,6,7,11,8,2,11,1,8 +J,2,4,4,3,1,8,8,1,6,14,5,7,0,7,0,8 +Q,5,7,6,9,6,8,7,6,3,8,7,9,3,9,6,9 +D,5,9,6,6,6,7,7,8,6,6,5,4,4,8,4,8 +C,4,8,6,6,4,5,7,6,8,6,6,13,1,7,4,9 +E,3,4,3,3,3,7,7,5,8,7,6,9,2,8,6,9 +N,4,5,7,4,3,7,9,3,5,11,6,6,6,8,1,7 +K,3,4,4,2,2,5,7,4,7,7,6,10,6,8,4,9 +Q,3,5,5,4,3,10,4,3,4,9,3,8,3,7,3,9 +L,2,5,4,3,2,7,3,1,7,9,2,10,0,7,2,9 +I,4,12,3,6,2,11,5,4,4,12,3,7,3,8,5,10 +T,2,5,4,6,1,7,14,0,6,7,11,8,0,8,0,8 +Y,1,0,2,0,0,7,10,3,1,7,12,8,1,11,0,8 +E,4,10,6,8,6,6,8,6,9,6,4,10,2,8,6,9 +U,9,11,9,8,4,3,10,6,8,13,12,9,3,9,1,6 +E,3,4,4,6,2,3,6,6,11,7,7,15,0,8,7,7 +J,1,1,1,1,0,12,3,6,4,13,4,11,0,7,0,8 +B,4,9,4,7,6,6,8,8,5,7,5,7,2,8,7,9 +F,0,0,1,0,0,3,11,4,2,11,8,6,0,8,2,8 +N,5,4,5,6,2,7,7,15,2,4,6,8,6,8,0,8 +P,4,9,6,7,5,5,10,3,6,10,9,5,1,10,4,7 +T,2,4,3,3,1,4,11,2,7,11,10,5,0,10,1,5 +D,3,4,5,3,3,8,7,6,6,9,5,6,3,8,4,9 +P,3,1,3,2,2,5,10,4,4,10,8,4,0,9,4,7 +Q,4,9,6,8,3,8,7,9,6,6,6,9,3,8,5,9 +S,9,15,9,8,4,8,4,5,6,13,6,10,3,8,3,8 +E,5,7,7,5,5,7,8,2,8,11,7,8,3,8,5,8 +S,1,1,2,2,0,8,7,4,7,4,6,7,0,8,7,8 +S,7,10,8,8,4,6,9,4,9,11,7,6,2,7,5,4 +S,4,8,5,6,4,7,7,5,7,5,6,9,0,8,8,8 +X,2,3,4,2,1,9,6,2,8,10,3,7,2,8,2,8 +J,3,9,5,7,3,7,6,3,6,15,6,11,1,6,1,7 +F,4,9,6,6,4,5,10,2,8,10,9,6,4,10,4,6 +H,1,0,1,0,0,7,8,10,1,7,5,8,2,8,0,8 +G,4,8,6,6,4,6,6,6,6,7,5,11,3,10,4,9 +H,5,5,5,7,3,7,8,15,1,7,5,8,3,8,0,8 +S,5,5,6,8,3,8,7,6,9,4,6,8,0,8,9,8 +T,7,9,7,7,3,5,12,3,10,12,10,3,1,11,3,4 +B,6,10,8,8,7,7,7,6,6,9,7,6,3,8,8,9 +M,9,13,11,8,6,10,2,2,3,9,3,9,7,2,1,9 +N,6,11,7,8,6,7,7,13,1,6,6,8,6,8,0,8 +C,4,11,5,8,4,5,8,8,7,10,9,13,2,10,4,10 +T,4,5,5,4,2,5,12,3,7,11,10,4,1,11,2,4 +Y,6,8,6,6,3,4,10,2,8,9,10,5,2,12,4,3 +F,1,0,1,0,0,3,12,4,2,11,8,6,0,8,2,7 +R,3,4,4,3,3,7,8,4,5,6,5,7,2,6,4,8 +N,3,7,4,5,2,7,7,14,2,5,6,8,5,8,0,8 +G,2,1,2,1,1,8,6,6,5,6,5,9,1,7,5,10 +Q,6,11,6,6,4,10,5,4,6,11,4,8,3,8,8,11 +J,2,7,2,5,1,11,3,10,3,12,7,13,1,6,0,8 +N,7,10,9,8,6,6,9,2,4,9,8,8,7,7,2,7 +P,5,11,5,8,6,5,10,9,4,8,6,5,2,10,3,8 +C,4,6,5,4,5,5,7,4,5,7,6,9,5,11,3,8 +U,8,13,7,7,5,8,6,5,4,5,6,7,5,6,3,5 +K,4,7,6,6,5,9,5,2,3,8,4,9,4,7,6,12 +V,4,11,7,8,3,7,12,3,4,6,12,9,3,10,1,8 +Q,7,12,6,7,4,9,4,4,7,10,4,9,3,8,8,11 +E,5,12,4,6,3,6,9,4,4,10,6,9,3,8,7,9 +F,3,2,4,3,2,6,10,4,5,10,9,5,2,9,3,6 +J,2,4,4,3,1,8,6,3,6,14,6,10,0,7,0,7 +Y,5,9,7,7,6,9,5,7,5,7,9,8,3,9,8,4 +Z,2,1,2,1,1,8,7,5,9,6,6,8,1,8,6,8 +G,7,13,6,7,3,9,6,5,6,11,4,8,5,7,5,8 +I,3,9,5,6,6,10,6,2,5,8,5,5,3,8,5,7 +Y,3,8,4,5,1,8,10,2,3,5,12,8,1,10,0,8 +B,2,5,4,3,3,8,8,3,5,10,5,6,3,7,5,9 +O,1,0,1,0,0,8,7,6,4,7,6,8,2,8,2,8 +B,6,9,8,6,7,10,6,3,6,10,3,7,4,7,5,12 +G,3,4,4,6,2,7,6,8,7,6,6,10,1,7,6,11 +A,3,8,5,5,2,6,4,3,1,6,1,8,2,7,2,7 +H,3,7,5,5,5,6,7,6,6,7,6,10,3,8,3,9 +Z,3,9,4,7,2,7,7,4,14,10,6,8,0,8,8,8 +I,1,3,1,2,1,7,7,1,7,7,6,8,0,8,2,8 +Y,6,9,8,7,8,9,7,6,4,6,8,8,3,9,8,4 +Q,4,6,4,7,4,7,11,4,3,6,10,11,3,10,6,8 +H,6,11,8,8,9,6,7,6,7,7,7,10,6,8,4,9 +M,11,12,11,6,5,7,10,5,4,4,5,11,11,13,2,7 +Y,1,0,2,0,0,7,10,3,1,7,12,8,1,11,0,8 +S,3,5,4,3,3,8,7,7,5,7,7,8,2,8,9,8 +O,1,3,2,1,1,7,7,5,3,9,6,8,2,8,2,8 +L,4,8,6,6,7,8,7,3,5,6,7,9,6,10,7,5 +P,4,8,5,6,4,4,11,4,6,11,9,5,0,10,3,7 +A,4,8,6,6,4,8,3,2,2,6,2,7,2,6,2,7 +U,3,8,5,7,5,7,7,4,3,6,6,8,6,8,1,8 +R,8,14,8,8,6,8,8,3,5,9,4,8,6,6,7,7 +A,3,6,5,4,3,8,6,2,4,8,2,5,2,6,2,7 +U,3,6,4,4,3,8,8,8,5,6,7,9,3,8,4,6 +N,5,10,7,8,5,7,8,5,5,7,7,7,6,7,3,7 +U,2,2,3,3,1,7,8,7,7,8,10,7,3,9,1,8 +U,3,3,3,1,1,6,8,5,7,8,7,8,3,10,2,5 +B,4,4,5,7,4,6,6,9,7,6,6,7,2,8,9,10 +O,6,10,7,8,6,7,8,7,4,10,7,7,5,9,4,9 +H,7,9,10,7,6,9,6,3,6,10,5,7,3,8,3,8 +J,1,1,1,1,0,12,4,6,4,13,4,10,0,7,0,8 +J,2,9,3,7,1,14,3,6,5,14,1,9,0,7,0,8 +I,2,5,0,7,0,7,7,4,4,7,6,8,0,8,0,8 +G,3,3,4,5,2,7,8,8,7,6,7,7,2,7,6,11 +P,3,5,4,4,2,6,10,6,4,9,7,2,1,10,4,6 +H,4,7,6,5,4,7,7,3,6,10,5,9,3,8,3,9 +G,5,11,7,8,6,7,6,7,8,6,5,8,2,10,8,12 +U,6,8,8,6,6,8,8,8,5,5,7,10,3,8,4,6 +U,6,11,6,6,4,6,5,6,5,6,9,9,5,9,3,10 +W,8,12,8,6,4,2,9,2,2,10,11,9,8,10,0,7 +Q,3,5,4,6,3,8,7,7,2,5,7,10,3,8,6,9 +E,2,6,2,4,2,3,6,6,10,7,7,14,0,8,7,8 +P,6,9,8,6,5,9,8,5,6,12,4,4,5,9,5,7 +M,3,3,4,2,2,8,6,6,3,6,7,8,6,6,1,7 +J,3,8,4,6,2,10,6,1,6,13,3,7,0,7,0,8 +T,5,10,6,8,7,8,7,4,7,7,6,9,5,7,5,7 +L,1,4,3,3,1,6,4,1,7,8,2,10,0,7,2,8 +S,4,11,5,8,4,8,7,8,7,8,5,7,2,8,9,8 +N,4,7,6,5,4,7,9,6,6,7,6,6,6,8,1,6 +P,3,6,4,4,2,5,11,9,3,9,6,5,1,10,4,8 +D,3,3,3,4,2,5,7,10,8,7,6,6,3,8,4,8 +X,6,10,9,7,4,8,6,1,9,10,4,8,3,8,4,8 +M,3,3,5,2,2,5,6,4,3,10,10,10,6,5,2,7 +A,4,11,6,8,5,7,4,2,1,7,1,8,2,7,2,7 +T,7,10,7,8,4,6,12,4,8,12,9,3,2,12,3,4 +L,4,8,5,6,3,7,3,2,8,7,2,8,1,6,2,7 +W,6,12,7,6,5,8,8,3,3,6,9,7,10,10,3,6 +P,4,6,5,9,8,8,9,4,0,8,7,6,5,10,5,7 +Q,4,9,5,8,3,7,6,8,6,6,7,7,3,8,6,9 +T,5,7,5,5,3,6,11,3,6,11,9,5,3,11,3,4 +L,3,6,4,4,2,4,5,2,8,3,2,7,0,7,1,6 +E,3,4,5,3,2,7,7,2,8,11,6,9,2,8,4,9 +W,4,7,6,5,3,8,8,4,1,7,8,8,8,9,0,8 +C,10,14,8,8,6,7,8,4,4,9,8,10,4,9,9,11 +K,7,9,8,5,4,5,8,4,6,10,11,11,6,12,4,7 +M,3,6,4,4,2,8,6,11,1,6,9,8,7,6,0,8 +T,5,9,7,7,6,7,6,7,7,6,7,9,4,11,6,8 +E,3,6,5,6,5,6,8,4,3,7,7,10,4,10,7,12 +T,6,8,6,6,3,4,12,2,9,12,9,5,0,10,2,4 +P,2,4,3,3,2,5,10,4,4,10,8,5,0,10,3,7 +V,4,9,6,7,7,8,6,4,2,8,7,8,8,9,4,7 +J,1,1,2,1,0,11,6,2,6,12,3,8,0,7,0,8 +E,3,4,4,3,3,7,7,5,8,7,6,8,2,8,6,9 +C,4,6,5,4,5,7,7,4,3,6,8,10,5,11,3,8 +R,5,8,7,6,7,8,8,7,3,7,4,6,5,7,7,8 +T,3,10,5,7,3,9,12,3,7,5,12,8,2,12,1,8 +U,4,5,5,4,3,6,8,5,7,7,10,10,3,9,1,8 +W,6,7,8,6,10,7,7,5,5,7,5,8,10,8,8,8 +T,4,10,5,7,3,8,14,1,5,6,10,9,0,8,0,8 +X,4,10,6,8,4,7,7,4,9,6,6,8,3,8,7,7 +R,3,5,5,4,5,7,8,3,3,7,5,8,6,8,4,8 +Y,1,1,3,2,1,6,10,1,6,8,11,8,1,11,2,8 +K,5,9,5,4,2,7,7,3,6,9,8,9,6,11,3,7 +M,8,9,11,8,12,7,9,4,4,7,5,8,12,6,6,7 +Z,5,10,6,8,3,7,7,4,15,9,6,8,0,8,8,8 +V,5,8,5,6,2,2,12,5,4,12,12,7,3,10,1,8 +G,4,4,5,6,3,7,5,7,8,6,5,8,2,8,6,11 +L,3,7,5,5,2,6,3,3,8,6,2,8,1,6,3,7 +A,3,11,5,8,4,12,3,3,3,10,2,9,2,7,3,9 +Q,6,11,6,6,3,7,6,4,8,9,5,9,3,7,9,10 +X,9,14,8,8,4,9,6,3,8,9,4,7,5,8,5,9 +G,2,4,3,3,2,7,7,5,5,6,6,9,2,8,4,9 +A,2,2,4,4,2,8,2,1,2,7,2,8,2,7,3,7 +A,3,7,4,5,2,7,4,2,0,6,2,8,2,7,1,7 +O,3,6,4,4,3,8,8,7,4,7,7,8,3,8,2,8 +I,1,5,1,4,1,8,7,1,7,7,6,7,0,8,3,7 +L,3,5,5,4,2,7,4,1,8,8,2,10,0,7,2,8 +X,3,7,5,5,3,8,8,3,8,6,6,7,3,8,6,8 +M,5,10,6,8,4,7,7,12,2,7,9,8,9,6,0,8 +Z,2,5,3,4,2,7,7,5,9,6,6,8,1,8,7,8 +J,3,7,5,5,4,10,5,2,6,8,5,5,3,7,5,7 +V,5,11,8,8,10,8,5,5,2,8,8,8,6,9,4,8 +V,5,9,4,4,2,9,10,4,4,6,10,6,4,11,3,7 +L,3,7,4,5,2,4,4,3,10,2,1,7,0,7,2,5 +H,5,7,8,5,6,5,9,3,6,10,8,8,3,8,3,6 +C,5,4,6,6,2,6,7,7,11,8,6,13,1,9,4,8 +X,3,5,5,3,2,5,9,2,8,11,10,9,2,9,3,6 +Y,5,7,5,5,2,3,10,2,7,11,11,6,1,11,2,5 +D,4,8,6,6,4,7,8,7,7,10,6,5,3,8,4,7 +U,9,11,9,8,6,3,8,5,8,10,9,10,3,9,2,6 +I,5,12,5,6,3,6,11,3,5,13,6,4,1,8,5,8 +Q,1,1,2,1,1,8,7,6,3,6,6,8,2,8,3,8 +J,2,5,3,3,1,10,6,2,6,12,4,9,1,6,1,7 +G,4,9,6,6,6,7,7,6,3,7,6,9,5,7,7,7 +U,4,4,5,3,2,5,8,5,7,10,9,8,3,9,2,5 +X,7,11,11,8,7,4,8,2,9,10,11,9,5,8,5,4 +P,4,6,5,4,4,8,5,6,5,7,6,7,2,9,7,9 +T,2,3,3,2,1,5,12,3,7,11,9,5,1,10,2,5 +T,5,11,6,8,8,6,8,4,5,6,6,9,6,7,6,7 +Y,4,10,6,7,1,9,11,3,2,5,13,8,1,11,0,8 +G,5,10,6,7,4,6,7,7,7,10,7,11,2,10,4,9 +K,7,14,8,8,5,9,6,3,5,11,3,7,5,7,4,8 +S,4,8,5,6,6,9,9,5,4,8,4,6,4,9,9,7 +N,4,10,6,8,5,8,8,6,5,7,6,6,6,9,2,6 +M,4,3,4,5,3,7,7,12,1,7,9,8,8,6,0,8 +G,2,3,3,2,1,7,7,5,5,10,7,10,2,9,4,10 +L,2,3,2,2,1,5,4,5,6,2,2,5,1,7,1,6 +X,3,9,4,6,1,7,7,4,4,7,6,8,3,8,4,8 +L,3,4,3,6,1,0,1,5,6,0,0,7,0,8,0,8 +V,6,11,6,6,3,7,9,3,4,8,9,6,5,9,3,6 +P,4,9,6,6,4,7,9,3,4,12,5,4,2,9,3,8 +K,3,1,5,3,3,6,7,4,8,7,6,11,3,8,5,9 +W,4,10,6,8,7,8,7,6,2,7,8,8,9,7,4,9 +Q,2,0,2,1,1,8,7,6,3,6,6,9,2,8,3,8 +Q,2,2,3,3,2,8,8,6,1,5,6,9,2,9,5,10 +Q,4,8,6,7,5,8,8,7,5,6,7,9,3,8,4,9 +S,3,6,5,4,5,6,7,3,2,8,6,6,2,7,10,1 +H,3,8,5,6,4,8,8,7,7,7,5,7,3,8,3,7 +W,2,3,4,2,2,7,10,2,2,7,9,8,6,11,0,8 +O,10,14,7,8,4,6,8,5,4,7,4,6,5,9,5,7 +Y,6,9,5,5,2,5,9,3,3,10,9,5,3,10,3,4 +L,1,0,1,0,0,2,2,5,4,1,2,6,0,8,0,8 +T,6,8,6,6,3,4,12,3,7,12,10,5,1,11,1,5 +G,2,3,2,2,1,6,8,5,4,9,8,9,2,8,4,9 +E,5,10,4,5,3,7,8,4,3,10,5,9,4,9,7,10 +J,6,7,8,8,7,8,8,5,7,7,5,8,4,10,10,8 +Q,4,3,5,5,2,8,9,7,6,6,8,9,3,8,5,9 +N,7,14,9,8,5,3,9,4,4,13,12,10,6,9,0,8 +T,4,5,4,4,2,6,11,2,7,11,9,4,1,11,2,4 +M,5,8,7,6,7,8,6,6,5,7,7,10,11,6,2,9 +O,4,5,5,4,3,7,7,8,5,7,6,8,2,8,3,8 +A,6,10,7,6,3,12,0,4,1,11,4,12,4,4,3,11 +T,2,9,4,7,2,7,13,0,5,7,10,8,0,8,0,8 +N,3,5,6,3,2,7,9,2,5,10,6,6,5,8,1,7 +F,4,10,4,7,3,1,12,4,4,11,10,8,0,8,2,6 +P,2,5,3,7,5,8,6,5,1,7,6,7,6,8,5,9 +U,3,7,5,5,3,4,8,6,6,7,9,10,3,9,1,8 +H,5,7,8,5,5,9,7,3,6,10,4,7,5,8,4,9 +O,6,9,4,4,2,8,7,5,5,8,4,7,4,9,5,8 +S,2,8,3,6,2,8,8,6,9,5,6,7,0,8,9,8 +J,5,9,6,7,3,6,8,2,6,15,6,8,2,8,2,8 +O,4,5,5,4,4,8,4,4,4,9,4,10,3,6,6,6 +B,4,8,6,6,5,7,8,6,6,10,6,6,3,8,7,8 +F,3,8,5,6,3,6,11,4,6,11,9,4,2,10,3,5 +E,3,9,3,6,2,3,6,6,10,7,7,14,0,8,7,8 +F,3,6,5,4,3,5,10,4,6,10,9,5,2,9,3,5 +A,2,3,3,1,1,6,2,2,1,5,2,8,1,6,1,7 +Q,3,5,4,6,4,8,9,4,2,5,8,11,2,10,5,8 +C,6,9,6,7,4,4,7,5,7,10,9,14,4,9,5,5 +S,4,9,6,6,7,9,4,4,4,9,6,9,4,7,10,9 +F,7,10,9,8,7,9,7,2,6,12,4,6,5,9,4,9 +C,5,10,7,9,8,5,6,4,4,7,6,11,5,11,8,10 +V,4,7,6,5,6,8,6,4,2,7,8,8,7,9,4,6 +T,4,4,5,3,2,5,12,2,8,11,9,4,0,10,2,4 +N,5,9,5,4,2,9,11,5,3,5,6,9,5,11,2,6 +E,1,0,1,0,0,5,8,5,7,7,6,12,0,8,6,10 +L,3,8,3,6,2,0,2,4,6,1,0,8,0,8,0,8 +A,3,9,5,6,2,6,5,3,1,6,1,8,2,7,2,7 +K,5,11,5,8,5,3,8,7,3,6,4,11,3,8,2,11 +M,6,9,10,7,12,7,5,3,2,7,5,8,15,7,4,6 +R,2,3,3,2,2,7,7,5,5,7,5,6,2,7,4,8 +S,6,12,6,7,3,6,8,3,6,13,7,7,2,9,3,7 +Y,3,9,5,6,3,7,9,1,6,6,11,8,2,11,2,7 +V,7,10,5,5,2,6,11,5,4,11,9,4,4,11,3,10 +S,2,0,2,1,1,8,7,4,6,5,6,8,0,8,7,8 +M,5,6,8,4,5,9,6,2,4,9,5,7,8,6,2,8 +O,9,15,6,8,5,5,7,7,4,10,7,10,5,9,5,8 +L,3,7,3,5,1,0,1,6,6,0,0,6,0,8,0,8 +D,6,9,8,8,8,7,6,5,7,7,5,9,6,5,10,3 +P,2,1,3,2,1,4,10,3,5,10,8,5,0,9,3,7 +W,3,8,5,6,5,11,11,2,2,5,8,7,7,12,1,7 +O,4,3,5,4,2,7,6,8,8,6,5,7,3,8,4,8 +E,4,9,5,6,3,5,9,2,10,10,8,9,2,8,5,5 +J,2,11,3,8,2,15,4,4,5,13,1,8,0,7,0,8 +T,5,8,7,7,7,7,9,4,8,7,7,8,3,10,8,6 +D,2,2,3,3,2,7,7,7,6,6,6,4,2,8,3,7 +C,7,10,8,8,4,4,8,6,9,12,9,13,2,9,3,7 +T,6,9,6,7,5,6,11,3,7,11,9,5,2,12,2,4 +S,2,3,4,2,1,8,7,2,6,10,6,8,1,9,5,8 +A,4,9,6,6,2,9,5,3,1,8,1,8,2,7,2,8 diff --git a/data/licenseplate_motion.jpg b/data/licenseplate_motion.jpg new file mode 100644 index 00000000..9723ea14 Binary files /dev/null and b/data/licenseplate_motion.jpg differ diff --git a/data/lightning.png b/data/lightning.png new file mode 100644 index 00000000..33e63a45 Binary files /dev/null and b/data/lightning.png differ diff --git a/data/mask.png b/data/mask.png new file mode 100644 index 00000000..0666232d Binary files /dev/null and b/data/mask.png differ diff --git a/data/mask2.png b/data/mask2.png new file mode 100644 index 00000000..5d1b7f00 Binary files /dev/null and b/data/mask2.png differ diff --git a/data/messi_2.jpg b/data/messi_2.jpg new file mode 100644 index 00000000..c0ce1649 Binary files /dev/null and b/data/messi_2.jpg differ diff --git a/data/ml.png b/data/ml.png old mode 100755 new mode 100644 index 3baf0247..6420b44b Binary files a/data/ml.png and b/data/ml.png differ diff --git a/data/notes.png b/data/notes.png new file mode 100644 index 00000000..1535bbbb Binary files /dev/null and b/data/notes.png differ diff --git a/data/opencv-logo-white.png b/data/opencv-logo-white.png new file mode 100644 index 00000000..3c709845 Binary files /dev/null and b/data/opencv-logo-white.png differ diff --git a/data/opencv-logo.png b/data/opencv-logo.png new file mode 100644 index 00000000..bc71a2ae Binary files /dev/null and b/data/opencv-logo.png differ diff --git a/data/orange.jpg b/data/orange.jpg new file mode 100644 index 00000000..773a846d Binary files /dev/null and b/data/orange.jpg differ diff --git a/data/pca_test1.jpg b/data/pca_test1.jpg new file mode 100644 index 00000000..688f82f3 Binary files /dev/null and b/data/pca_test1.jpg differ diff --git a/data/pic1.png b/data/pic1.png new file mode 100644 index 00000000..3e48aa4b Binary files /dev/null and b/data/pic1.png differ diff --git a/data/pic2.png b/data/pic2.png new file mode 100644 index 00000000..068213f7 Binary files /dev/null and b/data/pic2.png differ diff --git a/data/pic3.png b/data/pic3.png new file mode 100644 index 00000000..fe214f00 Binary files /dev/null and b/data/pic3.png differ diff --git a/data/pic4.png b/data/pic4.png new file mode 100644 index 00000000..57b7a0d0 Binary files /dev/null and b/data/pic4.png differ diff --git a/data/pic5.png b/data/pic5.png new file mode 100644 index 00000000..2e6bfa7c Binary files /dev/null and b/data/pic5.png differ diff --git a/data/pic6.png b/data/pic6.png new file mode 100644 index 00000000..5cd6ab06 Binary files /dev/null and b/data/pic6.png differ diff --git a/data/right.jpg b/data/right.jpg new file mode 100644 index 00000000..4a4bc534 Binary files /dev/null and b/data/right.jpg differ diff --git a/data/right01.jpg b/data/right01.jpg new file mode 100644 index 00000000..4d6071b8 Binary files /dev/null and b/data/right01.jpg differ diff --git a/data/right02.jpg b/data/right02.jpg new file mode 100644 index 00000000..6c0fab09 Binary files /dev/null and b/data/right02.jpg differ diff --git a/data/right03.jpg b/data/right03.jpg new file mode 100644 index 00000000..75027611 Binary files /dev/null and b/data/right03.jpg differ diff --git a/data/right04.jpg b/data/right04.jpg new file mode 100644 index 00000000..958973bc Binary files /dev/null and b/data/right04.jpg differ diff --git a/data/right05.jpg b/data/right05.jpg new file mode 100644 index 00000000..926c8258 Binary files /dev/null and b/data/right05.jpg differ diff --git a/data/right06.jpg b/data/right06.jpg new file mode 100644 index 00000000..69a7994f Binary files /dev/null and b/data/right06.jpg differ diff --git a/data/right07.jpg b/data/right07.jpg new file mode 100644 index 00000000..9aff92bd Binary files /dev/null and b/data/right07.jpg differ diff --git a/data/right08.jpg b/data/right08.jpg new file mode 100644 index 00000000..abb794a1 Binary files /dev/null and b/data/right08.jpg differ diff --git a/data/right09.jpg b/data/right09.jpg new file mode 100644 index 00000000..a6dd6f99 Binary files /dev/null and b/data/right09.jpg differ diff --git a/data/right11.jpg b/data/right11.jpg new file mode 100644 index 00000000..29b99bec Binary files /dev/null and b/data/right11.jpg differ diff --git a/data/right12.jpg b/data/right12.jpg new file mode 100644 index 00000000..35b2d07f Binary files /dev/null and b/data/right12.jpg differ diff --git a/data/right13.jpg b/data/right13.jpg new file mode 100644 index 00000000..d504a46b Binary files /dev/null and b/data/right13.jpg differ diff --git a/data/right14.jpg b/data/right14.jpg new file mode 100644 index 00000000..2decf1e7 Binary files /dev/null and b/data/right14.jpg differ diff --git a/data/rubberwhale1.png b/data/rubberwhale1.png new file mode 100644 index 00000000..e2b08dba Binary files /dev/null and b/data/rubberwhale1.png differ diff --git a/data/rubberwhale2.png b/data/rubberwhale2.png new file mode 100644 index 00000000..f365370a Binary files /dev/null and b/data/rubberwhale2.png differ diff --git a/data/shape_sample/1.png b/data/shape_sample/1.png new file mode 100644 index 00000000..f473cb4b Binary files /dev/null and b/data/shape_sample/1.png differ diff --git a/data/shape_sample/10.png b/data/shape_sample/10.png new file mode 100644 index 00000000..46283caa Binary files /dev/null and b/data/shape_sample/10.png differ diff --git a/data/shape_sample/11.png b/data/shape_sample/11.png new file mode 100644 index 00000000..d4f114d8 Binary files /dev/null and b/data/shape_sample/11.png differ diff --git a/data/shape_sample/12.png b/data/shape_sample/12.png new file mode 100644 index 00000000..ad876e93 Binary files /dev/null and b/data/shape_sample/12.png differ diff --git a/data/shape_sample/13.png b/data/shape_sample/13.png new file mode 100644 index 00000000..2ec2621b Binary files /dev/null and b/data/shape_sample/13.png differ diff --git a/data/shape_sample/14.png b/data/shape_sample/14.png new file mode 100644 index 00000000..956e5b81 Binary files /dev/null and b/data/shape_sample/14.png differ diff --git a/data/shape_sample/15.png b/data/shape_sample/15.png new file mode 100644 index 00000000..422395fb Binary files /dev/null and b/data/shape_sample/15.png differ diff --git a/data/shape_sample/16.png b/data/shape_sample/16.png new file mode 100644 index 00000000..57ad4104 Binary files /dev/null and b/data/shape_sample/16.png differ diff --git a/data/shape_sample/17.png b/data/shape_sample/17.png new file mode 100644 index 00000000..58417bc5 Binary files /dev/null and b/data/shape_sample/17.png differ diff --git a/data/shape_sample/18.png b/data/shape_sample/18.png new file mode 100644 index 00000000..25fb50b1 Binary files /dev/null and b/data/shape_sample/18.png differ diff --git a/data/shape_sample/19.png b/data/shape_sample/19.png new file mode 100644 index 00000000..256b8889 Binary files /dev/null and b/data/shape_sample/19.png differ diff --git a/data/shape_sample/2.png b/data/shape_sample/2.png new file mode 100644 index 00000000..7c7c31b9 Binary files /dev/null and b/data/shape_sample/2.png differ diff --git a/data/shape_sample/20.png b/data/shape_sample/20.png new file mode 100644 index 00000000..de8d5ed3 Binary files /dev/null and b/data/shape_sample/20.png differ diff --git a/data/shape_sample/3.png b/data/shape_sample/3.png new file mode 100644 index 00000000..7e8f7bc4 Binary files /dev/null and b/data/shape_sample/3.png differ diff --git a/data/shape_sample/4.png b/data/shape_sample/4.png new file mode 100644 index 00000000..5cced92c Binary files /dev/null and b/data/shape_sample/4.png differ diff --git a/data/shape_sample/5.png b/data/shape_sample/5.png new file mode 100644 index 00000000..786d658c Binary files /dev/null and b/data/shape_sample/5.png differ diff --git a/data/shape_sample/6.png b/data/shape_sample/6.png new file mode 100644 index 00000000..e87cf4d2 Binary files /dev/null and b/data/shape_sample/6.png differ diff --git a/data/shape_sample/7.png b/data/shape_sample/7.png new file mode 100644 index 00000000..b12aa52d Binary files /dev/null and b/data/shape_sample/7.png differ diff --git a/data/shape_sample/8.png b/data/shape_sample/8.png new file mode 100644 index 00000000..52fff13d Binary files /dev/null and b/data/shape_sample/8.png differ diff --git a/data/shape_sample/9.png b/data/shape_sample/9.png new file mode 100644 index 00000000..a54aa3ab Binary files /dev/null and b/data/shape_sample/9.png differ diff --git a/data/slow.flv b/data/slow.flv new file mode 100644 index 00000000..2cf2478d Binary files /dev/null and b/data/slow.flv differ diff --git a/data/star.png b/data/star.png index 0579cfe3..c75946fd 100755 Binary files a/data/star.png and b/data/star.png differ diff --git a/data/starry_night.jpg b/data/starry_night.jpg new file mode 100644 index 00000000..824e0e5a Binary files /dev/null and b/data/starry_night.jpg differ diff --git a/data/stereo_calib.xml b/data/stereo_calib.xml new file mode 100644 index 00000000..0772302c --- /dev/null +++ b/data/stereo_calib.xml @@ -0,0 +1,31 @@ + + + +"left01.jpg" +"right01.jpg" +"left02.jpg" +"right02.jpg" +"left03.jpg" +"right03.jpg" +"left04.jpg" +"right04.jpg" +"left05.jpg" +"right05.jpg" +"left06.jpg" +"right06.jpg" +"left07.jpg" +"right07.jpg" +"left08.jpg" +"right08.jpg" +"left09.jpg" +"right09.jpg" +"left11.jpg" +"right11.jpg" +"left12.jpg" +"right12.jpg" +"left13.jpg" +"right13.jpg" +"left14.jpg" +"right14.jpg" + + diff --git a/data/stuff.jpg b/data/stuff.jpg new file mode 100644 index 00000000..720d3413 Binary files /dev/null and b/data/stuff.jpg differ diff --git a/data/sudoku.png b/data/sudoku.png new file mode 100644 index 00000000..763e518e Binary files /dev/null and b/data/sudoku.png differ diff --git a/data/templ.png b/data/templ.png new file mode 100644 index 00000000..31f6995c Binary files /dev/null and b/data/templ.png differ diff --git a/data/text_defocus.jpg b/data/text_defocus.jpg new file mode 100644 index 00000000..42c37e05 Binary files /dev/null and b/data/text_defocus.jpg differ diff --git a/data/text_motion.jpg b/data/text_motion.jpg new file mode 100644 index 00000000..781f095c Binary files /dev/null and b/data/text_motion.jpg differ diff --git a/data/tmpl.png b/data/tmpl.png new file mode 100644 index 00000000..999ac704 Binary files /dev/null and b/data/tmpl.png differ diff --git a/data/tree.avi b/data/tree.avi new file mode 100644 index 00000000..ded3608a Binary files /dev/null and b/data/tree.avi differ diff --git a/data/vtest.avi b/data/vtest.avi new file mode 100644 index 00000000..965ab12b Binary files /dev/null and b/data/vtest.avi differ diff --git a/data/wechat_donate.jpg b/data/wechat_donate.jpg new file mode 100644 index 00000000..68f91a8a Binary files /dev/null and b/data/wechat_donate.jpg differ diff --git a/data/weiqi.png b/data/weiqi.png new file mode 100644 index 00000000..11ea2b42 Binary files /dev/null and b/data/weiqi.png differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/README.md" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/README.md" new file mode 100644 index 00000000..584a55f4 --- /dev/null +++ "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/README.md" @@ -0,0 +1,21 @@ +参考: +http://www.pyimagesearch.com/2017/07/10/using-tesseract-ocr-python/ + + +## 安装 +* macOS: brew install tesseract --all-languages +* ubuntu: sudo apt-get install tesseract-ocr +* pip install pillow +* pip install pytesseract +* pip install tesserocr + +# tesserocr更好用 + +## 运行 +* 标准输出,不用输出到TXT文件: +tesseract images/example_01.png stdout +* py ocr.py -i example_01.png -p blur + + +## Tesseract使用指南 +- a \ No newline at end of file diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/pytesseract/ocr.py" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/pytesseract/ocr.py" new file mode 100644 index 00000000..5dff89d0 --- /dev/null +++ "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/pytesseract/ocr.py" @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/15 下午6:13 +# @Author : play4fun +# @File : ocr.py.py +# @Software: PyCharm + +""" +ocr.py: +""" + +# import the necessary packages +from PIL import Image +import pytesseract +import argparse +import cv2 +import os + +# construct the argument parse and parse the arguments +ap = argparse.ArgumentParser() +ap.add_argument("-i", "--image", required=True, + help="path to input image to be OCR'd") +ap.add_argument("-p", "--preprocess", type=str, default="thresh", + help="type of preprocessing to be done") +args = vars(ap.parse_args()) + +# load the example image and convert it to grayscale +image = cv2.imread(args["image"]) +gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + +# check to see if we should apply thresholding to preprocess the +# image +if args["preprocess"] == "thresh": + gray = cv2.threshold(gray, 0, 255, + cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] + +# make a check to see if median blurring should be done to remove +# noise +elif args["preprocess"] == "blur": + gray = cv2.medianBlur(gray, 3) + +# write the grayscale image to disk as a temporary file so we can +# apply OCR to it +filename = "{}.png".format(os.getpid()) +cv2.imwrite(filename, gray) + +# load the image as a PIL/Pillow image, apply OCR, and then delete +# the temporary file +text = pytesseract.image_to_string(Image.open(filename)) +os.remove(filename) +print(text) + +# show the output images +cv2.imshow("Image", image) +cv2.imshow("Output", gray) +cv2.waitKey(0) diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/GetComponentImages-example.py" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/GetComponentImages-example.py" new file mode 100644 index 00000000..eae1e0d7 --- /dev/null +++ "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/GetComponentImages-example.py" @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/21 14:49 +# @Author : play4fun +# @File : GetComponentImages-example.py.py +# @Software: PyCharm + +""" +GetComponentImages-example.py: +""" + +from PIL import Image +from tesserocr import PyTessBaseAPI, RIL + +with PyTessBaseAPI() as api: + # image = Image.open('/usr/src/tesseract/testing/phototest.tif') + image = Image.open('phototest.tif') # 图片有问题 + print(image.format, image.info, image.height, image.width) + + api.SetImage(image) + boxes = api.GetComponentImages(RIL.TEXTLINE, True) + print('Found {} textline image components.'.format(len(boxes))) + for i, (im, box, _, _) in enumerate(boxes): + # im is a PIL image object + # box is a dict with x, y, w and h keys + api.SetRectangle(box['x'], box['y'], box['w'], box['h']) + ocrResult = api.GetUTF8Text() + conf = api.MeanTextConf() + print(u"Box[{0}]: x={x}, y={y}, w={w}, h={h}, " + "confidence: {1}, text: {2}").format(i, conf, ocrResult, **box) diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/eurotext.tif" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/eurotext.tif" new file mode 100644 index 00000000..92791da4 Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/eurotext.tif" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/phototest.tif" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/phototest.tif" new file mode 100644 index 00000000..adac046d Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/phototest.tif" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample.jpg" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample.jpg" new file mode 100755 index 00000000..d15d0afb Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample.jpg" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample1.jpeg" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample1.jpeg" new file mode 100755 index 00000000..af915008 Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample1.jpeg" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample2.jpeg" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample2.jpeg" new file mode 100755 index 00000000..9b0fd0bd Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample2.jpeg" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample3.jpeg" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample3.jpeg" new file mode 100755 index 00000000..b2a10bfb Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/sample3.jpeg" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo1.py" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo1.py" new file mode 100755 index 00000000..3bd2f47d --- /dev/null +++ "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo1.py" @@ -0,0 +1,21 @@ +# -*-coding:utf8-*-# + +__author__ = 'play4fun' +""" +create time:16/10/21 11:44 +""" + +from tesserocr import PyTessBaseAPI + +images = ['/Volumes/GF/Project/Python/Tesserocr/tesserocr/sample1.jpeg', '/Volumes/GF/Project/Python/Tesserocr/tesserocr/sample2.jpeg', + '/Volumes/GF/Project/Python/Tesserocr/tesserocr/sample3.jpeg'] + +with PyTessBaseAPI() as api: + for img in images: + api.SetImageFile(img) + print('text:', api.GetUTF8Text()) + print('-----') + print(api.AllWordConfidences()) + print('-----') +# api is automatically finalized when used in a with-statement (context manager). +# otherwise api.End() should be explicitly called when it's no longer needed. diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo2.py" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo2.py" new file mode 100755 index 00000000..23b48bba --- /dev/null +++ "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo2.py" @@ -0,0 +1,17 @@ +# -*-coding:utf8-*-# + +__author__ = 'play4fun' +""" +create time:16/10/21 11:47 +""" + +import tesserocr +from PIL import Image + +print(tesserocr.tesseract_version()) # print tesseract-ocr version +print(tesserocr.get_languages()) # prints tessdata path and list of available languages + +image = Image.open('sample.jpg') +print(tesserocr.image_to_text(image)) # print ocr text from image +# or +print(tesserocr.file_to_text('sample.jpg')) diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo3.py" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo3.py" new file mode 100755 index 00000000..42fd637a --- /dev/null +++ "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/Tessract-OCR/tesserocr/tesserocr_demo3.py" @@ -0,0 +1,27 @@ +# -*-coding:utf8-*-# + +__author__ = 'play4fun' +""" +create time:16/10/21 11:47 +""" +# Orientation and script detection (OSD) + +from PIL import Image +from tesserocr import PyTessBaseAPI, PSM + +with PyTessBaseAPI(psm=PSM.AUTO_OSD) as api: + # image = Image.open("/usr/src/tesseract/testing/eurotext.tif")#No such file + # image = Image.open("eurotext.tif") + image = Image.open('phototest.tif') + api.SetImage(image) + api.Recognize() + + it = api.AnalyseLayout() + orientation, direction, order, deskew_angle = it.Orientation() + print("Orientation: {:d}".format(orientation)) + print("WritingDirection: {:d}".format(direction)) + print("TextlineOrder: {:d}".format(order)) + print("Deskew angle: {:.4f}".format(deskew_angle)) + # + ocrResult = api.GetUTF8Text() + print('result:\n',ocrResult) diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/README.md" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/README.md" new file mode 100644 index 00000000..9b24f571 --- /dev/null +++ "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/README.md" @@ -0,0 +1,12 @@ +http://www.pyimagesearch.com/2017/07/17/credit-card-ocr-with-opencv-and-python/ + + + +当比较数字时,模板匹配也是一种非常快速的方法。 + +不幸的是,我们无法将OCR图像应用于真实的信用卡图像,所以如果这种方法在实际的真实世界图像上是可靠的,那么肯定会提出这个问题。鉴于照明条件,视角和其他一般噪声的变化,我们可能需要采取更多以**机器学习**为导向的方法。 + +无论如何,至少对于这些示例图像,我们能够成功应用模板匹配作为OCR的一种形式。 + + + diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card1.png" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card1.png" new file mode 100644 index 00000000..8e438734 Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card1.png" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card2.png" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card2.png" new file mode 100644 index 00000000..af0db8d7 Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card2.png" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card3.png" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card3.png" new file mode 100644 index 00000000..d4731802 Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card3.png" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card4.jpg" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card4.jpg" new file mode 100644 index 00000000..96a15062 Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/card4.jpg" differ diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/matchTemplate_credit_card_num1.py" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/matchTemplate_credit_card_num1.py" new file mode 100644 index 00000000..f5d6dc63 --- /dev/null +++ "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/matchTemplate_credit_card_num1.py" @@ -0,0 +1,230 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/6 11:32 +# @Author : play4fun +# @File : matchTemplate_credit_card_num1.py +# @Software: PyCharm + +""" +matchTemplate_credit_card_num1.py: + +http://www.pyimagesearch.com/2017/07/17/credit-card-ocr-with-opencv-and-python/ + +python ocr_template_match.py --reference ocr_a_reference.png --image images/credit_card_04.png + +Credit Card Type: Visa +Credit Card #: 4000123456789010 + + +检测图像中信用卡的位置。 +本地化四位数字,与信用卡上十六位数相关。 +应用OCR来识别信用卡上的十六位数字。 +识别信用卡类型(即Visa,万事达卡,美国运通等)。 + +""" + +# import the necessary packages +from imutils import contours +import numpy as np +import argparse +import imutils +import cv2 + +# construct the argument parser and parse the arguments解析命令行参数 +ap = argparse.ArgumentParser() +ap.add_argument("-i", "--image", required=True, + help="path to input image") +ap.add_argument("-r", "--reference", required=True, + help="path to reference OCR-A image") +args = vars(ap.parse_args()) + +# define a dictionary that maps the first digit of a credit card +# number to the credit card type定义信用卡类型 +FIRST_NUMBER = { + '0': 'None', + "3": "American Express", + "4": "Visa", + "5": "MasterCard", + "6": "Discover Card" +} + +# load the reference OCR-A image from disk, convert it to grayscale, +# and threshold it, such that the digits appear as *white* on a +# *black* background +# and invert it, such that the digits appear as *white* on a *black* +ref = cv2.imread(args["reference"]) +ref = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY) +ref = cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV)[1] + +cv2.imshow('ref', ref) +cv2.waitKey(0) + +''' +# find contours in the OCR-A image (i.e,. the outlines of the digits) +# sort them from left to right, and initialize a dictionary to map +# digit name to the ROI +# refCnts = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#有问题 +refCnts = cv2.findContours(ref.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +# refCnts = refCnts[0] if imutils.is_cv2() else refCnts[1] +refCnts = refCnts[1] +print('len cnt:',len(refCnts)) +refCnts = contours.sort_contours(refCnts, method="left-to-right")[0]#排列轮廓,没意义 +print('sort_contours len cnt:',len(refCnts)) +digits = {} + +# 循环浏览轮廓,提取ROI并将其与相应的数字相关联 +# loop over the OCR-A reference contours +for (i, c) in enumerate(refCnts): + # compute the bounding box for the digit, extract it, and resize + # it to a fixed size + (x, y, w, h) = cv2.boundingRect(c) + roi = ref[y:y + h, x:x + w] + roi = cv2.resize(roi, (57, 88)) + cv2.imshow('roi', roi) + cv2.waitKey(500) + + # update the digits dictionary, mapping the digit name to the ROI + digits[i] = roi +# 从参考图像中提取数字,并将其与相应的数字名称相关联 +print('digits:',digits.keys()) +''' + +# try1 +digits = {} +rows, cols = ref.shape +per = int(cols / 10) +for x in range(10): + roi = ref[:, x * per:(x + 1) * per] + roi = cv2.resize(roi, (57, 88)) + cv2.imshow('roi', roi) + cv2.waitKey(500) + + # update the digits dictionary, mapping the digit name to the ROI + digits[x] = roi +# 从参考图像中提取数字,并将其与相应的数字名称相关联 +print('digits:', digits.keys()) + +# 初始化一对结构化的内核: +# 您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。 +# initialize a rectangular (wider than it is tall) and square +# structuring kernel +rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3)) +sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) + +# 读取信用卡相片 +# load the input image, resize it, and convert it to grayscale +image = cv2.imread(args["image"]) +image = imutils.resize(image, width=300) +gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + +# apply a tophat (whitehat) morphological operator to find light +# regions against a dark background (i.e., the credit card numbers) +tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel) + +# compute the Scharr gradient of the tophat image, then scale +# the rest back into the range [0, 255] +gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0, + ksize=-1) +gradX = np.absolute(gradX) +(minVal, maxVal) = (np.min(gradX), np.max(gradX)) +gradX = (255 * ((gradX - minVal) / (maxVal - minVal))) +gradX = gradX.astype("uint8") + +# apply a closing operation using the rectangular kernel to help +# cloes gaps in between credit card number digits, then apply +# Otsu's thresholding method to binarize the image +gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel) +thresh = cv2.threshold(gradX, 0, 255, + cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] + +# apply a second closing operation to the binary image, again +# to help close gaps between credit card number regions +thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel) + +# find contours in the thresholded image, then initialize the +# list of digit locations找到轮廓并初始化数字分组位置列表。 +cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, + cv2.CHAIN_APPROX_SIMPLE) +cnts = cnts[0] if imutils.is_cv2() else cnts[1] +locs = [] + +# loop over the contours +for (i, c) in enumerate(cnts): + # compute the bounding box of the contour, then use the + # bounding box coordinates to derive the aspect ratio + (x, y, w, h) = cv2.boundingRect(c) + ar = w / float(h) + + # since credit cards used a fixed size fonts with 4 groups + # of 4 digits, we can prune potential contours based on the + # aspect ratio根据每个轮廓的宽高比进行过滤 + if ar > 2.5 and ar < 4.0: + # contours can further be pruned on minimum/maximum width + # and height使用纵横比,我们分析每个轮廓的形状。如果 ar 在2.5到4.0之间(比它高),以及 40到55个像素之间的 w以及 10到20像素之间的h,我们将一个方便的元组的边界矩形参数附加到 locs + if (w > 40 and w < 55) and (h > 10 and h < 20): + # append the bounding box region of the digits group + # to our locations list + locs.append((x, y, w, h)) + +# sort the digit locations from left-to-right, then initialize the +# list of classified digits +locs = sorted(locs, key=lambda x: x[0]) +output = [] + +# loop over the 4 groupings of 4 digits +for (i, (gX, gY, gW, gH)) in enumerate(locs): + # initialize the list of group digits + groupOutput = [] + + # extract the group ROI of 4 digits from the grayscale image, + # then apply thresholding to segment the digits from the + # background of the credit card + group = gray[gY - 5:gY + gH + 5, gX - 5:gX + gW + 5] + group = cv2.threshold(group, 0, 255, + cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] + + # detect the contours of each individual digit in the group, + # then sort the digit contours from left to right + digitCnts = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + cv2.imshow('digitCnts', digitCnts[0]) + cv2.waitKey(1000) + # digitCnts = digitCnts[0] if imutils.is_cv2() else digitCnts[1] + digitCnts = digitCnts[1] + # digitCnts = contours.sort_contours(digitCnts,method="left-to-right")[0] + + # loop over the digit contours + for c in digitCnts: + # compute the bounding box of the individual digit, extract + # the digit, and resize it to have the same fixed size as + # the reference OCR-A images + (x, y, w, h) = cv2.boundingRect(c) + roi = group[y:y + h, x:x + w] + roi = cv2.resize(roi, (57, 88)) + + # initialize a list of template matching scores + scores = [] + + # loop over the reference digit name and digit ROI + for (digit, digitROI) in digits.items(): + # apply correlation-based template matching, take the + # score, and update the scores list + result = cv2.matchTemplate(roi, digitROI, + cv2.TM_CCOEFF) + (_, score, _, _) = cv2.minMaxLoc(result) + scores.append(score) + + # the classification for the digit ROI will be the reference + # digit name with the *largest* template matching score + groupOutput.append(str(np.argmax(scores))) # draw the digit classifications around the group + cv2.rectangle(image, (gX - 5, gY - 5), + (gX + gW + 5, gY + gH + 5), (0, 0, 255), 2) + cv2.putText(image, "".join(groupOutput), (gX, gY - 15), + cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2) + + # update the output digits list + output.extend(groupOutput) + +# display the output credit card information to the screen +print("Credit Card Type: {}".format(FIRST_NUMBER.get(output[0], 'None'))) +print("Credit Card #: {}".format("".join(output))) +cv2.imshow("Image", image) # TODO 效果不是很好,需要改进 +cv2.waitKey(0) diff --git "a/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/reference.png" "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/reference.png" new file mode 100644 index 00000000..bd990837 Binary files /dev/null and "b/my01-OCR\346\226\207\345\255\227\350\257\206\345\210\253/\344\275\277\347\224\250-\346\250\241\346\235\277\345\214\271\351\205\215-\350\257\206\345\210\253\344\277\241\347\224\250\345\215\241\345\217\267\347\240\201/reference.png" differ diff --git "a/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/README.md" "b/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/README.md" new file mode 100644 index 00000000..50299c99 --- /dev/null +++ "b/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/README.md" @@ -0,0 +1,30 @@ +https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/ + +我们将学习如何以及何时使用OpenCV 3.2 - BOOSTING,MIL,KCF,TLD,MEDIANFLOW和GOTURN中提供的6种不同的跟踪器。我们还将学习现代跟踪算法背后的一般理论。 +简单地说,在视频的连续帧中定位对象称为`跟踪`。 + +定义听起来很直观,但在计算机视觉和机器学习中,跟踪是一个非常广泛的术语,涵盖概念上相似但技术上不同的想法。例如,所有以下不同但相关的想法通常在对象跟踪下进行研究 + +密集光流:这些算法有助于估计视频帧中每个像素的运动矢量。 +稀疏光流:这些算法,如Kanade-Lucas-Tomashi(KLT)功能跟踪器,跟踪图像中几个特征点的位置。 +卡尔曼滤波:一种非常流行的信号处理算法,用于根据先前的运动信息预测运动物体的位置。该算法的早期应用之一是导弹指导!另外这里也提到,“引导阿波罗11号月球模块下降到月球的车载电脑卡尔曼滤波器”。 +平移和凸轮移位:这些是用于定位密度函数的最大值的算法。它们也用于跟踪。 +单个对象跟踪器:在这类跟踪器中,第一帧使用矩形标记,以指示要跟踪的对象的位置。然后使用跟踪算法在后续帧中跟踪对象。在大多数现实生活中,这些跟踪器与对象检测器结合使用。 +多目标追踪算法:当我们有一个快速物体检测器的情况下,检测每个帧中的多个对象是有意义的,然后运行一个跟踪查找算法,它识别一帧中的哪个矩形对应于下一帧中的一个矩形。 +跟踪与检测 + +如果您曾经玩过OpenCV脸部检测功能,您就可以实时了解它,您可以轻松地在每一帧中检测到脸部。那么,为什么你首先需要跟踪?我们来探讨您可能想跟踪视频中的对象的不同原因,而不仅仅是重复检测。 + +跟踪比检测更快:通常跟踪算法比检测算法快。原因很简单 当您跟踪在前一帧中检测到的对象时,您会了解到对象的外观。您也知道前一帧中的位置以及其运动的方向和速度。因此,在下一帧中,您可以使用所有这些信息来预测对象在下一帧中的位置,并围绕对象的预期位置进行小型搜索,以准确定位对象。一个良好的跟踪算法将使用所有关于该对象的信息,而检测算法始终从零开始。因此,在设计高效系统的同时,通常在第 n 帧上运行对象检测, 而在n-1帧之间采用跟踪算法。为什么我们不简单地检测第一帧中的对象并随后跟踪?追踪从额外的信息中获益的确实是真的,但是当他们在障碍物后面延长一段时间或者移动得如此之快以致跟踪算法无法赶上时,也可能失去对象的跟踪。跟踪算法累积误差也是常见的,边框跟踪对象慢慢地偏离其跟踪对象。为了解决这些跟踪算法的问题,检测算法经常运行。针对对象的大量示例对检测算法进行了培训。因此,他们 对物体的一般类有更多的了解。另一方面,跟踪算法更多地了解他们正在跟踪的类的具体实例。 +检测失败时跟踪可以帮助:如果您在视频上运行面部检测器,并且人的脸部被物体遮挡,则脸部检测器很可能会失败。另一方面,良好的跟踪算法将处理某种程度的遮挡。 + + +跟踪保留身份:对象检测的输出是包含对象的矩形数组。但是,没有附加对象的身份。例如,在下面的视频中,检测红点的检测器将输出与帧中检测到的所有点对应的矩形。在下一帧中,它将输出另一个矩形数组。在第一帧中,特定的点可以由阵列中的位置10处的矩形表示,并且在第二帧中可以在位置17处表示。在帧上使用检测时,我们不知道哪个矩形对应于哪个对象。另一方面,跟踪提供了一种字面连接点的方法! + +OpenCV 3 Tracking API + +OpenCV 3附带了一个新的跟踪API,其中包含许多单个对象跟踪算法的实现。OpenCV 3.2 - BOOSTING,MIL,KCF,TLD,MEDIANFLOW和GOTURN有6种不同的跟踪器。 + +注意:OpenCV 3.1具有这5个跟踪器(BOOSTING,MIL,KCF,TLD,MEDIANFLOW)的实现。OpenCV 3.0具有以下4个跟踪器(BOOSTING,MIL,TLD,MEDIANFLOW)的实现。 + +在我们提供算法的简要描述之前,让我们看看设置和用法。在下面的评论代码中,我们首先通过选择跟踪器类型 - BOOSTING,MIL,KCF,TLD,MEDIANFLOW或GOTURN来设置跟踪器。然后我们打开一个视频并抓住一帧。我们定义一个包含第一帧对象的边界框,并使用第一个框架和边界框来初始化跟踪器。最后,我们从视频中读取帧,只是循环更新跟踪器,以获得当前帧的新的边界框。 \ No newline at end of file diff --git "a/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/tracker.py" "b/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/tracker.py" new file mode 100644 index 00000000..88c3b505 --- /dev/null +++ "b/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/tracker.py" @@ -0,0 +1,80 @@ + +''' +https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/ + + +''' + +import cv2 +import sys + +if __name__ == '__main__': + + # Set up tracker. + # Instead of MIL, you can also use + + tracker_types = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN'] + # tracker_type = tracker_types[2] + tracker_type = tracker_types[0] + tracker = cv2.Tracker_create(tracker_type) + + # Read video + video = cv2.VideoCapture("videos/chaplin.mp4") + + # Exit if video not opened. + if not video.isOpened(): + print("Could not open video") + sys.exit() + + # Read first frame. + ok, frame = video.read() + if not ok: + print('Cannot read video file') + sys.exit() + + # Define an initial bounding box + bbox = (287, 23, 86, 320) + + # Uncomment the line below to select a different bounding box + # bbox = cv2.selectROI(frame, False) + + # Initialize tracker with first frame and bounding box + ok = tracker.init(frame, bbox) + + while True: + # Read a new frame + ok, frame = video.read() + if not ok: + break + + # Start timer + timer = cv2.getTickCount() + + # Update tracker + ok, bbox = tracker.update(frame) + + # Calculate Frames per second (FPS) + fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer); + + # Draw bounding box + if ok: + # Tracking success + p1 = (int(bbox[0]), int(bbox[1])) + p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3])) + cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1) + else: + # Tracking failure + cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) + + # Display tracker type on frame + cv2.putText(frame, tracker_type + " Tracker", (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2) + + # Display FPS on frame + cv2.putText(frame, "FPS : " + str(int(fps)), (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2) + + # Display result + cv2.imshow("Tracking", frame) + + # Exit if ESC pressed + k = cv2.waitKey(1) & 0xff + if k == 27: break diff --git "a/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/videos/chaplin.mp4" "b/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/videos/chaplin.mp4" new file mode 100644 index 00000000..107c7a00 Binary files /dev/null and "b/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/videos/chaplin.mp4" differ diff --git "a/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/\350\277\220\345\212\250\346\243\200\346\265\213motiondetect/motiondetect.py" "b/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/\350\277\220\345\212\250\346\243\200\346\265\213motiondetect/motiondetect.py" new file mode 100644 index 00000000..e18739d6 --- /dev/null +++ "b/my02-\350\247\206\351\242\221-\345\257\271\350\261\241\350\267\237\350\270\252/\350\277\220\345\212\250\346\243\200\346\265\213motiondetect/motiondetect.py" @@ -0,0 +1,43 @@ +''' +http://www.technicdynamic.com/2017/08/28/python-motion-detection-with-opencv-simple/ + +''' + +import cv2 # importing Python OpenCV +from datetime import datetime # importing datetime for naming files w/ timestamp + + +def diffImg(t0, t1, t2): # Function to calculate difference between images. + d1 = cv2.absdiff(t2, t1) + d2 = cv2.absdiff(t1, t0) + return cv2.bitwise_and(d1, d2) + + +threshold = 81500 # Threshold for triggering "motion detection" +cam = cv2.VideoCapture(0) # Lets initialize capture on webcam + +winName = "Movement Indicator" # comment to hide window +cv2.namedWindow(winName) # comment to hide window + +# Read three images first: +t_minus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) +t = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) +t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) +# Lets use a time check so we only take 1 pic per sec +timeCheck = datetime.now().strftime('%Ss') + +while True: + cv2.imshow(winName, cam.read()[1]) # comment to hide window + if cv2.countNonZero(diffImg(t_minus, t, t_plus)) > threshold and timeCheck != datetime.now().strftime('%Ss'): + dimg = cam.read()[1] + # cv2.imwrite(datetime.now().strftime('%Y%m%d_%Hh%Mm%Ss%f') + '.jpg', dimg) + timeCheck = datetime.now().strftime('%Ss') + # Read next image + t_minus = t + t = t_plus + t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) + + key = cv2.waitKey(10) + if key == ord('q'): + cv2.destroyWindow(winName) # comment to hide window + break diff --git "a/my03-\351\235\242\345\220\221\345\257\271\350\261\241/children-draw.png" "b/my03-\351\235\242\345\220\221\345\257\271\350\261\241/children-draw.png" new file mode 100644 index 00000000..2d4a683c Binary files /dev/null and "b/my03-\351\235\242\345\220\221\345\257\271\350\261\241/children-draw.png" differ diff --git "a/my03-\351\235\242\345\220\221\345\257\271\350\261\241/identify-result.png" "b/my03-\351\235\242\345\220\221\345\257\271\350\261\241/identify-result.png" new file mode 100644 index 00000000..7f4c163c Binary files /dev/null and "b/my03-\351\235\242\345\220\221\345\257\271\350\261\241/identify-result.png" differ diff --git "a/my03-\351\235\242\345\220\221\345\257\271\350\261\241/\346\243\200\346\265\213\347\272\277\346\235\241\345\222\214\345\275\242\347\212\266-\345\207\240\344\275\225\345\275\242\347\212\266.py" "b/my03-\351\235\242\345\220\221\345\257\271\350\261\241/\346\243\200\346\265\213\347\272\277\346\235\241\345\222\214\345\275\242\347\212\266-\345\207\240\344\275\225\345\275\242\347\212\266.py" new file mode 100644 index 00000000..d8f3fd02 --- /dev/null +++ "b/my03-\351\235\242\345\220\221\345\257\271\350\261\241/\346\243\200\346\265\213\347\272\277\346\235\241\345\222\214\345\275\242\347\212\266-\345\207\240\344\275\225\345\275\242\347\212\266.py" @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/27 11:55 +# @Author : play4fun +# @File : 检测线条和形状-几何形状.py +# @Software: PyCharm + +""" +检测线条和形状-几何形状.py: + +https://stackoverflow.com/questions/31974843/detecting-lines-and-shapes-in-opencv-using-python + +""" + +import cv2 +import numpy as np + + +class File(object): + def __init__(self, filename): + self.filename = filename + + def open(self, filename=None, mode='r'): + if filename is None: + filename = self.filename + + return cv2.imread(filename), open(filename, mode) + + def save(self, image=None, filename_override=None): + filename = "output/" + self.filename.split('/')[-1] + + if filename_override: + filename = "output/" + filename_override + + return cv2.imwrite(filename, image) + + +class Image(object): + def __init__(self, image): + self.image = image + + def grayscale(self): + return cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY) + + def edges(self): + return cv2.Canny(self.image, 0, 255) + + def lines(self): + lines = cv2.HoughLinesP(self.image, 1, np.pi / 2, 6, None, 50, 10) + for line in lines[0]: + pt1 = (line[0], line[1]) + pt2 = (line[2], line[3]) + cv2.line(self.image, pt1, pt2, (0, 0, 255), 2) + + +if __name__ == '__main__': + File = File('images/a.png') + Image = Image(File.open()[0]) + Image.image = Image.grayscale() + Image.lines() + File.save(Image.image) diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/1.png" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/1.png" new file mode 100644 index 00000000..f98675ee Binary files /dev/null and "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/1.png" differ diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/2.png" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/2.png" new file mode 100644 index 00000000..398567b1 Binary files /dev/null and "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/2.png" differ diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/3.jpg" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/3.jpg" new file mode 100644 index 00000000..e711f633 Binary files /dev/null and "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/3.jpg" differ diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/Solved-Maze-1.png" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/Solved-Maze-1.png" new file mode 100644 index 00000000..29bb53cb Binary files /dev/null and "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/Solved-Maze-1.png" differ diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/Solved-Maze-2.png" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/Solved-Maze-2.png" new file mode 100644 index 00000000..ed31db09 Binary files /dev/null and "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/Solved-Maze-2.png" differ diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/huge_maze.jpg" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/huge_maze.jpg" new file mode 100644 index 00000000..7c2ba706 Binary files /dev/null and "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/SampleImages/huge_maze.jpg" differ diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/aStar1.py" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/aStar1.py" new file mode 100644 index 00000000..de8709ac --- /dev/null +++ "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/aStar1.py" @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/30 18:16 +# @Author : play4fun +# @File : aStar1.py.py +# @Software: PyCharm + +""" +aStar1.py: 不行!?? +""" + +import sys + +# from Queue import Queue +from multiprocessing import Queue +from PIL import Image + +start = (400, 984) +end = (398, 25) + + +def iswhite(value): + if value == (255, 255, 255): + return True + + +def getadjacent(n): + x, y = n + return [(x - 1, y), (x, y - 1), (x + 1, y), (x, y + 1)] + + +def BFS(start, end, pixels): + queue = Queue() + queue.put([start]) # Wrapping the start tuple in a list + + while not queue.empty(): + + path = queue.get() + pixel = path[-1] + + if pixel == end: + return path + + for adjacent in getadjacent(pixel): + x, y = adjacent + if iswhite(pixels[x, y]): + pixels[x, y] = (127, 127, 127) # see note + new_path = list(path) + new_path.append(adjacent) + queue.put(new_path) + + print("Queue has been exhausted. No answer was found.") + + +if __name__ == '__main__': + + # invoke: python mazesolver.py [.jpg|.png|etc.] + base_img = Image.open(sys.argv[1]) + base_pixels = base_img.load() + print(base_pixels) + + path = BFS(start, end, base_pixels) + if path is None: + print('path is None') + exit(-1) + print('path:',path) + + path_img = Image.open(sys.argv[1]) + path_pixels = path_img.load() + + for position in path: + x, y = position + path_pixels[x, y] = (255, 0, 0) # red + + path_img.save(sys.argv[2]) diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/maze.cpp" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/maze.cpp" new file mode 100644 index 00000000..5b48167e --- /dev/null +++ "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/maze.cpp" @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include + +using namespace std; +using namespace cv; +Mat kernel = Mat::ones(15, 15, CV_8UC1); +class Morph{ +private: + int dilationElem,erodeElem; + int dilationSize,erodeSize; + +public: + Morph(){ + dilationElem=0; + erodeElem=0; + dilationSize=2; + erodeSize=2; + } + Mat dilateImage(Mat input){ + Mat temp,element; + int dilationType; + if(dilationElem==0) + dilationType=MORPH_RECT; + else if(dilationElem==1) + dilationType=MORPH_CROSS; + else if(dilationElem==2) + dilationType=MORPH_ELLIPSE; + element= getStructuringElement(dilationType,Size(2*dilationSize+1,2*dilationSize+1),Point(dilationSize,dilationSize)); + dilate(input,temp,kernel); + return temp; + } + Mat erodeImage(Mat input){ + Mat temp,element; + int erodeType; + if(erodeElem==0) + erodeType=MORPH_RECT; + else if(erodeElem==1) + erodeType=MORPH_CROSS; + else if(erodeElem==2) + erodeType=MORPH_ELLIPSE; + element= getStructuringElement(erodeType,Size(2*erodeSize+1,2*erodeSize+1),Point(erodeSize,erodeSize)); + dilate(input,temp,kernel); + return temp; + } +}; +int main(int argc, char **argv){ + if(argc!=2){ + cout<<"Wait for an image"< > contours; + Mat inputMaze,gray,binary,dilation,erosion,imgDiff,BGRcomp[3],imgDiff_inv,output,red,green; + Morph mp; + inputMaze=imread(argv[1],CV_LOAD_IMAGE_COLOR); + cvtColor(inputMaze,gray,CV_BGR2GRAY); + threshold(gray,binary,127,255,CV_THRESH_BINARY_INV); + + findContours(binary,contours,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); + drawContours(binary, contours, 0, CV_RGB(255,255,255), CV_FILLED); + threshold(binary,binary,240,255,CV_THRESH_BINARY); + + dilation=mp.dilateImage(binary); + erosion=mp.erodeImage(dilation); + absdiff(dilation,erosion,imgDiff); + bitwise_not(imgDiff,imgDiff_inv); + split(inputMaze,BGRcomp); + namedWindow("diff",WINDOW_AUTOSIZE); + imshow("diff",imgDiff); + bitwise_and(BGRcomp[2],BGRcomp[2],red,imgDiff_inv); + bitwise_and(BGRcomp[1],BGRcomp[1],green,imgDiff_inv); + BGRcomp[2]=red.clone(); + BGRcomp[1]=green.clone(); + merge(BGRcomp,3,output); + namedWindow("SolvedMaze",WINDOW_AUTOSIZE); + imshow("SolvedMaze",output); + //imwrite("OutputMaze.jpg",output); + waitKey(0); + return 0; +} \ No newline at end of file diff --git "a/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/maze.py" "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/maze.py" new file mode 100644 index 00000000..07deb32f --- /dev/null +++ "b/my04-Maze-Solver\350\277\267\345\256\253\350\247\243\345\257\206/maze.py" @@ -0,0 +1,78 @@ + + +''' +源文件是使用opencv2.4, +改成opencv3.2有点问题。 +https://ishankgulati.github.io/posts/Maze-Solver/ +''' +import cv2 +import numpy as np + + + +img = cv2.imread('SampleImages/1.png') +# img = cv2.imread('SampleImages/2.png') +# img = cv2.imread('SampleImages/3.jpg')#不行,得修改 +# img = cv2.imread('SampleImages/huge_maze.jpg')#不行,得修改 +cv2.imshow('maze',img) +cv2.waitKey(0) + +# Binary conversion +gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)#反转tholdolding将给我们一个二进制的图像与白色的墙壁和黑色的背景。 +cv2.imshow('THRESH_BINARY_INV',thresh) +cv2.waitKey(0) + +# Contours +image,contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, + cv2.CHAIN_APPROX_NONE) +print('len(contours):',len(contours)) +# dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), -1) +dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), 5)#用不同颜色来标注 +dc=cv2.drawContours(dc, contours, 1, (0, 0, 0), 5)# TODO 大迷宫的len(contours): 26 +cv2.imshow('drawContours',dc) +cv2.waitKey(0) + +ret, thresh = cv2.threshold(dc, 240, 255, cv2.THRESH_BINARY) +# ret, thresh = cv2.threshold(thresh, 240, 255, cv2.THRESH_BINARY) +cv2.imshow('thresh2',thresh) +cv2.waitKey(0) + +# Dilate +''' +扩张 + +扩张是数学形态领域的两个基本操作者之一,另一个是侵蚀。它通常应用于二进制图像,但有一些版本可用于灰度图像。操作者对二进制图像的基本效果是逐渐扩大前景像素区域的边界(通常为白色像素)。因此,前景像素的面积大小增加,而这些区域内的孔变小。 +''' +ke = 10 +# kernel = np.ones((19, 19), np.uint8) +kernel = np.ones((ke, ke), np.uint8) +dilation = cv2.dilate(thresh, kernel, iterations=1) +cv2.imshow('dilation',dilation) +cv2.waitKey(0) + +# Erosion +#侵蚀是第二个形态运算符。它也适用于二进制图像。操作者对二进制图像的基本效果是消除前景像素区域的边界(通常为白色像素)。因此,前景像素的面积缩小,并且这些区域内的孔变大。 +erosion = cv2.erode(dilation, kernel, iterations=1) +cv2.imshow('erosion',erosion) +cv2.waitKey(0) + +#找到两个图像的差异 +diff = cv2.absdiff(dilation, erosion) +cv2.imshow('diff',diff) +cv2.waitKey(0) + +# splitting the channels of maze +b, g, r = cv2.split(img) +mask_inv = cv2.bitwise_not(diff) +#为了在原始迷宫图像上显示解决方案,首先将原来的迷宫分割成r,g,b组件。现在通过反转diff图像创建一个掩码。使用在最后一步中创建的掩码的原始迷宫的按位和r和g分量。这一步将从迷宫解决方案的图像部分去除红色和绿色成分。最后一个是合并所有组件,我们将使用蓝色标记的解决方案。 +# masking out the green and red colour from the solved path +r = cv2.bitwise_and(r, r, mask=mask_inv) +g = cv2.bitwise_and(g, g, mask=mask_inv) + +res = cv2.merge((b, g, r)) +cv2.imshow('Solved Maze', res) +cv2.imwrite('SampleImages/Solved-Maze-1.png',res) + +cv2.waitKey(0) +cv2.destroyAllWindows() diff --git "a/my05-\345\210\240\351\231\244\345\233\276\345\203\217\344\270\255\347\232\204\346\260\264\345\215\260/README.md" "b/my05-\345\210\240\351\231\244\345\233\276\345\203\217\344\270\255\347\232\204\346\260\264\345\215\260/README.md" new file mode 100644 index 00000000..117705b5 --- /dev/null +++ "b/my05-\345\210\240\351\231\244\345\233\276\345\203\217\344\270\255\347\232\204\346\260\264\345\215\260/README.md" @@ -0,0 +1 @@ +https://stackoverflow.com/questions/32125281/removing-watermark-out-of-an-image-using-opencv \ No newline at end of file diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/README.md" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/README.md" new file mode 100644 index 00000000..f1c89a0d --- /dev/null +++ "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/README.md" @@ -0,0 +1,44 @@ +- 参考 + - 原文:[How to break a CAPTCHA system in 15 minutes with Machine Learning](https://medium.com/@ageitgey/how-to-break-a-captcha-system-in-15-minutes-with-machine-learning-dbebb035a710) + - 源代码下载:https://s3-us-west-2.amazonaws.com/mlif-example-code/solving_captchas_code_examples.zip + - 翻译:[仅需15分钟,使用OpenCV+Keras轻松破解验证码](https://www.jiqizhixin.com/articles/2017-12-14-2) + +- 修改: + - 训练过程改为1次 + - 识别验证码,添加input中断循环 + + +### Before you get started + +To run these scripts, you need the following installed: + +1. Python 3 +2. OpenCV 3 w/ Python extensions + - I highly recommend these OpenCV installation guides: + https://www.pyimagesearch.com/opencv-tutorials-resources-guides/ +3. The python libraries listed in requirements.txt + - Try running "pip3 install -r requirements.txt" + +### Step 1: Extract single letters from CAPTCHA images + +Run: + +python3 extract_single_letters_from_captchas.py + +The results will be stored in the "extracted_letter_images" folder. + + +### Step 2: Train the neural network to recognize single letters + +Run: + +python3 train_model.py + +This will write out "captcha_model.hdf5" and "model_labels.dat" + + +### Step 3: Use the model to solve CAPTCHAs! + +Run: + +python3 solve_captchas_with_model.py \ No newline at end of file diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/captcha_model.hdf5" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/captcha_model.hdf5" new file mode 100644 index 00000000..707de108 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/captcha_model.hdf5" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/extract_single_letters_from_captchas.py" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/extract_single_letters_from_captchas.py" new file mode 100644 index 00000000..78f2530c --- /dev/null +++ "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/extract_single_letters_from_captchas.py" @@ -0,0 +1,92 @@ +import os +import os.path +import cv2 +import glob +import imutils + + +CAPTCHA_IMAGE_FOLDER = "generated_captcha_images" +OUTPUT_FOLDER = "extracted_letter_images" + + +# Get a list of all the captcha images we need to process +captcha_image_files = glob.glob(os.path.join(CAPTCHA_IMAGE_FOLDER, "*")) +counts = {} + +# loop over the image paths +for (i, captcha_image_file) in enumerate(captcha_image_files): + print("[INFO] processing image {}/{}".format(i + 1, len(captcha_image_files))) + + # Since the filename contains the captcha text (i.e. "2A2X.png" has the text "2A2X"), + # grab the base filename as the text + filename = os.path.basename(captcha_image_file) + captcha_correct_text = os.path.splitext(filename)[0] + + # Load the image and convert it to grayscale + image = cv2.imread(captcha_image_file) + gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + + # Add some extra padding around the image + gray = cv2.copyMakeBorder(gray, 8, 8, 8, 8, cv2.BORDER_REPLICATE) + + # threshold the image (convert it to pure black and white) + thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] + + # find the contours (continuous blobs of pixels) the image + contours = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + # Hack for compatibility with different OpenCV versions + contours = contours[0] if imutils.is_cv2() else contours[1] + + letter_image_regions = [] + + # Now we can loop through each of the four contours and extract the letter + # inside of each one + for contour in contours: + # Get the rectangle that contains the contour + (x, y, w, h) = cv2.boundingRect(contour) + + # Compare the width and height of the contour to detect letters that + # are conjoined into one chunk + if w / h > 1.25: + # This contour is too wide to be a single letter! + # Split it in half into two letter regions! + half_width = int(w / 2) + letter_image_regions.append((x, y, half_width, h)) + letter_image_regions.append((x + half_width, y, half_width, h)) + else: + # This is a normal letter by itself + letter_image_regions.append((x, y, w, h)) + + # If we found more or less than 4 letters in the captcha, our letter extraction + # didn't work correcly. Skip the image instead of saving bad training data! + if len(letter_image_regions) != 4: + continue + + # Sort the detected letter images based on the x coordinate to make sure + # we are processing them from left-to-right so we match the right image + # with the right letter + letter_image_regions = sorted(letter_image_regions, key=lambda x: x[0]) + + # Save out each letter as a single image + for letter_bounding_box, letter_text in zip(letter_image_regions, captcha_correct_text): + # Grab the coordinates of the letter in the image + x, y, w, h = letter_bounding_box + + # Extract the letter from the original image with a 2-pixel margin around the edge + letter_image = gray[y - 2:y + h + 2, x - 2:x + w + 2] + + # Get the folder to save the image in + save_path = os.path.join(OUTPUT_FOLDER, letter_text) + + # if the output directory does not exist, create it + if not os.path.exists(save_path): + os.makedirs(save_path) + + # write the letter image to a file + count = counts.get(letter_text, 1) + p = os.path.join(save_path, "{}.png".format(str(count).zfill(6))) + cv2.imwrite(p, letter_image) + + # increment the count for the current key + counts[letter_text] = count + 1 diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A2X.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A2X.png" new file mode 100644 index 00000000..2ace5244 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A2X.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A5R.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A5R.png" new file mode 100644 index 00000000..63b32dca Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A5R.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A5Z.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A5Z.png" new file mode 100644 index 00000000..07379468 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A5Z.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A98.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A98.png" new file mode 100644 index 00000000..56691028 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A98.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A9N.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A9N.png" new file mode 100644 index 00000000..61d57c54 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2A9N.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AD9.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AD9.png" new file mode 100644 index 00000000..2d9e7a5f Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AD9.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AEF.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AEF.png" new file mode 100644 index 00000000..bb40ea5b Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AEF.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2APC.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2APC.png" new file mode 100644 index 00000000..6fcccb6a Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2APC.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AQ7.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AQ7.png" new file mode 100644 index 00000000..ee9b8d71 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AQ7.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AX2.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AX2.png" new file mode 100644 index 00000000..78177278 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2AX2.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2B67.png" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2B67.png" new file mode 100644 index 00000000..b85a76df Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/generated_captcha_images/2B67.png" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/helpers.py" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/helpers.py" new file mode 100644 index 00000000..87a6d3a6 --- /dev/null +++ "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/helpers.py" @@ -0,0 +1,40 @@ +import imutils +import cv2 + + +def resize_to_fit(image, width, height): + """ + A helper function to resize an image to fit within a given size + :param image: image to resize + :param width: desired width in pixels + :param height: desired height in pixels + :return: the resized image + """ + + # grab the dimensions of the image, then initialize + # the padding values + (h, w) = image.shape[:2] + + # if the width is greater than the height then resize along + # the width + if w > h: + image = imutils.resize(image, width=width) + + # otherwise, the height is greater than the width so resize + # along the height + else: + image = imutils.resize(image, height=height) + + # determine the padding values for the width and height to + # obtain the target dimensions + padW = int((width - image.shape[1]) / 2.0) + padH = int((height - image.shape[0]) / 2.0) + + # pad the image then apply one more resizing to handle any + # rounding issues + image = cv2.copyMakeBorder(image, padH, padH, padW, padW, + cv2.BORDER_REPLICATE) + image = cv2.resize(image, (width, height)) + + # return the pre-processed image + return image \ No newline at end of file diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/model_labels.dat" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/model_labels.dat" new file mode 100644 index 00000000..3e611b93 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/model_labels.dat" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/requirements.txt" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/requirements.txt" new file mode 100644 index 00000000..7e8f0826 --- /dev/null +++ "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/requirements.txt" @@ -0,0 +1,7 @@ +numpy +imutils +sklearn +tensorflow +keras +h5py +opencv-contrib-python \ No newline at end of file diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/solve_captchas_with_model.py" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/solve_captchas_with_model.py" new file mode 100644 index 00000000..97a947bf --- /dev/null +++ "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/solve_captchas_with_model.py" @@ -0,0 +1,117 @@ +from keras.models import load_model +from helpers import resize_to_fit +from imutils import paths +import numpy as np +import imutils +import cv2 +import pickle + + +MODEL_FILENAME = "captcha_model.hdf5" +MODEL_LABELS_FILENAME = "model_labels.dat" +CAPTCHA_IMAGE_FOLDER = "generated_captcha_images" + + +# Load up the model labels (so we can translate model predictions to actual letters) +with open(MODEL_LABELS_FILENAME, "rb") as f: + lb = pickle.load(f) + +# Load the trained neural network +model = load_model(MODEL_FILENAME) + +# Grab some random CAPTCHA images to test against. +# In the real world, you'd replace this section with code to grab a real +# CAPTCHA image from a live website. +captcha_image_files = list(paths.list_images(CAPTCHA_IMAGE_FOLDER)) +captcha_image_files = np.random.choice(captcha_image_files, size=(10,), replace=False) + +# loop over the image paths +for image_file in captcha_image_files: + # Load the image and convert it to grayscale + image = cv2.imread(image_file) + image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + + # Add some extra padding around the image + image = cv2.copyMakeBorder(image, 20, 20, 20, 20, cv2.BORDER_REPLICATE) + + # threshold the image (convert it to pure black and white) + thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] + + # find the contours (continuous blobs of pixels) the image + contours = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + # Hack for compatibility with different OpenCV versions + contours = contours[0] if imutils.is_cv2() else contours[1] + + letter_image_regions = [] + + # Now we can loop through each of the four contours and extract the letter + # inside of each one + for contour in contours: + # Get the rectangle that contains the contour + (x, y, w, h) = cv2.boundingRect(contour) + + # Compare the width and height of the contour to detect letters that + # are conjoined into one chunk + if w / h > 1.25: + # This contour is too wide to be a single letter! + # Split it in half into two letter regions! + half_width = int(w / 2) + letter_image_regions.append((x, y, half_width, h)) + letter_image_regions.append((x + half_width, y, half_width, h)) + else: + # This is a normal letter by itself + letter_image_regions.append((x, y, w, h)) + + # If we found more or less than 4 letters in the captcha, our letter extraction + # didn't work correcly. Skip the image instead of saving bad training data! + if len(letter_image_regions) != 4: + continue + + # Sort the detected letter images based on the x coordinate to make sure + # we are processing them from left-to-right so we match the right image + # with the right letter + letter_image_regions = sorted(letter_image_regions, key=lambda x: x[0]) + + # Create an output image and a list to hold our predicted letters + output = cv2.merge([image] * 3) + predictions = [] + + # loop over the lektters + for letter_bounding_box in letter_image_regions: + # Grab the coordinates of the letter in the image + x, y, w, h = letter_bounding_box + + # Extract the letter from the original image with a 2-pixel margin around the edge + letter_image = image[y - 2:y + h + 2, x - 2:x + w + 2] + + # Re-size the letter image to 20x20 pixels to match training data + letter_image = resize_to_fit(letter_image, 20, 20) + + # Turn the single image into a 4d list of images to make Keras happy + letter_image = np.expand_dims(letter_image, axis=2) + letter_image = np.expand_dims(letter_image, axis=0) + + # Ask the neural network to make a prediction + prediction = model.predict(letter_image) + + # Convert the one-hot-encoded prediction back to a normal letter + letter = lb.inverse_transform(prediction)[0] + predictions.append(letter) + + # draw the prediction on the output image + cv2.rectangle(output, (x - 2, y - 2), (x + w + 4, y + h + 4), (0, 255, 0), 1) + cv2.putText(output, letter, (x - 5, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 255, 0), 2) + + # Print the captcha's text + captcha_text = "".join(predictions) + print("CAPTCHA text is: {}".format(captcha_text)) + + # Show the annotated image + cv2.imshow("Output", output) + # cv2.waitKey(delay=10000) + + key = cv2.waitKey(delay=1000) + if key == ord("q"): + break + input('Next?') \ No newline at end of file diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/train_model.py" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/train_model.py" new file mode 100644 index 00000000..1fb9040e --- /dev/null +++ "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/solving_captchas_code_examples/train_model.py" @@ -0,0 +1,86 @@ +import cv2 +import pickle +import os.path +import numpy as np +from imutils import paths +from sklearn.preprocessing import LabelBinarizer +from sklearn.model_selection import train_test_split +from keras.models import Sequential +from keras.layers.convolutional import Conv2D, MaxPooling2D +from keras.layers.core import Flatten, Dense +from helpers import resize_to_fit + + +LETTER_IMAGES_FOLDER = "extracted_letter_images" +MODEL_FILENAME = "captcha_model.hdf5" +MODEL_LABELS_FILENAME = "model_labels.dat" + + +# initialize the data and labels +data = [] +labels = [] + +# loop over the input images +for image_file in paths.list_images(LETTER_IMAGES_FOLDER): + # Load the image and convert it to grayscale + image = cv2.imread(image_file) + image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + + # Resize the letter so it fits in a 20x20 pixel box + image = resize_to_fit(image, 20, 20) + + # Add a third channel dimension to the image to make Keras happy + image = np.expand_dims(image, axis=2) + + # Grab the name of the letter based on the folder it was in + label = image_file.split(os.path.sep)[-2] + + # Add the letter image and it's label to our training data + data.append(image) + labels.append(label) + + +# scale the raw pixel intensities to the range [0, 1] (this improves training) +data = np.array(data, dtype="float") / 255.0 +labels = np.array(labels) + +# Split the training data into separate train and test sets +(X_train, X_test, Y_train, Y_test) = train_test_split(data, labels, test_size=0.25, random_state=0) + +# Convert the labels (letters) into one-hot encodings that Keras can work with +lb = LabelBinarizer().fit(Y_train) +Y_train = lb.transform(Y_train) +Y_test = lb.transform(Y_test) + +# Save the mapping from labels to one-hot encodings. +# We'll need this later when we use the model to decode what it's predictions mean +with open(MODEL_LABELS_FILENAME, "wb") as f: + pickle.dump(lb, f) + +# Build the neural network! +model = Sequential() + +# First convolutional layer with max pooling +model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu")) +model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) + +# Second convolutional layer with max pooling +model.add(Conv2D(50, (5, 5), padding="same", activation="relu")) +model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) + +# Hidden layer with 500 nodes +model.add(Flatten()) +model.add(Dense(500, activation="relu")) + +# Output layer with 32 nodes (one for each possible letter/number we predict) +model.add(Dense(32, activation="softmax")) + +# Ask Keras to build the TensorFlow model behind the scenes +model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) + +# Train the neural network +# model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10, verbose=1) +model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=1, verbose=1) + +# Save the trained model to disk +model.save(MODEL_FILENAME) diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/README.md" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/README.md" new file mode 100644 index 00000000..a8fb8102 --- /dev/null +++ "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/README.md" @@ -0,0 +1,4 @@ +# 官网http://www.bjsuperpass.com/ + +验证码 +http://www.bjsuperpass.com/captcha.svl?d=1503144107405 \ No newline at end of file diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/captcha.jpg" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/captcha.jpg" new file mode 100644 index 00000000..5412f287 Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/captcha.jpg" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/captcha1.jpeg" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/captcha1.jpeg" new file mode 100644 index 00000000..579a8e9e Binary files /dev/null and "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/captcha1.jpeg" differ diff --git "a/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/\350\216\267\345\217\226\351\252\214\350\257\201\347\240\201-\347\204\266\345\220\216\350\257\206\345\210\253.py" "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/\350\216\267\345\217\226\351\252\214\350\257\201\347\240\201-\347\204\266\345\220\216\350\257\206\345\210\253.py" new file mode 100644 index 00000000..a4b6b40a --- /dev/null +++ "b/my06-\351\252\214\350\257\201\347\240\201\350\257\206\345\210\253/\344\275\277\347\224\250Tessract-OCR\350\257\206\345\210\253\351\252\214\350\257\201\347\240\201/\345\214\227\344\272\254\345\205\254\344\272\244\344\270\200\345\215\241\351\200\232_\351\252\214\350\257\201\347\240\201/\350\216\267\345\217\226\351\252\214\350\257\201\347\240\201-\347\204\266\345\220\216\350\257\206\345\210\253.py" @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/8/21 13:26 +# @Author : play4fun +# @File : 获取验证码-然后识别.py +# @Software: PyCharm + +""" +获取验证码-然后识别.py: +""" + +from io import BytesIO +from PIL import Image +import requests +from tesserocr import PyTessBaseAPI +import tesserocr +import numpy as np +import cv2 + + +user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36' +headers = {'User-Agent': user_agent} + + +url = 'http://www.bjsuperpass.com/captcha.svl?d=1503144107405' +rs = requests.get(url, headers=headers, timeout=10) +print('获取公交一卡通网站的验证码',rs.status_code) +#TODO 获取cookies + + +print('用BytesIO导入到Image,Numpy,Opencv') +s1 = BytesIO(rs.content) # img = Image.open(BytesIO(resp.read())) +# +img = Image.open(s1) +img = img.convert("RGB") +im=np.array(img) +cv2.imshow('src',im) +cv2.waitKey(0) +cv2.imwrite('captcha.jpg',im) + + +ocr = PyTessBaseAPI() +# ocr.Init(".", "eng", tesseract.OEM_DEFAULT) +ocr.SetVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyz") +# ocr.SetPageSegMode(tesseract.PSM_AUTO) +# ocr.SetImage(img) + +print('验证码是',tesserocr.image_to_text(img)) +#TODO 发送cookies \ No newline at end of file diff --git a/my07-GPU-CUDA/cuda.md b/my07-GPU-CUDA/cuda.md new file mode 100644 index 00000000..692039a9 --- /dev/null +++ b/my07-GPU-CUDA/cuda.md @@ -0,0 +1,26 @@ +#CUDA +https://opencv.org/platforms/cuda.html +- 动机 + - 现代GPU加速器已经变得强大并且足够有能力执行通用计算(GPGPU)。这是一个非常快速增长的领域,引起了开发计算密集型应用的科学家,研究人员和工程师的广泛兴趣。尽管在GPU上重新实现算法有困难,但许多人正在检查它们的速度。为了支持这种努力,已经有许多高级语言和工具可用,例如CUDA,OpenCL,C ++ AMP,调试器,分析器等等。 + - 计算机视觉的重要组成部分是图像处理,图形加速器最初设计的领域。其他部分也假设大规模的并行计算,并且往往自然映射到GPU架构。所以,在图形处理器上实现所有这些优势并加速OpenCV是具有挑战性但非常有益的。 + +- 历史 + - OpenCV包含GPU模块,其中包含所有GPU加速的东西。在NVIDIA的支持下,该模块在2010年的第一个版本之前于2010年开始运行。它包括加速代码库的一部分,仍然在不断增长,正在适应新的计算技术和GPU架构。 + +- 目标 + - 在GPU上为开发人员提供方便的计算机视觉框架,保持与当前CPU功能的概念一致性。 + - 通过GPU实现最佳性能(针对现代体系结构优化的高效内核,优化的数据流如异步执行,复制重叠,零拷贝) + - 完整性(实现尽可能多,即使加速并不是太棒了;这样可以完全在GPU上运行算法,节省应付开销) + +- 性能 + - 特斯拉C2050与Core i5-760 2.8Ghz,SSE,TBB +![](https://opencv.org/assets/pages/perf.png) + - 条形图:不同算法的加速: + - 原始图像处理 - 30倍,立体视觉 - 7倍,行人检测 - 8倍,人脸检测器 - 6倍,SURF关键点 - 12倍 + +- 设计注意事项 + - OpenCV GPU模块是使用CUDA编写的,因此它受益于CUDA生态系统。有一个大型的社区,会议,出版物,开发的许多工具和库,如NVIDIA NPP,CUFFT,Thrust。 + + - GPU模块被设计为主机API扩展。这种设计为用户提供了一个明确的控制,即在CPU和GPU内存之间如何移动数据。尽管用户必须编写一些额外的代码才能开始使用GPU,但这种方法既灵活又有效,可以进行更高效的计算。 + + - GPU模块包括cv :: gpu :: GpuMat类,它是保存在GPU内存中的数据的主要容器。它的接口与cv :: Mat非常相似,与CPU相对应。所有GPU函数接收GpuMat作为输入和输出参数。这允许调用几个GPU算法而不下载数据。在可能的情况下,GPU模块API接口也与CPU接口保持相似。因此熟悉CPU上Opencv的开发人员可以立即开始使用GPU。 \ No newline at end of file diff --git "a/my07-GPU-CUDA/\344\275\277\347\224\250CUDA\350\277\233\350\241\214GPU\345\212\240\351\200\237.md" "b/my07-GPU-CUDA/\344\275\277\347\224\250CUDA\350\277\233\350\241\214GPU\345\212\240\351\200\237.md" new file mode 100644 index 00000000..de0e079f --- /dev/null +++ "b/my07-GPU-CUDA/\344\275\277\347\224\250CUDA\350\277\233\350\241\214GPU\345\212\240\351\200\237.md" @@ -0,0 +1,60 @@ +# 使用CUDA进行GPU加速 + +- 参考 + - [Compiling OpenCV with CUDA support](https://www.pyimagesearch.com/2016/07/11/compiling-opencv-with-cuda-support/) + - [CUDA文档](https://opencv.org/platforms/cuda.html) + +- 验证安装 +```python +import cv2 +print(cv2.getBuildInformation()) +#Use Cuda: YES (ver 8.0) +#表示成功 +``` +- 代码sample +```bash +nvidia@gpu:/usr/share/OpenCV/samples/gpu$ ls +alpha_comp.cpp hog.cpp pyrlk_optical_flow.cpp +bgfg_segm.cpp houghlines.cpp stereo_match.cpp +cascadeclassifier.cpp morphology.cpp stereo_multi.cpp +cascadeclassifier_nvidia_api.cpp multi.cpp super_resolution.cpp +driver_api_multi.cpp opengl.cpp surf_keypoint_matcher.cpp +driver_api_stereo_multi.cpp optical_flow.cpp video_reader.cpp +farneback_optical_flow.cpp opticalflow_nvidia_api.cpp video_writer.cpp +generalized_hough.cpp performance + +``` +- 代码C++ +```cython +#include +#include "opencv2/opencv.hpp" +#include "opencv2/gpu/gpu.hpp" +using namespace std; +using namespace cv; +using namespace cv::gpu; + +int main (int argc, char* argv[]) +{ + try + { + cv::Mat src_host = cv::imread("file.png", CV_LOAD_IMAGE_GRAYSCALE); + cv::gpu::GpuMat dst, src; + src.upload(src_host); + + cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY); + + cv::Mat result_host; + dst.download(result_host); + + cv::imshow("Result", result_host); + cv::waitKey(); + } + catch(const cv::Exception& ex) + { + std::cout << "Error: " << ex.what() << std::endl; + } + return 0; +} +``` +- 编译 + - 失败:g++ `pkg-config --cflags --libs opencv` -lopencv_gpu cuda_test.cpp -o cuda_test \ No newline at end of file diff --git "a/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/compare_photos.py" "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/compare_photos.py" new file mode 100644 index 00000000..14199e4a --- /dev/null +++ "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/compare_photos.py" @@ -0,0 +1,248 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/3/13 08:30 +# @Author : play4fun +# @File : compare_photos.py +# @Software: PyCharm + +""" +compare_photos.py: +""" + +import cv2, pickle +from pprint import pprint + +with open('photo_mat', 'rb') as f: + mat = pickle.load(f) + +pairs = [] # 配对好的 +lenX = 9 # 行 +lenY = 8 # 列 + + +def get_image_difference(image_1, image_2): # 这个函数不行 + first_image_hist = cv2.calcHist([image_1], [0], None, [256], [0, 256]) + second_image_hist = cv2.calcHist([image_2], [0], None, [256], [0, 256]) + + img_hist_diff = cv2.compareHist(first_image_hist, second_image_hist, cv2.HISTCMP_BHATTACHARYYA) + img_template_probability_match = cv2.matchTemplate(first_image_hist, second_image_hist, cv2.TM_CCOEFF_NORMED)[0][0] + img_template_diff = 1 - img_template_probability_match + + # taking only 10% of histogram diff, since it's less accurate than template method + commutative_image_diff = (img_hist_diff / 10) + img_template_diff + return commutative_image_diff + + +def compare(i, j, img): + for x in range(lenX): + if x < i: + continue + for y in range(lenY): + if x <= i and y < j: + continue + z = mat[x][y] + # 图片相似度 + y1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + z1 = cv2.cvtColor(z, cv2.COLOR_BGR2GRAY) + # image_difference = get_image_difference(y1, z1) + res = cv2.matchTemplate(z1, y1, cv2.TM_CCOEFF_NORMED) + # print(i, j, x, y, image_difference) + print(i, j, x, y, res) + # if abs(image_difference-1)>0.5: + # if image_difference < 0.1: + # pairs.append((i, j, x, y, image_difference)) + if res[0][0] >= 0.8 :#and (i != x and j != y): # 0.9较好 + if i ==x and j ==y: + continue + pairs.append((i, j, x, y, res[0][0])) + print('--------') + + +for i, x in enumerate(mat): + for j, y in enumerate(x): + compare(i, j, y) + +print('--------',len(pairs)) +pprint(pairs)#156对 #有问题 +''' +[(0, 0, 0, 4, 0.81783479), + (0, 0, 1, 0, 0.82939386), + (0, 0, 1, 5, 0.80112994), + (0, 0, 2, 4, 0.81963593), + (0, 0, 2, 5, 0.80141765), + (0, 0, 3, 2, 0.83176291), + (0, 0, 5, 1, 0.82441366), + (0, 0, 5, 3, 0.93773538), + (0, 0, 6, 0, 0.80839384), + (0, 0, 7, 3, 0.80357623), + (0, 1, 4, 6, 0.84010893), + (0, 2, 4, 5, 0.89919138), + (0, 2, 5, 5, 0.89656675), + (0, 2, 6, 2, 0.87691551), + (0, 3, 2, 6, 0.94418496), + (0, 3, 3, 4, 0.97784418), + (0, 3, 5, 6, 0.91531861), + (0, 3, 7, 4, 0.90034771), + (0, 3, 8, 7, 0.8669098), + (0, 4, 1, 0, 0.95897603), + (0, 4, 1, 5, 0.9859665), + (0, 4, 2, 3, 0.84755546), + (0, 4, 2, 4, 0.98988521), + (0, 4, 2, 5, 0.97593749), + (0, 4, 3, 2, 0.96898985), + (0, 4, 5, 1, 0.93505126), + (0, 4, 5, 7, 0.92510819), + (0, 4, 6, 0, 0.88995898), + (0, 4, 7, 3, 0.91428041), + (0, 5, 2, 0, 0.90362453), + (0, 5, 2, 1, 0.93313634), + (0, 5, 6, 4, 0.88912612), + (0, 7, 2, 7, 0.98162633), + (0, 7, 3, 0, 0.84628779), + (0, 7, 6, 7, 0.85053468), + (1, 0, 1, 5, 0.93375051), + (1, 0, 2, 3, 0.80927575), + (1, 0, 2, 4, 0.95577663), + (1, 0, 2, 5, 0.93438679), + (1, 0, 3, 2, 0.98244762), + (1, 0, 5, 1, 0.95950162), + (1, 0, 5, 7, 0.9012484), + (1, 0, 6, 0, 0.93606734), + (1, 0, 7, 0, 0.81604606), + (1, 0, 7, 3, 0.91213149), + (1, 1, 7, 1, 0.8624481), + (1, 2, 1, 7, 0.94927907), + (1, 2, 4, 3, 0.97030866), + (1, 2, 6, 6, 0.89334244), + (1, 3, 7, 5, 0.90350145), + (1, 4, 3, 5, 0.92840946), + (1, 4, 3, 6, 0.92976296), + (1, 4, 8, 1, 0.87637573), + (1, 4, 8, 5, 0.86086744), + (1, 5, 2, 3, 0.83290088), + (1, 5, 2, 4, 0.98093969), + (1, 5, 2, 5, 0.9865284), + (1, 5, 3, 2, 0.95161527), + (1, 5, 5, 1, 0.91846502), + (1, 5, 5, 7, 0.93449652), + (1, 5, 6, 0, 0.87814039), + (1, 5, 7, 3, 0.91769367), + (1, 6, 3, 3, 0.87408149), + (1, 6, 4, 7, 0.83912045), + (1, 7, 4, 3, 0.93324989), + (1, 7, 6, 6, 0.90282589), + (2, 0, 2, 1, 0.98332465), + (2, 0, 6, 4, 0.89946473), + (2, 1, 6, 4, 0.91386253), + (2, 2, 4, 0, 0.97106832), + (2, 3, 2, 4, 0.85241109), + (2, 3, 2, 5, 0.84527677), + (2, 3, 3, 2, 0.83583575), + (2, 3, 3, 4, 0.80124199), + (2, 3, 5, 1, 0.81944293), + (2, 3, 5, 7, 0.819251), + (2, 3, 7, 0, 0.91440505), + (2, 3, 7, 3, 0.80969107), + (2, 4, 2, 5, 0.9853642), + (2, 4, 3, 2, 0.98278183), + (2, 4, 5, 1, 0.96176714), + (2, 4, 5, 3, 0.81060904), + (2, 4, 5, 7, 0.95080549), + (2, 4, 6, 0, 0.92093289), + (2, 4, 7, 0, 0.82010585), + (2, 4, 7, 3, 0.94900286), + (2, 5, 3, 2, 0.96413034), + (2, 5, 5, 1, 0.93163985), + (2, 5, 5, 3, 0.80133277), + (2, 5, 5, 7, 0.95228308), + (2, 5, 6, 0, 0.89228898), + (2, 5, 7, 0, 0.80005699), + (2, 5, 7, 3, 0.93504852), + (2, 6, 3, 4, 0.9634583), + (2, 6, 5, 6, 0.97281444), + (2, 6, 7, 4, 0.90955776), + (2, 6, 8, 6, 0.81169814), + (2, 6, 8, 7, 0.87542808), + (2, 7, 3, 0, 0.86373925), + (2, 7, 6, 7, 0.90865624), + (3, 0, 6, 7, 0.80371922), + (3, 1, 3, 7, 0.89857602), + (3, 2, 5, 1, 0.98385006), + (3, 2, 5, 3, 0.80837327), + (3, 2, 5, 7, 0.94026983), + (3, 2, 6, 0, 0.95155406), + (3, 2, 7, 0, 0.83519346), + (3, 2, 7, 3, 0.95594138), + (3, 3, 4, 7, 0.81548607), + (3, 3, 8, 4, 0.88165134), + (3, 4, 5, 6, 0.96190572), + (3, 4, 7, 4, 0.95597637), + (3, 4, 8, 7, 0.90763825), + (3, 5, 3, 6, 0.96791953), + (3, 5, 7, 7, 0.81160647), + (3, 5, 8, 5, 0.88941646), + (3, 6, 7, 7, 0.8219896), + (3, 6, 8, 1, 0.80933893), + (3, 6, 8, 5, 0.92017508), + (4, 1, 6, 5, 0.8459152), + (4, 1, 7, 2, 0.95110172), + (4, 2, 6, 1, 0.95789027), + (4, 3, 6, 6, 0.95759535), + (4, 4, 5, 1, 0.80212337), + (4, 4, 7, 3, 0.80778289), + (4, 4, 8, 2, 0.92399627), + (4, 5, 5, 5, 0.98698038), + (4, 5, 6, 2, 0.91531587), + (5, 0, 5, 4, 0.95705253), + (5, 1, 5, 3, 0.81610906), + (5, 1, 5, 7, 0.93452507), + (5, 1, 6, 0, 0.98169124), + (5, 1, 7, 0, 0.84997863), + (5, 1, 7, 3, 0.97735828), + (5, 2, 8, 3, 0.96606308), + (5, 3, 5, 7, 0.80398655), + (5, 3, 6, 0, 0.80013829), + (5, 3, 7, 3, 0.82962543), + (5, 5, 6, 2, 0.91919237), + (5, 6, 7, 4, 0.96237701), + (5, 6, 7, 6, 0.80884886), + (5, 6, 8, 6, 0.80175209), + (5, 6, 8, 7, 0.92764288), + (5, 7, 6, 0, 0.90893477), + (5, 7, 7, 0, 0.82358778), + (5, 7, 7, 3, 0.94626212), + (6, 0, 7, 0, 0.85159588), + (6, 0, 7, 3, 0.96886152), + (6, 3, 8, 0, 0.94173014), + (6, 5, 7, 2, 0.90841216), + (7, 0, 7, 3, 0.84417427), + (7, 4, 8, 7, 0.93397516), + (7, 6, 8, 6, 0.96749038), + (7, 7, 8, 1, 0.80834168), + (7, 7, 8, 5, 0.84336907), + (8, 1, 8, 5, 0.89013624)] +''' + +''' +#Test +# 1, 0, 1, 5 +a = mat[1][0] +b = mat[1][5] +y1 = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY) +z1 = cv2.cvtColor(b, cv2.COLOR_BGR2GRAY) +# image_difference = get_image_difference(y1, z1) +res = cv2.matchTemplate(z1, y1, cv2.TM_CCOEFF_NORMED) +print(1, 0, 1, 5, res) +''' + + +def compare_2(x1, y1, x2, y2): + a = mat[x1][y1] + b = mat[x2][y2] + c1 = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY) + c2 = cv2.cvtColor(b, cv2.COLOR_BGR2GRAY) + # image_difference = get_image_difference(y1, z1) + res = cv2.matchTemplate(c2, c1, cv2.TM_CCOEFF_NORMED) + print(x1, y1, x2, y2, res) + + +# compare_2(2, 0, 2, 1) diff --git "a/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lian-1.py" "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lian-1.py" new file mode 100644 index 00000000..4f0d971a --- /dev/null +++ "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lian-1.py" @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/3/9 10:52 +# @Author : play4fun +# @File : lian-1.py +# @Software: PyCharm + +""" +lian-1.py:切割图片 +""" + +import cv2 + +filename = 'lianliankan2.png' +img = cv2.imread(filename, cv2.IMREAD_UNCHANGED) + +size = img.shape +print('size:', size) # (627, 554, 3) +width = size[1] +height = size[0] + +cv2.imshow('src', img) +cv2.waitKey(0) + +# 分割,9行627,8列554 +x1 = 0 +y1 = 0 +xp = int(height / 9) +yp = int(width / 8) +mat=[] +for x2 in range(xp, height, xp): + pl=[] + for y2 in range(yp, width, yp): + cut = img[x1:x2, y1:y2] + cv2.imshow('cut', cut) + cv2.waitKey(10) + + y1 = y2 + # + pl.append(cut) + cv2.waitKey(100) + y1 = 0 + x1 = x2 + # + mat.append(pl) + +cv2.waitKey(0) +cv2.destroyAllWindows() + +# +import pickle +with open('photo_mat','wb') as f: + pickle.dump(mat,f) \ No newline at end of file diff --git "a/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lianliankan1.png" "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lianliankan1.png" new file mode 100644 index 00000000..ba05117c Binary files /dev/null and "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lianliankan1.png" differ diff --git "a/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lianliankan2.png" "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lianliankan2.png" new file mode 100644 index 00000000..d721ce98 Binary files /dev/null and "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/lianliankan2.png" differ diff --git "a/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/photo_mat" "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/photo_mat" new file mode 100644 index 00000000..167c4222 Binary files /dev/null and "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/photo_mat" differ diff --git "a/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/readme.md" "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/readme.md" new file mode 100644 index 00000000..b122989a --- /dev/null +++ "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/readme.md" @@ -0,0 +1,22 @@ +## 连连看 + +- 图片来源 + - iOS app:果蔬连连看 +- 百科:https://zh.wikipedia.org/zh-hans/%E8%BF%9E%E8%BF%9E%E7%9C%8B + +- 切割图片 + - 然后,逐个对比,相似度 + - 记录索引 +- 几乘几的矩阵 +- 模式识别 + + +- 连连看规则 + - 只有内容相同的图片才有消除的可能 + - 每次只能消除两张图片,消除时需要使用鼠标指定(即连接) + - 两张图片连接时所经过的路径(连接路径)不能超过两个拐点 + - 连接路径经过的单元格所包含的图片必须已经消除 + + +- 先后顺序 + - 逐个消除 \ No newline at end of file diff --git "a/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/show_photos.py" "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/show_photos.py" new file mode 100644 index 00000000..7c08c1d8 --- /dev/null +++ "b/my08-opencv\347\216\251\346\270\270\346\210\217game/\350\277\236\350\277\236\347\234\213/show_photos.py" @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# @Time : 2018/3/13 08:26 +# @Author : play4fun +# @File : show_photos.py +# @Software: PyCharm + +""" +show_photos.py: +""" + +import cv2,pickle + +with open('photo_mat','rb') as f: + mat=pickle.load(f) + +for x in mat: + for y in x: + cv2.imshow('mat',y) + cv2.waitKey(10) + cv2.waitKey(100) \ No newline at end of file diff --git "a/my09-\345\233\276\347\211\207\345\261\225\347\244\272/NOTE.md" "b/my09-\345\233\276\347\211\207\345\261\225\347\244\272/NOTE.md" new file mode 100644 index 00000000..d037c374 --- /dev/null +++ "b/my09-\345\233\276\347\211\207\345\261\225\347\244\272/NOTE.md" @@ -0,0 +1,5 @@ + + +- 参考 + - [Creating a face detection API with Python and OpenCV (in just 5 minutes)](https://www.pyimagesearch.com/2015/05/11/creating-a-face-detection-api-with-python-and-opencv-in-just-5-minutes/) + - [How to stream opencv frame with django frame in realtime?](https://stackoverflow.com/questions/45906482/how-to-stream-opencv-frame-with-django-frame-in-realtime) \ No newline at end of file diff --git "a/my09-\345\233\276\347\211\207\345\261\225\347\244\272/cv_html.png" "b/my09-\345\233\276\347\211\207\345\261\225\347\244\272/cv_html.png" new file mode 100644 index 00000000..31fbf25a Binary files /dev/null and "b/my09-\345\233\276\347\211\207\345\261\225\347\244\272/cv_html.png" differ diff --git "a/my09-\345\233\276\347\211\207\345\261\225\347\244\272/display_image.jpg" "b/my09-\345\233\276\347\211\207\345\261\225\347\244\272/display_image.jpg" new file mode 100644 index 00000000..2bbd5966 Binary files /dev/null and "b/my09-\345\233\276\347\211\207\345\261\225\347\244\272/display_image.jpg" differ diff --git "a/my09-\345\233\276\347\211\207\345\261\225\347\244\272/\345\234\250Django\351\207\214\345\261\225\347\244\272\345\233\276\347\211\207.md" "b/my09-\345\233\276\347\211\207\345\261\225\347\244\272/\345\234\250Django\351\207\214\345\261\225\347\244\272\345\233\276\347\211\207.md" new file mode 100644 index 00000000..7c0cccb0 --- /dev/null +++ "b/my09-\345\233\276\347\211\207\345\261\225\347\244\272/\345\234\250Django\351\207\214\345\261\225\347\244\272\345\233\276\347\211\207.md" @@ -0,0 +1,40 @@ +## 在Django里展示图片 + +- 定义路径 +```python +from django.conf.urls import url + +from .views import cvtest + + +urlpatterns = { + url(r'^display_image$', cvtest.display_image, name='display_image'), + +} + +``` + +- 编写视图 +```python +from django.http import HttpResponse +import cv2 + + +def display_image(request): + fn = '/Users/play/Desktop/114311.jpg' + img = cv2.imread(fn) + img[:, :, 2] = 0 # 对图片进行处理 + ret, jpeg = cv2.imencode('.jpg', img) + return HttpResponse(jpeg.tostring(), content_type="multipart/x-mixed-replace") + +``` +- 在浏览器里访问 + - http://0.0.0.0:8000/test/display_image + - ![display_image](display_image.jpg "display_image") + +- 在网页里引用 + - ![display_image](cv_html.png "display_image") +```html + +``` + \ No newline at end of file diff --git "a/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/QR_Scaner1.py" "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/QR_Scaner1.py" new file mode 100644 index 00000000..0302b65b --- /dev/null +++ "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/QR_Scaner1.py" @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +# @Time : 2018-12-31 18:35 +# @Author : play4fun +# @File : QR_Scaner1.py +# @Software: PyCharm + +""" +QR_Scaner1.py: +""" + +from pyzbar.pyzbar import decode +# from PIL import Image +import cv2 + + +def main(): + fp = 'macbookPro.jpg' + # image = Image.open(fp) + # image.show() + image = cv2.imread(fp) + barcodes = decode(image) + decoded = barcodes[0] + print(decoded) + # + url: bytes = decoded.data + url = url.decode() + print(url) + # rect + rect = decoded.rect + print(rect) # Rect(left=19, top=19, width=292, height=292) + + # loop over the detected barcodes + for barcode in barcodes: + # extract the bounding box location of the barcode and draw the + # bounding box surrounding the barcode on the image + (x, y, w, h) = barcode.rect + cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2) + + # the barcode data is a bytes object so if we want to draw it on + # our output image we need to convert it to a string first + barcodeData = barcode.data.decode("utf-8") + barcodeType = barcode.type + + # draw the barcode data and barcode type on the image + text = "{} ({})".format(barcodeData, barcodeType) + cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, + 0.5, (0, 0, 255), 2) + + # print the barcode type and data to the terminal + print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData)) + + # show the output image + cv2.imshow("Image", image) + # cv2.imwrite('macbook_qr_rect.jpg', image) + cv2.waitKey(0) # 按任意键退出 + + +if __name__ == '__main__': + main() diff --git "a/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/macbookPro.jpg" "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/macbookPro.jpg" new file mode 100644 index 00000000..1c5af4f7 Binary files /dev/null and "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/macbookPro.jpg" differ diff --git "a/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/macbook_qr_rect.jpg" "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/macbook_qr_rect.jpg" new file mode 100644 index 00000000..894b7ddf Binary files /dev/null and "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/macbook_qr_rect.jpg" differ diff --git "a/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/\345\210\233\345\273\272\344\272\214\347\273\264\347\240\201.md" "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/\345\210\233\345\273\272\344\272\214\347\273\264\347\240\201.md" new file mode 100644 index 00000000..0a763b89 --- /dev/null +++ "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/\345\210\233\345\273\272\344\272\214\347\273\264\347\240\201.md" @@ -0,0 +1,24 @@ + +# 创建二维码 + +- 参考 + - https://github.com/lincolnloop/python-qrcode + - [使用Python的库qrcode生成二维码](https://www.jianshu.com/p/b4b14e314b2a) + +- 安装 + - pip install qrcode[pil] + +- 创建 +```python +import qrcode + +url='https://item.jd.com/7842699.html' +img = qrcode.make(url, border=6) +img.save('macbookPro.jpg') + +``` + +- +```bash +qr 'Some data' > test.png +``` \ No newline at end of file diff --git "a/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201.md" "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201.md" new file mode 100644 index 00000000..c1418352 --- /dev/null +++ "b/my10-\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201/\350\257\206\345\210\253\344\272\214\347\273\264\347\240\201.md" @@ -0,0 +1,18 @@ +## my10-识别二维码 + +- 参考 + - https://github.com/NaturalHistoryMuseum/pyzbar + - [用ZBar做OpenCV识别器-条形码+二维码](https://www.pyimagesearch.com/2018/05/21/an-opencv-barcode-and-qr-code-scanner-with-zbar/) + - [zbar和zxing之间的对比](https://blog.csdn.net/halaoda/article/details/78185719) + +- 安装 + - 安装 ZBar + - Ubuntu + - sudo apt-get install libzbar0 + - macOS Mojave + - brew install zbar + - pip install pyzbar + +- 用途 + - 机器人定位 + - 智能小车,树莓派-摄像头 \ No newline at end of file diff --git "a/\345\217\202\350\200\203\345\233\276\344\271\246Books.md" "b/\345\217\202\350\200\203\345\233\276\344\271\246Books.md" new file mode 100644 index 00000000..ff93e3c9 --- /dev/null +++ "b/\345\217\202\350\200\203\345\233\276\344\271\246Books.md" @@ -0,0 +1,4 @@ +- 参考图书Books + +- [OpenCV Computer Vision with Python](https://e.jd.com/30371482.html) + - 包含Kinect深度相机OpenNI的教程 \ No newline at end of file diff --git "a/\345\256\230\346\226\271samples/CMakeLists.txt" "b/\345\256\230\346\226\271samples/CMakeLists.txt" new file mode 100644 index 00000000..31c2bd18 --- /dev/null +++ "b/\345\256\230\346\226\271samples/CMakeLists.txt" @@ -0,0 +1,6 @@ +if(INSTALL_PYTHON_EXAMPLES) + file(GLOB install_list *.py ) + install(FILES ${install_list} + DESTINATION ${OPENCV_SAMPLES_SRC_INSTALL_PATH}/python + PERMISSIONS OWNER_READ GROUP_READ WORLD_READ COMPONENT samples) +endif() diff --git "a/\345\256\230\346\226\271samples/README.md" "b/\345\256\230\346\226\271samples/README.md" new file mode 100644 index 00000000..04c33674 --- /dev/null +++ "b/\345\256\230\346\226\271samples/README.md" @@ -0,0 +1 @@ +这个,你们有空可以玩一玩,调试一下。 \ No newline at end of file diff --git "a/\345\256\230\346\226\271samples/_coverage.py" "b/\345\256\230\346\226\271samples/_coverage.py" new file mode 100755 index 00000000..5ec3e18a --- /dev/null +++ "b/\345\256\230\346\226\271samples/_coverage.py" @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +''' +Utility for measuring python opencv API coverage by samples. +''' + +# Python 2/3 compatibility +from __future__ import print_function + +from glob import glob +import cv2 +import re + +if __name__ == '__main__': + cv2_callable = set(['cv2.'+name for name in dir(cv2) if callable( getattr(cv2, name) )]) + + found = set() + for fn in glob('*.py'): + print(' --- ', fn) + code = open(fn).read() + found |= set(re.findall('cv2?\.\w+', code)) + + cv2_used = found & cv2_callable + cv2_unused = cv2_callable - cv2_used + with open('unused_api.txt', 'w') as f: + f.write('\n'.join(sorted(cv2_unused))) + + r = 1.0 * len(cv2_used) / len(cv2_callable) + print('\ncv2 api coverage: %d / %d (%.1f%%)' % ( len(cv2_used), len(cv2_callable), r*100 )) diff --git "a/\345\256\230\346\226\271samples/_doc.py" "b/\345\256\230\346\226\271samples/_doc.py" new file mode 100755 index 00000000..5a2a81bc --- /dev/null +++ "b/\345\256\230\346\226\271samples/_doc.py" @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +''' +Scans current directory for *.py files and reports +ones with missing __doc__ string. +''' + +# Python 2/3 compatibility +from __future__ import print_function +import sys +PY3 = sys.version_info[0] == 3 + +from glob import glob + +if __name__ == '__main__': + print('--- undocumented files:') + for fn in glob('*.py'): + loc = {} + try: + if PY3: + exec(open(fn).read(), loc) + else: + execfile(fn, loc) + except: + pass + if '__doc__' not in loc: + print(fn) diff --git "a/\345\256\230\346\226\271samples/_run_winpack_demo_python27.cmd" "b/\345\256\230\346\226\271samples/_run_winpack_demo_python27.cmd" new file mode 100644 index 00000000..a4a65184 --- /dev/null +++ "b/\345\256\230\346\226\271samples/_run_winpack_demo_python27.cmd" @@ -0,0 +1,47 @@ +@echo off +if NOT exist %CD%\..\..\..\build ( + echo ERROR: OpenCV Winpack installation is required + pause + exit +) + +:: Path to FFMPEG binary files +set PATH=%PATH%;%CD%\..\..\..\build\bin\ + +:: Detect Python binary +python -V +if %ERRORLEVEL% EQU 0 ( + set PYTHON=python +) else ( + if exist C:\Python27-x64\python.exe ( + set PYTHON=C:\Python27-x64\python.exe + ) else ( + if exist C:\Python27\python.exe ( + set PYTHON=C:\Python27\python.exe + ) else ( + echo ERROR: Python not found + pause + exit + ) + ) +) +echo Using python: %PYTHON% + +:: Detect python architecture +%PYTHON% -c "import platform; exit(64 if platform.architecture()[0] == '64bit' else 32)" +if %ERRORLEVEL% EQU 32 ( + echo Detected: Python 32-bit + set PYTHONPATH=%CD%\..\..\..\build\python\2.7\x86 +) else ( + if %ERRORLEVEL% EQU 64 ( + echo Detected: Python 64-bit + set PYTHONPATH=%CD%\..\..\..\build\python\2.7\x64 + ) else ( + echo ERROR: Unknown python arch + pause + exit + ) +) + +:: Launch demo +%PYTHON% demo.py diff --git "a/\345\256\230\346\226\271samples/asift.py" "b/\345\256\230\346\226\271samples/asift.py" new file mode 100755 index 00000000..ec74930c --- /dev/null +++ "b/\345\256\230\346\226\271samples/asift.py" @@ -0,0 +1,163 @@ +#!/usr/bin/env python + +''' +Affine invariant feature-based image matching sample. + +This sample is similar to find_obj.py, but uses the affine transformation +space sampling technique, called ASIFT [1]. While the original implementation +is based on SIFT, you can try to use SURF or ORB detectors instead. Homography RANSAC +is used to reject outliers. Threading is used for faster affine sampling. + +[1] http://www.ipol.im/pub/algo/my_affine_sift/ + +USAGE + asift.py [--feature=[-flann]] [ ] + + --feature - Feature to use. Can be sift, surf, orb or brisk. Append '-flann' + to feature name to use Flann-based matcher instead bruteforce. + + Press left mouse button on a feature point to see its matching point. +''' + +# Python 2/3 compatibility +from __future__ import print_function + +import numpy as np +import cv2 + +# built-in modules +import itertools as it +from multiprocessing.pool import ThreadPool + +# local modules +from common import Timer +from find_obj import init_feature, filter_matches, explore_match + + +def affine_skew(tilt, phi, img, mask=None): + ''' + affine_skew(tilt, phi, img, mask=None) -> skew_img, skew_mask, Ai + + Ai - is an affine transform matrix from skew_img to img + ''' + h, w = img.shape[:2] + if mask is None: + mask = np.zeros((h, w), np.uint8) + mask[:] = 255 + A = np.float32([[1, 0, 0], [0, 1, 0]]) + if phi != 0.0: + phi = np.deg2rad(phi) + s, c = np.sin(phi), np.cos(phi) + A = np.float32([[c,-s], [ s, c]]) + corners = [[0, 0], [w, 0], [w, h], [0, h]] + tcorners = np.int32( np.dot(corners, A.T) ) + x, y, w, h = cv2.boundingRect(tcorners.reshape(1,-1,2)) + A = np.hstack([A, [[-x], [-y]]]) + img = cv2.warpAffine(img, A, (w, h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_REPLICATE) + if tilt != 1.0: + s = 0.8*np.sqrt(tilt*tilt-1) + img = cv2.GaussianBlur(img, (0, 0), sigmaX=s, sigmaY=0.01) + img = cv2.resize(img, (0, 0), fx=1.0/tilt, fy=1.0, interpolation=cv2.INTER_NEAREST) + A[0] /= tilt + if phi != 0.0 or tilt != 1.0: + h, w = img.shape[:2] + mask = cv2.warpAffine(mask, A, (w, h), flags=cv2.INTER_NEAREST) + Ai = cv2.invertAffineTransform(A) + return img, mask, Ai + + +def affine_detect(detector, img, mask=None, pool=None): + ''' + affine_detect(detector, img, mask=None, pool=None) -> keypoints, descrs + + Apply a set of affine transormations to the image, detect keypoints and + reproject them into initial image coordinates. + See http://www.ipol.im/pub/algo/my_affine_sift/ for the details. + + ThreadPool object may be passed to speedup the computation. + ''' + params = [(1.0, 0.0)] + for t in 2**(0.5*np.arange(1,6)): + for phi in np.arange(0, 180, 72.0 / t): + params.append((t, phi)) + + def f(p): + t, phi = p + timg, tmask, Ai = affine_skew(t, phi, img) + keypoints, descrs = detector.detectAndCompute(timg, tmask) + for kp in keypoints: + x, y = kp.pt + kp.pt = tuple( np.dot(Ai, (x, y, 1)) ) + if descrs is None: + descrs = [] + return keypoints, descrs + + keypoints, descrs = [], [] + if pool is None: + ires = it.imap(f, params) + else: + ires = pool.imap(f, params) + + for i, (k, d) in enumerate(ires): + print('affine sampling: %d / %d\r' % (i+1, len(params)), end='') + keypoints.extend(k) + descrs.extend(d) + + print() + return keypoints, np.array(descrs) + +if __name__ == '__main__': + print(__doc__) + + import sys, getopt + opts, args = getopt.getopt(sys.argv[1:], '', ['feature=']) + opts = dict(opts) + feature_name = opts.get('--feature', 'brisk-flann') + try: + fn1, fn2 = args + except: + fn1 = '../data/aero1.jpg' + fn2 = '../data/aero3.jpg' + + img1 = cv2.imread(fn1, 0) + img2 = cv2.imread(fn2, 0) + detector, matcher = init_feature(feature_name) + + if img1 is None: + print('Failed to load fn1:', fn1) + sys.exit(1) + + if img2 is None: + print('Failed to load fn2:', fn2) + sys.exit(1) + + if detector is None: + print('unknown feature:', feature_name) + sys.exit(1) + + print('using', feature_name) + + pool=ThreadPool(processes = cv2.getNumberOfCPUs()) + kp1, desc1 = affine_detect(detector, img1, pool=pool) + kp2, desc2 = affine_detect(detector, img2, pool=pool) + print('img1 - %d features, img2 - %d features' % (len(kp1), len(kp2))) + + def match_and_draw(win): + with Timer('matching'): + raw_matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k = 2) #2 + p1, p2, kp_pairs = filter_matches(kp1, kp2, raw_matches) + if len(p1) >= 4: + H, status = cv2.findHomography(p1, p2, cv2.RANSAC, 5.0) + print('%d / %d inliers/matched' % (np.sum(status), len(status))) + # do not draw outliers (there will be a lot of them) + kp_pairs = [kpp for kpp, flag in zip(kp_pairs, status) if flag] + else: + H, status = None, None + print('%d matches found, not enough for homography estimation' % len(p1)) + + vis = explore_match(win, img1, img2, kp_pairs, None, H) + + + match_and_draw('affine find_obj') + cv2.waitKey() + cv2.destroyAllWindows() diff --git "a/\345\256\230\346\226\271samples/browse.py" "b/\345\256\230\346\226\271samples/browse.py" new file mode 100755 index 00000000..317a8db1 --- /dev/null +++ "b/\345\256\230\346\226\271samples/browse.py" @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +''' +browse.py +========= + +Sample shows how to implement a simple hi resolution image navigation + +Usage +----- +browse.py [image filename] + +''' + +# Python 2/3 compatibility +from __future__ import print_function +import sys +PY3 = sys.version_info[0] == 3 + +if PY3: + xrange = range + +import numpy as np +import cv2 + +# built-in modules +import sys + +if __name__ == '__main__': + print('This sample shows how to implement a simple hi resolution image navigation.') + print('USAGE: browse.py [image filename]') + print() + + if len(sys.argv) > 1: + fn = sys.argv[1] + print('loading %s ...' % fn) + img = cv2.imread(fn) + if img is None: + print('Failed to load fn:', fn) + sys.exit(1) + + else: + sz = 4096 + print('generating %dx%d procedural image ...' % (sz, sz)) + img = np.zeros((sz, sz), np.uint8) + track = np.cumsum(np.random.rand(500000, 2)-0.5, axis=0) + track = np.int32(track*10 + (sz/2, sz/2)) + cv2.polylines(img, [track], 0, 255, 1, cv2.LINE_AA) + + + small = img + for i in xrange(3): + small = cv2.pyrDown(small) + + def onmouse(event, x, y, flags, param): + h, w = img.shape[:2] + h1, w1 = small.shape[:2] + x, y = 1.0*x*h/h1, 1.0*y*h/h1 + zoom = cv2.getRectSubPix(img, (800, 600), (x+0.5, y+0.5)) + cv2.imshow('zoom', zoom) + + cv2.imshow('preview', small) + cv2.setMouseCallback('preview', onmouse) + cv2.waitKey() + cv2.destroyAllWindows() diff --git "a/\345\256\230\346\226\271samples/calibrate.py" "b/\345\256\230\346\226\271samples/calibrate.py" new file mode 100755 index 00000000..00dfe57f --- /dev/null +++ "b/\345\256\230\346\226\271samples/calibrate.py" @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +''' +camera calibration for distorted images with chess board samples +reads distorted images, calculates the calibration and write undistorted images + +usage: + calibrate.py [--debug ] [--square_size] [] + +default values: + --debug: ./output/ + --square_size: 1.0 + defaults to ../data/left*.jpg +''' + +# Python 2/3 compatibility +from __future__ import print_function + +import numpy as np +import cv2 + +# local modules +from common import splitfn + +# built-in modules +import os + +if __name__ == '__main__': + import sys + import getopt + from glob import glob + + args, img_mask = getopt.getopt(sys.argv[1:], '', ['debug=', 'square_size=']) + args = dict(args) + args.setdefault('--debug', './output/') + args.setdefault('--square_size', 1.0) + if not img_mask: + img_mask = '../data/left*.jpg' # default + else: + img_mask = img_mask[0] + + img_names = glob(img_mask) + debug_dir = args.get('--debug') + if not os.path.isdir(debug_dir): + os.mkdir(debug_dir) + square_size = float(args.get('--square_size')) + + pattern_size = (9, 6) + pattern_points = np.zeros((np.prod(pattern_size), 3), np.float32) + pattern_points[:, :2] = np.indices(pattern_size).T.reshape(-1, 2) + pattern_points *= square_size + + obj_points = [] + img_points = [] + h, w = 0, 0 + img_names_undistort = [] + for fn in img_names: + print('processing %s... ' % fn, end='') + img = cv2.imread(fn, 0) + if img is None: + print("Failed to load", fn) + continue + + h, w = img.shape[:2] + found, corners = cv2.findChessboardCorners(img, pattern_size) + if found: + term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1) + cv2.cornerSubPix(img, corners, (5, 5), (-1, -1), term) + + if debug_dir: + vis = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) + cv2.drawChessboardCorners(vis, pattern_size, corners, found) + path, name, ext = splitfn(fn) + outfile = debug_dir + name + '_chess.png' + cv2.imwrite(outfile, vis) + if found: + img_names_undistort.append(outfile) + + if not found: + print('chessboard not found') + continue + + img_points.append(corners.reshape(-1, 2)) + obj_points.append(pattern_points) + + print('ok') + + # calculate camera distortion + rms, camera_matrix, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, (w, h), None, None) + + print("\nRMS:", rms) + print("camera matrix:\n", camera_matrix) + print("distortion coefficients: ", dist_coefs.ravel()) + + # undistort the image with the calibration + print('') + for img_found in img_names_undistort: + img = cv2.imread(img_found) + + h, w = img.shape[:2] + newcameramtx, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_coefs, (w, h), 1, (w, h)) + + dst = cv2.undistort(img, camera_matrix, dist_coefs, None, newcameramtx) + + # crop and save the image + x, y, w, h = roi + dst = dst[y:y+h, x:x+w] + outfile = img_found + '_undistorted.png' + print('Undistorted image written to: %s' % outfile) + cv2.imwrite(outfile, dst) + + cv2.destroyAllWindows() diff --git "a/\345\256\230\346\226\271samples/camshift.py" "b/\345\256\230\346\226\271samples/camshift.py" new file mode 100755 index 00000000..d55c1ac7 --- /dev/null +++ "b/\345\256\230\346\226\271samples/camshift.py" @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +''' +Camshift tracker +================ + +This is a demo that shows mean-shift based tracking +You select a color objects such as your face and it tracks it. +This reads from video camera (0 by default, or the camera number the user enters) + +http://www.robinhewitt.com/research/track/camshift.html + +Usage: +------ + camshift.py [